@stiunb/unb-lib-components 18.0.23 → 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 +60 -29
- package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +98 -67
- package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +57 -73
- package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +49 -36
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +57 -29
- package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +4 -4
- package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +141 -45
- package/fesm2022/stiunb-unb-lib-components.mjs +467 -309
- package/fesm2022/stiunb-unb-lib-components.mjs.map +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 +6 -2
- package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.d.ts +2 -5
- package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.d.ts +6 -3
- package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.d.ts +2 -5
- package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +8 -8
- package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +8 -8
- package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.d.ts +6 -4
- package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.d.ts +2 -5
- package/lib/unb-pessoa/unb-pessoa.service.d.ts +9 -13
- package/package.json +1 -1
|
@@ -7,54 +7,145 @@ import * as i1 from "@angular/common/http";
|
|
|
7
7
|
export class UnBPessoaService {
|
|
8
8
|
constructor(http) {
|
|
9
9
|
this.http = http;
|
|
10
|
-
|
|
11
|
-
this.
|
|
10
|
+
// Armazena apenas a string da URL. Inicializa vazio.
|
|
11
|
+
this.backendUrlSubject = new BehaviorSubject('');
|
|
12
|
+
// Exposta como Observable (caso algum componente queira se inscrever)
|
|
13
|
+
this.backendUrl$ = this.backendUrlSubject.asObservable();
|
|
14
|
+
// -------------------------------------------------------------------
|
|
15
|
+
// HANDLE ERROR PADRONIZADO
|
|
16
|
+
// -------------------------------------------------------------------
|
|
17
|
+
this.handleError = (error) => {
|
|
18
|
+
let mensagemSimples = 'Ocorreu um erro ao processar a requisição!';
|
|
19
|
+
let mensagemHtml = '<strong>Ocorreu um erro desconhecido.</strong>';
|
|
20
|
+
// 2. Descobre quem é o corpo do erro
|
|
21
|
+
let errorBody;
|
|
22
|
+
if (error.detalhes || error.codigoStatus) {
|
|
23
|
+
// CASO 1: O Interceptor já desembrulhou o erro (é o JSON puro)
|
|
24
|
+
errorBody = error;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// CASO 2: É um HttpErrorResponse padrão (tem a propriedade .error)
|
|
28
|
+
errorBody = error.error || error;
|
|
29
|
+
}
|
|
30
|
+
// 3. Lógica de Limpeza e Parse (se for string suja)
|
|
31
|
+
if (typeof errorBody === 'string') {
|
|
32
|
+
try {
|
|
33
|
+
errorBody = JSON.parse(errorBody);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
const start = errorBody.indexOf('{');
|
|
37
|
+
const end = errorBody.lastIndexOf('}');
|
|
38
|
+
if (start > -1 && end > start) {
|
|
39
|
+
try {
|
|
40
|
+
errorBody = JSON.parse(errorBody.substring(start, end + 1));
|
|
41
|
+
}
|
|
42
|
+
catch (e2) {
|
|
43
|
+
// Se falhar o parse, usa o texto como mensagem
|
|
44
|
+
mensagemSimples = errorBody.substring(0, 200);
|
|
45
|
+
mensagemHtml = `<strong>${errorBody}</strong>`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 4. Formatação baseada no JSON identificado
|
|
51
|
+
if (errorBody && typeof errorBody === 'object') {
|
|
52
|
+
// A: Erros de Validação
|
|
53
|
+
if (errorBody.detalhes && Array.isArray(errorBody.detalhes) && errorBody.detalhes.length > 0) {
|
|
54
|
+
mensagemSimples = "O formulário possui erros de validação.";
|
|
55
|
+
const listaErros = errorBody.detalhes.map((d) => `<li><strong>${d.nomeCampo || 'Campo'}:</strong> ${d.critica || d.mensagem}</li>`).join('');
|
|
56
|
+
mensagemHtml = `<strong>Erros de Validação:</strong> <ul>${listaErros}</ul>`;
|
|
57
|
+
}
|
|
58
|
+
// B: Erro Genérico com mensagem
|
|
59
|
+
else {
|
|
60
|
+
const msgBackend = errorBody.mensagem || errorBody.message || errorBody.detail;
|
|
61
|
+
if (msgBackend) {
|
|
62
|
+
mensagemSimples = msgBackend;
|
|
63
|
+
mensagemHtml = `<strong>${msgBackend}</strong>`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 5. Tratamentos de Status HTTP (Se o wrapper original tiver status)
|
|
68
|
+
// Nota: Se o interceptor desembrulhou, 'error.status' pode não existir,
|
|
69
|
+
// mas 'errorBody.codigoStatus' (do Java) pode existir.
|
|
70
|
+
const status = error.status || errorBody?.codigoStatus || 0;
|
|
71
|
+
if (status === 401) {
|
|
72
|
+
mensagemSimples = "Sessão expirada.";
|
|
73
|
+
mensagemHtml = "<strong>Sessão expirada. Faça login novamente.</strong>";
|
|
74
|
+
}
|
|
75
|
+
else if (status === 403) {
|
|
76
|
+
mensagemSimples = "Acesso Negado.";
|
|
77
|
+
mensagemHtml = "<strong>Você não tem permissão para realizar esta ação.</strong>";
|
|
78
|
+
}
|
|
79
|
+
const erroFormatado = {
|
|
80
|
+
status: status,
|
|
81
|
+
mensagemSimples,
|
|
82
|
+
mensagemHtml
|
|
83
|
+
};
|
|
84
|
+
console.warn('[UnBPessoaService] Erro formatado final:', erroFormatado);
|
|
85
|
+
return throwError(() => erroFormatado);
|
|
86
|
+
};
|
|
12
87
|
}
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
88
|
+
// Setter agora recebe string direta
|
|
89
|
+
setBackendUrl(url) {
|
|
90
|
+
// Tratamento remove barra no final para padronizar
|
|
91
|
+
if (url.endsWith('/')) {
|
|
92
|
+
url = url.slice(0, -1);
|
|
93
|
+
}
|
|
94
|
+
this.backendUrlSubject.next(url);
|
|
16
95
|
}
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
return this.
|
|
96
|
+
// Getter retorna string direta
|
|
97
|
+
getBackendUrl() {
|
|
98
|
+
return this.backendUrlSubject.getValue();
|
|
20
99
|
}
|
|
21
100
|
// Headers padrão
|
|
22
101
|
getHeaders() {
|
|
23
|
-
const { token } = this.getApiConfig();
|
|
24
102
|
return {
|
|
25
103
|
headers: new HttpHeaders({
|
|
26
|
-
'Content-Type': 'application/json'
|
|
27
|
-
Authorization: `Bearer ${token}`
|
|
104
|
+
'Content-Type': 'application/json'
|
|
28
105
|
})
|
|
29
106
|
};
|
|
30
107
|
}
|
|
31
108
|
// Métodos de busca
|
|
32
109
|
findByCpf(cpf) {
|
|
33
|
-
const url = `${this.
|
|
110
|
+
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?cpf=${cpf}`;
|
|
34
111
|
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
35
112
|
}
|
|
36
113
|
findByCnpj(cnpj) {
|
|
37
|
-
const url = `${this.
|
|
114
|
+
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?cnpj=${cnpj}`;
|
|
38
115
|
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
39
116
|
}
|
|
40
117
|
findByPassaporte(passaporte) {
|
|
41
|
-
const url = `${this.
|
|
118
|
+
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?passaporte=${passaporte}`;
|
|
42
119
|
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
43
120
|
}
|
|
44
121
|
findPessoaFisicaById(id) {
|
|
45
|
-
const url = `${this.
|
|
122
|
+
const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas/${id}`;
|
|
46
123
|
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
47
124
|
}
|
|
48
125
|
pesquisarCep(cep) {
|
|
49
|
-
const url = `${this.
|
|
126
|
+
const url = `${this.getBackendUrl()}/pessoa-api/public/busca-cep/servico-1/${cep}`;
|
|
50
127
|
return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
|
|
51
128
|
}
|
|
52
129
|
// Salvar (decide fisica ou juridica)
|
|
53
130
|
salvar(payload, tipoPessoa) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
131
|
+
// (Para o componente conseguir ler .mensagemSimples e .mensagemHtml)
|
|
132
|
+
if (!payload) {
|
|
133
|
+
return throwError(() => ({
|
|
134
|
+
status: 400,
|
|
135
|
+
mensagemSimples: 'Erro interno: Dados para salvamento inválidos (Payload null).',
|
|
136
|
+
mensagemHtml: '<strong>Erro interno:</strong> Tentativa de salvar dados vazios.'
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
if (!tipoPessoa) {
|
|
140
|
+
return throwError(() => ({
|
|
141
|
+
status: 400,
|
|
142
|
+
mensagemSimples: 'Erro interno: Tipo de pessoa não definido.',
|
|
143
|
+
mensagemHtml: '<strong>Erro interno:</strong> O tipo de pessoa é obrigatório para salvar.'
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
// 2. Delegação
|
|
147
|
+
// Como savePessoaFisica e savePessoaJuridica JÁ TÊM o .pipe(catchError),
|
|
148
|
+
// aqui nós apenas retornamos o Observable deles. O erro subirá tratado.
|
|
58
149
|
if (tipoPessoa == TipoPessoaEnum.FISICA || tipoPessoa == TipoPessoaEnum.ESTRANGEIRA) {
|
|
59
150
|
return this.savePessoaFisica(payload);
|
|
60
151
|
}
|
|
@@ -65,41 +156,51 @@ export class UnBPessoaService {
|
|
|
65
156
|
}
|
|
66
157
|
// Salvar Pessoa Física
|
|
67
158
|
savePessoaFisica(pessoa) {
|
|
68
|
-
const url = this.
|
|
159
|
+
const url = this.getBackendUrl();
|
|
69
160
|
const httpOptions = this.getHeaders();
|
|
70
161
|
const body = JSON.stringify(pessoa);
|
|
162
|
+
// Variável para armazenar o Observable antes de retornar
|
|
163
|
+
let request$;
|
|
71
164
|
if (pessoa.codigoPessoa == null) {
|
|
72
|
-
|
|
165
|
+
request$ = this.http.post(`${url}/pessoa-api/pessoas/fisicas`, body, httpOptions);
|
|
73
166
|
}
|
|
74
167
|
else {
|
|
75
|
-
|
|
168
|
+
request$ = this.http.put(`${url}/pessoa-api/pessoas/fisicas/${pessoa.codigoPessoa}`, body, httpOptions);
|
|
76
169
|
}
|
|
170
|
+
// Antes de retornar, passamos pelo 'pipe' para tratar o erro se ele ocorrer.
|
|
171
|
+
return request$.pipe(catchError(this.handleError));
|
|
77
172
|
}
|
|
78
173
|
// Salvar Pessoa Jurídica
|
|
79
174
|
savePessoaJuridica(pessoa) {
|
|
80
|
-
const url = this.
|
|
175
|
+
const url = this.getBackendUrl();
|
|
81
176
|
const httpOptions = this.getHeaders();
|
|
82
177
|
const body = JSON.stringify(pessoa);
|
|
178
|
+
let request$;
|
|
83
179
|
if (pessoa.codigoPessoa == null) {
|
|
84
|
-
|
|
180
|
+
request$ = this.http.post(`${url}/pessoa-api/pessoas/juridicas`, body, httpOptions);
|
|
85
181
|
}
|
|
86
182
|
else {
|
|
87
|
-
|
|
183
|
+
request$ = this.http.put(`${url}/pessoa-api/pessoas/juridicas/${pessoa.codigoPessoa}`, body, httpOptions);
|
|
88
184
|
}
|
|
185
|
+
return request$.pipe(catchError(this.handleError));
|
|
89
186
|
}
|
|
90
187
|
// Dados auxiliares públicos
|
|
91
188
|
getEscolaridade() {
|
|
92
|
-
return this.http.get(`${this.
|
|
189
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/escolaridades/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
|
|
190
|
+
);
|
|
93
191
|
}
|
|
94
192
|
getEstadoCivil() {
|
|
95
|
-
return this.http.get(`${this.
|
|
193
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/estados-civis/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
|
|
194
|
+
);
|
|
96
195
|
}
|
|
97
196
|
getMunicipios() {
|
|
98
|
-
return this.http.get(`${this.
|
|
197
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/municipios/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
|
|
198
|
+
);
|
|
99
199
|
}
|
|
100
200
|
getPaises() {
|
|
101
|
-
return this.http.get(`${this.
|
|
201
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/paises/listagem?&page=0&size=200&sort=denominacao,asc`).pipe(map(response => {
|
|
102
202
|
return response.content.sort((a, b) => {
|
|
203
|
+
// ... sua lógica de ordenação ...
|
|
103
204
|
const nomeA = a?.denominacao?.toUpperCase() || '';
|
|
104
205
|
const nomeB = b?.denominacao?.toUpperCase() || '';
|
|
105
206
|
if (nomeA === 'BRASIL')
|
|
@@ -108,31 +209,31 @@ export class UnBPessoaService {
|
|
|
108
209
|
return 1;
|
|
109
210
|
return nomeA.localeCompare(nomeB);
|
|
110
211
|
});
|
|
111
|
-
}));
|
|
212
|
+
}), catchError(this.handleError));
|
|
112
213
|
}
|
|
113
214
|
getRacaCor() {
|
|
114
|
-
return this.http.get(`${this.
|
|
215
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/etnias/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
115
216
|
codigo: index, // gera um código numérico sequencial
|
|
116
217
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
117
|
-
}))));
|
|
218
|
+
}))), catchError(this.handleError));
|
|
118
219
|
}
|
|
119
220
|
getTipoEmail() {
|
|
120
|
-
return this.http.get(`${this.
|
|
221
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
121
222
|
codigo: index, // gera um código numérico sequencial
|
|
122
223
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
123
|
-
}))));
|
|
224
|
+
}))), catchError(this.handleError));
|
|
124
225
|
}
|
|
125
226
|
getTipoEndereco() {
|
|
126
|
-
return this.http.get(`${this.
|
|
227
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-endereco/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
127
228
|
codigo: index, // gera um código numérico sequencial
|
|
128
229
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
129
|
-
}))));
|
|
230
|
+
}))), catchError(this.handleError));
|
|
130
231
|
}
|
|
131
232
|
getTipoTelefone() {
|
|
132
|
-
return this.http.get(`${this.
|
|
233
|
+
return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-telefone/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
|
|
133
234
|
codigo: index, // gera um código numérico sequencial
|
|
134
235
|
denominacao: this.formatarLabel(item) // formata se quiser
|
|
135
|
-
}))));
|
|
236
|
+
}))), catchError(this.handleError));
|
|
136
237
|
}
|
|
137
238
|
formatarLabel(text) {
|
|
138
239
|
return text
|
|
@@ -140,11 +241,6 @@ export class UnBPessoaService {
|
|
|
140
241
|
.replace(/_/g, ' ')
|
|
141
242
|
.replace(/\b\w/g, l => l.toUpperCase());
|
|
142
243
|
}
|
|
143
|
-
// Handler de erro padrão
|
|
144
|
-
handleError(error) {
|
|
145
|
-
console.error('[UnBPessoaService] Erro na chamada HTTP:', error);
|
|
146
|
-
return throwError(() => error);
|
|
147
|
-
}
|
|
148
244
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
149
245
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, providedIn: 'root' }); }
|
|
150
246
|
}
|
|
@@ -154,4 +250,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
|
|
|
154
250
|
providedIn: 'root'
|
|
155
251
|
}]
|
|
156
252
|
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFTeEQsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBSDVCLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFpQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkcsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVWLENBQUM7SUFFekMsaUNBQWlDO0lBQ2pDLFlBQVksQ0FBQyxNQUFzQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxpQkFBaUI7SUFDVCxVQUFVO1FBQ2hCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLFdB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QUFNOzsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjYXRjaEVycm9yLCBtYXAsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVtYWlsVGlwbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lbWFpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVuZGVyZWNvLCBVbmJQZXNzb2FFbmRlcmVjb1RpcG8gfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc2NvbGFyaWRhZGUgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXNjb2xhcmlkYWRlLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hTW9kZWwgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EubW9kZWwnO1xyXG5pbXBvcnQgeyBUaXBvUGVzc29hRW51bSB9IGZyb20gJy4vdW5iLXRpcG8tcGVzc29hLmVudW0nO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FQYWlzIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXBhaXMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNdW5pbmNpcGlvIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLW11bmljaXBpbyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzdGFkb0NpdmlsIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVzdGFkby1jaXZpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVRlbGVmb25lVGlwbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS10ZWxlZm9uZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVbkJQZXNzb2FTZXJ2aWNlIHtcclxuICBcclxuXHJcbiAgcHJpdmF0ZSBhcGlDb25maWdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHVybDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0+KHsgdXJsOiAnJywgdG9rZW46ICcnIH0pO1xyXG4gIGFwaUNvbmZpZyQgPSB0aGlzLmFwaUNvbmZpZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XHJcblxyXG4gIC8vIEF0dWFsaXphIGEgY29uZmlndXJhw6fDo28gZ2xvYmFsXHJcbiAgc2V0QXBpQ29uZmlnKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgdG9rZW46IHN0cmluZyB9KSB7XHJcbiAgICB0aGlzLmFwaUNvbmZpZ1N1YmplY3QubmV4dChjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0b3JuYSBhIGNvbmZpZ3VyYcOnw6NvIGF0dWFsXHJcbiAgZ2V0QXBpQ29uZmlnKCk6IHsgdXJsOiBzdHJpbmc7IHRva2VuOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlDb25maWdTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBIZWFkZXJzIHBhZHLDo29cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKSB7XHJcbiAgICBjb25zdCB7IHRva2VuIH0gPSB0aGlzLmdldEFwaUNvbmZpZygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gTcOpdG9kb3MgZGUgYnVzY2FcclxuICBmaW5kQnlDcGYoY3BmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y3BmPSR7Y3BmfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZEJ5UGFzc2Fwb3J0ZShwYXNzYXBvcnRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/cGFzc2Fwb3J0ZT0ke3Bhc3NhcG9ydGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYUJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhcy8ke2lkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHBlc3F1aXNhckNlcChjZXA6IHN0cmluZykge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvcHVibGljL2J1c2NhLWNlcC9zZXJ2aWNvLTEvJHtjZXB9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVuZGVyZWNvPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIChkZWNpZGUgZmlzaWNhIG91IGp1cmlkaWNhKVxyXG4gIHNhbHZhcihwYXlsb2FkOiBhbnksIHRpcG9QZXNzb2E6IFRpcG9QZXNzb2FFbnVtKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbCB8IG51bGw+IHtcclxuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdFcnJvIExvY2FsOiBQYXlsb2FkIG7Do28gcG9kZSBzZXIgbnVsbCcpKTtcclxuICAgIGlmICghdGlwb1Blc3NvYSkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdFcnJvIExvY2FsOiBUaXBvIHBlc3NvYSBuw6NvIHBvZGUgc2VyIG51bGwnKSk7XHJcblxyXG4gICAgaWYgKHRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRklTSUNBIHx8IHRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRVNUUkFOR0VJUkEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2F2ZVBlc3NvYUZpc2ljYShwYXlsb2FkKTtcclxuICAgIH0gZWxzZSBpZiAodGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5KVVJJRElDQSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zYXZlUGVzc29hSnVyaWRpY2EocGF5bG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIFBlc3NvYSBGw61zaWNhXHJcbiAgcHJpdmF0ZSBzYXZlUGVzc29hRmlzaWNhKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFwaUNvbmZpZygpLnVybDtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGVzc29hKTtcclxuXHJcbiAgICBpZiAocGVzc29hLmNvZGlnb1Blc3NvYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhc2AsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzLyR7cGVzc29hLmNvZGlnb1Blc3NvYX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEp1csOtZGljYVxyXG4gIHByaXZhdGUgc2F2ZVBlc3NvYUp1cmlkaWNhKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFwaUNvbmZpZygpLnVybDtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGVzc29hKTtcclxuXHJcbiAgICBpZiAocGVzc29hLmNvZGlnb1Blc3NvYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VW5iUGVzc29hTW9kZWw+KGAke3VybH0vcGVzc29hLWFwaS9wZXNzb2FzL2p1cmlkaWNhcy8ke3Blc3NvYS5jb2RpZ29QZXNzb2F9YCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRGFkb3MgYXV4aWxpYXJlcyBww7pibGljb3NcclxuICBwdWJsaWMgZ2V0RXNjb2xhcmlkYWRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXNjb2xhcmlkYWRlW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9lc2NvbGFyaWRhZGVzL2xpc3RhZ2VtYCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RXN0YWRvQ2l2aWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FFc3RhZG9DaXZpbFtdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wdWJsaWMvZXN0YWRvcy1jaXZpcy9saXN0YWdlbWApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE11bmljaXBpb3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNdW5pbmNpcGlvW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9tdW5pY2lwaW9zL2xpc3RhZ2VtYCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFpc2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBjb250ZW50OiBVbmJQZXNzb2FQYWlzW10gfT4oXHJcbiAgICAgIGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9wYWlzZXMvbGlzdGFnZW0/JnBhZ2U9MCZzaXplPTIwMCZzb3J0PWRlbm9taW5hY2FvLGFzY2BcclxuICAgICkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuY29udGVudC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBub21lQSA9IGE/LmRlbm9taW5hY2FvPy50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgY29uc3Qgbm9tZUIgPSBiPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuXHJcbiAgICAgICAgICBpZiAobm9tZUEgPT09ICdCUkFTSUwnKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAobm9tZUIgPT09ICdCUkFTSUwnKSByZXR1cm4gMTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gbm9tZUEubG9jYWxlQ29tcGFyZShub21lQik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0UmFjYUNvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wdWJsaWMvZXRuaWFzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpXHJcbiAgICApOyAgXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb0VtYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3RpcG9zLWVtYWlsL3B1YmxpYy9saXN0YWdlbWAgKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSlcclxuICAgICk7XHJcbiAgfSAgXHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvRW5kZXJlY28oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvdGlwb3MtZW5kZXJlY28vcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9UZWxlZm9uZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS90aXBvcy10ZWxlZm9uZS9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGFyTGFiZWwodGV4dDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGV4dFxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXy9nLCAnICcpXHJcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgbCA9PiBsLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEhhbmRsZXIgZGUgZXJybyBwYWRyw6NvXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVW5CUGVzc29hU2VydmljZV0gRXJybyBuYSBjaGFtYWRhIEhUVFA6JywgZXJyb3IpO1xyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gIH1cclxufSJdfQ==
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXBGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBZ0J4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBTzNCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFMcEMscURBQXFEO1FBQzdDLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELHNFQUFzRTtRQUN0RSxnQkFBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQTJOcEQsc0VBQXNFO1FBQ3RFLDRCQUE0QjtRQUM1QixzRUFBc0U7UUFDL0QsZ0JBQVcsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2xDLElBQUksZUFBZSxHQUFHLDRDQUE0QyxDQUFDO1lBQ25FLElBQUksWUFBWSxHQUFHLGdEQUFnRCxDQUFDO1lBRXBFLHFDQUFxQztZQUNyQyxJQUFJLFNBQWMsQ0FBQztZQUVuQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QywrREFBK0Q7Z0JBQy9ELFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLG1FQUFtRTtnQkFD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LENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs4R0E3TlUsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbmRlcmVjbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lbmRlcmVjby5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzY29sYXJpZGFkZSB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc2NvbGFyaWRhZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNb2RlbCB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS5tb2RlbCc7XHJcbmltcG9ydCB7IFRpcG9QZXNzb2FFbnVtIH0gZnJvbSAnLi91bmItdGlwby1wZXNzb2EuZW51bSc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVBhaXMgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtcGFpcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYU11bmluY2lwaW8gfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtbXVuaWNpcGlvJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRXN0YWRvQ2l2aWwgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXN0YWRvLWNpdmlsLm1vZGVsJztcclxuXHJcblxyXG4vLyBJbnRlcmZhY2UgcGFyYSBwYWRyb25pemFyIG8gZXJybyBxdWUgY2hlZ2Egbm9zIGNvbXBvbmVudGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgVW5iUGVzc29hRXJyb1BhZHJhbyB7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbiAgbWVuc2FnZW1TaW1wbGVzOiBzdHJpbmc7IC8vIFBhcmEgdXNhciBubyBTbmFja0JhclxyXG4gIG1lbnNhZ2VtSHRtbDogc3RyaW5nOyAgICAvLyBQYXJhIHVzYXIgbm8gQWxlcnRTZXJ2aWNlIChjb20gPHVsPiwgPGxpPiwgPHN0cm9uZz4pXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuQlBlc3NvYVNlcnZpY2Uge1xyXG5cclxuICAvLyBBcm1hemVuYSBhcGVuYXMgYSBzdHJpbmcgZGEgVVJMLiBJbmljaWFsaXphIHZhemlvLlxyXG4gIHByaXZhdGUgYmFja2VuZFVybFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG4gIC8vIEV4cG9zdGEgY29tbyBPYnNlcnZhYmxlIChjYXNvIGFsZ3VtIGNvbXBvbmVudGUgcXVlaXJhIHNlIGluc2NyZXZlcilcclxuICBiYWNrZW5kVXJsJCA9IHRoaXMuYmFja2VuZFVybFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XHJcblxyXG4gIC8vIFNldHRlciBhZ29yYSByZWNlYmUgc3RyaW5nIGRpcmV0YVxyXG4gIHNldEJhY2tlbmRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIC8vIFRyYXRhbWVudG8gcmVtb3ZlIGJhcnJhIG5vIGZpbmFsIHBhcmEgcGFkcm9uaXphclxyXG4gICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCAtMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhY2tlbmRVcmxTdWJqZWN0Lm5leHQodXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciByZXRvcm5hIHN0cmluZyBkaXJldGFcclxuICBnZXRCYWNrZW5kVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kVXJsU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVhZGVycyBwYWRyw6NvXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gTcOpdG9kb3MgZGUgYnVzY2FcclxuICBmaW5kQnlDcGYoY3BmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y3BmPSR7Y3BmfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZEJ5UGFzc2Fwb3J0ZShwYXNzYXBvcnRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/cGFzc2Fwb3J0ZT0ke3Bhc3NhcG9ydGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYUJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhcy8ke2lkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHBlc3F1aXNhckNlcChjZXA6IHN0cmluZykge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcHVibGljL2J1c2NhLWNlcC9zZXJ2aWNvLTEvJHtjZXB9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVuZGVyZWNvPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIChkZWNpZGUgZmlzaWNhIG91IGp1cmlkaWNhKVxyXG4gIHNhbHZhcihwYXlsb2FkOiBhbnksIHRpcG9QZXNzb2E6IFRpcG9QZXNzb2FFbnVtKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbCB8IG51bGw+IHtcclxuXHJcbiAgICAvLyAoUGFyYSBvIGNvbXBvbmVudGUgY29uc2VndWlyIGxlciAubWVuc2FnZW1TaW1wbGVzIGUgLm1lbnNhZ2VtSHRtbClcclxuICAgIGlmICghcGF5bG9hZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xyXG4gICAgICAgIHN0YXR1czogNDAwLFxyXG4gICAgICAgIG1lbnNhZ2VtU2ltcGxlczogJ0Vycm8gaW50ZXJubzogRGFkb3MgcGFyYSBzYWx2YW1lbnRvIGludsOhbGlkb3MgKFBheWxvYWQgbnVsbCkuJyxcclxuICAgICAgICBtZW5zYWdlbUh0bWw6ICc8c3Ryb25nPkVycm8gaW50ZXJubzo8L3N0cm9uZz4gVGVudGF0aXZhIGRlIHNhbHZhciBkYWRvcyB2YXppb3MuJ1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aXBvUGVzc29hKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XHJcbiAgICAgICAgc3RhdHVzOiA0MDAsXHJcbiAgICAgICAgbWVuc2FnZW1TaW1wbGVzOiAnRXJybyBpbnRlcm5vOiBUaXBvIGRlIHBlc3NvYSBuw6NvIGRlZmluaWRvLicsXHJcbiAgICAgICAgbWVuc2FnZW1IdG1sOiAnPHN0cm9uZz5FcnJvIGludGVybm86PC9zdHJvbmc+IE8gdGlwbyBkZSBwZXNzb2Egw6kgb2JyaWdhdMOzcmlvIHBhcmEgc2FsdmFyLidcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIERlbGVnYcOnw6NvXHJcbiAgICAvLyBDb21vIHNhdmVQZXNzb2FGaXNpY2EgZSBzYXZlUGVzc29hSnVyaWRpY2EgSsOBIFTDik0gbyAucGlwZShjYXRjaEVycm9yKSxcclxuICAgIC8vIGFxdWkgbsOzcyBhcGVuYXMgcmV0b3JuYW1vcyBvIE9ic2VydmFibGUgZGVsZXMuIE8gZXJybyBzdWJpcsOhIHRyYXRhZG8uXHJcbiAgICBpZiAodGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5GSVNJQ0EgfHwgdGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5FU1RSQU5HRUlSQSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zYXZlUGVzc29hRmlzaWNhKHBheWxvYWQpO1xyXG4gICAgfSBlbHNlIGlmICh0aXBvUGVzc29hID09IFRpcG9QZXNzb2FFbnVtLkpVUklESUNBKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhdmVQZXNzb2FKdXJpZGljYShwYXlsb2FkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEbDrXNpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FGaXNpY2EocGVzc29hOiBVbmJQZXNzb2FNb2RlbCk6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QmFja2VuZFVybCgpO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB0aGlzLmdldEhlYWRlcnMoKTtcclxuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwZXNzb2EpO1xyXG5cclxuICAgIC8vIFZhcmnDoXZlbCBwYXJhIGFybWF6ZW5hciBvIE9ic2VydmFibGUgYW50ZXMgZGUgcmV0b3JuYXJcclxuICAgIGxldCByZXF1ZXN0JDogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD47XHJcblxyXG4gICAgaWYgKHBlc3NvYS5jb2RpZ29QZXNzb2EgPT0gbnVsbCkge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wb3N0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzLyR7cGVzc29hLmNvZGlnb1Blc3NvYX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW50ZXMgZGUgcmV0b3JuYXIsIHBhc3NhbW9zIHBlbG8gJ3BpcGUnIHBhcmEgdHJhdGFyIG8gZXJybyBzZSBlbGUgb2NvcnJlci5cclxuICAgIHJldHVybiByZXF1ZXN0JC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIFBlc3NvYSBKdXLDrWRpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FKdXJpZGljYShwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRCYWNrZW5kVXJsKCk7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBlc3NvYSk7XHJcbiAgICBsZXQgcmVxdWVzdCQ6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+O1xyXG5cclxuICAgIGlmIChwZXNzb2EuY29kaWdvUGVzc29hID09IG51bGwpIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXMvJHtwZXNzb2EuY29kaWdvUGVzc29hfWAsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVxdWVzdCQucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIERhZG9zIGF1eGlsaWFyZXMgcMO6YmxpY29zXHJcbiAgcHVibGljIGdldEVzY29sYXJpZGFkZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVzY29sYXJpZGFkZVtdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXNjb2xhcmlkYWRlcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVzdGFkb0NpdmlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXN0YWRvQ2l2aWxbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcHVibGljL2VzdGFkb3MtY2l2aXMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpIC8vIDwtLS0gQWRpY2lvbmUgYXF1aVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNdW5pY2lwaW9zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTXVuaW5jaXBpb1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvbXVuaWNpcGlvcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhaXNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgY29udGVudDogVW5iUGVzc29hUGFpc1tdIH0+KFxyXG4gICAgICBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvcGFpc2VzL2xpc3RhZ2VtPyZwYWdlPTAmc2l6ZT0yMDAmc29ydD1kZW5vbWluYWNhbyxhc2NgXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNvbnRlbnQuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgLy8gLi4uIHN1YSBsw7NnaWNhIGRlIG9yZGVuYcOnw6NvIC4uLlxyXG4gICAgICAgICAgY29uc3Qgbm9tZUEgPSBhPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuICAgICAgICAgIGNvbnN0IG5vbWVCID0gYj8uZGVub21pbmFjYW8/LnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICBpZiAobm9tZUEgPT09ICdCUkFTSUwnKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAobm9tZUIgPT09ICdCUkFTSUwnKSByZXR1cm4gMTtcclxuICAgICAgICAgIHJldHVybiBub21lQS5sb2NhbGVDb21wYXJlKG5vbWVCKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UmFjYUNvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXRuaWFzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9FbWFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS90aXBvcy1lbWFpbC9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb0VuZGVyZWNvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3RpcG9zLWVuZGVyZWNvL3B1YmxpYy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIG1hcChsaXN0YSA9PiBsaXN0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgIGNvZGlnbzogaW5kZXgsIC8vIGdlcmEgdW0gY8OzZGlnbyBudW3DqXJpY28gc2VxdWVuY2lhbFxyXG4gICAgICAgIGRlbm9taW5hY2FvOiB0aGlzLmZvcm1hdGFyTGFiZWwoaXRlbSkgLy8gZm9ybWF0YSBzZSBxdWlzZXJcclxuICAgICAgfSkpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvVGVsZWZvbmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvdGlwb3MtdGVsZWZvbmUvcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRhckxhYmVsKHRleHQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRleHRcclxuICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgLnJlcGxhY2UoL18vZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIGwgPT4gbC50b1VwcGVyQ2FzZSgpKTtcclxuICB9XHJcblxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gSEFORExFIEVSUk9SIFBBRFJPTklaQURPIFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIHByaXZhdGUgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4geyAgICBcclxuICAgIGxldCBtZW5zYWdlbVNpbXBsZXMgPSAnT2NvcnJldSB1bSBlcnJvIGFvIHByb2Nlc3NhciBhIHJlcXVpc2nDp8OjbyEnO1xyXG4gICAgbGV0IG1lbnNhZ2VtSHRtbCA9ICc8c3Ryb25nPk9jb3JyZXUgdW0gZXJybyBkZXNjb25oZWNpZG8uPC9zdHJvbmc+JztcclxuICAgIFxyXG4gICAgLy8gMi4gRGVzY29icmUgcXVlbSDDqSBvIGNvcnBvIGRvIGVycm9cclxuICAgIGxldCBlcnJvckJvZHk6IGFueTtcclxuXHJcbiAgICBpZiAoZXJyb3IuZGV0YWxoZXMgfHwgZXJyb3IuY29kaWdvU3RhdHVzKSB7XHJcbiAgICAgICAgLy8gQ0FTTyAxOiBPIEludGVyY2VwdG9yIGrDoSBkZXNlbWJydWxob3UgbyBlcnJvICjDqSBvIEpTT04gcHVybylcclxuICAgICAgICBlcnJvckJvZHkgPSBlcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQ0FTTyAyOiDDiSB1bSBIdHRwRXJyb3JSZXNwb25zZSBwYWRyw6NvICh0ZW0gYSBwcm9wcmllZGFkZSAuZXJyb3IpXHJcbiAgICAgICAgZXJyb3JCb2R5ID0gZXJyb3IuZXJyb3IgfHwgZXJyb3I7IFxyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIEzDs2dpY2EgZGUgTGltcGV6YSBlIFBhcnNlIChzZSBmb3Igc3RyaW5nIHN1amEpXHJcbiAgICBpZiAodHlwZW9mIGVycm9yQm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBlcnJvckJvZHkgPSBKU09OLnBhcnNlKGVycm9yQm9keSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IGVycm9yQm9keS5pbmRleE9mKCd7Jyk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gZXJyb3JCb2R5Lmxhc3RJbmRleE9mKCd9Jyk7XHJcbiAgICAgICAgaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVycm9yQm9keSA9IEpTT04ucGFyc2UoZXJyb3JCb2R5LnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSkpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZTIpIHtcclxuICAgICAgICAgICAgIC8vIFNlIGZhbGhhciBvIHBhcnNlLCB1c2EgbyB0ZXh0byBjb21vIG1lbnNhZ2VtXHJcbiAgICAgICAgICAgICBtZW5zYWdlbVNpbXBsZXMgPSBlcnJvckJvZHkuc3Vic3RyaW5nKDAsIDIwMCk7IFxyXG4gICAgICAgICAgICAgbWVuc2FnZW1IdG1sID0gYDxzdHJvbmc+JHtlcnJvckJvZHl9PC9zdHJvbmc+YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGb3JtYXRhw6fDo28gYmFzZWFkYSBubyBKU09OIGlkZW50aWZpY2Fkb1xyXG4gICAgaWYgKGVycm9yQm9keSAmJiB0eXBlb2YgZXJyb3JCb2R5ID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBcclxuICAgICAgLy8gQTogRXJyb3MgZGUgVmFsaWRhw6fDo29cclxuICAgICAgaWYgKGVycm9yQm9keS5kZXRhbGhlcyAmJiBBcnJheS5pc0FycmF5KGVycm9yQm9keS5kZXRhbGhlcykgJiYgZXJyb3JCb2R5LmRldGFsaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIk8gZm9ybXVsw6FyaW8gcG9zc3VpIGVycm9zIGRlIHZhbGlkYcOnw6NvLlwiO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGxpc3RhRXJyb3MgPSBlcnJvckJvZHkuZGV0YWxoZXMubWFwKChkOiBhbnkpID0+IFxyXG4gICAgICAgICAgYDxsaT48c3Ryb25nPiR7ZC5ub21lQ2FtcG8gfHwgJ0NhbXBvJ306PC9zdHJvbmc+ICR7ZC5jcml0aWNhIHx8IGQubWVuc2FnZW19PC9saT5gXHJcbiAgICAgICAgKS5qb2luKCcnKTtcclxuICAgICAgICBcclxuICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz5FcnJvcyBkZSBWYWxpZGHDp8Ojbzo8L3N0cm9uZz4gPHVsPiR7bGlzdGFFcnJvc308L3VsPmA7XHJcbiAgICAgIH0gXHJcbiAgICAgIC8vIEI6IEVycm8gR2Vuw6lyaWNvIGNvbSBtZW5zYWdlbVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBtc2dCYWNrZW5kID0gZXJyb3JCb2R5Lm1lbnNhZ2VtIHx8IGVycm9yQm9keS5tZXNzYWdlIHx8IGVycm9yQm9keS5kZXRhaWw7XHJcbiAgICAgICAgaWYgKG1zZ0JhY2tlbmQpIHtcclxuICAgICAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IG1zZ0JhY2tlbmQ7XHJcbiAgICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz4ke21zZ0JhY2tlbmR9PC9zdHJvbmc+YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA1LiBUcmF0YW1lbnRvcyBkZSBTdGF0dXMgSFRUUCAoU2UgbyB3cmFwcGVyIG9yaWdpbmFsIHRpdmVyIHN0YXR1cylcclxuICAgIC8vIE5vdGE6IFNlIG8gaW50ZXJjZXB0b3IgZGVzZW1icnVsaG91LCAnZXJyb3Iuc3RhdHVzJyBwb2RlIG7Do28gZXhpc3RpciwgXHJcbiAgICAvLyBtYXMgJ2Vycm9yQm9keS5jb2RpZ29TdGF0dXMnIChkbyBKYXZhKSBwb2RlIGV4aXN0aXIuXHJcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgZXJyb3JCb2R5Py5jb2RpZ29TdGF0dXMgfHwgMDtcclxuXHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgbWVuc2FnZW1TaW1wbGVzID0gXCJTZXNzw6NvIGV4cGlyYWRhLlwiO1xyXG4gICAgICBtZW5zYWdlbUh0bWwgPSBcIjxzdHJvbmc+U2Vzc8OjbyBleHBpcmFkYS4gRmHDp2EgbG9naW4gbm92YW1lbnRlLjwvc3Ryb25nPlwiO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xyXG4gICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIkFjZXNzbyBOZWdhZG8uXCI7XHJcbiAgICAgIG1lbnNhZ2VtSHRtbCA9IFwiPHN0cm9uZz5Wb2PDqiBuw6NvIHRlbSBwZXJtaXNzw6NvIHBhcmEgcmVhbGl6YXIgZXN0YSBhw6fDo28uPC9zdHJvbmc+XCI7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb0Zvcm1hdGFkbzogVW5iUGVzc29hRXJyb1BhZHJhbyA9IHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIG1lbnNhZ2VtU2ltcGxlcyxcclxuICAgICAgbWVuc2FnZW1IdG1sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW1VuQlBlc3NvYVNlcnZpY2VdIEVycm8gZm9ybWF0YWRvIGZpbmFsOicsIGVycm9Gb3JtYXRhZG8pO1xyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb0Zvcm1hdGFkbyk7XHJcbiAgfVxyXG59Il19
|