appproject-components 0.0.29 → 1.0.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.
Files changed (46) hide show
  1. package/{esm2020 → esm2022}/appproject-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/appproject-components.component.mjs +15 -15
  3. package/{esm2020 → esm2022}/lib/appproject-components.module.mjs +96 -96
  4. package/{esm2020 → esm2022}/lib/appproject-components.service.mjs +14 -14
  5. package/esm2022/lib/baseInputComponent.mjs +66 -0
  6. package/esm2022/lib/input-area/input-area.component.mjs +53 -0
  7. package/esm2022/lib/input-arquivo/input-arquivo.component.mjs +115 -0
  8. package/esm2022/lib/input-cep/input-cep.component.mjs +180 -0
  9. package/esm2022/lib/input-format/input-format.component.mjs +138 -0
  10. package/esm2022/lib/input-pesquisa/input-pesquisa.component.mjs +548 -0
  11. package/esm2022/lib/input-select/input-select.component.mjs +88 -0
  12. package/esm2022/lib/input-text/input-text.component.mjs +76 -0
  13. package/esm2022/lib/input-valor/input-valor.component.mjs +158 -0
  14. package/{esm2020 → esm2022}/lib/model-treeview/model-treeview.component.mjs +14 -14
  15. package/{esm2020 → esm2022}/public-api.mjs +18 -18
  16. package/fesm2022/appproject-components.mjs +1511 -0
  17. package/fesm2022/appproject-components.mjs.map +1 -0
  18. package/index.d.ts +5 -5
  19. package/lib/appproject-components.component.d.ts +8 -8
  20. package/lib/appproject-components.module.d.ts +26 -26
  21. package/lib/appproject-components.service.d.ts +6 -6
  22. package/lib/baseInputComponent.d.ts +27 -27
  23. package/lib/input-area/input-area.component.d.ts +21 -21
  24. package/lib/input-arquivo/input-arquivo.component.d.ts +34 -33
  25. package/lib/input-cep/input-cep.component.d.ts +29 -29
  26. package/lib/input-format/input-format.component.d.ts +27 -25
  27. package/lib/input-pesquisa/input-pesquisa.component.d.ts +68 -68
  28. package/lib/input-select/input-select.component.d.ts +29 -28
  29. package/lib/input-text/input-text.component.d.ts +29 -25
  30. package/lib/input-valor/input-valor.component.d.ts +28 -25
  31. package/lib/model-treeview/model-treeview.component.d.ts +8 -8
  32. package/package.json +8 -14
  33. package/public-api.d.ts +13 -13
  34. package/esm2020/lib/baseInputComponent.mjs +0 -65
  35. package/esm2020/lib/input-area/input-area.component.mjs +0 -53
  36. package/esm2020/lib/input-arquivo/input-arquivo.component.mjs +0 -110
  37. package/esm2020/lib/input-cep/input-cep.component.mjs +0 -180
  38. package/esm2020/lib/input-format/input-format.component.mjs +0 -129
  39. package/esm2020/lib/input-pesquisa/input-pesquisa.component.mjs +0 -540
  40. package/esm2020/lib/input-select/input-select.component.mjs +0 -80
  41. package/esm2020/lib/input-text/input-text.component.mjs +0 -65
  42. package/esm2020/lib/input-valor/input-valor.component.mjs +0 -125
  43. package/fesm2015/appproject-components.mjs +0 -1452
  44. package/fesm2015/appproject-components.mjs.map +0 -1
  45. package/fesm2020/appproject-components.mjs +0 -1437
  46. package/fesm2020/appproject-components.mjs.map +0 -1
