@stiunb/unb-lib-components 18.0.28 → 18.0.30

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 (37) hide show
  1. package/esm2022/lib/services/unb-auth.service.mjs +4 -4
  2. package/esm2022/lib/unb-mensagem/unb-mensagem.component.mjs +4 -4
  3. package/esm2022/lib/unb-mensagem/unb-mensagem.module.mjs +5 -5
  4. package/esm2022/lib/unb-mensagem/unb-mensagem.service.mjs +4 -4
  5. package/esm2022/lib/unb-nav-bar/unb-nav-bar.component.mjs +4 -4
  6. package/esm2022/lib/unb-nav-bar/unb-nav-bar.module.mjs +5 -5
  7. package/esm2022/lib/unb-pessoa/unb-pessoa-crud/unb-pessoa-crud.component.mjs +100 -0
  8. package/esm2022/lib/unb-pessoa/unb-pessoa-crud-modal/unb-pessoa-crud-modal.component.mjs +144 -0
  9. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.mjs +4 -4
  10. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +4 -4
  11. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +24 -7
  12. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +4 -4
  13. package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +54 -178
  14. package/esm2022/lib/unb-pessoa/unb-pessoa-form-dialog/unb-pessoa-form-dialog.component.mjs +60 -0
  15. package/esm2022/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-config.model.mjs +35 -0
  16. package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +32 -191
  17. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +4 -4
  18. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +4 -4
  19. package/esm2022/lib/unb-pessoa/unb-pessoa.module.mjs +61 -11
  20. package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +278 -26
  21. package/esm2022/lib/unb-usuario/oidc-decoded-token.mjs +1 -1
  22. package/esm2022/lib/unb-usuario/oidc-user-data.mjs +1 -1
  23. package/esm2022/lib/unb-usuario/unb-usuario.component.mjs +4 -4
  24. package/esm2022/lib/unb-usuario/unb-usuario.module.mjs +5 -5
  25. package/esm2022/public-api.mjs +6 -2
  26. package/fesm2022/stiunb-unb-lib-components.mjs +1102 -767
  27. package/fesm2022/stiunb-unb-lib-components.mjs.map +1 -1
  28. package/lib/unb-pessoa/unb-pessoa-crud/unb-pessoa-crud.component.d.ts +33 -0
  29. package/lib/unb-pessoa/unb-pessoa-crud-modal/unb-pessoa-crud-modal.component.d.ts +39 -0
  30. package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +13 -29
  31. package/lib/unb-pessoa/unb-pessoa-form-dialog/unb-pessoa-form-dialog.component.d.ts +21 -0
  32. package/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-config.model.d.ts +26 -0
  33. package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +3 -23
  34. package/lib/unb-pessoa/unb-pessoa.module.d.ts +51 -32
  35. package/lib/unb-pessoa/unb-pessoa.service.d.ts +23 -3
  36. package/package.json +1 -1
  37. package/public-api.d.ts +5 -1
@@ -1,7 +1,9 @@
1
1
  import { HttpHeaders, HttpParams } from '@angular/common/http';
2
2
  import { Injectable } from '@angular/core';
3
3
  import { BehaviorSubject, catchError, map, of, throwError } from 'rxjs';
4
+ import { UnbPessoaModel } from './unb-pessoa-models/unb-pessoa.model';
4
5
  import { UnbTipoPessoaEnum } from './unb-tipo-pessoa.enum';
6
+ import { UnbUtils } from '../utils/unb-utils';
5
7
  import * as i0 from "@angular/core";
6
8
  import * as i1 from "@angular/common/http";
7
9
  export class UnBPessoaService {
@@ -11,6 +13,12 @@ export class UnBPessoaService {
11
13
  this.backendUrlSubject = new BehaviorSubject('');
12
14
  // Exposta como Observable (caso algum componente queira se inscrever)
13
15
  this.backendUrl$ = this.backendUrlSubject.asObservable();
16
+ // pra facilitar o debug, pode já passar o token. Mas isso nao pode estar na producao pq vai expor o token pro usuario no front
17
+ this.token = '';
18
+ // Cache das listas de tipos (para normalização de endereço, telefone, email)
19
+ this.tipoEnderecoCache = null;
20
+ this.tipoTelefoneCache = null;
21
+ this.tipoEmailCache = null;
14
22
  // -------------------------------------------------------------------
15
23
  // HANDLE ERROR PADRONIZADO
16
24
  // -------------------------------------------------------------------
@@ -88,43 +96,50 @@ export class UnBPessoaService {
88
96
  // Setter agora recebe string direta
89
97
  setBackendUrl(url) {
90
98
  // Tratamento remove barra no final para padronizar
91
- if (url.endsWith('/')) {
99
+ if (url && url.endsWith('/')) {
92
100
  url = url.slice(0, -1);
93
101
  }
94
102
  this.backendUrlSubject.next(url);
95
103
  }
104
+ setToken(token) {
105
+ this.token = token;
106
+ }
96
107
  // Getter retorna string direta
97
108
  getBackendUrl() {
98
109
  return this.backendUrlSubject.getValue();
99
110
  }
100
- // Headers padrão
111
+ // Headers padrão com Content-Type e Authorization (se token existir)
101
112
  getHeaders() {
102
- return {
103
- headers: new HttpHeaders({
104
- 'Content-Type': 'application/json'
105
- })
106
- };
113
+ let headers = new HttpHeaders({
114
+ 'Content-Type': 'application/json'
115
+ });
116
+ // Se o token estiver preenchido (cenário de debug/dev), adiciona o Authorization
117
+ if (this.token) {
118
+ headers = headers.set('Authorization', `Bearer ${this.token}`);
119
+ }
120
+ // Retorna o objeto no formato esperado pelo HttpClient { headers: ... }
121
+ return { headers };
107
122
  }
108
123
  // Métodos de busca
109
124
  findByCpf(cpf) {
110
125
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?cpf=${cpf}`;
111
- return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
126
+ return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.FISICA)), catchError(this.handleError));
112
127
  }
113
128
  findByCnpj(cnpj) {
114
129
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?cnpj=${cnpj}`;
115
- return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
130
+ return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.JURIDICA)), catchError(this.handleError));
116
131
  }
117
132
  findByPassaporte(passaporte) {
118
133
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?passaporte=${passaporte}`;
119
- return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
134
+ return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.ESTRANGEIRA)), catchError(this.handleError));
120
135
  }
121
136
  findPessoaFisicaByCodigoPessoa(id) {
122
137
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?codigoPessoa=${id}`;
123
- return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
138
+ return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.FISICA)), catchError(this.handleError));
124
139
  }
125
140
  findPessoaJuridicaByCodigoPessoa(id) {
126
141
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?codigoPessoa=${id}`;
127
- return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
142
+ return this.http.get(url, this.getHeaders()).pipe(map(res => this.normalizePessoa(res, UnbTipoPessoaEnum.JURIDICA)), catchError(this.handleError));
128
143
  }
129
144
  findPessoaFisica(filtro, page, size, sort) {
130
145
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas`;
@@ -151,7 +166,7 @@ export class UnBPessoaService {
151
166
  ...this.getHeaders() // Tenta espalhar as propriedades se getHeaders retornar { headers: ... }
152
167
  };
153
168
  return this.http.get(url, options)
154
- .pipe(catchError(this.handleError));
169
+ .pipe(map(arr => arr.map(item => this.normalizePessoa(item, UnbTipoPessoaEnum.FISICA))), catchError(this.handleError));
155
170
  }
