@seniorsistemas/angular-components 19.7.4 → 19.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/alert/lib/alert/alert.component.d.ts +8 -1
  2. package/chips/README.md +3 -2
  3. package/chips/lib/chips/chip-item/chip-item.component.d.ts +2 -0
  4. package/chips/lib/chips/chips/chips.component.d.ts +2 -1
  5. package/datepicker/README.md +15 -2
  6. package/datepicker/lib/datepicker/date-segment-input.d.ts +82 -0
  7. package/datepicker/lib/datepicker/date.utils.d.ts +3 -7
  8. package/datepicker/lib/datepicker/datepicker.component.d.ts +101 -8
  9. package/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.d.ts +7 -1
  10. package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +1 -1
  11. package/dynamic-form/public-api.d.ts +1 -1
  12. package/esm2022/alert/lib/alert/alert.component.mjs +12 -6
  13. package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +15 -4
  14. package/esm2022/chips/lib/chips/chips/chips.component.mjs +26 -14
  15. package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +418 -0
  16. package/esm2022/datepicker/lib/datepicker/date.utils.mjs +7 -79
  17. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +451 -41
  18. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +2 -2
  19. package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-api.model.mjs +1 -1
  20. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
  21. package/esm2022/dynamic-form/public-api.mjs +1 -1
  22. package/esm2022/panel/lib/panel/panel.component.mjs +3 -3
  23. package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +8 -6
  24. package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +3 -3
  25. package/fesm2022/seniorsistemas-angular-components-alert.mjs +12 -6
  26. package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-chips.mjs +39 -16
  28. package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +873 -118
  30. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  32. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-panel.mjs +2 -2
  34. package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +7 -5
  36. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +2 -2
  38. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
  39. package/package.json +13 -13
  40. package/schematics/migrations/migrate-steps-to-stepper/index.d.ts +2 -0
  41. package/schematics/migrations/migrate-steps-to-stepper/index.js +104 -0
  42. package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -0
  43. package/schematics/migrations.json +5 -0
  44. package/schematics/utils/ast-utils.d.ts +13 -0
  45. package/schematics/utils/ast-utils.js +76 -0
  46. package/schematics/utils/ast-utils.js.map +1 -1
  47. package/sidebar/lib/sidebar/sidebar.component.d.ts +3 -1
  48. package/schematics/migrations/migrate-dynamic-form-v19/index.test.d.ts +0 -1
  49. package/schematics/migrations/migrate-dynamic-form-v19/index.test.js +0 -888
  50. package/schematics/migrations/migrate-dynamic-form-v19/index.test.js.map +0 -1
  51. package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +0 -1
  52. package/schematics/migrations/migrate-p-datepicker/index.test.js +0 -392
  53. package/schematics/migrations/migrate-p-datepicker/index.test.js.map +0 -1
  54. package/schematics/migrations/migrate-p-editor/index.test.d.ts +0 -1
  55. package/schematics/migrations/migrate-p-editor/index.test.js +0 -393
  56. package/schematics/migrations/migrate-p-editor/index.test.js.map +0 -1
  57. package/schematics/migrations/migrate-s-chips-outputs/index.test.d.ts +0 -1
  58. package/schematics/migrations/migrate-s-chips-outputs/index.test.js +0 -125
  59. package/schematics/migrations/migrate-s-chips-outputs/index.test.js.map +0 -1
  60. package/schematics/utils/ast-utils.test.d.ts +0 -1
  61. package/schematics/utils/ast-utils.test.js +0 -138
  62. package/schematics/utils/ast-utils.test.js.map +0 -1
  63. package/schematics/utils/workspace-utils.test.d.ts +0 -1
  64. package/schematics/utils/workspace-utils.test.js +0 -152
  65. package/schematics/utils/workspace-utils.test.js.map +0 -1