@@ -1,540 +0,0 @@
1
- import { Component, Inject, Input, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { Subject, of } from 'rxjs';
4
- import { BaseInputComponent } from '../baseInputComponent';
5
- import { debounceTime, switchMap } from 'rxjs/operators';
6
- import { ModelTreeviewComponent } from '../model-treeview/model-treeview.component';
7
- import { LibConfigService } from '../appproject-components.module';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/common/http";
10
- import * as i2 from "@ionic/angular";
11
- import * as i3 from "@angular/common";
12
- export class InputPesquisaComponent extends BaseInputComponent {
13
- constructor(config, httpClient, modalCtrl) {
14
- super();
15
- this.config = config;
16
- this.httpClient = httpClient;
17
- this.modalCtrl = modalCtrl;
18
- this.podePesquisar = true;
19
- this.textoPesquisa = '';
20
- this.selectElementVisivel = false;
21
- this.listaPesquisa = [];
22
- this.max = '30';
23
- this.pesquisaSubject = new Subject();
24
- this.filterFunction = null;
25
- this.selectId = 'selectElement';
26
- this.campoId = 'Id';
27
- this.campoPaiId = 'PaiId';
28
- this.campoDisplay = 'Descricao';
29
- this.tipo = '';
30
- //@ViewChild('selectElement', { read: ElementRef, static: true }) selectElement;
31
- this.selectElement = null;
32
- //parametros para chamada API
33
- //endpoint para pesquisa por digitação
34
- this.url = '';
35
- this.urlItem = '';
36
- //endpoint para montar a arvore, se estiver vazia será usado o campo 'url'
37
- this.urlTree = '';
38
- this.empresa = 0;
39
- this.loadInit = false;
40
- this.onChange = (data) => { };
41
- this.onTouch = () => { };
42
- this.disabled = false;
43
- this.console = console;
44
- this.modelChanged = new Subject();
45
- this.BASE_API = this.config.apiUrl;
46
- this.modelChangeSubscription = this.modelChanged
47
- .pipe(debounceTime(500))
48
- .subscribe(data => {
49
- this.carregaItemIdParaLista(data);
50
- });
51
- }
52
- writeValue(value) {
53
- //console.log('write value', value);
54
- this.onChange(value);
55
- this.data = value;
56
- if (value == null || value == 0) {
57
- this.writePesquisa('');
58
- this.selectedItem = null;
59
- }
60
- else {
61
- if (this.loadInit == true) {
62
- this.loadInit = false;
63
- this.modelChanged.next(value);
64
- //this.carregaItemIdParaLista(value);
65
- }
66
- else {
67
- //console.log(this.selectedItem);
68
- if (!this.selectedItem || (this.selectedItem && this.selectedItem[this.campoId] != value)) {
69
- console.log('Id diferente');
70
- this.modelChanged.next(value);
71
- //this.carregaItemIdParaLista(value);
72
- }
73
- }
74
- }
75
- }
76
- registerOnChange(fn) {
77
- this.onChange = fn;
78
- }
79
- registerOnTouched(fn) {
80
- this.onTouch = fn;
81
- }
82
- setDisabledState(isDisabled) {
83
- this.disabled = this.disabled;
84
- }
85
- onBlur(event) {
86
- console.log('blur', event);
87
- //console.log(event.detail.relatedTarget);
88
- if (event.detail.relatedTarget == null || event.detail.relatedTarget.id.indexOf(this.selectId + 'IonItem') == -1) {
89
- //console.log("true", event.detail.relatedTarget.id);
90
- //pesquisar item na lista
91
- if (!this.existeNaListaTexto(this.textoPesquisa, true)) {
92
- this.limparClick();
93
- }
94
- this.dropDownPesquisa(0);
95
- if (this.form) {
96
- this.form.get(this.formControlName)?.markAsTouched();
97
- }
98
- }
99
- }
100
- ngOnInit() {
101
- //tratar urls
102
- this.url = this.url.startsWith('http') ? this.url : `${this.BASE_API}/${this.url}`;
103
- this.urlItem = this.urlItem.startsWith('http') ? this.urlItem : `${this.BASE_API}/${this.urlItem}`;
104
- this.pesquisaSubject.pipe(switchMap((url) => {
105
- this.console.log('subject url:', url);
106
- if (!this.isEmpty(url))
107
- return this.httpClient.get(url);
108
- else
109
- return of([]);
110
- }))
111
- .subscribe({
112
- next: (result) => {
113
- //this.listaPesquisa = result;
114
- this.console.log('subject subscribe result:', result);
115
- this.listaPesquisa = [];
116
- if (result && result.length > 0) {
117
- if (this.filterFunction) {
118
- result = result.filter(this.filterFunction);
119
- }
120
- result.forEach((ent, index) => {
121
- this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
122
- });
123
- }
124
- this.podePesquisar = true;
125
- if (this.listaPesquisa.length > 0) {
126
- this.dropDownPesquisa(this.listaPesquisa.length);
127
- }
128
- },
129
- error: (error) => {
130
- this.podePesquisar = true;
131
- console.log('erro pesquisa', error);
132
- }
133
- });
134
- }
135
- writePesquisa(value) {
136
- //console.log('write pesquisa', value);
137
- this.textoPesquisa = value;
138
- }
139
- showPesquisa(e) {
140
- //console.log('show pesquisa', e.keyCode);
141
- var self = this;
142
- if ((e.keyCode >= 48 && e.keyCode <= 57) ||
143
- (e.keyCode >= 65 && e.keyCode <= 90) ||
144
- (e.keyCode >= 96 && e.keyCode <= 105) ||
145
- (e.keyCode == 8)) {
146
- if (!self.podePesquisar) {
147
- return;
148
- }
149
- let filtro = self.textoPesquisa;
150
- if (filtro != null && filtro != '' && filtro.length >= 2) {
151
- self.pesquisarEntidade(filtro);
152
- }
153
- else {
154
- if (e.keyCode == 8 && !filtro) {
155
- this.limparClick();
156
- }
157
- }
158
- }
159
- else {
160
- if (e.keyCode == 40 || e.keyCode == 38) {
161
- self.dropDownPesquisa(self.listaPesquisa.length);
162
- if (self.selectElementVisivel == true) {
163
- //let select = self.selectElement; //document.getElementById(self.TemplateSelect1Id());
164
- //ion-list
165
- //selecionado
166
- //console.log(self.listaPesquisa);
167
- let inc = e.keyCode == 40 ? 1 : -1;
168
- let selected = self.listaPesquisa.find(s => s['Selected'] === true);
169
- let cur = 0;
170
- if (selected != null) {
171
- cur = selected['Index'];
172
- //desmarcar o atual
173
- selected['Selected'] = false;
174
- cur = cur + inc;
175
- }
176
- else {
177
- cur = 0;
178
- }
179
- if (cur < 0) {
180
- cur = self.listaPesquisa.length - 1;
181
- }
182
- else if (cur >= self.listaPesquisa.length) {
183
- cur = 0;
184
- }
185
- let novoSelected = self.listaPesquisa.find(n => n['Index'] === cur);
186
- if (novoSelected != null) {
187
- novoSelected['Selected'] = true;
188
- self.selectedItem = novoSelected;
189
- self.textoPesquisa = novoSelected[self.campoDisplay];
190
- }
191
- /*
192
- let select = document.getElementById(this.selectId) as any;
193
- console.log('select Element', select)
194
- if (select != null) {
195
- let inc = e.keyCode == 40 ? 1 : -1;
196
- let cur = select.selectedIndex;
197
- if (cur == NaN) cur = -1;
198
- select.selectedIndex = cur + inc;
199
- if (select.selectedIndex >= 0 && select.selectedIndex < self.listaPesquisa.length) {
200
- self.selectedItem = self.listaPesquisa[select.selectedIndex];
201
- if (self.selectedItem != null) {
202
- self.textoPesquisa = self.selectedItem[self.campoDisplay];
203
- }
204
- }
205
- }
206
- */
207
- }
208
- }
209
- else if (e.keyCode == 13) {
210
- console.log('enter key', e);
211
- //self.selecionarComboClick(e);
212
- self.selecionarComboClick(null);
213
- //return false;
214
- }
215
- else if (e.keyCode == 27) {
216
- //ESC
217
- self.dropDownPesquisa(0);
218
- }
219
- }
220
- }
221
- highlight(texto) {
222
- let index = texto.toLowerCase().indexOf(this.textoPesquisa.toLowerCase());
223
- //console.log(index);
224
- if (index >= 0) {
225
- return texto.substring(0, index) + '<strong>' + texto.substring(index, index + this.textoPesquisa.length) + '</strong>' + texto.substring(index + this.textoPesquisa.length); //texto.replace(this.textoPesquisa, `<strong>${this.textoPesquisa}</strong>`);
226
- }
227
- else {
228
- return texto;
229
- }
230
- }
231
- selecionarComboClick(item) {
232
- // console.log(item);
233
- var self = this;
234
- // console.log('combo click', self);
235
- /*
236
- let select = document.getElementById(this.selectId) as any;
237
- if (select.selectedIndex >= 0) {
238
- self.selectedItem = self.listaPesquisa[select.selectedIndex];
239
- }
240
- console.log('selected', this.selectedItem);
241
- //self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
242
- if (self.selectedItem != null) {
243
- self.textoPesquisa = self.selectedItem[self.campoDisplay];
244
- self.writeValue(self.selectedItem[self.campoId]);
245
- if (e != null) {
246
- self.selectElementVisivel = false;
247
- if (self.action != null) {
248
- self.action(self.selectedItem(), e);
249
- }
250
- }
251
- }
252
- else {
253
- self.selectElementVisivel = false;
254
- }
255
- */
256
- // pesquisar selecionado
257
- // console.log(this.listaPesquisa);
258
- let selected = this.listaPesquisa.find(s => s['Selected'] === true);
259
- // if (!selected) {
260
- // console.log(this.campoId, item);
261
- // selected = this.listaPesquisa.filter( s => s[this.campoId] == item[this.campoId]);
262
- // }
263
- //se o item form passado como parametro (click no ion-item)
264
- if (item != null) {
265
- if (selected != null) {
266
- selected['Selected'] = false;
267
- }
268
- item['Selected'] = true;
269
- selected = item;
270
- }
271
- if (selected != null) {
272
- self.selectedItem = selected;
273
- self.textoPesquisa = selected[self.campoDisplay];
274
- self.writeValue(selected[self.campoId]);
275
- self.selectElementVisivel = false;
276
- console.log('action', self.change);
277
- if (self.change != null) {
278
- self.change(self.selectedItem);
279
- }
280
- }
281
- else {
282
- self.selectElementVisivel = false;
283
- }
284
- // this.listaPesquisa.forEach( pesquisa => {
285
- // console.log(pesquisa, self.data);
286
- // } );
287
- // console.log(this.textoPesquisa);
288
- }
289
- selecionarComboChange(e) {
290
- var self = this;
291
- console.log('combo change', e);
292
- self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
293
- if (self.selectedItem != null) {
294
- self.writeValue(e);
295
- self.textoPesquisa = self.selectedItem[self.campoDisplay];
296
- if (e != null) {
297
- self.selectElementVisivel = false;
298
- if (self.change != null) {
299
- self.change(self.selectedItem, e);
300
- }
301
- }
302
- }
303
- else {
304
- self.selectElementVisivel = false;
305
- }
306
- }
307
- dropDownPesquisa(length) {
308
- var self = this;
309
- if (self.listaPesquisa != null && self.listaPesquisa.length > 0) {
310
- if (length == -1) {
311
- length = self.listaPesquisa.length;
312
- }
313
- self.selectElementVisivel = length == 0 ? false : true;
314
- //console.log(this.selectElement);
315
- //this.selectElement.open();
316
- /*
317
- //let element = this.selectElement;
318
- let element = document.getElementById(this.selectId);
319
- console.log('dropDown', element);
320
- (element as any).size = length + 1;
321
- if (length == 0) {
322
- self.selectElementVisivel = false;
323
- } else {
324
- self.selectElementVisivel = true;
325
- }
326
- */
327
- }
328
- }
329
- pesquisarEntidade(filtro) {
330
- let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
331
- console.log('pesquisarEntidade url', url);
332
- this.podePesquisar = false;
333
- this.pesquisaSubject.next(url);
334
- }
335
- pesquisarEntidadeOld(filtro) {
336
- let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
337
- console.log('pesquisarEntidade url', url);
338
- this.podePesquisar = false;
339
- this.httpClient.get(url)
340
- .subscribe({ next: (result) => {
341
- //this.listaPesquisa = result;
342
- if (this.filterFunction) {
343
- result = result.filter(this.filterFunction);
344
- }
345
- this.listaPesquisa = [];
346
- result.forEach((ent, index) => {
347
- this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
348
- });
349
- this.podePesquisar = true;
350
- if (this.listaPesquisa.length > 0) {
351
- this.dropDownPesquisa(this.listaPesquisa.length);
352
- }
353
- }, error: error => {
354
- console.log('erro pesquisa', error);
355
- this.podePesquisar = true;
356
- } });
357
- }
358
- existeNaLista(id, setRegistro = false) {
359
- if (this.listaPesquisa && this.listaPesquisa.length > 0) {
360
- let existe = this.listaPesquisa.find(l => l[this.campoId] === id);
361
- if (existe) {
362
- if (setRegistro) {
363
- this.selectedItem = existe;
364
- this.selecionarComboClick(this.selectedItem);
365
- }
366
- return true;
367
- }
368
- else {
369
- return false;
370
- }
371
- }
372
- else {
373
- return false;
374
- }
375
- }
376
- existeNaListaTexto(texto, setRegistro = false) {
377
- console.log("existe texto:", texto, this.campoDisplay, this.listaPesquisa);
378
- if (this.listaPesquisa && this.listaPesquisa.length > 0) {
379
- let existe = this.listaPesquisa.find(l => l[this.campoDisplay].toUpperCase() === texto.toUpperCase());
380
- if (existe) {
381
- if (setRegistro) {
382
- this.selectedItem = existe;
383
- this.selecionarComboClick(this.selectedItem);
384
- }
385
- return true;
386
- }
387
- else {
388
- return false;
389
- }
390
- }
391
- else {
392
- return false;
393
- }
394
- }
395
- validarItemSelecionado(setarRegistro = false) {
396
- console.log('validar selecionado');
397
- //passar pela função de filtro
398
- let valido = false;
399
- if (this.selectedItem) {
400
- if (this.filterFunction) {
401
- let existe = [{ ...this.selectedItem }].filter(this.filterFunction);
402
- if (existe != null && existe.length > 0) {
403
- valido = true;
404
- }
405
- }
406
- else {
407
- valido = true;
408
- }
409
- if (valido && setarRegistro) {
410
- this.selecionarComboClick(this.selectedItem);
411
- }
412
- return valido;
413
- }
414
- else {
415
- return false;
416
- }
417
- }
418
- carregaItemIdParaLista(id) {
419
- let url = this.urlItem.replace('<<ID>>', id.toString());
420
- console.log(this.urlItem);
421
- console.log('pesquisar ID url', url);
422
- this.podePesquisar = false;
423
- this.httpClient.get(url)
424
- .subscribe({ next: (result) => {
425
- this.listaPesquisa = [];
426
- this.listaPesquisa.push({ ...result, Index: 0, Selected: true });
427
- this.podePesquisar = true;
428
- if (this.listaPesquisa.length > 0) {
429
- this.selectedItem = this.listaPesquisa[0];
430
- this.selecionarComboClick(this.selectedItem);
431
- }
432
- }, error: error => {
433
- console.log('erro pesquisa', error);
434
- this.podePesquisar = true;
435
- } });
436
- }
437
- limparClick() {
438
- this.writeValue(null);
439
- this.writePesquisa(null);
440
- this.listaPesquisa = [];
441
- this.dropDownPesquisa(0);
442
- //this.podePesquisar = true;
443
- this.pesquisaSubject.next('');
444
- if (this.limpar) {
445
- this.limpar();
446
- }
447
- }
448
- verificarPesquisa() {
449
- //TODO: verificar se o texto corresponde com um item da lista
450
- this.selecionarComboClick(null);
451
- }
452
- async pesquisarClick() {
453
- /*
454
- if (this.pesquisaAction != null) {
455
- this.pesquisaAction();
456
- }
457
- */
458
- //pesquisaCategoria
459
- console.log(this.filterFunction, this.url, this.urlTree);
460
- const modal = await this.modalCtrl.create({
461
- component: ModelTreeviewComponent,
462
- componentProps: {
463
- //campoId: this.campoId,
464
- //campoPai: this.campoPaiId,
465
- //campoLabel: this.campoDisplay,
466
- filterFunction: this.filterFunction,
467
- empresaSelecionadaId: this.empresa,
468
- tipo: this.tipo,
469
- //especifico
470
- //planoContas: this.planoContas,
471
- url: this.isEmpty(this.urlTree) ? this.url : this.urlTree
472
- },
473
- cssClass: 'my-custom-modal-pesquisa'
474
- });
475
- modal.onDidDismiss().then(data => {
476
- let result = data['data'];
477
- console.log(result);
478
- if (result != null && result.Id > 0) {
479
- this.carregaItemIdParaLista(result.Id);
480
- }
481
- });
482
- modal.present();
483
- }
484
- isEmpty(valor) {
485
- return valor == null || valor == undefined || valor == '';
486
- }
487
- }
488
- InputPesquisaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputPesquisaComponent, deps: [{ token: LibConfigService }, { token: i1.HttpClient }, { token: i2.ModalController }], target: i0.ɵɵFactoryTarget.Component });
489
- InputPesquisaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: InputPesquisaComponent, selector: "kb-input-pesquisa", inputs: { textoPesquisa: "textoPesquisa", max: "max", filterFunction: "filterFunction", selectId: "selectId", campoId: "campoId", campoPaiId: "campoPaiId", campoDisplay: "campoDisplay", tipo: "tipo", change: "change", pesquisaAction: "pesquisaAction", limpar: "limpar", url: "url", urlItem: "urlItem", urlTree: "urlTree", empresa: "empresa", loadInit: "loadInit" }, providers: [{
490
- provide: NG_VALUE_ACCESSOR,
491
- useExisting: InputPesquisaComponent,
492
- multi: true
493
- }], viewQueries: [{ propertyName: "selectElement", first: true, predicate: ["selectElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"padding-inline-end: 0px;\">\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\n <!-- formControlName=\"{{ campo }}\" -->\n <ion-spinner *ngIf=\"!podePesquisar\"\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \n slot=\"start\" name=\"lines\"></ion-spinner>\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\n <!-- conflito com click da lista -->\n <ion-input #inputPesquisa\n type=\"{{type}}\" \n [placeholder]=\"placeholder\" \n maxlength=\"{{ max }}\" \n (ionBlur)=\"onBlur($event)\"\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \n (keyup)=\"showPesquisa($event)\"\n autocomplete=\"off\" style=\"--background:{{ inputBackgroungColor }};\"\n (click)=\"dropDownPesquisa(-1)\"\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"limparClick()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n \n <!--\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"pesquisarClick()\">\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\n </ion-button>\n -->\n \n </ion-item>\n \n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\n \n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\n class=\"pesquisa-item\">\n <!-- {{ item | json}} -->\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\n </ion-item>\n \n </ion-list>\n \n <!--\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (ionChange)=\"selecionarComboChange($event.target.value)\">\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </ion-select-option>\n </ion-select>\n -->\n \n <!--\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </option>\n \n </select>\n -->\n \n <div class=\"validation-errors\" *ngIf=\"form\">\n \n <ng-container *ngFor=\"let validation of validation_messages\">\n <div class=\"error-message\"\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\n &#8226; {{ validation.message }}\n </div>\n </ng-container>\n \n </div>\n </div>", styles: [".pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;margin-left:20px;margin-top:-4px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n", "ion-label{margin-bottom:4px!important;opacity:1!important}ion-input{padding:var(--input-padding, 8px)!important;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:var(--input-max-height, 29px)}.has-focus{border:1px solid var(--ion-color-bluetool, #1f477d)}input:focus{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}.error-message{font-size:small;color:var(--error-text-color, red);margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}@keyframes shake{0%{transform:translate(20px)}20%{transform:translate(-20px)}40%{transform:translate(10px)}60%{transform:translate(-10px)}80%{transform:translate(4px)}to{transform:translate(0)}}.error-shake ion-label{color:var(--error-text-color, red)!important}.error-shake ion-input{animation:shake .4s 1 linear;border:1px solid var(--error-text-color, red)!important}\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: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }] });
494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputPesquisaComponent, decorators: [{
495
- type: Component,
496
- args: [{ selector: 'kb-input-pesquisa', providers: [{
497
- provide: NG_VALUE_ACCESSOR,
498
- useExisting: InputPesquisaComponent,
499
- multi: true
500
- }], template: "<div style=\"padding-inline-end: 0px;\">\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\n <!-- formControlName=\"{{ campo }}\" -->\n <ion-spinner *ngIf=\"!podePesquisar\"\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \n slot=\"start\" name=\"lines\"></ion-spinner>\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\n <!-- conflito com click da lista -->\n <ion-input #inputPesquisa\n type=\"{{type}}\" \n [placeholder]=\"placeholder\" \n maxlength=\"{{ max }}\" \n (ionBlur)=\"onBlur($event)\"\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \n (keyup)=\"showPesquisa($event)\"\n autocomplete=\"off\" style=\"--background:{{ inputBackgroungColor }};\"\n (click)=\"dropDownPesquisa(-1)\"\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"limparClick()\">\n <ion-icon name=\"close-outline\"></ion-icon>\n </ion-button>\n \n <!--\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\n (click)=\"pesquisarClick()\">\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\n </ion-button>\n -->\n \n </ion-item>\n \n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\n \n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\n class=\"pesquisa-item\">\n <!-- {{ item | json}} -->\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\n </ion-item>\n \n </ion-list>\n \n <!--\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (ionChange)=\"selecionarComboChange($event.target.value)\">\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </ion-select-option>\n </ion-select>\n -->\n \n <!--\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\n {{ item[campoDisplay] }}\n </option>\n \n </select>\n -->\n \n <div class=\"validation-errors\" *ngIf=\"form\">\n \n <ng-container *ngFor=\"let validation of validation_messages\">\n <div class=\"error-message\"\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\n &#8226; {{ validation.message }}\n </div>\n </ng-container>\n \n </div>\n </div>", styles: [".pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;margin-left:20px;margin-top:-4px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n", "ion-label{margin-bottom:4px!important;opacity:1!important}ion-input{padding:var(--input-padding, 8px)!important;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:var(--input-max-height, 29px)}.has-focus{border:1px solid var(--ion-color-bluetool, #1f477d)}input:focus{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}.error-message{font-size:small;color:var(--error-text-color, red);margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}@keyframes shake{0%{transform:translate(20px)}20%{transform:translate(-20px)}40%{transform:translate(10px)}60%{transform:translate(-10px)}80%{transform:translate(4px)}to{transform:translate(0)}}.error-shake ion-label{color:var(--error-text-color, red)!important}.error-shake ion-input{animation:shake .4s 1 linear;border:1px solid var(--error-text-color, red)!important}\n"] }]
501
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
502
- type: Inject,
503
- args: [LibConfigService]
504
- }] }, { type: i1.HttpClient }, { type: i2.ModalController }]; }, propDecorators: { textoPesquisa: [{
505
- type: Input
506
- }], max: [{
507
- type: Input
508
- }], filterFunction: [{
509
- type: Input
510
- }], selectId: [{
511
- type: Input
512
- }], campoId: [{
513
- type: Input
514
- }], campoPaiId: [{
515
- type: Input
516
- }], campoDisplay: [{
517
- type: Input
518
- }], tipo: [{
519
- type: Input
520
- }], selectElement: [{
521
- type: ViewChild,
522
- args: ['selectElement', { static: false }]
523
- }], change: [{
524
- type: Input
525
- }], pesquisaAction: [{
526
- type: Input
527
- }], limpar: [{
528
- type: Input
529
- }], url: [{
530
- type: Input
531
- }], urlItem: [{
532
- type: Input
533
- }], urlTree: [{
534
- type: Input
535
- }], empresa: [{
536
- type: Input
537
- }], loadInit: [{
538
- type: Input
539
- }] } });
540
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxPQUFPLEVBQWdCLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBYSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7OztBQVk5RSxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsa0JBQWtCO0lBOEU1RCxZQUE4QyxNQUFpQixFQUNyRCxVQUFzQixFQUN0QixTQUEwQjtRQUNsQyxLQUFLLEVBQUUsQ0FBQztRQUhvQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ3JELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUE5RXBDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQ3JCLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQ3BDLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQUN0QyxrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUVSLFFBQUcsR0FBVyxJQUFJLENBQUM7UUFDN0Isb0JBQWUsR0FBb0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVoRCxtQkFBYyxHQUEwQixJQUFJLENBQUM7UUFDN0MsYUFBUSxHQUFXLGVBQWUsQ0FBQztRQUNuQyxZQUFPLEdBQVcsSUFBSSxDQUFDO1FBQ3ZCLGVBQVUsR0FBVyxPQUFPLENBQUM7UUFDN0IsaUJBQVksR0FBVyxXQUFXLENBQUM7UUFDbkMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUMzQixnRkFBZ0Y7UUFDakMsa0JBQWEsR0FBcUIsSUFBSSxDQUFDO1FBS3RGLDZCQUE2QjtRQUM3QixzQ0FBc0M7UUFDN0IsUUFBRyxHQUFXLEVBQUUsQ0FBQztRQUNqQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQzlCLDBFQUEwRTtRQUNqRSxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQU0zQixhQUFRLEdBQWEsQ0FBQyxJQUFZLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxZQUFPLEdBQWEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDM0IsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUV6QixpQkFBWSxHQUFpQixJQUFJLE9BQU8sRUFBTyxDQUFDO1FBb0NoRCxhQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFPNUIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxZQUFZO2FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQ3RCO2FBQ0EsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUE5Q0QsVUFBVSxDQUFDLEtBQW1CO1FBQzVCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUIscUNBQXFDO2FBQ3RDO2lCQUFNO2dCQUNMLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUN6RixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUIscUNBQXFDO2lCQUN0QzthQUNGO1NBQ0Y7SUFFSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFpQkQsTUFBTSxDQUFDLEtBQVU7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQiwwQ0FBMEM7UUFDMUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ2hILHFEQUFxRDtZQUNyRCx5QkFBeUI7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDcEI7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQzthQUN0RDtTQUNGO0lBQ0gsQ0FBQztJQUVRLFFBQVE7UUFDZixhQUFhO1FBQ2IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRW5HLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQU0sR0FBRyxDQUFDLENBQUM7O2dCQUVyQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQzthQUNBLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNwQiw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFFeEIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTt3QkFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUM3QztvQkFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEtBQVUsRUFBRSxFQUFFO3dCQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3JFLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2xEO1lBQ0gsQ0FBQztZQUNDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBbUI7UUFDL0IsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBTTtRQUNqQiwwQ0FBMEM7UUFDMUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixPQUFPO2FBQ1I7WUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2hDLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFFaEM7aUJBQ0k7Z0JBQ0gsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNwQjthQUNGO1NBQ0Y7YUFFSTtZQUNILElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLEVBQUU7b0JBQ3JDLHVGQUF1RjtvQkFFdkYsVUFBVTtvQkFDVixhQUFhO29CQUNiLGtDQUFrQztvQkFDbEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO29CQUNwRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ1osSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUNwQixHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN4QixtQkFBbUI7d0JBQ25CLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7d0JBQzdCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO3FCQUNqQjt5QkFBTTt3QkFDTCxHQUFHLEdBQUcsQ0FBQyxDQUFDO3FCQUNUO29CQUVELElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTt3QkFDWCxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3FCQUNyQzt5QkFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTt3QkFDM0MsR0FBRyxHQUFHLENBQUMsQ0FBQztxQkFDVDtvQkFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDcEUsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO3dCQUN4QixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzt3QkFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUN0RDtvQkFDRDs7Ozs7Ozs7Ozs7Ozs7O3NCQWVFO2lCQUNIO2FBRUY7aUJBQ0MsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQzNCLCtCQUErQjtnQkFDL0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoQyxlQUFlO2FBQ2hCO2lCQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7Z0JBQzFCLEtBQUs7Z0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFCO1NBQ0o7SUFFSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUUscUJBQXFCO1FBQ3JCLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsOEVBQThFO1NBQzlQO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVM7UUFDNUIscUJBQXFCO1FBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixvQ0FBb0M7UUFFcEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBb0JFO1FBQ0Ysd0JBQXdCO1FBQ3hCLG1DQUFtQztRQUNuQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUVwRSxtQkFBbUI7UUFDbkIscUNBQXFDO1FBQ3JDLHVGQUF1RjtRQUN2RixJQUFJO1FBRUosMkRBQTJEO1FBQzNELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDOUI7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDakI7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2hDO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7U0FDbkM7UUFDRCw0Q0FBNEM7UUFDNUMsc0NBQXNDO1FBQ3RDLE9BQU87UUFDUCxtQ0FBbUM7SUFDckMsQ0FBQztJQUVELHFCQUFxQixDQUFDLENBQU07UUFDMUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDYixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO29CQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7U0FDRjthQUNJO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvRCxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDaEIsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXZELGtDQUFrQztZQUNsQyw0QkFBNEI7WUFFNUI7Ozs7Ozs7Ozs7Y0FVRTtTQUNIO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQU0sR0FBRyxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNqQyw4QkFBOEI7Z0JBQzlCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUM3QztnQkFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxLQUFhLEVBQUUsRUFBRTtvQkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNsRDtZQUNILENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUM1QixDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFVLEVBQUUsY0FBdUIsS0FBSztRQUNwRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNsRSxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLFdBQVcsRUFBRTtvQkFDZixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztvQkFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYSxFQUFFLGNBQXVCLEtBQUs7UUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksV0FBVyxFQUFFO29CQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO29CQUMzQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUM5QztnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxnQkFBeUIsS0FBSztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbkMsOEJBQThCO1FBQzlCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUM7aUJBQ2Y7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7WUFDRCxJQUFJLE1BQU0sSUFBSSxhQUFhLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDOUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELHNCQUFzQixDQUFDLEVBQVU7UUFDL0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQU0sR0FBRyxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDOUM7WUFDSCxDQUFDLEVBQUUsS0FBSyxFQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6Qiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEI7Ozs7VUFJRTtRQUNGLG1CQUFtQjtRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN4QyxTQUFTLEVBQUUsc0JBQXNCO1lBQ2pDLGNBQWMsRUFBRTtnQkFDZCx3QkFBd0I7Z0JBQ3hCLDRCQUE0QjtnQkFDNUIsZ0NBQWdDO2dCQUNoQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNsQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsWUFBWTtnQkFDWixnQ0FBZ0M7Z0JBQ2hDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87YUFDMUQ7WUFDRCxRQUFRLEVBQUUsMEJBQTBCO1NBQ3JDLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFbEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFtQjtRQUN6QixPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFBO0lBQzNELENBQUM7O21IQXhnQlUsc0JBQXNCLGtCQThFYixnQkFBZ0I7dUdBOUV6QixzQkFBc0IsMFpBTnRCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLGlLQ2xCSiwybEhBMkVROzJGRHZESyxzQkFBc0I7a0JBVmxDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCLENBQUM7NEJBQ1YsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyx3QkFBd0I7NEJBQ25DLEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUM7OzBCQWdGVyxNQUFNOzJCQUFDLGdCQUFnQjttR0EzRTNCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBSVksR0FBRztzQkFBcEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRXlDLGFBQWE7c0JBQTNELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFcEMsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBQcmVkaWNhdGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uU2VsZWN0LCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYXNlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlSW5wdXRDb21wb25lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IE1vZGVsVHJlZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9tb2RlbC10cmVldmlldy9tb2RlbC10cmVldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGliQ29uZmlnLCBMaWJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwcHJvamVjdC1jb21wb25lbnRzLm1vZHVsZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tiLWlucHV0LXBlc3F1aXNhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LXBlc3F1aXNhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LnNjc3MnLCAnLi8uLi9iYXNlQ29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBJbnB1dFBlc3F1aXNhQ29tcG9uZW50LFxuICAgIG11bHRpOiB0cnVlXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIElucHV0UGVzcXVpc2FDb21wb25lbnQgZXh0ZW5kcyBCYXNlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBwb2RlUGVzcXVpc2FyOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgdGV4dG9QZXNxdWlzYTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdEVsZW1lbnRWaXNpdmVsOiBib29sZWFuID0gZmFsc2U7XG4gIGxpc3RhUGVzcXVpc2E6IGFueVtdID0gW107XG4gIHNlbGVjdGVkSXRlbTogYW55O1xuICBASW5wdXQoKSBvdmVycmlkZSBtYXg6IHN0cmluZyA9ICczMCc7XG4gIHByaXZhdGUgcGVzcXVpc2FTdWJqZWN0OiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIEBJbnB1dCgpIGZpbHRlckZ1bmN0aW9uOiBQcmVkaWNhdGU8YW55PiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBzZWxlY3RJZDogc3RyaW5nID0gJ3NlbGVjdEVsZW1lbnQnO1xuICBASW5wdXQoKSBjYW1wb0lkOiBzdHJpbmcgPSAnSWQnO1xuICBASW5wdXQoKSBjYW1wb1BhaUlkOiBzdHJpbmcgPSAnUGFpSWQnO1xuICBASW5wdXQoKSBjYW1wb0Rpc3BsYXk6IHN0cmluZyA9ICdEZXNjcmljYW8nO1xuICBASW5wdXQoKSB0aXBvOiBzdHJpbmcgPSAnJztcbiAgLy9AVmlld0NoaWxkKCdzZWxlY3RFbGVtZW50JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSkgc2VsZWN0RWxlbWVudDtcbiAgQFZpZXdDaGlsZCgnc2VsZWN0RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBzZWxlY3RFbGVtZW50OiBJb25TZWxlY3QgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBjaGFuZ2U/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgcGVzcXVpc2FBY3Rpb24/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgbGltcGFyPzogRnVuY3Rpb247XG4gIC8vcGFyYW1ldHJvcyBwYXJhIGNoYW1hZGEgQVBJXG4gIC8vZW5kcG9pbnQgcGFyYSBwZXNxdWlzYSBwb3IgZGlnaXRhw6fDo29cbiAgQElucHV0KCkgdXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdXJsSXRlbTogc3RyaW5nID0gJyc7XG4gIC8vZW5kcG9pbnQgcGFyYSBtb250YXIgYSBhcnZvcmUsIHNlIGVzdGl2ZXIgdmF6aWEgc2Vyw6EgdXNhZG8gbyBjYW1wbyAndXJsJ1xuICBASW5wdXQoKSB1cmxUcmVlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZW1wcmVzYTogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgbG9hZEluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvL3BsYW5vQ29udGFzOiBudW1iZXI7XG5cbiAgLy9jb250cm9sIHZhbHVlIGFjZXNzb3JcbiAgcHVibGljIGRhdGE6IG51bWJlciB8IGFueTtcbiAgcHJpdmF0ZSBvbkNoYW5nZTogRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKSA9PiB7IH07XG4gIHByaXZhdGUgb25Ub3VjaDogRnVuY3Rpb24gPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNvbnNvbGUgPSBjb25zb2xlO1xuXG4gIG1vZGVsQ2hhbmdlZDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICBtb2RlbENoYW5nZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIgfCBhbnkpOiB2b2lkIHtcbiAgICAvL2NvbnNvbGUubG9nKCd3cml0ZSB2YWx1ZScsIHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSAwKSB7XG4gICAgICB0aGlzLndyaXRlUGVzcXVpc2EoJycpO1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5sb2FkSW5pdCA9PSB0cnVlKSB7XG4gICAgICAgIHRoaXMubG9hZEluaXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb2RlbENoYW5nZWQubmV4dCh2YWx1ZSk7XG4gICAgICAgIC8vdGhpcy5jYXJyZWdhSXRlbUlkUGFyYUxpc3RhKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVtIHx8ICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbVt0aGlzLmNhbXBvSWRdICE9IHZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdJZCBkaWZlcmVudGUnKTtcbiAgICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlZC5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAvL3RoaXMuY2FycmVnYUl0ZW1JZFBhcmFMaXN0YSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIEJBU0VfQVBJID0gdGhpcy5jb25maWcuYXBpVXJsO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTGliQ29uZmlnU2VydmljZSkgcHJpdmF0ZSBjb25maWc6IExpYkNvbmZpZyxcbiAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5tb2RlbENoYW5nZWRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoZGF0YSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uQmx1cihldmVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ2JsdXInLCBldmVudCk7XG4gICAgLy9jb25zb2xlLmxvZyhldmVudC5kZXRhaWwucmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKGV2ZW50LmRldGFpbC5yZWxhdGVkVGFyZ2V0ID09IG51bGwgfHwgZXZlbnQuZGV0YWlsLnJlbGF0ZWRUYXJnZXQuaWQuaW5kZXhPZih0aGlzLnNlbGVjdElkICsgJ0lvbkl0ZW0nKSA9PSAtMSkge1xuICAgICAgLy9jb25zb2xlLmxvZyhcInRydWVcIiwgZXZlbnQuZGV0YWlsLnJlbGF0ZWRUYXJnZXQuaWQpO1xuICAgICAgLy9wZXNxdWlzYXIgaXRlbSBuYSBsaXN0YVxuICAgICAgaWYgKCF0aGlzLmV4aXN0ZU5hTGlzdGFUZXh0byh0aGlzLnRleHRvUGVzcXVpc2EsIHRydWUpKSB7XG4gICAgICAgIHRoaXMubGltcGFyQ2xpY2soKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kcm9wRG93blBlc3F1aXNhKDApO1xuICAgICAgaWYgKHRoaXMuZm9ybSkge1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKT8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIC8vdHJhdGFyIHVybHNcbiAgICB0aGlzLnVybCA9IHRoaXMudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHRoaXMudXJsIDogYCR7dGhpcy5CQVNFX0FQSX0vJHt0aGlzLnVybH1gO1xuICAgIHRoaXMudXJsSXRlbSA9IHRoaXMudXJsSXRlbS5zdGFydHNXaXRoKCdodHRwJykgPyB0aGlzLnVybEl0ZW0gOiBgJHt0aGlzLkJBU0VfQVBJfS8ke3RoaXMudXJsSXRlbX1gO1xuXG4gICAgdGhpcy5wZXNxdWlzYVN1YmplY3QucGlwZShzd2l0Y2hNYXAoKHVybCkgPT4ge1xuICAgICAgdGhpcy5jb25zb2xlLmxvZygnc3ViamVjdCB1cmw6JywgdXJsKTtcbiAgICAgIGlmICghdGhpcy5pc0VtcHR5KHVybCkpXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PGFueT4odXJsKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAvL3RoaXMubGlzdGFQZXNxdWlzYSA9IHJlc3VsdDtcbiAgICAgICAgICB0aGlzLmNvbnNvbGUubG9nKCdzdWJqZWN0IHN1YnNjcmliZSByZXN1bHQ6JywgcmVzdWx0KTtcbiAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EgPSBbXTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIodGhpcy5maWx0ZXJGdW5jdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChlbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLmVudCwgSW5kZXg6IGluZGV4LCBTZWxlY3RlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wRG93blBlc3F1aXNhKHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvIHBlc3F1aXNhJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHdyaXRlUGVzcXVpc2EodmFsdWU6IHN0cmluZyB8IGFueSk6IHZvaWQge1xuICAgIC8vY29uc29sZS5sb2coJ3dyaXRlIHBlc3F1aXNhJywgdmFsdWUpO1xuICAgIHRoaXMudGV4dG9QZXNxdWlzYSA9IHZhbHVlO1xuICB9XG5cbiAgc2hvd1Blc3F1aXNhKGU6IGFueSk6IHZvaWQge1xuICAgIC8vY29uc29sZS5sb2coJ3Nob3cgcGVzcXVpc2EnLCBlLmtleUNvZGUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoKGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcpIHx8XG4gICAgICAoZS5rZXlDb2RlID49IDY1ICYmIGUua2V5Q29kZSA8PSA5MCkgfHxcbiAgICAgIChlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSkgfHxcbiAgICAgIChlLmtleUNvZGUgPT0gOCkpIHtcbiAgICAgIGlmICghc2VsZi5wb2RlUGVzcXVpc2FyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBmaWx0cm8gPSBzZWxmLnRleHRvUGVzcXVpc2E7XG4gICAgICBpZiAoZmlsdHJvICE9IG51bGwgJiYgZmlsdHJvICE9ICcnICYmIGZpbHRyby5sZW5ndGggPj0gMikge1xuICAgICAgICBzZWxmLnBlc3F1aXNhckVudGlkYWRlKGZpbHRybyk7XG5cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09IDggJiYgIWZpbHRybykge1xuICAgICAgICAgIHRoaXMubGltcGFyQ2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGVsc2Uge1xuICAgICAgaWYgKGUua2V5Q29kZSA9PSA0MCB8fCBlLmtleUNvZGUgPT0gMzgpIHtcbiAgICAgICAgc2VsZi5kcm9wRG93blBlc3F1aXNhKHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGgpO1xuICAgICAgICBpZiAoc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9PSB0cnVlKSB7XG4gICAgICAgICAgLy9sZXQgc2VsZWN0ID0gc2VsZi5zZWxlY3RFbGVtZW50OyAvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuVGVtcGxhdGVTZWxlY3QxSWQoKSk7XG5cbiAgICAgICAgICAvL2lvbi1saXN0XG4gICAgICAgICAgLy9zZWxlY2lvbmFkb1xuICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZi5saXN0YVBlc3F1aXNhKTtcbiAgICAgICAgICBsZXQgaW5jID0gZS5rZXlDb2RlID09IDQwID8gMSA6IC0xO1xuICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNlbGYubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XG4gICAgICAgICAgbGV0IGN1ciA9IDA7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGN1ciA9IHNlbGVjdGVkWydJbmRleCddO1xuICAgICAgICAgICAgLy9kZXNtYXJjYXIgbyBhdHVhbFxuICAgICAgICAgICAgc2VsZWN0ZWRbJ1NlbGVjdGVkJ10gPSBmYWxzZTtcbiAgICAgICAgICAgIGN1ciA9IGN1ciArIGluYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY3VyIDwgMCkge1xuICAgICAgICAgICAgY3VyID0gc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXIgPj0gc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCkge1xuICAgICAgICAgICAgY3VyID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgbm92b1NlbGVjdGVkID0gc2VsZi5saXN0YVBlc3F1aXNhLmZpbmQobiA9PiBuWydJbmRleCddID09PSBjdXIpO1xuICAgICAgICAgIGlmIChub3ZvU2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbm92b1NlbGVjdGVkWydTZWxlY3RlZCddID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRJdGVtID0gbm92b1NlbGVjdGVkO1xuICAgICAgICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gbm92b1NlbGVjdGVkW3NlbGYuY2FtcG9EaXNwbGF5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLypcbiAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWxlY3RJZCkgYXMgYW55O1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZWxlY3QgRWxlbWVudCcsIHNlbGVjdClcbiAgICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBpbmMgPSBlLmtleUNvZGUgPT0gNDAgPyAxIDogLTE7XG4gICAgICAgICAgICBsZXQgY3VyID0gc2VsZWN0LnNlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgICBpZiAoY3VyID09IE5hTikgY3VyID0gLTE7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGN1ciArIGluYztcbiAgICAgICAgICAgIGlmIChzZWxlY3Quc2VsZWN0ZWRJbmRleCA+PSAwICYmIHNlbGVjdC5zZWxlY3RlZEluZGV4IDwgc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IHNlbGYubGlzdGFQZXNxdWlzYVtzZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkSXRlbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0Rpc3BsYXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgICovXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZW50ZXIga2V5JywgZSlcbiAgICAgICAgICAvL3NlbGYuc2VsZWNpb25hckNvbWJvQ2xpY2soZSk7XG4gICAgICAgICAgc2VsZi5zZWxlY2lvbmFyQ29tYm9DbGljayhudWxsKTtcbiAgICAgICAgICAvL3JldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gMjcpIHtcbiAgICAgICAgICAvL0VTQ1xuICAgICAgICAgIHNlbGYuZHJvcERvd25QZXNxdWlzYSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgaGlnaGxpZ2h0KHRleHRvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBpbmRleCA9IHRleHRvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLnRleHRvUGVzcXVpc2EudG9Mb3dlckNhc2UoKSk7XG4gICAgLy9jb25zb2xlLmxvZyhpbmRleCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0ZXh0by5zdWJzdHJpbmcoMCwgaW5kZXgpICsgJzxzdHJvbmc+JyArIHRleHRvLnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyB0aGlzLnRleHRvUGVzcXVpc2EubGVuZ3RoKSArICc8L3N0cm9uZz4nICsgdGV4dG8uc3Vic3RyaW5nKGluZGV4ICsgdGhpcy50ZXh0b1Blc3F1aXNhLmxlbmd0aCk7ICAvL3RleHRvLnJlcGxhY2UodGhpcy50ZXh0b1Blc3F1aXNhLCBgPHN0cm9uZz4ke3RoaXMudGV4dG9QZXNxdWlzYX08L3N0cm9uZz5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHRvO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjaW9uYXJDb21ib0NsaWNrKGl0ZW06IGFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBjb25zb2xlLmxvZygnY29tYm8gY2xpY2snLCBzZWxmKTtcblxuICAgIC8qXG4gICAgbGV0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0SWQpIGFzIGFueTtcbiAgICBpZiAoc2VsZWN0LnNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSBzZWxmLmxpc3RhUGVzcXVpc2Fbc2VsZWN0LnNlbGVjdGVkSW5kZXhdO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCB0aGlzLnNlbGVjdGVkSXRlbSk7XG4gICAgLy9zZWxmLnNlbGVjdGVkSXRlbSA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKGkgPT4gaVt0aGlzLmNhbXBvSWRdID09IGUpO1xuICAgIGlmIChzZWxmLnNlbGVjdGVkSXRlbSAhPSBudWxsKSB7XG4gICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvRGlzcGxheV07XG4gICAgICBzZWxmLndyaXRlVmFsdWUoc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0lkXSk7XG4gICAgICBpZiAoZSAhPSBudWxsKSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNlbGYuYWN0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmFjdGlvbihzZWxmLnNlbGVjdGVkSXRlbSgpLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICB9XG4gICAgKi9cbiAgICAvLyBwZXNxdWlzYXIgc2VsZWNpb25hZG9cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmxpc3RhUGVzcXVpc2EpO1xuICAgIGxldCBzZWxlY3RlZCA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XG5cbiAgICAvLyBpZiAoIXNlbGVjdGVkKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZyh0aGlzLmNhbXBvSWQsIGl0ZW0pO1xuICAgIC8vICAgc2VsZWN0ZWQgPSB0aGlzLmxpc3RhUGVzcXVpc2EuZmlsdGVyKCBzID0+IHNbdGhpcy5jYW1wb0lkXSA9PSBpdGVtW3RoaXMuY2FtcG9JZF0pO1xuICAgIC8vIH1cblxuICAgIC8vc2UgbyBpdGVtIGZvcm0gcGFzc2FkbyBjb21vIHBhcmFtZXRybyAoY2xpY2sgbm8gaW9uLWl0ZW0pXG4gICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHtcbiAgICAgICAgc2VsZWN0ZWRbJ1NlbGVjdGVkJ10gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1bJ1NlbGVjdGVkJ10gPSB0cnVlO1xuICAgICAgc2VsZWN0ZWQgPSBpdGVtO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZDtcbiAgICAgIHNlbGYudGV4dG9QZXNxdWlzYSA9IHNlbGVjdGVkW3NlbGYuY2FtcG9EaXNwbGF5XTtcbiAgICAgIHNlbGYud3JpdGVWYWx1ZShzZWxlY3RlZFtzZWxmLmNhbXBvSWRdKTtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKCdhY3Rpb24nLCBzZWxmLmNoYW5nZSk7XG4gICAgICBpZiAoc2VsZi5jaGFuZ2UgIT0gbnVsbCkge1xuICAgICAgICBzZWxmLmNoYW5nZShzZWxmLnNlbGVjdGVkSXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gdGhpcy5saXN0YVBlc3F1aXNhLmZvckVhY2goIHBlc3F1aXNhID0+IHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKHBlc3F1aXNhLCBzZWxmLmRhdGEpO1xuICAgIC8vIH0gKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRleHRvUGVzcXVpc2EpO1xuICB9XG5cbiAgc2VsZWNpb25hckNvbWJvQ2hhbmdlKGU6IGFueSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBjb25zb2xlLmxvZygnY29tYm8gY2hhbmdlJywgZSk7XG4gICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSB0aGlzLmxpc3RhUGVzcXVpc2EuZmluZChpID0+IGlbdGhpcy5jYW1wb0lkXSA9PSBlKTtcbiAgICBpZiAoc2VsZi5zZWxlY3RlZEl0ZW0gIT0gbnVsbCkge1xuICAgICAgc2VsZi53cml0ZVZhbHVlKGUpO1xuICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gc2VsZi5zZWxlY3RlZEl0ZW1bc2VsZi5jYW1wb0Rpc3BsYXldO1xuICAgICAgaWYgKGUgIT0gbnVsbCkge1xuICAgICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxmLmNoYW5nZSAhPSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5jaGFuZ2Uoc2VsZi5zZWxlY3RlZEl0ZW0sIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BEb3duUGVzcXVpc2EobGVuZ3RoOiBudW1iZXIpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYubGlzdGFQZXNxdWlzYSAhPSBudWxsICYmIHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoID09IC0xKSB7XG4gICAgICAgIGxlbmd0aCA9IHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gbGVuZ3RoID09IDAgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgIC8vY29uc29sZS5sb2codGhpcy5zZWxlY3RFbGVtZW50KTtcbiAgICAgIC8vdGhpcy5zZWxlY3RFbGVtZW50Lm9wZW4oKTtcblxuICAgICAgLypcbiAgICAgIC8vbGV0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdEVsZW1lbnQ7XG4gICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0SWQpO1xuICAgICAgY29uc29sZS5sb2coJ2Ryb3BEb3duJywgZWxlbWVudCk7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpLnNpemUgPSBsZW5ndGggKyAxO1xuICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSB0cnVlO1xuICAgICAgfVxuICAgICAgKi9cbiAgICB9XG4gIH1cblxuICBwZXNxdWlzYXJFbnRpZGFkZShmaWx0cm86IHN0cmluZykge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybC5yZXBsYWNlKCc8PEZJTFRSTz4+JywgZmlsdHJvKS5yZXBsYWNlKCc8PEVNUFJFU0E+PicsIHRoaXMuZW1wcmVzYS50b1N0cmluZygpKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyRW50aWRhZGUgdXJsJywgdXJsKTtcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcbiAgICB0aGlzLnBlc3F1aXNhU3ViamVjdC5uZXh0KHVybCk7XG4gIH1cblxuICBwZXNxdWlzYXJFbnRpZGFkZU9sZChmaWx0cm86IHN0cmluZykge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybC5yZXBsYWNlKCc8PEZJTFRSTz4+JywgZmlsdHJvKS5yZXBsYWNlKCc8PEVNUFJFU0E+PicsIHRoaXMuZW1wcmVzYS50b1N0cmluZygpKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyRW50aWRhZGUgdXJsJywgdXJsKTtcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcbiAgICB0aGlzLmh0dHBDbGllbnQuZ2V0PGFueT4odXJsKVxuICAgICAgLnN1YnNjcmliZSh7IG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAvL3RoaXMubGlzdGFQZXNxdWlzYSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKHRoaXMuZmlsdGVyRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYSA9IFtdO1xuICAgICAgICByZXN1bHQuZm9yRWFjaCgoZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLmVudCwgSW5kZXg6IGluZGV4LCBTZWxlY3RlZDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICB9fSk7XG4gIH1cblxuICBleGlzdGVOYUxpc3RhKGlkOiBudW1iZXIsIHNldFJlZ2lzdHJvOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5saXN0YVBlc3F1aXNhICYmIHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgZXhpc3RlID0gdGhpcy5saXN0YVBlc3F1aXNhLmZpbmQobCA9PiBsW3RoaXMuY2FtcG9JZF0gPT09IGlkKTtcbiAgICAgIGlmIChleGlzdGUpIHtcbiAgICAgICAgaWYgKHNldFJlZ2lzdHJvKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBleGlzdGU7XG4gICAgICAgICAgdGhpcy5zZWxlY2lvbmFyQ29tYm9DbGljayh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBleGlzdGVOYUxpc3RhVGV4dG8odGV4dG86IHN0cmluZywgc2V0UmVnaXN0cm86IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnNvbGUubG9nKFwiZXhpc3RlIHRleHRvOlwiLCB0ZXh0bywgdGhpcy5jYW1wb0Rpc3BsYXksIHRoaXMubGlzdGFQZXNxdWlzYSk7XG4gICAgaWYgKHRoaXMubGlzdGFQZXNxdWlzYSAmJiB0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGV4aXN0ZSA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKGwgPT4gbFt0aGlzLmNhbXBvRGlzcGxheV0udG9VcHBlckNhc2UoKSA9PT0gdGV4dG8udG9VcHBlckNhc2UoKSk7XG4gICAgICBpZiAoZXhpc3RlKSB7XG4gICAgICAgIGlmIChzZXRSZWdpc3Rybykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZXhpc3RlO1xuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhckl0ZW1TZWxlY2lvbmFkbyhzZXRhclJlZ2lzdHJvOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBjb25zb2xlLmxvZygndmFsaWRhciBzZWxlY2lvbmFkbycpO1xuICAgIC8vcGFzc2FyIHBlbGEgZnVuw6fDo28gZGUgZmlsdHJvXG4gICAgbGV0IHZhbGlkbyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgbGV0IGV4aXN0ZSA9IFt7IC4uLnRoaXMuc2VsZWN0ZWRJdGVtIH1dLmZpbHRlcih0aGlzLmZpbHRlckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKGV4aXN0ZSAhPSBudWxsICYmIGV4aXN0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFsaWRvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRvID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZG8gJiYgc2V0YXJSZWdpc3Rybykge1xuICAgICAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKHRoaXMuc2VsZWN0ZWRJdGVtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkbztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoaWQ6IG51bWJlcikge1xuICAgIGxldCB1cmwgPSB0aGlzLnVybEl0ZW0ucmVwbGFjZSgnPDxJRD4+JywgaWQudG9TdHJpbmcoKSk7XG4gICAgY29uc29sZS5sb2codGhpcy51cmxJdGVtKTtcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyIElEIHVybCcsIHVybCk7XG4gICAgdGhpcy5wb2RlUGVzcXVpc2FyID0gZmFsc2U7XG4gICAgdGhpcy5odHRwQ2xpZW50LmdldDxhbnk+KHVybClcbiAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5saXN0YVBlc3F1aXNhID0gW107XG4gICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYS5wdXNoKHsgLi4ucmVzdWx0LCBJbmRleDogMCwgU2VsZWN0ZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5saXN0YVBlc3F1aXNhWzBdO1xuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9LCBlcnJvcjogIGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgICB9fSk7XG4gIH1cblxuICBsaW1wYXJDbGljaygpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XG4gICAgdGhpcy53cml0ZVBlc3F1aXNhKG51bGwpO1xuICAgIHRoaXMubGlzdGFQZXNxdWlzYSA9IFtdO1xuICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSgwKTtcbiAgICAvL3RoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XG4gICAgdGhpcy5wZXNxdWlzYVN1YmplY3QubmV4dCgnJyk7XG4gICAgaWYgKHRoaXMubGltcGFyKSB7XG4gICAgICB0aGlzLmxpbXBhcigpO1xuICAgIH1cbiAgfVxuXG4gIHZlcmlmaWNhclBlc3F1aXNhKCkge1xuICAgIC8vVE9ETzogdmVyaWZpY2FyIHNlIG8gdGV4dG8gY29ycmVzcG9uZGUgY29tIHVtIGl0ZW0gZGEgbGlzdGFcbiAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKG51bGwpO1xuICB9XG5cbiAgYXN5bmMgcGVzcXVpc2FyQ2xpY2soKSB7XG4gICAgLypcbiAgICBpZiAodGhpcy5wZXNxdWlzYUFjdGlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLnBlc3F1aXNhQWN0aW9uKCk7XG4gICAgfVxuICAgICovXG4gICAgLy9wZXNxdWlzYUNhdGVnb3JpYVxuICAgIGNvbnNvbGUubG9nKHRoaXMuZmlsdGVyRnVuY3Rpb24sIHRoaXMudXJsLCB0aGlzLnVybFRyZWUpO1xuXG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBNb2RlbFRyZWV2aWV3Q29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgLy9jYW1wb0lkOiB0aGlzLmNhbXBvSWQsXG4gICAgICAgIC8vY2FtcG9QYWk6IHRoaXMuY2FtcG9QYWlJZCxcbiAgICAgICAgLy9jYW1wb0xhYmVsOiB0aGlzLmNhbXBvRGlzcGxheSxcbiAgICAgICAgZmlsdGVyRnVuY3Rpb246IHRoaXMuZmlsdGVyRnVuY3Rpb24sXG4gICAgICAgIGVtcHJlc2FTZWxlY2lvbmFkYUlkOiB0aGlzLmVtcHJlc2EsXG4gICAgICAgIHRpcG86IHRoaXMudGlwbyxcbiAgICAgICAgLy9lc3BlY2lmaWNvXG4gICAgICAgIC8vcGxhbm9Db250YXM6IHRoaXMucGxhbm9Db250YXMsXG4gICAgICAgIHVybDogdGhpcy5pc0VtcHR5KHRoaXMudXJsVHJlZSkgPyB0aGlzLnVybCA6IHRoaXMudXJsVHJlZVxuICAgICAgfSxcbiAgICAgIGNzc0NsYXNzOiAnbXktY3VzdG9tLW1vZGFsLXBlc3F1aXNhJ1xuICAgIH0pO1xuXG4gICAgbW9kYWwub25EaWREaXNtaXNzKCkudGhlbihkYXRhID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSBkYXRhWydkYXRhJ107XG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5JZCA+IDApIHtcbiAgICAgICAgdGhpcy5jYXJyZWdhSXRlbUlkUGFyYUxpc3RhKHJlc3VsdC5JZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kYWwucHJlc2VudCgpO1xuXG4gIH1cblxuICBpc0VtcHR5KHZhbG9yOiBzdHJpbmcgfCBhbnkpIHtcbiAgICByZXR1cm4gdmFsb3IgPT0gbnVsbCB8fCB2YWxvciA9PSB1bmRlZmluZWQgfHwgdmFsb3IgPT0gJydcbiAgfVxufVxuIiwiPGRpdiBzdHlsZT1cInBhZGRpbmctaW5saW5lLWVuZDogMHB4O1wiPlxuICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBzdHlsZT1cIi0tYmFja2dyb3VuZDogaW5oZXJpdGVkOyAtLWJhY2tncm91bmQtZm9jdXNlZDogdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IDJweDtcIiBbY2xhc3NdPVwiaXRlbUNsYXNzXCI+XG4gICAgICA8aW9uLWxhYmVsIHBvc2l0aW9uPVwie3sgbGFiZWxQb3NpdGlvbiB9fVwiIGNvbG9yPVwie3sgbGFiZWxDb2xvciB9fVwiPnt7IGxhYmVsIH19PC9pb24tbGFiZWw+XG4gICAgICA8IS0tIGZvcm1Db250cm9sTmFtZT1cInt7IGNhbXBvIH19XCIgIC0tPlxuICAgICAgPGlvbi1zcGlubmVyICpuZ0lmPVwiIXBvZGVQZXNxdWlzYXJcIlxuICAgICAgICBzdHlsZT1cIi0tbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1pbmxpbmUtZW5kOiA1cHggIWltcG9ydGFudDsgbWFyZ2luLXRvcDogMTZweDtcIiBcbiAgICAgICAgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImxpbmVzXCI+PC9pb24tc3Bpbm5lcj5cbiAgICAgIDwhLS0gKGlvbkJsdXIpPVwidmVyaWZpY2FyUGVzcXVpc2EoKVwiIC0tPlxuICAgICAgPCEtLSBjb25mbGl0byBjb20gY2xpY2sgZGEgbGlzdGEgLS0+XG4gICAgICA8aW9uLWlucHV0ICNpbnB1dFBlc3F1aXNhXG4gICAgICAgIHR5cGU9XCJ7e3R5cGV9fVwiIFxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBcbiAgICAgICAgbWF4bGVuZ3RoPVwie3sgbWF4IH19XCIgXG4gICAgICAgIChpb25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICAgW3ZhbHVlXT1cInRleHRvUGVzcXVpc2FcIiAoaW5wdXQpPVwid3JpdGVQZXNxdWlzYShpbnB1dFBlc3F1aXNhLnZhbHVlKVwiIFxuICAgICAgICAoa2V5dXApPVwic2hvd1Blc3F1aXNhKCRldmVudClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBzdHlsZT1cIi0tYmFja2dyb3VuZDp7eyBpbnB1dEJhY2tncm91bmdDb2xvciB9fTtcIlxuICAgICAgICAoY2xpY2spPVwiZHJvcERvd25QZXNxdWlzYSgtMSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIiBkZWJvdW5jZT1cIjUwMFwiPjwvaW9uLWlucHV0PlxuICAgICAgPGlvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgc2xvdD1cImVuZFwiIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDI1cHg7IG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDRweCAhaW1wb3J0YW50OyAtLXBhZGRpbmctc3RhcnQ6MnB4OyAtLXBhZGRpbmctZW5kOiAycHg7XCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJtZWRpdW1cIlxuICAgICAgICAoY2xpY2spPVwibGltcGFyQ2xpY2soKVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlLW91dGxpbmVcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICBcbiAgICAgIDwhLS1cbiAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIHNsb3Q9XCJlbmRcIiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNXB4OyBtYXJnaW4taW5saW5lLXN0YXJ0OiA0cHggIWltcG9ydGFudDsgLS1wYWRkaW5nLXN0YXJ0OjJweDsgLS1wYWRkaW5nLWVuZDogMnB4O1wiIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwibWVkaXVtXCJcbiAgICAgICAgKGNsaWNrKT1cInBlc3F1aXNhckNsaWNrKClcIj5cbiAgICAgICAgPGlvbi1pY29uIGNvbG9yPVwicHJpbWFyeVwiIG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgLS0+XG4gICAgICBcbiAgICA8L2lvbi1pdGVtPlxuICBcbiAgICA8aW9uLWxpc3QgdGFiaW5kZXg9XCItMVwiIFtoaWRkZW5dPVwiIXNlbGVjdEVsZW1lbnRWaXNpdmVsIHx8ICFsaXN0YVBlc3F1aXNhIHx8IGxpc3RhUGVzcXVpc2EubGVuZ3RoID09IDBcIiBjbGFzcz1cInBlc3F1aXNhLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgXG4gICAgICA8aW9uLWl0ZW0gdGFiaW5kZXg9XCItMVwiIGJ1dHRvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0YVBlc3F1aXNhXCIgXG4gICAgICAoY2xpY2spPVwic2VsZWNpb25hckNvbWJvQ2xpY2soaXRlbSlcIiBbaWRdPVwic2VsZWN0SWQgKyAnSW9uSXRlbScgKyBpdGVtWydJbmRleCddXCJcbiAgICAgICAgY2xhc3M9XCJwZXNxdWlzYS1pdGVtXCI+XG4gICAgICAgIDwhLS0ge3sgaXRlbSB8IGpzb259fSAtLT5cbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cInsnc2VsZWN0ZWQtaXRlbSc6IGl0ZW1bJ1NlbGVjdGVkJ10gPT09IHRydWV9XCIgW2lubmVySFRNTF09XCJoaWdobGlnaHQoaXRlbVtjYW1wb0Rpc3BsYXldKVwiPjwvc3Bhbj5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gIFxuICAgIDwvaW9uLWxpc3Q+XG4gIFxuICAgIDwhLS1cbiAgICA8aW9uLXNlbGVjdCBpbnRlcmZhY2U9XCJwb3BvdmVyXCIgI3NlbGVjdEVsZW1lbnQgdGFiaW5kZXg9XCItMVwiIFtoaWRkZW5dPVwiIXNlbGVjdEVsZW1lbnRWaXNpdmVsXCJcbiAgICAgIChpb25DaGFuZ2UpPVwic2VsZWNpb25hckNvbWJvQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICA8aW9uLXNlbGVjdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGlzdGFQZXNxdWlzYVwiIFt2YWx1ZV09XCJpdGVtW2NhbXBvSWRdXCIgKGNsaWNrKT1cInNlbGVjaW9uYXJDb21ib0NsaWNrKGl0ZW1bY2FtcG9JZF0pXCI+XG4gICAgICAgIHt7IGl0ZW1bY2FtcG9EaXNwbGF5XSB9fVxuICAgICAgPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICA8L2lvbi1zZWxlY3Q+XG4gICAgLS0+XG4gIFxuICAgIDwhLS1cbiAgICA8c2VsZWN0IFtpZF09XCJzZWxlY3RJZFwiICNzZWxlY3RFbGVtZW50IHRhYmluZGV4PVwiLTFcIiBbaGlkZGVuXT1cIiFzZWxlY3RFbGVtZW50VmlzaXZlbFwiXG4gICAgICAoY2hhbmdlKT1cInNlbGVjaW9uYXJDb21ib0NoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIGNsYXNzPVwicGVzcXVpc2Etc2VsZWN0XCI+XG4gICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3RhUGVzcXVpc2FcIiBbdmFsdWVdPVwiaXRlbVtjYW1wb0lkXVwiIChjbGljayk9XCJzZWxlY2lvbmFyQ29tYm9DbGljayhpdGVtW2NhbXBvSWRdKVwiPlxuICAgICAgICB7eyBpdGVtW2NhbXBvRGlzcGxheV0gfX1cbiAgICAgIDwvb3B0aW9uPlxuICBcbiAgICA8L3NlbGVjdD5cbiAgICAtLT5cbiAgXG4gICAgPGRpdiBjbGFzcz1cInZhbGlkYXRpb24tZXJyb3JzXCIgKm5nSWY9XCJmb3JtXCI+XG4gIFxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvbiBvZiB2YWxpZGF0aW9uX21lc3NhZ2VzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCJcbiAgICAgICAgICAqbmdJZj1cImZvcm0uZ2V0KGZvcm1Db250cm9sTmFtZSk/Lmhhc0Vycm9yKHZhbGlkYXRpb24udHlwZSkgJiYgKGZvcm0uZ2V0KGZvcm1Db250cm9sTmFtZSk/LmRpcnR5IHx8IGZvcm0uZ2V0KGZvcm1Db250cm9sTmFtZSk/LnRvdWNoZWQpXCI+XG4gICAgICAgICAgJiM4MjI2OyB7eyB2YWxpZGF0aW9uLm1lc3NhZ2UgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgXG4gICAgPC9kaXY+XG4gIDwvZGl2PiJdfQ==