@seniorsistemas/angular-components 19.9.8-develop-dbc2f1b4 → 19.9.8-develop-5d2dfb27
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/datepicker/README.md +6 -2
- package/datepicker/lib/datepicker/date-segment-input.d.ts +7 -1
- package/datepicker/lib/datepicker/datepicker.component.d.ts +137 -3
- package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +19 -2
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +405 -38
- package/esm2022/lib/locale/fallback.mjs +36 -12
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +422 -38
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +35 -11
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/package.json +1 -1
package/datepicker/README.md
CHANGED
|
@@ -208,12 +208,16 @@ Em dispositivos touch (`(pointer: coarse)`), o campo cai automaticamente para o
|
|
|
208
208
|
|
|
209
209
|
- O trigger usa `role="combobox"` com `aria-haspopup="grid"`, `aria-expanded` e `aria-controls` apontando para o painel
|
|
210
210
|
- O painel usa `role="dialog"` com `aria-label` traduzido e `cdkTrapFocus` para prender o foco dentro do popup
|
|
211
|
-
- Ao abrir o painel, o foco é movido automaticamente para o
|
|
212
|
-
- Ao fechar o painel, o foco
|
|
211
|
+
- Ao abrir o painel, o foco é movido automaticamente: no modo `time`, para o botão de incremento de horas; nos modos `month`/`year`, para o botão de navegação (ano/década anterior) do cabeçalho, em vez do mês/ano já selecionado na grade, permitindo trocar o ano/década antes de escolher a célula; nos demais modos, para o dia selecionado (ou hoje) na grade do calendário
|
|
212
|
+
- Ao fechar o painel, o foco só é movido se estiver dentro do painel (prestes a sumir do DOM) — nesse caso, volta pro elemento que tinha foco quando o painel abriu (o input segmentado, se abriu por foco/clique nele; o botão de ícone, se abriu por clique nele), em vez de sempre forçar pro botão de ícone
|
|
213
213
|
- Tecla `Escape` fecha o painel e devolve o foco ao trigger
|
|
214
214
|
- Dias do calendário usam `role="gridcell"` com `aria-label` contendo a data por extenso, `aria-selected` e `aria-disabled`
|
|
215
215
|
- Cabeçalhos dos dias da semana usam `role="columnheader"` com `aria-label`
|
|
216
216
|
- Setas do time picker têm `aria-label` descritivos; as horas/minutos têm `aria-live="polite"`
|
|
217
|
+
- No input segmentado (dia/mês/ano/hora/minuto/segundo), o `LiveAnnouncer` do `@angular/cdk/a11y` anuncia "{rótulo do segmento}, {valor}" (ex.: "Dia, 03") a cada troca de segmento ou de valor, já que a seleção do segmento é feita por `setSelectionRange` num único `<input>` e leitores de tela não anunciam qual campo está selecionado sem esse reforço
|
|
218
|
+
- No primeiro foco genuíno do input segmentado, o `LiveAnnouncer` também anuncia um resumo humanizado do valor inteiro (ex.: "10 de outubro de 2020" ou "Nenhum valor selecionado"), já que o `<input>` só expõe ao leitor de tela o valor bruto (esqueleto de sublinhados quando vazio, dígitos separados por barra quando completo)
|
|
219
|
+
- Ao cruzar uma fronteira de mês na grade do calendário (seta ou botões `<`/`>`), o `LiveAnnouncer` anuncia distintamente o novo mês/ano, já que essa informação fica "enterrada" no meio do `aria-label` longo de cada dia
|
|
220
|
+
- Os botões de navegação de ano (`mode="month"`) e de década (`mode="year"`) incluem o ano/intervalo de destino no próprio `aria-label` (ex.: "Ano anterior, 2025", "Década anterior, 2010 a 2021"), em vez de só "Ano anterior"/"Década anterior" sem indicar pra onde o botão leva
|
|
217
221
|
- Todos os ícones decorativos têm `aria-hidden="true"`
|
|
218
222
|
|
|
219
223
|
## Componentes relacionados
|
|
@@ -41,6 +41,8 @@ export declare class DateSegmentEngine {
|
|
|
41
41
|
getLastEditableIndex(): number;
|
|
42
42
|
getActiveIndex(): number | null;
|
|
43
43
|
activeKind(): SegmentKind | null;
|
|
44
|
+
/** Texto bruto (sem padding de sublinhado) do segmento ativo — usado pelo anúncio de acessibilidade. */
|
|
45
|
+
getActiveSegmentText(): string | null;
|
|
44
46
|
selectSegmentAt(charIndex: number): number;
|
|
45
47
|
private nearestEditableFrom;
|
|
46
48
|
selectSegment(index: number): void;
|
|
@@ -53,7 +55,11 @@ export declare class DateSegmentEngine {
|
|
|
53
55
|
clearActiveSegment(kind: 'backspace' | 'delete'): void;
|
|
54
56
|
/** Limpa todos os segmentos editáveis (usado quando o campo inteiro está selecionado, ex.: Ctrl+A). */
|
|
55
57
|
clearAll(): void;
|
|
56
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido.
|
|
60
|
+
* Exceção: ano vazio sempre pousa no ano atual do sistema na primeira seta (up ou down),
|
|
61
|
+
* em vez de 0000/9999 — só passa a incrementar/decrementar a partir da segunda seta.
|
|
62
|
+
*/
|
|
57
63
|
incrementActiveSegment(delta: 1 | -1): void;
|
|
58
64
|
/** Pad/clamp do segmento ativo (ex.: "2" -> "02", "45" no dia -> clamp para daysInMonth). */
|
|
59
65
|
commitActiveSegment(): void;
|
|
@@ -155,10 +155,18 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
155
155
|
private readonly hostElement;
|
|
156
156
|
private readonly translateService;
|
|
157
157
|
private readonly destroyRef;
|
|
158
|
+
private readonly liveAnnouncer;
|
|
158
159
|
private readonly currentLang;
|
|
159
160
|
/** Reflete `(pointer: coarse)` — dispositivos touch preferem o popup do calendário ao teclado. */
|
|
160
161
|
protected readonly isTouchDevice: import("@angular/core").WritableSignal<boolean>;
|
|
161
162
|
private readonly segmentEngine;
|
|
163
|
+
/** Elemento que tinha foco antes do painel abrir — ver `captureFocusOrigin`/`closePanel`. */
|
|
164
|
+
private elementToRestoreFocusTo;
|
|
165
|
+
/** `true` só durante o `.focus()` programático de restauração em `closePanel()` — evita que
|
|
166
|
+
* `handleInputFocus` interprete esse foco como um foco genuíno do usuário e reabra o painel
|
|
167
|
+
* na hora via `showOnFocus` (ex.: selecionar uma data devolve o foco pro input, que senão
|
|
168
|
+
* reabriria o painel imediatamente depois de fechá-lo). */
|
|
169
|
+
private isRestoringFocusOnClose;
|
|
162
170
|
private lastSegmentConfig;
|
|
163
171
|
private measureCanvas?;
|
|
164
172
|
/** Incrementado a cada mutação do usuário — invalida callbacks de clique/foco adiados que ficaram obsoletos. */
|
|
@@ -171,6 +179,7 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
171
179
|
protected readonly resolvedDateFormat: import("@angular/core").Signal<string>;
|
|
172
180
|
/** `hourFormat` explícito ou resolvido a partir do locale ativo (fallback `'24'`). */
|
|
173
181
|
protected readonly resolvedHourFormat: import("@angular/core").Signal<"12" | "24">;
|
|
182
|
+
private static readonly SEGMENT_LABEL_KEYS;
|
|
174
183
|
/** Modos cujo formato de exibição é resolvido pela engine de segmentos (independente de touch/readonly). */
|
|
175
184
|
protected readonly isSegmentModeCandidate: import("@angular/core").Signal<boolean>;
|
|
176
185
|
/** Interatividade de digitação por segmento — desligada em touch ou quando `readonlyInput` é usado. */
|
|
@@ -181,17 +190,61 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
181
190
|
protected readonly displayHours: import("@angular/core").Signal<number>;
|
|
182
191
|
/** Meridiano atual derivado da hora interna (0–23). */
|
|
183
192
|
protected readonly amPm: import("@angular/core").Signal<"PM" | "AM">;
|
|
193
|
+
private displayHourFor;
|
|
194
|
+
private meridiemFor;
|
|
195
|
+
/** Texto (com AM/PM quando aplicável) da hora de destino do botão "aumentar"/"diminuir hora"
|
|
196
|
+
* — mesma motivação de `prevMonthTarget`/`nextMonthTarget`/`prevYearTarget`/`nextYearTarget`:
|
|
197
|
+
* sem isso, o botão só diz "aumentar hora", sem dizer qual hora vai resultar. */
|
|
198
|
+
private formatHourTarget;
|
|
199
|
+
protected readonly prevHourTarget: import("@angular/core").Signal<string>;
|
|
200
|
+
protected readonly nextHourTarget: import("@angular/core").Signal<string>;
|
|
201
|
+
/** Mesma motivação, para os botões de minuto/segundo/AM-PM. */
|
|
202
|
+
protected readonly prevMinuteTarget: import("@angular/core").Signal<string>;
|
|
203
|
+
protected readonly nextMinuteTarget: import("@angular/core").Signal<string>;
|
|
204
|
+
protected readonly prevSecondTarget: import("@angular/core").Signal<string>;
|
|
205
|
+
protected readonly nextSecondTarget: import("@angular/core").Signal<string>;
|
|
206
|
+
protected readonly nextMeridiemTarget: import("@angular/core").Signal<"PM" | "AM">;
|
|
184
207
|
protected readonly positions: ConnectedPosition[];
|
|
185
208
|
protected readonly popupId: import("@angular/core").Signal<string>;
|
|
186
209
|
protected readonly currentMonthIndex: import("@angular/core").Signal<number>;
|
|
187
210
|
protected readonly currentYear: import("@angular/core").Signal<number>;
|
|
188
211
|
protected readonly currentMonthKey: import("@angular/core").Signal<string>;
|
|
212
|
+
/** Ano de destino do botão "ano anterior"/"próximo ano" (view de meses) — pro aria-label
|
|
213
|
+
* anunciar pra onde o botão vai, já que "Ano anterior" sozinho não diz qual ano é esse. */
|
|
214
|
+
protected readonly prevYearTarget: import("@angular/core").Signal<number>;
|
|
215
|
+
protected readonly nextYearTarget: import("@angular/core").Signal<number>;
|
|
216
|
+
/** Mês/ano de destino do botão "mês anterior"/"próximo mês" (view de calendário) — mesma
|
|
217
|
+
* motivação de `prevYearTarget`/`nextYearTarget`: "Mês anterior" sozinho não diz qual mês é
|
|
218
|
+
* esse, e cruzar a fronteira do ano (ex.: janeiro → dezembro do ano anterior) tornaria essa
|
|
219
|
+
* falta de contexto ainda mais confusa sem o ano junto. */
|
|
220
|
+
protected readonly prevMonthTarget: import("@angular/core").Signal<string>;
|
|
221
|
+
protected readonly nextMonthTarget: import("@angular/core").Signal<string>;
|
|
189
222
|
protected readonly showCalendar: import("@angular/core").Signal<boolean>;
|
|
190
223
|
protected readonly showTimePicker: import("@angular/core").Signal<boolean>;
|
|
191
224
|
/** Seleção múltipla ativa: apenas no modo `date` com `selectionMode = 'multiple'`. */
|
|
192
225
|
protected readonly isMultipleMode: import("@angular/core").Signal<boolean>;
|
|
226
|
+
/** Instrução lida junto do rótulo da grade de dias — cada modo com semântica de seleção não
|
|
227
|
+
* óbvia (múltipla, intervalo) ganha uma frase própria; `range` ainda se divide em duas fases
|
|
228
|
+
* (escolhendo início vs. já com `pendingRangeStart`, escolhendo fim). */
|
|
229
|
+
protected readonly calendarGridAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_calendar_label_multiple" | "platform.angular_components.datepicker_calendar_label_range_pending" | "platform.angular_components.datepicker_calendar_label_range" | "platform.angular_components.datepicker_calendar_label">;
|
|
193
230
|
protected readonly orderedWeekDayKeys: import("@angular/core").Signal<string[]>;
|
|
194
|
-
|
|
231
|
+
/** Ciente da fase de seleção em `range`: enquanto não há `pendingRangeStart`, é a mesma chave
|
|
232
|
+
* de sempre ("selecionar intervalo"); depois do primeiro clique, muda pra uma chave que cita
|
|
233
|
+
* a data inicial já escolhida, já que reabrir/reentrar no diálogo nesse meio-tempo não dava
|
|
234
|
+
* nenhuma pista de que a segunda metade do fluxo era a que faltava. */
|
|
235
|
+
protected readonly dialogAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_select_date" | "platform.angular_components.datepicker_select_range_end" | "platform.angular_components.datepicker_select_range">;
|
|
236
|
+
protected readonly dialogAriaLabelParams: import("@angular/core").Signal<{
|
|
237
|
+
date?: string;
|
|
238
|
+
}>;
|
|
239
|
+
protected readonly rangeStatusElementId: import("@angular/core").Signal<string>;
|
|
240
|
+
/** Texto do `<span>` `sr-only` referenciado por `aria-describedby` no `<input>` — dá ao campo
|
|
241
|
+
* um conteúdo persistente e acessível enquanto só a data inicial do intervalo foi escolhida,
|
|
242
|
+
* já que `inputDate` só reflete o valor completo depois da segunda escolha (a atualização
|
|
243
|
+
* parcial em `selectDate()` cobre o texto visível; isto cobre o que um leitor de tela lê ao
|
|
244
|
+
* focar/reler o campo). Usa `aria-describedby`, não `aria-label`, pra só ACRESCENTAR
|
|
245
|
+
* informação sem sobrescrever o nome acessível que integrações (dynamic-form, showcase)
|
|
246
|
+
* já controlam por fora do componente. */
|
|
247
|
+
protected readonly rangePendingStatusText: import("@angular/core").Signal<string>;
|
|
195
248
|
protected readonly placeholderKey: import("@angular/core").Signal<string>;
|
|
196
249
|
protected readonly effectiveRange: import("@angular/core").Signal<{
|
|
197
250
|
start: Date | null;
|
|
@@ -203,6 +256,19 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
203
256
|
index: number;
|
|
204
257
|
}[][]>;
|
|
205
258
|
protected readonly currentDecadeStart: import("@angular/core").Signal<number>;
|
|
259
|
+
/** Intervalo de destino do botão "década anterior"/"próxima década" (view de anos) — mesma
|
|
260
|
+
* motivação de `prevYearTarget`/`nextYearTarget`. `navigatePrev`/`navigateNext` deslocam
|
|
261
|
+
* `viewDate` em ±10 anos (não ±12) nessa view; o grid exibido é que mostra 12 anos por
|
|
262
|
+
* página (ver `yearsGrid`) — daí o intervalo ir de `currentDecadeStart() ± 10` até
|
|
263
|
+
* `+ 11` pra bater exatamente com a página que o clique realmente abre. */
|
|
264
|
+
protected readonly prevDecadeRange: import("@angular/core").Signal<{
|
|
265
|
+
startYear: number;
|
|
266
|
+
endYear: number;
|
|
267
|
+
}>;
|
|
268
|
+
protected readonly nextDecadeRange: import("@angular/core").Signal<{
|
|
269
|
+
startYear: number;
|
|
270
|
+
endYear: number;
|
|
271
|
+
}>;
|
|
206
272
|
protected readonly yearsGrid: import("@angular/core").Signal<number[][]>;
|
|
207
273
|
protected readonly prevDisabled: import("@angular/core").Signal<boolean>;
|
|
208
274
|
protected readonly nextDisabled: import("@angular/core").Signal<boolean>;
|
|
@@ -216,14 +282,29 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
216
282
|
validate(control: AbstractControl): ValidationErrors | null;
|
|
217
283
|
registerOnValidatorChange(fn: () => void): void;
|
|
218
284
|
protected open(): void;
|
|
219
|
-
/** Abre o painel sem transferir o foco
|
|
285
|
+
/** Abre o painel sem transferir o foco por padrão (usado pelo showOnFocus). Em modos sem
|
|
286
|
+
* digitação por segmento (multiple/range/year/touch) o foco segue pro calendário igual em
|
|
287
|
+
* open(); em modo segmentado o foco permanece no input pra continuar digitando. */
|
|
220
288
|
private openOnFocus;
|
|
289
|
+
private focusPanelAfterOpen;
|
|
290
|
+
/** Guarda o elemento focado no momento em que o painel abre, pra devolver o foco pra lá ao
|
|
291
|
+
* fechar em vez de sempre forçar pro botão do ícone — ver `closePanel()`. */
|
|
292
|
+
private captureFocusOrigin;
|
|
221
293
|
/**
|
|
222
294
|
* Define a view inicial do painel e posiciona o calendário no `defaultDate`
|
|
223
295
|
* quando nenhum valor está selecionado.
|
|
224
296
|
*/
|
|
225
297
|
private prepareOpenView;
|
|
226
298
|
private focusBestCalendarTarget;
|
|
299
|
+
/** Zera o estado de intervalo em andamento — usado tanto pelo fechamento total do painel
|
|
300
|
+
* (`closePanel`, onde não faz sentido anunciar nada porque o diálogo inteiro está sumindo)
|
|
301
|
+
* quanto pelo cancelamento leve via Escape dentro da grade (`cancelPendingRangeStart`), que
|
|
302
|
+
* mantém o painel aberto e por isso anuncia a mudança separadamente. */
|
|
303
|
+
private resetPendingRangeSelection;
|
|
304
|
+
/** Cancelamento leve de uma seleção de intervalo em andamento (ver `handleCalendarGridKeydown`,
|
|
305
|
+
* tecla Escape) — ao contrário de `closePanel`, o painel continua aberto, então aqui faz
|
|
306
|
+
* sentido anunciar a mudança de estado. */
|
|
307
|
+
private cancelPendingRangeStart;
|
|
227
308
|
protected closePanel(): void;
|
|
228
309
|
/**
|
|
229
310
|
* O backdrop do CDK Overlay cobre a tela inteira, incluindo o próprio trigger — clicar no
|
|
@@ -283,10 +364,38 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
283
364
|
/** Sincroniza o DOM com o estado atual da engine (valor + seleção do segmento ativo) após uma mutação. */
|
|
284
365
|
private syncSegmentedInput;
|
|
285
366
|
private selectActiveSegmentRange;
|
|
367
|
+
/** "{rótulo do segmento}, {valor}" (ex.: "Dia, 03") — texto do anúncio de nível de segmento. */
|
|
368
|
+
private buildSegmentAnnouncementText;
|
|
369
|
+
/** Anuncia via LiveAnnouncer o segmento ativo — chamado em todo ponto que muda o segmento ativo/seu
|
|
370
|
+
* valor DEPOIS do primeiro foco genuíno (que já recebe esse mesmo texto embutido em `announceGenuineFocus`). */
|
|
371
|
+
private announceActiveSegment;
|
|
372
|
+
/** Resumo humanizado do valor inteiro (ex.: "10 de outubro de 2020", ou a frase genérica de campo
|
|
373
|
+
* vazio) — complementa o `<input>` segmentado, que o leitor de tela lê de forma literal/pouco
|
|
374
|
+
* natural (esqueleto de sublinhados quando vazio, dígitos separados por barra quando completo).
|
|
375
|
+
* Formatação pura via `Intl`, sem chaves de tradução novas (exceto a frase de campo vazio).
|
|
376
|
+
* Espelha `formatDayAriaLabel` pro modo `date`. */
|
|
377
|
+
private describeWholeValue;
|
|
378
|
+
/** Anúncio combinado no primeiro foco genuíno do campo: resumo do valor inteiro + segmento ativo,
|
|
379
|
+
* numa ÚNICA chamada a `announce` (evita duas regiões concorrentes/uma cortando a outra). */
|
|
380
|
+
private announceGenuineFocus;
|
|
286
381
|
/** Propaga o valor da engine para o modelo (CVA) assim que todos os segmentos estiverem completos. */
|
|
287
382
|
private commitSegmentedValueIfComplete;
|
|
288
383
|
protected navigatePrev(): void;
|
|
289
384
|
protected navigateNext(): void;
|
|
385
|
+
/** Anuncia só "{mês} de {ano}" (ex.: "outubro de 2026") ao cruzar fronteira de mês na grade de dias.
|
|
386
|
+
* O novo foco (button[role="gridcell"]) já carrega essa info dentro do aria-label longo de
|
|
387
|
+
* `formatDayAriaLabel`, mas o nome do mês fica "enterrado" no meio da frase e passa despercebido
|
|
388
|
+
* (confirmado com teste manual via Orca). Sem prefixo tipo "agora exibindo", mesma convenção
|
|
389
|
+
* adotada por outros calendários acessíveis (ex.: react-aria). */
|
|
390
|
+
private announceMonthChange;
|
|
391
|
+
/** Anuncia o ano atualmente exibido ao paginar a view 'months' (ex.: "2025"). O `<span>` central
|
|
392
|
+
* que mostra esse ano no cabeçalho não é focável, e o aria-label dos botões de navegação só
|
|
393
|
+
* fala o ano de DESTINO ("Ano anterior, 2025") — sem isso, o leitor de tela nunca confirma o
|
|
394
|
+
* ano que passou a estar em exibição, só os alvos "anterior"/"próximo". */
|
|
395
|
+
private announceYearChange;
|
|
396
|
+
/** Mesma motivação de `announceYearChange`, para a view 'years' (paginação de década) — anuncia
|
|
397
|
+
* o intervalo atualmente exibido (ex.: "2020 – 2031"), espelhando o texto do `<span>` central. */
|
|
398
|
+
private announceDecadeChange;
|
|
290
399
|
protected handleCalendarGridKeydown(event: KeyboardEvent): void;
|
|
291
400
|
private static findEnabled;
|
|
292
401
|
protected switchToMonths(): void;
|
|
@@ -294,6 +403,24 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
294
403
|
protected selectDate(day: CalendarDay): void;
|
|
295
404
|
/** Adiciona/remove uma data da seleção múltipla. O painel permanece aberto. */
|
|
296
405
|
private toggleMultipleDate;
|
|
406
|
+
/** Anuncia via LiveAnnouncer a data completa (dia da semana, dia, mês, ano) e se ela acabou
|
|
407
|
+
* de ser selecionada ou desmarcada — pro usuário de leitor de tela saber exatamente o que
|
|
408
|
+
* mudou antes de seguir escolhendo a próxima data. */
|
|
409
|
+
private announceMultipleDateToggle;
|
|
410
|
+
/** Texto compartilhado entre o anúncio transitório de início de intervalo escolhido
|
|
411
|
+
* (`announceRangeStartSelected`) e o status persistente exposto via `aria-describedby` no
|
|
412
|
+
* `<input>` (`rangePendingStatusText`) — mesma redação nos dois lugares de propósito, pra não
|
|
413
|
+
* soarem como dois estados diferentes pro mesmo momento. */
|
|
414
|
+
private buildRangeStartSelectedText;
|
|
415
|
+
/** Anuncia que a data INICIAL do intervalo foi escolhida — o primeiro clique em `range` era
|
|
416
|
+
* mudo (ao contrário do toggle em modo `multiple`, sempre anunciado). Recebe um `Date` puro,
|
|
417
|
+
* não um clique: `selectToday()` chama `selectDate()` internamente e herda este anúncio de
|
|
418
|
+
* graça, sem precisar de uma segunda chamada. */
|
|
419
|
+
private announceRangeStartSelected;
|
|
420
|
+
/** Anuncia o intervalo concluído, chamado antes de `closePanel()` — o `LiveAnnouncer` escreve
|
|
421
|
+
* numa região `aria-live` própria e desacoplada do foco, então não é cortado pela restauração
|
|
422
|
+
* de foco que `closePanel()` agenda um tick depois via `afterNextRender`. */
|
|
423
|
+
private announceRangeCompleted;
|
|
297
424
|
protected selectYear(year: number): void;
|
|
298
425
|
protected selectMonth(monthIndex: number): void;
|
|
299
426
|
protected selectToday(): void;
|
|
@@ -321,7 +448,14 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
|
|
|
321
448
|
protected isMonthSelected(monthIndex: number): boolean;
|
|
322
449
|
protected isMonthDisabled(monthIndex: number): boolean;
|
|
323
450
|
protected padTime(value: number): string;
|
|
324
|
-
|
|
451
|
+
/** `day` é opcional e só usado em `mode="range"` — os demais call sites (resumo do valor
|
|
452
|
+
* segmentado, anúncio de toggle em modo `multiple`) nunca têm um `CalendarDay` à mão e nunca
|
|
453
|
+
* rodam em `range`, então continuam recebendo exatamente o texto de sempre. */
|
|
454
|
+
protected formatDayAriaLabel(date: Date, day?: CalendarDay): string;
|
|
455
|
+
/** Sufixo que diz o papel do dia dentro do intervalo selecionado — sem isso, toda célula da
|
|
456
|
+
* grade soa idêntica pro leitor de tela, e o único jeito de saber onde está o início/fim é
|
|
457
|
+
* enxergando o destaque visual. */
|
|
458
|
+
private rangeDayStatusSuffix;
|
|
325
459
|
/** Formata o valor para exibição no input, aplicando rangeSeparator, dateFormat e multipleSeparator. */
|
|
326
460
|
private formatForDisplay;
|
|
327
461
|
/**
|
|
@@ -138,6 +138,13 @@ export class DateSegmentEngine {
|
|
|
138
138
|
const segment = this.segments[this.activeIndex];
|
|
139
139
|
return isEditableSegment(segment) ? segment.kind : null;
|
|
140
140
|
}
|
|
141
|
+
/** Texto bruto (sem padding de sublinhado) do segmento ativo — usado pelo anúncio de acessibilidade. */
|
|
142
|
+
getActiveSegmentText() {
|
|
143
|
+
if (this.activeIndex === null)
|
|
144
|
+
return null;
|
|
145
|
+
const segment = this.segments[this.activeIndex];
|
|
146
|
+
return isEditableSegment(segment) ? segment.text : null;
|
|
147
|
+
}
|
|
141
148
|
selectSegmentAt(charIndex) {
|
|
142
149
|
let acc = 0;
|
|
143
150
|
for (let i = 0; i < this.segments.length; i++) {
|
|
@@ -250,7 +257,11 @@ export class DateSegmentEngine {
|
|
|
250
257
|
this.activeIndex = this.getFirstEditableIndex();
|
|
251
258
|
this.freshEntry = true;
|
|
252
259
|
}
|
|
253
|
-
/**
|
|
260
|
+
/**
|
|
261
|
+
* Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido.
|
|
262
|
+
* Exceção: ano vazio sempre pousa no ano atual do sistema na primeira seta (up ou down),
|
|
263
|
+
* em vez de 0000/9999 — só passa a incrementar/decrementar a partir da segunda seta.
|
|
264
|
+
*/
|
|
254
265
|
incrementActiveSegment(delta) {
|
|
255
266
|
if (this.activeIndex === null)
|
|
256
267
|
return;
|
|
@@ -261,6 +272,12 @@ export class DateSegmentEngine {
|
|
|
261
272
|
this.setAmPm(segment.text === 'PM' ? 0 : 1);
|
|
262
273
|
return;
|
|
263
274
|
}
|
|
275
|
+
if (segment.kind === 'year' && !segment.text) {
|
|
276
|
+
segment.text = String(new Date().getFullYear()).padStart(segment.length, '0');
|
|
277
|
+
this.freshEntry = true;
|
|
278
|
+
this.reconcileDayIfNeeded(segment.kind);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
264
281
|
const { min, max } = this.boundsFor(segment.kind);
|
|
265
282
|
const range = max - min + 1;
|
|
266
283
|
const current = segment.text ? parseInt(segment.text, 10) : delta > 0 ? min - 1 : min;
|
|
@@ -415,4 +432,4 @@ export class DateSegmentEngine {
|
|
|
415
432
|
return new Date(year, month, day, hour ?? ref.getHours(), minute, second);
|
|
416
433
|
}
|
|
417
434
|
}
|
|
418
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1zZWdtZW50LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2RhdGVwaWNrZXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGUtc2VnbWVudC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsT0FBcUI7SUFDNUMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUE2QixDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENB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QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVwRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQztZQUN4QyxJQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ2pDLElBQUksSUFBSTtnQkFBRSxJQUFJLElBQUksa0JBQWtCLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgU2VnbWVudEtpbmQgPSAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnaG91cicgfCAnbWludXRlJyB8ICdzZWNvbmQnIHwgJ2FtcG0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRhYmxlU2VnbWVudFN0YXRlIHtcbiAgICBraW5kOiBTZWdtZW50S2luZDtcbiAgICBsZW5ndGg6IG51bWJlcjtcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl0ZXJhbFNlZ21lbnRTdGF0ZSB7XG4gICAga2luZDogJ2xpdGVyYWwnO1xuICAgIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFN0YXRlID0gRWRpdGFibGVTZWdtZW50U3RhdGUgfCBMaXRlcmFsU2VnbWVudFN0YXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRFbmdpbmVDb25maWcge1xuICAgIG1vZGU6ICdkYXRlJyB8ICdtb250aCcgfCAndGltZScgfCAnZGF0ZXRpbWUnO1xuICAgIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgICBob3VyRm9ybWF0OiAnMTInIHwgJzI0JztcbiAgICBzaG93U2Vjb25kczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZvcm1hdFRva2VuIHtcbiAgICBraW5kOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgfCAnbGl0ZXJhbCc7XG4gICAgcmF3OiBzdHJpbmc7XG59XG5cbmNvbnN0IERBVEVfRk9STUFUX1RPS0VOX1JFID0gL3l5eXl8eXl8TU18bW18ZGR8ZC9nO1xuY29uc3QgWUVBUl9TRUdNRU5UX0xFTkdUSCA9IDQ7XG5jb25zdCBTSE9SVF9TRUdNRU5UX0xFTkdUSCA9IDI7XG5jb25zdCBIT1VSU19QRVJfTUVSSURJRU0gPSAxMjtcbmNvbnN0IE1BWF9IT1VSXzI0ID0gMjM7XG5jb25zdCBNQVhfTUlOVVRFX1NFQ09ORCA9IDU5O1xuY29uc3QgR0VORVJJQ19NQVhfREFZID0gMzE7XG5jb25zdCBMRUFQX1JFRkVSRU5DRV9ZRUFSID0gMjAwMDtcblxuZnVuY3Rpb24gaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudDogU2VnbWVudFN0YXRlKTogc2VnbWVudCBpcyBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB7XG4gICAgcmV0dXJuIHNlZ21lbnQua2luZCAhPT0gJ2xpdGVyYWwnO1xufVxuXG4vKiogVG9rZW5pemEgdW0gYGRhdGVGb3JtYXRgIChleC46IGBkZC9NTS95eXl5YCwgYE1NL2RkL3l5YCkgZW0gdG9rZW5zIGRlIGRpYS9tw6pzL2FubyArIGxpdGVyYWlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplRGF0ZUZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdFRva2VuW10ge1xuICAgIGNvbnN0IHRva2VuczogRm9ybWF0VG9rZW5bXSA9IFtdO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIHdoaWxlICgobWF0Y2ggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5leGVjKGZvcm1hdCkpKSB7XG4gICAgICAgIGlmIChtYXRjaC5pbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhdyA9IG1hdGNoWzBdO1xuICAgICAgICBjb25zdCBraW5kID0gcmF3WzBdID09PSAneScgPyAneWVhcicgOiByYXdbMF0gPT09ICdkJyA/ICdkYXknIDogJ21vbnRoJztcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kLCByYXcgfSk7XG4gICAgICAgIGxhc3RJbmRleCA9IERBVEVfRk9STUFUX1RPS0VOX1JFLmxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKGxhc3RJbmRleCA8IGZvcm1hdC5sZW5ndGgpIHtcbiAgICAgICAgdG9rZW5zLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHJhdzogZm9ybWF0LnNsaWNlKGxhc3RJbmRleCkgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBEaWFzIG5vIG3DqnMgKDEtMTIpLCBqw6EgcmVzb2x2ZW5kbyBmZXZlcmVpcm8vYW5vIGJpc3NleHRvIHZpYSByb2xsb3ZlciBuYXRpdm8gZG8gYERhdGVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRheXNJbk1vbnRoKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQ6IHN0cmluZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICByZXR1cm4gdG9rZW5pemVEYXRlRm9ybWF0KGRhdGVGb3JtYXQpLm1hcCgodG9rZW4pOiBTZWdtZW50U3RhdGUgPT4ge1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4geyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6IHRva2VuLnJhdyB9O1xuICAgICAgICBpZiAodG9rZW4ua2luZCA9PT0gJ3llYXInKSByZXR1cm4geyBraW5kOiAneWVhcicsIGxlbmd0aDogWUVBUl9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfTtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICdtb250aCcpIHJldHVybiB7IGtpbmQ6ICdtb250aCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH07XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdkYXknLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZE1vbnRoU2VnbWVudHMoZGF0ZUZvcm1hdDogc3RyaW5nKTogU2VnbWVudFN0YXRlW10ge1xuICAgIGNvbnN0IGFsbCA9IGJ1aWxkRGF0ZVNlZ21lbnRzKGRhdGVGb3JtYXQpO1xuICAgIGNvbnN0IGRheUlkeCA9IGFsbC5maW5kSW5kZXgoKHMpID0+IHMua2luZCA9PT0gJ2RheScpO1xuICAgIGlmIChkYXlJZHggPT09IC0xKSByZXR1cm4gYWxsO1xuICAgIGNvbnN0IGRyb3BJbmRleGVzID0gbmV3IFNldDxudW1iZXI+KFtkYXlJZHhdKTtcbiAgICBpZiAoYWxsW2RheUlkeCArIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCArIDEpO1xuICAgIH0gZWxzZSBpZiAoYWxsW2RheUlkeCAtIDFdPy5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZHJvcEluZGV4ZXMuYWRkKGRheUlkeCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsLmZpbHRlcigoXywgaSkgPT4gIWRyb3BJbmRleGVzLmhhcyhpKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGltZVNlZ21lbnRzKGhvdXJGb3JtYXQ6ICcxMicgfCAnMjQnLCBzaG93U2Vjb25kczogYm9vbGVhbik6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBjb25zdCBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXG4gICAgICAgIHsga2luZDogJ2hvdXInLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9LFxuICAgICAgICB7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sXG4gICAgICAgIHsga2luZDogJ21pbnV0ZScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0sXG4gICAgXTtcbiAgICBpZiAoc2hvd1NlY29uZHMpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJzonIH0sIHsga2luZDogJ3NlY29uZCcsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICBpZiAoaG91ckZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICBzZWdtZW50cy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSwgeyBraW5kOiAnYW1wbScsIGxlbmd0aDogU0hPUlRfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VnbWVudHNGb3IoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogU2VnbWVudFN0YXRlW10ge1xuICAgIHN3aXRjaCAoY29uZmlnLm1vZGUpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRNb250aFNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRUaW1lU2VnbWVudHMoY29uZmlnLmhvdXJGb3JtYXQsIGNvbmZpZy5zaG93U2Vjb25kcyk7XG4gICAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLi4uYnVpbGREYXRlU2VnbWVudHMoY29uZmlnLmRhdGVGb3JtYXQpLFxuICAgICAgICAgICAgICAgIHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiAnICcgfSxcbiAgICAgICAgICAgICAgICAuLi5idWlsZFRpbWVTZWdtZW50cyhjb25maWcuaG91ckZvcm1hdCwgY29uZmlnLnNob3dTZWNvbmRzKSxcbiAgICAgICAgICAgIF07XG4gICAgfVxufVxuXG4vKipcbiAqIEVuZ2luZSBkZSBzZWdtZW50b3MgKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIHBhcmEgbyB0cmlnZ2VyIGRvIGRhdGVwaWNrZXIuXG4gKiBTZW0gZGVwZW5kw6puY2lhcyBkZSBBbmd1bGFyIOKAlCBET00vQ1ZBIGZpY2FtIHBvciBjb250YSBkbyBjb21wb25lbnRlIHF1ZSBhIGNvbnNvbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlU2VnbWVudEVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzZWdtZW50czogU2VnbWVudFN0YXRlW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgYWN0aXZlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZnJlc2hFbnRyeSA9IHRydWU7XG5cbiAgICBjb25maWd1cmUoY29uZmlnOiBTZWdtZW50RW5naW5lQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gYnVpbGRTZWdtZW50c0Zvcihjb25maWcpO1xuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5U3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLm1hcCgocykgPT4gKGlzRWRpdGFibGVTZWdtZW50KHMpID8gdGhpcy5yZW5kZXJTZWdtZW50KHMpIDogcy50ZXh0KSkuam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJTZWdtZW50KHNlZ21lbnQ6IEVkaXRhYmxlU2VnbWVudFN0YXRlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHNlZ21lbnQudGV4dCArICdfJy5yZXBlYXQoTWF0aC5tYXgoMCwgc2VnbWVudC5sZW5ndGggLSBzZWdtZW50LnRleHQubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWdtZW50UmVuZGVyTGVuZ3RoKHNlZ21lbnQ6IFNlZ21lbnRTdGF0ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSA/IHNlZ21lbnQubGVuZ3RoIDogc2VnbWVudC50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWdtZW50UmFuZ2UoaW5kZXg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIHRoaXMuc2VnbWVudFJlbmRlckxlbmd0aCh0aGlzLnNlZ21lbnRzW2luZGV4XSldO1xuICAgIH1cblxuICAgIGdldEZpcnN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKHMpID0+IGlzRWRpdGFibGVTZWdtZW50KHMpKTtcbiAgICB9XG5cbiAgICBnZXRMYXN0RWRpdGFibGVJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbaV0pKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUluZGV4O1xuICAgIH1cblxuICAgIGFjdGl2ZUtpbmQoKTogU2VnbWVudEtpbmQgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpID8gc2VnbWVudC5raW5kIDogbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50QXQoY2hhckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWNjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgICAgICBpZiAoY2hhckluZGV4IDwgYWNjICsgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVhcmVzdEVkaXRhYmxlRnJvbShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lYXJlc3RFZGl0YWJsZUZyb20oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCB8fCAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tpbmRleF0pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZWxlY3RGaXJzdFNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudCh0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiogQ29tbWl0YSAocGFkL2NsYW1wKSBvIHNlZ21lbnRvIGF0aXZvIGUgbW92ZSBwYXJhIG8gcHLDs3hpbW8vYW50ZXJpb3IgZWRpdMOhdmVsLiAqL1xuICAgIG1vdmVUb0FkamFjZW50U2VnbWVudChkaXJlY3Rpb246IDEgfCAtMSk6ICdtb3ZlZCcgfCAnYm91bmRhcnknIHtcbiAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBuZXh0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA+PSAwICYmIG5leHQgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aCAmJiAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tuZXh0XSkpO1xuICAgICAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFNlZ21lbnQobmV4dCk7XG4gICAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH1cblxuICAgIHR5cGVEaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCA9PT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZyZXNoRW50cnkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dC5sZW5ndGggPj0gc2VnbWVudC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgc2VnbWVudC50ZXh0ICs9IGRpZ2l0O1xuICAgICAgICBpZiAoc2VnbWVudC50ZXh0Lmxlbmd0aCA+PSBzZWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9BZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9BZHZhbmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA8IHRoaXMuc2VnbWVudHMubGVuZ3RoICYmICFpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW25leHRdKSk7XG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudChuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEFtUG0odmFsdWU6IDAgfCAxKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCAhPT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHZhbHVlID09PSAxID8gJ1BNJyA6ICdBTSc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xlYXJBY3RpdmVTZWdtZW50KGtpbmQ6ICdiYWNrc3BhY2UnIHwgJ2RlbGV0ZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIGlmICghaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgLT0gMTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID49IDAgJiYgIWlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbcHJldl0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBwcmV2O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIExpbXBhIHRvZG9zIG9zIHNlZ21lbnRvcyBlZGl0w6F2ZWlzICh1c2FkbyBxdWFuZG8gbyBjYW1wbyBpbnRlaXJvIGVzdMOhIHNlbGVjaW9uYWRvLCBleC46IEN0cmwrQSkuICovXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpO1xuICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBJbmNyZW1lbnRhL2RlY3JlbWVudGEgbyBzZWdtZW50byBhdGl2bywgZGFuZG8gYSB2b2x0YSAod3JhcCkgZGVudHJvIGRvIHJhbmdlIHbDoWxpZG8uICovXG4gICAgaW5jcmVtZW50QWN0aXZlU2VnbWVudChkZWx0YTogMSB8IC0xKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJykge1xuICAgICAgICAgICAgdGhpcy5zZXRBbVBtKHNlZ21lbnQudGV4dCA9PT0gJ1BNJyA/IDAgOiAxKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDE7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWdtZW50LnRleHQgPyBwYXJzZUludChzZWdtZW50LnRleHQsIDEwKSA6IGRlbHRhID4gMCA/IG1pbiAtIDEgOiBtaW47XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKChjdXJyZW50ICsgZGVsdGEgLSBtaW4pICUgcmFuZ2UpICsgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXh0KS5wYWRTdGFydChzZWdtZW50Lmxlbmd0aCwgJzAnKTtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGVEYXlJZk5lZWRlZChzZWdtZW50LmtpbmQpO1xuICAgIH1cblxuICAgIC8qKiBQYWQvY2xhbXAgZG8gc2VnbWVudG8gYXRpdm8gKGV4LjogXCIyXCIgLT4gXCIwMlwiLCBcIjQ1XCIgbm8gZGlhIC0+IGNsYW1wIHBhcmEgZGF5c0luTW9udGgpLiAqL1xuICAgIGNvbW1pdEFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGtpbmQgPSBzZWdtZW50LmtpbmQ7XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHRoaXMuY2xhbXBBbmRQYWQoc2VnbWVudCk7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoa2luZCk7XG4gICAgfVxuXG4gICAgLyoqIENvbW1pdGEgbyBzZWdtZW50byBhdGl2byBlIHNhaSBkbyBtb2RvIGRlIGVkacOnw6NvICh1c2FkbyBubyBibHVyIGRvIGNhbXBvKS4gKi9cbiAgICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdEFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGFtcEFuZFBhZChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJyB8fCBzZWdtZW50LmtpbmQgPT09ICd5ZWFyJyB8fCAhc2VnbWVudC50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VnbWVudC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHNlZ21lbnQudGV4dCwgMTApO1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG51bSkpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKGNsYW1wZWQpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYm91bmRzRm9yKGtpbmQ6IFNlZ21lbnRLaW5kKTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSB7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IDEsIG1heDogdGhpcy5kYXlzSW5Nb250aE5vdygpIH07XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAxLCBtYXg6IEhPVVJTX1BFUl9NRVJJRElFTSB9O1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5ob3VyRm9ybWF0ID09PSAnMTInXG4gICAgICAgICAgICAgICAgICAgID8geyBtaW46IDEsIG1heDogSE9VUlNfUEVSX01FUklESUVNIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IG1pbjogMCwgbWF4OiBNQVhfSE9VUl8yNCB9O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAwLCBtYXg6IE1BWF9NSU5VVEVfU0VDT05EIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogMCwgbWF4OiA5OTk5IH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3VuZCBkbyBkaWEgZGVwZW5kZW5kbyBkbyBxdWUgasOhIMOpIGNvbmhlY2lkbyBkZSBtw6pzL2Fuby4gTnVuY2EgXCJhZGl2aW5oYVwiIGNvbSBvIG3DqnMvYW5vXG4gICAgICogYXR1YWlzIGRvIHNpc3RlbWEg4oCUIGlzc28gZXN0cmVpdGFyaWEgbyByYW5nZSBhbnRlcyBkYSBob3JhIChleC46IGRpYT0yOSBkaWdpdGFkbyBhbnRlcyBkb1xuICAgICAqIGFubywgbcOqcz1mZXZlcmVpcm8gY29uaGVjaWRvIG1hcyBhbm8gYWluZGEgbsOjbyAtPiBzZSBhc3N1bWlzc2UgbyBhbm8gYXR1YWwgZG8gc2lzdGVtYSBlIGVsZVxuICAgICAqIG7Do28gZm9zc2UgYmlzc2V4dG8sIG8gZGlhIHNlcmlhIGNsYW1wYWRvIHBhcmEgMjggZSBudW5jYSBtYWlzIHJlZXhwYW5kaWRvIHBhcmEgMjkgbWVzbW8gcXVlXG4gICAgICogbyBhbm8gcmVhbG1lbnRlIGRpZ2l0YWRvIGRlcG9pcyBzZWphIGJpc3NleHRvKS4gRW0gdmV6IGRpc3NvLCBmaWNhIHNlbXByZSBubyBsYWRvIHBlcm1pc3Npdm9cbiAgICAgKiBhdMOpIHF1ZSBhIGluZm9ybWHDp8OjbyByZWFsbWVudGUgZXhpc3RhLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGF5c0luTW9udGhOb3coKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoS25vd24gPSAhIW1vbnRoU2VnbWVudD8udGV4dCAmJiBtb250aFNlZ21lbnQudGV4dC5sZW5ndGggPT09IG1vbnRoU2VnbWVudC5sZW5ndGg7XG4gICAgICAgIGlmICghbW9udGhTZWdtZW50IHx8ICFtb250aEtub3duKSByZXR1cm4gR0VORVJJQ19NQVhfREFZO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoU2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXJTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ3llYXInKTtcbiAgICAgICAgY29uc3QgeWVhcktub3duID0gISF5ZWFyU2VnbWVudD8udGV4dCAmJiB5ZWFyU2VnbWVudC50ZXh0Lmxlbmd0aCA9PT0gWUVBUl9TRUdNRU5UX0xFTkdUSDtcbiAgICAgICAgaWYgKCF5ZWFyU2VnbWVudCB8fCAheWVhcktub3duKSByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIExFQVBfUkVGRVJFTkNFX1lFQVIpO1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIHBhcnNlSW50KHllYXJTZWdtZW50LnRleHQsIDEwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVEYXlJZk5lZWRlZChjb21taXR0ZWRLaW5kOiBTZWdtZW50S2luZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWl0dGVkS2luZCAhPT0gJ21vbnRoJyAmJiBjb21taXR0ZWRLaW5kICE9PSAneWVhcicpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF5U2VnbWVudCA9IHRoaXMuZmluZEVkaXRhYmxlKCdkYXknKTtcbiAgICAgICAgaWYgKCFkYXlTZWdtZW50IHx8IGRheVNlZ21lbnQudGV4dC5sZW5ndGggIT09IGRheVNlZ21lbnQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZGF5c0luTW9udGhOb3coKTtcbiAgICAgICAgY29uc3QgZGF5TnVtID0gcGFyc2VJbnQoZGF5U2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGlmIChkYXlOdW0gPiBtYXgpIHtcbiAgICAgICAgICAgIGRheVNlZ21lbnQudGV4dCA9IFN0cmluZyhtYXgpLnBhZFN0YXJ0KGRheVNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRWRpdGFibGUoa2luZDogU2VnbWVudEtpbmQpOiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLmZpbmQoKHMpOiBzIGlzIEVkaXRhYmxlU2VnbWVudFN0YXRlID0+IGlzRWRpdGFibGVTZWdtZW50KHMpICYmIHMua2luZCA9PT0ga2luZCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZXZlcnkoKHMpID0+ICFpc0VkaXRhYmxlU2VnbWVudChzKSB8fCBzLnRleHQgPT09ICcnKTtcbiAgICB9XG5cbiAgICBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5ldmVyeSgocykgPT4gIWlzRWRpdGFibGVTZWdtZW50KHMpIHx8IHMudGV4dC5sZW5ndGggPT09IHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsb2FkRnJvbURhdGUoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWdtZW50LnRleHQgPSB0aGlzLnJlbmRlclZhbHVlRm9yKHNlZ21lbnQua2luZCwgZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclZhbHVlRm9yKGtpbmQ6IFNlZ21lbnRLaW5kLCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkucGFkU3RhcnQoWUVBUl9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicgPyAoaCAlIEhPVVJTX1BFUl9NRVJJRElFTSA9PT0gMCA/IEhPVVJTX1BFUl9NRVJJRElFTSA6IGggJSBIT1VSU19QRVJfTUVSSURJRU0pIDogaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRpc3BsYXkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydChTSE9SVF9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICdhbXBtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgSE9VUlNfUEVSX01FUklESUVNID8gJ0FNJyA6ICdQTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29uc3Ryw7NpIG8gYERhdGVgIGEgcGFydGlyIGRvcyBzZWdtZW50b3M7IGBudWxsYCBlbnF1YW50byBpbmNvbXBsZXRvLiBVc2EgYHJlZmVyZW5jZURhdGVgIHBhcmEgcHJlZW5jaGVyIHBhcnRlcyBhdXNlbnRlcyAoZXguOiBob3JhIGFvIGVkaXRhciBzw7MgYSBkYXRhKS4gKi9cbiAgICB0b0RhdGUocmVmZXJlbmNlRGF0ZT86IERhdGUgfCBudWxsKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVmID0gcmVmZXJlbmNlRGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2luZDogU2VnbWVudEtpbmQpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLmZpbmRFZGl0YWJsZShraW5kKTtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50ID8gcGFyc2VJbnQoc2VnbWVudC50ZXh0LCAxMCkgOiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHllYXIgPSBnZXROdW0oJ3llYXInKSA/PyByZWYuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGhOdW0gPSBnZXROdW0oJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhOdW0gIT09IG51bGwgPyBtb250aE51bSAtIDEgOiByZWYuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5jb25maWc/Lm1vZGUgPT09ICdtb250aCcgPyAxIDogKGdldE51bSgnZGF5JykgPz8gcmVmLmdldERhdGUoKSk7XG5cbiAgICAgICAgbGV0IGhvdXIgPSBnZXROdW0oJ2hvdXInKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZ2V0TnVtKCdtaW51dGUnKSA/PyByZWYuZ2V0TWludXRlcygpO1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBnZXROdW0oJ3NlY29uZCcpID8/IHJlZi5nZXRTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKGhvdXIgIT09IG51bGwgJiYgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcG1TZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ2FtcG0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUG0gPSBhbXBtU2VnbWVudD8udGV4dCA9PT0gJ1BNJztcbiAgICAgICAgICAgIGhvdXIgPSBob3VyICUgSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgaWYgKGlzUG0pIGhvdXIgKz0gSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIgPz8gcmVmLmdldEhvdXJzKCksIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICB9XG59XG4iXX0=
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1zZWdtZW50LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2RhdGVwaWNrZXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGUtc2VnbWVudC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyQkEsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBRWpDLFNBQVMsaUJBQWlCLENBQUMsT0FBcUI7SUFDNUMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsb0dBQW9HO0FBQ3BHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQzdDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLG9CQUFvQixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUE2QixDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzQixTQUFTLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFDRCxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQsOEZBQThGO0FBQzlGLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYSxFQUFFLElBQVk7SUFDbkQsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFVBQWtCO0lBQ3pDLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFnQixFQUFFO1FBQzlELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDMUYsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzdGLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxVQUFrQjtJQUMxQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO0lBQ3RELElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7U0FBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxVQUF1QixFQUFFLFdBQW9CO0lBQ3BFLE1BQU0sUUFBUSxHQUFtQjtRQUM3QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7UUFDeEQsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDOUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0tBQzdELENBQUM7SUFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2QsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUNELElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxNQUEyQjtJQUNqRCxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDUCxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxLQUFLLE9BQU87WUFDUixPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU07WUFDUCxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssVUFBVTtZQUNYLE9BQU87Z0JBQ0gsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUN2QyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDOUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDOUQsQ0FBQztJQUNWLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUNsQixRQUFRLEdBQW1CLEVBQUUsQ0FBQztJQUM5QixNQUFNLEdBQStCLElBQUksQ0FBQztJQUMxQyxXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBRTFCLFNBQVMsQ0FBQyxNQUEyQjtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0I7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVPLGFBQWEsQ0FBQyxPQUE2QjtRQUMvQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRU8sbUJBQW1CLENBQUMsT0FBcUI7UUFDN0MsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDN0UsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixLQUFLLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYztRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7SUFFRCx3R0FBd0c7SUFDeEcsb0JBQW9CO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7SUFFRCxlQUFlLENBQUMsU0FBaUI7UUFDN0IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBYTtRQUN2QixJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDbkcsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLHFCQUFxQixDQUFDLFNBQWlCO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTyxVQUFVLENBQUM7UUFDakQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1QixHQUFHLENBQUM7WUFDQSxJQUFJLElBQUksU0FBUyxDQUFDO1FBQ3RCLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUM5RixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsT0FBTyxVQUFVLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNO1lBQUUsT0FBTztRQUNuRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDbEQsT0FBTyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDdEIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLEdBQUcsQ0FBQztZQUNBLElBQUksSUFBSSxDQUFDLENBQUM7UUFDZCxDQUFDLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ2pGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNO1lBQUUsT0FBTztRQUNuRSxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUE0QjtRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSTtZQUFFLE9BQU87UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDeEMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUM1QixHQUFHLENBQUM7b0JBQ0EsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDZCxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDL0QsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU87UUFDWCxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHVHQUF1RztJQUN2RyxRQUFRO1FBQ0osS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTztRQUN4QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixtQkFBbUI7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSTtZQUFFLE9BQU87UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDeEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsVUFBVTtRQUNOLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFTyxXQUFXLENBQUMsT0FBNkI7UUFDN0MsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQWlCO1FBQy9CLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDWCxLQUFLLEtBQUs7Z0JBQ04sT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ2xELEtBQUssT0FBTztnQkFDUixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxLQUFLLE1BQU07Z0JBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxJQUFJO29CQUNuQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDdkMsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVE7Z0JBQ1QsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUM7WUFDOUM7Z0JBQ0ksT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGNBQWM7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQzVGLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxlQUFlLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQztRQUN6RixJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxhQUEwQjtRQUNuRCxJQUFJLGFBQWEsS0FBSyxPQUFPLElBQUksYUFBYSxLQUFLLE1BQU07WUFBRSxPQUFPO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBaUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBNkIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELFVBQVU7UUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWlCO1FBQzFCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztnQkFBRSxTQUFTO1lBQzFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLElBQWlCLEVBQUUsSUFBVTtRQUNoRCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxLQUFLO2dCQUNOLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RSxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzRSxLQUFLLE1BQU07Z0JBQ1AsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDVixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sT0FBTyxHQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEgsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFDRCxLQUFLLFFBQVE7Z0JBQ1QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLEtBQUssUUFBUTtnQkFDVCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekUsS0FBSyxNQUFNO2dCQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRSxDQUFDO0lBQ0wsQ0FBQztJQUVELGdLQUFnSztJQUNoSyxNQUFNLENBQUMsYUFBMkI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxhQUFhLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQWlCLEVBQWlCLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2RCxDQUFDLENBQUM7UUFFRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWpGLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFcEQsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsV0FBVyxFQUFFLElBQUksS0FBSyxJQUFJLENBQUM7WUFDeEMsSUFBSSxHQUFHLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUNqQyxJQUFJLElBQUk7Z0JBQUUsSUFBSSxJQUFJLGtCQUFrQixDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNlZ21lbnRLaW5kID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInIHwgJ2hvdXInIHwgJ21pbnV0ZScgfCAnc2Vjb25kJyB8ICdhbXBtJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB7XG4gICAga2luZDogU2VnbWVudEtpbmQ7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpdGVyYWxTZWdtZW50U3RhdGUge1xuICAgIGtpbmQ6ICdsaXRlcmFsJztcbiAgICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFNlZ21lbnRTdGF0ZSA9IEVkaXRhYmxlU2VnbWVudFN0YXRlIHwgTGl0ZXJhbFNlZ21lbnRTdGF0ZTtcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50RW5naW5lQ29uZmlnIHtcbiAgICBtb2RlOiAnZGF0ZScgfCAnbW9udGgnIHwgJ3RpbWUnIHwgJ2RhdGV0aW1lJztcbiAgICBkYXRlRm9ybWF0OiBzdHJpbmc7XG4gICAgaG91ckZvcm1hdDogJzEyJyB8ICcyNCc7XG4gICAgc2hvd1NlY29uZHM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGb3JtYXRUb2tlbiB7XG4gICAga2luZDogJ2RheScgfCAnbW9udGgnIHwgJ3llYXInIHwgJ2xpdGVyYWwnO1xuICAgIHJhdzogc3RyaW5nO1xufVxuXG5jb25zdCBEQVRFX0ZPUk1BVF9UT0tFTl9SRSA9IC95eXl5fHl5fE1NfG1tfGRkfGQvZztcbmNvbnN0IFlFQVJfU0VHTUVOVF9MRU5HVEggPSA0O1xuY29uc3QgU0hPUlRfU0VHTUVOVF9MRU5HVEggPSAyO1xuY29uc3QgSE9VUlNfUEVSX01FUklESUVNID0gMTI7XG5jb25zdCBNQVhfSE9VUl8yNCA9IDIzO1xuY29uc3QgTUFYX01JTlVURV9TRUNPTkQgPSA1OTtcbmNvbnN0IEdFTkVSSUNfTUFYX0RBWSA9IDMxO1xuY29uc3QgTEVBUF9SRUZFUkVOQ0VfWUVBUiA9IDIwMDA7XG5cbmZ1bmN0aW9uIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQ6IFNlZ21lbnRTdGF0ZSk6IHNlZ21lbnQgaXMgRWRpdGFibGVTZWdtZW50U3RhdGUge1xuICAgIHJldHVybiBzZWdtZW50LmtpbmQgIT09ICdsaXRlcmFsJztcbn1cblxuLyoqIFRva2VuaXphIHVtIGBkYXRlRm9ybWF0YCAoZXguOiBgZGQvTU0veXl5eWAsIGBNTS9kZC95eWApIGVtIHRva2VucyBkZSBkaWEvbcOqcy9hbm8gKyBsaXRlcmFpcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZURhdGVGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBGb3JtYXRUb2tlbltdIHtcbiAgICBjb25zdCB0b2tlbnM6IEZvcm1hdFRva2VuW10gPSBbXTtcbiAgICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgICBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5sYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gREFURV9GT1JNQVRfVE9LRU5fUkUuZXhlYyhmb3JtYXQpKSkge1xuICAgICAgICBpZiAobWF0Y2guaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCByYXc6IGZvcm1hdC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYXcgPSBtYXRjaFswXTtcbiAgICAgICAgY29uc3Qga2luZCA9IHJhd1swXSA9PT0gJ3knID8gJ3llYXInIDogcmF3WzBdID09PSAnZCcgPyAnZGF5JyA6ICdtb250aCc7XG4gICAgICAgIHRva2Vucy5wdXNoKHsga2luZCwgcmF3IH0pO1xuICAgICAgICBsYXN0SW5kZXggPSBEQVRFX0ZPUk1BVF9UT0tFTl9SRS5sYXN0SW5kZXg7XG4gICAgfVxuICAgIGlmIChsYXN0SW5kZXggPCBmb3JtYXQubGVuZ3RoKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHsga2luZDogJ2xpdGVyYWwnLCByYXc6IGZvcm1hdC5zbGljZShsYXN0SW5kZXgpIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKiogRGlhcyBubyBtw6pzICgxLTEyKSwgasOhIHJlc29sdmVuZG8gZmV2ZXJlaXJvL2FubyBiaXNzZXh0byB2aWEgcm9sbG92ZXIgbmF0aXZvIGRvIGBEYXRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXlzSW5Nb250aChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xufVxuXG5mdW5jdGlvbiBidWlsZERhdGVTZWdtZW50cyhkYXRlRm9ybWF0OiBzdHJpbmcpOiBTZWdtZW50U3RhdGVbXSB7XG4gICAgcmV0dXJuIHRva2VuaXplRGF0ZUZvcm1hdChkYXRlRm9ybWF0KS5tYXAoKHRva2VuKTogU2VnbWVudFN0YXRlID0+IHtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHsga2luZDogJ2xpdGVyYWwnLCB0ZXh0OiB0b2tlbi5yYXcgfTtcbiAgICAgICAgaWYgKHRva2VuLmtpbmQgPT09ICd5ZWFyJykgcmV0dXJuIHsga2luZDogJ3llYXInLCBsZW5ndGg6IFlFQVJfU0VHTUVOVF9MRU5HVEgsIHRleHQ6ICcnIH07XG4gICAgICAgIGlmICh0b2tlbi5raW5kID09PSAnbW9udGgnKSByZXR1cm4geyBraW5kOiAnbW9udGgnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9O1xuICAgICAgICByZXR1cm4geyBraW5kOiAnZGF5JywgbGVuZ3RoOiBTSE9SVF9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNb250aFNlZ21lbnRzKGRhdGVGb3JtYXQ6IHN0cmluZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBjb25zdCBhbGwgPSBidWlsZERhdGVTZWdtZW50cyhkYXRlRm9ybWF0KTtcbiAgICBjb25zdCBkYXlJZHggPSBhbGwuZmluZEluZGV4KChzKSA9PiBzLmtpbmQgPT09ICdkYXknKTtcbiAgICBpZiAoZGF5SWR4ID09PSAtMSkgcmV0dXJuIGFsbDtcbiAgICBjb25zdCBkcm9wSW5kZXhlcyA9IG5ldyBTZXQ8bnVtYmVyPihbZGF5SWR4XSk7XG4gICAgaWYgKGFsbFtkYXlJZHggKyAxXT8ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGRyb3BJbmRleGVzLmFkZChkYXlJZHggKyAxKTtcbiAgICB9IGVsc2UgaWYgKGFsbFtkYXlJZHggLSAxXT8ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGRyb3BJbmRleGVzLmFkZChkYXlJZHggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbC5maWx0ZXIoKF8sIGkpID0+ICFkcm9wSW5kZXhlcy5oYXMoaSkpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRpbWVTZWdtZW50cyhob3VyRm9ybWF0OiAnMTInIHwgJzI0Jywgc2hvd1NlY29uZHM6IGJvb2xlYW4pOiBTZWdtZW50U3RhdGVbXSB7XG4gICAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRTdGF0ZVtdID0gW1xuICAgICAgICB7IGtpbmQ6ICdob3VyJywgbGVuZ3RoOiBTSE9SVF9TRUdNRU5UX0xFTkdUSCwgdGV4dDogJycgfSxcbiAgICAgICAgeyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6ICc6JyB9LFxuICAgICAgICB7IGtpbmQ6ICdtaW51dGUnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9LFxuICAgIF07XG4gICAgaWYgKHNob3dTZWNvbmRzKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goeyBraW5kOiAnbGl0ZXJhbCcsIHRleHQ6ICc6JyB9LCB7IGtpbmQ6ICdzZWNvbmQnLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9KTtcbiAgICB9XG4gICAgaWYgKGhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJyAnIH0sIHsga2luZDogJ2FtcG0nLCBsZW5ndGg6IFNIT1JUX1NFR01FTlRfTEVOR1RILCB0ZXh0OiAnJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlZ21lbnRzRm9yKGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyk6IFNlZ21lbnRTdGF0ZVtdIHtcbiAgICBzd2l0Y2ggKGNvbmZpZy5tb2RlKSB7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkRGF0ZVNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTW9udGhTZWdtZW50cyhjb25maWcuZGF0ZUZvcm1hdCk7XG4gICAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkVGltZVNlZ21lbnRzKGNvbmZpZy5ob3VyRm9ybWF0LCBjb25maWcuc2hvd1NlY29uZHMpO1xuICAgICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIC4uLmJ1aWxkRGF0ZVNlZ21lbnRzKGNvbmZpZy5kYXRlRm9ybWF0KSxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6ICdsaXRlcmFsJywgdGV4dDogJyAnIH0sXG4gICAgICAgICAgICAgICAgLi4uYnVpbGRUaW1lU2VnbWVudHMoY29uZmlnLmhvdXJGb3JtYXQsIGNvbmZpZy5zaG93U2Vjb25kcyksXG4gICAgICAgICAgICBdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFbmdpbmUgZGUgc2VnbWVudG9zIChkaWEvbcOqcy9hbm8vaG9yYS9taW51dG8vc2VndW5kby9hbXBtKSBwYXJhIG8gdHJpZ2dlciBkbyBkYXRlcGlja2VyLlxuICogU2VtIGRlcGVuZMOqbmNpYXMgZGUgQW5ndWxhciDigJQgRE9NL0NWQSBmaWNhbSBwb3IgY29udGEgZG8gY29tcG9uZW50ZSBxdWUgYSBjb25zb21lLlxuICovXG5leHBvcnQgY2xhc3MgRGF0ZVNlZ21lbnRFbmdpbmUge1xuICAgIHByaXZhdGUgc2VnbWVudHM6IFNlZ21lbnRTdGF0ZVtdID0gW107XG4gICAgcHJpdmF0ZSBjb25maWc6IFNlZ21lbnRFbmdpbmVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGFjdGl2ZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGZyZXNoRW50cnkgPSB0cnVlO1xuXG4gICAgY29uZmlndXJlKGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IGJ1aWxkU2VnbWVudHNGb3IoY29uZmlnKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5tYXAoKHMpID0+IChpc0VkaXRhYmxlU2VnbWVudChzKSA/IHRoaXMucmVuZGVyU2VnbWVudChzKSA6IHMudGV4dCkpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyU2VnbWVudChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzZWdtZW50LnRleHQgKyAnXycucmVwZWF0KE1hdGgubWF4KDAsIHNlZ21lbnQubGVuZ3RoIC0gc2VnbWVudC50ZXh0Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VnbWVudFJlbmRlckxlbmd0aChzZWdtZW50OiBTZWdtZW50U3RhdGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkgPyBzZWdtZW50Lmxlbmd0aCA6IHNlZ21lbnQudGV4dC5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0U2VnbWVudFJhbmdlKGluZGV4OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBzdGFydCArPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzdGFydCwgc3RhcnQgKyB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpbmRleF0pXTtcbiAgICB9XG5cbiAgICBnZXRGaXJzdEVkaXRhYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZmluZEluZGV4KChzKSA9PiBpc0VkaXRhYmxlU2VnbWVudChzKSk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc2VnbWVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGdldEFjdGl2ZUluZGV4KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJbmRleDtcbiAgICB9XG5cbiAgICBhY3RpdmVLaW5kKCk6IFNlZ21lbnRLaW5kIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIHJldHVybiBpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSA/IHNlZ21lbnQua2luZCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIFRleHRvIGJydXRvIChzZW0gcGFkZGluZyBkZSBzdWJsaW5oYWRvKSBkbyBzZWdtZW50byBhdGl2byDigJQgdXNhZG8gcGVsbyBhbsO6bmNpbyBkZSBhY2Vzc2liaWxpZGFkZS4gKi9cbiAgICBnZXRBY3RpdmVTZWdtZW50VGV4dCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpID8gc2VnbWVudC50ZXh0IDogbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50QXQoY2hhckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgYWNjID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnNlZ21lbnRSZW5kZXJMZW5ndGgodGhpcy5zZWdtZW50c1tpXSk7XG4gICAgICAgICAgICBpZiAoY2hhckluZGV4IDwgYWNjICsgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVhcmVzdEVkaXRhYmxlRnJvbShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjYyArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lYXJlc3RFZGl0YWJsZUZyb20oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW2ldKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVkaXRhYmxlSW5kZXgoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTZWdtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCB8fCAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tpbmRleF0pKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZWxlY3RGaXJzdFNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudCh0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpKTtcbiAgICB9XG5cbiAgICAvKiogQ29tbWl0YSAocGFkL2NsYW1wKSBvIHNlZ21lbnRvIGF0aXZvIGUgbW92ZSBwYXJhIG8gcHLDs3hpbW8vYW50ZXJpb3IgZWRpdMOhdmVsLiAqL1xuICAgIG1vdmVUb0FkamFjZW50U2VnbWVudChkaXJlY3Rpb246IDEgfCAtMSk6ICdtb3ZlZCcgfCAnYm91bmRhcnknIHtcbiAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgbGV0IG5leHQgPSB0aGlzLmFjdGl2ZUluZGV4O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBuZXh0ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA+PSAwICYmIG5leHQgPCB0aGlzLnNlZ21lbnRzLmxlbmd0aCAmJiAhaXNFZGl0YWJsZVNlZ21lbnQodGhpcy5zZWdtZW50c1tuZXh0XSkpO1xuICAgICAgICBpZiAobmV4dCA8IDAgfHwgbmV4dCA+PSB0aGlzLnNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gJ2JvdW5kYXJ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdFNlZ21lbnQobmV4dCk7XG4gICAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH1cblxuICAgIHR5cGVEaWdpdChkaWdpdDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCA9PT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZyZXNoRW50cnkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dC5sZW5ndGggPj0gc2VnbWVudC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgc2VnbWVudC50ZXh0ICs9IGRpZ2l0O1xuICAgICAgICBpZiAoc2VnbWVudC50ZXh0Lmxlbmd0aCA+PSBzZWdtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9BZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9BZHZhbmNlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYWN0aXZlSW5kZXg7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgfSB3aGlsZSAobmV4dCA8IHRoaXMuc2VnbWVudHMubGVuZ3RoICYmICFpc0VkaXRhYmxlU2VnbWVudCh0aGlzLnNlZ21lbnRzW25leHRdKSk7XG4gICAgICAgIGlmIChuZXh0IDwgdGhpcy5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0U2VnbWVudChuZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEFtUG0odmFsdWU6IDAgfCAxKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpIHx8IHNlZ21lbnQua2luZCAhPT0gJ2FtcG0nKSByZXR1cm47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHZhbHVlID09PSAxID8gJ1BNJyA6ICdBTSc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgY2xlYXJBY3RpdmVTZWdtZW50KGtpbmQ6ICdiYWNrc3BhY2UnIHwgJ2RlbGV0ZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5hY3RpdmVJbmRleF07XG4gICAgICAgIGlmICghaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKHNlZ21lbnQudGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSAnYmFja3NwYWNlJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5hY3RpdmVJbmRleDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgLT0gMTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID49IDAgJiYgIWlzRWRpdGFibGVTZWdtZW50KHRoaXMuc2VnbWVudHNbcHJldl0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBwcmV2O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIExpbXBhIHRvZG9zIG9zIHNlZ21lbnRvcyBlZGl0w6F2ZWlzICh1c2FkbyBxdWFuZG8gbyBjYW1wbyBpbnRlaXJvIGVzdMOhIHNlbGVjaW9uYWRvLCBleC46IEN0cmwrQSkuICovXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZVNlZ21lbnQoc2VnbWVudCkpIHNlZ21lbnQudGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmdldEZpcnN0RWRpdGFibGVJbmRleCgpO1xuICAgICAgICB0aGlzLmZyZXNoRW50cnkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlbWVudGEvZGVjcmVtZW50YSBvIHNlZ21lbnRvIGF0aXZvLCBkYW5kbyBhIHZvbHRhICh3cmFwKSBkZW50cm8gZG8gcmFuZ2UgdsOhbGlkby5cbiAgICAgKiBFeGNlw6fDo286IGFubyB2YXppbyBzZW1wcmUgcG91c2Egbm8gYW5vIGF0dWFsIGRvIHNpc3RlbWEgbmEgcHJpbWVpcmEgc2V0YSAodXAgb3UgZG93biksXG4gICAgICogZW0gdmV6IGRlIDAwMDAvOTk5OSDigJQgc8OzIHBhc3NhIGEgaW5jcmVtZW50YXIvZGVjcmVtZW50YXIgYSBwYXJ0aXIgZGEgc2VndW5kYSBzZXRhLlxuICAgICAqL1xuICAgIGluY3JlbWVudEFjdGl2ZVNlZ21lbnQoZGVsdGE6IDEgfCAtMSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLmFjdGl2ZUluZGV4XTtcbiAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgcmV0dXJuO1xuICAgICAgICBpZiAoc2VnbWVudC5raW5kID09PSAnYW1wbScpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QW1QbShzZWdtZW50LnRleHQgPT09ICdQTScgPyAwIDogMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PT0gJ3llYXInICYmICFzZWdtZW50LnRleHQpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoc2VnbWVudC5raW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCByYW5nZSA9IG1heCAtIG1pbiArIDE7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWdtZW50LnRleHQgPyBwYXJzZUludChzZWdtZW50LnRleHQsIDEwKSA6IGRlbHRhID4gMCA/IG1pbiAtIDEgOiBtaW47XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKChjdXJyZW50ICsgZGVsdGEgLSBtaW4pICUgcmFuZ2UpICsgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IFN0cmluZyhuZXh0KS5wYWRTdGFydChzZWdtZW50Lmxlbmd0aCwgJzAnKTtcbiAgICAgICAgdGhpcy5mcmVzaEVudHJ5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNvbmNpbGVEYXlJZk5lZWRlZChzZWdtZW50LmtpbmQpO1xuICAgIH1cblxuICAgIC8qKiBQYWQvY2xhbXAgZG8gc2VnbWVudG8gYXRpdm8gKGV4LjogXCIyXCIgLT4gXCIwMlwiLCBcIjQ1XCIgbm8gZGlhIC0+IGNsYW1wIHBhcmEgZGF5c0luTW9udGgpLiAqL1xuICAgIGNvbW1pdEFjdGl2ZVNlZ21lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzW3RoaXMuYWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAoIWlzRWRpdGFibGVTZWdtZW50KHNlZ21lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGtpbmQgPSBzZWdtZW50LmtpbmQ7XG4gICAgICAgIHNlZ21lbnQudGV4dCA9IHRoaXMuY2xhbXBBbmRQYWQoc2VnbWVudCk7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVjb25jaWxlRGF5SWZOZWVkZWQoa2luZCk7XG4gICAgfVxuXG4gICAgLyoqIENvbW1pdGEgbyBzZWdtZW50byBhdGl2byBlIHNhaSBkbyBtb2RvIGRlIGVkacOnw6NvICh1c2FkbyBubyBibHVyIGRvIGNhbXBvKS4gKi9cbiAgICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1pdEFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGFtcEFuZFBhZChzZWdtZW50OiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT09ICdhbXBtJyB8fCBzZWdtZW50LmtpbmQgPT09ICd5ZWFyJyB8fCAhc2VnbWVudC50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VnbWVudC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KHNlZ21lbnQudGV4dCwgMTApO1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzLmJvdW5kc0ZvcihzZWdtZW50LmtpbmQpO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG51bSkpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKGNsYW1wZWQpLnBhZFN0YXJ0KHNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYm91bmRzRm9yKGtpbmQ6IFNlZ21lbnRLaW5kKTogeyBtaW46IG51bWJlcjsgbWF4OiBudW1iZXIgfSB7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IDEsIG1heDogdGhpcy5kYXlzSW5Nb250aE5vdygpIH07XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAxLCBtYXg6IEhPVVJTX1BFUl9NRVJJRElFTSB9O1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5ob3VyRm9ybWF0ID09PSAnMTInXG4gICAgICAgICAgICAgICAgICAgID8geyBtaW46IDEsIG1heDogSE9VUlNfUEVSX01FUklESUVNIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IG1pbjogMCwgbWF4OiBNQVhfSE9VUl8yNCB9O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiAwLCBtYXg6IE1BWF9NSU5VVEVfU0VDT05EIH07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogMCwgbWF4OiA5OTk5IH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCb3VuZCBkbyBkaWEgZGVwZW5kZW5kbyBkbyBxdWUgasOhIMOpIGNvbmhlY2lkbyBkZSBtw6pzL2Fuby4gTnVuY2EgXCJhZGl2aW5oYVwiIGNvbSBvIG3DqnMvYW5vXG4gICAgICogYXR1YWlzIGRvIHNpc3RlbWEg4oCUIGlzc28gZXN0cmVpdGFyaWEgbyByYW5nZSBhbnRlcyBkYSBob3JhIChleC46IGRpYT0yOSBkaWdpdGFkbyBhbnRlcyBkb1xuICAgICAqIGFubywgbcOqcz1mZXZlcmVpcm8gY29uaGVjaWRvIG1hcyBhbm8gYWluZGEgbsOjbyAtPiBzZSBhc3N1bWlzc2UgbyBhbm8gYXR1YWwgZG8gc2lzdGVtYSBlIGVsZVxuICAgICAqIG7Do28gZm9zc2UgYmlzc2V4dG8sIG8gZGlhIHNlcmlhIGNsYW1wYWRvIHBhcmEgMjggZSBudW5jYSBtYWlzIHJlZXhwYW5kaWRvIHBhcmEgMjkgbWVzbW8gcXVlXG4gICAgICogbyBhbm8gcmVhbG1lbnRlIGRpZ2l0YWRvIGRlcG9pcyBzZWphIGJpc3NleHRvKS4gRW0gdmV6IGRpc3NvLCBmaWNhIHNlbXByZSBubyBsYWRvIHBlcm1pc3Npdm9cbiAgICAgKiBhdMOpIHF1ZSBhIGluZm9ybWHDp8OjbyByZWFsbWVudGUgZXhpc3RhLlxuICAgICAqL1xuICAgIHByaXZhdGUgZGF5c0luTW9udGhOb3coKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW9udGhTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoS25vd24gPSAhIW1vbnRoU2VnbWVudD8udGV4dCAmJiBtb250aFNlZ21lbnQudGV4dC5sZW5ndGggPT09IG1vbnRoU2VnbWVudC5sZW5ndGg7XG4gICAgICAgIGlmICghbW9udGhTZWdtZW50IHx8ICFtb250aEtub3duKSByZXR1cm4gR0VORVJJQ19NQVhfREFZO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1vbnRoU2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXJTZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ3llYXInKTtcbiAgICAgICAgY29uc3QgeWVhcktub3duID0gISF5ZWFyU2VnbWVudD8udGV4dCAmJiB5ZWFyU2VnbWVudC50ZXh0Lmxlbmd0aCA9PT0gWUVBUl9TRUdNRU5UX0xFTkdUSDtcbiAgICAgICAgaWYgKCF5ZWFyU2VnbWVudCB8fCAheWVhcktub3duKSByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIExFQVBfUkVGRVJFTkNFX1lFQVIpO1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgobW9udGgsIHBhcnNlSW50KHllYXJTZWdtZW50LnRleHQsIDEwKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVEYXlJZk5lZWRlZChjb21taXR0ZWRLaW5kOiBTZWdtZW50S2luZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWl0dGVkS2luZCAhPT0gJ21vbnRoJyAmJiBjb21taXR0ZWRLaW5kICE9PSAneWVhcicpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGF5U2VnbWVudCA9IHRoaXMuZmluZEVkaXRhYmxlKCdkYXknKTtcbiAgICAgICAgaWYgKCFkYXlTZWdtZW50IHx8IGRheVNlZ21lbnQudGV4dC5sZW5ndGggIT09IGRheVNlZ21lbnQubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZGF5c0luTW9udGhOb3coKTtcbiAgICAgICAgY29uc3QgZGF5TnVtID0gcGFyc2VJbnQoZGF5U2VnbWVudC50ZXh0LCAxMCk7XG4gICAgICAgIGlmIChkYXlOdW0gPiBtYXgpIHtcbiAgICAgICAgICAgIGRheVNlZ21lbnQudGV4dCA9IFN0cmluZyhtYXgpLnBhZFN0YXJ0KGRheVNlZ21lbnQubGVuZ3RoLCAnMCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRWRpdGFibGUoa2luZDogU2VnbWVudEtpbmQpOiBFZGl0YWJsZVNlZ21lbnRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLmZpbmQoKHMpOiBzIGlzIEVkaXRhYmxlU2VnbWVudFN0YXRlID0+IGlzRWRpdGFibGVTZWdtZW50KHMpICYmIHMua2luZCA9PT0ga2luZCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMuZXZlcnkoKHMpID0+ICFpc0VkaXRhYmxlU2VnbWVudChzKSB8fCBzLnRleHQgPT09ICcnKTtcbiAgICB9XG5cbiAgICBpc0NvbXBsZXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cy5ldmVyeSgocykgPT4gIWlzRWRpdGFibGVTZWdtZW50KHMpIHx8IHMudGV4dC5sZW5ndGggPT09IHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsb2FkRnJvbURhdGUoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgc2VnbWVudC50ZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuZnJlc2hFbnRyeSA9IHRydWU7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCFpc0VkaXRhYmxlU2VnbWVudChzZWdtZW50KSkgY29udGludWU7XG4gICAgICAgICAgICBzZWdtZW50LnRleHQgPSB0aGlzLnJlbmRlclZhbHVlRm9yKHNlZ21lbnQua2luZCwgZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclZhbHVlRm9yKGtpbmQ6IFNlZ21lbnRLaW5kLCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkucGFkU3RhcnQoWUVBUl9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicgPyAoaCAlIEhPVVJTX1BFUl9NRVJJRElFTSA9PT0gMCA/IEhPVVJTX1BFUl9NRVJJRElFTSA6IGggJSBIT1VSU19QRVJfTUVSSURJRU0pIDogaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRpc3BsYXkpLnBhZFN0YXJ0KFNIT1JUX1NFR01FTlRfTEVOR1RILCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydChTSE9SVF9TRUdNRU5UX0xFTkdUSCwgJzAnKTtcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoU0hPUlRfU0VHTUVOVF9MRU5HVEgsICcwJyk7XG4gICAgICAgICAgICBjYXNlICdhbXBtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgSE9VUlNfUEVSX01FUklESUVNID8gJ0FNJyA6ICdQTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29uc3Ryw7NpIG8gYERhdGVgIGEgcGFydGlyIGRvcyBzZWdtZW50b3M7IGBudWxsYCBlbnF1YW50byBpbmNvbXBsZXRvLiBVc2EgYHJlZmVyZW5jZURhdGVgIHBhcmEgcHJlZW5jaGVyIHBhcnRlcyBhdXNlbnRlcyAoZXguOiBob3JhIGFvIGVkaXRhciBzw7MgYSBkYXRhKS4gKi9cbiAgICB0b0RhdGUocmVmZXJlbmNlRGF0ZT86IERhdGUgfCBudWxsKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVmID0gcmVmZXJlbmNlRGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBnZXROdW0gPSAoa2luZDogU2VnbWVudEtpbmQpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLmZpbmRFZGl0YWJsZShraW5kKTtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50ID8gcGFyc2VJbnQoc2VnbWVudC50ZXh0LCAxMCkgOiBudWxsO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHllYXIgPSBnZXROdW0oJ3llYXInKSA/PyByZWYuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGhOdW0gPSBnZXROdW0oJ21vbnRoJyk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhOdW0gIT09IG51bGwgPyBtb250aE51bSAtIDEgOiByZWYuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5jb25maWc/Lm1vZGUgPT09ICdtb250aCcgPyAxIDogKGdldE51bSgnZGF5JykgPz8gcmVmLmdldERhdGUoKSk7XG5cbiAgICAgICAgbGV0IGhvdXIgPSBnZXROdW0oJ2hvdXInKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZ2V0TnVtKCdtaW51dGUnKSA/PyByZWYuZ2V0TWludXRlcygpO1xuICAgICAgICBjb25zdCBzZWNvbmQgPSBnZXROdW0oJ3NlY29uZCcpID8/IHJlZi5nZXRTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKGhvdXIgIT09IG51bGwgJiYgdGhpcy5jb25maWc/LmhvdXJGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtcG1TZWdtZW50ID0gdGhpcy5maW5kRWRpdGFibGUoJ2FtcG0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUG0gPSBhbXBtU2VnbWVudD8udGV4dCA9PT0gJ1BNJztcbiAgICAgICAgICAgIGhvdXIgPSBob3VyICUgSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgaWYgKGlzUG0pIGhvdXIgKz0gSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIgPz8gcmVmLmdldEhvdXJzKCksIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICB9XG59XG4iXX0=
|