156
171
  findPessoaJuridica(filtro, page, size, sort) {
157
172
  const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas`;
@@ -182,7 +197,7 @@ export class UnBPessoaService {
182
197
  ...this.getHeaders() // Tenta espalhar as propriedades se getHeaders retornar { headers: ... }
183
198
  };
184
199
  return this.http.get(url, options)
185
- .pipe(catchError(this.handleError));
200
+ .pipe(map(arr => arr.map(item => this.normalizePessoa(item, UnbTipoPessoaEnum.JURIDICA))), catchError(this.handleError));
186
201
  }
187
202
  pesquisarCep(cep) {
188
203
  const url = `${this.getBackendUrl()}/pessoa-api/public/busca-cep/servico-1/${cep}`;
@@ -216,6 +231,18 @@ export class UnBPessoaService {
216
231
  }
217
232
  return of(null);
218
233
  }
234
+ // Salvar recebendo diretamente o Model e convertendo internamente para o payload do backend
235
+ salvarPessoa(pessoa) {
236
+ if (!pessoa) {
237
+ return throwError(() => ({
238
+ status: 400,
239
+ mensagemSimples: 'Erro interno: Pessoa inválida (null).',
240
+ mensagemHtml: '<strong>Erro interno:</strong> Objeto pessoa vazio.'
241
+ }));
242
+ }
243
+ const payload = this.convertPessoaToPayload(pessoa);
244
+ return this.salvar(payload, pessoa.tipoPessoa);
245
+ }
219
246
  // Salvar Pessoa Física
220
247
  savePessoaFisica(pessoa) {
221
248
  const url = this.getBackendUrl();
@@ -279,23 +306,32 @@ export class UnBPessoaService {
279
306
  denominacao: this.formatarLabel(item) // formata se quiser
280
307
  }))), catchError(this.handleError));
281
308
  }
282
- getTipoEmail() {
283
- return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
284
- codigo: index, // gera um código numérico sequencial
285
- denominacao: this.formatarLabel(item) // formata se quiser
286
- }))), catchError(this.handleError));
287
- }
288
309
  getTipoEndereco() {
289
310
  return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-endereco/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
290
311
  codigo: index, // gera um código numérico sequencial
291
312
  denominacao: this.formatarLabel(item) // formata se quiser
292
- }))), catchError(this.handleError));
313
+ }))), map(lista => {
314
+ this.tipoEnderecoCache = lista;
315
+ return lista;
316
+ }), catchError(this.handleError));
293
317
  }
294
318
  getTipoTelefone() {
295
319
  return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-telefone/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
296
320
  codigo: index, // gera um código numérico sequencial
297
321
  denominacao: this.formatarLabel(item) // formata se quiser
298
- }))), catchError(this.handleError));
322
+ }))), map(lista => {
323
+ this.tipoTelefoneCache = lista;
324
+ return lista;
325
+ }), catchError(this.handleError));
326
+ }
327
+ getTipoEmail() {
328
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
329
+ codigo: index, // gera um código numérico sequencial
330
+ denominacao: this.formatarLabel(item) // formata se quiser
331
+ }))), map(lista => {
332
+ this.tipoEmailCache = lista;
333
+ return lista;
334
+ }), catchError(this.handleError));
299
335
  }
300
336
  formatarLabel(text) {
301
337
  return text
@@ -303,13 +339,229 @@ export class UnBPessoaService {
303
339
  .replace(/_/g, ' ')
304
340
  .replace(/\b\w/g, l => l.toUpperCase());
305
341
  }
306
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UnBPessoaService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
307
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UnBPessoaService, providedIn: 'root' }); }
342
+ /**
343
+ * Normaliza o payload retornado pelo backend para `UnbPessoaModel` pronto para UI.
344
+ */
345
+ normalizePessoa(resultado, tipoForcado) {
346
+ const pessoa = (resultado || new UnbPessoaModel());
347
+ // Define tipoPessoa quando o endpoint não retorna
348
+ if (tipoForcado != null) {
349
+ pessoa.tipoPessoa = tipoForcado;
350
+ }
351
+ // Garante arrays
352
+ pessoa.enderecos = pessoa.enderecos || [];
353
+ pessoa.telefones = pessoa.telefones || [];
354
+ pessoa.emails = pessoa.emails || [];
355
+ // Sexo -> codigoSexo
356
+ if (pessoa.sexo) {
357
+ const sexo = pessoa.sexo.toUpperCase().trim();
358
+ if (sexo === 'FEMININO')
359
+ pessoa.codigoSexo = 2;
360
+ else if (sexo === 'MASCULINO')
361
+ pessoa.codigoSexo = 1;
362
+ }
363
+ // Datas para Date
364
+ pessoa.dataNascimento = this.parseData(pessoa.dataNascimento);
365
+ // Demais datas permanecem como string para compatibilidade com o model
366
+ // Campos com 'codigo - label' -> codigo
367
+ pessoa.codigoEstadoCivil = this.parseCodigo(pessoa.estadoCivil);
368
+ pessoa.codigoPaisNascimento = this.parseCodigo(pessoa.paisNascimento);
369
+ pessoa.escolaridade = this.parseCodigo(pessoa.escolaridade);
370
+ // Endereços: ordem/uf
371
+ pessoa.enderecos.forEach((end, i) => {
372
+ end.ordemEndereco = end.ordemEndereco || end.ordem || (i + 1);
373
+ if (!end.ufEndereco && end.uf)
374
+ end.ufEndereco = end.uf;
375
+ // Mapeia tipo string para tipoEnderecoCodigo usando o cache
376
+ if (!end.tipoEnderecoCodigo && end.tipo && this.tipoEnderecoCache) {
377
+ const tipoEncontrado = this.tipoEnderecoCache.find(t => t.denominacao?.toLowerCase() === String(end.tipo).toLowerCase());
378
+ if (tipoEncontrado)
379
+ end.tipoEnderecoCodigo = tipoEncontrado.codigo;
380
+ }
381
+ // Traduz 'pais' (string '22 - BRASIL') para 'paisEnderecoCodigo' (number)
382
+ if (!end.paisEnderecoCodigo && end.pais) {
383
+ end.paisEnderecoCodigo = this.parseCodigo(end.pais);
384
+ }
385
+ });
386
+ // Telefones: ordem e tipo
387
+ pessoa.telefones.forEach((tel, i) => {
388
+ tel.ordem = tel.ordem || (i + 1);
389
+ // Mapeia tipo string para tipoTelefoneCodigo usando o cache
390
+ if (!tel.tipoTelefoneCodigo && tel.tipo && this.tipoTelefoneCache) {
391
+ const tipoEncontrado = this.tipoTelefoneCache.find(t => t.denominacao?.toLowerCase() === String(tel.tipo).toLowerCase());
392
+ if (tipoEncontrado)
393
+ tel.tipoTelefoneCodigo = tipoEncontrado.codigo;
394
+ }
395
+ });
396
+ // Emails: ordem e tipo
397
+ pessoa.emails.forEach((email, i) => {
398
+ email.ordem = email.ordem || (i + 1);
399
+ // Mapeia tipo string para tipoEmailCodigo usando o cache
400
+ if (!email.tipoEmailCodigo && email.tipo && this.tipoEmailCache) {
401
+ const tipoEncontrado = this.tipoEmailCache.find(t => t.denominacao?.toLowerCase() === String(email.tipo).toLowerCase());
402
+ if (tipoEncontrado)
403
+ email.tipoEmailCodigo = tipoEncontrado.codigo;
404
+ }
405
+ });
406
+ // Formata documento para UI
407
+ if (pessoa.tipoPessoa === UnbTipoPessoaEnum.FISICA && pessoa.cpf) {
408
+ const digits = String(pessoa.cpf).replace(/\D/g, '');
409
+ pessoa.cpf = UnbUtils.formataCpf(digits);
410
+ }
411
+ else if (pessoa.tipoPessoa === UnbTipoPessoaEnum.JURIDICA && pessoa.cnpj) {
412
+ const digits = String(pessoa.cnpj).replace(/\D/g, '');
413
+ pessoa.cnpj = UnbUtils.formataCnpj(digits);
414
+ }
415
+ return pessoa;
416
+ }
417
+ parseCodigo(valor) {
418
+ if (valor == null)
419
+ return null;
420
+ if (typeof valor === 'number')
421
+ return valor;
422
+ if (typeof valor !== 'string')
423
+ return null;
424
+ const sepIndex = valor.indexOf(' - ');
425
+ if (sepIndex === -1) {
426
+ const num = parseInt(valor, 10);
427
+ return isNaN(num) ? null : num;
428
+ }
429
+ const codigo = parseInt(valor.substring(0, sepIndex).trim(), 10);
430
+ return isNaN(codigo) ? null : codigo;
431
+ }
432
+ parseData(dataString) {
433
+ if (!dataString)
434
+ return null;
435
+ if (dataString instanceof Date)
436
+ return dataString;
437
+ if (typeof dataString !== 'string' || !dataString.includes('/'))
438
+ return null;
439
+ const partes = dataString.split('/');
440
+ if (partes.length !== 3)
441
+ return null;
442
+ const dia = parseInt(partes[0], 10);
443
+ const mes = parseInt(partes[1], 10) - 1;
444
+ const ano = parseInt(partes[2], 10);
445
+ const dataObj = new Date(ano, mes, dia);
446
+ if (dataObj.getFullYear() === ano && dataObj.getMonth() === mes && dataObj.getDate() === dia) {
447
+ return dataObj;
448
+ }
449
+ return null;
450
+ }
451
+ /**
452
+ * Converte uma instância (ou objeto) de UnbPessoaModel para o payload esperado pelo backend.
453
+ */
454
+ convertPessoaToPayload(pessoa) {
455
+ if (!pessoa)
456
+ return null;
457
+ const enderecosPayload = (pessoa.enderecos || []).map((end) => ({
458
+ ordemEndereco: end.ordemEndereco,
459
+ tipoEnderecoCodigo: end.tipoEnderecoCodigo,
460
+ municipioCodigo: end.municipioCodigo,
461
+ paisEnderecoCodigo: end.paisEnderecoCodigo,
462
+ logradouro: end.logradouro,
463
+ complemento: end.complemento,
464
+ cep: end.cep,
465
+ bairro: end.bairro,
466
+ ufEndereco: end.ufEndereco,
467
+ caixaPostal: end.caixaPostal,
468
+ correspondencia: end.correspondencia
469
+ }));
470
+ const telefonesPayload = (pessoa.telefones || []).map((tel) => ({
471
+ ordemTelefone: tel.ordem,
472
+ tipoTelefoneCodigo: tel.tipoTelefoneCodigo,
473
+ ddi: tel.ddi,
474
+ ddd: tel.ddd,
475
+ numeroTelefone: tel.numero,
476
+ ramal: tel.ramal,
477
+ autorizaSMS: tel.autorizaSMS
478
+ }));
479
+ const emailsPayload = (pessoa.emails || []).map((email) => ({
480
+ tipoEmailCodigo: email.tipoEmailCodigo,
481
+ ordemEmail: email.ordem,
482
+ email: email.email,
483
+ autorizacao: email.autorizacao
484
+ }));
485
+ return {
486
+ idPessoa: pessoa.idPessoa,
487
+ codigoPessoa: pessoa.codigoPessoa,
488
+ nome: pessoa.nome,
489
+ nomeSocial: pessoa.nomeSocial,
490
+ ...(pessoa.cpf && { cpf: pessoa.cpf.replace(/\D/g, '') }),
491
+ codigoSexo: pessoa.codigoSexo,
492
+ codigoEstadoCivil: pessoa.codigoEstadoCivil,
493
+ codigoEscolaridade: pessoa.escolaridade,
494
+ nomePai: pessoa.nomePai,
495
+ nomeMae: pessoa.nomeMae,
496
+ dataNascimento: this.formatarDataParaBackend(pessoa.dataNascimento),
497
+ codigoPaisNascimento: pessoa.codigoPaisNascimento,
498
+ ufNascimento: pessoa.ufNascimento,
499
+ naturalidade: pessoa.naturalidade,
500
+ dataChegadaBrasil: this.formatarDataParaBackend(pessoa.dataChegadaBrasil),
501
+ rg: pessoa.rg,
502
+ rgOrgao: pessoa.rgOrgao,
503
+ rgUf: pessoa.rgUf,
504
+ rgDataEmissao: this.formatarDataParaBackend(pessoa.rgDataEmissao),
505
+ numeroTituloEleitor: pessoa.numeroTituloEleitor,
506
+ dataEmissaoTituloEleitor: this.formatarDataParaBackend(pessoa.dataEmissaoTituloEleitor),
507
+ zonaTituloEleitor: pessoa.zonaTituloEleitor,
508
+ secaoTituloEleitor: pessoa.secaoTituloEleitor,
509
+ ufTituloEleitor: pessoa.ufTituloEleitor,
510
+ numeroReservista: pessoa.numeroReservista,
511
+ serieReservista: pessoa.serieReservista,
512
+ orgaoReservista: pessoa.orgaoReservista,
513
+ numeroCarteiraTrabalho: pessoa.numeroCarteiraTrabalho,
514
+ serieCarteiraTrabalho: pessoa.serieCarteiraTrabalho,
515
+ ufCarteiraTrabalho: pessoa.ufCarteiraTrabalho,
516
+ pisPasep: pessoa.pisPasep,
517
+ numeroHabilitacao: pessoa.numeroHabilitacao,
518
+ registroHabilitacao: pessoa.registroHabilitacao,
519
+ dataEmissaoHabilitacao: this.formatarDataParaBackend(pessoa.dataEmissaoHabilitacao),
520
+ dataValidadeHabilitacao: this.formatarDataParaBackend(pessoa.dataValidadeHabilitacao),
521
+ categoriaHabilitacao: pessoa.categoriaHabilitacao,
522
+ deficienciaFisicaHabilitacao: pessoa.deficienciaFisicaHabilitacao,
523
+ primeiraHabilitacao: this.formatarDataParaBackend(pessoa.primeiraHabilitacao),
524
+ passaporte: pessoa.passaporte,
525
+ codigoPaisPassaporte: pessoa.codigoPaisPassaporte,
526
+ ...(pessoa.cnpj && { cnpj: pessoa.cnpj.replace(/\D/g, '') }),
527
+ razaoSocial: pessoa.razaoSocial,
528
+ nomeFantasia: pessoa.nomeFantasia,
529
+ sigla: pessoa.sigla,
530
+ paginaWeb: pessoa.paginaWeb,
531
+ autoCadastro: pessoa.autoCadastro,
532
+ enderecos: enderecosPayload,
533
+ telefones: telefonesPayload,
534
+ emails: emailsPayload
535
+ };
536
+ }
537
+ /**
538
+ * Formata a data no padrão DD/MM/YYYY para o backend.
539
+ */
540
+ formatarDataParaBackend(data) {
541
+ if (!data)
542
+ return null;
543
+ if (typeof data === 'string' && data.includes('/'))
544
+ return data;
545
+ try {
546
+ const d = new Date(data);
547
+ if (isNaN(d.getTime()))
548
+ return null;
549
+ const dia = String(d.getDate()).padStart(2, '0');
550
+ const mes = String(d.getMonth() + 1).padStart(2, '0');
551
+ const ano = d.getFullYear();
552
+ return `${dia}/${mes}/${ano}`;
553
+ }
554
+ catch {
555
+ return null;
556
+ }
557
+ }
558
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
559
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, providedIn: 'root' }); }
308
560
  }
309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UnBPessoaService, decorators: [{
561
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, decorators: [{
310
562
  type: Injectable,
311
563
  args: [{
312
564
  providedIn: 'root'
313
565
  }]
314
566
  }], ctorParameters: () => [{ type: i1.HttpClient }] });
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFZM0QsTUFBTSxPQUFPLGdCQUFnQjtJQU8zQixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBTHBDLHFEQUFxRDtRQUM3QyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RCxzRUFBc0U7UUFDdEUsZ0JBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7UUEyU3BELHNFQUFzRTtRQUN0RSw0QkFBNEI7UUFDNUIsc0VBQXNFO1FBQzlELGdCQUFXLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNuQyxJQUFJLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztZQUNuRSxJQUFJLFlBQVksR0FBRyxnREFBZ0QsQ0FBQztZQUVwRSxxQ0FBcUM7WUFDckMsSUFBSSxTQUFjLENBQUM7WUFFbkIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekMsK0RBQStEO2dCQUMvRCxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixt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TTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW5kZXJlY28gfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc2NvbGFyaWRhZGUgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXNjb2xhcmlkYWRlLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRXN0YWRvQ2l2aWwgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXN0YWRvLWNpdmlsLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hTXVuaW5jaXBpbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1tdW5pY2lwaW8nO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FQYWlzIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXBhaXMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNb2RlbCB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlRpcG9QZXNzb2FFbnVtIH0gZnJvbSAnLi91bmItdGlwby1wZXNzb2EuZW51bSc7XHJcblxyXG4vLyBJbnRlcmZhY2UgcGFyYSBwYWRyb25pemFyIG8gZXJybyBxdWUgY2hlZ2Egbm9zIGNvbXBvbmVudGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgVW5iUGVzc29hRXJyb1BhZHJhbyB7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbiAgbWVuc2FnZW1TaW1wbGVzOiBzdHJpbmc7IC8vIFBhcmEgdXNhciBubyBTbmFja0JhclxyXG4gIG1lbnNhZ2VtSHRtbDogc3RyaW5nOyAgICAvLyBQYXJhIHVzYXIgbm8gQWxlcnRTZXJ2aWNlIChjb20gPHVsPiwgPGxpPiwgPHN0cm9uZz4pXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuQlBlc3NvYVNlcnZpY2Uge1xyXG5cclxuICAvLyBBcm1hemVuYSBhcGVuYXMgYSBzdHJpbmcgZGEgVVJMLiBJbmljaWFsaXphIHZhemlvLlxyXG4gIHByaXZhdGUgYmFja2VuZFVybFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG4gIC8vIEV4cG9zdGEgY29tbyBPYnNlcnZhYmxlIChjYXNvIGFsZ3VtIGNvbXBvbmVudGUgcXVlaXJhIHNlIGluc2NyZXZlcilcclxuICBiYWNrZW5kVXJsJCA9IHRoaXMuYmFja2VuZFVybFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XHJcblxyXG4gIC8vIFNldHRlciBhZ29yYSByZWNlYmUgc3RyaW5nIGRpcmV0YVxyXG4gIHNldEJhY2tlbmRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIC8vIFRyYXRhbWVudG8gcmVtb3ZlIGJhcnJhIG5vIGZpbmFsIHBhcmEgcGFkcm9uaXphclxyXG4gICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCAtMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhY2tlbmRVcmxTdWJqZWN0Lm5leHQodXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciByZXRvcm5hIHN0cmluZyBkaXJldGFcclxuICBnZXRCYWNrZW5kVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kVXJsU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVhZGVycyBwYWRyw6NvXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gTcOpdG9kb3MgZGUgYnVzY2FcclxuICBmaW5kQnlDcGYoY3BmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y3BmPSR7Y3BmfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZEJ5UGFzc2Fwb3J0ZShwYXNzYXBvcnRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/cGFzc2Fwb3J0ZT0ke3Bhc3NhcG9ydGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYUJ5Q29kaWdvUGVzc29hKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y29kaWdvUGVzc29hPSR7aWR9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUp1cmlkaWNhQnlDb2RpZ29QZXNzb2EoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzP2NvZGlnb1Blc3NvYT0ke2lkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRQZXNzb2FGaXNpY2EoZmlsdHJvOiBVbmJQZXNzb2FNb2RlbCwgcGFnZT86IG51bWJlciwgc2l6ZT86IG51bWJlciwgc29ydD86IHN0cmluZyk6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWxbXT4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzYDtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGZpbHRybykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbG9yID0gZmlsdHJvW2tleSBhcyBrZXlvZiBVbmJQZXNzb2FNb2RlbF07XHJcbiAgICAgIGlmICh2YWxvciAhPT0gbnVsbCAmJiB2YWxvciAhPT0gdW5kZWZpbmVkICYmIHZhbG9yICE9PSAnJykge1xyXG4gICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoa2V5LCB2YWxvci50b1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gMi4gQWRpY2lvbmEgb3MgcGFyw6JtZXRyb3MgZGUgUGFnaW5hw6fDo28gKHNlIGZvcmFtIHBhc3NhZG9zKVxyXG4gICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3BhZ2UnLCBwYWdlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBzaXplICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3NpemUnLCBzaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNvcnQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnc29ydCcsIHNvcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIE1vbnRhIGFzIG9ww6fDtWVzIGRhIHJlcXVpc2nDp8Ojb1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoKSAvLyBUZW50YSBlc3BhbGhhciBhcyBwcm9wcmllZGFkZXMgc2UgZ2V0SGVhZGVycyByZXRvcm5hciB7IGhlYWRlcnM6IC4uLiB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsW10+KHVybCwgb3B0aW9ucylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUp1cmlkaWNhKGZpbHRybzogVW5iUGVzc29hTW9kZWwsIHBhZ2U/OiBudW1iZXIsIHNpemU/OiBudW1iZXIsIHNvcnQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsW10+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYDtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG5cclxuICAgIC8vIDEuIEFkaWNpb25hIEFQRU5BUyBvcyBmaWx0cm9zIHBlcm1pdGlkb3MgZG8gTW9kZWxcclxuICAgIGNvbnN0IGNhbXBvc1Blcm1pdGlkb3MgPSBbJ2lkUGVzc29hJywgJ2NvZGlnb1Blc3NvYScsICdjbnBqJywgJ25vbWVGYW50YXNpYScsICdyYXphb1NvY2lhbCcsICdzaWdsYSddO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGZpbHRybykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGlmIChjYW1wb3NQZXJtaXRpZG9zLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWxvciA9IGZpbHRyb1trZXkgYXMga2V5b2YgVW5iUGVzc29hTW9kZWxdO1xyXG4gICAgICAgIGlmICh2YWxvciAhPT0gbnVsbCAmJiB2YWxvciAhPT0gdW5kZWZpbmVkICYmIHZhbG9yICE9PSAnJykge1xyXG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChrZXksIHZhbG9yLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gMi4gQWRpY2lvbmEgb3MgcGFyw6JtZXRyb3MgZGUgUGFnaW5hw6fDo28gKHNlIGZvcmFtIHBhc3NhZG9zKVxyXG4gICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3BhZ2UnLCBwYWdlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBzaXplICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3NpemUnLCBzaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNvcnQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnc29ydCcsIHNvcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIE1vbnRhIGFzIG9ww6fDtWVzIGRhIHJlcXVpc2nDp8Ojb1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoKSAvLyBUZW50YSBlc3BhbGhhciBhcyBwcm9wcmllZGFkZXMgc2UgZ2V0SGVhZGVycyByZXRvcm5hciB7IGhlYWRlcnM6IC4uLiB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsW10+KHVybCwgb3B0aW9ucylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcGVzcXVpc2FyQ2VwKGNlcDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvYnVzY2EtY2VwL3NlcnZpY28tMS8ke2NlcH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRW5kZXJlY28+KHVybCwgdGhpcy5nZXRIZWFkZXJzKCkpLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgKGRlY2lkZSBmaXNpY2Egb3UganVyaWRpY2EpXHJcbiAgc2FsdmFyKHBheWxvYWQ6IGFueSwgdGlwb1Blc3NvYTogVW5iVGlwb1Blc3NvYUVudW0pOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsIHwgbnVsbD4ge1xyXG5cclxuICAgIC8vIChQYXJhIG8gY29tcG9uZW50ZSBjb25zZWd1aXIgbGVyIC5tZW5zYWdlbVNpbXBsZXMgZSAubWVuc2FnZW1IdG1sKVxyXG4gICAgaWYgKCFwYXlsb2FkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XHJcbiAgICAgICAgc3RhdHVzOiA0MDAsXHJcbiAgICAgICAgbWVuc2FnZW1TaW1wbGVzOiAnRXJybyBpbnRlcm5vOiBEYWRvcyBwYXJhIHNhbHZhbWVudG8gaW52w6FsaWRvcyAoUGF5bG9hZCBudWxsKS4nLFxyXG4gICAgICAgIG1lbnNhZ2VtSHRtbDogJzxzdHJvbmc+RXJybyBpbnRlcm5vOjwvc3Ryb25nPiBUZW50YXRpdmEgZGUgc2FsdmFyIGRhZG9zIHZhemlvcy4nXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRpcG9QZXNzb2EpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcclxuICAgICAgICBzdGF0dXM6IDQwMCxcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXM6ICdFcnJvIGludGVybm86IFRpcG8gZGUgcGVzc29hIG7Do28gZGVmaW5pZG8uJyxcclxuICAgICAgICBtZW5zYWdlbUh0bWw6ICc8c3Ryb25nPkVycm8gaW50ZXJubzo8L3N0cm9uZz4gTyB0aXBvIGRlIHBlc3NvYSDDqSBvYnJpZ2F0w7NyaW8gcGFyYSBzYWx2YXIuJ1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gRGVsZWdhw6fDo29cclxuICAgIC8vIENvbW8gc2F2ZVBlc3NvYUZpc2ljYSBlIHNhdmVQZXNzb2FKdXJpZGljYSBKw4EgVMOKTSBvIC5waXBlKGNhdGNoRXJyb3IpLFxyXG4gICAgLy8gYXF1aSBuw7NzIGFwZW5hcyByZXRvcm5hbW9zIG8gT2JzZXJ2YWJsZSBkZWxlcy4gTyBlcnJvIHN1Ymlyw6EgdHJhdGFkby5cclxuICAgIGlmICh0aXBvUGVzc29hID09IFVuYlRpcG9QZXNzb2FFbnVtLkZJU0lDQSB8fCB0aXBvUGVzc29hID09IFVuYlRpcG9QZXNzb2FFbnVtLkVTVFJBTkdFSVJBKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhdmVQZXNzb2FGaXNpY2EocGF5bG9hZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRpcG9QZXNzb2EgPT0gVW5iVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2F2ZVBlc3NvYUp1cmlkaWNhKHBheWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZihudWxsKTtcclxuICB9XHJcblxyXG4gIC8vIFNhbHZhciBQZXNzb2EgRsOtc2ljYVxyXG4gIHByaXZhdGUgc2F2ZVBlc3NvYUZpc2ljYShwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRCYWNrZW5kVXJsKCk7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBlc3NvYSk7XHJcblxyXG4gICAgLy8gVmFyacOhdmVsIHBhcmEgYXJtYXplbmFyIG8gT2JzZXJ2YWJsZSBhbnRlcyBkZSByZXRvcm5hclxyXG4gICAgbGV0IHJlcXVlc3QkOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPjtcclxuXHJcbiAgICBpZiAocGVzc29hLmNvZGlnb1Blc3NvYSA9PSBudWxsKSB7XHJcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5odHRwLnBvc3Q8VW5iUGVzc29hTW9kZWw+KGAke3VybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXNgLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wdXQ8VW5iUGVzc29hTW9kZWw+KGAke3VybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXMvJHtwZXNzb2EuY29kaWdvUGVzc29hfWAsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBbnRlcyBkZSByZXRvcm5hciwgcGFzc2Ftb3MgcGVsbyAncGlwZScgcGFyYSB0cmF0YXIgbyBlcnJvIHNlIGVsZSBvY29ycmVyLlxyXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEp1csOtZGljYVxyXG4gIHByaXZhdGUgc2F2ZVBlc3NvYUp1cmlkaWNhKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEJhY2tlbmRVcmwoKTtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGVzc29hKTtcclxuICAgIGxldCByZXF1ZXN0JDogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD47XHJcblxyXG4gICAgaWYgKHBlc3NvYS5jb2RpZ29QZXNzb2EgPT0gbnVsbCkge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wb3N0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXNgLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wdXQ8VW5iUGVzc29hTW9kZWw+KGAke3VybH0vcGVzc29hLWFwaS9wZXNzb2FzL2p1cmlkaWNhcy8ke3Blc3NvYS5jb2RpZ29QZXNzb2F9YCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXF1ZXN0JC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gRGFkb3MgYXV4aWxpYXJlcyBww7pibGljb3NcclxuICBwdWJsaWMgZ2V0RXNjb2xhcmlkYWRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXNjb2xhcmlkYWRlW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3B1YmxpYy9lc2NvbGFyaWRhZGVzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSAvLyA8LS0tIEFkaWNpb25lIGFxdWlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RXN0YWRvQ2l2aWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FFc3RhZG9DaXZpbFtdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXN0YWRvcy1jaXZpcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE11bmljaXBpb3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNdW5pbmNpcGlvW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3B1YmxpYy9tdW5pY2lwaW9zL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSAvLyA8LS0tIEFkaWNpb25lIGFxdWlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFpc2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBjb250ZW50OiBVbmJQZXNzb2FQYWlzW10gfT4oXHJcbiAgICAgIGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3B1YmxpYy9wYWlzZXMvbGlzdGFnZW0/JnBhZ2U9MCZzaXplPTIwMCZzb3J0PWRlbm9taW5hY2FvLGFzY2BcclxuICAgICkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuY29udGVudC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAvLyAuLi4gc3VhIGzDs2dpY2EgZGUgb3JkZW5hw6fDo28gLi4uXHJcbiAgICAgICAgICBjb25zdCBub21lQSA9IGE/LmRlbm9taW5hY2FvPy50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgY29uc3Qgbm9tZUIgPSBiPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuICAgICAgICAgIGlmIChub21lQSA9PT0gJ0JSQVNJTCcpIHJldHVybiAtMTtcclxuICAgICAgICAgIGlmIChub21lQiA9PT0gJ0JSQVNJTCcpIHJldHVybiAxO1xyXG4gICAgICAgICAgcmV0dXJuIG5vbWVBLmxvY2FsZUNvbXBhcmUobm9tZUIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRSYWNhQ29yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3B1YmxpYy9ldG5pYXMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb0VtYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3RpcG9zLWVtYWlsL3B1YmxpYy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIG1hcChsaXN0YSA9PiBsaXN0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgIGNvZGlnbzogaW5kZXgsIC8vIGdlcmEgdW0gY8OzZGlnbyBudW3DqXJpY28gc2VxdWVuY2lhbFxyXG4gICAgICAgIGRlbm9taW5hY2FvOiB0aGlzLmZvcm1hdGFyTGFiZWwoaXRlbSkgLy8gZm9ybWF0YSBzZSBxdWlzZXJcclxuICAgICAgfSkpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvRW5kZXJlY28oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvdGlwb3MtZW5kZXJlY28vcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9UZWxlZm9uZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS90aXBvcy10ZWxlZm9uZS9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGFyTGFiZWwodGV4dDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGV4dFxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXy9nLCAnICcpXHJcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgbCA9PiBsLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBIQU5ETEUgRVJST1IgUEFEUk9OSVpBRE8gXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgbGV0IG1lbnNhZ2VtU2ltcGxlcyA9ICdPY29ycmV1IHVtIGVycm8gYW8gcHJvY2Vzc2FyIGEgcmVxdWlzacOnw6NvISc7XHJcbiAgICBsZXQgbWVuc2FnZW1IdG1sID0gJzxzdHJvbmc+T2NvcnJldSB1bSBlcnJvIGRlc2NvbmhlY2lkby48L3N0cm9uZz4nO1xyXG5cclxuICAgIC8vIDIuIERlc2NvYnJlIHF1ZW0gw6kgbyBjb3JwbyBkbyBlcnJvXHJcbiAgICBsZXQgZXJyb3JCb2R5OiBhbnk7XHJcblxyXG4gICAgaWYgKGVycm9yLmRldGFsaGVzIHx8IGVycm9yLmNvZGlnb1N0YXR1cykge1xyXG4gICAgICAvLyBDQVNPIDE6IE8gSW50ZXJjZXB0b3IgasOhIGRlc2VtYnJ1bGhvdSBvIGVycm8gKMOpIG8gSlNPTiBwdXJvKVxyXG4gICAgICBlcnJvckJvZHkgPSBlcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENBU08gMjogw4kgdW0gSHR0cEVycm9yUmVzcG9uc2UgcGFkcsOjbyAodGVtIGEgcHJvcHJpZWRhZGUgLmVycm9yKVxyXG4gICAgICBlcnJvckJvZHkgPSBlcnJvci5lcnJvciB8fCBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAzLiBMw7NnaWNhIGRlIExpbXBlemEgZSBQYXJzZSAoc2UgZm9yIHN0cmluZyBzdWphKVxyXG4gICAgaWYgKHR5cGVvZiBlcnJvckJvZHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgZXJyb3JCb2R5ID0gSlNPTi5wYXJzZShlcnJvckJvZHkpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBlcnJvckJvZHkuaW5kZXhPZigneycpO1xyXG4gICAgICAgIGNvbnN0IGVuZCA9IGVycm9yQm9keS5sYXN0SW5kZXhPZignfScpO1xyXG4gICAgICAgIGlmIChzdGFydCA+IC0xICYmIGVuZCA+IHN0YXJ0KSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlcnJvckJvZHkgPSBKU09OLnBhcnNlKGVycm9yQm9keS5zdWJzdHJpbmcoc3RhcnQsIGVuZCArIDEpKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUyKSB7XHJcbiAgICAgICAgICAgIC8vIFNlIGZhbGhhciBvIHBhcnNlLCB1c2EgbyB0ZXh0byBjb21vIG1lbnNhZ2VtXHJcbiAgICAgICAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IGVycm9yQm9keS5zdWJzdHJpbmcoMCwgMjAwKTtcclxuICAgICAgICAgICAgbWVuc2FnZW1IdG1sID0gYDxzdHJvbmc+JHtlcnJvckJvZHl9PC9zdHJvbmc+YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGb3JtYXRhw6fDo28gYmFzZWFkYSBubyBKU09OIGlkZW50aWZpY2Fkb1xyXG4gICAgaWYgKGVycm9yQm9keSAmJiB0eXBlb2YgZXJyb3JCb2R5ID09PSAnb2JqZWN0Jykge1xyXG5cclxuICAgICAgLy8gQTogRXJyb3MgZGUgVmFsaWRhw6fDo29cclxuICAgICAgaWYgKGVycm9yQm9keS5kZXRhbGhlcyAmJiBBcnJheS5pc0FycmF5KGVycm9yQm9keS5kZXRhbGhlcykgJiYgZXJyb3JCb2R5LmRldGFsaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIk8gZm9ybXVsw6FyaW8gcG9zc3VpIGVycm9zIGRlIHZhbGlkYcOnw6NvLlwiO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0YUVycm9zID0gZXJyb3JCb2R5LmRldGFsaGVzLm1hcCgoZDogYW55KSA9PlxyXG4gICAgICAgICAgYDxsaT48c3Ryb25nPiR7ZC5ub21lQ2FtcG8gfHwgJ0NhbXBvJ306PC9zdHJvbmc+ICR7ZC5jcml0aWNhIHx8IGQubWVuc2FnZW19PC9saT5gXHJcbiAgICAgICAgKS5qb2luKCcnKTtcclxuXHJcbiAgICAgICAgbWVuc2FnZW1IdG1sID0gYDxzdHJvbmc+RXJyb3MgZGUgVmFsaWRhw6fDo286PC9zdHJvbmc+IDx1bD4ke2xpc3RhRXJyb3N9PC91bD5gO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEI6IEVycm8gR2Vuw6lyaWNvIGNvbSBtZW5zYWdlbVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBtc2dCYWNrZW5kID0gZXJyb3JCb2R5Lm1lbnNhZ2VtIHx8IGVycm9yQm9keS5tZXNzYWdlIHx8IGVycm9yQm9keS5kZXRhaWw7XHJcbiAgICAgICAgaWYgKG1zZ0JhY2tlbmQpIHtcclxuICAgICAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IG1zZ0JhY2tlbmQ7XHJcbiAgICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz4ke21zZ0JhY2tlbmR9PC9zdHJvbmc+YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA1LiBUcmF0YW1lbnRvcyBkZSBTdGF0dXMgSFRUUCAoU2UgbyB3cmFwcGVyIG9yaWdpbmFsIHRpdmVyIHN0YXR1cylcclxuICAgIC8vIE5vdGE6IFNlIG8gaW50ZXJjZXB0b3IgZGVzZW1icnVsaG91LCAnZXJyb3Iuc3RhdHVzJyBwb2RlIG7Do28gZXhpc3RpciwgXHJcbiAgICAvLyBtYXMgJ2Vycm9yQm9keS5jb2RpZ29TdGF0dXMnIChkbyBKYXZhKSBwb2RlIGV4aXN0aXIuXHJcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgZXJyb3JCb2R5Py5jb2RpZ29TdGF0dXMgfHwgMDtcclxuXHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgbWVuc2FnZW1TaW1wbGVzID0gXCJTZXNzw6NvIGV4cGlyYWRhLlwiO1xyXG4gICAgICBtZW5zYWdlbUh0bWwgPSBcIjxzdHJvbmc+U2Vzc8OjbyBleHBpcmFkYS4gRmHDp2EgbG9naW4gbm92YW1lbnRlLjwvc3Ryb25nPlwiO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xyXG4gICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIkFjZXNzbyBOZWdhZG8uXCI7XHJcbiAgICAgIG1lbnNhZ2VtSHRtbCA9IFwiPHN0cm9uZz5Wb2PDqiBuw6NvIHRlbSBwZXJtaXNzw6NvIHBhcmEgcmVhbGl6YXIgZXN0YSBhw6fDo28uPC9zdHJvbmc+XCI7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb0Zvcm1hdGFkbzogVW5iUGVzc29hRXJyb1BhZHJhbyA9IHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIG1lbnNhZ2VtU2ltcGxlcyxcclxuICAgICAgbWVuc2FnZW1IdG1sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW1VuQlBlc3NvYVNlcnZpY2VdIEVycm8gZm9ybWF0YWRvIGZpbmFsOicsIGVycm9Gb3JtYXRhZG8pO1xyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb0Zvcm1hdGFkbyk7XHJcbiAgfVxyXG59Il19
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTXBGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVk5QyxNQUFNLE9BQU8sZ0JBQWdCO0lBZTNCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFicEMscURBQXFEO1FBQzdDLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELHNFQUFzRTtRQUN0RSxnQkFBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwRCwrSEFBK0g7UUFDdkgsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQiw2RUFBNkU7UUFDckUsc0JBQWlCLEdBQXFELElBQUksQ0FBQztRQUMzRSxzQkFBaUIsR0FBcUQsSUFBSSxDQUFDO1FBQzNFLG1CQUFjLEdBQXFELElBQUksQ0FBQztRQXFrQmhGLHNFQUFzRTtRQUN0RSw0QkFBNEI7UUFDNUIsc0VBQXNFO1FBQzlELGdCQUFXLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNuQyxJQUFJLGVBQWUsR0FBRyw0Q0FBNEMsQ0FBQztZQUNuRSxJQUFJLFlBQVksR0FBRyxnREFBZ0QsQ0FBQztZQUVwRSxxQ0FBcUM7WUFDckMsSUFBSSxTQUFjLENBQUM7WUFFbkIsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekMsK0RBQStEO2dCQUMvRCxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixtRUFBbUU7Z0JBQ25FLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztZQUNuQyxDQUFDO1lBRUQsb0RBQW9EO1lBQ3BELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQztvQkFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxDQUFDOzRCQUNILFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM5RCxDQUFDO3dCQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7NEJBQ1osK0NBQStDOzRCQUMvQyxlQUFlLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQzlDLFlBQVksR0FBRyxXQUFXLFNBQVMsV0FBVyxDQUFDO3dCQUNqRCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCw2Q0FBNkM7WUFDN0MsSUFBSSxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBRS9DLHdCQUF3QjtnQkFDeEIsSUFBSSxTQUFTLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM3RixlQUFlLEdBQUcseUNBQXlDLENBQUM7b0JBRTVELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FDbkQsZUFBZSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sY0FBYyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FDbEYsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRVgsWUFBWSxHQUFHLDRDQUE0QyxVQUFVLE9BQU8sQ0FBQztnQkFDL0UsQ0FBQztnQkFDRCxnQ0FBZ0M7cUJBQzNCLENBQUM7b0JBQ0osTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUM7b0JBQy9FLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsZUFBZSxHQUFHLFVBQVUsQ0FBQzt3QkFDN0IsWUFBWSxHQUFHLFdBQVcsVUFBVSxXQUFXLENBQUM7b0JBQ2xELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxxRUFBcUU7WUFDckUseUVBQXlFO1lBQ3pFLHVEQUF1RDtZQUN2RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLFNBQVMsRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDO1lBRTVELElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixlQUFlLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3JDLFlBQVksR0FBRyx5REFBeUQsQ0FBQztZQUMzRSxDQUFDO2lCQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixlQUFlLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ25DLFlBQVksR0FBRyxrRUFBa0UsQ0FBQztZQUNwRixDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQXdCO2dCQUN6QyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxlQUFlO2dCQUNmLFlBQVk7YUFDYixDQUFDO1lBRUYsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN4RSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUE7SUFwcEJ1QyxDQUFDO0lBRXpDLG9DQUFvQztJQUNwQyxhQUFhLENBQUMsR0FBVztRQUN2QixtREFBbUQ7UUFDbkQsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsK0JBQStCO0lBQy9CLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQscUVBQXFFO0lBQzdELFVBQVU7UUFDaEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDNUIsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQyxDQUFDLENBQUM7UUFFSCxpRkFBaUY7UUFDakYsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLFNBQVMsQ0FBQyxHQUF1QjtRQUMvQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsbUNBQW1DLEdBQUcsRUFBRSxDQUFDO1FBQzVFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlCLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQy9ELFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXdCO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxzQ0FBc0MsSUFBSSxFQUFFLENBQUM7UUFDaEYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBaUIsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDL0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsRUFDakUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUE4QjtRQUM3QyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsMENBQTBDLFVBQVUsRUFBRSxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlCLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQ3BFLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsOEJBQThCLENBQUMsRUFBVTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsNENBQTRDLEVBQUUsRUFBRSxDQUFDO1FBQ3BGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlCLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQy9ELFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQWdDLENBQUMsRUFBVTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsOENBQThDLEVBQUUsRUFBRSxDQUFDO1FBQ3RGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlCLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ2pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBc0IsRUFBRSxJQUFhLEVBQUUsSUFBYSxFQUFFLElBQWE7UUFDbEYsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLDZCQUE2QixDQUFDO1FBQ2pFLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFFOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBMkIsQ0FBQyxDQUFDO1lBQ2xELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDZEQUE2RDtRQUM3RCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLE9BQU8sR0FBRztZQUNkLE1BQU07WUFDTixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyx5RUFBeUU7U0FDL0YsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW1CLEdBQUcsRUFBRSxPQUFPLENBQUM7YUFDakQsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ2pGLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDTixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBc0IsRUFBRSxJQUFhLEVBQUUsSUFBYSxFQUFFLElBQWE7UUFDcEYsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLCtCQUErQixDQUFDO1FBQ25FLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFFOUIsb0RBQW9EO1FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXRHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQTJCLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUMxRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCw2REFBNkQ7UUFDN0QsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxPQUFPLEdBQUc7WUFDZCxNQUFNO1lBQ04sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMseUVBQXlFO1NBQy9GLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFtQixHQUFHLEVBQUUsT0FBTyxDQUFDO2FBQ2pELElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUNuRixVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUM3QixDQUFDO0lBQ04sQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFXO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSwwQ0FBMEMsR0FBRyxFQUFFLENBQUM7UUFDbkYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBb0IsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDbEUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsTUFBTSxDQUFDLE9BQVksRUFBRSxVQUE2QjtRQUVoRCxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsZUFBZSxFQUFFLCtEQUErRDtnQkFDaEYsWUFBWSxFQUFFLGtFQUFrRTthQUNqRixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsZUFBZSxFQUFFLDRDQUE0QztnQkFDN0QsWUFBWSxFQUFFLDRFQUE0RTthQUMzRixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxlQUFlO1FBQ2YseUVBQXlFO1FBQ3pFLHdFQUF3RTtRQUN4RSxJQUFJLFVBQVUsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksVUFBVSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxJQUFJLFVBQVUsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELDRGQUE0RjtJQUNyRixZQUFZLENBQUMsTUFBc0I7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsZUFBZSxFQUFFLHVDQUF1QztnQkFDeEQsWUFBWSxFQUFFLHFEQUFxRDthQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELHVCQUF1QjtJQUNmLGdCQUFnQixDQUFDLE1BQXNCO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwQyx5REFBeUQ7UUFDekQsSUFBSSxRQUFvQyxDQUFDO1FBRXpDLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWlCLEdBQUcsR0FBRyw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEcsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWlCLEdBQUcsR0FBRywrQkFBK0IsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxSCxDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCx5QkFBeUI7SUFDakIsa0JBQWtCLENBQUMsTUFBc0I7UUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksUUFBb0MsQ0FBQztRQUV6QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDaEMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFpQixHQUFHLEdBQUcsK0JBQStCLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFpQixHQUFHLEdBQUcsaUNBQWlDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUgsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCw0QkFBNEI7SUFDckIsZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUEwQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQ3BILFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMscUJBQXFCO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF5QixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQ25ILFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMscUJBQXFCO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU0sYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF3QixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsd0NBQXdDLENBQUMsQ0FBQyxJQUFJLENBQy9HLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMscUJBQXFCO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSwwRUFBMEUsQ0FDbEcsQ0FBQyxJQUFJLENBQ0osR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2IsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsa0NBQWtDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ2xELElBQUksS0FBSyxLQUFLLFFBQVE7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxLQUFLLEtBQUssUUFBUTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDakMsT0FBTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsb0NBQW9DLENBQUMsQ0FBQyxJQUFJLENBQzlGLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxLQUFLLEVBQUUscUNBQXFDO1lBQ3BELFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQjtTQUMzRCxDQUFDLENBQUMsQ0FBQyxFQUNKLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDLElBQUksQ0FDdEcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLEtBQUssRUFBRSxxQ0FBcUM7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CO1NBQzNELENBQUMsQ0FBQyxDQUFDLEVBQ0osR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDLElBQUksQ0FDdEcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLEtBQUssRUFBRSxxQ0FBcUM7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CO1NBQzNELENBQUMsQ0FBQyxDQUFDLEVBQ0osR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDLElBQUksQ0FDbkcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLEtBQUssRUFBRSxxQ0FBcUM7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CO1NBQzNELENBQUMsQ0FBQyxDQUFDLEVBQ0osR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFZO1FBQ2hDLE9BQU8sSUFBSTthQUNSLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2FBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsU0FBZ0MsRUFBRSxXQUErQjtRQUN2RixNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFtQixDQUFDO1FBRXJFLGtEQUFrRDtRQUNsRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixNQUFNLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUNsQyxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRXBDLHFCQUFxQjtRQUNyQixJQUFLLE1BQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBSyxNQUFjLENBQUMsSUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25FLElBQUksSUFBSSxLQUFLLFVBQVU7Z0JBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7aUJBQzFDLElBQUksSUFBSSxLQUFLLFdBQVc7Z0JBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQXFCLENBQUMsQ0FBQztRQUNyRSx1RUFBdUU7UUFFdkUsd0NBQXdDO1FBQ3hDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFFLE1BQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RSxNQUFNLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBRSxNQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0UsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFFLE1BQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVyRSxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDL0MsR0FBRyxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBRXZELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2xFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDckQsQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLElBQUksY0FBYztvQkFBRSxHQUFHLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxDQUFDO1lBRUQsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsMEJBQTBCO1FBQzFCLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVqQyw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3JELENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FDaEUsQ0FBQztnQkFDRixJQUFJLGNBQWM7b0JBQUUsR0FBRyxDQUFDLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsdUJBQXVCO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzlDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVyQyx5REFBeUQ7WUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xELENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FDbEUsQ0FBQztnQkFDRixJQUFJLGNBQWM7b0JBQUUsS0FBSyxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsTUFBYyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsTUFBYyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVU7UUFDNUIsSUFBSSxLQUFLLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9CLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRU8sU0FBUyxDQUFDLFVBQWU7UUFDL0IsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QixJQUFJLFVBQVUsWUFBWSxJQUFJO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDbEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTdFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0YsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsTUFBc0I7UUFDbkQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUV6QixNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1lBQ2hDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7WUFDMUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlO1lBQ3BDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7WUFDMUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7U0FDckMsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ3hCLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7WUFDMUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQ1osR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQ1osY0FBYyxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQzFCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7U0FDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLGFBQWEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDdkIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztTQUMvQixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87WUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBRWpDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDM0Msa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDdkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUV2QixjQUFjLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDbkUsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtZQUNqRCxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDakMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsaUJBQXdCLENBQUM7WUFFaEYsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFFakUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtZQUMvQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZGLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDM0Msa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtZQUM3QyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFFdkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtZQUN6QyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFDdkMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlO1lBRXZDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxzQkFBc0I7WUFDckQscUJBQXFCLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtZQUNuRCxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1lBQzdDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUV6QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1lBQzNDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7WUFDL0Msc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRix1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1lBQ3JGLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7WUFDakQsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLDRCQUE0QjtZQUNqRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1lBRTdFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO1lBQ2pELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUUzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFFakMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLE1BQU0sRUFBRSxhQUFhO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRSxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixPQUFPLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQzs4R0Eva0JVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbmRlcmVjbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lbmRlcmVjby5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzY29sYXJpZGFkZSB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc2NvbGFyaWRhZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc3RhZG9DaXZpbCB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc3RhZG8tY2l2aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNdW5pbmNpcGlvIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLW11bmljaXBpbyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVBhaXMgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtcGFpcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYU1vZGVsIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iVGlwb1Blc3NvYUVudW0gfSBmcm9tICcuL3VuYi10aXBvLXBlc3NvYS5lbnVtJztcclxuaW1wb3J0IHsgVW5iVXRpbHMgfSBmcm9tICcuLi91dGlscy91bmItdXRpbHMnO1xyXG5cclxuLy8gSW50ZXJmYWNlIHBhcmEgcGFkcm9uaXphciBvIGVycm8gcXVlIGNoZWdhIG5vcyBjb21wb25lbnRlc1xyXG5leHBvcnQgaW50ZXJmYWNlIFVuYlBlc3NvYUVycm9QYWRyYW8ge1xyXG4gIHN0YXR1czogbnVtYmVyO1xyXG4gIG1lbnNhZ2VtU2ltcGxlczogc3RyaW5nOyAvLyBQYXJhIHVzYXIgbm8gU25hY2tCYXJcclxuICBtZW5zYWdlbUh0bWw6IHN0cmluZzsgICAgLy8gUGFyYSB1c2FyIG5vIEFsZXJ0U2VydmljZSAoY29tIDx1bD4sIDxsaT4sIDxzdHJvbmc+KVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVbkJQZXNzb2FTZXJ2aWNlIHtcclxuXHJcbiAgLy8gQXJtYXplbmEgYXBlbmFzIGEgc3RyaW5nIGRhIFVSTC4gSW5pY2lhbGl6YSB2YXppby5cclxuICBwcml2YXRlIGJhY2tlbmRVcmxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcclxuICAvLyBFeHBvc3RhIGNvbW8gT2JzZXJ2YWJsZSAoY2FzbyBhbGd1bSBjb21wb25lbnRlIHF1ZWlyYSBzZSBpbnNjcmV2ZXIpXHJcbiAgYmFja2VuZFVybCQgPSB0aGlzLmJhY2tlbmRVcmxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvLyBwcmEgZmFjaWxpdGFyIG8gZGVidWcsIHBvZGUgasOhIHBhc3NhciBvIHRva2VuLiBNYXMgaXNzbyBuYW8gcG9kZSBlc3RhciBuYSBwcm9kdWNhbyBwcSB2YWkgZXhwb3IgbyB0b2tlbiBwcm8gdXN1YXJpbyBubyBmcm9udFxyXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyA9ICcnO1xyXG5cclxuICAvLyBDYWNoZSBkYXMgbGlzdGFzIGRlIHRpcG9zIChwYXJhIG5vcm1hbGl6YcOnw6NvIGRlIGVuZGVyZcOnbywgdGVsZWZvbmUsIGVtYWlsKVxyXG4gIHByaXZhdGUgdGlwb0VuZGVyZWNvQ2FjaGU6IHsgY29kaWdvOiBudW1iZXI7IGRlbm9taW5hY2FvOiBzdHJpbmcgfVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0aXBvVGVsZWZvbmVDYWNoZTogeyBjb2RpZ286IG51bWJlcjsgZGVub21pbmFjYW86IHN0cmluZyB9W10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRpcG9FbWFpbENhY2hlOiB7IGNvZGlnbzogbnVtYmVyOyBkZW5vbWluYWNhbzogc3RyaW5nIH1bXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxyXG5cclxuICAvLyBTZXR0ZXIgYWdvcmEgcmVjZWJlIHN0cmluZyBkaXJldGFcclxuICBzZXRCYWNrZW5kVXJsKHVybDogc3RyaW5nKSB7XHJcbiAgICAvLyBUcmF0YW1lbnRvIHJlbW92ZSBiYXJyYSBubyBmaW5hbCBwYXJhIHBhZHJvbml6YXJcclxuICAgIGlmICh1cmwgJiYgdXJsLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIC0xKTtcclxuICAgIH1cclxuICAgIHRoaXMuYmFja2VuZFVybFN1YmplY3QubmV4dCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgc2V0VG9rZW4odG9rZW46IHN0cmluZykge1xyXG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0dGVyIHJldG9ybmEgc3RyaW5nIGRpcmV0YVxyXG4gIGdldEJhY2tlbmRVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmJhY2tlbmRVcmxTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBIZWFkZXJzIHBhZHLDo28gY29tIENvbnRlbnQtVHlwZSBlIEF1dGhvcml6YXRpb24gKHNlIHRva2VuIGV4aXN0aXIpXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCkge1xyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTZSBvIHRva2VuIGVzdGl2ZXIgcHJlZW5jaGlkbyAoY2Vuw6FyaW8gZGUgZGVidWcvZGV2KSwgYWRpY2lvbmEgbyBBdXRob3JpemF0aW9uXHJcbiAgICBpZiAodGhpcy50b2tlbikge1xyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7dGhpcy50b2tlbn1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXRvcm5hIG8gb2JqZXRvIG5vIGZvcm1hdG8gZXNwZXJhZG8gcGVsbyBIdHRwQ2xpZW50IHsgaGVhZGVyczogLi4uIH1cclxuICAgIHJldHVybiB7IGhlYWRlcnMgfTtcclxuICB9XHJcblxyXG4gIC8vIE3DqXRvZG9zIGRlIGJ1c2NhXHJcbiAgZmluZEJ5Q3BmKGNwZjogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzP2NwZj0ke2NwZn1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTW9kZWw+KHVybCwgdGhpcy5nZXRIZWFkZXJzKCkpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gdGhpcy5ub3JtYWxpemVQZXNzb2EocmVzLCBVbmJUaXBvUGVzc29hRW51bS5GSVNJQ0EpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBtYXAocmVzID0+IHRoaXMubm9ybWFsaXplUGVzc29hKHJlcywgVW5iVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeVBhc3NhcG9ydGUocGFzc2Fwb3J0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzP3Bhc3NhcG9ydGU9JHtwYXNzYXBvcnRlfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgbWFwKHJlcyA9PiB0aGlzLm5vcm1hbGl6ZVBlc3NvYShyZXMsIFVuYlRpcG9QZXNzb2FFbnVtLkVTVFJBTkdFSVJBKSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmaW5kUGVzc29hRmlzaWNhQnlDb2RpZ29QZXNzb2EoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhcz9jb2RpZ29QZXNzb2E9JHtpZH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTW9kZWw+KHVybCwgdGhpcy5nZXRIZWFkZXJzKCkpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gdGhpcy5ub3JtYWxpemVQZXNzb2EocmVzLCBVbmJUaXBvUGVzc29hRW51bS5GSVNJQ0EpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRQZXNzb2FKdXJpZGljYUJ5Q29kaWdvUGVzc29hKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2p1cmlkaWNhcz9jb2RpZ29QZXNzb2E9JHtpZH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTW9kZWw+KHVybCwgdGhpcy5nZXRIZWFkZXJzKCkpLnBpcGUoXHJcbiAgICAgIG1hcChyZXMgPT4gdGhpcy5ub3JtYWxpemVQZXNzb2EocmVzLCBVbmJUaXBvUGVzc29hRW51bS5KVVJJRElDQSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYShmaWx0cm86IFVuYlBlc3NvYU1vZGVsLCBwYWdlPzogbnVtYmVyLCBzaXplPzogbnVtYmVyLCBzb3J0Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbFtdPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXNgO1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcblxyXG4gICAgT2JqZWN0LmtleXMoZmlsdHJvKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3QgdmFsb3IgPSBmaWx0cm9ba2V5IGFzIGtleW9mIFVuYlBlc3NvYU1vZGVsXTtcclxuICAgICAgaWYgKHZhbG9yICE9PSBudWxsICYmIHZhbG9yICE9PSB1bmRlZmluZWQgJiYgdmFsb3IgIT09ICcnKSB7XHJcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChrZXksIHZhbG9yLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAyLiBBZGljaW9uYSBvcyBwYXLDom1ldHJvcyBkZSBQYWdpbmHDp8OjbyAoc2UgZm9yYW0gcGFzc2Fkb3MpXHJcbiAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgncGFnZScsIHBhZ2UudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2l6ZSAhPT0gdW5kZWZpbmVkICYmIHNpemUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnc2l6ZScsIHNpemUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoc29ydCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdzb3J0Jywgc29ydCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4gTW9udGEgYXMgb3DDp8O1ZXMgZGEgcmVxdWlzacOnw6NvXHJcbiAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIC4uLnRoaXMuZ2V0SGVhZGVycygpIC8vIFRlbnRhIGVzcGFsaGFyIGFzIHByb3ByaWVkYWRlcyBzZSBnZXRIZWFkZXJzIHJldG9ybmFyIHsgaGVhZGVyczogLi4uIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTW9kZWxbXT4odXJsLCBvcHRpb25zKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoYXJyID0+IGFyci5tYXAoaXRlbSA9PiB0aGlzLm5vcm1hbGl6ZVBlc3NvYShpdGVtLCBVbmJUaXBvUGVzc29hRW51bS5GSVNJQ0EpKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUp1cmlkaWNhKGZpbHRybzogVW5iUGVzc29hTW9kZWwsIHBhZ2U/OiBudW1iZXIsIHNpemU/OiBudW1iZXIsIHNvcnQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsW10+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYDtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG5cclxuICAgIC8vIDEuIEFkaWNpb25hIEFQRU5BUyBvcyBmaWx0cm9zIHBlcm1pdGlkb3MgZG8gTW9kZWxcclxuICAgIGNvbnN0IGNhbXBvc1Blcm1pdGlkb3MgPSBbJ2lkUGVzc29hJywgJ2NvZGlnb1Blc3NvYScsICdjbnBqJywgJ25vbWVGYW50YXNpYScsICdyYXphb1NvY2lhbCcsICdzaWdsYSddO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGZpbHRybykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGlmIChjYW1wb3NQZXJtaXRpZG9zLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWxvciA9IGZpbHRyb1trZXkgYXMga2V5b2YgVW5iUGVzc29hTW9kZWxdO1xyXG4gICAgICAgIGlmICh2YWxvciAhPT0gbnVsbCAmJiB2YWxvciAhPT0gdW5kZWZpbmVkICYmIHZhbG9yICE9PSAnJykge1xyXG4gICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChrZXksIHZhbG9yLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gMi4gQWRpY2lvbmEgb3MgcGFyw6JtZXRyb3MgZGUgUGFnaW5hw6fDo28gKHNlIGZvcmFtIHBhc3NhZG9zKVxyXG4gICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3BhZ2UnLCBwYWdlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBzaXplICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3NpemUnLCBzaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNvcnQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnc29ydCcsIHNvcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIE1vbnRhIGFzIG9ww6fDtWVzIGRhIHJlcXVpc2nDp8Ojb1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICAuLi50aGlzLmdldEhlYWRlcnMoKSAvLyBUZW50YSBlc3BhbGhhciBhcyBwcm9wcmllZGFkZXMgc2UgZ2V0SGVhZGVycyByZXRvcm5hciB7IGhlYWRlcnM6IC4uLiB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsW10+KHVybCwgb3B0aW9ucylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKGFyciA9PiBhcnIubWFwKGl0ZW0gPT4gdGhpcy5ub3JtYWxpemVQZXNzb2EoaXRlbSwgVW5iVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcGVzcXVpc2FyQ2VwKGNlcDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvYnVzY2EtY2VwL3NlcnZpY28tMS8ke2NlcH1gO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRW5kZXJlY28+KHVybCwgdGhpcy5nZXRIZWFkZXJzKCkpLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgKGRlY2lkZSBmaXNpY2Egb3UganVyaWRpY2EpXHJcbiAgc2FsdmFyKHBheWxvYWQ6IGFueSwgdGlwb1Blc3NvYTogVW5iVGlwb1Blc3NvYUVudW0pOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsIHwgbnVsbD4ge1xyXG5cclxuICAgIC8vIChQYXJhIG8gY29tcG9uZW50ZSBjb25zZWd1aXIgbGVyIC5tZW5zYWdlbVNpbXBsZXMgZSAubWVuc2FnZW1IdG1sKVxyXG4gICAgaWYgKCFwYXlsb2FkKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XHJcbiAgICAgICAgc3RhdHVzOiA0MDAsXHJcbiAgICAgICAgbWVuc2FnZW1TaW1wbGVzOiAnRXJybyBpbnRlcm5vOiBEYWRvcyBwYXJhIHNhbHZhbWVudG8gaW52w6FsaWRvcyAoUGF5bG9hZCBudWxsKS4nLFxyXG4gICAgICAgIG1lbnNhZ2VtSHRtbDogJzxzdHJvbmc+RXJybyBpbnRlcm5vOjwvc3Ryb25nPiBUZW50YXRpdmEgZGUgc2FsdmFyIGRhZG9zIHZhemlvcy4nXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRpcG9QZXNzb2EpIHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gKHtcclxuICAgICAgICBzdGF0dXM6IDQwMCxcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXM6ICdFcnJvIGludGVybm86IFRpcG8gZGUgcGVzc29hIG7Do28gZGVmaW5pZG8uJyxcclxuICAgICAgICBtZW5zYWdlbUh0bWw6ICc8c3Ryb25nPkVycm8gaW50ZXJubzo8L3N0cm9uZz4gTyB0aXBvIGRlIHBlc3NvYSDDqSBvYnJpZ2F0w7NyaW8gcGFyYSBzYWx2YXIuJ1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gRGVsZWdhw6fDo29cclxuICAgIC8vIENvbW8gc2F2ZVBlc3NvYUZpc2ljYSBlIHNhdmVQZXNzb2FKdXJpZGljYSBKw4EgVMOKTSBvIC5waXBlKGNhdGNoRXJyb3IpLFxyXG4gICAgLy8gYXF1aSBuw7NzIGFwZW5hcyByZXRvcm5hbW9zIG8gT2JzZXJ2YWJsZSBkZWxlcy4gTyBlcnJvIHN1Ymlyw6EgdHJhdGFkby5cclxuICAgIGlmICh0aXBvUGVzc29hID09IFVuYlRpcG9QZXNzb2FFbnVtLkZJU0lDQSB8fCB0aXBvUGVzc29hID09IFVuYlRpcG9QZXNzb2FFbnVtLkVTVFJBTkdFSVJBKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhdmVQZXNzb2FGaXNpY2EocGF5bG9hZCk7XHJcbiAgICB9IGVsc2UgaWYgKHRpcG9QZXNzb2EgPT0gVW5iVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2F2ZVBlc3NvYUp1cmlkaWNhKHBheWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvZihudWxsKTtcclxuICB9XHJcblxyXG4gIC8vIFNhbHZhciByZWNlYmVuZG8gZGlyZXRhbWVudGUgbyBNb2RlbCBlIGNvbnZlcnRlbmRvIGludGVybmFtZW50ZSBwYXJhIG8gcGF5bG9hZCBkbyBiYWNrZW5kXHJcbiAgcHVibGljIHNhbHZhclBlc3NvYShwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbCB8IG51bGw+IHtcclxuICAgIGlmICghcGVzc29hKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XHJcbiAgICAgICAgc3RhdHVzOiA0MDAsXHJcbiAgICAgICAgbWVuc2FnZW1TaW1wbGVzOiAnRXJybyBpbnRlcm5vOiBQZXNzb2EgaW52w6FsaWRhIChudWxsKS4nLFxyXG4gICAgICAgIG1lbnNhZ2VtSHRtbDogJzxzdHJvbmc+RXJybyBpbnRlcm5vOjwvc3Ryb25nPiBPYmpldG8gcGVzc29hIHZhemlvLidcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNvbnZlcnRQZXNzb2FUb1BheWxvYWQocGVzc29hKTtcclxuICAgIHJldHVybiB0aGlzLnNhbHZhcihwYXlsb2FkLCBwZXNzb2EudGlwb1Blc3NvYSk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEbDrXNpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FGaXNpY2EocGVzc29hOiBVbmJQZXNzb2FNb2RlbCk6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QmFja2VuZFVybCgpO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB0aGlzLmdldEhlYWRlcnMoKTtcclxuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwZXNzb2EpO1xyXG5cclxuICAgIC8vIFZhcmnDoXZlbCBwYXJhIGFybWF6ZW5hciBvIE9ic2VydmFibGUgYW50ZXMgZGUgcmV0b3JuYXJcclxuICAgIGxldCByZXF1ZXN0JDogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD47XHJcblxyXG4gICAgaWYgKHBlc3NvYS5jb2RpZ29QZXNzb2EgPT0gbnVsbCkge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wb3N0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzLyR7cGVzc29hLmNvZGlnb1Blc3NvYX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW50ZXMgZGUgcmV0b3JuYXIsIHBhc3NhbW9zIHBlbG8gJ3BpcGUnIHBhcmEgdHJhdGFyIG8gZXJybyBzZSBlbGUgb2NvcnJlci5cclxuICAgIHJldHVybiByZXF1ZXN0JC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIFBlc3NvYSBKdXLDrWRpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FKdXJpZGljYShwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRCYWNrZW5kVXJsKCk7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBlc3NvYSk7XHJcbiAgICBsZXQgcmVxdWVzdCQ6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+O1xyXG5cclxuICAgIGlmIChwZXNzb2EuY29kaWdvUGVzc29hID09IG51bGwpIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXMvJHtwZXNzb2EuY29kaWdvUGVzc29hfWAsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVxdWVzdCQucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIERhZG9zIGF1eGlsaWFyZXMgcMO6YmxpY29zXHJcbiAgcHVibGljIGdldEVzY29sYXJpZGFkZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVzY29sYXJpZGFkZVtdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXNjb2xhcmlkYWRlcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVzdGFkb0NpdmlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXN0YWRvQ2l2aWxbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcHVibGljL2VzdGFkb3MtY2l2aXMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpIC8vIDwtLS0gQWRpY2lvbmUgYXF1aVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNdW5pY2lwaW9zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTXVuaW5jaXBpb1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvbXVuaWNpcGlvcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhaXNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgY29udGVudDogVW5iUGVzc29hUGFpc1tdIH0+KFxyXG4gICAgICBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvcGFpc2VzL2xpc3RhZ2VtPyZwYWdlPTAmc2l6ZT0yMDAmc29ydD1kZW5vbWluYWNhbyxhc2NgXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNvbnRlbnQuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgLy8gLi4uIHN1YSBsw7NnaWNhIGRlIG9yZGVuYcOnw6NvIC4uLlxyXG4gICAgICAgICAgY29uc3Qgbm9tZUEgPSBhPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuICAgICAgICAgIGNvbnN0IG5vbWVCID0gYj8uZGVub21pbmFjYW8/LnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICBpZiAobm9tZUEgPT09ICdCUkFTSUwnKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAobm9tZUIgPT09ICdCUkFTSUwnKSByZXR1cm4gMTtcclxuICAgICAgICAgIHJldHVybiBub21lQS5sb2NhbGVDb21wYXJlKG5vbWVCKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UmFjYUNvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXRuaWFzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9FbmRlcmVjbygpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS90aXBvcy1lbmRlcmVjby9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSksXHJcbiAgICAgIG1hcChsaXN0YSA9PiB7XHJcbiAgICAgICAgdGhpcy50aXBvRW5kZXJlY29DYWNoZSA9IGxpc3RhO1xyXG4gICAgICAgIHJldHVybiBsaXN0YTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb1RlbGVmb25lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3RpcG9zLXRlbGVmb25lL3B1YmxpYy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIG1hcChsaXN0YSA9PiBsaXN0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgIGNvZGlnbzogaW5kZXgsIC8vIGdlcmEgdW0gY8OzZGlnbyBudW3DqXJpY28gc2VxdWVuY2lhbFxyXG4gICAgICAgIGRlbm9taW5hY2FvOiB0aGlzLmZvcm1hdGFyTGFiZWwoaXRlbSkgLy8gZm9ybWF0YSBzZSBxdWlzZXJcclxuICAgICAgfSkpKSxcclxuICAgICAgbWFwKGxpc3RhID0+IHtcclxuICAgICAgICB0aGlzLnRpcG9UZWxlZm9uZUNhY2hlID0gbGlzdGE7XHJcbiAgICAgICAgcmV0dXJuIGxpc3RhO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvRW1haWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvdGlwb3MtZW1haWwvcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBtYXAobGlzdGEgPT4ge1xyXG4gICAgICAgIHRoaXMudGlwb0VtYWlsQ2FjaGUgPSBsaXN0YTtcclxuICAgICAgICByZXR1cm4gbGlzdGE7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRhckxhYmVsKHRleHQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRleHRcclxuICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgLnJlcGxhY2UoL18vZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIGwgPT4gbC50b1VwcGVyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vcm1hbGl6YSBvIHBheWxvYWQgcmV0b3JuYWRvIHBlbG8gYmFja2VuZCBwYXJhIGBVbmJQZXNzb2FNb2RlbGAgcHJvbnRvIHBhcmEgVUkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVQZXNzb2EocmVzdWx0YWRvOiBVbmJQZXNzb2FNb2RlbCB8IG51bGwsIHRpcG9Gb3JjYWRvPzogVW5iVGlwb1Blc3NvYUVudW0pOiBVbmJQZXNzb2FNb2RlbCB7XHJcbiAgICBjb25zdCBwZXNzb2EgPSAocmVzdWx0YWRvIHx8IG5ldyBVbmJQZXNzb2FNb2RlbCgpKSBhcyBVbmJQZXNzb2FNb2RlbDtcclxuXHJcbiAgICAvLyBEZWZpbmUgdGlwb1Blc3NvYSBxdWFuZG8gbyBlbmRwb2ludCBuw6NvIHJldG9ybmFcclxuICAgIGlmICh0aXBvRm9yY2FkbyAhPSBudWxsKSB7XHJcbiAgICAgIHBlc3NvYS50aXBvUGVzc29hID0gdGlwb0ZvcmNhZG87XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2FyYW50ZSBhcnJheXNcclxuICAgIHBlc3NvYS5lbmRlcmVjb3MgPSBwZXNzb2EuZW5kZXJlY29zIHx8IFtdO1xyXG4gICAgcGVzc29hLnRlbGVmb25lcyA9IHBlc3NvYS50ZWxlZm9uZXMgfHwgW107XHJcbiAgICBwZXNzb2EuZW1haWxzID0gcGVzc29hLmVtYWlscyB8fCBbXTtcclxuXHJcbiAgICAvLyBTZXhvIC0+IGNvZGlnb1NleG9cclxuICAgIGlmICgocGVzc29hIGFzIGFueSkuc2V4bykge1xyXG4gICAgICBjb25zdCBzZXhvID0gKChwZXNzb2EgYXMgYW55KS5zZXhvIGFzIHN0cmluZykudG9VcHBlckNhc2UoKS50cmltKCk7XHJcbiAgICAgIGlmIChzZXhvID09PSAnRkVNSU5JTk8nKSBwZXNzb2EuY29kaWdvU2V4byA9IDI7XHJcbiAgICAgIGVsc2UgaWYgKHNleG8gPT09ICdNQVNDVUxJTk8nKSBwZXNzb2EuY29kaWdvU2V4byA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGF0YXMgcGFyYSBEYXRlXHJcbiAgICBwZXNzb2EuZGF0YU5hc2NpbWVudG8gPSB0aGlzLnBhcnNlRGF0YShwZXNzb2EuZGF0YU5hc2NpbWVudG8gYXMgYW55KTtcclxuICAgIC8vIERlbWFpcyBkYXRhcyBwZXJtYW5lY2VtIGNvbW8gc3RyaW5nIHBhcmEgY29tcGF0aWJpbGlkYWRlIGNvbSBvIG1vZGVsXHJcblxyXG4gICAgLy8gQ2FtcG9zIGNvbSAnY29kaWdvIC0gbGFiZWwnIC0+IGNvZGlnb1xyXG4gICAgcGVzc29hLmNvZGlnb0VzdGFkb0NpdmlsID0gdGhpcy5wYXJzZUNvZGlnbygocGVzc29hIGFzIGFueSkuZXN0YWRvQ2l2aWwpO1xyXG4gICAgcGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvID0gdGhpcy5wYXJzZUNvZGlnbygocGVzc29hIGFzIGFueSkucGFpc05hc2NpbWVudG8pO1xyXG4gICAgcGVzc29hLmVzY29sYXJpZGFkZSA9IHRoaXMucGFyc2VDb2RpZ28oKHBlc3NvYSBhcyBhbnkpLmVzY29sYXJpZGFkZSk7XHJcblxyXG4gICAgLy8gRW5kZXJlw6dvczogb3JkZW0vdWZcclxuICAgIHBlc3NvYS5lbmRlcmVjb3MuZm9yRWFjaCgoZW5kOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICBlbmQub3JkZW1FbmRlcmVjbyA9IGVuZC5vcmRlbUVuZGVyZWNvIHx8IGVuZC5vcmRlbSB8fCAoaSArIDEpO1xyXG4gICAgICBpZiAoIWVuZC51ZkVuZGVyZWNvICYmIGVuZC51ZikgZW5kLnVmRW5kZXJlY28gPSBlbmQudWY7XHJcblxyXG4gICAgICAvLyBNYXBlaWEgdGlwbyBzdHJpbmcgcGFyYSB0aXBvRW5kZXJlY29Db2RpZ28gdXNhbmRvIG8gY2FjaGVcclxuICAgICAgaWYgKCFlbmQudGlwb0VuZGVyZWNvQ29kaWdvICYmIGVuZC50aXBvICYmIHRoaXMudGlwb0VuZGVyZWNvQ2FjaGUpIHtcclxuICAgICAgICBjb25zdCB0aXBvRW5jb250cmFkbyA9IHRoaXMudGlwb0VuZGVyZWNvQ2FjaGUuZmluZCh0ID0+IFxyXG4gICAgICAgICAgdC5kZW5vbWluYWNhbz8udG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGVuZC50aXBvKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodGlwb0VuY29udHJhZG8pIGVuZC50aXBvRW5kZXJlY29Db2RpZ28gPSB0aXBvRW5jb250cmFkby5jb2RpZ287XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRyYWR1eiAncGFpcycgKHN0cmluZyAnMjIgLSBCUkFTSUwnKSBwYXJhICdwYWlzRW5kZXJlY29Db2RpZ28nIChudW1iZXIpXHJcbiAgICAgIGlmICghZW5kLnBhaXNFbmRlcmVjb0NvZGlnbyAmJiBlbmQucGFpcykge1xyXG4gICAgICAgIGVuZC5wYWlzRW5kZXJlY29Db2RpZ28gPSB0aGlzLnBhcnNlQ29kaWdvKGVuZC5wYWlzKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gVGVsZWZvbmVzOiBvcmRlbSBlIHRpcG9cclxuICAgIHBlc3NvYS50ZWxlZm9uZXMuZm9yRWFjaCgodGVsOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICB0ZWwub3JkZW0gPSB0ZWwub3JkZW0gfHwgKGkgKyAxKTtcclxuICAgICAgXHJcbiAgICAgIC8vIE1hcGVpYSB0aXBvIHN0cmluZyBwYXJhIHRpcG9UZWxlZm9uZUNvZGlnbyB1c2FuZG8gbyBjYWNoZVxyXG4gICAgICBpZiAoIXRlbC50aXBvVGVsZWZvbmVDb2RpZ28gJiYgdGVsLnRpcG8gJiYgdGhpcy50aXBvVGVsZWZvbmVDYWNoZSkge1xyXG4gICAgICAgIGNvbnN0IHRpcG9FbmNvbnRyYWRvID0gdGhpcy50aXBvVGVsZWZvbmVDYWNoZS5maW5kKHQgPT4gXHJcbiAgICAgICAgICB0LmRlbm9taW5hY2FvPy50b0xvd2VyQ2FzZSgpID09PSBTdHJpbmcodGVsLnRpcG8pLnRvTG93ZXJDYXNlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh0aXBvRW5jb250cmFkbykgdGVsLnRpcG9UZWxlZm9uZUNvZGlnbyA9IHRpcG9FbmNvbnRyYWRvLmNvZGlnbztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW1haWxzOiBvcmRlbSBlIHRpcG9cclxuICAgIHBlc3NvYS5lbWFpbHMuZm9yRWFjaCgoZW1haWw6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGVtYWlsLm9yZGVtID0gZW1haWwub3JkZW0gfHwgKGkgKyAxKTtcclxuICAgICAgXHJcbiAgICAgIC8vIE1hcGVpYSB0aXBvIHN0cmluZyBwYXJhIHRpcG9FbWFpbENvZGlnbyB1c2FuZG8gbyBjYWNoZVxyXG4gICAgICBpZiAoIWVtYWlsLnRpcG9FbWFpbENvZGlnbyAmJiBlbWFpbC50aXBvICYmIHRoaXMudGlwb0VtYWlsQ2FjaGUpIHtcclxuICAgICAgICBjb25zdCB0aXBvRW5jb250cmFkbyA9IHRoaXMudGlwb0VtYWlsQ2FjaGUuZmluZCh0ID0+IFxyXG4gICAgICAgICAgdC5kZW5vbWluYWNhbz8udG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKGVtYWlsLnRpcG8pLnRvTG93ZXJDYXNlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh0aXBvRW5jb250cmFkbykgZW1haWwudGlwb0VtYWlsQ29kaWdvID0gdGlwb0VuY29udHJhZG8uY29kaWdvO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGb3JtYXRhIGRvY3VtZW50byBwYXJhIFVJXHJcbiAgICBpZiAocGVzc29hLnRpcG9QZXNzb2EgPT09IFVuYlRpcG9QZXNzb2FFbnVtLkZJU0lDQSAmJiBwZXNzb2EuY3BmKSB7XHJcbiAgICAgIGNvbnN0IGRpZ2l0cyA9IFN0cmluZyhwZXNzb2EuY3BmKS5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG4gICAgICAocGVzc29hIGFzIGFueSkuY3BmID0gVW5iVXRpbHMuZm9ybWF0YUNwZihkaWdpdHMpO1xyXG4gICAgfSBlbHNlIGlmIChwZXNzb2EudGlwb1Blc3NvYSA9PT0gVW5iVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EgJiYgcGVzc29hLmNucGopIHtcclxuICAgICAgY29uc3QgZGlnaXRzID0gU3RyaW5nKHBlc3NvYS5jbnBqKS5yZXBsYWNlKC9cXEQvZywgJycpO1xyXG4gICAgICAocGVzc29hIGFzIGFueSkuY25waiA9IFVuYlV0aWxzLmZvcm1hdGFDbnBqKGRpZ2l0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBlc3NvYTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VDb2RpZ28odmFsb3I6IGFueSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgaWYgKHZhbG9yID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiB2YWxvciA9PT0gJ251bWJlcicpIHJldHVybiB2YWxvcjtcclxuICAgIGlmICh0eXBlb2YgdmFsb3IgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNlcEluZGV4ID0gdmFsb3IuaW5kZXhPZignIC0gJyk7XHJcbiAgICBpZiAoc2VwSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbG9yLCAxMCk7XHJcbiAgICAgIHJldHVybiBpc05hTihudW0pID8gbnVsbCA6IG51bTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvZGlnbyA9IHBhcnNlSW50KHZhbG9yLnN1YnN0cmluZygwLCBzZXBJbmRleCkudHJpbSgpLCAxMCk7XHJcbiAgICByZXR1cm4gaXNOYU4oY29kaWdvKSA/IG51bGwgOiBjb2RpZ287XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlRGF0YShkYXRhU3RyaW5nOiBhbnkpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAoIWRhdGFTdHJpbmcpIHJldHVybiBudWxsO1xyXG4gICAgaWYgKGRhdGFTdHJpbmcgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gZGF0YVN0cmluZztcclxuICAgIGlmICh0eXBlb2YgZGF0YVN0cmluZyAhPT0gJ3N0cmluZycgfHwgIWRhdGFTdHJpbmcuaW5jbHVkZXMoJy8nKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgcGFydGVzID0gZGF0YVN0cmluZy5zcGxpdCgnLycpO1xyXG4gICAgaWYgKHBhcnRlcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgZGlhID0gcGFyc2VJbnQocGFydGVzWzBdLCAxMCk7XHJcbiAgICBjb25zdCBtZXMgPSBwYXJzZUludChwYXJ0ZXNbMV0sIDEwKSAtIDE7XHJcbiAgICBjb25zdCBhbm8gPSBwYXJzZUludChwYXJ0ZXNbMl0sIDEwKTtcclxuICAgIGNvbnN0IGRhdGFPYmogPSBuZXcgRGF0ZShhbm8sIG1lcywgZGlhKTtcclxuICAgIGlmIChkYXRhT2JqLmdldEZ1bGxZZWFyKCkgPT09IGFubyAmJiBkYXRhT2JqLmdldE1vbnRoKCkgPT09IG1lcyAmJiBkYXRhT2JqLmdldERhdGUoKSA9PT0gZGlhKSB7XHJcbiAgICAgIHJldHVybiBkYXRhT2JqO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0ZSB1bWEgaW5zdMOibmNpYSAob3Ugb2JqZXRvKSBkZSBVbmJQZXNzb2FNb2RlbCBwYXJhIG8gcGF5bG9hZCBlc3BlcmFkbyBwZWxvIGJhY2tlbmQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0UGVzc29hVG9QYXlsb2FkKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBhbnkge1xyXG4gICAgaWYgKCFwZXNzb2EpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGVuZGVyZWNvc1BheWxvYWQgPSAocGVzc29hLmVuZGVyZWNvcyB8fCBbXSkubWFwKChlbmQ6IGFueSkgPT4gKHtcclxuICAgICAgb3JkZW1FbmRlcmVjbzogZW5kLm9yZGVtRW5kZXJlY28sXHJcbiAgICAgIHRpcG9FbmRlcmVjb0NvZGlnbzogZW5kLnRpcG9FbmRlcmVjb0NvZGlnbyxcclxuICAgICAgbXVuaWNpcGlvQ29kaWdvOiBlbmQubXVuaWNpcGlvQ29kaWdvLFxyXG4gICAgICBwYWlzRW5kZXJlY29Db2RpZ286IGVuZC5wYWlzRW5kZXJlY29Db2RpZ28sXHJcbiAgICAgIGxvZ3JhZG91cm86IGVuZC5sb2dyYWRvdXJvLFxyXG4gICAgICBjb21wbGVtZW50bzogZW5kLmNvbXBsZW1lbnRvLFxyXG4gICAgICBjZXA6IGVuZC5jZXAsXHJcbiAgICAgIGJhaXJybzogZW5kLmJhaXJybyxcclxuICAgICAgdWZFbmRlcmVjbzogZW5kLnVmRW5kZXJlY28sXHJcbiAgICAgIGNhaXhhUG9zdGFsOiBlbmQuY2FpeGFQb3N0YWwsXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNpYTogZW5kLmNvcnJlc3BvbmRlbmNpYVxyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IHRlbGVmb25lc1BheWxvYWQgPSAocGVzc29hLnRlbGVmb25lcyB8fCBbXSkubWFwKCh0ZWw6IGFueSkgPT4gKHtcclxuICAgICAgb3JkZW1UZWxlZm9uZTogdGVsLm9yZGVtLFxyXG4gICAgICB0aXBvVGVsZWZvbmVDb2RpZ286IHRlbC50aXBvVGVsZWZvbmVDb2RpZ28sXHJcbiAgICAgIGRkaTogdGVsLmRkaSxcclxuICAgICAgZGRkOiB0ZWwuZGRkLFxyXG4gICAgICBudW1lcm9UZWxlZm9uZTogdGVsLm51bWVybyxcclxuICAgICAgcmFtYWw6IHRlbC5yYW1hbCxcclxuICAgICAgYXV0b3JpemFTTVM6IHRlbC5hdXRvcml6YVNNU1xyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IGVtYWlsc1BheWxvYWQgPSAocGVzc29hLmVtYWlscyB8fCBbXSkubWFwKChlbWFpbDogYW55KSA9PiAoe1xyXG4gICAgICB0aXBvRW1haWxDb2RpZ286IGVtYWlsLnRpcG9FbWFpbENvZGlnbyxcclxuICAgICAgb3JkZW1FbWFpbDogZW1haWwub3JkZW0sXHJcbiAgICAgIGVtYWlsOiBlbWFpbC5lbWFpbCxcclxuICAgICAgYXV0b3JpemFjYW86IGVtYWlsLmF1dG9yaXphY2FvXHJcbiAgICB9KSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWRQZXNzb2E6IHBlc3NvYS5pZFBlc3NvYSxcclxuICAgICAgY29kaWdvUGVzc29hOiBwZXNzb2EuY29kaWdvUGVzc29hLFxyXG5cclxuICAgICAgbm9tZTogcGVzc29hLm5vbWUsXHJcbiAgICAgIG5vbWVTb2NpYWw6IHBlc3NvYS5ub21lU29jaWFsLFxyXG4gICAgICAuLi4ocGVzc29hLmNwZiAmJiB7IGNwZjogcGVzc29hLmNwZi5yZXBsYWNlKC9cXEQvZywgJycpIH0pLFxyXG4gICAgICBjb2RpZ29TZXhvOiBwZXNzb2EuY29kaWdvU2V4byxcclxuICAgICAgY29kaWdvRXN0YWRvQ2l2aWw6IHBlc3NvYS5jb2RpZ29Fc3RhZG9DaXZpbCxcclxuICAgICAgY29kaWdvRXNjb2xhcmlkYWRlOiBwZXNzb2EuZXNjb2xhcmlkYWRlLFxyXG4gICAgICBub21lUGFpOiBwZXNzb2Eubm9tZVBhaSxcclxuICAgICAgbm9tZU1hZTogcGVzc29hLm5vbWVNYWUsXHJcblxyXG4gICAgICBkYXRhTmFzY2ltZW50bzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YU5hc2NpbWVudG8pLFxyXG4gICAgICBjb2RpZ29QYWlzTmFzY2ltZW50bzogcGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvLFxyXG4gICAgICB1Zk5hc2NpbWVudG86IHBlc3NvYS51Zk5hc2NpbWVudG8sXHJcbiAgICAgIG5hdHVyYWxpZGFkZTogcGVzc29hLm5hdHVyYWxpZGFkZSxcclxuICAgICAgZGF0YUNoZWdhZGFCcmFzaWw6IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLmRhdGFDaGVnYWRhQnJhc2lsIGFzIGFueSksXHJcblxyXG4gICAgICByZzogcGVzc29hLnJnLFxyXG4gICAgICByZ09yZ2FvOiBwZXNzb2EucmdPcmdhbyxcclxuICAgICAgcmdVZjogcGVzc29hLnJnVWYsXHJcbiAgICAgIHJnRGF0YUVtaXNzYW86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLnJnRGF0YUVtaXNzYW8pLFxyXG5cclxuICAgICAgbnVtZXJvVGl0dWxvRWxlaXRvcjogcGVzc29hLm51bWVyb1RpdHVsb0VsZWl0b3IsXHJcbiAgICAgIGRhdGFFbWlzc2FvVGl0dWxvRWxlaXRvcjogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YUVtaXNzYW9UaXR1bG9FbGVpdG9yKSxcclxuICAgICAgem9uYVRpdHVsb0VsZWl0b3I6IHBlc3NvYS56b25hVGl0dWxvRWxlaXRvcixcclxuICAgICAgc2VjYW9UaXR1bG9FbGVpdG9yOiBwZXNzb2Euc2VjYW9UaXR1bG9FbGVpdG9yLFxyXG4gICAgICB1ZlRpdHVsb0VsZWl0b3I6IHBlc3NvYS51ZlRpdHVsb0VsZWl0b3IsXHJcblxyXG4gICAgICBudW1lcm9SZXNlcnZpc3RhOiBwZXNzb2EubnVtZXJvUmVzZXJ2aXN0YSxcclxuICAgICAgc2VyaWVSZXNlcnZpc3RhOiBwZXNzb2Euc2VyaWVSZXNlcnZpc3RhLFxyXG4gICAgICBvcmdhb1Jlc2VydmlzdGE6IHBlc3NvYS5vcmdhb1Jlc2VydmlzdGEsXHJcblxyXG4gICAgICBudW1lcm9DYXJ0ZWlyYVRyYWJhbGhvOiBwZXNzb2EubnVtZXJvQ2FydGVpcmFUcmFiYWxobyxcclxuICAgICAgc2VyaWVDYXJ0ZWlyYVRyYWJhbGhvOiBwZXNzb2Euc2VyaWVDYXJ0ZWlyYVRyYWJhbGhvLFxyXG4gICAgICB1ZkNhcnRlaXJhVHJhYmFsaG86IHBlc3NvYS51ZkNhcnRlaXJhVHJhYmFsaG8sXHJcbiAgICAgIHBpc1Bhc2VwOiBwZXNzb2EucGlzUGFzZXAsXHJcblxyXG4gICAgICBudW1lcm9IYWJpbGl0YWNhbzogcGVzc29hLm51bWVyb0hhYmlsaXRhY2FvLFxyXG4gICAgICByZWdpc3Ryb0hhYmlsaXRhY2FvOiBwZXNzb2EucmVnaXN0cm9IYWJpbGl0YWNhbyxcclxuICAgICAgZGF0YUVtaXNzYW9IYWJpbGl0YWNhbzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YUVtaXNzYW9IYWJpbGl0YWNhbyksXHJcbiAgICAgIGRhdGFWYWxpZGFkZUhhYmlsaXRhY2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5kYXRhVmFsaWRhZGVIYWJpbGl0YWNhbyksXHJcbiAgICAgIGNhdGVnb3JpYUhhYmlsaXRhY2FvOiBwZXNzb2EuY2F0ZWdvcmlhSGFiaWxpdGFjYW8sXHJcbiAgICAgIGRlZmljaWVuY2lhRmlzaWNhSGFiaWxpdGFjYW86IHBlc3NvYS5kZWZpY2llbmNpYUZpc2ljYUhhYmlsaXRhY2FvLFxyXG4gICAgICBwcmltZWlyYUhhYmlsaXRhY2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5wcmltZWlyYUhhYmlsaXRhY2FvKSxcclxuXHJcbiAgICAgIHBhc3NhcG9ydGU6IHBlc3NvYS5wYXNzYXBvcnRlLFxyXG4gICAgICBjb2RpZ29QYWlzUGFzc2Fwb3J0ZTogcGVzc29hLmNvZGlnb1BhaXNQYXNzYXBvcnRlLFxyXG4gICAgICAuLi4ocGVzc29hLmNucGogJiYgeyBjbnBqOiBwZXNzb2EuY25wai5yZXBsYWNlKC9cXEQvZywgJycpIH0pLFxyXG4gICAgICByYXphb1NvY2lhbDogcGVzc29hLnJhemFvU29jaWFsLFxyXG4gICAgICBub21lRmFudGFzaWE6IHBlc3NvYS5ub21lRmFudGFzaWEsXHJcbiAgICAgIHNpZ2xhOiBwZXNzb2Euc2lnbGEsXHJcbiAgICAgIHBhZ2luYVdlYjogcGVzc29hLnBhZ2luYVdlYixcclxuXHJcbiAgICAgIGF1dG9DYWRhc3RybzogcGVzc29hLmF1dG9DYWRhc3RybyxcclxuXHJcbiAgICAgIGVuZGVyZWNvczogZW5kZXJlY29zUGF5bG9hZCxcclxuICAgICAgdGVsZWZvbmVzOiB0ZWxlZm9uZXNQYXlsb2FkLFxyXG4gICAgICBlbWFpbHM6IGVtYWlsc1BheWxvYWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXRhIGEgZGF0YSBubyBwYWRyw6NvIEREL01NL1lZWVkgcGFyYSBvIGJhY2tlbmQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXRhckRhdGFQYXJhQmFja2VuZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICYmIGRhdGEuaW5jbHVkZXMoJy8nKSkgcmV0dXJuIGRhdGE7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGEpO1xyXG4gICAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IGRpYSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgY29uc3QgbWVzID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IGFubyA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgcmV0dXJuIGAke2RpYX0vJHttZXN9LyR7YW5vfWA7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEhBTkRMRSBFUlJPUiBQQURST05JWkFETyBcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICBsZXQgbWVuc2FnZW1TaW1wbGVzID0gJ09jb3JyZXUgdW0gZXJybyBhbyBwcm9jZXNzYXIgYSByZXF1aXNpw6fDo28hJztcclxuICAgIGxldCBtZW5zYWdlbUh0bWwgPSAnPHN0cm9uZz5PY29ycmV1IHVtIGVycm8gZGVzY29uaGVjaWRvLjwvc3Ryb25nPic7XHJcblxyXG4gICAgLy8gMi4gRGVzY29icmUgcXVlbSDDqSBvIGNvcnBvIGRvIGVycm9cclxuICAgIGxldCBlcnJvckJvZHk6IGFueTtcclxuXHJcbiAgICBpZiAoZXJyb3IuZGV0YWxoZXMgfHwgZXJyb3IuY29kaWdvU3RhdHVzKSB7XHJcbiAgICAgIC8vIENBU08gMTogTyBJbnRlcmNlcHRvciBqw6EgZGVzZW1icnVsaG91IG8gZXJybyAow6kgbyBKU09OIHB1cm8pXHJcbiAgICAgIGVycm9yQm9keSA9IGVycm9yO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQ0FTTyAyOiDDiSB1bSBIdHRwRXJyb3JSZXNwb25zZSBwYWRyw6NvICh0ZW0gYSBwcm9wcmllZGFkZSAuZXJyb3IpXHJcbiAgICAgIGVycm9yQm9keSA9IGVycm9yLmVycm9yIHx8IGVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIEzDs2dpY2EgZGUgTGltcGV6YSBlIFBhcnNlIChzZSBmb3Igc3RyaW5nIHN1amEpXHJcbiAgICBpZiAodHlwZW9mIGVycm9yQm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBlcnJvckJvZHkgPSBKU09OLnBhcnNlKGVycm9yQm9keSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IGVycm9yQm9keS5pbmRleE9mKCd7Jyk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gZXJyb3JCb2R5Lmxhc3RJbmRleE9mKCd9Jyk7XHJcbiAgICAgICAgaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVycm9yQm9keSA9IEpTT04ucGFyc2UoZXJyb3JCb2R5LnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSkpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZTIpIHtcclxuICAgICAgICAgICAgLy8gU2UgZmFsaGFyIG8gcGFyc2UsIHVzYSBvIHRleHRvIGNvbW8gbWVuc2FnZW1cclxuICAgICAgICAgICAgbWVuc2FnZW1TaW1wbGVzID0gZXJyb3JCb2R5LnN1YnN0cmluZygwLCAyMDApO1xyXG4gICAgICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz4ke2Vycm9yQm9keX08L3N0cm9uZz5gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDQuIEZvcm1hdGHDp8OjbyBiYXNlYWRhIG5vIEpTT04gaWRlbnRpZmljYWRvXHJcbiAgICBpZiAoZXJyb3JCb2R5ICYmIHR5cGVvZiBlcnJvckJvZHkgPT09ICdvYmplY3QnKSB7XHJcblxyXG4gICAgICAvLyBBOiBFcnJvcyBkZSBWYWxpZGHDp8Ojb1xyXG4gICAgICBpZiAoZXJyb3JCb2R5LmRldGFsaGVzICYmIEFycmF5LmlzQXJyYXkoZXJyb3JCb2R5LmRldGFsaGVzKSAmJiBlcnJvckJvZHkuZGV0YWxoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IFwiTyBmb3JtdWzDoXJpbyBwb3NzdWkgZXJyb3MgZGUgdmFsaWRhw6fDo28uXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpc3RhRXJyb3MgPSBlcnJvckJvZHkuZGV0YWxoZXMubWFwKChkOiBhbnkpID0+XHJcbiAgICAgICAgICBgPGxpPjxzdHJvbmc+JHtkLm5vbWVDYW1wbyB8fCAnQ2FtcG8nfTo8L3N0cm9uZz4gJHtkLmNyaXRpY2EgfHwgZC5tZW5zYWdlbX08L2xpPmBcclxuICAgICAgICApLmpvaW4oJycpO1xyXG5cclxuICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz5FcnJvcyBkZSBWYWxpZGHDp8Ojbzo8L3N0cm9uZz4gPHVsPiR7bGlzdGFFcnJvc308L3VsPmA7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQjogRXJybyBHZW7DqXJpY28gY29tIG1lbnNhZ2VtXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG1zZ0JhY2tlbmQgPSBlcnJvckJvZHkubWVuc2FnZW0gfHwgZXJyb3JCb2R5Lm1lc3NhZ2UgfHwgZXJyb3JCb2R5LmRldGFpbDtcclxuICAgICAgICBpZiAobXNnQmFja2VuZCkge1xyXG4gICAgICAgICAgbWVuc2FnZW1TaW1wbGVzID0gbXNnQmFja2VuZDtcclxuICAgICAgICAgIG1lbnNhZ2VtSHRtbCA9IGA8c3Ryb25nPiR7bXNnQmFja2VuZH08L3N0cm9uZz5gO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIFRyYXRhbWVudG9zIGRlIFN0YXR1cyBIVFRQIChTZSBvIHdyYXBwZXIgb3JpZ2luYWwgdGl2ZXIgc3RhdHVzKVxyXG4gICAgLy8gTm90YTogU2UgbyBpbnRlcmNlcHRvciBkZXNlbWJydWxob3UsICdlcnJvci5zdGF0dXMnIHBvZGUgbsOjbyBleGlzdGlyLCBcclxuICAgIC8vIG1hcyAnZXJyb3JCb2R5LmNvZGlnb1N0YXR1cycgKGRvIEphdmEpIHBvZGUgZXhpc3Rpci5cclxuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yLnN0YXR1cyB8fCBlcnJvckJvZHk/LmNvZGlnb1N0YXR1cyB8fCAwO1xyXG5cclxuICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIlNlc3PDo28gZXhwaXJhZGEuXCI7XHJcbiAgICAgIG1lbnNhZ2VtSHRtbCA9IFwiPHN0cm9uZz5TZXNzw6NvIGV4cGlyYWRhLiBGYcOnYSBsb2dpbiBub3ZhbWVudGUuPC9zdHJvbmc+XCI7XHJcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IFwiQWNlc3NvIE5lZ2Fkby5cIjtcclxuICAgICAgbWVuc2FnZW1IdG1sID0gXCI8c3Ryb25nPlZvY8OqIG7Do28gdGVtIHBlcm1pc3PDo28gcGFyYSByZWFsaXphciBlc3RhIGHDp8Ojby48L3N0cm9uZz5cIjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvRm9ybWF0YWRvOiBVbmJQZXNzb2FFcnJvUGFkcmFvID0ge1xyXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgbWVuc2FnZW1TaW1wbGVzLFxyXG4gICAgICBtZW5zYWdlbUh0bWxcclxuICAgIH07XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdbVW5CUGVzc29hU2VydmljZV0gRXJybyBmb3JtYXRhZG8gZmluYWw6JywgZXJyb0Zvcm1hdGFkbyk7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvRm9ybWF0YWRvKTtcclxuICB9XHJcbn0iXX0=