@stiunb/unb-lib-components 18.0.22 → 18.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/unb-mensagem/unb-mensagem.component.mjs +18 -26
- package/esm2022/lib/unb-mensagem/unb-mensagem.service.mjs +16 -21
- package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.mjs +91 -37
- package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +67 -49
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +160 -41
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +73 -57
- package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +225 -56
- package/esm2022/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-email.model.mjs +1 -1
- package/esm2022/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-endereco.model.mjs +1 -1
- package/esm2022/lib/unb-pessoa/unb-pessoa-models/unb-pessoa.model.mjs +2 -1
- package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +186 -40
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +115 -33
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +64 -34
- package/esm2022/lib/unb-pessoa/unb-pessoa.module.mjs +9 -1
- package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +146 -50
- package/esm2022/lib/unb-pessoa/unb-tipo-pessoa.enum.mjs +1 -1
- package/esm2022/lib/unb-usuario/oidc-decoded-token.mjs +1 -1
- package/esm2022/lib/unb-usuario/oidc-user-data.mjs +1 -1
- package/esm2022/public-api.mjs +14 -13
- package/esm2022/stiunb-unb-lib-components.mjs +5 -0
- package/fesm2022/stiunb-unb-lib-components.mjs +2627 -0
- package/fesm2022/stiunb-unb-lib-components.mjs.map +1 -0
- package/index.d.ts +1 -1
- package/lib/unb-mensagem/unb-mensagem.component.d.ts +3 -17
- package/lib/unb-mensagem/unb-mensagem.service.d.ts +16 -18
- package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.d.ts +9 -5
- package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.d.ts +8 -10
- package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.d.ts +12 -6
- package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.d.ts +8 -10
- package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +24 -12
- package/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-email.model.d.ts +1 -0
- package/lib/unb-pessoa/unb-pessoa-models/unb-pessoa-endereco.model.d.ts +3 -2
- package/lib/unb-pessoa/unb-pessoa-models/unb-pessoa.model.d.ts +5 -4
- package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +21 -8
- package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.d.ts +8 -6
- package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.d.ts +8 -10
- package/lib/unb-pessoa/unb-pessoa.module.d.ts +20 -18
- package/lib/unb-pessoa/unb-pessoa.service.d.ts +11 -14
- package/package.json +5 -5
- package/public-api.d.ts +10 -10
- package/esm2022/unb-lib-components.mjs +0 -5
- package/fesm2022/unb-lib-components.mjs +0 -1923
- package/fesm2022/unb-lib-components.mjs.map +0 -1
|
@@ -1,29 +1,34 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import { listaEstados } from '../pessoa-tabelas-apoio';
|
|
3
3
|
import { UnbPessoaEmail } from '../unb-pessoa-models/unb-pessoa-email.model';
|
|
4
4
|
import { UnbPessoaEndereco } from '../unb-pessoa-models/unb-pessoa-endereco.model';
|
|
5
5
|
import { UnbPessoaModel } from '../unb-pessoa-models/unb-pessoa.model';
|
|
6
6
|
import { TipoPessoaEnum } from '../unb-tipo-pessoa.enum';
|
|
7
|
+
import { UnbTipoMensagemEnum } from '../../unb-mensagem/unb-mensagem.service';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
import * as i1 from "../unb-pessoa.service";
|
|
9
10
|
import * as i2 from "@angular/material/snack-bar";
|
|
10
|
-
import * as i3 from "
|
|
11
|
-
import * as i4 from "@angular/
|
|
12
|
-
import * as i5 from "@angular/
|
|
13
|
-
import * as i6 from "@angular/material/
|
|
14
|
-
import * as i7 from "
|
|
15
|
-
import * as i8 from "@angular/material/
|
|
16
|
-
import * as i9 from "@angular/material/
|
|
17
|
-
import * as i10 from "@angular/material/
|
|
18
|
-
import * as i11 from "@angular/material/
|
|
19
|
-
import * as i12 from "
|
|
20
|
-
import * as i13 from "
|
|
21
|
-
import * as i14 from "
|
|
22
|
-
import * as i15 from "../unb-pessoa-
|
|
11
|
+
import * as i3 from "../../unb-mensagem/unb-mensagem.service";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
import * as i5 from "@angular/forms";
|
|
14
|
+
import * as i6 from "@angular/material/button";
|
|
15
|
+
import * as i7 from "../../unb-mensagem/unb-mensagem.component";
|
|
16
|
+
import * as i8 from "@angular/material/card";
|
|
17
|
+
import * as i9 from "@angular/material/form-field";
|
|
18
|
+
import * as i10 from "@angular/material/input";
|
|
19
|
+
import * as i11 from "@angular/material/select";
|
|
20
|
+
import * as i12 from "@angular/material/core";
|
|
21
|
+
import * as i13 from "@angular/material/progress-bar";
|
|
22
|
+
import * as i14 from "@angular/material/datepicker";
|
|
23
|
+
import * as i15 from "../unb-pessoa-pesquisar/unb-pessoa-pesquisar.component";
|
|
24
|
+
import * as i16 from "../unb-pessoa-telefone-form/unb-pessoa-telefone-list";
|
|
25
|
+
import * as i17 from "../unb-pessoa-endereco-form/unb-pessoa-endereco-list";
|
|
26
|
+
import * as i18 from "../unb-pessoa-email-form/unb-pessoa-email-list";
|
|
23
27
|
export class UnbPessoaFormComponent {
|
|
24
|
-
constructor(service, snackBar) {
|
|
28
|
+
constructor(service, snackBar, alertService) {
|
|
25
29
|
this.service = service;
|
|
26
30
|
this.snackBar = snackBar;
|
|
31
|
+
this.alertService = alertService;
|
|
27
32
|
this.isLoading = false;
|
|
28
33
|
this.buscaRealizada = false;
|
|
29
34
|
this.endereco = new UnbPessoaEndereco();
|
|
@@ -31,16 +36,26 @@ export class UnbPessoaFormComponent {
|
|
|
31
36
|
this.tiposPessoa = TipoPessoaEnum;
|
|
32
37
|
this.pessoa = new UnbPessoaModel(); // inicializa com pessoa
|
|
33
38
|
this.dadosSalvos = {}; // Armazena os dados ao trocar de tipo
|
|
34
|
-
|
|
39
|
+
// Quando verdadeiro, o formulário e ações ficam desabilitados porque os dados
|
|
40
|
+
// devem ser alterados apenas pelo app SouGov (matricula SIAPE presente)
|
|
41
|
+
this.isReadonlyFromSiape = false;
|
|
42
|
+
this.backendURL = "";
|
|
35
43
|
this.pesquisarPorCPF = true;
|
|
36
44
|
this.pesquisarPorCNPJ = true;
|
|
37
45
|
this.pesquisarPorEstrangeiro = true;
|
|
46
|
+
this.campoPesquisaMaxWidth = '400px';
|
|
47
|
+
this.pessoaEmitted = new EventEmitter();
|
|
48
|
+
this.idMensagemService = "unbPessoaForm";
|
|
38
49
|
}
|
|
39
50
|
ngOnInit() {
|
|
40
|
-
|
|
41
|
-
|
|
51
|
+
this.alertService.hideMessage(this.idMensagemService);
|
|
52
|
+
if (this.backendURL == "") {
|
|
53
|
+
this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: apiPessoaConfig.url está null. Insira o parâmetro (apiPessoaConfig) com o valor válido!");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.service.setBackendUrl(this.backendURL);
|
|
42
58
|
}
|
|
43
|
-
this.service.setApiConfig(this.apiPessoaConfig);
|
|
44
59
|
// atencao, o pessoaRecebida que inicializa esse componente
|
|
45
60
|
this.escolaridade = this.service.getEscolaridade();
|
|
46
61
|
this.paises = this.service.getPaises();
|
|
@@ -49,42 +64,73 @@ export class UnbPessoaFormComponent {
|
|
|
49
64
|
pessoaRecebida(pessoaRecebida) {
|
|
50
65
|
this.buscaRealizada = true;
|
|
51
66
|
this.pessoa = pessoaRecebida;
|
|
52
|
-
|
|
53
|
-
|
|
67
|
+
this.alertService.hideMessage(this.idMensagemService);
|
|
68
|
+
// inicializa pra nao quebrar
|
|
69
|
+
if (!this.pessoa.enderecos)
|
|
70
|
+
this.pessoa.enderecos = [];
|
|
71
|
+
if (!this.pessoa.emails)
|
|
72
|
+
this.pessoa.emails = [];
|
|
73
|
+
if (!this.pessoa.telefones)
|
|
74
|
+
this.pessoa.telefones = [];
|
|
75
|
+
// Se a pessoa vier com matriculaSiape preenchido, colocamos o formulário em modo somente-leitura
|
|
76
|
+
// e mostraremos uma mensagem informativa na UI. Também desabilita ações de salvar.
|
|
77
|
+
if (this.pessoa && this.pessoa.matriculaSiape !== undefined && this.pessoa.matriculaSiape !== null && this.pessoa.matriculaSiape !== 0) {
|
|
78
|
+
this.isReadonlyFromSiape = true;
|
|
79
|
+
// opcional: informar via snackBar também
|
|
80
|
+
this.openSnackBar('Servidor com matriculla SIAPE deve ter seus dados autalizados pelo aplicativo do sougov.');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.isReadonlyFromSiape = false;
|
|
54
84
|
}
|
|
55
85
|
}
|
|
56
|
-
salvar() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (!this.
|
|
86
|
+
salvar(form) {
|
|
87
|
+
this.alertService.hideMessage(this.idMensagemService);
|
|
88
|
+
// Suas validações
|
|
89
|
+
if (!this.validar(form))
|
|
60
90
|
return;
|
|
61
91
|
this.isLoading = true;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
const payload = this.convertPessoaToPayload(this.pessoa);
|
|
93
|
+
// O service já tem o .pipe(catchError) interno, então o erro chega tratado
|
|
94
|
+
this.service.salvar(payload, this.pessoa.tipoPessoa)
|
|
95
|
+
.subscribe({
|
|
96
|
+
next: (resposta) => {
|
|
65
97
|
this.isLoading = false;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
98
|
+
// Mensagem de Sucesso
|
|
99
|
+
this.alertService.showMessage("<strong>Registro salvo com sucesso!</strong>", UnbTipoMensagemEnum.SUCCESS, this.idMensagemService);
|
|
100
|
+
// Atualiza dados retornados (IDs gerados)
|
|
101
|
+
if (resposta) {
|
|
102
|
+
this.pessoa.codigoPessoa = resposta.codigoPessoa || this.pessoa.codigoPessoa;
|
|
103
|
+
this.pessoa.idPessoa = resposta.idPessoa || this.pessoa.idPessoa;
|
|
104
|
+
this.pessoaEmitted.emit(this.pessoa);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
error: (err) => {
|
|
108
|
+
// AQUI: O 'err' já chega limpo com { mensagemSimples, mensagemHtml }
|
|
109
|
+
this.handleError(err);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
72
112
|
}
|
|
73
|
-
validar() {
|
|
113
|
+
validar(form) {
|
|
74
114
|
if (!this.pessoa) {
|
|
75
115
|
this.openSnackBar("Erro ao carregar objeto pessoa");
|
|
76
116
|
return false;
|
|
77
117
|
}
|
|
118
|
+
if (form.invalid) {
|
|
119
|
+
// para que os erros apareçam na tela para o usuário.
|
|
120
|
+
form.control.markAllAsTouched();
|
|
121
|
+
this.openSnackBar("Por favor, preencha os campos obrigatórios.");
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
78
124
|
if (this.pessoa.telefones == null || (this.pessoa.telefones != null && this.pessoa.telefones.length == 0)) {
|
|
79
|
-
this.openSnackBar("
|
|
125
|
+
this.openSnackBar("Cadastre pelo menos um telefone no botão Cadastrar Novo Telefone");
|
|
80
126
|
return false;
|
|
81
127
|
}
|
|
82
128
|
if (this.pessoa.enderecos == null || (this.pessoa.enderecos != null && this.pessoa.enderecos.length == 0)) {
|
|
83
|
-
this.openSnackBar("
|
|
129
|
+
this.openSnackBar("Cadastre pelo menos um endereço no botão Cadastrar Novo Endereço");
|
|
84
130
|
return false;
|
|
85
131
|
}
|
|
86
132
|
if (this.pessoa.emails == null || (this.pessoa.emails != null && this.pessoa.emails.length == 0)) {
|
|
87
|
-
this.openSnackBar("
|
|
133
|
+
this.openSnackBar("Cadastre pelo menos um e-mail no botão Cadastrar Novo Email");
|
|
88
134
|
return false;
|
|
89
135
|
}
|
|
90
136
|
if (this.pessoa.tipoPessoa == TipoPessoaEnum.FISICA) {
|
|
@@ -108,8 +154,8 @@ export class UnbPessoaFormComponent {
|
|
|
108
154
|
}
|
|
109
155
|
}
|
|
110
156
|
if (this.pessoa.tipoPessoa == TipoPessoaEnum.JURIDICA) {
|
|
111
|
-
if (this.pessoa.
|
|
112
|
-
this.openSnackBar("
|
|
157
|
+
if (this.pessoa.cnpj == null || (this.pessoa.cnpj != null && this.pessoa.cnpj == "")) {
|
|
158
|
+
this.openSnackBar("CNPJ é um campo obrigatório");
|
|
113
159
|
return false;
|
|
114
160
|
}
|
|
115
161
|
}
|
|
@@ -124,17 +170,6 @@ export class UnbPessoaFormComponent {
|
|
|
124
170
|
emailsEmitted(emails) {
|
|
125
171
|
this.pessoa.emails = emails;
|
|
126
172
|
}
|
|
127
|
-
normalizaEscolaridade(escolaridade) {
|
|
128
|
-
if (!escolaridade)
|
|
129
|
-
return '0'; // Retorna "Não Informado" se estiver vazio
|
|
130
|
-
const partes = escolaridade.split(" - ");
|
|
131
|
-
return partes.length > 1 ? partes[0].trim() : '0';
|
|
132
|
-
}
|
|
133
|
-
erro(erro) {
|
|
134
|
-
// coloco o erro em negrito
|
|
135
|
-
this.openSnackBar(erro);
|
|
136
|
-
this.isLoading = false;
|
|
137
|
-
}
|
|
138
173
|
openSnackBar(message) {
|
|
139
174
|
this.snackBar.open(message, 'x', {
|
|
140
175
|
duration: 5000,
|
|
@@ -146,13 +181,143 @@ export class UnbPessoaFormComponent {
|
|
|
146
181
|
getListaEstados() {
|
|
147
182
|
return listaEstados;
|
|
148
183
|
}
|
|
149
|
-
|
|
150
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { apiPessoaConfig: "apiPessoaConfig", defaultTipoPessoa: "defaultTipoPessoa", pesquisarPorCPF: "pesquisarPorCPF", pesquisarPorCNPJ: "pesquisarPorCNPJ", pesquisarPorEstrangeiro: "pesquisarPorEstrangeiro" }, ngImport: i0, template: " <div class=\"form-container\">\r\n <lib-unb-pessoa-pesquisar\r\n [apiPessoaConfig]=\"apiPessoaConfig\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\" \r\n (pessoaEmitted)=\"pessoaRecebida($event)\"></lib-unb-pessoa-pesquisar>\r\n</div>\r\n \r\n <form #pessoaForm=\"ngForm\" class=\"form-container mt-2\" *ngIf=\"buscaRealizada && apiPessoaConfig.url\" (ngSubmit)=\"salvar()\">\r\n \r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\" #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\">\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento\">\r\n {{ ufNascimento }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required/>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\">\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n \r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\"\r\n #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\">\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\"> Contato</b>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\" ></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\" ></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [emails]=\"pessoa.emails\" (emailsEmitted)=\"emailsEmitted($event)\" ></lib-unb-pessoa-email-list>\r\n \r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button disabled=\"{{isLoading}}\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n \r\n </form>\r\n\r\n", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i6.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i11.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i11.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i11.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i12.UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["apiPessoaConfig", "pesquisarPorCPF", "pesquisarPorCNPJ", "pesquisarPorEstrangeiro", "defaultTipoPessoa", "pessoa", "mostrarPesquisa", "limparAposPesquisa", "label", "placeholder", "hint"], outputs: ["pessoaEmitted"] }, { kind: "component", type: i13.UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "apiPessoaConfig"], outputs: ["telefonesEmitted"] }, { kind: "component", type: i14.UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "apiPessoaConfig"], outputs: ["enderecosEmitted"] }, { kind: "component", type: i15.UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "apiPessoaConfig"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
|
|
184
|
+
/**
|
|
185
|
+
* Converte uma instância (ou objeto) de UnbPessoaModel para o payload esperado pelo backend.
|
|
186
|
+
*/
|
|
187
|
+
convertPessoaToPayload(pessoa) {
|
|
188
|
+
if (!pessoa)
|
|
189
|
+
return null;
|
|
190
|
+
// --- Mapeia os arrays ---
|
|
191
|
+
const enderecosPayload = (pessoa.enderecos || []).map((end) => ({
|
|
192
|
+
ordemEndereco: end.ordemEndereco,
|
|
193
|
+
tipoEnderecoCodigo: end.tipoEnderecoCodigo,
|
|
194
|
+
municipioCodigo: end.municipioCodigo,
|
|
195
|
+
paisEnderecoCodigo: end.paisEnderecoCodigo,
|
|
196
|
+
logradouro: end.logradouro,
|
|
197
|
+
complemento: end.complemento,
|
|
198
|
+
cep: end.cep,
|
|
199
|
+
bairro: end.bairro,
|
|
200
|
+
ufEndereco: end.ufEndereco,
|
|
201
|
+
caixaPostal: end.caixaPostal,
|
|
202
|
+
correspondencia: end.correspondencia
|
|
203
|
+
}));
|
|
204
|
+
const telefonesPayload = (pessoa.telefones || []).map((tel) => ({
|
|
205
|
+
ordemTelefone: tel.ordem,
|
|
206
|
+
tipoTelefoneCodigo: tel.tipoTelefoneCodigo,
|
|
207
|
+
ddi: tel.ddi,
|
|
208
|
+
ddd: tel.ddd,
|
|
209
|
+
numeroTelefone: tel.numero,
|
|
210
|
+
ramal: tel.ramal,
|
|
211
|
+
autorizaSMS: tel.autorizaSMS
|
|
212
|
+
}));
|
|
213
|
+
const emailsPayload = (pessoa.emails || []).map((email) => ({
|
|
214
|
+
tipoEmailCodigo: email.tipoEmailCodigo,
|
|
215
|
+
ordemEmail: email.ordem,
|
|
216
|
+
email: email.email,
|
|
217
|
+
autorizacao: email.autorizacao
|
|
218
|
+
}));
|
|
219
|
+
// --- Monta o objeto principal ---
|
|
220
|
+
return {
|
|
221
|
+
idPessoa: pessoa.idPessoa,
|
|
222
|
+
codigoPessoa: pessoa.codigoPessoa,
|
|
223
|
+
nome: pessoa.nome,
|
|
224
|
+
nomeSocial: pessoa.nomeSocial,
|
|
225
|
+
// Adiciona a chave 'cpf' ao objeto SOMENTE SE pessoa.cpf for truthy
|
|
226
|
+
...(pessoa.cpf && { cpf: pessoa.cpf.replace(/\D/g, '') }),
|
|
227
|
+
codigoSexo: pessoa.codigoSexo,
|
|
228
|
+
codigoEstadoCivil: pessoa.codigoEstadoCivil,
|
|
229
|
+
codigoEscolaridade: pessoa.escolaridade,
|
|
230
|
+
// codigoTipoSanguineo: pessoa.tipoSanguineo,
|
|
231
|
+
nomePai: pessoa.nomePai,
|
|
232
|
+
nomeMae: pessoa.nomeMae,
|
|
233
|
+
dataNascimento: this.formatarDataParaBackend(pessoa.dataNascimento),
|
|
234
|
+
codigoPaisNascimento: pessoa.codigoPaisNascimento,
|
|
235
|
+
ufNascimento: pessoa.ufNascimento,
|
|
236
|
+
naturalidade: pessoa.naturalidade,
|
|
237
|
+
rg: pessoa.rg,
|
|
238
|
+
rgOrgao: pessoa.rgOrgao,
|
|
239
|
+
rgUf: pessoa.rgUf,
|
|
240
|
+
rgDataEmissao: this.formatarDataParaBackend(pessoa.rgDataEmissao),
|
|
241
|
+
numeroTituloEleitor: pessoa.numeroTituloEleitor,
|
|
242
|
+
dataEmissaoTituloEleitor: this.formatarDataParaBackend(pessoa.dataEmissaoTituloEleitor),
|
|
243
|
+
zonaTituloEleitor: pessoa.zonaTituloEleitor,
|
|
244
|
+
secaoTituloEleitor: pessoa.secaoTituloEleitor,
|
|
245
|
+
ufTituloEleitor: pessoa.ufTituloEleitor,
|
|
246
|
+
numeroReservista: pessoa.numeroReservista,
|
|
247
|
+
serieReservista: pessoa.serieReservista,
|
|
248
|
+
orgaoReservista: pessoa.orgaoReservista,
|
|
249
|
+
numeroCarteiraTrabalho: pessoa.numeroCarteiraTrabalho,
|
|
250
|
+
serieCarteiraTrabalho: pessoa.serieCarteiraTrabalho,
|
|
251
|
+
ufCarteiraTrabalho: pessoa.ufCarteiraTrabalho,
|
|
252
|
+
pisPasep: pessoa.pisPasep,
|
|
253
|
+
numeroHabilitacao: pessoa.numeroHabilitacao,
|
|
254
|
+
registroHabilitacao: pessoa.registroHabilitacao,
|
|
255
|
+
dataEmissaoHabilitacao: this.formatarDataParaBackend(pessoa.dataEmissaoHabilitacao),
|
|
256
|
+
dataValidadeHabilitacao: this.formatarDataParaBackend(pessoa.dataValidadeHabilitacao),
|
|
257
|
+
categoriaHabilitacao: pessoa.categoriaHabilitacao,
|
|
258
|
+
deficienciaFisicaHabilitacao: pessoa.deficienciaFisicaHabilitacao,
|
|
259
|
+
primeiraHabilitacao: this.formatarDataParaBackend(pessoa.primeiraHabilitacao),
|
|
260
|
+
passaporte: pessoa.passaporte,
|
|
261
|
+
codigoPaisPassaporte: pessoa.codigoPaisPassaporte,
|
|
262
|
+
// Adiciona a chave 'cnpj' ao objeto SOMENTE SE pessoa.cnpj for truthy
|
|
263
|
+
...(pessoa.cnpj && { cnpj: pessoa.cnpj.replace(/\D/g, '') }),
|
|
264
|
+
razaoSocial: pessoa.razaoSocial,
|
|
265
|
+
nomeFantasia: pessoa.nomeFantasia,
|
|
266
|
+
sigla: pessoa.sigla,
|
|
267
|
+
paginaWeb: pessoa.paginaWeb,
|
|
268
|
+
autoCadastro: pessoa.autoCadastro,
|
|
269
|
+
enderecos: enderecosPayload,
|
|
270
|
+
telefones: telefonesPayload,
|
|
271
|
+
emails: emailsPayload
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Formata a data no padrão DD/MM/YYYY para o backend.
|
|
276
|
+
*/
|
|
277
|
+
formatarDataParaBackend(data) {
|
|
278
|
+
if (!data)
|
|
279
|
+
return null;
|
|
280
|
+
if (typeof data === 'string' && data.includes('/'))
|
|
281
|
+
return data;
|
|
282
|
+
try {
|
|
283
|
+
const d = new Date(data);
|
|
284
|
+
if (isNaN(d.getTime()))
|
|
285
|
+
return null;
|
|
286
|
+
const dia = String(d.getDate()).padStart(2, '0');
|
|
287
|
+
const mes = String(d.getMonth() + 1).padStart(2, '0');
|
|
288
|
+
const ano = d.getFullYear();
|
|
289
|
+
return `${dia}/${mes}/${ano}`;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
handleErrorPrintConsole(erro) {
|
|
296
|
+
console.log(erro);
|
|
297
|
+
this.handleError(erro);
|
|
298
|
+
}
|
|
299
|
+
handleError(erro) {
|
|
300
|
+
this.isLoading = false;
|
|
301
|
+
// 1. Mostra a mensagem curta/simples no SnackBar (Fundo da tela)
|
|
302
|
+
// Ex: "O formulário possui erros de validação." ou "Sessão expirada."
|
|
303
|
+
if (erro.mensagemSimples) {
|
|
304
|
+
this.openSnackBar(erro.mensagemSimples);
|
|
305
|
+
}
|
|
306
|
+
// 2. Mostra a mensagem detalhada HTML no componente <unb-mensagem>
|
|
307
|
+
// Ex: Lista com <ul><li>Campo Data inválido...</li></ul>
|
|
308
|
+
if (this.alertService && erro.mensagemHtml) {
|
|
309
|
+
// Se o seu alertService suportar ID do componente alvo, passe aqui.
|
|
310
|
+
// Caso contrário, ele mostra no componente padrão.
|
|
311
|
+
this.alertService.showMessage(erro.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, deps: [{ token: i1.UnBPessoaService }, { token: i2.MatSnackBar }, { token: i3.UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
315
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { backendURL: "backendURL", defaultTipoPessoa: "defaultTipoPessoa", pesquisarPorCPF: "pesquisarPorCPF", pesquisarPorCNPJ: "pesquisarPorCNPJ", pesquisarPorEstrangeiro: "pesquisarPorEstrangeiro", campoPesquisaMaxWidth: "campoPesquisaMaxWidth" }, outputs: { pessoaEmitted: "pessoaEmitted" }, ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [backendURL]=\"backendURL\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\"\r\n [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\"\r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\" (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento.identificador\">\r\n {{ ufNascimento.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\"\r\n [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\"\r\n [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i8.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i8.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i8.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i15.UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["backendURL", "pesquisarPorCPF", "pesquisarPorCNPJ", "pesquisarPorEstrangeiro", "defaultTipoPessoa", "campoPesquisaMaxWidth", "pessoa", "mostrarPesquisa", "limparAposPesquisa", "label", "placeholder", "hint"], outputs: ["pessoaEmitted"] }, { kind: "component", type: i16.UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "backendURL"], outputs: ["telefonesEmitted"] }, { kind: "component", type: i17.UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "backendURL"], outputs: ["enderecosEmitted"] }, { kind: "component", type: i18.UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "backendURL"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
151
316
|
}
|
|
152
317
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, decorators: [{
|
|
153
318
|
type: Component,
|
|
154
|
-
args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: " <div class=\"form-container\">\r\n <lib-unb-pessoa-pesquisar\r\n [apiPessoaConfig]=\"apiPessoaConfig\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\" \r\n (pessoaEmitted)=\"pessoaRecebida($event)\"></lib-unb-pessoa-pesquisar>\r\n</div>\r\n \r\n <form #pessoaForm=\"ngForm\" class=\"form-container mt-2\" *ngIf=\"buscaRealizada && apiPessoaConfig.url\" (ngSubmit)=\"salvar()\">\r\n \r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\" #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\">\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento\">\r\n {{ ufNascimento }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required/>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\">\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n \r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\"\r\n #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\">\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\"> Contato</b>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\" ></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\" ></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [emails]=\"pessoa.emails\" (emailsEmitted)=\"emailsEmitted($event)\" ></lib-unb-pessoa-email-list>\r\n \r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button disabled=\"{{isLoading}}\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n \r\n </form>\r\n\r\n", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}\n"] }]
|
|
155
|
-
}], ctorParameters: () => [{ type: i1.UnBPessoaService }, { type: i2.MatSnackBar }], propDecorators: {
|
|
319
|
+
args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar \r\n [backendURL]=\"backendURL\" \r\n [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\"\r\n [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\"\r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\" (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento.identificador\">\r\n {{ ufNascimento.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\"\r\n [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\"\r\n [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}\n"] }]
|
|
320
|
+
}], ctorParameters: () => [{ type: i1.UnBPessoaService }, { type: i2.MatSnackBar }, { type: i3.UnbMensagemService }], propDecorators: { backendURL: [{
|
|
156
321
|
type: Input
|
|
157
322
|
}], defaultTipoPessoa: [{
|
|
158
323
|
type: Input
|
|
@@ -162,5 +327,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
|
|
|
162
327
|
type: Input
|
|
163
328
|
}], pesquisarPorEstrangeiro: [{
|
|
164
329
|
type: Input
|
|
330
|
+
}], campoPesquisaMaxWidth: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], pessoaEmitted: [{
|
|
333
|
+
type: Output
|
|
165
334
|
}] } });
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VuYi1saWItY29tcG9uZW50cy9zcmMvbGliL3VuYi1wZXNzb2EvdW5iLXBlc3NvYS1mb3JtL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmItbGliLWNvbXBvbmVudHMvc3JjL2xpYi91bmItcGVzc29hL3VuYi1wZXNzb2EtZm9ybS91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUtuRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVF6RCxNQUFNLE9BQU8sc0JBQXNCO0lBaUJqQyxZQUFvQixPQUF5QixFQUFVLFFBQXFCO1FBQXhELFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQWhCNUUsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxhQUFRLEdBQUcsSUFBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BDLFVBQUssR0FBRyxJQUFLLGNBQWMsRUFBRSxDQUFDO1FBRTlCLGdCQUFXLEdBQUcsY0FBYyxDQUFDO1FBRTdCLFdBQU0sR0FBbUIsSUFBSSxjQUFjLEVB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LGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbGlzdGFFc3RhZG9zIH0gZnJvbSAnLi4vcGVzc29hLXRhYmVsYXMtYXBvaW8nO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbWFpbCB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW1haWwubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbmRlcmVjbyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc2NvbGFyaWRhZGUgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVzY29sYXJpZGFkZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzdGFkb0NpdmlsIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc3RhZG8tY2l2aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FQYWlzIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1wYWlzJztcclxuaW1wb3J0IHsgVW5iUGVzc29hVGVsZWZvbmUgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXRlbGVmb25lLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hTW9kZWwgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLm1vZGVsJztcclxuaW1wb3J0IHsgVW5CUGVzc29hU2VydmljZSB9IGZyb20gJy4uL3VuYi1wZXNzb2Euc2VydmljZSc7XHJcbmltcG9ydCB7IFRpcG9QZXNzb2FFbnVtIH0gZnJvbSAnLi4vdW5iLXRpcG8tcGVzc29hLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdW5iLXBlc3NvYS1mb3JtJyxcclxuICBzdGFuZGFsb25lOiBmYWxzZSwgIFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91bmItcGVzc29hLWZvcm0uY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuYlBlc3NvYUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGJ1c2NhUmVhbGl6YWRhOiBib29sZWFuID0gZmFsc2U7ICBcclxuICBlbmRlcmVjbyA9IG5ldyAgVW5iUGVzc29hRW5kZXJlY28oKTsgXHJcbiAgZW1haWwgPSBuZXcgIFVuYlBlc3NvYUVtYWlsKCk7XHJcbiAgXHJcbiAgdGlwb3NQZXNzb2EgPSBUaXBvUGVzc29hRW51bTtcclxuICBcclxuICBwZXNzb2E6IFVuYlBlc3NvYU1vZGVsID0gbmV3IFVuYlBlc3NvYU1vZGVsKCk7IC8vIGluaWNpYWxpemEgY29tIHBlc3NvYVxyXG4gIGRhZG9zU2Fsdm9zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307IC8vIEFybWF6ZW5hIG9zIGRhZG9zIGFvIHRyb2NhciBkZSB0aXBvXHJcbiAgXHJcbiAgQElucHV0KCkgYXBpUGVzc29hQ29uZmlnOiB7IHVybDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0gPSB7IHVybDogJycsIHRva2VuOiAnJyB9O1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRUaXBvUGVzc29hITogVGlwb1Blc3NvYUVudW07XHJcbiAgQElucHV0KCkgcGVzcXVpc2FyUG9yQ1BGID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwZXNxdWlzYXJQb3JDTlBKID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwZXNxdWlzYXJQb3JFc3RyYW5nZWlybyA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogVW5CUGVzc29hU2VydmljZSwgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIpIHsgfVxyXG4gXHJcbiAgLy8gdGFiZWxhcyB0cmFkaWNpb25haXMgcXVlIHZlbSBkbyBiYWNrZW5kXHJcbiAgZXNjb2xhcmlkYWRlITogT2JzZXJ2YWJsZTxVbmJQZXNzb2FFc2NvbGFyaWRhZGVbXT47XHJcbiAgcGFpc2VzITogT2JzZXJ2YWJsZTxVbmJQZXNzb2FQYWlzW10+O1xyXG4gIGVzdGFkb3NDaXZpbCEgOiBPYnNlcnZhYmxlPFVuYlBlc3NvYUVzdGFkb0NpdmlsW10+O1xyXG5cclxuIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXBpUGVzc29hQ29uZmlnLnVybC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHRoaXMuYXBpUGVzc29hQ29uZmlnLnVybCA9IHRoaXMuYXBpUGVzc29hQ29uZmlnLnVybC5zbGljZSgwLCAtMSk7XHJcbiAgICB9XHJcbiAgICBcclxuICB0aGlzLnNlcnZpY2Uuc2V0QXBpQ29uZmlnKHRoaXMuYXBpUGVzc29hQ29uZmlnKTtcclxuXHJcbiAgICAvLyBhdGVuY2FvLCBvIHBlc3NvYVJlY2ViaWRhIHF1ZSBpbmljaWFsaXphIGVzc2UgY29tcG9uZW50ZVxyXG4gICAgdGhpcy5lc2NvbGFyaWRhZGUgPSB0aGlzLnNlcnZpY2UuZ2V0RXNjb2xhcmlkYWRlKCk7XHJcbiAgICB0aGlzLnBhaXNlcyA9IHRoaXMuc2VydmljZS5nZXRQYWlzZXMoKTtcclxuICAgIHRoaXMuZXN0YWRvc0NpdmlsID0gdGhpcy5zZXJ2aWNlLmdldEVzdGFkb0NpdmlsKCk7XHJcbiAgfVxyXG4gIHBlc3NvYVJlY2ViaWRhKHBlc3NvYVJlY2ViaWRhOiBVbmJQZXNzb2FNb2RlbCkge1xyXG4gICAgdGhpcy5idXNjYVJlYWxpemFkYSA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5wZXNzb2EgPSBwZXNzb2FSZWNlYmlkYTtcclxuICAgIGlmICh0aGlzLnBlc3NvYSAmJiB0aGlzLnBlc3NvYS5lc2NvbGFyaWRhZGUpIHtcclxuICAgICAgdGhpcy5wZXNzb2EuZXNjb2xhcmlkYWRlID0gdGhpcy5ub3JtYWxpemFFc2NvbGFyaWRhZGUodGhpcy5wZXNzb2EuZXNjb2xhcmlkYWRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhbHZhcigpIHtcclxuICAgIGlmICghdGhpcy52YWxpZGFyKCkgJiYgIXRoaXMucGVzc29hKSByZXR1cm5cclxuICAgIGlmICghdGhpcy5zZXJ2aWNlKSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5zZXJ2aWNlLnNhbHZhcih0aGlzLnBlc3NvYSk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJlc3VsdC5zdWJzY3JpYmUoKHJlc3Bvc3RhOmFueSApID0+IHsgICBcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlOyAgIFxyXG4gICAgICAgIHRoaXMucGVzc29hID0gcmVzcG9zdGE7XHJcbiAgICAgIH0sIChlcnIpID0+IHsgdGhpcy5lcnJvKGVycil9ICk7IFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm86IE8gbcOpdG9kbyBzYWx2YXIoKSBuw6NvIHJldG9ybm91IHVtIE9ic2VydmFibGUuXCIpO1xyXG4gICAgfVxyXG4gIH0gXHJcblxyXG4gIHZhbGlkYXIoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKCF0aGlzLnBlc3NvYSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkVycm8gYW8gY2FycmVnYXIgb2JqZXRvIHBlc3NvYVwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS50ZWxlZm9uZXMgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EudGVsZWZvbmVzICE9IG51bGwgJiYgdGhpcy5wZXNzb2EudGVsZWZvbmVzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkRpZ2l0ZSB1bSBDb250YXRvIGUgY2xpcXVlIGVtIEFkaWNpb25hclwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS5lbmRlcmVjb3MgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EuZW5kZXJlY29zICE9IG51bGwgJiYgdGhpcy5wZXNzb2EuZW5kZXJlY29zLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkRpZ2l0ZSB1bSBFbmRlcmXDp28oTG9jYWxpY2FkZSkgZSBjbGlxdWUgZW0gQWRpY2lvbmFyXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLmVtYWlscyA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS5lbWFpbHMgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5lbWFpbHMubGVuZ3RoID09IDApKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiRGlnaXRlIHVtIEUtbWFpbCBlIGNsaXF1ZSBlbSBBZGljaW9uYXJcIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EudGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5GSVNJQ0EpIHtcclxuICAgICAgaWYgKCF0aGlzLnBlc3NvYS5ub21lIHx8ICh0aGlzLnBlc3NvYSAmJiB0aGlzLnBlc3NvYS5ub21lID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJOb21lIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5wZXNzb2EuZGF0YU5hc2NpbWVudG8pIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkRhdGEgZGUgTmFzY2ltZW50byDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRVNUUkFOR0VJUkEpIHtcclxuICAgICAgaWYgKCF0aGlzLnBlc3NvYS5ub21lIHx8ICh0aGlzLnBlc3NvYSAmJiB0aGlzLnBlc3NvYS5ub21lID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJOb21lIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnBlc3NvYS5wYXNzYXBvcnRlID09IG51bGwgfHwgKHRoaXMucGVzc29hLnBhc3NhcG9ydGUgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5wYXNzYXBvcnRlID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJQYXNzYXBvcnRlIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpIHtcclxuICAgICAgaWYgKHRoaXMucGVzc29hLnBhc3NhcG9ydGUgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EucGFzc2Fwb3J0ZSAhPSBudWxsICYmIHRoaXMucGVzc29hLnBhc3NhcG9ydGUgPT0gXCJcIikpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIlBhc3NhcG9ydGUgw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdGVsZWZvbmVzRW1pdHRlZCh0ZWxlZm9uZXM6IFVuYlBlc3NvYVRlbGVmb25lW10pIHtcclxuICAgIHRoaXMucGVzc29hLnRlbGVmb25lcyA9IHRlbGVmb25lcztcclxuICB9XHJcblxyXG4gIGVuZGVyZWNvc0VtaXR0ZWQoZW5kZXJlY29zOiBVbmJQZXNzb2FFbmRlcmVjb1tdKSB7XHJcbiAgICB0aGlzLnBlc3NvYS5lbmRlcmVjb3MgPSBlbmRlcmVjb3M7XHJcbiAgfVxyXG5cclxuICBlbWFpbHNFbWl0dGVkKGVtYWlsczogVW5iUGVzc29hRW1haWxbXSkge1xyXG4gICAgdGhpcy5wZXNzb2EuZW1haWxzID0gZW1haWxzO1xyXG4gIH1cclxuXHJcbiAgbm9ybWFsaXphRXNjb2xhcmlkYWRlKGVzY29sYXJpZGFkZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghZXNjb2xhcmlkYWRlKSByZXR1cm4gJzAnOyAvLyBSZXRvcm5hIFwiTsOjbyBJbmZvcm1hZG9cIiBzZSBlc3RpdmVyIHZhemlvXHJcbiAgICBcclxuICAgIGNvbnN0IHBhcnRlcyA9IGVzY29sYXJpZGFkZS5zcGxpdChcIiAtIFwiKTtcclxuICAgIHJldHVybiBwYXJ0ZXMubGVuZ3RoID4gMSA/IHBhcnRlc1swXS50cmltKCkgOiAnMCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVycm8oZXJybzogYW55KTogdm9pZCB7ICAgIFxyXG4gICAgLy8gY29sb2NvIG8gZXJybyBlbSBuZWdyaXRvXHJcbiAgICB0aGlzLm9wZW5TbmFja0JhcihlcnJvKTsgICAgXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICd4Jywge1xyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdGlwb1Blc3NvYUVudW0oKSB7XHJcbiAgICByZXR1cm4gVGlwb1Blc3NvYUVudW07XHJcbiAgfVxyXG5cclxuICBnZXRMaXN0YUVzdGFkb3MoKSB7XHJcbiAgICByZXR1cm4gbGlzdGFFc3RhZG9zO1xyXG4gIH1cclxufVxyXG4iLCIgIDxkaXYgIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cclxuICAgIDxsaWItdW5iLXBlc3NvYS1wZXNxdWlzYXJcclxuICAgICAgIFthcGlQZXNzb2FDb25maWddPVwiYXBpUGVzc29hQ29uZmlnXCIgXHJcbiAgICAgICBbZGVmYXVsdFRpcG9QZXNzb2FdPVwiZGVmYXVsdFRpcG9QZXNzb2FcIiBcclxuICAgICAgIChwZXNzb2FFbWl0dGVkKT1cInBlc3NvYVJlY2ViaWRhKCRldmVudClcIj48L2xpYi11bmItcGVzc29hLXBlc3F1aXNhcj5cclxuPC9kaXY+XHJcbiAgXHJcbiAgPGZvcm0gI3Blc3NvYUZvcm09XCJuZ0Zvcm1cIiBjbGFzcz1cImZvcm0tY29udGFpbmVyIG10LTJcIiAqbmdJZj1cImJ1c2NhUmVhbGl6YWRhICYmIGFwaVBlc3NvYUNvbmZpZy51cmxcIiAobmdTdWJtaXQpPVwic2FsdmFyKClcIj5cclxuICAgICAgICBcclxuICAgICAgPCEtLSBDYW1wb3MgUGVzc29hIEbDrXNpY2EgZSBFc3RyYW5nZWlyYSAgLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAqbmdJZj1cInBlc3NvYS50aXBvUGVzc29hID09IHRpcG9QZXNzb2FFbnVtKCkuRklTSUNBIHx8IHBlc3NvYS50aXBvUGVzc29hID09IHRpcG9QZXNzb2FFbnVtKCkuRVNUUkFOR0VJUkFcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+Tm9tZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2Eubm9tZVwiIG5hbWU9XCJub21lXCIgI25vbWU9XCJuZ01vZGVsXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+U2V4bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvU2V4b1wiIG5hbWU9XCJjb2RpZ29TZXhvXCIgI2NvZGlnb1NleG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIxXCI+TWFzY3VsaW5vPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMlwiPkZlbWluaW5vPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRhIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRhTmFzY2ltZW50b1BpY2tlclwiIFsobmdNb2RlbCldPVwicGVzc29hLmRhdGFOYXNjaW1lbnRvXCIgbmFtZT1cImRhdGFOYXNjaW1lbnRvXCIgI2RhdGFOYXNjaW1lbnRvPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRhTmFzY2ltZW50b1BpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRhTmFzY2ltZW50b1BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5Fc3RhZG8gQ2l2aWw8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb0VzdGFkb0NpdmlsXCIgbmFtZT1cImNvZGlnb0VzdGFkb0NpdmlsXCIgI2NvZGlnb0VzdGFkb0NpdmlsPVwibmdNb2RlbFwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZXN0YWRvIG9mIGVzdGFkb3NDaXZpbCB8IGFzeW5jXCIgW3ZhbHVlXT1cImVzdGFkby5jb2RpZ29cIj5cclxuICAgICAgICAgICAgICB7eyBlc3RhZG8uZGVub21pbmFjYW8gfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS1cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTE1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+TmF0dXJhbGlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlc3NvYS5uYXR1cmFsaWRhZGVcIiBuYW1lPVwibmF0dXJhbGlkYWRlXCIgI25hdHVyYWxpZGFkZT1cIm5nTW9kZWxcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGNpZGFkZSBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJjaWRhZGUuY29kaWdvXCI+XHJcbiAgICAgICAgICAgICAge3sgY2lkYWRlLmRlc2NyaWNhbyB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+UGHDrXMgTmFzY2ltZW50bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG9cIiBuYW1lPVwiY29kaWdvUGFpc05hc2NpbWVudG9cIiAjY29kaWdvUGFpc05hc2NpbWVudG89XCJuZ01vZGVsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwYWlzTmFzY2ltZW50byBvZiBwYWlzZXMgfCBhc3luY1wiIFt2YWx1ZV09XCJwYWlzTmFzY2ltZW50by5jb2RpZ29cIj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvID09PSAnQlJBU0lMJ1wiPvCfh6fwn4e3IDxiPnt7IHBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvIH19PC9iPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvICE9PSAnQlJBU0lMJ1wiPnt7IHBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiICpuZ0lmPVwicGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvID09IDIyXCI+IDwhLS0gMjIgZWggQnJhc2lsLS0+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlVGIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLnVmTmFzY2ltZW50b1wiIG5hbWU9XCJ1Zk5hc2NpbWVudG9cIiAjdWZOYXNjaW1lbnRvPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdWZOYXNjaW1lbnRvIG9mIGdldExpc3RhRXN0YWRvcygpXCIgW3ZhbHVlXT1cInVmTmFzY2ltZW50b1wiPlxyXG4gICAgICAgICAgICAgIHt7IHVmTmFzY2ltZW50byB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG8gPT0gMjJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+TmF0dXJhbGlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5uYXR1cmFsaWRhZGVcIiBuYW1lPVwibmF0dXJhbGlkYWRlXCIgI25hdHVyYWxpZGFkZT1cIm5nTW9kZWxcIiByZXF1aXJlZC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPkVzY29sYXJpZGFkZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuZXNjb2xhcmlkYWRlXCIgbmFtZT1cImNvZGlnb0VzY29sYXJpZGFkZVwiICNjb2RpZ29Fc2NvbGFyaWRhZGU9XCJuZ01vZGVsXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBlc2NvbGFyaWRhZGUgb2YgZXNjb2xhcmlkYWRlIHwgYXN5bmNcIiBbdmFsdWVdPVwiZXNjb2xhcmlkYWRlLmNvZGlnb1wiPlxyXG4gICAgICAgICAgICAgIHt7IGVzY29sYXJpZGFkZS5kZW5vbWluYWNhbyB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPk5vbWUgU29jaWFsPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lU29jaWFsXCIgbmFtZT1cIm5vbWVTb2NpYWxcIiAjbm9tZVNvY2lhbD1cIm5nTW9kZWxcIiAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5Ob21lIGRhIE3Do2U8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVNYWVcIiBuYW1lPVwibm9tZU1hZVwiICNub21lTWFlPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPk5vbWUgZG8gUGFpPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lUGFpXCIgbmFtZT1cIm5vbWVQYWlcIiAjbm9tZVBhaT1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBDYW1wb3MgUGVzc29hIEp1csOtZGljYSAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlc3NvYS50aXBvUGVzc29hID09PSB0aXBvUGVzc29hRW51bSgpLkpVUklESUNBXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlJhesOjbyBTb2NpYWw8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLnJhemFvU29jaWFsXCIgbmFtZT1cInJhemFvU29jaWFsXCIgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5Ob21lIEZhbnRhc2lhPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lRmFudGFzaWFcIiBuYW1lPVwibm9tZUZhbnRhc2lhXCIgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIFxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVzc29hLnRpcG9QZXNzb2EgPT0gdGlwb1Blc3NvYUVudW0oKS5GSVNJQ0EgfHwgcGVzc29hLnRpcG9QZXNzb2EgPT0gdGlwb1Blc3NvYUVudW0oKS5FU1RSQU5HRUlSQSBcIj5cclxuICAgICAgICA8YiBzdHlsZT1cImZsZXg6IDEgMSAxMDAlOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPkRvY3VtZW50YcOnw6NvPC9iPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+SWRlbnRpZGFkZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucmdcIiBuYW1lPVwicmdcIiAjcmc9XCJuZ01vZGVsXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+w5NyZ8OjbyBFbWlzc29yPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ09yZ2FvXCIgbmFtZT1cInJnT3JnYW9cIiAjcmdPcmdhbz1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5VbmlkYWRlIEZlZGVyYXRpdmE8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLnJnVWZcIiBuYW1lPVwicmdVZlwiICNyZ1VmPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY2lkYWRlIG9mIGdldExpc3RhRXN0YWRvcygpXCIgW3ZhbHVlXT1cImNpZGFkZS5pZGVudGlmaWNhZG9yXCI+XHJcbiAgICAgICAgICAgICAge3sgY2lkYWRlLmlkZW50aWZpY2Fkb3IgfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5EYXRhIGRlIEVtaXNzw6NvPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ0RhdGFFbWlzc2FvXCIgbmFtZT1cInJnRGF0YUVtaXNzYW9cIlxyXG4gICAgICAgICAgICAjcmdEYXRhRW1pc3Nhbz1cIm5nTW9kZWxcIiAvPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlc3NvYS50aXBvUGVzc29hID09IHRpcG9QZXNzb2FFbnVtKCkuRVNUUkFOR0VJUkEgXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlBhw61zIFBhc3NhcG9ydGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb1BhaXNQYXNzYXBvcnRlXCIgbmFtZT1cImNvZGlnb1BhaXNQYXNzYXBvcnRlXCIgI2NvZGlnb1BhaXNQYXNzYXBvcnRlPVwibmdNb2RlbFwiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcGFpc05hc2NpbWVudG8gb2YgcGFpc2VzIHwgYXN5bmNcIiBbdmFsdWVdPVwicGFpc05hc2NpbWVudG8uY29kaWdvXCI+XHJcbiAgICAgICAgICAgICAge3sgcGFpc05hc2NpbWVudG8uZGVub21pbmFjYW8gfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPk7Dum1lcm8gUGFzc2Fwb3J0ZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucGFzc2Fwb3J0ZVwiIG5hbWU9XCJwYXNzYXBvcnRlXCIgI3Bhc3NhcG9ydGU9XCJuZ01vZGVsXCIgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxiIHN0eWxlPVwiZmxleDogMSAxIDEwMCU7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+IENvbnRhdG88L2I+XHJcblxyXG4gICAgICA8bGliLXVuYi1wZXNzb2EtdGVsZWZvbmUtbGlzdCBzdHlsZT1cImZsZXg6IDEgMSAxMDAlO1wiIFthcGlQZXNzb2FDb25maWddPVwiYXBpUGVzc29hQ29uZmlnXCIgW3RlbGVmb25lc109XCJwZXNzb2EudGVsZWZvbmVzXCIgKHRlbGVmb25lc0VtaXR0ZWQpPVwidGVsZWZvbmVzRW1pdHRlZCgkZXZlbnQpXCIgPjwvbGliLXVuYi1wZXNzb2EtdGVsZWZvbmUtbGlzdD5cclxuXHJcbiAgICAgIDxsaWItdW5iLXBlc3NvYS1lbmRlcmVjby1saXN0IHN0eWxlPVwiZmxleDogMSAxIDEwMCU7XCIgW2FwaVBlc3NvYUNvbmZpZ109XCJhcGlQZXNzb2FDb25maWdcIiBbZW5kZXJlY29zXT1cInBlc3NvYS5lbmRlcmVjb3NcIiAoZW5kZXJlY29zRW1pdHRlZCk9XCJlbmRlcmVjb3NFbWl0dGVkKCRldmVudClcIiA+PC9saWItdW5iLXBlc3NvYS1lbmRlcmVjby1saXN0PlxyXG5cclxuICAgICAgPGxpYi11bmItcGVzc29hLWVtYWlsLWxpc3Qgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJTtcIiBbYXBpUGVzc29hQ29uZmlnXT1cImFwaVBlc3NvYUNvbmZpZ1wiIFtlbWFpbHNdPVwicGVzc29hLmVtYWlsc1wiIChlbWFpbHNFbWl0dGVkKT1cImVtYWlsc0VtaXR0ZWQoJGV2ZW50KVwiID48L2xpYi11bmItcGVzc29hLWVtYWlsLWxpc3Q+XHJcbiBcclxuICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgY2xhc3M9XCJjYXJkLWFjdGlvbnMtYnV0dG9uc1wiICpuZ0lmPVwiYnVzY2FSZWFsaXphZGFcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBkaXNhYmxlZD1cInt7aXNMb2FkaW5nfX1cIiB0eXBlPVwic3VibWl0XCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgICAgICBTYWx2YXJcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxyXG4gICAgXHJcbiAgPC9mb3JtPlxyXG5cclxuIl19
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VuYi1saWItY29tcG9uZW50cy9zcmMvbGliL3VuYi1wZXNzb2EvdW5iLXBlc3NvYS1mb3JtL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmItbGliLWNvbXBvbmVudHMvc3JjL2xpYi91bmItcGVzc29hL3VuYi1wZXNzb2EtZm9ybS91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBS25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFzQixtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNsRyxNQUFNLE9BQU8sc0JBQXNCO0lBd0JqQyxZQUFvQixPQUF5QixFQUFVLFFBQXFCLEVBQVUsWUFBZ0M7UUFBbEcsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBdkJ0SCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxJQUFJLGlC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bnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGxpc3RhRXN0YWRvcyB9IGZyb20gJy4uL3Blc3NvYS10YWJlbGFzLWFwb2lvJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW1haWwgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVtYWlsLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW5kZXJlY28gfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVuZGVyZWNvLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRXNjb2xhcmlkYWRlIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc2NvbGFyaWRhZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc3RhZG9DaXZpbCB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXN0YWRvLWNpdmlsLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hUGFpcyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtcGFpcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVRlbGVmb25lIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS10ZWxlZm9uZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYU1vZGVsIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuQlBlc3NvYVNlcnZpY2UsIFVuYlBlc3NvYUVycm9QYWRyYW8gfSBmcm9tICcuLi91bmItcGVzc29hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaXBvUGVzc29hRW51bSB9IGZyb20gJy4uL3VuYi10aXBvLXBlc3NvYS5lbnVtJztcclxuaW1wb3J0IHsgVW5iTWVuc2FnZW1TZXJ2aWNlLCBVbmJUaXBvTWVuc2FnZW1FbnVtIH0gZnJvbSAnLi4vLi4vdW5iLW1lbnNhZ2VtL3VuYi1tZW5zYWdlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdW5iLXBlc3NvYS1mb3JtJyxcclxuICBzdGFuZGFsb25lOiBmYWxzZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVbmJQZXNzb2FGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBidXNjYVJlYWxpemFkYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVuZGVyZWNvID0gbmV3IFVuYlBlc3NvYUVuZGVyZWNvKCk7XHJcbiAgZW1haWwgPSBuZXcgVW5iUGVzc29hRW1haWwoKTtcclxuXHJcbiAgdGlwb3NQZXNzb2EgPSBUaXBvUGVzc29hRW51bTtcclxuXHJcbiAgcGVzc29hOiBVbmJQZXNzb2FNb2RlbCA9IG5ldyBVbmJQZXNzb2FNb2RlbCgpOyAvLyBpbmljaWFsaXphIGNvbSBwZXNzb2FcclxuICBkYWRvc1NhbHZvczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9OyAvLyBBcm1hemVuYSBvcyBkYWRvcyBhbyB0cm9jYXIgZGUgdGlwb1xyXG5cclxuICAvLyBRdWFuZG8gdmVyZGFkZWlybywgbyBmb3JtdWzDoXJpbyBlIGHDp8O1ZXMgZmljYW0gZGVzYWJpbGl0YWRvcyBwb3JxdWUgb3MgZGFkb3NcclxuICAvLyBkZXZlbSBzZXIgYWx0ZXJhZG9zIGFwZW5hcyBwZWxvIGFwcCBTb3VHb3YgKG1hdHJpY3VsYSBTSUFQRSBwcmVzZW50ZSlcclxuICBpc1JlYWRvbmx5RnJvbVNpYXBlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGJhY2tlbmRVUkw6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgZGVmYXVsdFRpcG9QZXNzb2EhOiBUaXBvUGVzc29hRW51bTtcclxuICBASW5wdXQoKSBwZXNxdWlzYXJQb3JDUEYgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBlc3F1aXNhclBvckNOUEogPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBlc3F1aXNhclBvckVzdHJhbmdlaXJvID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW1wb1Blc3F1aXNhTWF4V2lkdGg6IHN0cmluZyA9ICc0MDBweCc7XHJcblxyXG4gIEBPdXRwdXQoKSBwZXNzb2FFbWl0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxVbmJQZXNzb2FNb2RlbD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBVbkJQZXNzb2FTZXJ2aWNlLCBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IFVuYk1lbnNhZ2VtU2VydmljZSkgeyB9XHJcblxyXG4gIC8vIHRhYmVsYXMgdHJhZGljaW9uYWlzIHF1ZSB2ZW0gZG8gYmFja2VuZFxyXG4gIGVzY29sYXJpZGFkZSE6IE9ic2VydmFibGU8VW5iUGVzc29hRXNjb2xhcmlkYWRlW10+O1xyXG4gIHBhaXNlcyE6IE9ic2VydmFibGU8VW5iUGVzc29hUGFpc1tdPjtcclxuICBlc3RhZG9zQ2l2aWwhOiBPYnNlcnZhYmxlPFVuYlBlc3NvYUVzdGFkb0NpdmlsW10+O1xyXG5cclxuICBpZE1lbnNhZ2VtU2VydmljZSA9IFwidW5iUGVzc29hRm9ybVwiO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmhpZGVNZXNzYWdlKHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG4gICAgaWYgKHRoaXMuYmFja2VuZFVSTCA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3JQcmludENvbnNvbGUoXCJbVW5iUGVzc29hUGVzcXVpc2FyQ29tcG9uZW50XSBFUlJPUjogYXBpUGVzc29hQ29uZmlnLnVybCBlc3TDoSBudWxsLiBJbnNpcmEgbyBwYXLDom1ldHJvIChhcGlQZXNzb2FDb25maWcpIGNvbSBvIHZhbG9yIHbDoWxpZG8hXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VydmljZS5zZXRCYWNrZW5kVXJsKHRoaXMuYmFja2VuZFVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXRlbmNhbywgbyBwZXNzb2FSZWNlYmlkYSBxdWUgaW5pY2lhbGl6YSBlc3NlIGNvbXBvbmVudGVcclxuICAgIHRoaXMuZXNjb2xhcmlkYWRlID0gdGhpcy5zZXJ2aWNlLmdldEVzY29sYXJpZGFkZSgpO1xyXG4gICAgdGhpcy5wYWlzZXMgPSB0aGlzLnNlcnZpY2UuZ2V0UGFpc2VzKCk7XHJcbiAgICB0aGlzLmVzdGFkb3NDaXZpbCA9IHRoaXMuc2VydmljZS5nZXRFc3RhZG9DaXZpbCgpO1xyXG4gIH1cclxuICBcclxuICBwZXNzb2FSZWNlYmlkYShwZXNzb2FSZWNlYmlkYTogVW5iUGVzc29hTW9kZWwpIHtcclxuICAgIHRoaXMuYnVzY2FSZWFsaXphZGEgPSB0cnVlO1xyXG4gICAgdGhpcy5wZXNzb2EgPSBwZXNzb2FSZWNlYmlkYTtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmhpZGVNZXNzYWdlKHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG5cclxuICAgIC8vIGluaWNpYWxpemEgcHJhIG5hbyBxdWVicmFyXHJcbiAgICBpZiAoIXRoaXMucGVzc29hLmVuZGVyZWNvcykgdGhpcy5wZXNzb2EuZW5kZXJlY29zID0gW107XHJcbiAgICBpZiAoIXRoaXMucGVzc29hLmVtYWlscykgdGhpcy5wZXNzb2EuZW1haWxzID0gW107XHJcbiAgICBpZiAoIXRoaXMucGVzc29hLnRlbGVmb25lcykgdGhpcy5wZXNzb2EudGVsZWZvbmVzID0gW107XHJcblxyXG4gICAgLy8gU2UgYSBwZXNzb2EgdmllciBjb20gbWF0cmljdWxhU2lhcGUgcHJlZW5jaGlkbywgY29sb2NhbW9zIG8gZm9ybXVsw6FyaW8gZW0gbW9kbyBzb21lbnRlLWxlaXR1cmFcclxuICAgIC8vIGUgbW9zdHJhcmVtb3MgdW1hIG1lbnNhZ2VtIGluZm9ybWF0aXZhIG5hIFVJLiBUYW1iw6ltIGRlc2FiaWxpdGEgYcOnw7VlcyBkZSBzYWx2YXIuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EgJiYgdGhpcy5wZXNzb2EubWF0cmljdWxhU2lhcGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBlc3NvYS5tYXRyaWN1bGFTaWFwZSAhPT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5tYXRyaWN1bGFTaWFwZSAhPT0gMCkge1xyXG4gICAgICB0aGlzLmlzUmVhZG9ubHlGcm9tU2lhcGUgPSB0cnVlO1xyXG4gICAgICAvLyBvcGNpb25hbDogaW5mb3JtYXIgdmlhIHNuYWNrQmFyIHRhbWLDqW1cclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoJ1NlcnZpZG9yIGNvbSBtYXRyaWN1bGxhIFNJQVBFIGRldmUgdGVyIHNldXMgZGFkb3MgYXV0YWxpemFkb3MgcGVsbyBhcGxpY2F0aXZvIGRvIHNvdWdvdi4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNSZWFkb25seUZyb21TaWFwZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FsdmFyKGZvcm06IE5nRm9ybSkge1xyXG4gICAgdGhpcy5hbGVydFNlcnZpY2UuaGlkZU1lc3NhZ2UodGhpcy5pZE1lbnNhZ2VtU2VydmljZSk7XHJcblxyXG4gICAgLy8gU3VhcyB2YWxpZGHDp8O1ZXNcclxuICAgIGlmICghdGhpcy52YWxpZGFyKGZvcm0pKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNvbnZlcnRQZXNzb2FUb1BheWxvYWQodGhpcy5wZXNzb2EpO1xyXG5cclxuICAgIC8vIE8gc2VydmljZSBqw6EgdGVtIG8gLnBpcGUoY2F0Y2hFcnJvcikgaW50ZXJubywgZW50w6NvIG8gZXJybyBjaGVnYSB0cmF0YWRvXHJcbiAgICB0aGlzLnNlcnZpY2Uuc2FsdmFyKHBheWxvYWQsIHRoaXMucGVzc29hLnRpcG9QZXNzb2EpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb3N0YSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIE1lbnNhZ2VtIGRlIFN1Y2Vzc29cclxuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3dNZXNzYWdlKFwiPHN0cm9uZz5SZWdpc3RybyBzYWx2byBjb20gc3VjZXNzbyE8L3N0cm9uZz5cIiwgVW5iVGlwb01lbnNhZ2VtRW51bS5TVUNDRVNTLCB0aGlzLmlkTWVuc2FnZW1TZXJ2aWNlKTtcclxuXHJcbiAgICAgICAgICAvLyBBdHVhbGl6YSBkYWRvcyByZXRvcm5hZG9zIChJRHMgZ2VyYWRvcylcclxuICAgICAgICAgIGlmIChyZXNwb3N0YSkge1xyXG4gICAgICAgICAgICB0aGlzLnBlc3NvYS5jb2RpZ29QZXNzb2EgPSByZXNwb3N0YS5jb2RpZ29QZXNzb2EgfHwgdGhpcy5wZXNzb2EuY29kaWdvUGVzc29hO1xyXG4gICAgICAgICAgICB0aGlzLnBlc3NvYS5pZFBlc3NvYSA9IHJlc3Bvc3RhLmlkUGVzc29hIHx8IHRoaXMucGVzc29hLmlkUGVzc29hO1xyXG4gICAgICAgICAgICB0aGlzLnBlc3NvYUVtaXR0ZWQuZW1pdCh0aGlzLnBlc3NvYSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogVW5iUGVzc29hRXJyb1BhZHJhbykgPT4ge1xyXG4gICAgICAgICAgLy8gQVFVSTogTyAnZXJyJyBqw6EgY2hlZ2EgbGltcG8gY29tIHsgbWVuc2FnZW1TaW1wbGVzLCBtZW5zYWdlbUh0bWwgfVxyXG4gICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyKGZvcm06IE5nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnBlc3NvYSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkVycm8gYW8gY2FycmVnYXIgb2JqZXRvIHBlc3NvYVwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtLmludmFsaWQpIHtcclxuICAgICAgLy8gcGFyYSBxdWUgb3MgZXJyb3MgYXBhcmXDp2FtIG5hIHRlbGEgcGFyYSBvIHVzdcOhcmlvLlxyXG4gICAgICBmb3JtLmNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIlBvciBmYXZvciwgcHJlZW5jaGEgb3MgY2FtcG9zIG9icmlnYXTDs3Jpb3MuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRlbGVmb25lcyA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS50ZWxlZm9uZXMgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS50ZWxlZm9uZXMubGVuZ3RoID09IDApKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiQ2FkYXN0cmUgcGVsbyBtZW5vcyB1bSB0ZWxlZm9uZSBubyBib3TDo28gQ2FkYXN0cmFyIE5vdm8gVGVsZWZvbmVcIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EuZW5kZXJlY29zID09IG51bGwgfHwgKHRoaXMucGVzc29hLmVuZGVyZWNvcyAhPSBudWxsICYmIHRoaXMucGVzc29hLmVuZGVyZWNvcy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJDYWRhc3RyZSBwZWxvIG1lbm9zIHVtIGVuZGVyZcOnbyBubyBib3TDo28gQ2FkYXN0cmFyIE5vdm8gRW5kZXJlw6dvXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLmVtYWlscyA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS5lbWFpbHMgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5lbWFpbHMubGVuZ3RoID09IDApKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiQ2FkYXN0cmUgcGVsbyBtZW5vcyB1bSBlLW1haWwgbm8gYm90w6NvIENhZGFzdHJhciBOb3ZvIEVtYWlsXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRklTSUNBKSB7XHJcbiAgICAgIGlmICghdGhpcy5wZXNzb2Eubm9tZSB8fCAodGhpcy5wZXNzb2EgJiYgdGhpcy5wZXNzb2Eubm9tZSA9PSBcIlwiKSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiTm9tZSDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMucGVzc29hLmRhdGFOYXNjaW1lbnRvKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJEYXRhIGRlIE5hc2NpbWVudG8gw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS50aXBvUGVzc29hID09IFRpcG9QZXNzb2FFbnVtLkVTVFJBTkdFSVJBKSB7XHJcbiAgICAgIGlmICghdGhpcy5wZXNzb2Eubm9tZSB8fCAodGhpcy5wZXNzb2EgJiYgdGhpcy5wZXNzb2Eubm9tZSA9PSBcIlwiKSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiTm9tZSDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5wZXNzb2EucGFzc2Fwb3J0ZSA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS5wYXNzYXBvcnRlICE9IG51bGwgJiYgdGhpcy5wZXNzb2EucGFzc2Fwb3J0ZSA9PSBcIlwiKSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiUGFzc2Fwb3J0ZSDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uSlVSSURJQ0EpIHtcclxuICAgICAgaWYgKHRoaXMucGVzc29hLmNucGogPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EuY25waiAhPSBudWxsICYmIHRoaXMucGVzc29hLmNucGogPT0gXCJcIikpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkNOUEogw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdGVsZWZvbmVzRW1pdHRlZCh0ZWxlZm9uZXM6IFVuYlBlc3NvYVRlbGVmb25lW10pIHtcclxuICAgIHRoaXMucGVzc29hLnRlbGVmb25lcyA9IHRlbGVmb25lcztcclxuICB9XHJcblxyXG4gIGVuZGVyZWNvc0VtaXR0ZWQoZW5kZXJlY29zOiBVbmJQZXNzb2FFbmRlcmVjb1tdKSB7XHJcbiAgICB0aGlzLnBlc3NvYS5lbmRlcmVjb3MgPSBlbmRlcmVjb3M7XHJcbiAgfVxyXG5cclxuICBlbWFpbHNFbWl0dGVkKGVtYWlsczogVW5iUGVzc29hRW1haWxbXSkge1xyXG4gICAgdGhpcy5wZXNzb2EuZW1haWxzID0gZW1haWxzO1xyXG4gIH1cclxuXHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICd4Jywge1xyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdGlwb1Blc3NvYUVudW0oKSB7XHJcbiAgICByZXR1cm4gVGlwb1Blc3NvYUVudW07XHJcbiAgfVxyXG5cclxuICBnZXRMaXN0YUVzdGFkb3MoKSB7XHJcbiAgICByZXR1cm4gbGlzdGFFc3RhZG9zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIENvbnZlcnRlIHVtYSBpbnN0w6JuY2lhIChvdSBvYmpldG8pIGRlIFVuYlBlc3NvYU1vZGVsIHBhcmEgbyBwYXlsb2FkIGVzcGVyYWRvIHBlbG8gYmFja2VuZC5cclxuICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0UGVzc29hVG9QYXlsb2FkKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBhbnkge1xyXG4gICAgaWYgKCFwZXNzb2EpIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIC0tLSBNYXBlaWEgb3MgYXJyYXlzIC0tLVxyXG4gICAgY29uc3QgZW5kZXJlY29zUGF5bG9hZCA9IChwZXNzb2EuZW5kZXJlY29zIHx8IFtdKS5tYXAoKGVuZDogYW55KSA9PiAoe1xyXG4gICAgICBvcmRlbUVuZGVyZWNvOiBlbmQub3JkZW1FbmRlcmVjbyxcclxuICAgICAgdGlwb0VuZGVyZWNvQ29kaWdvOiBlbmQudGlwb0VuZGVyZWNvQ29kaWdvLFxyXG4gICAgICBtdW5pY2lwaW9Db2RpZ286IGVuZC5tdW5pY2lwaW9Db2RpZ28sXHJcbiAgICAgIHBhaXNFbmRlcmVjb0NvZGlnbzogZW5kLnBhaXNFbmRlcmVjb0NvZGlnbyxcclxuICAgICAgbG9ncmFkb3VybzogZW5kLmxvZ3JhZG91cm8sXHJcbiAgICAgIGNvbXBsZW1lbnRvOiBlbmQuY29tcGxlbWVudG8sXHJcbiAgICAgIGNlcDogZW5kLmNlcCxcclxuICAgICAgYmFpcnJvOiBlbmQuYmFpcnJvLFxyXG4gICAgICB1ZkVuZGVyZWNvOiBlbmQudWZFbmRlcmVjbyxcclxuICAgICAgY2FpeGFQb3N0YWw6IGVuZC5jYWl4YVBvc3RhbCxcclxuICAgICAgY29ycmVzcG9uZGVuY2lhOiBlbmQuY29ycmVzcG9uZGVuY2lhXHJcbiAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgdGVsZWZvbmVzUGF5bG9hZCA9IChwZXNzb2EudGVsZWZvbmVzIHx8IFtdKS5tYXAoKHRlbDogYW55KSA9PiAoe1xyXG4gICAgICBvcmRlbVRlbGVmb25lOiB0ZWwub3JkZW0sXHJcbiAgICAgIHRpcG9UZWxlZm9uZUNvZGlnbzogdGVsLnRpcG9UZWxlZm9uZUNvZGlnbyxcclxuICAgICAgZGRpOiB0ZWwuZGRpLFxyXG4gICAgICBkZGQ6IHRlbC5kZGQsXHJcbiAgICAgIG51bWVyb1RlbGVmb25lOiB0ZWwubnVtZXJvLFxyXG4gICAgICByYW1hbDogdGVsLnJhbWFsLFxyXG4gICAgICBhdXRvcml6YVNNUzogdGVsLmF1dG9yaXphU01TXHJcbiAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgZW1haWxzUGF5bG9hZCA9IChwZXNzb2EuZW1haWxzIHx8IFtdKS5tYXAoKGVtYWlsOiBhbnkpID0+ICh7XHJcbiAgICAgIHRpcG9FbWFpbENvZGlnbzogZW1haWwudGlwb0VtYWlsQ29kaWdvLFxyXG4gICAgICBvcmRlbUVtYWlsOiBlbWFpbC5vcmRlbSxcclxuICAgICAgZW1haWw6IGVtYWlsLmVtYWlsLFxyXG4gICAgICBhdXRvcml6YWNhbzogZW1haWwuYXV0b3JpemFjYW9cclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyAtLS0gTW9udGEgbyBvYmpldG8gcHJpbmNpcGFsIC0tLVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWRQZXNzb2E6IHBlc3NvYS5pZFBlc3NvYSxcclxuICAgICAgY29kaWdvUGVzc29hOiBwZXNzb2EuY29kaWdvUGVzc29hLFxyXG5cclxuICAgICAgbm9tZTogcGVzc29hLm5vbWUsXHJcbiAgICAgIG5vbWVTb2NpYWw6IHBlc3NvYS5ub21lU29jaWFsLFxyXG4gICAgICAvLyBBZGljaW9uYSBhIGNoYXZlICdjcGYnIGFvIG9iamV0byBTT01FTlRFIFNFIHBlc3NvYS5jcGYgZm9yIHRydXRoeVxyXG4gICAgICAuLi4ocGVzc29hLmNwZiAmJiB7IGNwZjogcGVzc29hLmNwZi5yZXBsYWNlKC9cXEQvZywgJycpIH0pLFxyXG4gICAgICBjb2RpZ29TZXhvOiBwZXNzb2EuY29kaWdvU2V4byxcclxuICAgICAgY29kaWdvRXN0YWRvQ2l2aWw6IHBlc3NvYS5jb2RpZ29Fc3RhZG9DaXZpbCxcclxuICAgICAgY29kaWdvRXNjb2xhcmlkYWRlOiBwZXNzb2EuZXNjb2xhcmlkYWRlLFxyXG4gICAgICAvLyBjb2RpZ29UaXBvU2FuZ3VpbmVvOiBwZXNzb2EudGlwb1Nhbmd1aW5lbyxcclxuICAgICAgbm9tZVBhaTogcGVzc29hLm5vbWVQYWksXHJcbiAgICAgIG5vbWVNYWU6IHBlc3NvYS5ub21lTWFlLFxyXG5cclxuICAgICAgZGF0YU5hc2NpbWVudG86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLmRhdGFOYXNjaW1lbnRvKSxcclxuICAgICAgY29kaWdvUGFpc05hc2NpbWVudG86IHBlc3NvYS5jb2RpZ29QYWlzTmFzY2ltZW50byxcclxuICAgICAgdWZOYXNjaW1lbnRvOiBwZXNzb2EudWZOYXNjaW1lbnRvLFxyXG4gICAgICBuYXR1cmFsaWRhZGU6IHBlc3NvYS5uYXR1cmFsaWRhZGUsXHJcblxyXG4gICAgICByZzogcGVzc29hLnJnLFxyXG4gICAgICByZ09yZ2FvOiBwZXNzb2EucmdPcmdhbyxcclxuICAgICAgcmdVZjogcGVzc29hLnJnVWYsXHJcbiAgICAgIHJnRGF0YUVtaXNzYW86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLnJnRGF0YUVtaXNzYW8pLFxyXG5cclxuICAgICAgbnVtZXJvVGl0dWxvRWxlaXRvcjogcGVzc29hLm51bWVyb1RpdHVsb0VsZWl0b3IsXHJcbiAgICAgIGRhdGFFbWlzc2FvVGl0dWxvRWxlaXRvcjogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YUVtaXNzYW9UaXR1bG9FbGVpdG9yKSxcclxuICAgICAgem9uYVRpdHVsb0VsZWl0b3I6IHBlc3NvYS56b25hVGl0dWxvRWxlaXRvcixcclxuICAgICAgc2VjYW9UaXR1bG9FbGVpdG9yOiBwZXNzb2Euc2VjYW9UaXR1bG9FbGVpdG9yLFxyXG4gICAgICB1ZlRpdHVsb0VsZWl0b3I6IHBlc3NvYS51ZlRpdHVsb0VsZWl0b3IsXHJcblxyXG4gICAgICBudW1lcm9SZXNlcnZpc3RhOiBwZXNzb2EubnVtZXJvUmVzZXJ2aXN0YSxcclxuICAgICAgc2VyaWVSZXNlcnZpc3RhOiBwZXNzb2Euc2VyaWVSZXNlcnZpc3RhLFxyXG4gICAgICBvcmdhb1Jlc2VydmlzdGE6IHBlc3NvYS5vcmdhb1Jlc2VydmlzdGEsXHJcblxyXG4gICAgICBudW1lcm9DYXJ0ZWlyYVRyYWJhbGhvOiBwZXNzb2EubnVtZXJvQ2FydGVpcmFUcmFiYWxobyxcclxuICAgICAgc2VyaWVDYXJ0ZWlyYVRyYWJhbGhvOiBwZXNzb2Euc2VyaWVDYXJ0ZWlyYVRyYWJhbGhvLFxyXG4gICAgICB1ZkNhcnRlaXJhVHJhYmFsaG86IHBlc3NvYS51ZkNhcnRlaXJhVHJhYmFsaG8sXHJcbiAgICAgIHBpc1Bhc2VwOiBwZXNzb2EucGlzUGFzZXAsXHJcblxyXG4gICAgICBudW1lcm9IYWJpbGl0YWNhbzogcGVzc29hLm51bWVyb0hhYmlsaXRhY2FvLFxyXG4gICAgICByZWdpc3Ryb0hhYmlsaXRhY2FvOiBwZXNzb2EucmVnaXN0cm9IYWJpbGl0YWNhbyxcclxuICAgICAgZGF0YUVtaXNzYW9IYWJpbGl0YWNhbzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YUVtaXNzYW9IYWJpbGl0YWNhbyksXHJcbiAgICAgIGRhdGFWYWxpZGFkZUhhYmlsaXRhY2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5kYXRhVmFsaWRhZGVIYWJpbGl0YWNhbyksXHJcbiAgICAgIGNhdGVnb3JpYUhhYmlsaXRhY2FvOiBwZXNzb2EuY2F0ZWdvcmlhSGFiaWxpdGFjYW8sXHJcbiAgICAgIGRlZmljaWVuY2lhRmlzaWNhSGFiaWxpdGFjYW86IHBlc3NvYS5kZWZpY2llbmNpYUZpc2ljYUhhYmlsaXRhY2FvLFxyXG4gICAgICBwcmltZWlyYUhhYmlsaXRhY2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5wcmltZWlyYUhhYmlsaXRhY2FvKSxcclxuXHJcbiAgICAgIHBhc3NhcG9ydGU6IHBlc3NvYS5wYXNzYXBvcnRlLFxyXG4gICAgICBjb2RpZ29QYWlzUGFzc2Fwb3J0ZTogcGVzc29hLmNvZGlnb1BhaXNQYXNzYXBvcnRlLFxyXG4gICAgICAvLyBBZGljaW9uYSBhIGNoYXZlICdjbnBqJyBhbyBvYmpldG8gU09NRU5URSBTRSBwZXNzb2EuY25waiBmb3IgdHJ1dGh5XHJcbiAgICAgIC4uLihwZXNzb2EuY25waiAmJiB7IGNucGo6IHBlc3NvYS5jbnBqLnJlcGxhY2UoL1xcRC9nLCAnJykgfSksXHJcbiAgICAgIHJhemFvU29jaWFsOiBwZXNzb2EucmF6YW9Tb2NpYWwsXHJcbiAgICAgIG5vbWVGYW50YXNpYTogcGVzc29hLm5vbWVGYW50YXNpYSxcclxuICAgICAgc2lnbGE6IHBlc3NvYS5zaWdsYSxcclxuICAgICAgcGFnaW5hV2ViOiBwZXNzb2EucGFnaW5hV2ViLFxyXG5cclxuICAgICAgYXV0b0NhZGFzdHJvOiBwZXNzb2EuYXV0b0NhZGFzdHJvLFxyXG5cclxuICAgICAgZW5kZXJlY29zOiBlbmRlcmVjb3NQYXlsb2FkLFxyXG4gICAgICB0ZWxlZm9uZXM6IHRlbGVmb25lc1BheWxvYWQsXHJcbiAgICAgIGVtYWlsczogZW1haWxzUGF5bG9hZFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdGEgYSBkYXRhIG5vIHBhZHLDo28gREQvTU0vWVlZWSBwYXJhIG8gYmFja2VuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKGRhdGE6IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcclxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgJiYgZGF0YS5pbmNsdWRlcygnLycpKSByZXR1cm4gZGF0YTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0YSk7XHJcbiAgICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgY29uc3QgZGlhID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBjb25zdCBtZXMgPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgY29uc3QgYW5vID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICByZXR1cm4gYCR7ZGlhfS8ke21lc30vJHthbm99YDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yUHJpbnRDb25zb2xlKGVycm86IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coZXJybyk7XHJcbiAgICB0aGlzLmhhbmRsZUVycm9yKGVycm8pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IoZXJybzogVW5iUGVzc29hRXJyb1BhZHJhbykge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyAxLiBNb3N0cmEgYSBtZW5zYWdlbSBjdXJ0YS9zaW1wbGVzIG5vIFNuYWNrQmFyIChGdW5kbyBkYSB0ZWxhKVxyXG4gICAgLy8gRXg6IFwiTyBmb3JtdWzDoXJpbyBwb3NzdWkgZXJyb3MgZGUgdmFsaWRhw6fDo28uXCIgb3UgXCJTZXNzw6NvIGV4cGlyYWRhLlwiXHJcbiAgICBpZiAoZXJyby5tZW5zYWdlbVNpbXBsZXMpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoZXJyby5tZW5zYWdlbVNpbXBsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIE1vc3RyYSBhIG1lbnNhZ2VtIGRldGFsaGFkYSBIVE1MIG5vIGNvbXBvbmVudGUgPHVuYi1tZW5zYWdlbT5cclxuICAgIC8vIEV4OiBMaXN0YSBjb20gPHVsPjxsaT5DYW1wbyBEYXRhIGludsOhbGlkby4uLjwvbGk+PC91bD5cclxuICAgIGlmICh0aGlzLmFsZXJ0U2VydmljZSAmJiBlcnJvLm1lbnNhZ2VtSHRtbCkge1xyXG4gICAgICAvLyBTZSBvIHNldSBhbGVydFNlcnZpY2Ugc3Vwb3J0YXIgSUQgZG8gY29tcG9uZW50ZSBhbHZvLCBwYXNzZSBhcXVpLlxyXG4gICAgICAvLyBDYXNvIGNvbnRyw6FyaW8sIGVsZSBtb3N0cmEgbm8gY29tcG9uZW50ZSBwYWRyw6NvLlxyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93TWVzc2FnZShlcnJvLm1lbnNhZ2VtSHRtbCwgVW5iVGlwb01lbnNhZ2VtRW51bS5EQU5HRVIsIHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG4iLCI8bWF0LXByb2dyZXNzLWJhciAqbmdJZj1cImlzTG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG5cclxuPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgW2NsYXNzLmRpc2FibGVkLXdyYXBwZXJdPVwiaXNMb2FkaW5nXCI+XHJcbiAgPGxpYi11bmItcGVzc29hLXBlc3F1aXNhciBcclxuICAgIFtiYWNrZW5kVVJMXT1cImJhY2tlbmRVUkxcIiBcclxuICAgIFtkZWZhdWx0VGlwb1Blc3NvYV09XCJkZWZhdWx0VGlwb1Blc3NvYVwiXHJcbiAgICBbcGVzcXVpc2FyUG9yQ05QSl09XCJwZXNxdWlzYXJQb3JDTlBKXCJcclxuICAgIFtwZXNxdWlzYXJQb3JDUEZdPVwicGVzcXVpc2FyUG9yQ1BGXCJcclxuICAgIFtwZXNxdWlzYXJQb3JFc3RyYW5nZWlyb109XCJwZXNxdWlzYXJQb3JFc3RyYW5nZWlyb1wiXHJcbiAgICBbY2FtcG9QZXNxdWlzYU1heFdpZHRoXT1cImNhbXBvUGVzcXVpc2FNYXhXaWR0aFwiIChwZXNzb2FFbWl0dGVkKT1cInBlc3NvYVJlY2ViaWRhKCRldmVudClcIj5cclxuICA8L2xpYi11bmItcGVzc29hLXBlc3F1aXNhcj5cclxuPC9kaXY+XHJcblxyXG48dW5iLW1lbnNhZ2VtIFtpZGVudGlmaWNhZG9yXT1cImlkTWVuc2FnZW1TZXJ2aWNlXCI+PC91bmItbWVuc2FnZW0+XHJcblxyXG48Zm9ybSAjcGVzc29hRm9ybT1cIm5nRm9ybVwiIFtjbGFzcy5yZWFkb25seV09XCJpc1JlYWRvbmx5RnJvbVNpYXBlIHx8IGlzTG9hZGluZ1wiIGNsYXNzPVwiZm9ybS1jb250YWluZXIgbXQtMlwiXHJcbiAgKm5nSWY9XCJidXNjYVJlYWxpemFkYVwiIChuZ1N1Ym1pdCk9XCJzYWx2YXIocGVzc29hRm9ybSlcIj5cclxuXHJcbiAgPCEtLSBDYW1wb3MgUGVzc29hIEbDrXNpY2EgZSBFc3RyYW5nZWlyYSAgLS0+XHJcbiAgPG5nLWNvbnRhaW5lclxyXG4gICAgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkZJU0lDQSB8fCBwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkVTVFJBTkdFSVJBXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Ob21lPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVcIiBuYW1lPVwibm9tZVwiICNub21lPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPlNleG88L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvU2V4b1wiIG5hbWU9XCJjb2RpZ29TZXhvXCIgI2NvZGlnb1NleG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjFcIj5NYXNjdWxpbm88L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj5GZW1pbmlubzwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTE1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5EYXRhIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cImRhdGFOYXNjaW1lbnRvUGlja2VyXCIgWyhuZ01vZGVsKV09XCJwZXNzb2EuZGF0YU5hc2NpbWVudG9cIiBuYW1lPVwiZGF0YU5hc2NpbWVudG9cIlxyXG4gICAgICAgICNkYXRhTmFzY2ltZW50bz1cIm5nTW9kZWxcIiByZXF1aXJlZD5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRhTmFzY2ltZW50b1BpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGFOYXNjaW1lbnRvUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPkVzdGFkbyBDaXZpbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlc3NvYS5jb2RpZ29Fc3RhZG9DaXZpbFwiIG5hbWU9XCJjb2RpZ29Fc3RhZG9DaXZpbFwiICNjb2RpZ29Fc3RhZG9DaXZpbD1cIm5nTW9kZWxcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZXN0YWRvIG9mIGVzdGFkb3NDaXZpbCB8IGFzeW5jXCIgW3ZhbHVlXT1cImVzdGFkby5jb2RpZ29cIj5cclxuICAgICAgICAgIHt7IGVzdGFkby5kZW5vbWluYWNhbyB9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPk5hdHVyYWxpZGFkZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EubmF0dXJhbGlkYWRlXCIgbmFtZT1cIm5hdHVyYWxpZGFkZVwiICNuYXR1cmFsaWRhZGU9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjaWRhZGUgb2YgZ2V0TGlzdGFFc3RhZG9zKClcIiBbdmFsdWVdPVwiY2lkYWRlLmNvZGlnb1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNpZGFkZS5kZXNjcmljYW8gfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgLS0+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5QYcOtcyBOYXNjaW1lbnRvPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvXCIgbmFtZT1cImNvZGlnb1BhaXNOYXNjaW1lbnRvXCIgI2NvZGlnb1BhaXNOYXNjaW1lbnRvPVwibmdNb2RlbFwiXHJcbiAgICAgICAgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBhaXNOYXNjaW1lbnRvIG9mIHBhaXNlcyB8IGFzeW5jXCIgW3ZhbHVlXT1cInBhaXNOYXNjaW1lbnRvLmNvZGlnb1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyA9PT0gJ0JSQVNJTCdcIj7wn4en8J+HtyA8Yj57eyBwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyB9fTwvYj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvICE9PSAnQlJBU0lMJ1wiPnt7IHBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiAqbmdJZj1cInBlc3NvYS5jb2RpZ29QYWlzTmFzY2ltZW50byA9PSAyMlwiPiA8IS0tIDIyIGVoIEJyYXNpbC0tPlxyXG4gICAgICA8bWF0LWxhYmVsPlVGIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EudWZOYXNjaW1lbnRvXCIgbmFtZT1cInVmTmFzY2ltZW50b1wiICN1Zk5hc2NpbWVudG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHVmTmFzY2ltZW50byBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJ1Zk5hc2NpbWVudG8uaWRlbnRpZmljYWRvclwiPlxyXG4gICAgICAgICAge3sgdWZOYXNjaW1lbnRvLmlkZW50aWZpY2Fkb3IgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG8gPT0gMjJcIj5cclxuICAgICAgPG1hdC1sYWJlbD5OYXR1cmFsaWRhZGU8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EubmF0dXJhbGlkYWRlXCIgbmFtZT1cIm5hdHVyYWxpZGFkZVwiICNuYXR1cmFsaWRhZGU9XCJuZ01vZGVsXCJcclxuICAgICAgICByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Fc2NvbGFyaWRhZGU8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuZXNjb2xhcmlkYWRlXCIgbmFtZT1cImNvZGlnb0VzY29sYXJpZGFkZVwiICNjb2RpZ29Fc2NvbGFyaWRhZGU9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVzY29sYXJpZGFkZSBvZiBlc2NvbGFyaWRhZGUgfCBhc3luY1wiIFt2YWx1ZV09XCJlc2NvbGFyaWRhZGUuY29kaWdvXCI+XHJcbiAgICAgICAgICB7eyBlc2NvbGFyaWRhZGUuZGVub21pbmFjYW8gfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBTb2NpYWw8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2Eubm9tZVNvY2lhbFwiIG5hbWU9XCJub21lU29jaWFsXCIgI25vbWVTb2NpYWw9XCJuZ01vZGVsXCIgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBkYSBNw6NlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVNYWVcIiBuYW1lPVwibm9tZU1hZVwiICNub21lTWFlPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPk5vbWUgZG8gUGFpPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVQYWlcIiBuYW1lPVwibm9tZVBhaVwiICNub21lUGFpPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIENhbXBvcyBQZXNzb2EgSnVyw61kaWNhIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PT0gdGlwb1Blc3NvYUVudW0oKS5KVVJJRElDQVwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+UmF6w6NvIFNvY2lhbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yYXphb1NvY2lhbFwiIG5hbWU9XCJyYXphb1NvY2lhbFwiIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBGYW50YXNpYTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lRmFudGFzaWFcIiBuYW1lPVwibm9tZUZhbnRhc2lhXCIgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkZJU0lDQVwiPlxyXG4gICAgPGIgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5Eb2N1bWVudGHDp8OjbzwvYj5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5JZGVudGlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLnJnXCIgbmFtZT1cInJnXCIgI3JnPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPsOTcmfDo28gRW1pc3NvcjwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ09yZ2FvXCIgbmFtZT1cInJnT3JnYW9cIiAjcmdPcmdhbz1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5VbmlkYWRlIEZlZGVyYXRpdmE8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EucmdVZlwiIG5hbWU9XCJyZ1VmXCIgI3JnVWY9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGNpZGFkZSBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJjaWRhZGUuaWRlbnRpZmljYWRvclwiPlxyXG4gICAgICAgICAge3sgY2lkYWRlLmlkZW50aWZpY2Fkb3IgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+RGF0YSBkZSBFbWlzc8OjbzwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ0RhdGFFbWlzc2FvXCIgbmFtZT1cInJnRGF0YUVtaXNzYW9cIiAjcmdEYXRhRW1pc3Nhbz1cIm5nTW9kZWxcIiAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlc3NvYS50aXBvUGVzc29hID09IHRpcG9QZXNzb2FFbnVtKCkuRVNUUkFOR0VJUkEgXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+RGF0YSBDaGVnYWRhIEJyYXNpbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwiZGF0YUNoZWdhZGFCcmFzaWxQaWNrZXJcIiBbKG5nTW9kZWwpXT1cInBlc3NvYS5kYXRhQ2hlZ2FkYUJyYXNpbFwiXHJcbiAgICAgICAgbmFtZT1cImRhdGFDaGVnYWRhQnJhc2lsXCIgI2RhdGFDaGVnYWRhQnJhc2lsPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGFDaGVnYWRhQnJhc2lsUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0YUNoZWdhZGFCcmFzaWxQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+UGHDrXMgUGFzc2Fwb3J0ZTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlc3NvYS5jb2RpZ29QYWlzUGFzc2Fwb3J0ZVwiIG5hbWU9XCJjb2RpZ29QYWlzUGFzc2Fwb3J0ZVwiICNjb2RpZ29QYWlzUGFzc2Fwb3J0ZT1cIm5nTW9kZWxcIlxyXG4gICAgICAgIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwYWlzTmFzY2ltZW50byBvZiBwYWlzZXMgfCBhc3luY1wiIFt2YWx1ZV09XCJwYWlzTmFzY2ltZW50by5jb2RpZ29cIj5cclxuICAgICAgICAgIHt7IHBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvIH19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Ow7ptZXJvIFBhc3NhcG9ydGU8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucGFzc2Fwb3J0ZVwiIG5hbWU9XCJwYXNzYXBvcnRlXCIgI3Bhc3NhcG9ydGU9XCJuZ01vZGVsXCIgcmVxdWlyZWQgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxsaWItdW5iLXBlc3NvYS10ZWxlZm9uZS1saXN0IHN0eWxlPVwiZmxleDogMSAxIDEwMCU7XCIgW2JhY2tlbmRVUkxdPVwiYmFja2VuZFVSTFwiXHJcbiAgICBbdGVsZWZvbmVzXT1cInBlc3NvYS50ZWxlZm9uZXNcIiAodGVsZWZvbmVzRW1pdHRlZCk9XCJ0ZWxlZm9uZXNFbWl0dGVkKCRldmVudClcIj48L2xpYi11bmItcGVzc29hLXRlbGVmb25lLWxpc3Q+XHJcblxyXG4gIDxsaWItdW5iLXBlc3NvYS1lbmRlcmVjby1saXN0IHN0eWxlPVwiZmxleDogMSAxIDEwMCU7XCIgW2JhY2tlbmRVUkxdPVwiYmFja2VuZFVSTFwiXHJcbiAgICBbZW5kZXJlY29zXT1cInBlc3NvYS5lbmRlcmVjb3NcIiAoZW5kZXJlY29zRW1pdHRlZCk9XCJlbmRlcmVjb3NFbWl0dGVkKCRldmVudClcIj48L2xpYi11bmItcGVzc29hLWVuZGVyZWNvLWxpc3Q+XHJcblxyXG4gIDxsaWItdW5iLXBlc3NvYS1lbWFpbC1saXN0IHN0eWxlPVwiZmxleDogMSAxIDEwMCU7XCIgW2JhY2tlbmRVUkxdPVwiYmFja2VuZFVSTFwiIFtlbWFpbHNdPVwicGVzc29hLmVtYWlsc1wiXHJcbiAgICAoZW1haWxzRW1pdHRlZCk9XCJlbWFpbHNFbWl0dGVkKCRldmVudClcIj48L2xpYi11bmItcGVzc29hLWVtYWlsLWxpc3Q+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJpc1JlYWRvbmx5RnJvbVNpYXBlXCIgc3R5bGU9XCJmbGV4OjEgMSAxMDAlOyBtYXJnaW4tYm90dG9tOjEwcHg7XCI+XHJcbiAgICA8bWF0LWNhcmQ+XHJcbiAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgIDxzdHJvbmc+U2Vydmlkb3IgY29tIG1hdHLDrWN1bGEgU0lBUEUgZGV2ZSB0ZXIgc2V1cyBkYWRvcyBhdXRhbGl6YWRvcyBwZWxvIGFwbGljYXRpdm8gZG8gc291Z292PC9zdHJvbmc+XHJcbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgIDwvbWF0LWNhcmQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtY2FyZC1hY3Rpb25zIGNsYXNzPVwiY2FyZC1hY3Rpb25zLWJ1dHRvbnNcIiAqbmdJZj1cImJ1c2NhUmVhbGl6YWRhXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8IGlzUmVhZG9ubHlGcm9tU2lhcGVcIiB0eXBlPVwic3VibWl0XCIgY29sb3I9XCJwcmltYXJ5XCI+XHJcbiAgICAgIFNhbHZhclxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9tYXQtY2FyZC1hY3Rpb25zPlxyXG5cclxuPC9mb3JtPiJdfQ==
|