@@ -0,0 +1,418 @@
1
+ const DATE_FORMAT_TOKEN_RE = /yyyy|yy|MM|mm|dd|d/g;
2
+ const YEAR_SEGMENT_LENGTH = 4;
3
+ const SHORT_SEGMENT_LENGTH = 2;
4
+ const HOURS_PER_MERIDIEM = 12;
5
+ const MAX_HOUR_24 = 23;
6
+ const MAX_MINUTE_SECOND = 59;
7
+ const GENERIC_MAX_DAY = 31;
8
+ const LEAP_REFERENCE_YEAR = 2000;
9
+ function isEditableSegment(segment) {
10
+ return segment.kind !== 'literal';
11
+ }
12
+ /** Tokeniza um `dateFormat` (ex.: `dd/MM/yyyy`, `MM/dd/yy`) em tokens de dia/mês/ano + literais. */
13
+ export function tokenizeDateFormat(format) {
14
+ const tokens = [];
15
+ let lastIndex = 0;
16
+ DATE_FORMAT_TOKEN_RE.lastIndex = 0;
17
+ let match;
18
+ while ((match = DATE_FORMAT_TOKEN_RE.exec(format))) {
19
+ if (match.index > lastIndex) {
20
+ tokens.push({ kind: 'literal', raw: format.slice(lastIndex, match.index) });
21
+ }
22
+ const raw = match[0];
23
+ const kind = raw[0] === 'y' ? 'year' : raw[0] === 'd' ? 'day' : 'month';
24
+ tokens.push({ kind, raw });
25
+ lastIndex = DATE_FORMAT_TOKEN_RE.lastIndex;
26
+ }
27
+ if (lastIndex < format.length) {
28
+ tokens.push({ kind: 'literal', raw: format.slice(lastIndex) });
29
+ }
30
+ return tokens;
31
+ }
32
+ /** Dias no mês (1-12), já resolvendo fevereiro/ano bissexto via rollover nativo do `Date`. */
33
+ export function daysInMonth(month, year) {
34
+ return new Date(year, month, 0).getDate();
35
+ }
36
+ function buildDateSegments(dateFormat) {
37
+ return tokenizeDateFormat(dateFormat).map((token) => {
38
+ if (token.kind === 'literal')
39
+ return { kind: 'literal', text: token.raw };
40
+ if (token.kind === 'year')
41
+ return { kind: 'year', length: YEAR_SEGMENT_LENGTH, text: '' };
42
+ if (token.kind === 'month')
43
+ return { kind: 'month', length: SHORT_SEGMENT_LENGTH, text: '' };
44
+ return { kind: 'day', length: SHORT_SEGMENT_LENGTH, text: '' };
45
+ });
46
+ }
47
+ function buildMonthSegments(dateFormat) {
48
+ const all = buildDateSegments(dateFormat);
49
+ const dayIdx = all.findIndex((s) => s.kind === 'day');
50
+ if (dayIdx === -1)
51
+ return all;
52
+ const dropIndexes = new Set([dayIdx]);
53
+ if (all[dayIdx + 1]?.kind === 'literal') {
54
+ dropIndexes.add(dayIdx + 1);
55
+ }
56
+ else if (all[dayIdx - 1]?.kind === 'literal') {
57
+ dropIndexes.add(dayIdx - 1);
58
+ }
59
+ return all.filter((_, i) => !dropIndexes.has(i));
60
+ }
61
+ function buildTimeSegments(hourFormat, showSeconds) {
62
+ const segments = [
63
+ { kind: 'hour', length: SHORT_SEGMENT_LENGTH, text: '' },
64
+ { kind: 'literal', text: ':' },
65
+ { kind: 'minute', length: SHORT_SEGMENT_LENGTH, text: '' },
66
+ ];
67
+ if (showSeconds) {
68
+ segments.push({ kind: 'literal', text: ':' }, { kind: 'second', length: SHORT_SEGMENT_LENGTH, text: '' });
69
+ }
70
+ if (hourFormat === '12') {
71
+ segments.push({ kind: 'literal', text: ' ' }, { kind: 'ampm', length: SHORT_SEGMENT_LENGTH, text: '' });
72
+ }
73
+ return segments;
74
+ }
75
+ function buildSegmentsFor(config) {
76
+ switch (config.mode) {
77
+ case 'date':
78
+ return buildDateSegments(config.dateFormat);
79
+ case 'month':
80
+ return buildMonthSegments(config.dateFormat);
81
+ case 'time':
82
+ return buildTimeSegments(config.hourFormat, config.showSeconds);
83
+ case 'datetime':
84
+ return [
85
+ ...buildDateSegments(config.dateFormat),
86
+ { kind: 'literal', text: ' ' },
87
+ ...buildTimeSegments(config.hourFormat, config.showSeconds),
88
+ ];
89
+ }
90
+ }
91
+ /**
92
+ * Engine de segmentos (dia/mês/ano/hora/minuto/segundo/ampm) para o trigger do datepicker.
93
+ * Sem dependências de Angular — DOM/CVA ficam por conta do componente que a consome.
94
+ */
95
+ export class DateSegmentEngine {
96
+ segments = [];
97
+ config = null;
98
+ activeIndex = null;
99
+ freshEntry = true;
100
+ configure(config) {
101
+ this.config = config;
102
+ this.segments = buildSegmentsFor(config);
103
+ this.activeIndex = null;
104
+ this.freshEntry = true;
105
+ }
106
+ getDisplayString() {
107
+ return this.segments.map((s) => (isEditableSegment(s) ? this.renderSegment(s) : s.text)).join('');
108
+ }
109
+ renderSegment(segment) {
110
+ return segment.text + '_'.repeat(Math.max(0, segment.length - segment.text.length));
111
+ }
112
+ segmentRenderLength(segment) {
113
+ return isEditableSegment(segment) ? segment.length : segment.text.length;
114
+ }
115
+ getSegmentRange(index) {
116
+ let start = 0;
117
+ for (let i = 0; i < index; i++) {
118
+ start += this.segmentRenderLength(this.segments[i]);
119
+ }
120
+ return [start, start + this.segmentRenderLength(this.segments[index])];
121
+ }
122
+ getFirstEditableIndex() {
123
+ return this.segments.findIndex((s) => isEditableSegment(s));
124
+ }
125
+ getLastEditableIndex() {
126
+ for (let i = this.segments.length - 1; i >= 0; i--) {
127
+ if (isEditableSegment(this.segments[i]))
128
+ return i;
129
+ }
130
+ return -1;
131
+ }
132
+ getActiveIndex() {
133
+ return this.activeIndex;
134
+ }
135
+ activeKind() {
136
+ if (this.activeIndex === null)
137
+ return null;
138
+ const segment = this.segments[this.activeIndex];
139
+ return isEditableSegment(segment) ? segment.kind : null;
140
+ }
141
+ selectSegmentAt(charIndex) {
142
+ let acc = 0;
143
+ for (let i = 0; i < this.segments.length; i++) {
144
+ const len = this.segmentRenderLength(this.segments[i]);
145
+ if (charIndex < acc + len) {
146
+ return this.nearestEditableFrom(i);
147
+ }
148
+ acc += len;
149
+ }
150
+ return this.getLastEditableIndex();
151
+ }
152
+ nearestEditableFrom(index) {
153
+ for (let i = index; i < this.segments.length; i++) {
154
+ if (isEditableSegment(this.segments[i]))
155
+ return i;
156
+ }
157
+ return this.getLastEditableIndex();
158
+ }
159
+ selectSegment(index) {
160
+ if (index < 0 || index >= this.segments.length || !isEditableSegment(this.segments[index]))
161
+ return;
162
+ this.activeIndex = index;
163
+ this.freshEntry = true;
164
+ }
165
+ selectFirstSegment() {
166
+ this.selectSegment(this.getFirstEditableIndex());
167
+ }
168
+ /** Commita (pad/clamp) o segmento ativo e move para o próximo/anterior editável. */
169
+ moveToAdjacentSegment(direction) {
170
+ this.commitActiveSegment();
171
+ if (this.activeIndex === null)
172
+ return 'boundary';
173
+ let next = this.activeIndex;
174
+ do {
175
+ next += direction;
176
+ } while (next >= 0 && next < this.segments.length && !isEditableSegment(this.segments[next]));
177
+ if (next < 0 || next >= this.segments.length) {
178
+ this.activeIndex = null;
179
+ return 'boundary';
180
+ }
181
+ this.selectSegment(next);
182
+ return 'moved';
183
+ }
184
+ typeDigit(digit) {
185
+ if (this.activeIndex === null)
186
+ return;
187
+ const segment = this.segments[this.activeIndex];
188
+ if (!isEditableSegment(segment) || segment.kind === 'ampm')
189
+ return;
190
+ if (this.freshEntry) {
191
+ segment.text = '';
192
+ this.freshEntry = false;
193
+ }
194
+ if (segment.text.length >= segment.length)
195
+ return;
196
+ segment.text += digit;
197
+ if (segment.text.length >= segment.length) {
198
+ this.commitActiveSegment();
199
+ this.autoAdvance();
200
+ }
201
+ }
202
+ autoAdvance() {
203
+ if (this.activeIndex === null)
204
+ return;
205
+ let next = this.activeIndex;
206
+ do {
207
+ next += 1;
208
+ } while (next < this.segments.length && !isEditableSegment(this.segments[next]));
209
+ if (next < this.segments.length) {
210
+ this.selectSegment(next);
211
+ }
212
+ }
213
+ setAmPm(value) {
214
+ if (this.activeIndex === null)
215
+ return;
216
+ const segment = this.segments[this.activeIndex];
217
+ if (!isEditableSegment(segment) || segment.kind !== 'ampm')
218
+ return;
219
+ segment.text = value === 1 ? 'PM' : 'AM';
220
+ this.freshEntry = true;
221
+ }
222
+ clearActiveSegment(kind) {
223
+ if (this.activeIndex === null)
224
+ return;
225
+ const segment = this.segments[this.activeIndex];
226
+ if (!isEditableSegment(segment))
227
+ return;
228
+ if (segment.text === '') {
229
+ if (kind === 'backspace') {
230
+ let prev = this.activeIndex;
231
+ do {
232
+ prev -= 1;
233
+ } while (prev >= 0 && !isEditableSegment(this.segments[prev]));
234
+ if (prev >= 0) {
235
+ this.activeIndex = prev;
236
+ this.freshEntry = false;
237
+ }
238
+ }
239
+ return;
240
+ }
241
+ segment.text = '';
242
+ this.freshEntry = true;
243
+ }
244
+ /** Limpa todos os segmentos editáveis (usado quando o campo inteiro está selecionado, ex.: Ctrl+A). */
245
+ clearAll() {
246
+ for (const segment of this.segments) {
247
+ if (isEditableSegment(segment))
248
+ segment.text = '';
249
+ }
250
+ this.activeIndex = this.getFirstEditableIndex();
251
+ this.freshEntry = true;
252
+ }
253
+ /** Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido. */
254
+ incrementActiveSegment(delta) {
255
+ if (this.activeIndex === null)
256
+ return;
257
+ const segment = this.segments[this.activeIndex];
258
+ if (!isEditableSegment(segment))
259
+ return;
260
+ if (segment.kind === 'ampm') {
261
+ this.setAmPm(segment.text === 'PM' ? 0 : 1);
262
+ return;
263
+ }
264
+ const { min, max } = this.boundsFor(segment.kind);
265
+ const range = max - min + 1;
266
+ const current = segment.text ? parseInt(segment.text, 10) : delta > 0 ? min - 1 : min;
267
+ const next = (((current + delta - min) % range) + range) % range + min;
268
+ segment.text = String(next).padStart(segment.length, '0');
269
+ this.freshEntry = true;
270
+ this.reconcileDayIfNeeded(segment.kind);
271
+ }
272
+ /** Pad/clamp do segmento ativo (ex.: "2" -> "02", "45" no dia -> clamp para daysInMonth). */
273
+ commitActiveSegment() {
274
+ if (this.activeIndex === null)
275
+ return;
276
+ const segment = this.segments[this.activeIndex];
277
+ if (!isEditableSegment(segment))
278
+ return;
279
+ const kind = segment.kind;
280
+ segment.text = this.clampAndPad(segment);
281
+ this.freshEntry = true;
282
+ this.reconcileDayIfNeeded(kind);
283
+ }
284
+ /** Commita o segmento ativo e sai do modo de edição (usado no blur do campo). */
285
+ deactivate() {
286
+ this.commitActiveSegment();
287
+ this.activeIndex = null;
288
+ }
289
+ clampAndPad(segment) {
290
+ if (segment.kind === 'ampm' || segment.kind === 'year' || !segment.text) {
291
+ return segment.text;
292
+ }
293
+ const num = parseInt(segment.text, 10);
294
+ const { min, max } = this.boundsFor(segment.kind);
295
+ const clamped = Math.min(max, Math.max(min, num));
296
+ return String(clamped).padStart(segment.length, '0');
297
+ }
298
+ boundsFor(kind) {
299
+ switch (kind) {
300
+ case 'day':
301
+ return { min: 1, max: this.daysInMonthNow() };
302
+ case 'month':
303
+ return { min: 1, max: HOURS_PER_MERIDIEM };
304
+ case 'hour':
305
+ return this.config?.hourFormat === '12'
306
+ ? { min: 1, max: HOURS_PER_MERIDIEM }
307
+ : { min: 0, max: MAX_HOUR_24 };
308
+ case 'minute':
309
+ case 'second':
310
+ return { min: 0, max: MAX_MINUTE_SECOND };
311
+ default:
312
+ return { min: 0, max: 9999 };
313
+ }
314
+ }
315
+ /**
316
+ * Bound do dia dependendo do que já é conhecido de mês/ano. Nunca "adivinha" com o mês/ano
317
+ * atuais do sistema — isso estreitaria o range antes da hora (ex.: dia=29 digitado antes do
318
+ * ano, mês=fevereiro conhecido mas ano ainda não -> se assumisse o ano atual do sistema e ele
319
+ * não fosse bissexto, o dia seria clampado para 28 e nunca mais reexpandido para 29 mesmo que
320
+ * o ano realmente digitado depois seja bissexto). Em vez disso, fica sempre no lado permissivo
321
+ * até que a informação realmente exista.
322
+ */
323
+ daysInMonthNow() {
324
+ const monthSegment = this.findEditable('month');
325
+ const monthKnown = !!monthSegment?.text && monthSegment.text.length === monthSegment.length;
326
+ if (!monthSegment || !monthKnown)
327
+ return GENERIC_MAX_DAY;
328
+ const month = parseInt(monthSegment.text, 10);
329
+ const yearSegment = this.findEditable('year');
330
+ const yearKnown = !!yearSegment?.text && yearSegment.text.length === YEAR_SEGMENT_LENGTH;
331
+ if (!yearSegment || !yearKnown)
332
+ return daysInMonth(month, LEAP_REFERENCE_YEAR);
333
+ return daysInMonth(month, parseInt(yearSegment.text, 10));
334
+ }
335
+ reconcileDayIfNeeded(committedKind) {
336
+ if (committedKind !== 'month' && committedKind !== 'year')
337
+ return;
338
+ const daySegment = this.findEditable('day');
339
+ if (!daySegment || daySegment.text.length !== daySegment.length)
340
+ return;
341
+ const max = this.daysInMonthNow();
342
+ const dayNum = parseInt(daySegment.text, 10);
343
+ if (dayNum > max) {
344
+ daySegment.text = String(max).padStart(daySegment.length, '0');
345
+ }
346
+ }
347
+ findEditable(kind) {
348
+ return this.segments.find((s) => isEditableSegment(s) && s.kind === kind);
349
+ }
350
+ isEmpty() {
351
+ return this.segments.every((s) => !isEditableSegment(s) || s.text === '');
352
+ }
353
+ isComplete() {
354
+ return this.segments.every((s) => !isEditableSegment(s) || s.text.length === s.length);
355
+ }
356
+ loadFromDate(date) {
357
+ for (const segment of this.segments) {
358
+ if (isEditableSegment(segment))
359
+ segment.text = '';
360
+ }
361
+ this.activeIndex = null;
362
+ this.freshEntry = true;
363
+ if (!date)
364
+ return;
365
+ for (const segment of this.segments) {
366
+ if (!isEditableSegment(segment))
367
+ continue;
368
+ segment.text = this.renderValueFor(segment.kind, date);
369
+ }
370
+ }
371
+ renderValueFor(kind, date) {
372
+ switch (kind) {
373
+ case 'day':
374
+ return String(date.getDate()).padStart(SHORT_SEGMENT_LENGTH, '0');
375
+ case 'month':
376
+ return String(date.getMonth() + 1).padStart(SHORT_SEGMENT_LENGTH, '0');
377
+ case 'year':
378
+ return String(date.getFullYear()).padStart(YEAR_SEGMENT_LENGTH, '0');
379
+ case 'hour': {
380
+ const h = date.getHours();
381
+ const display = this.config?.hourFormat === '12' ? (h % HOURS_PER_MERIDIEM === 0 ? HOURS_PER_MERIDIEM : h % HOURS_PER_MERIDIEM) : h;
382
+ return String(display).padStart(SHORT_SEGMENT_LENGTH, '0');
383
+ }
384
+ case 'minute':
385
+ return String(date.getMinutes()).padStart(SHORT_SEGMENT_LENGTH, '0');
386
+ case 'second':
387
+ return String(date.getSeconds()).padStart(SHORT_SEGMENT_LENGTH, '0');
388
+ case 'ampm':
389
+ return date.getHours() < HOURS_PER_MERIDIEM ? 'AM' : 'PM';
390
+ }
391
+ }
392
+ /** Constrói o `Date` a partir dos segmentos; `null` enquanto incompleto. Usa `referenceDate` para preencher partes ausentes (ex.: hora ao editar só a data). */
393
+ toDate(referenceDate) {
394
+ if (!this.isComplete())
395
+ return null;
396
+ const ref = referenceDate ?? new Date();
397
+ const getNum = (kind) => {
398
+ const segment = this.findEditable(kind);
399
+ return segment ? parseInt(segment.text, 10) : null;
400
+ };
401
+ const year = getNum('year') ?? ref.getFullYear();
402
+ const monthNum = getNum('month');
403
+ const month = monthNum !== null ? monthNum - 1 : ref.getMonth();
404
+ const day = this.config?.mode === 'month' ? 1 : (getNum('day') ?? ref.getDate());
405
+ let hour = getNum('hour');
406
+ const minute = getNum('minute') ?? ref.getMinutes();
407
+ const second = getNum('second') ?? ref.getSeconds();
408
+ if (hour !== null && this.config?.hourFormat === '12') {
409
+ const ampmSegment = this.findEditable('ampm');
410
+ const isPm = ampmSegment?.text === 'PM';
411
+ hour = hour % HOURS_PER_MERIDIEM;
412
+ if (isPm)
413
+ hour += HOURS_PER_MERIDIEM;
414
+ }
415
+ return new Date(year, month, day, hour ?? ref.getHours(), minute, second);
416
+ }
417
+ }
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=