@esfaenza/parameters 18.2.1 → 19.2.0

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.
@@ -1,406 +0,0 @@
1
- // Angular
2
- import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
- import { Component, forwardRef, Input, ViewEncapsulation } from "@angular/core";
4
- // Configurazioni
5
- import { LocalizationService } from "@esfaenza/localizations";
6
- // Applicazione
7
- import { EsParametersLoc } from "./es_parameters.component.loc";
8
- import { of } from "rxjs";
9
- import { GenericParameterGroup } from "./models/GenericParameterGroup";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@esfaenza/extensions";
12
- import * as i2 from "@esfaenza/localizations";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@angular/forms";
15
- import * as i5 from "@esfaenza/forms-and-validations";
16
- /** Componente che permette di graficare una lista di **GenericParameter** come Input in base al loro tipo specifico */
17
- export class EsParametersComponent {
18
- /** Permette di settare in una volta solo gli input **LabelColWidth** e **InputColWidth**, basta scriverlo con la sintassi "X Y" */
19
- set LabelInputRatio(input) {
20
- var ratio = input.split(/\s/);
21
- this.LabelColWidth = parseInt(ratio[0]);
22
- this.InputColWidth = parseInt(ratio[1]);
23
- }
24
- /**
25
- * Costruttore
26
- *
27
- * @ignore
28
- */
29
- constructor(utiExts, lc, cdr, inj, dates) {
30
- this.utiExts = utiExts;
31
- this.lc = lc;
32
- this.cdr = cdr;
33
- this.inj = inj;
34
- this.dates = dates;
35
- /** Indica se si lavora a singolo parametro forzato dentro un array for the glory of satan */
36
- this.SingleParameterMode = false;
37
- /**
38
- * Pipeline di Angular
39
- *
40
- * @ignore
41
- */
42
- this.propagateChange = (_) => { };
43
- /** Indica che il parametro deve essere in modalità display */
44
- this.DisplayMode = false;
45
- /** Indica che il parametro (In Display mode!!) non appare se vuoto. In più, se tutti sono vuoti, fa vedere una bella card "non ci sono parametri presenti" */
46
- this.HideEmpty = false;
47
- /** Indica che l'ultimo parametro non deve avere margine in fondo */
48
- this.LastParameterNoMargin = false;
49
- /** col-md-X per la label */
50
- this.LabelColWidth = 4;
51
- /** col-md-X per l'input */
52
- this.InputColWidth = 8;
53
- /** Input a cui collegare la variabile **submitted** del form all'interno del quale viene utilizzato questo componente */
54
- this.submitted = false;
55
- /** Valore da mostrare qualora non fossero ancora ricevuti i **Parameters** da mostrare */
56
- this.EmptyMessage = "";
57
- /** Permette di rimuovere i parametri dalla lista cliccando sulla X davanti alla Label */
58
- this.Removal = false;
59
- /** Indica se i componenti di Input generati sono Readonly o no */
60
- this.Readonly = false;
61
- /** Indica il formato lista che dev'essere utilizzato */
62
- this.ListFormat = 'Array';
63
- /** Form che utilizza il componente. Fondamentale collegarlo se si vogliono le validazioni sul submit */
64
- this.Form = null;
65
- /** Quando utilizza un sottocomponente autocomplete abilita o disabilita il reset dell'input per ogni selezione */
66
- this.AutocompleteHideChoicesOnSelection = false;
67
- /** Indica come deve funzionare la multiselect */
68
- this.MultiselectMode = 'CommaSeparated';
69
- this.AllParametersEmpty = false;
70
- this.Initialized = false;
71
- }
72
- ngOnInit() {
73
- // Qui gli input dovrebbero essere settati. Alcuni form-roba non prendono bene i cambi di input
74
- // Non sta funzionando come speravo... da rivedere
75
- this.Initialized = true;
76
- }
77
- /**
78
- * Pipeline di Angular
79
- *
80
- * @ignore
81
- */
82
- writeValue(obj) {
83
- if (!obj)
84
- return;
85
- if (!Array.isArray(obj))
86
- this.SingleParameterMode = true;
87
- this.Parameters = Array.isArray(obj) ? obj : [obj];
88
- this.ParametersCache = {};
89
- this.Parameters.forEach(t => {
90
- this.ParametersCache[t.id] = t;
91
- if (!t.typecode && !t.type)
92
- console.warn("Non è stato specificato né un type né un typecode");
93
- if (t.typecode && !t.type)
94
- t.type = this.utiExts.getJsTypeFromTypeCode(t.typecode);
95
- if (t.typecode && t.type != this.utiExts.getJsTypeFromTypeCode(t.typecode))
96
- console.warn(`Rilevate inconsistenze fra il Tipo ${t.type} e il Tipo ${this.utiExts.getJsTypeFromTypeCode(t.typecode)} calcolato da TypeCode ${t.typecode} per il parametro ${t.id}`);
97
- if (t.type == "boolean")
98
- t.value = t.value?.toString()?.toLowerCase() === "true";
99
- if (t.enumtype || t.dicttype)
100
- t.type = 'enum';
101
- // Valore valido ma modalità di utilizzo a CommaSeparated, devo assicurarmi di riemettere la versione con la stringa
102
- if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))
103
- this.changed();
104
- // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori
105
- if (t.type == 'enum' && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && !Array.isArray(t.value))
106
- t.value = t.value ? t.value.split(',').map(t => t.trim()) : [];
107
- });
108
- this.AllParametersEmpty = this.Parameters.every(t => !t.value);
109
- this.reviewParametersBindings();
110
- this.generateGroups();
111
- }
112
- /**
113
- * Metodo che si occupa di creare e ordinare i gruppi dei parametri
114
- */
115
- generateGroups() {
116
- this.Groups = [];
117
- if (this.Parameters?.length > 0) {
118
- this.Parameters.sort((a, b) => a.order < b.order ? -1 : 1);
119
- // Ciclo tutti i parametri
120
- for (let i = 0; this.Parameters.length > i; i++) {
121
- let par = this.Parameters[i];
122
- let parGroupName = par.group ?? "";
123
- let groupOrder = par.group ? par.order : -1;
124
- // Se il gruppo non esiste, lo aggiungo
125
- if (!this.Groups.some(x => x.groupName == parGroupName)) {
126
- this.Groups.push(new GenericParameterGroup(parGroupName, groupOrder));
127
- }
128
- // Inserisco il parametro dentro al suo gruppo
129
- this.Groups.find(g => g.groupName == parGroupName).parameters.push(par);
130
- }
131
- // Gestione sottogruppi
132
- let subgroups = this.Groups.filter(group => group.groupName.includes('§'));
133
- for (let _; subgroups.length > 0; () => { }) {
134
- // Recupero la lista di gruppi che hanno sottogruppi
135
- // Per convenzione, nel nome contengono "§"
136
- this.tryToAddSubgroups(subgroups);
137
- subgroups = this.Groups.filter(group => group.groupName.includes('§'));
138
- }
139
- this.Groups.sort((a, b) => a.order < b.order ? -1 : 1);
140
- }
141
- }
142
- /**
143
- * Metodo che si occupa di creare e ordinare i sottogruppi dei parametri
144
- */
145
- tryToAddSubgroups(subgroups) {
146
- for (let i = 0; subgroups.length > i; i++) {
147
- let sub = subgroups[i];
148
- // Ottengo un lista con la gerarchia dei gruppi, in ordine
149
- let groupsParentHierarchy = sub.groupName.split('§') ?? [];
150
- // Recupero il gruppo padre
151
- let parentGroupName = sub.groupName.replace(`§${groupsParentHierarchy[groupsParentHierarchy.length - 1]}`, ``);
152
- // Se il gruppo padre non esiste, lo aggiungo
153
- if (!this.Groups.some(x => x.groupName == parentGroupName)) {
154
- this.Groups.push(new GenericParameterGroup(parentGroupName, sub.order));
155
- }
156
- // Rimuovo dal nome del gruppo l'informazione sul padre (Sistemando anche l'etichetta)
157
- // e lo aggiungo ai sottogruppi del padre
158
- sub.groupName = sub.groupName.replace(`${parentGroupName}§`, '');
159
- let parentGroup = this.Groups.find(x => x.groupName == parentGroupName);
160
- if (parentGroup?.subgroups.some(s => s.groupName == sub.groupName)) {
161
- let target = parentGroup.subgroups.find(f => f.groupName == sub.groupName);
162
- sub.parameters.map(p => target.parameters.push(p));
163
- sub.subgroups.map(s => target.subgroups.push(s));
164
- target.order = sub.order < target.order ? sub.order : target.order;
165
- }
166
- else {
167
- parentGroup?.subgroups.push(sub);
168
- }
169
- // Rimuovo il sottogruppo gruppo dalla lista
170
- this.Groups.splice(this.Groups.indexOf(sub), 1);
171
- }
172
- }
173
- /**
174
- * Pipeline di Angular
175
- *
176
- * @ignore
177
- */
178
- registerOnChange(fn) { this.propagateChange = fn; }
179
- /**
180
- * Pipeline di Angular
181
- *
182
- * @ignore
183
- */
184
- registerOnTouched(fn) { }
185
- /**
186
- * Metodo che si occupa di gestire il modello in uscita e propagarlo sul binding ngModel
187
- */
188
- changed() {
189
- if (!this.Parameters)
190
- return;
191
- if (!this.Groups)
192
- this.generateGroups();
193
- // Se ci sono delle modifiche ai binding potrebbero essere cambiati i required. Ricreo tutti i componenti e ri-idrato la cache dei parametri
194
- var changes = this.reviewParametersBindings();
195
- if (changes.length > 0) {
196
- // In base ai binding cambiati devo trovare tutti i parametri che han subito modifiche strutturali (visibilità, obbligatorietà)
197
- // distruggerli e ricrearli in modo che i binding lato html si aggiornino di conseguenza.
198
- // 1: Faccio una copia del parametro corrente
199
- // 2: Trovo la sua posizione all'interno dei gruppi e lo sostituisco con la copia
200
- // 3: Aggiorno la lista dei parametri e la sua cache in modo da puntare all'oggetto nuovo
201
- changes.forEach(ch => {
202
- let index = this.Parameters.findIndex(t => t.id == ch);
203
- let parameterCopy = this.utiExts.deepClone(this.Parameters[index]);
204
- let parameterRefFixed = false;
205
- for (let ig = 0; ig < this.Groups.length; ig++) {
206
- var g = this.Groups[ig];
207
- for (let ip = 0; ip < g.parameters.length; ip++) {
208
- var p = g.parameters[ip];
209
- if (p === this.Parameters[index]) {
210
- this.Groups[ig].parameters[ip] = parameterCopy;
211
- parameterRefFixed = true;
212
- break;
213
- }
214
- }
215
- if (parameterRefFixed)
216
- break;
217
- }
218
- this.Parameters[index] = parameterCopy;
219
- this.ParametersCache[ch] = this.Parameters[index];
220
- this.cdr.markForCheck();
221
- });
222
- }
223
- var ParametersClone = this.utiExts.deepClone(this.Parameters);
224
- // Aggiusto le modalità di funzionamento dei parametri lista. Che internamente funzionano sempre con una lista di valori
225
- ParametersClone?.forEach(t => {
226
- if (t.type == "enum" && this.ListFormat == 'CommaSeparated' && t.multienum && t.value && Array.isArray(t.value))
227
- t.value = t.value.join(',');
228
- });
229
- this.propagateChange(this.SingleParameterMode ? ParametersClone[0] : ParametersClone);
230
- }
231
- /**
232
- * Rimuove il parametro selezionato e propaga il modello
233
- *
234
- * @param {GenericParameter} par Parametro da rimuovere
235
- */
236
- removeParameter(par) {
237
- this.Parameters.splice(this.Parameters.indexOf(par), 1);
238
- this.changed();
239
- }
240
- GenerateParameterGroups() {
241
- let Groups = [];
242
- this.Parameters.forEach(param => {
243
- Groups.push({ id: param.id, groups: param.group.split("§"), order: param.order });
244
- });
245
- let GroupedGroups = Groups.reduce((r, a) => {
246
- let firstGroupId = a.groups?.length > 0 ? a.groups[0] : "";
247
- r[firstGroupId] = [...r[firstGroupId] || [], a];
248
- return r;
249
- }, {});
250
- console.log(GroupedGroups);
251
- // Ciclo del risultato, aggiungendo i gruppi al modello
252
- // Per ogni gruppo che aggiungo, assegno i parametri in ordine
253
- }
254
- /**
255
- * Rivede i bindings dei parametri in base a loro eventuali espressioni di controllo
256
- *
257
- * @returns {string[]} lista con gli id dei parametri che sono stati modificati
258
- */
259
- reviewParametersBindings() {
260
- let changes = [];
261
- for (let i = 0; i < this.Parameters.length; i++) {
262
- var p = this.Parameters[i];
263
- if (p.requiredexp) {
264
- let prevReq = p.required;
265
- p.required = this.evaluate(p.requiredexp);
266
- if (prevReq != p.required)
267
- changes.push(p.id);
268
- }
269
- if (p.visibleexp) {
270
- let prevVisi = p.visible;
271
- p.visible = this.evaluate(p.visibleexp);
272
- if (prevVisi != p.visible)
273
- changes.push(p.id);
274
- }
275
- }
276
- return changes;
277
- }
278
- /**
279
- * Valuta un'espressione in base ai parametri presenti nel modello attuale
280
- *
281
- * @param expr Espressione da valutare scritta nel formato (ripetibile) "ID (==|!=|<|>|>=|<=) (`valore` | null | true | false | XXX,XXX)" separato eventualmente da && ed ||
282
- *
283
- * @returns **true** se la condizione è verificata, **false** altrimenti
284
- */
285
- evaluate(expr) {
286
- var regex = /\s?([a-zA-Z0-9_-]+)\s?(!=|==|<|>|<=|>=)\s?(`[^`]+`|``|null|[0-9,]+|true|false)/gm;
287
- var matches = [];
288
- var finalExpr = expr;
289
- while (matches = regex.exec(expr)) {
290
- var fullMatch = matches[0].trim();
291
- var id = matches[1].trim();
292
- var operation = matches[2].trim();
293
- let bValue = matches[3].trim().trim();
294
- var value = matches[3].trim().trim().replace('`', '').replace('`', '');
295
- finalExpr = finalExpr.replace(fullMatch, `this.checkValue('${id}', '${operation}', ${bValue == 'null' ? 'null' : `'${value}'`})`);
296
- }
297
- return eval(finalExpr);
298
- }
299
- /**
300
- * Restituisce l'operazione di comparazione fra un singolo valore di un parametro e un suo valore di confronto in base ad un operatore
301
- * Richiamata da EVAL
302
- *
303
- * @param {string} key Chiave del parametro di cui verificare il valore
304
- * @param {string} operator Operatore con cui verificare il valore: ==, !=, >, <, >=, <=
305
- * @param {string} value Valore di confronto da utilizzare
306
- *
307
- * @returns **true** se la condizione è verificata, **false** altrimenti
308
- */
309
- checkValue(key, operator, value) {
310
- var rPar = this.ParametersCache[key];
311
- try {
312
- switch (rPar.type) {
313
- case "string":
314
- case "enum":
315
- return eval(`"${this.defaultIfnullOrUndefined(rPar.value, ``)}" ${operator} "${this.defaultIfnullOrUndefined(value, ``)}"`);
316
- case "boolean":
317
- return eval(`${this.defaultIfnullOrUndefined(rPar.value, ``).toString()} ${operator} ${this.defaultIfnullOrUndefined(value, ``)}`);
318
- case "number":
319
- return eval(`${this.defaultIfnullOrUndefined(rPar.value, '""', true).replace(',', '.')} ${operator} ${this.defaultIfnullOrUndefined(value, '""', true).replace(',', '.')}`);
320
- case "date":
321
- let parDateConv = `this.dates.getDateConvertion("${rPar.value}")`;
322
- let valDateConv = `this.dates.getDateConvertion("${value}")`;
323
- switch (operator) {
324
- case "==": return eval(`${parDateConv} == ${valDateConv} || (${parDateConv} != null && ${parDateConv}.isSame(${valDateConv}))`);
325
- case "!=": return eval(`${parDateConv} != ${valDateConv} && ${parDateConv} != null && !${parDateConv}.isSame(${valDateConv})`);
326
- case ">": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isAfter(${valDateConv})`);
327
- case "<": return eval(`${parDateConv} != null && ${valDateConv} != null && ${parDateConv}.isBefore(${valDateConv})`);
328
- case ">=": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isAfter(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);
329
- case "<=": return eval(`${parDateConv} != null && ${valDateConv} != null && (${parDateConv}.isBefore(${valDateConv}) || ${parDateConv}?.isSame(${valDateConv}))`);
330
- }
331
- }
332
- }
333
- catch (error) {
334
- console.error(error);
335
- console.warn("Errori nella valutazione dell'espressione. Fallback a false");
336
- return false;
337
- }
338
- throw `@esfaenza/parameters: Tipo parametro ${key} non riconosciuto: ${rPar.type}`;
339
- }
340
- /** @ignore */
341
- defaultIfnullOrUndefined(item, dflt, emptyStringIsNull = false) {
342
- if (item == null || item == undefined || item.toString() == 'null' || (emptyStringIsNull && item.toString() == ""))
343
- return dflt;
344
- return item;
345
- }
346
- /** @ignore */
347
- getSource(parameter, search, byid) {
348
- if (!this.AutoCompleteDataRetrieve) {
349
- console.error("@forms-and-validations: funzione di dataretrieve non impostata per un parametro autocomplete");
350
- return of([]);
351
- }
352
- else
353
- return this.AutoCompleteDataRetrieve(parameter, search, byid);
354
- }
355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EsParametersComponent, deps: [{ token: i1.UtilityService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i1.DateService }], target: i0.ɵɵFactoryTarget.Component }); }
356
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EsParametersComponent, selector: "es-parameters", inputs: { DisplayMode: "DisplayMode", HideEmpty: "HideEmpty", LastParameterNoMargin: "LastParameterNoMargin", LabelColWidth: "LabelColWidth", InputColWidth: "InputColWidth", submitted: "submitted", EmptyMessage: "EmptyMessage", Removal: "Removal", Readonly: "Readonly", ListFormat: "ListFormat", Form: "Form", AutocompleteHideChoicesOnSelection: "AutocompleteHideChoicesOnSelection", AutoCompleteDataRetrieve: "AutoCompleteDataRetrieve", MultiselectMode: "MultiselectMode", LabelInputRatio: "LabelInputRatio" }, providers: [
357
- { provide: LocalizationService, useClass: EsParametersLoc },
358
- {
359
- provide: NG_VALUE_ACCESSOR,
360
- useExisting: forwardRef(() => EsParametersComponent),
361
- multi: true
362
- }
363
- ], ngImport: i0, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group && Initialized\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <ng-container *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\">\r\n <ng-container *ngIf=\"!DisplayMode || (!HideEmpty || (par.value))\">\r\n <div class=\"row form-group\" *ngIf=\"par.visible\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseJsonList]=\"MultiselectMode == 'JsonArray'\" [UseCommaSeparatedList]=\"MultiselectMode == 'CommaSeparated'\" [SelectLabel]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum multiselect senza sorgente-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi && !par.enumvalues\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [HideChoicesOnSelection]=\"true\" [SelectLabel]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [UnboundMode]=\"true\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete> \r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se file-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'file'\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\" #validator></form-file>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non &egrave; presente nulla da visualizzare\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.FormCheckboxComponent, selector: "form-checkbox", inputs: ["SliderMode"] }, { kind: "component", type: i5.FormDateComponent, selector: "form-date", inputs: ["JsDates"] }, { kind: "component", type: i5.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "component", type: i5.FormSelectComponent, selector: "form-select", inputs: ["SelectLabel", "PlaceholderValue", "RequiredPlaceholder", "EmptyFieldValue", "ShowValidationSymbol", "OptionTemplate"] }, { kind: "component", type: i5.FormMultiSelectComponent, selector: "form-multiselect", inputs: ["SelectLabel", "UseKeyValues", "UseCommaSeparatedList", "UseJsonList"] }, { kind: "component", type: i5.FormFileComponent, selector: "form-file", inputs: ["Multiple", "AllowDownload", "MaxSize", "FancyMode", "ReadFile"] }, { kind: "component", type: i5.FormAutocompleteComponent, selector: "form-autocomplete", inputs: ["SelectLabel", "SearchFunctionContext", "SearchFunction", "MinChars", "HideChoicesOnSelection", "RequiredPlaceholder", "CaseSensitive", "Multi", "MultiElementsThreshold", "UnboundMode"] }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
364
- }
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EsParametersComponent, decorators: [{
366
- type: Component,
367
- args: [{ selector: "es-parameters", providers: [
368
- { provide: LocalizationService, useClass: EsParametersLoc },
369
- {
370
- provide: NG_VALUE_ACCESSOR,
371
- useExisting: forwardRef(() => EsParametersComponent),
372
- multi: true
373
- }
374
- ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"(!Parameters || Parameters.length == 0) && EmptyMessage\">\r\n <em>{{EmptyMessage}}</em>\r\n</div>\r\n\r\n<div *ngIf=\"Groups && Initialized\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: Groups, isSubgroup: false }}\"></ng-container>\r\n</div>\r\n\r\n<ng-template #Temp let-item=\"item\">\r\n <ng-container *ngFor=\"let group of item.groups; let k = index\">\r\n <div [class.pars-subgroup]=\"item.isSubgroup\" [class.pars-group]=\"!item.isSubgroup\">\r\n <ng-container *ngTemplateOutlet=\"GroupsOrSubgroupsDisplay; context: { item: { group: group, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: item.isSubgroup }}\"></ng-container>\r\n <ng-container *ngIf=\"group.subgroups.length > 0\">\r\n <ng-container *ngTemplateOutlet=\"Temp; context: {item: { groups: group.subgroups, index: k + (item.index ? ('_' + item.index) : ''), isSubgroup: true }};\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #GroupsOrSubgroupsDisplay let-item=\"item\">\r\n <div *ngIf=\"item.group && Initialized\">\r\n <div *ngIf=\"item.group.groupName\" [class.pars-group-title]=\"!item.isSubgroup\" [class.pars-subgroup-title]=\"item.isSubgroup\">\r\n {{item.group.groupName}}\r\n </div>\r\n <div *ngIf=\"item.group.parameters && item.group.parameters.length > 0\">\r\n <ng-container *ngFor=\"let par of item.group.parameters; let i= index; let last = last;\">\r\n <ng-container *ngIf=\"!DisplayMode || (!HideEmpty || (par.value))\">\r\n <div class=\"row form-group\" *ngIf=\"par.visible\" [class.app-margin-bottom-0]=\"LastParameterNoMargin && last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\"><span *ngIf=\"Removal\" class=\"fa fa-remove text-danger\" (click)=\"removeParameter(par)\">&nbsp;</span>{{par.description}}{{par.required ? '*' : ''}}:</label>\r\n <!--Se Data-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'date'\">\r\n <form-date [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'string'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-input>\r\n </div>\r\n <!--Se numero-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'number'\">\r\n <form-input [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator pattern=\"{{par.pattern || '^[+-]?[0-9]*[,]?[0-9]+$'}}\"></form-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"col-md-{{InputColWidth}} m-t-5\" *ngIf=\"par.type == 'boolean'\">\r\n <form-checkbox [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator></form-checkbox>\r\n </div>\r\n <!--Se enum single select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && !par.sourceapi\">\r\n <form-select [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" (inputChange)=\"changed();\" #validator [Source]=\"par.enumvalues\"></form-select>\r\n </div>\r\n <!--Se enum multi select-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi\">\r\n <form-multiselect [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [UseJsonList]=\"MultiselectMode == 'JsonArray'\" [UseCommaSeparatedList]=\"MultiselectMode == 'CommaSeparated'\" [SelectLabel]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [Source]=\"par.enumvalues\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-multiselect>\r\n </div>\r\n <!--Se enum multiselect senza sorgente-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && !par.sourceapi && !par.enumvalues\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [HideChoicesOnSelection]=\"true\" [SelectLabel]=\"('Seleziona' | localize : lc) + '...'\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [UnboundMode]=\"true\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete> \r\n </div>\r\n <!--Se enum autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && !par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se enum multiselect autocomplete-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'enum' && par.multienum && par.sourceapi\">\r\n <form-autocomplete [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [HideChoicesOnSelection]=\"AutocompleteHideChoicesOnSelection\" [Multi]=\"true\" [FormLayout]=\"false\" [(ngModel)]=\"par.value\" name=\"{{item.index}}par{{i}}_{{par.id}}\" [Readonly]=\"Readonly || par.isreadonly\" [SearchFunction]=\"getSource.bind(this, par)\" [required]=\"par.required\" (inputChange)=\"changed();\" #validator></form-autocomplete>\r\n </div>\r\n <!--Se file-->\r\n <div class=\"col-md-{{InputColWidth}}\" *ngIf=\"par.type == 'file'\">\r\n <form-file [DisplayMode]=\"DisplayMode\" [Form]=\"Form\" [ReadFile]=\"true\" [FormLayout]=\"false\" [Readonly]=\"Readonly || par.isreadonly\" [required]=\"par.required\" [(ngModel)]=\"par.file\" name=\"{{item.index}}par{{i}}_{{par.id}}\" #validator></form-file>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <div *ngIf=\"DisplayMode && AllParametersEmpty && HideEmpty\" class=\"card card-info app-padding-10 app-no-margin app-white-text\">\r\n Non &egrave; presente nulla da visualizzare\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".list-area{position:fixed}.pars-group-title{background:#ddd;margin-bottom:7px;padding:5px;text-transform:uppercase;font-weight:700;text-align:center;color:#333;font-size:13px}.pars-subgroup-title{font-weight:700;color:#333;font-size:16px}.pars-group{margin-left:0}.pars-subgroup{margin-left:15px}\n"] }]
375
- }], ctorParameters: () => [{ type: i1.UtilityService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i1.DateService }], propDecorators: { DisplayMode: [{
376
- type: Input
377
- }], HideEmpty: [{
378
- type: Input
379
- }], LastParameterNoMargin: [{
380
- type: Input
381
- }], LabelColWidth: [{
382
- type: Input
383
- }], InputColWidth: [{
384
- type: Input
385
- }], submitted: [{
386
- type: Input
387
- }], EmptyMessage: [{
388
- type: Input
389
- }], Removal: [{
390
- type: Input
391
- }], Readonly: [{
392
- type: Input
393
- }], ListFormat: [{
394
- type: Input
395
- }], Form: [{
396
- type: Input
397
- }], AutocompleteHideChoicesOnSelection: [{
398
- type: Input
399
- }], AutoCompleteDataRetrieve: [{
400
- type: Input
401
- }], MultiselectMode: [{
402
- type: Input
403
- }], LabelInputRatio: [{
404
- type: Input
405
- }] } });
406
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUE4RSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQzFJLE9BQU8sRUFBcUIsU0FBUyxFQUFFLFVBQVUsRUFBWSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0csaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTTlELGVBQWU7QUFDZixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQUV2RSx1SEFBdUg7QUFldkgsTUFBTSxPQUFPLHFCQUFxQjtJQStEOUIsbUlBQW1JO0lBQ25JLElBQWEsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBS0Q7Ozs7T0FJRztJQUNILFlBQW9CLE9BQXVCLEVBQVMsRUFBdUIsRUFBUyxHQUFzQixF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IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTmdDb250cm9sLCBOZ0Zvcm0sIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5cclxuLy8gQ2xhc3NpXHJcbmltcG9ydCB7IEdlbmVyaWNQYXJhbWV0ZXIgfSBmcm9tICcuL21vZGVscy9HZW5lcmljUGFyYW1ldGVyJztcclxuXHJcbi8vIEFwcGxpY2F6aW9uZVxyXG5pbXBvcnQgeyBFc1BhcmFtZXRlcnNMb2MgfSBmcm9tIFwiLi9lc19wYXJhbWV0ZXJzLmNvbXBvbmVudC5sb2NcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBHZW5lcmljUGFyYW1ldGVyR3JvdXAgfSBmcm9tIFwiLi9tb2RlbHMvR2VuZXJpY1BhcmFtZXRlckdyb3VwXCI7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBjaGUgcGVybWV0dGUgZGkgZ3JhZmljYXJlIHVuYSBsaXN0YSBkaSAqKkdlbmVyaWNQYXJhbWV0ZXIqKiBjb21lIElucHV0IGluIGJhc2UgYWwgbG9ybyB0aXBvIHNwZWNpZmljbyAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcImVzLXBhcmFtZXRlcnNcIixcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHsgcHJvdmlkZTogTG9jYWxpemF0aW9uU2VydmljZSwgdXNlQ2xhc3M6IEVzUGFyYW1ldGVyc0xvYyB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVzUGFyYW1ldGVyc0NvbXBvbmVudCksXHJcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgXSxcclxuICAgIHN0eWxlVXJsczogW1wiLi9lc19wYXJhbWV0ZXJzLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHRlbXBsYXRlVXJsOiBcIi4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQuaHRtbFwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFc1BhcmFtZXRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gICAgLyoqIEluZGljYSBzZSBzaSBsYXZvcmEgYSBzaW5nb2xvIHBhcmFtZXRybyBmb3J6YXRvIGRlbnRybyB1biBhcnJheSBmb3IgdGhlIGdsb3J5IG9mIHNhdGFuICovXHJcbiAgICBwcml2YXRlIFNpbmdsZVBhcmFtZXRlck1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTW9kZWxsbyBkZWwgY29tcG9uZW50ZSBzdSBjdWkgdmVuZ29ubyBlZmZldHR1YXRlIGxlIGdyYWZpY2F6aW9uaSAqL1xyXG4gICAgcHVibGljIFBhcmFtZXRlcnM6IEdlbmVyaWNQYXJhbWV0ZXJbXTtcclxuXHJcbiAgICAvKiogTW9kZWxsbyBkZWwgY29tcG9uZW50ZSBzdSBjdWkgdmVuZ29ubyBlZmZldHR1YXRlIGxlIGdyYWZpY2F6aW9uaSAqL1xyXG4gICAgcHVibGljIEdyb3VwczogR2VuZXJpY1BhcmFtZXRlckdyb3VwW107XHJcblxyXG4gICAgLyoqIENhY2hlIHBlciBmYXJlIGxvb2t1cCByYXBpZGkgaW4gZmFzZSBkaSB2YWx1dGF6aW9uZSBlc3ByZXNzaW9uaSBkaSB2aXNpYmlsaXTDoCBlIG9iYmxpZ2F0b3JpZXTDoCAqL1xyXG4gICAgcHJpdmF0ZSBQYXJhbWV0ZXJzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBHZW5lcmljUGFyYW1ldGVyIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQaXBlbGluZSBkaSBBbmd1bGFyIFxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGNoZSBpbCBwYXJhbWV0cm8gZGV2ZSBlc3NlcmUgaW4gbW9kYWxpdMOgIGRpc3BsYXkgKi9cclxuICAgIEBJbnB1dCgpIERpc3BsYXlNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEluZGljYSBjaGUgaWwgcGFyYW1ldHJvIChJbiBEaXNwbGF5IG1vZGUhISkgbm9uIGFwcGFyZSBzZSB2dW90by4gSW4gcGnDuSwgc2UgdHV0dGkgc29ubyB2dW90aSwgZmEgdmVkZXJlIHVuYSBiZWxsYSBjYXJkIFwibm9uIGNpIHNvbm8gcGFyYW1ldHJpIHByZXNlbnRpXCIgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVFbXB0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBJbmRpY2EgY2hlIGwndWx0aW1vIHBhcmFtZXRybyBub24gZGV2ZSBhdmVyZSBtYXJnaW5lIGluIGZvbmRvICovXHJcbiAgICBASW5wdXQoKSBMYXN0UGFyYW1ldGVyTm9NYXJnaW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogY29sLW1kLVggcGVyIGxhIGxhYmVsICovXHJcbiAgICBASW5wdXQoKSBMYWJlbENvbFdpZHRoOiBudW1iZXIgPSA0O1xyXG5cclxuICAgIC8qKiBjb2wtbWQtWCBwZXIgbCdpbnB1dCAqL1xyXG4gICAgQElucHV0KCkgSW5wdXRDb2xXaWR0aDogbnVtYmVyID0gODtcclxuXHJcbiAgICAvKiogSW5wdXQgYSBjdWkgY29sbGVnYXJlIGxhIHZhcmlhYmlsZSAqKnN1Ym1pdHRlZCoqIGRlbCBmb3JtIGFsbCdpbnRlcm5vIGRlbCBxdWFsZSB2aWVuZSB1dGlsaXp6YXRvIHF1ZXN0byBjb21wb25lbnRlICovXHJcbiAgICBASW5wdXQoKSBzdWJtaXR0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogVmFsb3JlIGRhIG1vc3RyYXJlIHF1YWxvcmEgbm9uIGZvc3Nlcm8gYW5jb3JhIHJpY2V2dXRpIGkgKipQYXJhbWV0ZXJzKiogZGEgbW9zdHJhcmUgKi9cclxuICAgIEBJbnB1dCgpIEVtcHR5TWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKiogUGVybWV0dGUgZGkgcmltdW92ZXJlIGkgcGFyYW1ldHJpIGRhbGxhIGxpc3RhIGNsaWNjYW5kbyBzdWxsYSBYIGRhdmFudGkgYWxsYSBMYWJlbCAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgaSBjb21wb25lbnRpIGRpIElucHV0IGdlbmVyYXRpIHNvbm8gUmVhZG9ubHkgbyBubyAqL1xyXG4gICAgQElucHV0KCkgUmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogSW5kaWNhIGlsIGZvcm1hdG8gbGlzdGEgY2hlIGRldidlc3NlcmUgdXRpbGl6emF0byAqL1xyXG4gICAgQElucHV0KCkgTGlzdEZvcm1hdDogJ0NvbW1hU2VwYXJhdGVkJyB8ICdBcnJheScgPSAnQXJyYXknO1xyXG5cclxuICAgIC8qKiBGb3JtIGNoZSB1dGlsaXp6YSBpbCBjb21wb25lbnRlLiBGb25kYW1lbnRhbGUgY29sbGVnYXJsbyBzZSBzaSB2b2dsaW9ubyBsZSB2YWxpZGF6aW9uaSBzdWwgc3VibWl0ICovXHJcbiAgICBASW5wdXQoKSBGb3JtOiBOZ0Zvcm0gPSBudWxsO1xyXG5cclxuICAgIC8qKiBRdWFuZG8gdXRpbGl6emEgdW4gc290dG9jb21wb25lbnRlIGF1dG9jb21wbGV0ZSBhYmlsaXRhIG8gZGlzYWJpbGl0YSBpbCByZXNldCBkZWxsJ2lucHV0IHBlciBvZ25pIHNlbGV6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b2NvbXBsZXRlSGlkZUNob2ljZXNPblNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIHBlciB0aXJhcmUgZnVvcmkgaSBkYXRpIGRpIHVuIGF1dG9jb21wbGV0ZSAqL1xyXG4gICAgQElucHV0KCkgQXV0b0NvbXBsZXRlRGF0YVJldHJpZXZlOiAocGFyYW1ldGVyOiBHZW5lcmljUGFyYW1ldGVyLCBzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbikgPT4gT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPlxyXG5cclxuICAgICAvKiogSW5kaWNhIGNvbWUgZGV2ZSBmdW56aW9uYXJlIGxhIG11bHRpc2VsZWN0ICovXHJcbiAgICBASW5wdXQoKSBNdWx0aXNlbGVjdE1vZGU6ICdDb21tYVNlcGFyYXRlZCcgfCAnQXJyYXknIHwgJ0pzb25BcnJheScgPSAnQ29tbWFTZXBhcmF0ZWQnO1xyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBzZXR0YXJlIGluIHVuYSB2b2x0YSBzb2xvIGdsaSBpbnB1dCAqKkxhYmVsQ29sV2lkdGgqKiBlICoqSW5wdXRDb2xXaWR0aCoqLCBiYXN0YSBzY3JpdmVybG8gY29uIGxhIHNpbnRhc3NpIFwiWCBZXCIgKi9cclxuICAgIEBJbnB1dCgpIHNldCBMYWJlbElucHV0UmF0aW8oaW5wdXQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByYXRpbyA9IGlucHV0LnNwbGl0KC9cXHMvKTtcclxuICAgICAgICB0aGlzLkxhYmVsQ29sV2lkdGggPSBwYXJzZUludChyYXRpb1swXSk7XHJcbiAgICAgICAgdGhpcy5JbnB1dENvbFdpZHRoID0gcGFyc2VJbnQocmF0aW9bMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBbGxQYXJhbWV0ZXJzRW1wdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGluajogSW5qZWN0b3IsIHB1YmxpYyBkYXRlczogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIFF1aSBnbGkgaW5wdXQgZG92cmViYmVybyBlc3NlcmUgc2V0dGF0aS4gQWxjdW5pIGZvcm0tcm9iYSBub24gcHJlbmRvbm8gYmVuZSBpIGNhbWJpIGRpIGlucHV0XHJcbiAgICAgICAgLy8gTm9uIHN0YSBmdW56aW9uYW5kbyBjb21lIHNwZXJhdm8uLi4gZGEgcml2ZWRlcmVcclxuICAgICAgICB0aGlzLkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShvYmopOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKCFvYmopXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYoIUFycmF5LmlzQXJyYXkob2JqKSlcclxuICAgICAgICAgICAgdGhpcy5TaW5nbGVQYXJhbWV0ZXJNb2RlID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMgPSBBcnJheS5pc0FycmF5KG9iaikgPyBvYmogOiBbb2JqXTtcclxuXHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzQ2FjaGUgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc0NhY2hlW3QuaWRdID0gdDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdC50eXBlY29kZSAmJiAhdC50eXBlKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTm9uIMOoIHN0YXRvIHNwZWNpZmljYXRvIG7DqSB1biB0eXBlIG7DqSB1biB0eXBlY29kZVwiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGVjb2RlICYmICF0LnR5cGUpXHJcbiAgICAgICAgICAgICAgICB0LnR5cGUgPSB0aGlzLnV0aUV4dHMuZ2V0SnNUeXBlRnJvbVR5cGVDb2RlKHQudHlwZWNvZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQudHlwZWNvZGUgJiYgdC50eXBlICE9IHRoaXMudXRpRXh0cy5nZXRKc1R5cGVGcm9tVHlwZUNvZGUodC50eXBlY29kZSkpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFJpbGV2YXRlIGluY29uc2lzdGVuemUgZnJhIGlsIFRpcG8gJHt0LnR5cGV9IGUgaWwgVGlwbyAke3RoaXMudXRpRXh0cy5nZXRKc1R5cGVGcm9tVHlwZUNvZGUodC50eXBlY29kZSl9IGNhbGNvbGF0byBkYSBUeXBlQ29kZSAke3QudHlwZWNvZGV9IHBlciBpbCBwYXJhbWV0cm8gJHt0LmlkfWApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSBcImJvb2xlYW5cIilcclxuICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0LnZhbHVlPy50b1N0cmluZygpPy50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0LmVudW10eXBlIHx8IHQuZGljdHR5cGUpXHJcbiAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZW51bSc7XHJcblxyXG4gICAgICAgICAgICAvLyBWYWxvcmUgdmFsaWRvIG1hIG1vZGFsaXTDoCBkaSB1dGlsaXp6byBhIENvbW1hU2VwYXJhdGVkLCBkZXZvIGFzc2ljdXJhcm1pIGRpIHJpZW1ldHRlcmUgbGEgdmVyc2lvbmUgY29uIGxhIHN0cmluZ2FcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSAnZW51bScgJiYgdGhpcy5MaXN0Rm9ybWF0ID09ICdDb21tYVNlcGFyYXRlZCcgJiYgdC5tdWx0aWVudW0gJiYgdC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KHQudmFsdWUpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBBZ2dpdXN0byBsZSBtb2RhbGl0w6AgZGkgZnVuemlvbmFtZW50byBkZWkgcGFyYW1ldHJpIGxpc3RhLiBDaGUgaW50ZXJuYW1lbnRlIGZ1bnppb25hbm8gc2VtcHJlIGNvbiB1bmEgbGlzdGEgZGkgdmFsb3JpXHJcbiAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gJ2VudW0nICYmIHRoaXMuTGlzdEZvcm1hdCA9PSAnQ29tbWFTZXBhcmF0ZWQnICYmIHQubXVsdGllbnVtICYmIHQudmFsdWUgJiYgIUFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZSA/IHQudmFsdWUuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkgOiBbXTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5BbGxQYXJhbWV0ZXJzRW1wdHkgPSB0aGlzLlBhcmFtZXRlcnMuZXZlcnkodCA9PiAhdC52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlR3JvdXBzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIE1ldG9kbyBjaGUgc2kgb2NjdXBhIGRpIGNyZWFyZSBlIG9yZGluYXJlIGkgZ3J1cHBpIGRlaSBwYXJhbWV0cmlcclxuICAgICovXHJcbiAgICBnZW5lcmF0ZUdyb3VwcygpIHtcclxuICAgICAgICB0aGlzLkdyb3VwcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5QYXJhbWV0ZXJzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVycy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIDwgYi5vcmRlciA/IC0xIDogMSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDaWNsbyB0dXR0aSBpIHBhcmFtZXRyaVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgdGhpcy5QYXJhbWV0ZXJzLmxlbmd0aCA+IGk7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhciA9IHRoaXMuUGFyYW1ldGVyc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyR3JvdXBOYW1lID0gcGFyLmdyb3VwID8/IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBPcmRlciA9IHBhci5ncm91cCA/IHBhci5vcmRlciA6IC0xO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIGlsIGdydXBwbyBub24gZXNpc3RlLCBsbyBhZ2dpdW5nb1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLkdyb3Vwcy5zb21lKHggPT4geC5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR3JvdXBzLnB1c2gobmV3IEdlbmVyaWNQYXJhbWV0ZXJHcm91cChwYXJHcm91cE5hbWUsIGdyb3VwT3JkZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJbnNlcmlzY28gaWwgcGFyYW1ldHJvIGRlbnRybyBhbCBzdW8gZ3J1cHBvXHJcbiAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5maW5kKGcgPT4gZy5ncm91cE5hbWUgPT0gcGFyR3JvdXBOYW1lKS5wYXJhbWV0ZXJzLnB1c2gocGFyKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBHZXN0aW9uZSBzb3R0b2dydXBwaVxyXG4gICAgICAgICAgICBsZXQgc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSA9IHRoaXMuR3JvdXBzLmZpbHRlcihncm91cCA9PiBncm91cC5ncm91cE5hbWUuaW5jbHVkZXMoJ8KnJykpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfOyBzdWJncm91cHMubGVuZ3RoID4gMDsgKCkgPT4geyB9KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWN1cGVybyBsYSBsaXN0YSBkaSBncnVwcGkgY2hlIGhhbm5vIHNvdHRvZ3J1cHBpXHJcbiAgICAgICAgICAgICAgICAvLyBQZXIgY29udmVuemlvbmUsIG5lbCBub21lIGNvbnRlbmdvbm8gXCLCp1wiXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvQWRkU3ViZ3JvdXBzKHN1Ymdyb3Vwcyk7XHJcbiAgICAgICAgICAgICAgICBzdWJncm91cHMgPSB0aGlzLkdyb3Vwcy5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lLmluY2x1ZGVzKCfCpycpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5Hcm91cHMuc29ydCgoYSwgYikgPT4gYS5vcmRlciA8IGIub3JkZXIgPyAtMSA6IDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgY3JlYXJlIGUgb3JkaW5hcmUgaSBzb3R0b2dydXBwaSBkZWkgcGFyYW1ldHJpXHJcbiAgICAqL1xyXG4gICAgdHJ5VG9BZGRTdWJncm91cHMoc3ViZ3JvdXBzOiBHZW5lcmljUGFyYW1ldGVyR3JvdXBbXSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBzdWJncm91cHMubGVuZ3RoID4gaTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBzdWIgPSBzdWJncm91cHNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBPdHRlbmdvIHVuIGxpc3RhIGNvbiBsYSBnZXJhcmNoaWEgZGVpIGdydXBwaSwgaW4gb3JkaW5lXHJcbiAgICAgICAgICAgIGxldCBncm91cHNQYXJlbnRIaWVyYXJjaHkgPSBzdWIuZ3JvdXBOYW1lLnNwbGl0KCfCpycpID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gaWwgZ3J1cHBvIHBhZHJlXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRHcm91cE5hbWUgPSBzdWIuZ3JvdXBOYW1lLnJlcGxhY2UoYMKnJHtncm91cHNQYXJlbnRIaWVyYXJjaHlbZ3JvdXBzUGFyZW50SGllcmFyY2h5Lmxlbmd0aCAtIDFdfWAsIGBgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGlsIGdydXBwbyBwYWRyZSBub24gZXNpc3RlLCBsbyBhZ2dpdW5nb1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuR3JvdXBzLnNvbWUoeCA9PiB4Lmdyb3VwTmFtZSA9PSBwYXJlbnRHcm91cE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwcy5wdXNoKG5ldyBHZW5lcmljUGFyYW1ldGVyR3JvdXAocGFyZW50R3JvdXBOYW1lLCBzdWIub3JkZXIpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmltdW92byBkYWwgbm9tZSBkZWwgZ3J1cHBvIGwnaW5mb3JtYXppb25lIHN1bCBwYWRyZSAoU2lzdGVtYW5kbyBhbmNoZSBsJ2V0aWNoZXR0YSlcclxuICAgICAgICAgICAgLy8gZSBsbyBhZ2dpdW5nbyBhaSBzb3R0b2dydXBwaSBkZWwgcGFkcmVcclxuICAgICAgICAgICAgc3ViLmdyb3VwTmFtZSA9IHN1Yi5ncm91cE5hbWUucmVwbGFjZShgJHtwYXJlbnRHcm91cE5hbWV9wqdgLCAnJyk7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRHcm91cCA9IHRoaXMuR3JvdXBzLmZpbmQoeCA9PiB4Lmdyb3VwTmFtZSA9PSBwYXJlbnRHcm91cE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50R3JvdXA/LnN1Ymdyb3Vwcy5zb21lKHMgPT4gcy5ncm91cE5hbWUgPT0gc3ViLmdyb3VwTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBwYXJlbnRHcm91cC5zdWJncm91cHMuZmluZChmID0+IGYuZ3JvdXBOYW1lID09IHN1Yi5ncm91cE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgc3ViLnBhcmFtZXRlcnMubWFwKHAgPT4gdGFyZ2V0LnBhcmFtZXRlcnMucHVzaChwKSk7XHJcbiAgICAgICAgICAgICAgICBzdWIuc3ViZ3JvdXBzLm1hcChzID0+IHRhcmdldC5zdWJncm91cHMucHVzaChzKSk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQub3JkZXIgPSBzdWIub3JkZXIgPCB0YXJnZXQub3JkZXIgPyBzdWIub3JkZXIgOiB0YXJnZXQub3JkZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cD8uc3ViZ3JvdXBzLnB1c2goc3ViKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUmltdW92byBpbCBzb3R0b2dydXBwbyBncnVwcG8gZGFsbGEgbGlzdGFcclxuICAgICAgICAgICAgdGhpcy5Hcm91cHMuc3BsaWNlKHRoaXMuR3JvdXBzLmluZGV4T2Yoc3ViKSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGlwZWxpbmUgZGkgQW5ndWxhclxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuKTogdm9pZCB7IHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBpcGVsaW5lIGRpIEFuZ3VsYXJcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm4pOiB2b2lkIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBzaSBvY2N1cGEgZGkgZ2VzdGlyZSBpbCBtb2RlbGxvIGluIHVzY2l0YSBlIHByb3BhZ2FybG8gc3VsIGJpbmRpbmcgbmdNb2RlbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuUGFyYW1ldGVycylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZighdGhpcy5Hcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVHcm91cHMoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTZSBjaSBzb25vIGRlbGxlIG1vZGlmaWNoZSBhaSBiaW5kaW5nIHBvdHJlYmJlcm8gZXNzZXJlIGNhbWJpYXRpIGkgcmVxdWlyZWQuIFJpY3JlbyB0dXR0aSBpIGNvbXBvbmVudGkgZSByaS1pZHJhdG8gbGEgY2FjaGUgZGVpIHBhcmFtZXRyaVxyXG4gICAgICAgIHZhciBjaGFuZ2VzID0gdGhpcy5yZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTtcclxuICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBJbiBiYXNlIGFpIGJpbmRpbmcgY2FtYmlhdGkgZGV2byB0cm92YXJlIHR1dHRpIGkgcGFyYW1ldHJpIGNoZSBoYW4gc3ViaXRvIG1vZGlmaWNoZSBzdHJ1dHR1cmFsaSAodmlzaWJpbGl0w6AsIG9iYmxpZ2F0b3JpZXTDoClcclxuICAgICAgICAgICAgLy8gZGlzdHJ1Z2dlcmxpIGUgcmljcmVhcmxpIGluIG1vZG8gY2hlIGkgYmluZGluZyBsYXRvIGh0bWwgc2kgYWdnaW9ybmlubyBkaSBjb25zZWd1ZW56YS5cclxuICAgICAgICAgICAgLy8gMTogRmFjY2lvIHVuYSBjb3BpYSBkZWwgcGFyYW1ldHJvIGNvcnJlbnRlXHJcbiAgICAgICAgICAgIC8vIDI6IFRyb3ZvIGxhIHN1YSBwb3NpemlvbmUgYWxsJ2ludGVybm8gZGVpIGdydXBwaSBlIGxvIHNvc3RpdHVpc2NvIGNvbiBsYSBjb3BpYVxyXG4gICAgICAgICAgICAvLyAzOiBBZ2dpb3JubyBsYSBsaXN0YSBkZWkgcGFyYW1ldHJpIGUgbGEgc3VhIGNhY2hlIGluIG1vZG8gZGEgcHVudGFyZSBhbGwnb2dnZXR0byBudW92b1xyXG4gICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2goY2ggPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5QYXJhbWV0ZXJzLmZpbmRJbmRleCh0ID0+IHQuaWQgPT0gY2gpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlckNvcHkgPSB0aGlzLnV0aUV4dHMuZGVlcENsb25lKHRoaXMuUGFyYW1ldGVyc1tpbmRleF0pIGFzIEdlbmVyaWNQYXJhbWV0ZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlclJlZkZpeGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZyA9IDA7IGlnIDwgdGhpcy5Hcm91cHMubGVuZ3RoOyBpZysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSB0aGlzLkdyb3Vwc1tpZ107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaXAgPSAwOyBpcCA8IGcucGFyYW1ldGVycy5sZW5ndGg7IGlwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBnLnBhcmFtZXRlcnNbaXBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwID09PSB0aGlzLlBhcmFtZXRlcnNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdyb3Vwc1tpZ10ucGFyYW1ldGVyc1tpcF0gPSBwYXJhbWV0ZXJDb3B5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyUmVmRml4ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlclJlZkZpeGVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5QYXJhbWV0ZXJzW2luZGV4XSA9IHBhcmFtZXRlckNvcHlcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFyYW1ldGVyc0NhY2hlW2NoXSA9IHRoaXMuUGFyYW1ldGVyc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgUGFyYW1ldGVyc0Nsb25lID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZSh0aGlzLlBhcmFtZXRlcnMpIGFzIEdlbmVyaWNQYXJhbWV0ZXJbXTtcclxuXHJcbiAgICAgICAgLy8gQWdnaXVzdG8gbGUgbW9kYWxpdMOgIGRpIGZ1bnppb25hbWVudG8gZGVpIHBhcmFtZXRyaSBsaXN0YS4gQ2hlIGludGVybmFtZW50ZSBmdW56aW9uYW5vIHNlbXByZSBjb24gdW5hIGxpc3RhIGRpIHZhbG9yaVxyXG4gICAgICAgIFBhcmFtZXRlcnNDbG9uZT8uZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKHQudHlwZSA9PSBcImVudW1cIiAmJiB0aGlzLkxpc3RGb3JtYXQgPT0gJ0NvbW1hU2VwYXJhdGVkJyAmJiB0Lm11bHRpZW51bSAmJiB0LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodC52YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdC52YWx1ZS5qb2luKCcsJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuU2luZ2xlUGFyYW1ldGVyTW9kZSA/IFBhcmFtZXRlcnNDbG9uZVswXSA6IFBhcmFtZXRlcnNDbG9uZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaW11b3ZlIGlsIHBhcmFtZXRybyBzZWxlemlvbmF0byBlIHByb3BhZ2EgaWwgbW9kZWxsb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0dlbmVyaWNQYXJhbWV0ZXJ9IHBhciBQYXJhbWV0cm8gZGEgcmltdW92ZXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVQYXJhbWV0ZXIocGFyOiBHZW5lcmljUGFyYW1ldGVyKSB7XHJcbiAgICAgICAgdGhpcy5QYXJhbWV0ZXJzLnNwbGljZSh0aGlzLlBhcmFtZXRlcnMuaW5kZXhPZihwYXIpLCAxKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2VuZXJhdGVQYXJhbWV0ZXJHcm91cHMoKSB7XHJcbiAgICAgICAgbGV0IEdyb3VwczogeyBpZDogc3RyaW5nLCBncm91cHM6IHN0cmluZ1tdLCBvcmRlcjogbnVtYmVyIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLlBhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgIEdyb3Vwcy5wdXNoKHsgaWQ6IHBhcmFtLmlkLCBncm91cHM6IHBhcmFtLmdyb3VwLnNwbGl0KFwiwqdcIiksIG9yZGVyOiBwYXJhbS5vcmRlciB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IEdyb3VwZWRHcm91cHMgPSBHcm91cHMucmVkdWNlKChyLCBhKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdEdyb3VwSWQgPSBhLmdyb3Vwcz8ubGVuZ3RoID4gMCA/IGEuZ3JvdXBzWzBdIDogXCJcIjtcclxuICAgICAgICAgICAgcltmaXJzdEdyb3VwSWRdID0gWy4uLnJbZmlyc3RHcm91cElkXSB8fCBbXSwgYV07XHJcbiAgICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH0sIHt9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coR3JvdXBlZEdyb3Vwcyk7XHJcblxyXG4gICAgICAgIC8vIENpY2xvIGRlbCByaXN1bHRhdG8sIGFnZ2l1bmdlbmRvIGkgZ3J1cHBpIGFsIG1vZGVsbG9cclxuICAgICAgICAvLyBQZXIgb2duaSBncnVwcG8gY2hlIGFnZ2l1bmdvLCBhc3NlZ25vIGkgcGFyYW1ldHJpIGluIG9yZGluZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUml2ZWRlIGkgYmluZGluZ3MgZGVpIHBhcmFtZXRyaSBpbiBiYXNlIGEgbG9ybyBldmVudHVhbGkgZXNwcmVzc2lvbmkgZGkgY29udHJvbGxvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gbGlzdGEgY29uIGdsaSBpZCBkZWkgcGFyYW1ldHJpIGNoZSBzb25vIHN0YXRpIG1vZGlmaWNhdGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXZpZXdQYXJhbWV0ZXJzQmluZGluZ3MoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHAgPSB0aGlzLlBhcmFtZXRlcnNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAocC5yZXF1aXJlZGV4cCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZSZXEgPSBwLnJlcXVpcmVkO1xyXG4gICAgICAgICAgICAgICAgcC5yZXF1aXJlZCA9IHRoaXMuZXZhbHVhdGUocC5yZXF1aXJlZGV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlJlcSAhPSBwLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocC52aXNpYmxlZXhwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldlZpc2kgPSBwLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICBwLnZpc2libGUgPSB0aGlzLmV2YWx1YXRlKHAudmlzaWJsZWV4cCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlZpc2kgIT0gcC52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChwLmlkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIHVuJ2VzcHJlc3Npb25lIGluIGJhc2UgYWkgcGFyYW1ldHJpIHByZXNlbnRpIG5lbCBtb2RlbGxvIGF0dHVhbGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGV4cHIgRXNwcmVzc2lvbmUgZGEgdmFsdXRhcmUgc2NyaXR0YSBuZWwgZm9ybWF0byAocmlwZXRpYmlsZSkgXCJJRCAoPT18IT18PHw+fD49fDw9KSAoYHZhbG9yZWAgfCBudWxsIHwgdHJ1ZSB8IGZhbHNlIHwgWFhYLFhYWClcIiBzZXBhcmF0byBldmVudHVhbG1lbnRlIGRhICYmIGVkIHx8XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zICoqdHJ1ZSoqIHNlIGxhIGNvbmRpemlvbmUgw6ggdmVyaWZpY2F0YSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZShleHByOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgcmVnZXggPSAvXFxzPyhbYS16QS1aMC05Xy1dKylcXHM/KCE9fD09fDx8Pnw8PXw+PSlcXHM/KGBbXmBdK2B8YGB8bnVsbHxbMC05LF0rfHRydWV8ZmFsc2UpL2dtO1xyXG5cclxuICAgICAgICB2YXIgbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICB2YXIgZmluYWxFeHByID0gZXhwcjtcclxuICAgICAgICB3aGlsZSAobWF0Y2hlcyA9IHJlZ2V4LmV4ZWMoZXhwcikpIHtcclxuICAgICAgICAgICAgdmFyIGZ1bGxNYXRjaCA9IG1hdGNoZXNbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgaWQgPSBtYXRjaGVzWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgdmFyIG9wZXJhdGlvbiA9IG1hdGNoZXNbMl0udHJpbSgpO1xyXG4gICAgICAgICAgICBsZXQgYlZhbHVlID0gbWF0Y2hlc1szXS50cmltKCkudHJpbSgpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBtYXRjaGVzWzNdLnRyaW0oKS50cmltKCkucmVwbGFjZSgnYCcsICcnKS5yZXBsYWNlKCdgJywgJycpO1xyXG5cclxuICAgICAgICAgICAgZmluYWxFeHByID0gZmluYWxFeHByLnJlcGxhY2UoZnVsbE1hdGNoLCBgdGhpcy5jaGVja1ZhbHVlKCcke2lkfScsICcke29wZXJhdGlvbn0nLCAke2JWYWx1ZSA9PSAnbnVsbCcgPyAnbnVsbCcgOiBgJyR7dmFsdWV9J2B9KWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGV2YWwoZmluYWxFeHByKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc3RpdHVpc2NlIGwnb3BlcmF6aW9uZSBkaSBjb21wYXJhemlvbmUgZnJhIHVuIHNpbmdvbG8gdmFsb3JlIGRpIHVuIHBhcmFtZXRybyBlIHVuIHN1byB2YWxvcmUgZGkgY29uZnJvbnRvIGluIGJhc2UgYWQgdW4gb3BlcmF0b3JlXHJcbiAgICAgKiBSaWNoaWFtYXRhIGRhIEVWQUxcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGlhdmUgZGVsIHBhcmFtZXRybyBkaSBjdWkgdmVyaWZpY2FyZSBpbCB2YWxvcmVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciBPcGVyYXRvcmUgY29uIGN1aSB2ZXJpZmljYXJlIGlsIHZhbG9yZTogPT0sICE9LCA+LCA8LCA+PSwgPD1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWxvcmUgZGkgY29uZnJvbnRvIGRhIHV0aWxpenphcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgKip0cnVlKiogc2UgbGEgY29uZGl6aW9uZSDDqCB2ZXJpZmljYXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hlY2tWYWx1ZShrZXk6IHN0cmluZywgb3BlcmF0b3I6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByUGFyID0gdGhpcy5QYXJhbWV0ZXJzQ2FjaGVba2V5XTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHJQYXIudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgXCIke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsIGBgKX1cIiAke29wZXJhdG9yfSBcIiR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsIGBgKX1cImApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChgJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZChyUGFyLnZhbHVlLCBgYCkudG9TdHJpbmcoKX0gJHtvcGVyYXRvcn0gJHt0aGlzLmRlZmF1bHRJZm51bGxPclVuZGVmaW5lZCh2YWx1ZSwgYGApfWApO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGAke3RoaXMuZGVmYXVsdElmbnVsbE9yVW5kZWZpbmVkKHJQYXIudmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9ICR7b3BlcmF0b3J9ICR7dGhpcy5kZWZhdWx0SWZudWxsT3JVbmRlZmluZWQodmFsdWUsICdcIlwiJywgdHJ1ZSkucmVwbGFjZSgnLCcsICcuJyl9YCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJEYXRlQ29udiA9IGB0aGlzLmRhdGVzLmdldERhdGVDb252ZXJ0aW9uKFwiJHtyUGFyLnZhbHVlfVwiKWA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbERhdGVDb252ID0gYHRoaXMuZGF0ZXMuZ2V0RGF0ZUNvbnZlcnRpb24oXCIke3ZhbHVlfVwiKWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI9PVwiOiByZXR1cm4gZXZhbChgJHtwYXJEYXRlQ29udn0gPT0gJHt2YWxEYXRlQ29udn0gfHwgKCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNTYW1lKCR7dmFsRGF0ZUNvbnZ9KSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIiE9XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSAke3ZhbERhdGVDb252fSAmJiAke3BhckRhdGVDb252fSAhPSBudWxsICYmICEke3BhckRhdGVDb252fS5pc1NhbWUoJHt2YWxEYXRlQ29udn0pYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHtwYXJEYXRlQ29udn0uaXNBZnRlcigke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIjxcIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAke3BhckRhdGVDb252fS5pc0JlZm9yZSgke3ZhbERhdGVDb252fSlgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIj49XCI6IHJldHVybiBldmFsKGAke3BhckRhdGVDb252fSAhPSBudWxsICYmICR7dmFsRGF0ZUNvbnZ9ICE9IG51bGwgJiYgKCR7cGFyRGF0ZUNvbnZ9LmlzQWZ0ZXIoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPD1cIjogcmV0dXJuIGV2YWwoYCR7cGFyRGF0ZUNvbnZ9ICE9IG51bGwgJiYgJHt2YWxEYXRlQ29udn0gIT0gbnVsbCAmJiAoJHtwYXJEYXRlQ29udn0uaXNCZWZvcmUoJHt2YWxEYXRlQ29udn0pIHx8ICR7cGFyRGF0ZUNvbnZ9Py5pc1NhbWUoJHt2YWxEYXRlQ29udn0pKWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJFcnJvcmkgbmVsbGEgdmFsdXRhemlvbmUgZGVsbCdlc3ByZXNzaW9uZS4gRmFsbGJhY2sgYSBmYWxzZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgYEBlc2ZhZW56YS9wYXJhbWV0ZXJzOiBUaXBvIHBhcmFtZXRybyAke2tleX0gbm9uIHJpY29ub3NjaXV0bzogJHtyUGFyLnR5cGV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0SWZudWxsT3JVbmRlZmluZWQ8VD4oaXRlbTogVCwgZGZsdDogVCwgZW1wdHlTdHJpbmdJc051bGw6IGJvb2xlYW4gPSBmYWxzZSk6IFQge1xyXG4gICAgICAgIGlmIChpdGVtID09IG51bGwgfHwgaXRlbSA9PSB1bmRlZmluZWQgfHwgaXRlbS50b1N0cmluZygpID09ICdudWxsJyB8fCAoZW1wdHlTdHJpbmdJc051bGwgJiYgaXRlbS50b1N0cmluZygpID09IFwiXCIpKVxyXG4gICAgICAgICAgICByZXR1cm4gZGZsdDtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGdldFNvdXJjZShwYXJhbWV0ZXI6IEdlbmVyaWNQYXJhbWV0ZXIsIHNlYXJjaDogc3RyaW5nLCBieWlkOiBib29sZWFuKTogT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLkF1dG9Db21wbGV0ZURhdGFSZXRyaWV2ZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQGZvcm1zLWFuZC12YWxpZGF0aW9uczogZnVuemlvbmUgZGkgZGF0YXJldHJpZXZlIG5vbiBpbXBvc3RhdGEgcGVyIHVuIHBhcmFtZXRybyBhdXRvY29tcGxldGVcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BdXRvQ29tcGxldGVEYXRhUmV0cmlldmUocGFyYW1ldGVyLCBzZWFyY2gsIGJ5aWQpO1xyXG4gICAgfVxyXG59IiwiPGRpdiAqbmdJZj1cIighUGFyYW1ldGVycyB8fCBQYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSAmJiBFbXB0eU1lc3NhZ2VcIj5cclxuICAgIDxlbT57e0VtcHR5TWVzc2FnZX19PC9lbT5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiR3JvdXBzICYmIEluaXRpYWxpemVkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVGVtcDsgY29udGV4dDoge2l0ZW06IHsgZ3JvdXBzOiBHcm91cHMsIGlzU3ViZ3JvdXA6IGZhbHNlIH19XCI+PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNUZW1wIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaXRlbS5ncm91cHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICA8ZGl2IFtjbGFzcy5wYXJzLXN1Ymdyb3VwXT1cIml0ZW0uaXNTdWJncm91cFwiIFtjbGFzcy5wYXJzLWdyb3VwXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkdyb3Vwc09yU3ViZ3JvdXBzRGlzcGxheTsgY29udGV4dDogeyBpdGVtOiB7IGdyb3VwOiBncm91cCwgaW5kZXg6IGsgKyAoaXRlbS5pbmRleCA/ICgnXycgKyBpdGVtLmluZGV4KSA6ICcnKSwgaXNTdWJncm91cDogaXRlbS5pc1N1Ymdyb3VwIH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cC5zdWJncm91cHMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRlbXA7IGNvbnRleHQ6IHtpdGVtOiB7IGdyb3VwczogZ3JvdXAuc3ViZ3JvdXBzLCBpbmRleDogayArIChpdGVtLmluZGV4ID8gKCdfJyArIGl0ZW0uaW5kZXgpIDogJycpLCBpc1N1Ymdyb3VwOiB0cnVlIH19O1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNHcm91cHNPclN1Ymdyb3Vwc0Rpc3BsYXkgbGV0LWl0ZW09XCJpdGVtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5ncm91cCAmJiBJbml0aWFsaXplZFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmdyb3VwLmdyb3VwTmFtZVwiIFtjbGFzcy5wYXJzLWdyb3VwLXRpdGxlXT1cIiFpdGVtLmlzU3ViZ3JvdXBcIiBbY2xhc3MucGFycy1zdWJncm91cC10aXRsZV09XCJpdGVtLmlzU3ViZ3JvdXBcIj5cclxuICAgICAgICAgICAge3tpdGVtLmdyb3VwLmdyb3VwTmFtZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uZ3JvdXAucGFyYW1ldGVycyAmJiBpdGVtLmdyb3VwLnBhcmFtZXRlcnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXIgb2YgaXRlbS5ncm91cC5wYXJhbWV0ZXJzOyBsZXQgaT0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdDtcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhRGlzcGxheU1vZGUgfHwgKCFIaWRlRW1wdHkgfHwgKHBhci52YWx1ZSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBmb3JtLWdyb3VwXCIgKm5nSWY9XCJwYXIudmlzaWJsZVwiIFtjbGFzcy5hcHAtbWFyZ2luLWJvdHRvbS0wXT1cIkxhc3RQYXJhbWV0ZXJOb01hcmdpbiAmJiBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC17e0xhYmVsQ29sV2lkdGh9fSBtLXQtNVwiPjxzcGFuICpuZ0lmPVwiUmVtb3ZhbFwiIGNsYXNzPVwiZmEgZmEtcmVtb3ZlIHRleHQtZGFuZ2VyXCIgKGNsaWNrKT1cInJlbW92ZVBhcmFtZXRlcihwYXIpXCI+Jm5ic3A7PC9zcGFuPnt7cGFyLmRlc2NyaXB0aW9ufX17e3Bhci5yZXF1aXJlZCA/ICcqJyA6ICcnfX06PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNlIERhdGEtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1kYXRlIFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19X3t7cGFyLmlkfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWRhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU2Ugc3RyaW5nYS0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0taW5wdXQgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19X3t7cGFyLmlkfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNlIG51bWVyby0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7SW5wdXRDb2xXaWR0aH19XCIgKm5nSWY9XCJwYXIudHlwZSA9PSAnbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0taW5wdXQgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19X3t7cGFyLmlkfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3IgcGF0dGVybj1cInt7cGFyLnBhdHRlcm4gfHwgJ15bKy1dP1swLTldKlssXT9bMC05XSskJ319XCI+PC9mb3JtLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNlIGJvb2xlYW4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fSBtLXQtNVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1jaGVja2JveCBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fV97e3Bhci5pZH19XCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TZSBlbnVtIHNpbmdsZSBzZWxlY3QtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmICFwYXIuc291cmNlYXBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1zZWxlY3QgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19X3t7cGFyLmlkfX1cIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3IgW1NvdXJjZV09XCJwYXIuZW51bXZhbHVlc1wiPjwvZm9ybS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBtdWx0aSBzZWxlY3QtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmIHBhci5tdWx0aWVudW0gJiYgIXBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLW11bHRpc2VsZWN0IFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbVXNlSnNvbkxpc3RdPVwiTXVsdGlzZWxlY3RNb2RlID09ICdKc29uQXJyYXknXCIgW1VzZUNvbW1hU2VwYXJhdGVkTGlzdF09XCJNdWx0aXNlbGVjdE1vZGUgPT0gJ0NvbW1hU2VwYXJhdGVkJ1wiIFtTZWxlY3RMYWJlbF09XCIoJ1NlbGV6aW9uYScgfCBsb2NhbGl6ZSA6IGxjKSArICcuLi4nXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fV97e3Bhci5pZH19XCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW1NvdXJjZV09XCJwYXIuZW51bXZhbHVlc1wiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLW11bHRpc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNlIGVudW0gbXVsdGlzZWxlY3Qgc2VuemEgc29yZ2VudGUtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmIHBhci5tdWx0aWVudW0gJiYgIXBhci5zb3VyY2VhcGkgJiYgIXBhci5lbnVtdmFsdWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybS1hdXRvY29tcGxldGUgW0Rpc3BsYXlNb2RlXT1cIkRpc3BsYXlNb2RlXCIgIFtGb3JtXT1cIkZvcm1cIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtIaWRlQ2hvaWNlc09uU2VsZWN0aW9uXT1cInRydWVcIiBbU2VsZWN0TGFiZWxdPVwiKCdTZWxlemlvbmEnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJ1wiIFsobmdNb2RlbCldPVwicGFyLnZhbHVlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1fe3twYXIuaWR9fVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtVbmJvdW5kTW9kZV09XCJ0cnVlXCIgW3JlcXVpcmVkXT1cInBhci5yZXF1aXJlZFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgI3ZhbGlkYXRvcj48L2Zvcm0tYXV0b2NvbXBsZXRlPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBhdXRvY29tcGxldGUtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmICFwYXIubXVsdGllbnVtICYmIHBhci5zb3VyY2VhcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtLWF1dG9jb21wbGV0ZSBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiAgW0Zvcm1dPVwiRm9ybVwiIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgWyhuZ01vZGVsKV09XCJwYXIudmFsdWVcIiBuYW1lPVwie3tpdGVtLmluZGV4fX1wYXJ7e2l9fV97e3Bhci5pZH19XCIgW1JlYWRvbmx5XT1cIlJlYWRvbmx5IHx8IHBhci5pc3JlYWRvbmx5XCIgW1NlYXJjaEZ1bmN0aW9uXT1cImdldFNvdXJjZS5iaW5kKHRoaXMsIHBhcilcIiBbcmVxdWlyZWRdPVwicGFyLnJlcXVpcmVkXCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIiAjdmFsaWRhdG9yPjwvZm9ybS1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU2UgZW51bSBtdWx0aXNlbGVjdCBhdXRvY29tcGxldGUtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC17e0lucHV0Q29sV2lkdGh9fVwiICpuZ0lmPVwicGFyLnR5cGUgPT0gJ2VudW0nICYmIHBhci5tdWx0aWVudW0gJiYgcGFyLnNvdXJjZWFwaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tYXV0b2NvbXBsZXRlIFtEaXNwbGF5TW9kZV09XCJEaXNwbGF5TW9kZVwiICBbRm9ybV09XCJGb3JtXCIgW0hpZGVDaG9pY2VzT25TZWxlY3Rpb25dPVwiQXV0b2NvbXBsZXRlSGlkZUNob2ljZXNPblNlbGVjdGlvblwiIFtNdWx0aV09XCJ0cnVlXCIgW0Zvcm1MYXlvdXRdPVwiZmFsc2VcIiBbKG5nTW9kZWwpXT1cInBhci52YWx1ZVwiIG5hbWU9XCJ7e2l0ZW0uaW5kZXh9fXBhcnt7aX19X3t7cGFyLmlkfX1cIiBbUmVhZG9ubHldPVwiUmVhZG9ubHkgfHwgcGFyLmlzcmVhZG9ubHlcIiBbU2VhcmNoRnVuY3Rpb25dPVwiZ2V0U291cmNlLmJpbmQodGhpcywgcGFyKVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiICN2YWxpZGF0b3I+PC9mb3JtLWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TZSBmaWxlLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIiAqbmdJZj1cInBhci50eXBlID09ICdmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0tZmlsZSBbRGlzcGxheU1vZGVdPVwiRGlzcGxheU1vZGVcIiBbRm9ybV09XCJGb3JtXCIgW1JlYWRGaWxlXT1cInRydWVcIiBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtSZWFkb25seV09XCJSZWFkb25seSB8fCBwYXIuaXNyZWFkb25seVwiIFtyZXF1aXJlZF09XCJwYXIucmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInBhci5maWxlXCIgbmFtZT1cInt7aXRlbS5pbmRleH19cGFye3tpfX1fe3twYXIuaWR9fVwiICN2YWxpZGF0b3I+PC9mb3JtLWZpbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJEaXNwbGF5TW9kZSAmJiBBbGxQYXJhbWV0ZXJzRW1wdHkgJiYgSGlkZUVtcHR5XCIgY2xhc3M9XCJjYXJkIGNhcmQtaW5mbyBhcHAtcGFkZGluZy0xMCBhcHAtbm8tbWFyZ2luIGFwcC13aGl0ZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICBOb24gJmVncmF2ZTsgcHJlc2VudGUgbnVsbGEgZGEgdmlzdWFsaXp6YXJlXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
@@ -1,32 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { FormsAndValidationsModule } from "@esfaenza/forms-and-validations";
5
- import { LocalizationModule } from '@esfaenza/localizations';
6
- import { EsParametersComponent } from './es_parameters.component';
7
- import * as i0 from "@angular/core";
8
- export class EsParametersModule {
9
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EsParametersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: EsParametersModule, declarations: [EsParametersComponent], imports: [CommonModule,
11
- LocalizationModule,
12
- FormsModule,
13
- FormsAndValidationsModule], exports: [EsParametersComponent] }); }
14
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EsParametersModule, imports: [CommonModule,
15
- LocalizationModule,
16
- FormsModule,
17
- FormsAndValidationsModule] }); }
18
- }
19
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EsParametersModule, decorators: [{
20
- type: NgModule,
21
- args: [{
22
- declarations: [EsParametersComponent],
23
- imports: [
24
- CommonModule,
25
- LocalizationModule,
26
- FormsModule,
27
- FormsAndValidationsModule,
28
- ],
29
- exports: [EsParametersComponent]
30
- }]
31
- }] });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfcGFyYW1ldGVycy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXJhbWV0ZXJzL3NyYy9saWIvZXNfcGFyYW1ldGVycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQWFsRSxNQUFNLE9BQU8sa0JBQWtCOytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkFUZCxxQkFBcUIsYUFFbEMsWUFBWTtZQUNaLGtCQUFrQjtZQUNsQixXQUFXO1lBQ1gseUJBQXlCLGFBRWpCLHFCQUFxQjtnSEFFcEIsa0JBQWtCLFlBUDNCLFlBQVk7WUFDWixrQkFBa0I7WUFDbEIsV0FBVztZQUNYLHlCQUF5Qjs7NEZBSWhCLGtCQUFrQjtrQkFWOUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztvQkFDckMsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixXQUFXO3dCQUNYLHlCQUF5QjtxQkFDMUI7b0JBQ0QsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZvcm1zQW5kVmFsaWRhdGlvbnNNb2R1bGUgfSBmcm9tIFwiQGVzZmFlbnphL2Zvcm1zLWFuZC12YWxpZGF0aW9uc1wiO1xyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25Nb2R1bGUgfSBmcm9tICdAZXNmYWVuemEvbG9jYWxpemF0aW9ucyc7XHJcbmltcG9ydCB7IEVzUGFyYW1ldGVyc0NvbXBvbmVudCB9IGZyb20gJy4vZXNfcGFyYW1ldGVycy5jb21wb25lbnQnO1xyXG5cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbRXNQYXJhbWV0ZXJzQ29tcG9uZW50XSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBMb2NhbGl6YXRpb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIEZvcm1zQW5kVmFsaWRhdGlvbnNNb2R1bGUsXHJcbiAgXSxcclxuICBleHBvcnRzOiBbRXNQYXJhbWV0ZXJzQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXNQYXJhbWV0ZXJzTW9kdWxlIHtcclxuIH1cclxuIl19