@firestitch/report 18.7.0 → 18.8.1

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 (64) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
  2. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +7 -1
  4. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
  6. package/app/reports/components/report-component/report-component.component.d.ts +2 -11
  7. package/app/reports/data/report.data.d.ts +0 -2
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
  10. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  11. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  12. package/app/reports/export/report-export-collector.service.d.ts +29 -1
  13. package/app/reports/export/report-pdf.service.d.ts +5 -0
  14. package/app/reports/export/report-pptx.service.d.ts +7 -0
  15. package/app/reports/format.d.ts +29 -1
  16. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  17. package/app/reports/interfaces/report.interface.d.ts +124 -4
  18. package/app/reports/kpi-card.d.ts +48 -0
  19. package/app/reports/layout.d.ts +0 -9
  20. package/app/reports/list-config.d.ts +8 -1
  21. package/app/reports/option-builder.d.ts +7 -0
  22. package/app/reports/output-notes.d.ts +14 -0
  23. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  24. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  25. package/app/reports/theme/palette.d.ts +5 -0
  26. package/app/reports/theme/typography.d.ts +1 -0
  27. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
  28. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
  29. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  30. package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
  31. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  32. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
  33. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
  34. package/esm2022/app/reports/data/report.data.mjs +5 -5
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
  37. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  38. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +123 -10
  40. package/esm2022/app/reports/export/report-pdf.service.mjs +257 -44
  41. package/esm2022/app/reports/export/report-pptx.service.mjs +324 -51
  42. package/esm2022/app/reports/format.mjs +452 -3
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/kpi-card.mjs +187 -0
  46. package/esm2022/app/reports/layout.mjs +1 -46
  47. package/esm2022/app/reports/list-config.mjs +33 -1
  48. package/esm2022/app/reports/option-builder.mjs +637 -54
  49. package/esm2022/app/reports/output-notes.mjs +204 -0
  50. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
  52. package/esm2022/app/reports/theme/palette.mjs +22 -1
  53. package/esm2022/app/reports/theme/typography.mjs +5 -1
  54. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  55. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  56. package/esm2022/public_api.mjs +2 -1
  57. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-CFnbJx44.mjs} +2 -2
  58. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-CFnbJx44.mjs.map} +1 -1
  59. package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-CSylkyko.mjs} +2735 -507
  60. package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +1 -0
  61. package/fesm2022/firestitch-report.mjs +1 -1
  62. package/package.json +1 -1
  63. package/public_api.d.ts +1 -0
  64. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { isValid, parseISO } from 'date-fns';
1
+ import { addDays, addMonths, addQuarters, addWeeks, addYears, endOfMonth, formatISO, isLastDayOfMonth, isValid, max as latestOf, min as earliestOf, parseISO, startOfDay, } from 'date-fns';
2
2
  import { ReportChartColor } from './enums/report-chart-color.enum';
3
3
  import { ReportChartDataLabels } from './enums/report-chart-data-labels.enum';
4
4
  import { ReportChartDateLabel } from './enums/report-chart-date-label.enum';
@@ -7,10 +7,10 @@ import { ReportChartMarkStat } from './enums/report-chart-mark-stat.enum';
7
7
  import { ReportListColumnFormat } from './enums/report-list-column-format.enum';
8
8
  import { ReportNumberUnits } from './enums/report-number-units.enum';
9
9
  import { ReportValueFormat } from './enums/report-value-format.enum';
10
- import { axisNumberFormat, chartValuePeak, DAY_SHORT, formatLocalDate, formatNumber, formatPlainNumber, hasNumberFormat, MONTH_DAY, MONTH_LONG, MONTH_YEAR, resolveChartNumberFormat, } from './format';
10
+ import { axisNumberFormat, chartValuePeak, comparisonOffsetLabel, DAY_SHORT, dateFormat, formatDayRange, formatDayWindow, formatLocalDate, formatNumber, formatOutputValue, formatPlainNumber, hasNumberFormat, laneOutputAlias, MONTH_DAY, MONTH_LONG, MONTH_YEAR, resolveChartNumberFormat, windowText, } from './format';
11
11
  import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
12
12
  import { escapeHtml } from './text';
13
- import { REPORT_CHART_COLOR_BY_NAME, REPORT_CHART_COLORS, REPORT_REFERENCE_COLOR, REPORT_WATERFALL_COLORS, } from './theme/palette';
13
+ import { REPORT_CHART_COLOR_BY_NAME, REPORT_CHART_COLORS, REPORT_CHART_COLORS_CSS, REPORT_REFERENCE_COLOR, REPORT_WATERFALL_COLORS, } from './theme/palette';
14
14
  import { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY, REPORT_DATA_LABEL_FONT_SIZE } from './theme/typography';
15
15
  // Room for an axis title. ECharts 5's containLabel keeps the TICK labels inside
16
16
  // the grid but not the axis name, so without this a vertical chart's category
@@ -50,6 +50,46 @@ const MARK_LABEL_BOX = { backgroundColor: 'rgba(255, 255, 255, 0.85)', padding:
50
50
  // The room an axis stretched to a reference leaves above it, for its label:
51
51
  // the bound is the round number at or past the reference plus this share.
52
52
  const REFERENCE_HEADROOM = 1.05;
53
+ // How a chart marks what the server says of its numbers (ComponentData's
54
+ // comparison, outputs, windows and partialPeriod). The words are interface
55
+ // text, English in every report locale.
56
+ // - The heading of a period not over yet ('September 2026 (to date)').
57
+ const PARTIAL_PERIOD_TEXT = 'to date';
58
+ // - A compared series' name: its measure's, then its role and lane ('Revenue
59
+ // change (vs previous week)'). A prior keeps the measure's name alone.
60
+ const ROLE_NAME_SUFFIXES = {
61
+ prior: '',
62
+ change: ' change',
63
+ percent_change: ' % change',
64
+ };
65
+ // - A prior series' bars: its current series' color, faded, with a dashed
66
+ // edge. Its line is dashed (PRIOR_LINE_STYLE) unless its measure names one.
67
+ const PRIOR_BAR_OPACITY = 0.45;
68
+ const PRIOR_LINE_STYLE = ReportChartLineStyle.Dashed;
69
+ // - The period not over yet: its bar hatched in light stripes, its point on a
70
+ // line drawn larger with a dashed edge, and, when it is the last one, the
71
+ // line's last segment dashed.
72
+ const PARTIAL_LINE_STYLE = ReportChartLineStyle.Dashed;
73
+ const PARTIAL_BAR_DECAL = {
74
+ symbol: 'none',
75
+ dashArrayX: [1, 0],
76
+ dashArrayY: [3, 5],
77
+ rotation: -Math.PI / 4,
78
+ color: 'rgba(255, 255, 255, 0.6)',
79
+ };
80
+ const PARTIAL_POINT_MARK = { symbol: 'emptyCircle', symbolSize: 9, itemStyle: { borderType: 'dashed' } };
81
+ // - A value axis of ranks only: rank 1 at the top, whole steps, from 1.
82
+ const RANK_AXIS_FORMAT = { format: ReportValueFormat.Number, precision: 0 };
83
+ // (Shared with the PowerPoint export, whose rank axes start there too.)
84
+ export const RANK_AXIS_MIN = 1;
85
+ // - A value axis of 0-1 fractions only (shares, percent changes) is a
86
+ // percent axis, its decimals decided by its peak.
87
+ const FRACTION_AXIS_FORMAT = { format: ReportValueFormat.Percent };
88
+ // - Between a tooltip value and what it covers.
89
+ const TOOLTIP_DETAIL_SEPARATOR = ' · ';
90
+ // - The prior a tooltip value is compared with, when the chart does not plot
91
+ // it ('vs 50% (Sep 1 – 2, 2026)').
92
+ const COMPARED_PRIOR_PREFIX = 'vs';
53
93
  // The words a statistic line's label starts with. They are interface text,
54
94
  // English in every report locale; only the value after them follows it.
55
95
  export const STAT_LABEL = {
@@ -103,12 +143,7 @@ export function colorByColumn(config) {
103
143
  }
104
144
  export function extractChartSeries(component, data) {
105
145
  const config = component.config;
106
- const xColumn = config.xAxis?.column ?? data.columns[0];
107
- const splitColumn = config.splitBy?.column;
108
- // colorBy emits one series per category too (so each bar carries its own
109
- // color + legend entry), but the bars are overlapped to full width in
110
- // buildAxisOption rather than laid side-by-side. splitBy wins if both are set.
111
- const groupColumn = splitColumn || colorByColumn(config);
146
+ const { xColumn, groupColumn } = chartColumns(config, data);
112
147
  const measures = chartMeasures(config, data);
113
148
  const rawCategories = uniqueValues(data.rows, xColumn);
114
149
  const categories = rawCategories.map((category) => String(category ?? '—'));
@@ -117,15 +152,9 @@ export function extractChartSeries(component, data) {
117
152
  // One series per group value (splitBy/colorBy), pivoted over the first measure.
118
153
  const measure = measures[0];
119
154
  for (const groupValue of uniqueValues(data.rows, groupColumn)) {
120
- const byCategory = new Map();
121
- for (const row of data.rows) {
122
- if (row[groupColumn] === groupValue) {
123
- byCategory.set(row[xColumn], row[measure.column]);
124
- }
125
- }
126
155
  series.push({
127
156
  name: String(groupValue ?? '—'),
128
- values: rawCategories.map((category) => numeric(byCategory.get(category))),
157
+ values: categoryValues(data.rows, xColumn, rawCategories, measure.column, (row) => row[groupColumn] === groupValue),
129
158
  type: measure.type,
130
159
  measure,
131
160
  measureIndex: 0,
@@ -134,13 +163,9 @@ export function extractChartSeries(component, data) {
134
163
  }
135
164
  else {
136
165
  for (const [measureIndex, measure] of measures.entries()) {
137
- const byCategory = new Map();
138
- for (const row of data.rows) {
139
- byCategory.set(row[xColumn], row[measure.column]);
140
- }
141
166
  series.push({
142
- name: measure.label ?? measure.column,
143
- values: rawCategories.map((category) => numeric(byCategory.get(category))),
167
+ name: comparedSeriesName(measure, measures, data) ?? measure.label ?? measure.column,
168
+ values: categoryValues(data.rows, xColumn, rawCategories, measure.column),
144
169
  type: measure.type,
145
170
  measure,
146
171
  measureIndex,
@@ -149,6 +174,56 @@ export function extractChartSeries(component, data) {
149
174
  }
150
175
  return { categories, series };
151
176
  }
177
+ // The column a chart's categories come from, and the one that splits its
178
+ // first measure into a series per value, if any. colorBy emits one series per
179
+ // category too (so each bar carries its own color + legend entry), but the
180
+ // bars are overlapped to full width in buildAxisOption rather than laid
181
+ // side-by-side. splitBy wins if both are set.
182
+ function chartColumns(config, data) {
183
+ return {
184
+ xColumn: config.xAxis?.column ?? data.columns[0],
185
+ groupColumn: config.splitBy?.column || colorByColumn(config),
186
+ };
187
+ }
188
+ // One column's values by category, from the rows `match` keeps (all of them
189
+ // when it is left out). A category with no row has no value.
190
+ function categoryValues(rows, xColumn, rawCategories, column, match) {
191
+ const byCategory = new Map();
192
+ for (const row of rows) {
193
+ if (!match || match(row)) {
194
+ byCategory.set(row[xColumn], row[column]);
195
+ }
196
+ }
197
+ return rawCategories.map((category) => numeric(byCategory.get(category)));
198
+ }
199
+ // A compared series' name, worded from its lane's offset rather than from its
200
+ // own label, so a chart the viewer regrouped says what it now compares:
201
+ // 'Revenue (vs previous week)', 'Revenue change (vs previous week)', 'Revenue
202
+ // % change (vs previous year)'. The measure is named as its current value's
203
+ // series is. null for any other series, which keeps its own name, and for
204
+ // data without the comparison keys.
205
+ function comparedSeriesName(measure, measures, data) {
206
+ const output = data.outputs?.[measure.column];
207
+ const offset = output?.offset ? data.comparison?.offsets?.[output.offset - 1] : undefined;
208
+ if (!output || !offset || !output.role || output.role === 'current') {
209
+ return null;
210
+ }
211
+ const current = currentOutputAlias(data.outputs, measure.column);
212
+ const label = measures.find((candidate) => candidate.column === current)?.label ?? current;
213
+ return `${label}${ROLE_NAME_SUFFIXES[output.role]} (${comparisonOffsetLabel(offset)})`;
214
+ }
215
+ // The column an output's current value is in: its lane's current output, else
216
+ // for a rank or a share the uncompared one of the same measure, else the
217
+ // measure's own column (a windowed value's source).
218
+ function currentOutputAlias(outputs, alias) {
219
+ const output = outputs[alias];
220
+ const uncompared = output.kind === 'value'
221
+ ? undefined
222
+ : Object.keys(outputs).find((key) => outputs[key].measure === output.measure
223
+ && outputs[key].kind === output.kind
224
+ && outputs[key].role === null);
225
+ return laneOutputAlias(outputs, alias, 'current') ?? uncompared ?? output.measure;
226
+ }
152
227
  // A series' own color as CSS hex: its measure's named color, or undefined when
153
228
  // it names none (or a name the palette does not know) and the theme colors it
154
229
  // by its position.
@@ -369,11 +444,19 @@ function buildAxisOption(component, data, chartType, context) {
369
444
  // A 100% stacked chart (percentStackedShares) plots its primary bars and
370
445
  // areas as shares, each type in its own stack, and leaves every other series
371
446
  // unstacked on its own values.
447
+ //
448
+ // What the server says of the numbers (chartAnnotations) marks them: a
449
+ // prior series dashed in its current series' color, the period not over yet
450
+ // hatched or dashed, ranks on an inverted axis, fractions on a percent axis,
451
+ // and the tooltip naming each prior's days and each window. Data without
452
+ // those keys draws exactly as before.
372
453
  const axisIndexes = seriesAxisIndexes(extracted, config);
373
454
  const twoAxes = axisIndexes.includes(1);
374
455
  const shares = percentStackedShares(extracted, config);
375
456
  const references = chartReferences(config, twoAxes);
376
- const axisFormats = valueAxisFormats(config, extracted, axisIndexes, context, !!shares, references);
457
+ const annotations = chartAnnotations(config, data, extracted, colorBy);
458
+ const axisFormats = valueAxisFormats(config, annotations ? annotatedAxisSeries(extracted, annotations) : extracted, axisIndexes, annotations && !shares ? annotatedAxisContexts(annotations, axisIndexes, context) : [context, context], !!shares, references);
459
+ const rankAxes = annotations && !shares ? rankAxisFlags(annotations.outputs, axisIndexes) : [false, false];
377
460
  // A series' statistic line is taken over the points it plots. On a colorBy
378
461
  // chart each series holds one bar, so the one line is taken over the bars
379
462
  // together and hangs off the first series (colorByStatLine).
@@ -387,32 +470,48 @@ function buildAxisOption(component, data, chartType, context) {
387
470
  else if (config.stacked && !shares) {
388
471
  stack = stackKey(types[index], combo, twoAxes ? axisIndexes[index] : undefined);
389
472
  }
473
+ // An output series (a compared, windowed, ranked or shared value) writes
474
+ // its tooltip, data labels and statistic line by what it holds.
475
+ const write = annotations && !seriesShares && annotations.outputs[index]
476
+ ? outputWriter(annotations, index, extractedSeries.measure, context)
477
+ : null;
390
478
  const stat = statLines ? measureMarkStat(extractedSeries.measure) : undefined;
391
- const markLine = stat && statMarkLine(seriesShares ?? extractedSeries.values, stat, seriesShares ? shareWriter(context) : measureWriter(extractedSeries.measure, context));
479
+ const markLine = stat && statMarkLine(seriesShares ?? extractedSeries.values, stat, seriesShares ? shareWriter(context) : write ?? measureWriter(extractedSeries.measure, context));
392
480
  const option = buildSeries(extractedSeries, seriesShares ? shareData(extractedSeries.values, seriesShares) : extractedSeries.values, {
393
481
  type: types[index],
394
482
  stack,
395
483
  overlap: colorBy && index === 0,
396
484
  combo,
397
- tooltip: seriesTooltip(extractedSeries.measure, context),
485
+ tooltip: write ? { valueFormatter: write } : seriesTooltip(extractedSeries.measure, context),
398
486
  axisIndex: twoAxes ? axisIndexes[index] : undefined,
399
487
  // A colorBy chart's bars take the palette by category, as in
400
488
  // PowerPoint, whatever color the measure names.
401
- color: colorBy ? undefined : seriesColor(extractedSeries),
402
- labels: dataLabelOption(config.dataLabels, dataLabelFormatter(extractedSeries.measure, axisFormats[axisIndexes[index]] ?? null, !!seriesShares, context)),
489
+ color: colorBy ? undefined : annotations?.colors?.[index] ?? seriesColor(extractedSeries),
490
+ labels: dataLabelOption(config.dataLabels, write
491
+ ? outputLabelFormatter(write)
492
+ : dataLabelFormatter(extractedSeries.measure, axisFormats[axisIndexes[index]] ?? null, !!seriesShares, context)),
403
493
  });
404
- return markLine ? { ...option, markLine } : option;
494
+ const marked = annotations ? markSeries(option, annotations, index, extractedSeries.measure) : option;
495
+ return markLine ? { ...marked, markLine } : marked;
405
496
  });
406
497
  if (colorBy && drawsStatLines(config) && series.length) {
407
- series[0] = colorByStatLine(series[0], extracted, context);
498
+ series[0] = colorByStatLine(series[0], extracted, context, annotations?.outputs[0]
499
+ ? outputWriter(annotations, 0, extracted.series[0].measure, context)
500
+ : undefined);
408
501
  }
502
+ // Drawn after the measure series, so a tooltip reads a series by its index.
503
+ const segments = annotations ? partialSegments(series, annotations) : [];
409
504
  const percentMin = shares ? percentAxisMin(shares) : undefined;
410
505
  const categoryAxis = categoryAxisOption(config, data, extracted.categories, horizontal, context.locale);
506
+ // An axis of rate changes alone reads in percentage points, as its values do.
507
+ const axisLabels = [0, 1].map((axisIndex) => (annotations && !shares
508
+ ? pointsAxisLabel(annotations, extracted, axisIndexes, axisIndex, context)
509
+ : null) ?? valueAxisLabel(axisFormats[axisIndex] ?? null, context));
411
510
  const valueAxis = twoAxes
412
- ? twoValueAxesOption(config, axisFormats, context, percentMin, references)
511
+ ? twoValueAxesOption(config, axisLabels, context, percentMin, references, rankAxes)
413
512
  : valueAxisOption(config.valueAxis, horizontal, percentMin === undefined
414
- ? valueAxisLabel(axisFormats[0], context)
415
- : percentAxisLabel(context), { percentMin, reach: referenceReach(references, 0) });
513
+ ? axisLabels[0]
514
+ : percentAxisLabel(context), { percentMin, reach: referenceReach(references, 0), rank: rankAxes[0] });
416
515
  const legendPosition = resolveLegendPosition(config, series.length, colorBy);
417
516
  const valueTitles = [config.valueAxis, twoAxes ? config.secondaryAxis : undefined];
418
517
  const granularity = bucketGranularity(data);
@@ -421,25 +520,500 @@ function buildAxisOption(component, data, chartType, context) {
421
520
  legend: referenceLegend(legendOption(legendPosition), series, references),
422
521
  // colorBy charts overlap N mostly-null series, so an axis tooltip would list
423
522
  // every category; an item tooltip shows just the hovered bar. A 100%
424
- // stacked chart's tooltip gives each share and the value it came from.
523
+ // stacked chart's tooltip gives each share and the value it came from. A
524
+ // chart with the server's annotations names what each value covers.
425
525
  tooltip: shares
426
526
  ? {
427
527
  trigger: 'axis',
428
528
  formatter: (params) => percentTooltip(params, extracted, shares, granularity, chartDateLabel(config), context),
429
529
  }
430
- : { trigger: colorBy ? 'item' : 'axis' },
530
+ : annotatedChartTooltip(annotations && !colorBy ? {
531
+ extracted,
532
+ annotations,
533
+ owners: segments.map((segment) => segment.owner),
534
+ granularity,
535
+ dateLabel: chartDateLabel(config),
536
+ context,
537
+ } : null) ?? { trigger: colorBy ? 'item' : 'axis' },
431
538
  xAxis: horizontal ? valueAxis : categoryAxis,
432
539
  yAxis: horizontal ? categoryAxis : valueAxis,
433
- series: [...series, ...referenceCarriers(references, extracted.categories)],
540
+ series: [...series, ...segments.map((segment) => segment.series), ...referenceCarriers(references, extracted.categories)],
541
+ };
542
+ }
543
+ function chartAnnotations(config, data, extracted, colorBy) {
544
+ if (!data.comparison && !data.outputs && !data.windows && (data.partialPeriod ?? null) === null) {
545
+ return null;
546
+ }
547
+ const columns = extracted.series.map((series) => series.measure.column);
548
+ const outputs = columns.map((column) => data.outputs?.[column] ?? null);
549
+ const currents = columns.map((column, index) => (outputs[index] ? currentOutputAlias(data.outputs, column) : null));
550
+ const measures = chartMeasures(config, data);
551
+ // A prior series' current series, by index; -1 for any other.
552
+ const sources = currents.map((current, index) => (outputs[index]?.role === 'prior' ? columns.indexOf(current) : -1));
553
+ const partialIndex = (data.partialPeriod ?? null) === null ? -1 : extracted.categories.indexOf(String(data.partialPeriod));
554
+ const lanes = lanePriorValues(config, data, extracted, outputs);
555
+ return {
556
+ outputs,
557
+ windows: columns.map((column) => data.windows?.[column] ?? null),
558
+ measureSpecs: currents.map((current) => measures.find((measure) => measure.column === current)),
559
+ priors: lanes.map((lane, index) => (isDeltaRole(outputs[index]?.role) ? lane?.prior.values ?? null : null)),
560
+ lanePriors: lanes.map((lane) => (lane && !columns.includes(lane.alias) ? lane.prior : null)),
561
+ colors: colorBy ? null : annotatedColors(extracted, sources),
562
+ priorSeries: outputs.map((output) => output?.role === 'prior'),
563
+ comparison: data.comparison ?? null,
564
+ partialIndex: partialIndex < 0 ? null : partialIndex,
565
+ };
566
+ }
567
+ // A current, change or percent change series' lane prior, by category: its
568
+ // lane's prior column in the same rows (the same group's on a splitBy chart),
569
+ // and that column's alias.
570
+ function lanePriorValues(config, data, extracted, outputs) {
571
+ const { xColumn, groupColumn } = chartColumns(config, data);
572
+ const rawCategories = uniqueValues(data.rows, xColumn);
573
+ const groups = groupColumn ? uniqueValues(data.rows, groupColumn) : [];
574
+ return extracted.series.map((series, index) => {
575
+ const role = outputs[index]?.role;
576
+ const alias = role === 'current' || isDeltaRole(role)
577
+ ? laneOutputAlias(data.outputs, series.measure.column, 'prior')
578
+ : null;
579
+ const output = alias ? data.outputs?.[alias] : undefined;
580
+ if (!alias || !output) {
581
+ return null;
582
+ }
583
+ const match = groupColumn ? (row) => row[groupColumn] === groups[index] : undefined;
584
+ return {
585
+ alias,
586
+ prior: {
587
+ key: groupColumn ? `${alias}\u0000${index}` : alias,
588
+ output,
589
+ values: categoryValues(data.rows, xColumn, rawCategories, alias, match),
590
+ },
591
+ };
592
+ });
593
+ }
594
+ function isDeltaRole(role) {
595
+ return role === 'change' || role === 'percent_change';
596
+ }
597
+ // Each series' color as the theme would hand it out: its measure's named
598
+ // color, else the next palette color among the series without one. A prior
599
+ // series that names no color takes its current series' color (sources) and
600
+ // no palette color of its own.
601
+ function annotatedColors(extracted, sources) {
602
+ let slot = 0;
603
+ const own = extracted.series.map((series, index) => {
604
+ const named = seriesColor(series);
605
+ if (named || sources[index] >= 0) {
606
+ return named ?? null;
607
+ }
608
+ return REPORT_CHART_COLORS_CSS[slot++ % REPORT_CHART_COLORS_CSS.length];
609
+ });
610
+ return own.map((color, index) => color ?? own[sources[index]]);
611
+ }
612
+ // A series' marks: a prior drawn in its current series' color family, dashed,
613
+ // and the period not over yet hatched (a bar) or ringed (a point).
614
+ function markSeries(option, annotations, index, measure) {
615
+ const prior = annotations.priorSeries[index] ? priorStyle(option, measure, annotations.colors?.[index]) : option;
616
+ return annotations.partialIndex === null ? prior : markPartialPoint(prior, annotations.partialIndex);
617
+ }
618
+ // A prior's bars are faded with a dashed edge; its line is dashed unless its
619
+ // measure names a line style.
620
+ function priorStyle(option, measure, color) {
621
+ const drawn = option;
622
+ if (drawn.type === 'bar') {
623
+ return {
624
+ ...option,
625
+ itemStyle: {
626
+ ...drawn.itemStyle,
627
+ opacity: PRIOR_BAR_OPACITY,
628
+ borderWidth: 1,
629
+ borderType: 'dashed',
630
+ ...(color ? { borderColor: color } : {}),
631
+ },
632
+ };
633
+ }
634
+ return { ...option, lineStyle: { ...drawn.lineStyle, type: measureLineStyle(measure) ?? PRIOR_LINE_STYLE } };
635
+ }
636
+ // The point of the period not over yet, when it has a value.
637
+ function markPartialPoint(option, partialIndex) {
638
+ const drawn = option;
639
+ const data = [...(drawn.data ?? [])];
640
+ const item = data[partialIndex];
641
+ if (item === undefined || pointValue(item) === null) {
642
+ return option;
643
+ }
644
+ const mark = drawn.type === 'bar' ? { itemStyle: { decal: PARTIAL_BAR_DECAL } } : PARTIAL_POINT_MARK;
645
+ data[partialIndex] = (typeof item === 'object' ? { ...item, ...mark } : { value: item, ...mark });
646
+ return { ...option, data };
647
+ }
648
+ // A line or area series whose last period is not over yet draws its last
649
+ // segment dashed: the series stops one point short, and a segment series
650
+ // carries its last two points, dashed, in its color and under its name, so
651
+ // the one legend entry toggles both. A stacked series keeps its line whole (a
652
+ // segment would stack on top of it), and a gap stays a gap. Replaces each
653
+ // such series in `series` and returns the segments.
654
+ function partialSegments(series, annotations) {
655
+ const last = annotations.partialIndex;
656
+ const segments = [];
657
+ series.forEach((option, owner) => {
658
+ const drawn = option;
659
+ const data = drawn.data ?? [];
660
+ const color = annotations.colors?.[owner];
661
+ if (last === null || last < 1 || last !== data.length - 1 || drawn.type !== 'line' || drawn.stack || !color
662
+ || pointValue(data[last - 1]) === null || pointValue(data[last]) === null) {
663
+ return;
664
+ }
665
+ series[owner] = { ...option, data: [...data.slice(0, last), null] };
666
+ segments.push({ owner, series: segmentSeries(option, color, last) });
667
+ });
668
+ return segments;
669
+ }
670
+ // The dashed segment from the point before the last to the last one, which
671
+ // keeps its marks and its data label. The point before it is drawn, and
672
+ // labeled, by the series itself.
673
+ function segmentSeries(option, color, last) {
674
+ const drawn = option;
675
+ const data = drawn.data ?? [];
676
+ return {
677
+ ...option,
678
+ markLine: undefined,
679
+ lineStyle: { ...drawn.lineStyle, color, type: PARTIAL_LINE_STYLE },
680
+ data: data.map((item, index) => {
681
+ if (index === last) {
682
+ return item;
683
+ }
684
+ return index === last - 1 ? { value: pointValue(item), symbol: 'none', label: { show: false } } : null;
685
+ }),
434
686
  };
435
687
  }
688
+ // A point's plotted value, whether it is a bare number or an object.
689
+ function pointValue(item) {
690
+ if (item === null || item === undefined) {
691
+ return null;
692
+ }
693
+ return typeof item === 'number' ? item : item.value;
694
+ }
695
+ // How an output series writes a value: formatOutputValue's rules (a signed
696
+ // change, points, '—' with the no-baseline title, ranks and shares) with its
697
+ // measure's format and the comparison's floor. Given the point's index (a
698
+ // tooltip, a data label), a change reads its prior there, which tells a
699
+ // missing baseline from a zero one. The title says why a value reads '—' or
700
+ // 'n/a'.
701
+ function outputValue(annotations, index, measure, context) {
702
+ const output = annotations.outputs[index];
703
+ const priors = annotations.priors[index];
704
+ return (value, dataIndex) => formatOutputValue(Array.isArray(value) ? value[0] : value, output, measure, context, {
705
+ measureSpec: annotations.measureSpecs[index],
706
+ floor: annotations.comparison?.floor ?? null,
707
+ ...(priors && dataIndex !== undefined ? { prior: priors[dataIndex] ?? null } : {}),
708
+ });
709
+ }
710
+ // An output value's text alone, for a series' own tooltip and its data labels.
711
+ function outputWriter(annotations, index, measure, context) {
712
+ const write = outputValue(annotations, index, measure, context);
713
+ return (value, dataIndex) => write(value, dataIndex).text;
714
+ }
715
+ function outputLabelFormatter(write) {
716
+ return (params) => write(dataLabelValue(params), params.dataIndex);
717
+ }
718
+ // The chart's series as its value axes read them: an output series whose
719
+ // slot names no format takes its output's (outputAxisMeasure).
720
+ function annotatedAxisSeries(extracted, annotations) {
721
+ return {
722
+ ...extracted,
723
+ series: extracted.series.map((series, index) => ({
724
+ ...series,
725
+ measure: outputAxisMeasure(series.measure, annotations.outputs[index], annotations.measureSpecs[index]),
726
+ })),
727
+ };
728
+ }
729
+ // The format an output's axis reads when its slot names none: a rank's whole
730
+ // numbers, a 0-1 fraction's percent, and a compared or windowed value its
731
+ // measure's format. The slot's own precision and units still apply.
732
+ function outputAxisMeasure(measure, output, measureSpec) {
733
+ if (!output || namesValueFormat(measure)) {
734
+ return measure;
735
+ }
736
+ let base = measureSpec && hasNumberFormat(measureSpec) ? formatKeys(measureSpec) : null;
737
+ if (output.kind === 'rank') {
738
+ base = RANK_AXIS_FORMAT;
739
+ }
740
+ else if (isFractionOutput(output)) {
741
+ base = FRACTION_AXIS_FORMAT;
742
+ }
743
+ return base
744
+ ? { ...measure, ...base, ...formatKeys({ precision: measure.precision, units: measure.units }) }
745
+ : measure;
746
+ }
747
+ function namesValueFormat(spec) {
748
+ return Object.values(ReportValueFormat).some((format) => format === spec.format);
749
+ }
750
+ // A spec's number-format keys that are set.
751
+ function formatKeys(spec) {
752
+ return {
753
+ ...((spec.format ?? null) !== null ? { format: spec.format } : {}),
754
+ ...((spec.precision ?? null) !== null ? { precision: spec.precision } : {}),
755
+ ...((spec.units ?? null) !== null ? { units: spec.units } : {}),
756
+ };
757
+ }
758
+ // Each value axis's context: one that plots only 0-1 fractions reads them as
759
+ // ratios, whatever the report's percentFormat says of its stored values.
760
+ function annotatedAxisContexts(annotations, axisIndexes, context) {
761
+ return [0, 1].map((axisIndex) => (everyOnAxis(annotations.outputs, axisIndexes, axisIndex, isFractionOutput)
762
+ ? { ...context, ratioPercent: true }
763
+ : context));
764
+ }
765
+ // Which value axes, by index, plot nothing but ranks.
766
+ function rankAxisFlags(outputs, axisIndexes) {
767
+ return [0, 1].map((axisIndex) => everyOnAxis(outputs, axisIndexes, axisIndex, isRankPosition));
768
+ }
769
+ // How a chart that plots a prior series colors each series, for the
770
+ // PowerPoint export: every series' color as bare hex, a prior taking its
771
+ // current series' color and no palette color of its own (annotatedColors),
772
+ // and which series are priors, which a line draws dashed. null when the chart
773
+ // plots no prior series, and on a colorBy chart; its series keep seriesHex.
774
+ export function priorSeriesStyles(config, data, extracted) {
775
+ const annotations = chartAnnotations(config, data, extracted, isColorBy(config));
776
+ if (!annotations?.colors || !annotations.priorSeries.some((prior) => prior)) {
777
+ return null;
778
+ }
779
+ return {
780
+ colors: annotations.colors.map((color) => color.replace('#', '')),
781
+ priors: annotations.priorSeries,
782
+ };
783
+ }
784
+ // Which value axes, by index, plot nothing but ranks, which the chart draws
785
+ // inverted with rank 1 at the top. Shared with the PowerPoint export.
786
+ export function rankValueAxes(extracted, data, config) {
787
+ return rankAxisFlags(extracted.series.map((series) => data.outputs?.[series.measure.column] ?? null), seriesAxisIndexes(extracted, config));
788
+ }
789
+ // Whether an axis has series and every one of them passes the test.
790
+ function everyOnAxis(outputs, axisIndexes, axisIndex, test) {
791
+ const onAxis = outputs.filter((_, index) => axisIndexes[index] === axisIndex);
792
+ return onAxis.length > 0 && onAxis.every((output) => !!output && test(output));
793
+ }
794
+ // A share and a percent change are 0-1 fractions, whatever percentFormat says.
795
+ function isFractionOutput(output) {
796
+ return output.kind === 'share' || output.role === 'percent_change';
797
+ }
798
+ // A value axis's tick labels when every series on it is a change of a rate
799
+ // (a share's, or a percent-format value's): signed percentage points, as the
800
+ // series' tooltips and data labels write them ('+5.0 pp'). null for any other
801
+ // axis.
802
+ function pointsAxisLabel(annotations, extracted, axisIndexes, axisIndex, context) {
803
+ const onAxis = extracted.series
804
+ .map((_, index) => index)
805
+ .filter((index) => axisIndexes[index] === axisIndex);
806
+ const points = onAxis.length > 0 && onAxis.every((index) => isPointsChange(annotations.outputs[index], outputAxisMeasure(extracted.series[index].measure, annotations.outputs[index], annotations.measureSpecs[index])));
807
+ if (!points) {
808
+ return null;
809
+ }
810
+ const write = outputWriter(annotations, onAxis[0], extracted.series[onAxis[0]].measure, context);
811
+ return { formatter: (value) => write(value) };
812
+ }
813
+ // A change of a rate, which prints in percentage points: a share's change, or
814
+ // the change of a value whose format (its slot's, else its measure's) is a
815
+ // percent.
816
+ function isPointsChange(output, axisMeasure) {
817
+ return !!output && output.role === 'change' && output.kind !== 'rank'
818
+ && (output.kind === 'share' || axisMeasure.format === ReportValueFormat.Percent);
819
+ }
820
+ // A rank, current or prior; a rank change is a difference, not a position.
821
+ function isRankPosition(output) {
822
+ return output.kind === 'rank' && output.role !== 'change';
823
+ }
824
+ function annotatedChartTooltip(source) {
825
+ return source
826
+ ? {
827
+ trigger: 'axis',
828
+ formatter: (params) => annotatedTooltip(params, source),
829
+ }
830
+ : null;
831
+ }
832
+ // The period, with 'to date' when it is not over yet, then each series shown
833
+ // (a legend can hide some): its value written by what it is, and what it
834
+ // covers. A partial segment speaks for its series. Names and values come from
835
+ // the data and the config, and ECharts sets the tooltip as HTML, so both are
836
+ // escaped.
837
+ function annotatedTooltip(params, source) {
838
+ const items = Array.isArray(params) ? params : [params];
839
+ const dataIndex = items[0]?.dataIndex ?? 0;
840
+ const count = source.extracted.series.length;
841
+ const markers = new Map();
842
+ for (const item of items) {
843
+ const seriesIndex = item.seriesIndex ?? -1;
844
+ const owner = seriesIndex < count ? seriesIndex : source.owners[seriesIndex - count];
845
+ if (owner !== undefined && owner >= 0 && !markers.has(owner)) {
846
+ markers.set(owner, typeof item.marker === 'string' ? item.marker : '');
847
+ }
848
+ }
849
+ const namedPriors = new Set();
850
+ const lines = [...markers.entries()]
851
+ .sort(([first], [second]) => first - second)
852
+ .map(([index, marker]) => annotatedTooltipLine(source, index, dataIndex, marker, namedPriors));
853
+ return [annotatedTooltipHeading(source, dataIndex), ...lines].join('<br/>');
854
+ }
855
+ function annotatedTooltipHeading(source, dataIndex) {
856
+ const category = source.extracted.categories[dataIndex] ?? '';
857
+ const period = source.granularity
858
+ ? formatPeriodLabel(category, source.granularity, true, source.context.locale, source.dateLabel)
859
+ : category;
860
+ return escapeHtml(dataIndex === source.annotations.partialIndex ? `${period} (${PARTIAL_PERIOD_TEXT})` : period);
861
+ }
862
+ // '● Revenue (vs previous month): $813 · Aug 1 – 15, 2026', and why a value
863
+ // reads '—' or 'n/a' when it does ('No baseline: no data before Jun 10, 2026').
864
+ // A value compared with a prior the chart does not plot names that prior
865
+ // once, on the first line shown that is compared with it: 'Rate % change (vs
866
+ // previous month): -10% · vs 50% (Sep 1 – 2, 2026)'. namedPriors holds the
867
+ // priors already named.
868
+ function annotatedTooltipLine(source, index, dataIndex, marker, namedPriors) {
869
+ const series = source.extracted.series[index];
870
+ const value = series.values[dataIndex] ?? null;
871
+ const formatted = source.annotations.outputs[index]
872
+ ? outputValue(source.annotations, index, series.measure, source.context)(value, dataIndex)
873
+ : { text: seriesTooltip(series.measure, source.context).valueFormatter(value), title: null };
874
+ const lanePrior = source.annotations.lanePriors[index];
875
+ const compared = lanePrior && !namedPriors.has(lanePrior.key)
876
+ ? comparedPriorDetail(source, index, lanePrior, dataIndex)
877
+ : '';
878
+ if (lanePrior) {
879
+ namedPriors.add(lanePrior.key);
880
+ }
881
+ const parts = [formatted.text, seriesDetail(source, index, dataIndex), compared, formatted.title ?? ''];
882
+ return `${marker} ${escapeHtml(series.name)}: ${escapeHtml(parts.filter((part) => !!part).join(TOOLTIP_DETAIL_SEPARATOR))}`;
883
+ }
884
+ // The prior a value is compared with, when the chart does not plot it: its
885
+ // value in its measure's format, and its days ('vs 50% (Sep 1 – 2, 2026)').
886
+ // The measure's format is the current series' when the chart plots it, else
887
+ // a change slot's own explicit format (a change is in its measure's units).
888
+ function comparedPriorDetail(source, index, lanePrior, dataIndex) {
889
+ const annotations = source.annotations;
890
+ const measure = source.extracted.series[index].measure;
891
+ const measureSpec = annotations.measureSpecs[index]
892
+ ?? (annotations.outputs[index]?.role !== 'percent_change' && namesValueFormat(measure) ? measure : null);
893
+ const text = formatOutputValue(lanePrior.values[dataIndex] ?? null, lanePrior.output, null, source.context, {
894
+ measureSpec,
895
+ floor: annotations.comparison?.floor ?? null,
896
+ }).text;
897
+ const window = priorDetail(source, lanePrior.output, dataIndex);
898
+ return window ? `${COMPARED_PRIOR_PREFIX} ${text} (${window})` : `${COMPARED_PRIOR_PREFIX} ${text}`;
899
+ }
900
+ // What a series' value covers, when the server says: a prior's days, or a
901
+ // windowed value's window ('Rolling 3-month total'), whose days the note
902
+ // under the chart names.
903
+ function seriesDetail(source, index, dataIndex) {
904
+ const output = source.annotations.outputs[index];
905
+ const window = source.annotations.windows[index];
906
+ if (output?.role === 'prior') {
907
+ return priorDetail(source, output, dataIndex);
908
+ }
909
+ return window ? windowText({ ...window, start: null, end: null }, source.context.locale, source.granularity) : '';
910
+ }
911
+ // A prior value's days. A range comparison compares every point with the
912
+ // same window. A series comparison compares each period with the period its
913
+ // lane's offset back; a period_end comparison reads the value at the end of that
914
+ // period ('on Aug 31, 2026').
915
+ function priorDetail(source, output, dataIndex) {
916
+ const comparison = source.annotations.comparison;
917
+ const lane = (output.offset ?? 1) - 1;
918
+ const offset = comparison?.offsets?.[lane];
919
+ const locale = source.context.locale;
920
+ if (!comparison || !offset) {
921
+ return '';
922
+ }
923
+ if (comparison.mode === 'range' || !source.granularity) {
924
+ const prior = comparison.priors?.[lane];
925
+ return prior ? formatDayWindow(prior, comparison.timezone, locale) : '';
926
+ }
927
+ const partial = dataIndex === source.annotations.partialIndex && comparison.align === 'to_date';
928
+ const today = partial ? zoneToday(comparison.timezone) : null;
929
+ const window = priorPeriodWindow(source.extracted.categories[dataIndex] ?? '', source.granularity, offset, today);
930
+ if (!window) {
931
+ return '';
932
+ }
933
+ if (comparison.mode === 'period_end') {
934
+ return `on ${formatDayRange(window.end, window.end, locale)}`;
935
+ }
936
+ return formatDayWindow({ ...withinLaneSpan(window, comparison.priors?.[lane]), through: partial ? comparison.current?.through ?? null : null }, comparison.timezone, locale);
937
+ }
938
+ // A series lane reads the span shown moved back by its offset (the server's
939
+ // comparison.priors[lane]), so the earlier copy of a period the span starts
940
+ // or ends inside holds only the days within it: a span from Mar 15 sets
941
+ // March against Feb 15 – 28, not the whole of February.
942
+ function withinLaneSpan(window, span) {
943
+ if (!span) {
944
+ return window;
945
+ }
946
+ const start = window.start < span.start ? span.start : window.start;
947
+ const end = window.end > span.end ? span.end : window.end;
948
+ return start <= end ? { start, end } : window;
949
+ }
950
+ // The days one period of the axis is compared with: the period moved back by
951
+ // the lane's offset. A period not over yet, compared to date, runs only to
952
+ // today moved back (priorToDateEnd). null for a category that is not a day,
953
+ // or an offset without a unit (a custom range).
954
+ function priorPeriodWindow(category, granularity, offset, today) {
955
+ const start = parseISO(category);
956
+ const unit = offset.unit;
957
+ const count = offset.count;
958
+ if (!isValid(start) || !unit || !count) {
959
+ return null;
960
+ }
961
+ const back = (date) => addPeriods(date, unit, -count);
962
+ const fullEnd = addDays(back(addPeriods(start, granularity, 1)), -1);
963
+ const end = today ? earliestOf([fullEnd, priorToDateEnd(today, start, back, unit)]) : fullEnd;
964
+ return { start: calendarDay(back(start)), end: calendarDay(latestOf([end, back(start)])) };
965
+ }
966
+ // Today, kept inside the period, moved back by the offset; when today is the
967
+ // last day of its month, the last day of the month it lands in (the
968
+ // server's end-of-month rule: Sep 30 compares with Aug 31, not Aug 30).
969
+ function priorToDateEnd(today, periodStart, back, unit) {
970
+ const day = latestOf([startOfDay(today), periodStart]);
971
+ const moved = back(day);
972
+ return isLastDayOfMonth(day) && unit !== 'day' && unit !== 'week' ? endOfMonth(moved) : moved;
973
+ }
974
+ function addPeriods(date, unit, count) {
975
+ switch (unit) {
976
+ case 'day':
977
+ return addDays(date, count);
978
+ case 'week':
979
+ return addWeeks(date, count);
980
+ case 'quarter':
981
+ return addQuarters(date, count);
982
+ case 'year':
983
+ return addYears(date, count);
984
+ default:
985
+ return addMonths(date, count);
986
+ }
987
+ }
988
+ function calendarDay(date) {
989
+ return formatISO(date, { representation: 'date' });
990
+ }
991
+ // Today's calendar day in the report's zone, as local midnight. The server
992
+ // marks which period holds today (partialPeriod) but not the day itself; the
993
+ // prior of that period is clipped at the same day. An unknown zone reads the
994
+ // browser's own day.
995
+ function zoneToday(timezone) {
996
+ try {
997
+ const parts = dateFormat('en-US', { year: 'numeric', month: 'numeric', day: 'numeric' }, timezone)
998
+ .formatToParts(new Date());
999
+ const part = (type) => Number(parts.find((found) => found.type === type)?.value);
1000
+ const today = new Date(part('year'), part('month') - 1, part('day'));
1001
+ if (isValid(today)) {
1002
+ return today;
1003
+ }
1004
+ }
1005
+ catch {
1006
+ // An unknown zone: the browser's day below.
1007
+ }
1008
+ return startOfDay(new Date());
1009
+ }
436
1010
  // A colorBy chart's statistic line: one line over every bar, hung off the
437
1011
  // first series and drawn in the reference slate, as no one category's color
438
1012
  // speaks for the others.
439
- function colorByStatLine(first, extracted, context) {
1013
+ function colorByStatLine(first, extracted, context, write) {
440
1014
  const measure = extracted.series[0]?.measure;
441
1015
  const stat = measureMarkStat(measure);
442
- const markLine = stat && statMarkLine(colorByValues(extracted), stat, measureWriter(measure, context), `#${REPORT_REFERENCE_COLOR}`);
1016
+ const markLine = stat && statMarkLine(colorByValues(extracted), stat, write ?? measureWriter(measure, context), `#${REPORT_REFERENCE_COLOR}`);
443
1017
  return markLine ? { ...first, markLine } : first;
444
1018
  }
445
1019
  // A series' statistic line across the plot, labeled with the statistic and
@@ -940,7 +1514,6 @@ function placeDataLabels(labels, position, values) {
940
1514
  // A series' points with its latest non-empty point carrying the label. A
941
1515
  // series with no value anywhere is left as it was.
942
1516
  function labelLastPoint(values, label) {
943
- const pointValue = (item) => (isShareDataItem(item) ? item.value : item);
944
1517
  const last = values.reduce((found, item, index) => (pointValue(item) === null ? found : index), -1);
945
1518
  return values.map((item, index) => {
946
1519
  if (index !== last) {
@@ -1016,11 +1589,13 @@ function valueAxisOption(axis, horizontal, axisLabel, extras = {}) {
1016
1589
  nameLocation: horizontal ? 'middle' : 'end',
1017
1590
  nameGap: horizontal ? 28 : 10,
1018
1591
  nameTextStyle: horizontal ? undefined : { align: extras.index === 1 ? 'right' : 'left' },
1019
- // A pinned bound wins; one left open reaches the references (reachMin).
1020
- min: range.min ?? reachMin(extras.reach),
1592
+ // A pinned bound wins; one left open reaches the references (reachMin),
1593
+ // or on a rank axis starts at rank 1.
1594
+ min: range.min ?? (extras.rank ? RANK_AXIS_MIN : reachMin(extras.reach)),
1021
1595
  max: range.max ?? reachMax(extras.reach),
1022
1596
  interval: range.interval,
1023
1597
  axisLabel,
1598
+ ...(extras.rank ? { inverse: true, minInterval: 1 } : {}),
1024
1599
  };
1025
1600
  }
1026
1601
  // The part of a value axis's range the config pins. A bound that is not a
@@ -1037,25 +1612,33 @@ export function valueAxisRange(axis) {
1037
1612
  }
1038
1613
  // A two-axis chart's value axes: the primary on the left, the second on the
1039
1614
  // right without gridlines of its own. Each axis's ticks take the format of the
1040
- // measures plotted against it. Without a range on either axis the second axis
1041
- // aligns its ticks to the primary's gridlines.
1615
+ // measures plotted against it (axisLabels). Without a range on either axis the
1616
+ // second axis aligns its ticks to the primary's gridlines.
1042
1617
  //
1043
1618
  // On a 100% stacked chart (percentMin set) the primary axis is the share axis,
1044
- // whose range is fixed, and the second axis's series are not stacked.
1045
- function twoValueAxesOption(config, axisFormats, context, percentMin, references) {
1619
+ // whose range is fixed, and the second axis's series are not stacked. An axis
1620
+ // of ranks alone (rankAxes) is inverted, and the axes then keep their own
1621
+ // ticks, so a rank axis steps by whole ranks.
1622
+ function twoValueAxesOption(config, axisLabels, context, percentMin, references, rankAxes) {
1046
1623
  const percent = percentMin !== undefined;
1047
- const label = (axisIndex) => valueAxisLabel(axisFormats[axisIndex] ?? null, context);
1624
+ const label = (axisIndex) => axisLabels[axisIndex];
1048
1625
  return [
1049
1626
  valueAxisOption(config.valueAxis, false, percent ? percentAxisLabel(context) : label(0), {
1050
1627
  index: 0,
1051
1628
  percentMin,
1052
1629
  reach: referenceReach(references, 0),
1630
+ rank: rankAxes[0],
1053
1631
  }),
1054
1632
  {
1055
- ...valueAxisOption(config.secondaryAxis, false, label(1), { index: 1, reach: referenceReach(references, 1) }),
1633
+ ...valueAxisOption(config.secondaryAxis, false, label(1), {
1634
+ index: 1,
1635
+ reach: referenceReach(references, 1),
1636
+ rank: rankAxes[1],
1637
+ }),
1056
1638
  position: 'right',
1057
1639
  splitLine: { show: false },
1058
- alignTicks: !percent && !hasAxisRange(config.valueAxis) && !hasAxisRange(config.secondaryAxis),
1640
+ alignTicks: !percent && !rankAxes[0] && !rankAxes[1]
1641
+ && !hasAxisRange(config.valueAxis) && !hasAxisRange(config.secondaryAxis),
1059
1642
  },
1060
1643
  ];
1061
1644
  }
@@ -1082,14 +1665,14 @@ function valueAxisLabel(format, context) {
1082
1665
  }
1083
1666
  const options = { units: format.chart.units, decimals: format.chart.decimals };
1084
1667
  return {
1085
- formatter: (value) => formatNumber(value, format.spec, context, options),
1668
+ formatter: (value) => formatNumber(value, format.spec, format.context, options),
1086
1669
  };
1087
1670
  }
1088
1671
  // An axis's format from the spec its measures agree on, with the units and
1089
1672
  // decimals decided from its peak. Without a spec the axis is plain, and the
1090
1673
  // peak is never computed.
1091
1674
  function resolveValueAxisFormat(spec, peak, context) {
1092
- return spec ? { spec, chart: resolveChartNumberFormat(spec, peak(), context) } : null;
1675
+ return spec ? { spec, chart: resolveChartNumberFormat(spec, peak(), context), context } : null;
1093
1676
  }
1094
1677
  // Each value axis's format, by axis index. A chart with one value axis takes
1095
1678
  // the format the plotted series' measures agree on (a splitBy or colorBy chart
@@ -1098,15 +1681,15 @@ function resolveValueAxisFormat(spec, peak, context) {
1098
1681
  // stacked with a 100% stacked chart's shares. A reference past the data
1099
1682
  // stretches its axis, so it counts toward the peak (referencePeak); a 100%
1100
1683
  // stacked chart's references are shares, which the raw values' peak leaves
1101
- // out.
1102
- function valueAxisFormats(config, extracted, axisIndexes, context, percent, references) {
1684
+ // out. contexts holds each axis's context (annotatedAxisContexts).
1685
+ function valueAxisFormats(config, extracted, axisIndexes, contexts, percent, references) {
1103
1686
  const reach = (axisIndex) => (percent && axisIndex === 0 ? 0 : referencePeak(references, axisIndex));
1104
1687
  if (!axisIndexes.includes(1)) {
1105
- return [resolveValueAxisFormat(axisNumberFormat(extracted.series.map((series) => series.measure)), () => Math.max(chartValuePeak(extracted.series.map((series) => series.values), !!config.stacked), reach(0)), context)];
1688
+ return [resolveValueAxisFormat(axisNumberFormat(extracted.series.map((series) => series.measure)), () => Math.max(chartValuePeak(extracted.series.map((series) => series.values), !!config.stacked), reach(0)), contexts[0])];
1106
1689
  }
1107
1690
  return [0, 1].map((axisIndex) => {
1108
1691
  const onAxis = extracted.series.filter((_, index) => axisIndexes[index] === axisIndex);
1109
- return resolveValueAxisFormat(axisNumberFormat(onAxis.map((series) => series.measure)), () => Math.max(chartValuePeak(onAxis.map((series) => series.values), !!config.stacked && !percent), reach(axisIndex)), context);
1692
+ return resolveValueAxisFormat(axisNumberFormat(onAxis.map((series) => series.measure)), () => Math.max(chartValuePeak(onAxis.map((series) => series.values), !!config.stacked && !percent), reach(axisIndex)), contexts[axisIndex]);
1110
1693
  });
1111
1694
  }
1112
1695
  // A 100% stacked chart's share axis ticks: whole percentages in the locale
@@ -1341,4 +1924,4 @@ function periodAxisLabel(granularity, categories, locale, dateLabel) {
1341
1924
  },
1342
1925
  };
1343
1926
  }
1344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvb3B0aW9uLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixjQUFjLEVBQ2QsU0FBUyxFQUNULGVBQWUsRUFDZixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVix3QkFBd0IsR0FDekIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQVFMLG1CQUFtQixHQVNwQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLHVCQUF1QixHQUN4QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSx3QkFBd0IsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3hILGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLHlEQUF5RDtBQUN6RCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsc0VBQXNFO0FBQ3RFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLDRFQUE0RTtBQUM1RSxpQ0FBaUM7QUFDakMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSx5QkFBeUI7QUFDekIsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLCtFQUErRTtBQUMvRSxzRUFBc0U7QUFDdEUsa0VBQWtFO0FBQ2xFLE1BQU0sZUFBZSxHQUFHLEdBQUcsMkJBQTJCLE1BQU0sd0JBQXdCLEVBQUUsQ0FBQztBQUN2RixnRkFBZ0Y7QUFDaEYsb0VBQW9FO0FBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQWlCLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUMzQiw4RUFBOEU7QUFDOUUsMkRBQTJEO0FBQzNELE1BQU0sbUJBQW1CLEdBQXFCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbEcsTUFBTSxvQkFBb0IsR0FBcUIsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNuRyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBQzFDLDZFQUE2RTtBQUM3RSxpQ0FBaUM7QUFDakMsTUFBTSxtQkFBbUIsR0FBRyx5QkFBeUIsQ0FBQztBQUN0RCwyRUFBMkU7QUFDM0UsNkNBQTZDO0FBQzdDLE1BQU0sY0FBYyxHQUFHLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDMUcsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUVoQywyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBd0M7SUFDN0QsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTO0lBQ3hDLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtJQUN0QyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVM7SUFDcEMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTO0NBQ3JDLENBQUM7QUErSEYsNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFDdEUsRUFBRTtBQUNGLGlGQUFpRjtBQUNqRiw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw2QkFBNkI7QUFDN0IsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFtQjtJQUMzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ2xHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssVUFBVTtXQUNuRCxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVztXQUMxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBR0QsOEVBQThFO0FBQzlFLHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQW1CO0lBQy9DLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNsRCxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUM7QUEyQkQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQTBCLEVBQUUsSUFBbUI7SUFDaEYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQXFCLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUMzQyx5RUFBeUU7SUFDekUsc0VBQXNFO0lBQ3RFLCtFQUErRTtJQUMvRSxNQUFNLFdBQVcsR0FBRyxXQUFXLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFN0MsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sTUFBTSxHQUFtQyxFQUFFLENBQUM7SUFFbEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixnRkFBZ0Y7UUFDaEYsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLEtBQUssTUFBTSxVQUFVLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztZQUMvQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQztnQkFDL0IsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsT0FBTztnQkFDUCxZQUFZLEVBQUUsQ0FBQzthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7WUFDL0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTTtnQkFDckMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsT0FBTztnQkFDUCxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2hDLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLG1CQUFtQjtBQUNuQixNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQWdDO0lBQzFELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3JDLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxTQUFTLENBQUMsTUFBZ0MsRUFBRSxLQUFhO0lBQ3ZFLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsTUFBZ0M7SUFDckQsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLG1FQUFtRTtBQUNuRSxTQUFTLGVBQWUsQ0FBQyxPQUFpQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXRGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9ELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UscUJBQXFCO0FBQ3JCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFpQztJQUNoRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSwrQkFBK0I7QUFDL0IsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUFpQztJQUMvRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUseUVBQXlFO0FBQ3pFLG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQXlCLEVBQUUsSUFBeUI7SUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFL0csSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxtQkFBbUIsQ0FBQyxPQUFPO1lBQzlCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN6RSxLQUFLLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFN0MsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxLQUFLLG1CQUFtQixDQUFDLEdBQUc7WUFDMUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUIsS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO1lBQzFCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzlCO1lBQ0UsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCx5RUFBeUU7QUFDekUsd0VBQXdFO0FBQ3hFLGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW1CO0lBQ2hELE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUM7QUFDN0MsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsYUFBYTtBQUNiLE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBK0I7SUFDM0QsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQW1CLEVBQUUsT0FBZ0I7SUFDbkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQTBDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFcEgsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLFlBQVksSUFBSSxTQUFTLEtBQUssS0FBSyxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN4RixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQW9CLEVBQUU7UUFDeEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE9BQU8sU0FBUyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxNQUFNLFNBQVMsR0FBbUIsT0FBTyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRixPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxFQUFFLEtBQUssS0FBSztnQkFDdEMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQ3ZGLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSx1RUFBdUU7QUFDdkUseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBMkI7SUFDdkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNO1NBQ3ZELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5FLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ3pELEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDaEUsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOEVBQThFO0FBQzlFLDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFNBQStCLEVBQUUsTUFBbUI7SUFDdkYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFFNUMsSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLElBQUk7V0FDN0IsU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxXQUFXO1dBQ3pFLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFVLEVBQUUsQ0FBQztRQUM1QyxNQUFNLE9BQU8sR0FBRyxLQUFLO2FBQ2xCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUYsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyQyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDBCQUEwQjtBQUMxQixNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQXFCO0lBQ2xELE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLHVCQUF1QjtBQUN2QixTQUFTLGFBQWEsQ0FBQyxNQUFtQixFQUFFLElBQW1CO0lBQzdELE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNO1FBQzVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtRQUNqQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsZ0JBQWdCO0FBQ2hCLE1BQU0sVUFBVSxXQUFXLENBQUMsU0FBK0IsRUFBRSxTQUF3QjtJQUNuRixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBK0IsRUFBRSxNQUFtQjtJQUNwRixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdHLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQWlCRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0MsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSx5RUFBeUU7QUFDekUsdURBQXVEO0FBQ3ZELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxTQUEwQixFQUFFLElBQW1CO0lBQzlFLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDakQsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQztJQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQ3JDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFGLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFeEYsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLGFBQWE7QUFDYixFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLHdDQUF3QztBQUN4QyxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFNBQTBCLEVBQzFCLElBQW1CLEVBQ25CLE9BQTRCO0lBRTVCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFxQixDQUFDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBRTVDLElBQUksU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDakQsT0FBTyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUM5QixPQUFPLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FDdEIsU0FBMEIsRUFDMUIsSUFBbUIsRUFDbkIsU0FBd0IsRUFDeEIsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQXFCLENBQUM7SUFDL0MsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFFdEMsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSwrRUFBK0U7SUFDL0UsMkRBQTJEO0lBQzNELEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSwwQkFBMEI7SUFDMUIsRUFBRTtJQUNGLHlFQUF5RTtJQUN6RSw2RUFBNkU7SUFDN0UsK0JBQStCO0lBQy9CLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BHLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsNkRBQTZEO0lBQzdELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBbUIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDN0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzlFLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxZQUFZLENBQ25DLFlBQVksSUFBSSxlQUFlLENBQUMsTUFBTSxFQUN0QyxJQUFJLEVBQ0osWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUN0RixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUN4QixlQUFlLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFDdkY7WUFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNsQixLQUFLO1lBQ0wsT0FBTyxFQUFFLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQztZQUMvQixLQUFLO1lBQ0wsT0FBTyxFQUFFLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUN4RCxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbkQsNkRBQTZEO1lBQzdELGdEQUFnRDtZQUNoRCxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7WUFDekQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUMzRCxlQUFlLENBQUMsT0FBTyxFQUN2QixXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUN2QyxDQUFDLENBQUMsWUFBWSxFQUNkLE9BQU8sQ0FDUixDQUFDO1NBQ0gsQ0FDRixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckUsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLE9BQU8sSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMvRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RyxNQUFNLFNBQVMsR0FBRyxPQUFPO1FBQ3ZCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQzFFLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxLQUFLLFNBQVM7WUFDdEUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0UsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkYsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFNUMsT0FBTztRQUNMLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlHLE1BQU0sRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7UUFDekUsNkVBQTZFO1FBQzdFLHFFQUFxRTtRQUNyRSx1RUFBdUU7UUFDdkUsT0FBTyxFQUFFLE1BQU07WUFDYixDQUFDLENBQUM7Z0JBQ0EsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsU0FBUyxFQUFFLENBQUMsTUFBK0MsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUM1RSxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixXQUFXLEVBQ1gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUN0QixPQUFPLENBQ1I7YUFDRjtZQUNELENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1FBQzFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWTtRQUM1QyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDNUMsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSx5QkFBeUI7QUFDekIsU0FBUyxlQUFlLENBQ3RCLEtBQW1CLEVBQ25CLFNBQStCLEVBQy9CLE9BQTRCO0lBRTVCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksWUFBWSxDQUNuQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQ3hCLElBQUksRUFDSixhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUMvQixJQUFJLHNCQUFzQixFQUFFLENBQzdCLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNuRSxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxrREFBa0Q7QUFDbEQsU0FBUyxZQUFZLENBQ25CLE1BQXlCLEVBQ3pCLElBQXlCLEVBQ3pCLEtBQWdDLEVBQ2hDLEtBQWM7SUFFZCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXZDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUVwRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLElBQUk7UUFDWixNQUFNLEVBQUUsTUFBTTtRQUNkLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDN0UsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsY0FBdUIsRUFBRSxRQUFRLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxjQUFjLEVBQUU7UUFDN0gsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDekIsQ0FBQztBQUNKLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsU0FBUyxhQUFhLENBQUMsT0FBaUMsRUFBRSxPQUE0QjtJQUNwRixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE9BQU87QUFDUCxTQUFTLFdBQVcsQ0FBQyxPQUE0QjtJQUMvQyxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUV4RCxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLGlDQUFpQztBQUNqQyxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsOEVBQThFO0FBQzlFLDRCQUE0QjtBQUM1QixTQUFTLGlCQUFpQixDQUFDLFVBQTRCLEVBQUUsVUFBb0I7SUFDM0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBRTNDLE9BQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFrQixFQUFFO1FBQzdELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsT0FBTyxDQUFDO2dCQUNOLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEMsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7Z0JBQ3hCLFFBQVEsRUFBRTtvQkFDUixNQUFNLEVBQUUsSUFBSTtvQkFDWixNQUFNLEVBQUUsTUFBTTtvQkFDZCxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO29CQUM5QyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxjQUFjLEVBQUU7b0JBQ3BHLElBQUksRUFBRTt3QkFDSixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDcEcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUMzQixLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUk7NEJBQ3JCLDZEQUE2RDs0QkFDN0Qsa0JBQWtCOzRCQUNsQixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFOzRCQUN2QixLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7eUJBQzNFLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtnQkFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLFFBQVEsRUFBRTt3QkFDUixNQUFNLEVBQUUsSUFBSTt3QkFDWixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7d0JBQ3pDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDdEY7aUJBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1EsQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsWUFBWTtBQUNaLE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBNEIsRUFBRSxTQUF5QjtJQUNuRixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXBELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSxPQUFPO0FBQ1AsU0FBUyxlQUFlLENBQ3RCLE1BQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLFVBQTRCO0lBRTVCLE9BQU8sVUFBVSxDQUFDLE1BQU07UUFDdEIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDcEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNiLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsUUFBUTtBQUNSLFNBQVMsY0FBYyxDQUFDLFVBQTRCLEVBQUUsU0FBeUI7SUFDN0UsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUVuRixPQUFPLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUM5SCxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsTUFBTTtBQUNOLFNBQVMsUUFBUSxDQUFDLEtBQWlDO0lBQ2pELE9BQU8sS0FBSztRQUNWLENBQUMsQ0FBQyxDQUFDLE1BQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBaUM7SUFDakQsT0FBTyxLQUFLO1FBQ1YsQ0FBQyxDQUFDLENBQUMsTUFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBRTVCLFNBQVMsZUFBZSxDQUFDLFNBQWlCO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXRHLHVFQUF1RTtJQUN2RSx1QkFBdUI7SUFDdkIsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxpRUFBaUU7QUFDakUsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLFNBQVMsa0JBQWtCLENBQ3pCLE1BQW1CLEVBQ25CLElBQW1CLEVBQ25CLFVBQW9CLEVBQ3BCLFVBQW1CLEVBQ25CLE1BQXVCO0lBRXZCLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEYsTUFBTSxJQUFJLEdBQUc7UUFDWCxJQUFJLEVBQUUsVUFBbUI7UUFDekIsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSztRQUN6QixZQUFZLEVBQUUsUUFBaUI7UUFDL0IsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDaEIsV0FBVyxFQUFFO2dCQUNYLEtBQUssRUFBRTtvQkFDTCxTQUFTLEVBQUUsQ0FBQyxNQUEwQixFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFDcEIsV0FBVyxFQUNYLElBQUksRUFDSixNQUFNLEVBQ04sU0FBUyxDQUNWO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0lBRUYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLG1FQUFtRTtRQUNuRSxNQUFNLFVBQVUsR0FBRyxXQUFXLElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLEtBQUssSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RyxPQUFPO1lBQ0wsR0FBRyxJQUFJO1lBQ1AsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsV0FBVztTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLDJIQUEySDtJQUMzSCwwRUFBMEU7SUFDMUUsU0FBUztJQUNULE1BQU0sS0FBSyxHQUFHLFdBQVc7UUFDdkIsQ0FBQyxDQUFDLElBQUk7UUFDTixDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWpILE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxPQUFPLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixHQUFHLG1CQUFtQjtRQUMxRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7S0FDdEcsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsWUFBWTtBQUNaLFNBQVMsaUJBQWlCLENBQUMsTUFBbUIsRUFBRSxVQUFtQjtJQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDeEMsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSwrRUFBK0U7QUFDL0UsK0RBQStEO0FBQy9ELFNBQVMsY0FBYyxDQUFDLElBQW9DLEVBQUUsVUFBbUI7SUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2QyxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLHVFQUF1RTtBQUN2RSw4RUFBOEU7QUFDOUUsY0FBYztBQUNkLFNBQVMsdUJBQXVCLENBQzlCLFVBQW9CLEVBQ3BCLFdBQW9DLEVBQ3BDLE1BQXVCLEVBQ3ZCLFNBQStCO0lBRS9CLE9BQU8sV0FBVztRQUNoQixDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQztRQUMvRyxDQUFDLENBQUMsVUFBVSxDQUFDO0FBQ2pCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsa0NBQWtDO0FBQ2xDLFNBQVMsZUFBZSxDQUFDLE1BQWdCO0lBQ3ZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUM5RCxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNoRSxNQUFNLENBQ1AsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNSLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDcEMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxtRUFBbUU7UUFDbkUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDckcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxPQUFPLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRCxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsNkVBQTZFO0FBQzdFLHFEQUFxRDtBQUNyRCxJQUFJLGdCQUFnQixHQUFvQyxJQUFJLENBQUM7QUFFN0QsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDekQsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFFeEMsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2xELENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUMzQixTQUEwQixFQUMxQixJQUFtQixFQUNuQixPQUE0QjtJQUU1QixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBcUIsQ0FBQztJQUMvQyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRSxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlGLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsbUNBQW1DO0lBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsc0JBQXNCLENBQ25HLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUMzQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDekgsT0FBTyxDQUNSLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQseUVBQXlFO0lBQ3pFLE1BQU0sY0FBYyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVEsQ0FDWixjQUFjLEVBQ2QsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUNyQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQy9DO1FBQ0QsTUFBTSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ25FLDJFQUEyRTtRQUMzRSxPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsTUFBTTtZQUNmLFNBQVMsRUFBRSxDQUFDLE1BQStDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUM5RSxTQUFTLEVBQ1QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFDdEQsV0FBVyxFQUNYLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFDdEIsSUFBSSxFQUNKLE9BQU8sQ0FDUjtTQUNGO1FBQ0QsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZO1FBQzVDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM1QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUN0RixDQUFDO0FBQ0osQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLHVFQUF1RTtBQUN2RSxTQUFTLGVBQWUsQ0FBQyxTQUE2QjtJQUNwRCxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsS0FBSztZQUNYLEtBQUssRUFBRSxXQUFXO1lBQ2xCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUMvQyxXQUFXLEVBQUUsRUFBRTtZQUNmLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDbkMsTUFBTSxFQUFFLElBQUk7U0FDYjtRQUNEO1lBQ0UsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLFdBQVc7WUFDbEIsYUFBYSxFQUFFLEtBQUs7WUFDcEIsV0FBVyxFQUFFLEVBQUU7WUFDZix1RUFBdUU7WUFDdkUsb0RBQW9EO1lBQ3BELFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLHVCQUF1QixDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3hELElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNsQixTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTthQUMvRCxDQUFDLENBQUM7U0FDSjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSw0Q0FBNEM7QUFDNUMsU0FBUyxnQkFBZ0IsQ0FDdkIsU0FBNkIsRUFDN0IsS0FBYSxFQUNiLFdBQW9DLEVBQ3BDLFNBQStCLEVBQy9CLElBQWtDLEVBQ2xDLE9BQTRCO0lBRTVCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVc7UUFDckMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztRQUNoRixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFbEYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzFCLE9BQU8sR0FBRyxRQUFRLFFBQVEsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFL0MsT0FBTyxHQUFHLFFBQVEsUUFBUSxJQUFJLEtBQUssSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7VUFDM0QsdUJBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDdkUsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLDZFQUE2RTtBQUM3RSxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQW1CLEVBQUUsV0FBbUIsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUM3RixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssT0FBTyxDQUFDO0lBRXZFLDJFQUEyRTtJQUMzRSxnQ0FBZ0M7SUFDaEMsT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDaEYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLFFBQXdCO0lBQzVDLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUEwQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUV2RCxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDaEMsS0FBSyxNQUFNO1lBQ1QsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDakUsS0FBSyxPQUFPO1lBQ1YsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDbEU7WUFDRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9CLENBQUM7QUFDSCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLHlFQUF5RTtBQUN6RSwrRUFBK0U7QUFDL0UsU0FBUyxRQUFRLENBQ2YsUUFBd0IsRUFDeEIsYUFBbUMsRUFDbkMsVUFBZ0M7SUFFaEMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQ3ZDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNoRixVQUFVLENBQUMsUUFBUSxDQUFDLENBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLG1DQUFtQztBQUNuQyxTQUFTLFVBQVUsQ0FBQyxRQUF3QjtJQUMxQyxNQUFNLElBQUksR0FBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUV6RixRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNO1lBQ1QsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMvQixLQUFLLE9BQU87WUFDVixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLEtBQUssUUFBUTtZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hDLENBQUM7QUFDSCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSxvQ0FBb0M7QUFDcEMsU0FBUyxRQUFRLENBQUMsSUFBbUIsRUFBRSxLQUFjLEVBQUUsU0FBcUM7SUFDMUYsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsT0FBTyxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUMzQyxDQUFDO0FBaUJELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsU0FBUztBQUNULFNBQVMsV0FBVyxDQUNsQixNQUFnQyxFQUNoQyxNQUF5QyxFQUN6QyxNQUFvQjtJQUVwQix5REFBeUQ7SUFDekQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUV4RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDMUIseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3RyxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSTtZQUNKLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsR0FBRyxJQUFJO1lBQ1AsR0FBRyxTQUFTO1lBQ1osV0FBVyxFQUFFLEVBQUU7WUFDZiwyRUFBMkU7WUFDM0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxHQUFHLE1BQU07U0FDVixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBRyxLQUFLLElBQUksUUFBUTtRQUNqQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRS9FLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJO1FBQ0osS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztRQUN2QixHQUFHLElBQUk7UUFDUCxHQUFHLFNBQVM7UUFDWixHQUFHLFNBQVM7UUFDWixHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLENBQUM7UUFDYixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2pFLHlFQUF5RTtRQUN6RSxtRUFBbUU7UUFDbkUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakMsR0FBRyxNQUFNO0tBQ1YsQ0FBQztBQUNKLENBQUM7QUFFRCwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLFNBQVMsU0FBUyxDQUFDLE1BQXlCLEVBQUUsTUFBeUI7SUFDckUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSx5Q0FBeUM7QUFDekMsRUFBRTtBQUNGLHdFQUF3RTtBQUN4RSwrQkFBK0I7QUFDL0IsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsSUFBdUMsRUFDdkMsU0FBNkI7SUFFN0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBYSxFQUFFLFFBQVEsRUFBRSwyQkFBMkIsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUV2RixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxxQkFBcUIsQ0FBQyxHQUFHO1lBQzVCLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkQsS0FBSyxxQkFBcUIsQ0FBQyxJQUFJO1lBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdEQsS0FBSyxxQkFBcUIsQ0FBQyxJQUFJO1lBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEQ7WUFDRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsMERBQTBEO0FBQzFELFNBQVMsZUFBZSxDQUN0QixNQUErQixFQUMvQixRQUFXLEVBQ1gsTUFBeUM7SUFFekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBaUIsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFFekQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDeEYsSUFBSSxFQUFFLE1BQU07S0FDYixDQUFDO0FBQ0osQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxtREFBbUQ7QUFDbkQsU0FBUyxjQUFjLENBQ3JCLE1BQXlDLEVBQ3pDLEtBQW1CO0lBRW5CLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBbUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUcsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBcUIsRUFBRTtRQUNuRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzdFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQW1DO0lBQzFELE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUM7QUFDbkQsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUscUVBQXFFO0FBQ3JFLFNBQVMsa0JBQWtCLENBQ3pCLE9BQXFCLEVBQ3JCLFVBQWtDLEVBQ2xDLEtBQWMsRUFDZCxPQUE0QjtJQUU1QixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZGLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLGVBQWU7QUFDZixTQUFTLGNBQWMsQ0FBQyxNQUF1QjtJQUM3QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXBHLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDN0IsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw2REFBNkQ7QUFDN0QsU0FBUyxjQUFjLENBQ3JCLE1BQStDLEVBQy9DLFNBQStCLEVBQy9CLE1BQXFCLEVBQ3JCLFdBQW9DLEVBQ3BDLFNBQStCLEVBQy9CLE9BQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUMzQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsV0FBVztRQUNwQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7UUFDM0UsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFFeEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQy9CLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxHQUFHLE1BQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDL0UsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzdHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUUzRSxPQUFPLEtBQUssS0FBSyxJQUFJO1lBQ25CLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDdEIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLFlBQVksQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLFNBQVMsZUFBZSxDQUN0QixJQUFnQyxFQUNoQyxVQUFtQixFQUNuQixTQUF5QixFQUN6QixTQUEwQixFQUFFO0lBRTVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztRQUMzQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztRQUN0QixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFFdkYsT0FBTztRQUNMLElBQUksRUFBRSxPQUFnQjtRQUN0QixJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxTQUFTO1FBQzlCLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQWM7UUFDN0QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzdCLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQWdCLENBQUMsQ0FBQyxDQUFDLE1BQWUsRUFBRTtRQUMxRyx3RUFBd0U7UUFDeEUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3hCLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVELDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3QixNQUFNLFVBQVUsY0FBYyxDQUFDLElBQWdDO0lBQzdELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFNUMsT0FBTztRQUNMLEdBQUcsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUMxQixHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFDMUIsUUFBUSxFQUFFLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3hFLENBQUM7QUFDSixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLFNBQVMsa0JBQWtCLENBQ3pCLE1BQW1CLEVBQ25CLFdBQXVDLEVBQ3ZDLE9BQTRCLEVBQzVCLFVBQThCLEVBQzlCLFVBQTRCO0lBRTVCLE1BQU0sT0FBTyxHQUFHLFVBQVUsS0FBSyxTQUFTLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUF5QixFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVyRyxPQUFPO1FBQ0wsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN2RixLQUFLLEVBQUUsQ0FBQztZQUNSLFVBQVU7WUFDVixLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDckMsQ0FBQztRQUNGO1lBQ0UsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdHLFFBQVEsRUFBRSxPQUFnQjtZQUMxQixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQzFCLFVBQVUsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztTQUMvRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFNBQVMsWUFBWSxDQUFDLElBQWdDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsVUFBVSxDQUFDLEtBQWM7SUFDaEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQU9ELDBFQUEwRTtBQUMxRSxnQ0FBZ0M7QUFDaEMsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsdUJBQXVCO0FBQ3ZCLFNBQVMsY0FBYyxDQUFDLE1BQThCLEVBQUUsT0FBNEI7SUFDbEYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNwRixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFFL0UsT0FBTztRQUNMLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7S0FDakYsQ0FBQztBQUNKLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDBCQUEwQjtBQUMxQixTQUFTLHNCQUFzQixDQUM3QixJQUE2QixFQUM3QixJQUFrQixFQUNsQixPQUE0QjtJQUU1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDeEYsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsaUlBQWlJO0FBQ2pJLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxPQUFPO0FBQ1AsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBbUIsRUFDbkIsU0FBK0IsRUFDL0IsV0FBNkIsRUFDN0IsT0FBNEIsRUFDNUIsT0FBZ0IsRUFDaEIsVUFBNEI7SUFFNUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVySCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FDNUIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNsRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzNHLE9BQU8sQ0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUV2RixPQUFPLHNCQUFzQixDQUMzQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ3JILE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSwyQ0FBMkM7QUFDM0MsU0FBUyxnQkFBZ0IsQ0FBQyxPQUE0QjtJQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDdkQsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSwyQkFBMkI7QUFDM0IsU0FBUyxxQkFBcUIsQ0FBQyxPQUE0QjtJQUN6RCxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUV4RCxPQUFPLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFPRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSxnQkFBZ0I7QUFDaEIsU0FBUyxhQUFhLENBQUMsT0FBaUMsRUFBRSxPQUE0QjtJQUNwRixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFFRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUM1RyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixTQUEwQixFQUMxQixJQUFtQixFQUNuQixLQUFjLEVBQ2QsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQXFCLENBQUM7SUFDL0MsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUNqRCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5RSxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtRQUM1QixNQUFNLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQztRQUNwQyxNQUFNLEVBQUU7WUFDTjtnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDdEMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2dCQUM3RCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUN0QixJQUFJLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNuRCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQzFCLENBQUMsQ0FBQzthQUNKO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELCtFQUErRTtBQUMvRSxxREFBcUQ7QUFDckQsU0FBUyxTQUFTLENBQUMsUUFBd0I7SUFDekMsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLEtBQUssT0FBTztZQUNWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QixLQUFLLFFBQVE7WUFDWCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCO1lBQ0UsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQStCLEVBQUUsTUFBYztJQUNuRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVyxDQUFDO0lBQ2hDLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztJQUM3QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMxRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNqRCxDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLCtFQUErRTtBQUMvRSxTQUFTLGlCQUFpQixDQUFDLElBQW1CO0lBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNoRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVc7UUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsbUVBQW1FO0FBQ25FLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxVQUFvQjtJQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2hDLEtBQUssTUFBTSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxjQUFjO0FBQ2QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUErQjtJQUM1RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQztXQUN6RixvQkFBb0IsQ0FBQyxLQUFLLENBQUM7QUFDbEMsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixTQUFTLGdCQUFnQixDQUN2QixLQUFhLEVBQ2IsV0FBNkIsRUFDN0IsTUFBdUIsRUFDdkIsWUFBa0Msb0JBQW9CLENBQUMsS0FBSztJQUU1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN4QyxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMzQixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNyRixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELHFCQUFxQjtBQUNyQixTQUFTLGtCQUFrQixDQUN6QixJQUFVLEVBQ1YsV0FBOEMsRUFDOUMsTUFBdUIsRUFDdkIsU0FBK0I7SUFFL0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVwRCxJQUFJLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsUUFBUSxXQUFXLEVBQUUsQ0FBQztZQUNwQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMvQixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1QixTQUFTLCtCQUErQjtnQkFDdEMsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxTQUFTLEtBQUssb0JBQW9CLENBQUMsSUFBSSxDQUFDO0lBQ3JELFFBQVEsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxTQUFTO1lBQ1osT0FBTyxJQUFJO2dCQUNULENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUM5QyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDM0MsS0FBSyxPQUFPO1lBQ1YsT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsU0FBUyxrREFBa0Q7WUFDekQsT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkUsQ0FBQztBQUNILENBQUM7QUFFRCw2RUFBNkU7QUFDN0Usb0RBQW9EO0FBQ3BELFNBQVMsZUFBZSxDQUFDLFdBQTZCLEVBQUUsU0FBK0I7SUFDckYsT0FBTyxXQUFXLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7QUFDNUUsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE1BQXVCO0lBQzVDLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUM7QUFDcEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsS0FBYSxFQUNiLFdBQTZCLEVBQzdCLFNBQWtCLEVBQ2xCLE1BQXVCLEVBQ3ZCLFlBQWtDLG9CQUFvQixDQUFDLEtBQUs7SUFFNUQsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsT0FBTyxTQUFTLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUNqSCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUFrQixFQUNsQixJQUFtQixFQUNuQixNQUF1QjtJQUV2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNuQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU5QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxNQUFNLENBQUM7UUFDdkMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDcEcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSw4RUFBOEU7QUFDOUUsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBa0IsRUFDbEIsSUFBbUIsRUFDbkIsTUFBdUI7SUFFdkIsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQXVELE9BQU8sSUFBSSxVQUFVO1FBQ3JGLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUU7UUFDM0csQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVQLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDO1FBQzVELENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDcEQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLHVCQUF1QjtBQUN2QixTQUFTLGdCQUFnQixDQUFDLE1BQWtDO0lBQzFELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLFNBQVMsZUFBZSxDQUN0QixXQUFvQyxFQUNwQyxVQUFvQixFQUNwQixNQUF1QixFQUN2QixTQUErQjtJQUUvQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakQsT0FBTztRQUNMLFNBQVMsRUFBRTtZQUNULFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUMzQixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBRUQsT0FBTyxTQUFTLElBQUksZUFBZSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLFNBQVMsS0FBSyxDQUFDLElBQUksR0FBRztvQkFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDcEIsQ0FBQztZQUNELElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7U0FDakU7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRUNoYXJ0c09wdGlvbiwgTGVnZW5kQ29tcG9uZW50T3B0aW9uLCBTZXJpZXNPcHRpb24sIFRvb2x0aXBDb21wb25lbnRGb3JtYXR0ZXJDYWxsYmFja1BhcmFtcyB9IGZyb20gJ2VjaGFydHMnO1xuXG5pbXBvcnQgeyBpc1ZhbGlkLCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhcnRDb2xvciB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWNoYXJ0LWNvbG9yLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0Q2hhcnREYXRhTGFiZWxzIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0YS1sYWJlbHMuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydERhdGVMYWJlbCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWNoYXJ0LWRhdGUtbGFiZWwuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydExpbmVTdHlsZSB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWNoYXJ0LWxpbmUtc3R5bGUuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydE1hcmtTdGF0IH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtbWFyay1zdGF0LmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBheGlzTnVtYmVyRm9ybWF0LFxuICBDaGFydE51bWJlckZvcm1hdCxcbiAgY2hhcnRWYWx1ZVBlYWssXG4gIERBWV9TSE9SVCxcbiAgZm9ybWF0TG9jYWxEYXRlLFxuICBmb3JtYXROdW1iZXIsXG4gIGZvcm1hdFBsYWluTnVtYmVyLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIE1PTlRIX0RBWSxcbiAgTU9OVEhfTE9ORyxcbiAgTU9OVEhfWUVBUixcbiAgcmVzb2x2ZUNoYXJ0TnVtYmVyRm9ybWF0LFxufSBmcm9tICcuL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBBeGlzQ2hhcnRUeXBlLFxuICBDaGFydENvbmZpZyxcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgQ2hhcnRNZWFzdXJlLFxuICBDaGFydFJlZmVyZW5jZSxcbiAgQ2hhcnRWYWx1ZUF4aXMsXG4gIENvbXBvbmVudERhdGEsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIExlZ2VuZFBvc2l0aW9uLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBOdW1iZXJGb3JtYXRTcGVjLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydExvY2FsZVRhZyxcbiAgV2F0ZXJmYWxsU3RlcEtpbmQsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGVzY2FwZUh0bWwgfSBmcm9tICcuL3RleHQnO1xuaW1wb3J0IHtcbiAgUkVQT1JUX0NIQVJUX0NPTE9SX0JZX05BTUUsXG4gIFJFUE9SVF9DSEFSVF9DT0xPUlMsXG4gIFJFUE9SVF9SRUZFUkVOQ0VfQ09MT1IsXG4gIFJFUE9SVF9XQVRFUkZBTExfQ09MT1JTLFxufSBmcm9tICcuL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgUkVQT1JUX0FYSVNfTEFCRUxfRk9OVF9TSVpFLCBSRVBPUlRfQ0hBUlRfRk9OVF9GQU1JTFksIFJFUE9SVF9EQVRBX0xBQkVMX0ZPTlRfU0laRSB9IGZyb20gJy4vdGhlbWUvdHlwb2dyYXBoeSc7XG5cblxuLy8gUm9vbSBmb3IgYW4gYXhpcyB0aXRsZS4gRUNoYXJ0cyA1J3MgY29udGFpbkxhYmVsIGtlZXBzIHRoZSBUSUNLIGxhYmVscyBpbnNpZGVcbi8vIHRoZSBncmlkIGJ1dCBub3QgdGhlIGF4aXMgbmFtZSwgc28gd2l0aG91dCB0aGlzIGEgdmVydGljYWwgY2hhcnQncyBjYXRlZ29yeVxuLy8gdGl0bGUgcnVucyBvZmYgdGhlIGJvdHRvbSBlZGdlIG9yIHVuZGVyIGEgYm90dG9tIGxlZ2VuZCwgYW5kIGl0cyB2YWx1ZSB0aXRsZVxuLy8gYWJvdmUgdGhlIHBsb3QgcnVucyBvZmYgdGhlIHRvcCBvciB1bmRlciBhIHRvcCBsZWdlbmQuXG5jb25zdCBBWElTX05BTUVfUk9PTSA9IDIwO1xuLy8gRUNoYXJ0cycgb3duIGRlZmF1bHQgZ2FwIGJldHdlZW4gdGhlIGF4aXMgbGluZSBhbmQgaXRzIHRpY2sgbGFiZWxzLlxuY29uc3QgQVhJU19MQUJFTF9NQVJHSU4gPSA4O1xuLy8gQ2xlYXJhbmNlIGJldHdlZW4gdGhlIGxvbmdlc3QgdGljayBsYWJlbCBhbmQgYSBob3Jpem9udGFsIGNoYXJ0J3Mgcm90YXRlZFxuLy8gdGl0bGUsIHNvIHRoZSB0d28gbmV2ZXIgdG91Y2guXG5jb25zdCBBWElTX05BTUVfQ0xFQVJBTkNFID0gNjtcbi8vIEEgaG9yaXpvbnRhbCBjaGFydCdzIGNhdGVnb3J5IGxhYmVscyBhcmUgY3V0IHNob3J0IHdpdGggYW4gZWxsaXBzaXMgcGFzdFxuLy8gdGhpcyB3aWR0aCAodGhlIHRvb2x0aXAgc3RpbGwgc2hvd3MgdGhlbSBpbiBmdWxsKSwgc28gb25lIGxvbmcgbGFiZWwgY2Fubm90XG4vLyBzcXVlZXplIHRoZSBwbG90IGF3YXkuXG5jb25zdCBDQVRFR09SWV9MQUJFTF9NQVhfV0lEVEggPSAxNjA7XG5jb25zdCBMQUJFTF9FTExJUFNJUyA9ICfigKYnO1xuLy8gVGhlIGZvbnQgdGhlIHRoZW1lIGRyYXdzIGF4aXMgbGFiZWxzIGluLCBhcyBhIGNhbnZhcyBmb250IHN0cmluZy4gTGFiZWxzIGFyZVxuLy8gbWVhc3VyZWQgaW4gaXQgdGhlIHdheSBFQ2hhcnRzIG1lYXN1cmVzIHRoZW0gZm9yIGNvbnRhaW5MYWJlbCwgc28gYVxuLy8gaG9yaXpvbnRhbCBjaGFydCdzIHRpdGxlIGxhbmRzIGV4YWN0bHkgYmV5b25kIHRoZSB3aWRlc3QgbGFiZWwuXG5jb25zdCBBWElTX0xBQkVMX0ZPTlQgPSBgJHtSRVBPUlRfQVhJU19MQUJFTF9GT05UX1NJWkV9cHggJHtSRVBPUlRfQ0hBUlRfRk9OVF9GQU1JTFl9YDtcbi8vIFRoZSBsZXR0ZXIgYSBxdWFydGVyIGxhYmVsIHN0YXJ0cyB3aXRoLCBieSBsYW5ndWFnZSBzdWJ0YWcuIEZyZW5jaCB3cml0ZXMgdGhlXG4vLyBzZWNvbmQgcXVhcnRlciAnVDInICh0cmltZXN0cmUpOyBldmVyeSBvdGhlciBsYW5ndWFnZSByZWFkcyAnUTInLlxuY29uc3QgUVVBUlRFUl9QUkVGSVhFUyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtbJ2ZyJywgJ1QnXV0pO1xuY29uc3QgUVVBUlRFUl9QUkVGSVggPSAnUSc7XG4vLyBBIDEwMCUgc3RhY2tlZCBjaGFydCdzIHZhbHVlIGF4aXM6IHdob2xlIHBlcmNlbnRhZ2VzLCBhIGdyaWRsaW5lIGV2ZXJ5IDI1JSxcbi8vIHVwIHRvIDEwMCUuIEl0cyB0b29sdGlwIGdpdmVzIGVhY2ggc2hhcmUgdG8gb25lIGRlY2ltYWwuXG5jb25zdCBQRVJDRU5UX0FYSVNfRk9STUFUOiBOdW1iZXJGb3JtYXRTcGVjID0geyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQsIHByZWNpc2lvbjogMCB9O1xuY29uc3QgUEVSQ0VOVF9TSEFSRV9GT1JNQVQ6IE51bWJlckZvcm1hdFNwZWMgPSB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCwgcHJlY2lzaW9uOiAxIH07XG5leHBvcnQgY29uc3QgUEVSQ0VOVF9BWElTX01BWCA9IDE7XG5leHBvcnQgY29uc3QgUEVSQ0VOVF9BWElTX0lOVEVSVkFMID0gMC4yNTtcbi8vIEEgcmVmZXJlbmNlIGJhbmQncyBmaWxsOiB0aGUgcmVmZXJlbmNlIHNsYXRlLCBmYWludCBlbm91Z2ggdGhhdCB0aGUgc2VyaWVzXG4vLyBkcmF3biBhY3Jvc3MgaXQgc3RheSByZWFkYWJsZS5cbmNvbnN0IFJFRkVSRU5DRV9CQU5EX0ZJTEwgPSAncmdiYSg4MiwgOTYsIDEwOSwgMC4wOCknO1xuLy8gQSByZWZlcmVuY2UncyBvciBzdGF0aXN0aWMgbGluZSdzIGxhYmVsIHNpdHMgb24gYSBsaWdodCBib3gsIHNvIGl0IHN0YXlzXG4vLyByZWFkYWJsZSB3aGVyZSBpdCBjcm9zc2VzIGEgYmFyIG9yIGEgbGluZS5cbmNvbnN0IE1BUktfTEFCRUxfQk9YID0geyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpJywgcGFkZGluZzogWzEsIDNdLCBib3JkZXJSYWRpdXM6IDIgfTtcbi8vIFRoZSByb29tIGFuIGF4aXMgc3RyZXRjaGVkIHRvIGEgcmVmZXJlbmNlIGxlYXZlcyBhYm92ZSBpdCwgZm9yIGl0cyBsYWJlbDpcbi8vIHRoZSBib3VuZCBpcyB0aGUgcm91bmQgbnVtYmVyIGF0IG9yIHBhc3QgdGhlIHJlZmVyZW5jZSBwbHVzIHRoaXMgc2hhcmUuXG5jb25zdCBSRUZFUkVOQ0VfSEVBRFJPT00gPSAxLjA1O1xuXG4vLyBUaGUgd29yZHMgYSBzdGF0aXN0aWMgbGluZSdzIGxhYmVsIHN0YXJ0cyB3aXRoLiBUaGV5IGFyZSBpbnRlcmZhY2UgdGV4dCxcbi8vIEVuZ2xpc2ggaW4gZXZlcnkgcmVwb3J0IGxvY2FsZTsgb25seSB0aGUgdmFsdWUgYWZ0ZXIgdGhlbSBmb2xsb3dzIGl0LlxuZXhwb3J0IGNvbnN0IFNUQVRfTEFCRUw6IFJlY29yZDxSZXBvcnRDaGFydE1hcmtTdGF0LCBzdHJpbmc+ID0ge1xuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5BdmVyYWdlXTogJ0F2ZXJhZ2UnLFxuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5NZWRpYW5dOiAnTWVkaWFuJyxcbiAgW1JlcG9ydENoYXJ0TWFya1N0YXQuTWluXTogJ01pbmltdW0nLFxuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5NYXhdOiAnTWF4aW11bScsXG59O1xuXG4vLyBXaGljaCBlZGdlIG9mIHRoZSBwbG90IGFuIGF4aXMgdGl0bGUgc2l0cyBvbi4gVGhlIGNhdGVnb3J5IGF4aXMncyBpcyBiZWxvdyBhXG4vLyB2ZXJ0aWNhbCBjaGFydCBhbmQgdG8gdGhlIGxlZnQgb2YgYSBob3Jpem9udGFsIG9uZTsgdGhlIHZhbHVlIGF4aXMncyBpcyBhYm92ZVxuLy8gYSB2ZXJ0aWNhbCBjaGFydCBhbmQgYmVsb3cgYSBob3Jpem9udGFsIG9uZS5cbnR5cGUgQXhpc1RpdGxlU2lkZSA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbi8vIFdoaWNoIHZhbHVlIGF4aXMgYSBzZXJpZXMgaXMgcGxvdHRlZCBhZ2FpbnN0OiAwIHRoZSBwcmltYXJ5LCAxIHRoZSBzZWNvbmRcbi8vIGF4aXMgb24gdGhlIHJpZ2h0LlxuZXhwb3J0IHR5cGUgVmFsdWVBeGlzSW5kZXggPSAwIHwgMTtcblxuLy8gV2hhdCB2YWx1ZUF4aXNPcHRpb24gYWRkcyBmb3Igb25lIGF4aXMuIGBpbmRleGAgaXMgdGhlIGF4aXMgb2YgYSB0d28tYXhpc1xuLy8gY2hhcnQgaXQgYnVpbGRzOiB0aGUgc2Vjb25kIG9uZSdzIHRpdGxlIGlzIGFsaWduZWQgdG8gcmVhZCBsZWZ0d2FyZCBmcm9tIHRoZVxuLy8gcmlnaHQgZWRnZS4gYHBlcmNlbnRNaW5gIG1ha2VzIGl0IGEgMTAwJSBzdGFja2VkIGNoYXJ0J3Mgc2hhcmUgYXhpcywgZnJvbVxuLy8gdGhhdCBib3VuZCAoMCwgb3IgLTEgd2hlbiBhIHNoYXJlIGlzIG5lZ2F0aXZlKSB1cCB0byAxMDAlLCB3aGF0ZXZlciByYW5nZVxuLy8gdGhlIGNvbmZpZyBwaW5zLiBgcmVhY2hgIGlzIHRoZSBzcGFuIG9mIHRoZSByZWZlcmVuY2VzIHBsb3R0ZWQgYWdhaW5zdCBpdCxcbi8vIHdoaWNoIHRoZSBheGlzIHN0cmV0Y2hlcyB0byB3aGVuIHRoZSBkYXRhIGZhbGxzIHNob3J0IG9mIHRoZW0uXG5pbnRlcmZhY2UgVmFsdWVBeGlzRXh0cmFzIHtcbiAgaW5kZXg/OiBWYWx1ZUF4aXNJbmRleDtcbiAgcGVyY2VudE1pbj86IG51bWJlcjtcbiAgcmVhY2g/OiBSZWZlcmVuY2VSZWFjaDtcbn1cblxuLy8gQSByZWZlcmVuY2UgYXMgdGhlIGNoYXJ0IGRyYXdzIGl0OiBpdHMgbG93ZXIgYW5kIHVwcGVyIGVkZ2UgKHRoZSBzYW1lIHZhbHVlXG4vLyBmb3IgYSBsaW5lKSwgd2hldGhlciBpdCBpcyBhIGJhbmQsIGFuZCB0aGUgdmFsdWUgYXhpcyBpdCBpcyBwbG90dGVkIGFnYWluc3QuXG4vLyBTaGFyZWQgd2l0aCB0aGUgUG93ZXJQb2ludCBleHBvcnQsIHdoaWNoIGRyYXdzIGVhY2ggZWRnZSBhcyBhIGNvbnN0YW50IGxpbmUuXG5leHBvcnQgaW50ZXJmYWNlIERyYXduUmVmZXJlbmNlIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbG93OiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgYmFuZDogYm9vbGVhbjtcbiAgYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleDtcbn1cblxuLy8gVGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBlZGdlIG9mIHRoZSByZWZlcmVuY2VzIG9uIG9uZSB2YWx1ZSBheGlzLlxuaW50ZXJmYWNlIFJlZmVyZW5jZVJlYWNoIHtcbiAgbG93OiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbn1cblxuLy8gV2hhdCBFQ2hhcnRzIGhhbmRzIGEgdmFsdWUgYXhpcydzIG1pbiBhbmQgbWF4IGNhbGxiYWNrczogdGhlIGV4dGVudCBvZiB0aGVcbi8vIGRhdGEgcGxvdHRlZCBhZ2FpbnN0IGl0LlxuaW50ZXJmYWNlIEF4aXNFeHRlbnQge1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG59XG5cbi8vIE9uZSBwb2ludCBvZiBhIDEwMCUgc3RhY2tlZCBzZXJpZXM6IGl0cyBzaGFyZSBvZiB0aGUgY2F0ZWdvcnkncyB0b3RhbCxcbi8vIHdoaWNoIEVDaGFydHMgcGxvdHMgYW5kIHN0YWNrcywgYW5kIHRoZSB2YWx1ZSBpdCBjYW1lIGZyb20uXG5pbnRlcmZhY2UgU2hhcmVEYXRhSXRlbSB7XG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xuICByYXc6IG51bWJlciB8IG51bGw7XG59XG5cbi8vIEEgcG9pbnQgdGhhdCBwcmludHMgaXRzIG93biBkYXRhIGxhYmVsOiBhICdsYXN0JyBzZXJpZXMnIGxhdGVzdCBwb2ludCxcbi8vIGtlZXBpbmcgdGhlIHJhdyB2YWx1ZSBhIDEwMCUgc3RhY2tlZCBwb2ludCBjYXJyaWVzLlxuaW50ZXJmYWNlIExhYmVsZWREYXRhSXRlbTxQIGV4dGVuZHMgRGF0YUxhYmVsUG9zaXRpb24+IHtcbiAgdmFsdWU6IG51bWJlciB8IG51bGw7XG4gIHJhdz86IG51bWJlciB8IG51bGw7XG4gIGxhYmVsOiBEYXRhTGFiZWw8UD47XG59XG5cbnR5cGUgU2VyaWVzRGF0YUl0ZW08UCBleHRlbmRzIERhdGFMYWJlbFBvc2l0aW9uPiA9IG51bWJlciB8IG51bGwgfCBTaGFyZURhdGFJdGVtIHwgTGFiZWxlZERhdGFJdGVtPFA+O1xuXG4vLyBXaGF0IGEgZGF0YSBsYWJlbCdzIGZvcm1hdHRlciBpcyBoYW5kZWQ6IHRoZSBwb2ludCdzIHBsb3R0ZWQgdmFsdWUgYW5kIGl0c1xuLy8gZGF0YSBpdGVtIGFzIGdpdmVuIChhIG51bWJlciwgb3IgYW4gb2JqZWN0IGNhcnJ5aW5nIHRoZSByYXcgdmFsdWUpLlxuaW50ZXJmYWNlIERhdGFMYWJlbFBhcmFtcyB7XG4gIHZhbHVlPzogdW5rbm93bjtcbiAgZGF0YT86IHVua25vd247XG59XG5cbmV4cG9ydCB0eXBlIERhdGFMYWJlbEZvcm1hdHRlciA9IChwYXJhbXM6IERhdGFMYWJlbFBhcmFtcykgPT4gc3RyaW5nO1xuXG4vLyBXaGVyZSBhIGRhdGEgbGFiZWwgc2l0czogJ291dHNpZGUnIHBhc3QgYW4gdW5zdGFja2VkIGJhcidzIGVuZCwgb24gdGhlIHNpZGVcbi8vIGl0cyBzaWduIHBvaW50cyB0bzsgJ2luc2lkZScgYSBzdGFja2VkIGJhcjsgJ3RvcCcgYWJvdmUgYSBsaW5lIG9yIGFyZWFcbi8vIHBvaW50LiBFQ2hhcnRzIHRha2VzICdvdXRzaWRlJyBvbiBhIGJhciBvbmx5LlxuZXhwb3J0IHR5cGUgRGF0YUxhYmVsUG9zaXRpb24gPSAndG9wJyB8ICdpbnNpZGUnIHwgJ291dHNpZGUnO1xuXG4vLyBPbmUgRUNoYXJ0cyBsYWJlbCwgYXMgYSBzZXJpZXMgb3IgYSBzaW5nbGUgcG9pbnQgcHJpbnRzIGl0LlxuZXhwb3J0IGludGVyZmFjZSBEYXRhTGFiZWw8UCBleHRlbmRzIERhdGFMYWJlbFBvc2l0aW9uID0gRGF0YUxhYmVsUG9zaXRpb24+IHtcbiAgc2hvdzogdHJ1ZTtcbiAgcG9zaXRpb246IFA7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvcm1hdHRlcjogRGF0YUxhYmVsRm9ybWF0dGVyO1xufVxuXG4vLyBBIHNlcmllcycgZGF0YSBsYWJlbHMgYXMgZGF0YUxhYmVsT3B0aW9uIGRlY2lkZXMgdGhlbSwgYmVmb3JlIGJ1aWxkU2VyaWVzXG4vLyBwbGFjZXMgdGhlbSBieSB3aGF0IHRoZSBzZXJpZXMgZHJhd3M6IHRoZSBsYWJlbCdzIHRleHQgYW5kIHNpemUsIHdoZXRoZXJcbi8vIGxhYmVscyB0aGF0IHdvdWxkIG92ZXJsYXAgYXJlIGhpZGRlbiAoJ2F1dG8nKSwgYW5kIHdoZXRoZXIgb25seSB0aGUgbGF0ZXN0XG4vLyBwb2ludCBwcmludHMgb25lICgnbGFzdCcpLlxuZXhwb3J0IGludGVyZmFjZSBTZXJpZXNEYXRhTGFiZWxzIHtcbiAgdGV4dDogT21pdDxEYXRhTGFiZWwsICdwb3NpdGlvbic+O1xuICBoaWRlT3ZlcmxhcDogYm9vbGVhbjtcbiAgbGFzdE9ubHk6IGJvb2xlYW47XG59XG5cbi8vIEEgc2VyaWVzJyBkYXRhIGxhYmVscyBwbGFjZWQ6IGBzZXJpZXNgIGlzIHNwcmVhZCBvdmVyIHRoZSBzZXJpZXMgKGl0c1xuLy8gbGFiZWwsIGFuZCBmb3IgJ2F1dG8nIHRoZSBvdmVybGFwIGhpZGluZyksIGFuZCBgZGF0YWAgaXMgaXRzIHBvaW50cywgdGhlXG4vLyBsYXRlc3Qgbm9uLWVtcHR5IG9uZSBjYXJyeWluZyB0aGUgbGFiZWwgZm9yICdsYXN0Jy5cbmludGVyZmFjZSBQbGFjZWREYXRhTGFiZWxzPFAgZXh0ZW5kcyBEYXRhTGFiZWxQb3NpdGlvbj4ge1xuICBzZXJpZXM6IHsgbGFiZWw/OiBEYXRhTGFiZWw8UD47IGxhYmVsTGF5b3V0PzogeyBoaWRlT3ZlcmxhcDogYm9vbGVhbiB9IH07XG4gIGRhdGE6IFNlcmllc0RhdGFJdGVtPFA+W107XG59XG5cbi8vIEEgdmFsdWUgYXhpcydzIG51bWJlciBmb3JtYXQsIGRlY2lkZWQgb25jZSBmb3IgdGhlIGF4aXM6IHRoZSBmb3JtYXQgdGhlXG4vLyBtZWFzdXJlcyBwbG90dGVkIGFnYWluc3QgaXQgYWdyZWUgb24gKGF4aXNOdW1iZXJGb3JtYXQpLCB3aXRoIHRoZSB1bml0cyBhbmRcbi8vIGRlY2ltYWxzIGl0cyBwZWFrIGNhbGxzIGZvci4gbnVsbCBpcyBhIHBsYWluIGF4aXMuIEl0cyB0aWNrcyBhbmQgaXRzIHNlcmllcydcbi8vIGRhdGEgbGFiZWxzIGJvdGggd3JpdGUgaW4gaXQuXG5pbnRlcmZhY2UgVmFsdWVBeGlzRm9ybWF0IHtcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYztcbiAgY2hhcnQ6IENoYXJ0TnVtYmVyRm9ybWF0O1xufVxuXG4vLyBUaGUgc2hhcmVzIGEgMTAwJSBzdGFja2VkIGNoYXJ0IGRyYXdzLCBieSB0aGUgaW5kZXggb2YgdGhlIGV4dHJhY3RlZCBzZXJpZXNcbi8vIHRoZXkgcmVwbGFjZS5cbmV4cG9ydCB0eXBlIFBlcmNlbnRTaGFyZXMgPSBNYXA8bnVtYmVyLCAobnVtYmVyIHwgbnVsbClbXT47XG5cbi8vIFRoZSBwbG90J3MgZGlzdGFuY2UgZnJvbSBlYWNoIGVkZ2Ugb2YgdGhlIGNoYXJ0LCBpbiBwaXhlbHMuXG5pbnRlcmZhY2UgQXhpc0dyaWRSb29tIHtcbiAgbGVmdDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIGNvbnRhaW5MYWJlbDogYm9vbGVhbjtcbn1cblxuXG4vLyBjb2xvckJ5IGFwcGxpZXMgb25seSB0byBzaW5nbGUtZGltZW5zaW9uIGJhciBjaGFydHMsIGFuZCBvbmx5IHdoZW4gc3BsaXRCeVxuLy8gaXNuJ3QgYWxyZWFkeSBkcml2aW5nIG11bHRpcGxlIHNlcmllczogaXQgY29sb3JzIGVhY2ggYmFyIGJ5IGl0cyBjYXRlZ29yeSBhbmRcbi8vIHNob3dzIGEgbGVnZW5kIChvbmUgc2VyaWVzIHBlciBjYXRlZ29yeSwgb3ZlcmxhcHBlZCB0byBmdWxsIHdpZHRoKS5cbi8vXG4vLyBJdCBpcyB0aGUgREVGQVVMVCBmb3IgYSBjYXRlZ29yaWNhbCBiYXIgY2hhcnQgcmF0aGVyIHRoYW4gc29tZXRoaW5nIHRoZSBjb25maWdcbi8vIGhhcyB0byBhc2sgZm9yLiBBIGJhciBjaGFydCB3aG9zZSB4LWF4aXMgaXMgYSBjYXRlZ29yeSDigJQgcmVnaW9ucywgc3RhdHVzZXMsXG4vLyBzdG9yZXMg4oCUIGlzIGNvbXBhcmluZyB0aG9zZSBjYXRlZ29yaWVzIHRvIGVhY2ggb3RoZXIsIGFuZCBvbmUgZmxhdCBjb2xvciB3aXRoXG4vLyBubyBsZWdlbmQgaXMgdGhlIHdyb25nIHJlYWRpbmcgb2YgaXQgaW4gZXNzZW50aWFsbHkgZXZlcnkgY2FzZS4gUmVxdWlyaW5nXG4vLyBjb2xvckJ5IHRvIG9wdCBpbiBtZWFudCBldmVyeSBzdWNoIGNoYXJ0IHJlbmRlcmVkIG1vbm9jaHJvbWUgdW5sZXNzIHdob2V2ZXJcbi8vIHdyb3RlIHRoZSBjb25maWcgcmVtZW1iZXJlZCBhbiBvcHRpb25hbCBwcm9wZXJ0eSwgd2hpY2ggaXMgYSBkZWZhdWx0IHNldCB0aGVcbi8vIHdyb25nIHdheSByb3VuZDogdGhlIGNvbW1vbiBjYXNlIHNob3VsZCBub3QgbmVlZCB0aGUgZmxhZy5cbi8vXG4vLyBBIFRJTUUgYXhpcyBpcyBleGNsdWRlZDogY29uc2VjdXRpdmUgcGVyaW9kcyBhcmUgb25lIHNlcmllcyBtb3ZpbmcsIG5vdFxuLy8gY2F0ZWdvcmllcyBiZWluZyBjb21wYXJlZCwgYW5kIGNvbG9yaW5nIGVhY2ggbW9udGggZGlmZmVyZW50bHkgcmVhZHMgYXNcbi8vIHVucmVsYXRlZCBncm91cHMuIEV4cGxpY2l0bHkgb3B0aW5nIG91dCDigJQgY29sb3JCeToge2NvbHVtbjogJyd9LCBhIGNvbG9yIG9uXG4vLyB0aGUgbWVhc3VyZSBvciBhIGNvbmZpZy5sZWdlbmQgb2YgJ2hpZGRlbicg4oCUIHN0aWxsIHdpbnMsIHNvIGEgY2FsbGVyIHRoYXRcbi8vIHdhbnRzIG9uZSBmbGF0IGNvbG9yIGNhbiBzYXkgc28uXG4vL1xuLy8gXCJCYXIgY2hhcnRcIiBpcyB0aGUgdHlwZSB0aGUgbG9uZSBtZWFzdXJlIGlzIGFjdHVhbGx5IERSQVdOIGFzOiBpdHMgb3duIHR5cGVcbi8vIHdoZW4gaXQgbmFtZXMgb25lLCB3aGljaCBjYW4gdHVybiBhIGxpbmUgY2hhcnQncyBzaW5nbGUgc2VyaWVzIGludG8gYmFycyBvclxuLy8gYSBiYXIgY2hhcnQncyBpbnRvIGEgbGluZS5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbG9yQnkoY29uZmlnOiBDaGFydENvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoY29uZmlnLnNwbGl0Qnk/LmNvbHVtbiB8fCAoY29uZmlnLm1lYXN1cmVzPy5bMF0/LnR5cGUgPz8gY29uZmlnLmNoYXJ0VHlwZSA/PyAnYmFyJykgIT09ICdiYXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5jb2xvckJ5KSB7XG4gICAgcmV0dXJuICEhY29uZmlnLmNvbG9yQnkuY29sdW1uO1xuICB9XG5cbiAgLy8gQSBtZWFzdXJlIGdpdmVuIGl0cyBvd24gY29sb3IgYXNrcyBmb3Igb25lIGZsYXQgY29sb3IuXG4gIGlmIChtZWFzdXJlQ29sb3JIZXgoY29uZmlnLm1lYXN1cmVzPy5bMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChjb25maWcueEF4aXM/LmtpbmQgPz8gJ2NhdGVnb3J5JykgPT09ICdjYXRlZ29yeSdcbiAgICAmJiAhY29uZmlnLnhBeGlzPy5ncmFudWxhcml0eVxuICAgICYmIChjb25maWcubWVhc3VyZXM/Lmxlbmd0aCA/PyAxKSA8PSAxO1xufVxuXG5cbi8vIFRoZSBjb2x1bW4gY29sb3JCeSBncm91cHMgYnkg4oCUIGl0cyBvd24gd2hlbiB0aGUgY29uZmlnIG5hbWVkIG9uZSwgb3RoZXJ3aXNlXG4vLyB0aGUgeC1heGlzIGl0IGRlZmF1bHRzIHRvIGNvbG9yaW5nLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQnlDb2x1bW4oY29uZmlnOiBDaGFydENvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc0NvbG9yQnkoY29uZmlnKVxuICAgID8gKGNvbmZpZy5jb2xvckJ5Py5jb2x1bW4gfHwgY29uZmlnLnhBeGlzPy5jb2x1bW4pXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cblxuLy8gQ2F0ZWdvcmllcyArIG5hbWVkIHNlcmllcyBleHRyYWN0ZWQgZnJvbSBhIGNoYXJ0IGNvbXBvbmVudCdzIGNvbmZpZyArIHJvd3Mg4oCUXG4vLyB0aGUgb25lIHBpdm90IChzcGxpdEJ5IOKGkiBzZXJpZXMsIG1lYXN1cmVzIOKGkiBzZXJpZXMpIHNoYXJlZCBieSB0aGUgb24tc2NyZWVuXG4vLyBFQ2hhcnRzIG9wdGlvbiBiZWxvdyBBTkQgdGhlIFBvd2VyUG9pbnQgZXhwb3J0J3MgbmF0aXZlIGNoYXJ0IGRhdGEsIHNvIGJvdGhcbi8vIG1lZGlhIHBsb3QgaWRlbnRpY2FsIG51bWJlcnMuXG4vL1xuLy8gQSBzZXJpZXMnIGB0eXBlYCBpcyB0aGUgdHlwZSBpdHMgbWVhc3VyZSBhc2tzIHRvIGJlIGRyYXduIGFzLCBhbmQgaXMgYWJzZW50XG4vLyB3aGVuIHRoZSBtZWFzdXJlIGxlYXZlcyBpdCB0byB0aGUgY2hhcnQncyBjaGFydFR5cGUgKHNlZSBzZXJpZXNUeXBlcykuIEl0c1xuLy8gYG1lYXN1cmVgIGlzIHRoZSBvbmUgaXQgcGxvdHMsIHdob3NlIG51bWJlciBmb3JtYXQgaXRzIHRvb2x0aXAgdXNlcyBhbmRcbi8vIHdob3NlIGRpc3BsYXkga2V5cyAoY29sb3IsIGF4aXMpIGl0IGZvbGxvd3MsIGFuZCBgbWVhc3VyZUluZGV4YCB0aGF0XG4vLyBtZWFzdXJlJ3MgcG9zaXRpb246IHRoZSBmaXJzdCBtZWFzdXJlLCAwLCBmb3IgZXZlcnkgc2VyaWVzIG9mIGEgc3BsaXRCeSBvclxuLy8gY29sb3JCeSBjaGFydC5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdGVkQ2hhcnRTZXJpZXMge1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgc2VyaWVzOiBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlczogKG51bWJlciB8IG51bGwpW107XG4gIHR5cGU/OiBBeGlzQ2hhcnRUeXBlO1xuICBtZWFzdXJlOiBDaGFydE1lYXN1cmU7XG4gIG1lYXN1cmVJbmRleDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENoYXJ0U2VyaWVzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRXh0cmFjdGVkQ2hhcnRTZXJpZXMge1xuICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIENoYXJ0Q29uZmlnO1xuICBjb25zdCB4Q29sdW1uID0gY29uZmlnLnhBeGlzPy5jb2x1bW4gPz8gZGF0YS5jb2x1bW5zWzBdO1xuICBjb25zdCBzcGxpdENvbHVtbiA9IGNvbmZpZy5zcGxpdEJ5Py5jb2x1bW47XG4gIC8vIGNvbG9yQnkgZW1pdHMgb25lIHNlcmllcyBwZXIgY2F0ZWdvcnkgdG9vIChzbyBlYWNoIGJhciBjYXJyaWVzIGl0cyBvd25cbiAgLy8gY29sb3IgKyBsZWdlbmQgZW50cnkpLCBidXQgdGhlIGJhcnMgYXJlIG92ZXJsYXBwZWQgdG8gZnVsbCB3aWR0aCBpblxuICAvLyBidWlsZEF4aXNPcHRpb24gcmF0aGVyIHRoYW4gbGFpZCBzaWRlLWJ5LXNpZGUuIHNwbGl0Qnkgd2lucyBpZiBib3RoIGFyZSBzZXQuXG4gIGNvbnN0IGdyb3VwQ29sdW1uID0gc3BsaXRDb2x1bW4gfHwgY29sb3JCeUNvbHVtbihjb25maWcpO1xuICBjb25zdCBtZWFzdXJlcyA9IGNoYXJ0TWVhc3VyZXMoY29uZmlnLCBkYXRhKTtcblxuICBjb25zdCByYXdDYXRlZ29yaWVzID0gdW5pcXVlVmFsdWVzKGRhdGEucm93cywgeENvbHVtbik7XG4gIGNvbnN0IGNhdGVnb3JpZXMgPSByYXdDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IFN0cmluZyhjYXRlZ29yeSA/PyAn4oCUJykpO1xuICBjb25zdCBzZXJpZXM6IEV4dHJhY3RlZENoYXJ0U2VyaWVzWydzZXJpZXMnXSA9IFtdO1xuXG4gIGlmIChncm91cENvbHVtbikge1xuICAgIC8vIE9uZSBzZXJpZXMgcGVyIGdyb3VwIHZhbHVlIChzcGxpdEJ5L2NvbG9yQnkpLCBwaXZvdGVkIG92ZXIgdGhlIGZpcnN0IG1lYXN1cmUuXG4gICAgY29uc3QgbWVhc3VyZSA9IG1lYXN1cmVzWzBdO1xuICAgIGZvciAoY29uc3QgZ3JvdXBWYWx1ZSBvZiB1bmlxdWVWYWx1ZXMoZGF0YS5yb3dzLCBncm91cENvbHVtbikpIHtcbiAgICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHVua25vd24sIHVua25vd24+KCk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhLnJvd3MpIHtcbiAgICAgICAgaWYgKHJvd1tncm91cENvbHVtbl0gPT09IGdyb3VwVmFsdWUpIHtcbiAgICAgICAgICBieUNhdGVnb3J5LnNldChyb3dbeENvbHVtbl0sIHJvd1ttZWFzdXJlLmNvbHVtbl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlcmllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogU3RyaW5nKGdyb3VwVmFsdWUgPz8gJ+KAlCcpLFxuICAgICAgICB2YWx1ZXM6IHJhd0NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gbnVtZXJpYyhieUNhdGVnb3J5LmdldChjYXRlZ29yeSkpKSxcbiAgICAgICAgdHlwZTogbWVhc3VyZS50eXBlLFxuICAgICAgICBtZWFzdXJlLFxuICAgICAgICBtZWFzdXJlSW5kZXg6IDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBbbWVhc3VyZUluZGV4LCBtZWFzdXJlXSBvZiBtZWFzdXJlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSBuZXcgTWFwPHVua25vd24sIHVua25vd24+KCk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhLnJvd3MpIHtcbiAgICAgICAgYnlDYXRlZ29yeS5zZXQocm93W3hDb2x1bW5dLCByb3dbbWVhc3VyZS5jb2x1bW5dKTtcbiAgICAgIH1cblxuICAgICAgc2VyaWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBtZWFzdXJlLmxhYmVsID8/IG1lYXN1cmUuY29sdW1uLFxuICAgICAgICB2YWx1ZXM6IHJhd0NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gbnVtZXJpYyhieUNhdGVnb3J5LmdldChjYXRlZ29yeSkpKSxcbiAgICAgICAgdHlwZTogbWVhc3VyZS50eXBlLFxuICAgICAgICBtZWFzdXJlLFxuICAgICAgICBtZWFzdXJlSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjYXRlZ29yaWVzLCBzZXJpZXMgfTtcbn1cblxuLy8gQSBzZXJpZXMnIG93biBjb2xvciBhcyBDU1MgaGV4OiBpdHMgbWVhc3VyZSdzIG5hbWVkIGNvbG9yLCBvciB1bmRlZmluZWQgd2hlblxuLy8gaXQgbmFtZXMgbm9uZSAob3IgYSBuYW1lIHRoZSBwYWxldHRlIGRvZXMgbm90IGtub3cpIGFuZCB0aGUgdGhlbWUgY29sb3JzIGl0XG4vLyBieSBpdHMgcG9zaXRpb24uXG5leHBvcnQgZnVuY3Rpb24gc2VyaWVzQ29sb3Ioc2VyaWVzOiBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZXggPSBuYW1lZENvbG9ySGV4KHNlcmllcyk7XG5cbiAgcmV0dXJuIGhleCA/IGAjJHtoZXh9YCA6IHVuZGVmaW5lZDtcbn1cblxuLy8gQSBzZXJpZXMnIGNvbG9yIGFzIHRoZSBiYXJlIGhleCBQb3dlclBvaW50IHRha2VzOiBpdHMgbWVhc3VyZSdzIG5hbWVkIGNvbG9yLFxuLy8gZWxzZSB0aGUgcGFsZXR0ZSBjb2xvciBvZiBpdHMgcG9zaXRpb24sIGFzIHRoZSBzY3JlZW4ncyB0aGVtZSBwaWNrcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpZXNIZXgoc2VyaWVzOiBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW0sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZWRDb2xvckhleChzZXJpZXMpID8/IFJFUE9SVF9DSEFSVF9DT0xPUlNbaW5kZXggJSBSRVBPUlRfQ0hBUlRfQ09MT1JTLmxlbmd0aF07XG59XG5cbmZ1bmN0aW9uIG5hbWVkQ29sb3JIZXgoc2VyaWVzOiBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbWVhc3VyZUNvbG9ySGV4KHNlcmllcy5tZWFzdXJlKTtcbn1cblxuLy8gQSBtZWFzdXJlJ3MgbmFtZWQgY29sb3IgYXMgYmFyZSBoZXgsIG9yIHVuZGVmaW5lZCB3aGVuIGl0IG5hbWVzIG5vbmUgb3IgYVxuLy8gbmFtZSB0aGUgcGFsZXR0ZSBkb2VzIG5vdCBrbm93LiBUaGUgbmFtZSBpcyByZWFkIHRocm91Z2ggdGhlIGVudW0sIHNvIGFcbi8vIHN0b3JlZCBuYW1lIHN1Y2ggYXMgJ19fcHJvdG9fXycgbmV2ZXIgcmVhY2hlcyB0aGUgbG9va3VwIG9iamVjdC5cbmZ1bmN0aW9uIG1lYXN1cmVDb2xvckhleChtZWFzdXJlOiBDaGFydE1lYXN1cmUgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb2xvciA9IE9iamVjdC52YWx1ZXMoUmVwb3J0Q2hhcnRDb2xvcikuZmluZCgobmFtZSkgPT4gbmFtZSA9PT0gbWVhc3VyZT8uY29sb3IpO1xuXG4gIHJldHVybiBjb2xvciA/IFJFUE9SVF9DSEFSVF9DT0xPUl9CWV9OQU1FW2NvbG9yXSA6IHVuZGVmaW5lZDtcbn1cblxuLy8gQSBtZWFzdXJlJ3MgbGluZSBzdHlsZSB3aGVuIGl0IG5hbWVzIG9uZSBFQ2hhcnRzIGtub3dzLCBlbHNlIHVuZGVmaW5lZCBhbmRcbi8vIHRoZSBsaW5lIGlzIHNvbGlkLlxuZXhwb3J0IGZ1bmN0aW9uIG1lYXN1cmVMaW5lU3R5bGUobWVhc3VyZTogQ2hhcnRNZWFzdXJlIHwgdW5kZWZpbmVkKTogUmVwb3J0Q2hhcnRMaW5lU3R5bGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhSZXBvcnRDaGFydExpbmVTdHlsZSkuZmluZCgoc3R5bGUpID0+IHN0eWxlID09PSBtZWFzdXJlPy5saW5lKTtcbn1cblxuLy8gQSBtZWFzdXJlJ3Mgc3RhdGlzdGljIGxpbmUgd2hlbiBpdCBuYW1lcyBvbmUgdGhlIHZpZXdlciBrbm93cywgZWxzZVxuLy8gdW5kZWZpbmVkIGFuZCBpdCBkcmF3cyBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIG1lYXN1cmVNYXJrU3RhdChtZWFzdXJlOiBDaGFydE1lYXN1cmUgfCB1bmRlZmluZWQpOiBSZXBvcnRDaGFydE1hcmtTdGF0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUmVwb3J0Q2hhcnRNYXJrU3RhdCkuZmluZCgoc3RhdCkgPT4gc3RhdCA9PT0gbWVhc3VyZT8ubWFya0xpbmUpO1xufVxuXG4vLyBBIHNlcmllcycgc3RhdGlzdGljIG92ZXIgaXRzIHBvaW50cyB0aGF0IGhhdmUgYSB2YWx1ZTogdGhlaXIgbWVhbiwgdGhlaXJcbi8vIG1lZGlhbiAodGhlIG1lYW4gb2YgdGhlIHR3byBtaWRkbGUgdmFsdWVzIHdoZW4gdGhlIGNvdW50IGlzIGV2ZW4pLCB0aGVcbi8vIGxvd2VzdCBvciB0aGUgaGlnaGVzdC4gbnVsbCB3aGVuIG5vIHBvaW50IGhhcyBhIHZhbHVlLiBTaGFyZWQgd2l0aCB0aGVcbi8vIFBvd2VyUG9pbnQgZXhwb3J0IHNvIGJvdGggbWVkaWEgZHJhdyB0aGUgbGluZSBhdCB0aGUgc2FtZSBoZWlnaHQuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWVzU3RhdCh2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdLCBzdGF0OiBSZXBvcnRDaGFydE1hcmtTdGF0KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHByZXNlbnQgPSB2YWx1ZXMuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIG51bWJlciA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpO1xuXG4gIGlmICghcHJlc2VudC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoc3RhdCkge1xuICAgIGNhc2UgUmVwb3J0Q2hhcnRNYXJrU3RhdC5BdmVyYWdlOlxuICAgICAgcmV0dXJuIHByZXNlbnQucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCkgLyBwcmVzZW50Lmxlbmd0aDtcbiAgICBjYXNlIFJlcG9ydENoYXJ0TWFya1N0YXQuTWVkaWFuOiB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4ucHJlc2VudF0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcihzb3J0ZWQubGVuZ3RoIC8gMik7XG5cbiAgICAgIHJldHVybiBzb3J0ZWQubGVuZ3RoICUgMiA/IHNvcnRlZFttaWRkbGVdIDogKHNvcnRlZFttaWRkbGUgLSAxXSArIHNvcnRlZFttaWRkbGVdKSAvIDI7XG4gICAgfVxuICAgIGNhc2UgUmVwb3J0Q2hhcnRNYXJrU3RhdC5NaW46XG4gICAgICByZXR1cm4gTWF0aC5taW4oLi4ucHJlc2VudCk7XG4gICAgY2FzZSBSZXBvcnRDaGFydE1hcmtTdGF0Lk1heDpcbiAgICAgIHJldHVybiBNYXRoLm1heCguLi5wcmVzZW50KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gV2hldGhlciBhIGNoYXJ0IGRyYXdzIHN0YXRpc3RpYyBsaW5lcy4gQSBob3Jpem9udGFsIGNoYXJ0J3MgdmFsdWVzIHJ1blxuLy8gYWxvbmcgeCwgYW5kIFBvd2VyUG9pbnQgY2Fubm90IGRyYXcgYSBsaW5lIGJlc2lkZSBob3Jpem9udGFsIGJhcnMsIHNvXG4vLyBuZWl0aGVyIG1lZGl1bSBkcmF3cyBvbmUgdGhlcmUuXG5leHBvcnQgZnVuY3Rpb24gZHJhd3NTdGF0TGluZXMoY29uZmlnOiBDaGFydENvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLm9yaWVudGF0aW9uICE9PSAnaG9yaXpvbnRhbCc7XG59XG5cbi8vIEEgY29sb3JCeSBjaGFydCdzIG9uZSB2YWx1ZSBwZXIgY2F0ZWdvcnk6IHNlcmllcyBpIGhvbGRzIGNhdGVnb3J5IGkncyBiYXIuXG4vLyBQb3dlclBvaW50IGRyYXdzIHRoZXNlIGFzIGl0cyBvbmUgc2VyaWVzLCBhbmQgYSBzdGF0aXN0aWMgbGluZSBpcyB0YWtlblxuLy8gb3ZlciB0aGVtLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQnlWYWx1ZXMoZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcyk6IChudW1iZXIgfCBudWxsKVtdIHtcbiAgcmV0dXJuIGV4dHJhY3RlZC5jYXRlZ29yaWVzLm1hcCgoXywgaW5kZXgpID0+IGV4dHJhY3RlZC5zZXJpZXNbaW5kZXhdPy52YWx1ZXNbaW5kZXhdID8/IG51bGwpO1xufVxuXG4vLyBUaGUgcmVmZXJlbmNlcyBhIGNoYXJ0IGRyYXdzLiBBIHZlcnRpY2FsIGF4aXMgY2hhcnQgYW5kIGEgd2F0ZXJmYWxsIGRyYXdcbi8vIHRoZW07IGEgcGllIGhhcyBubyB2YWx1ZSBheGlzLCBhbmQgYSBob3Jpem9udGFsIGNoYXJ0IGlzIGxlZnQgd2l0aG91dCB0aGVtXG4vLyBhcyBQb3dlclBvaW50IGNhbm5vdCBkcmF3IGEgbGluZSBiZXNpZGUgaG9yaXpvbnRhbCBiYXJzLiBBbiBlbnRyeSB3aXRob3V0IGFcbi8vIGZpbml0ZSB2YWx1ZSBpcyBza2lwcGVkLCBhbmQgb25lIHdob3NlIGB0b2AgaXMgbWlzc2luZyBvciBlcXVhbCB0byBpdHMgdmFsdWVcbi8vIGlzIGEgbGluZS4gc2Vjb25kYXJ5IHJlYWNoZXMgdGhlIHNlY29uZCB2YWx1ZSBheGlzIG9ubHkgb24gYSBjaGFydCB0aGF0IGhhc1xuLy8gb25lICh0d29BeGVzKS4gU2hhcmVkIHdpdGggdGhlIFBvd2VyUG9pbnQgZXhwb3J0LlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0UmVmZXJlbmNlcyhjb25maWc6IENoYXJ0Q29uZmlnLCB0d29BeGVzOiBib29sZWFuKTogRHJhd25SZWZlcmVuY2VbXSB7XG4gIGNvbnN0IGNoYXJ0VHlwZSA9IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2Jhcic7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IChDaGFydFJlZmVyZW5jZSB8IG51bGwgfCB1bmRlZmluZWQpW10gPSBBcnJheS5pc0FycmF5KGNvbmZpZy5yZWZlcmVuY2VzKSA/IGNvbmZpZy5yZWZlcmVuY2VzIDogW107XG5cbiAgaWYgKGNvbmZpZy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnIHx8IGNoYXJ0VHlwZSA9PT0gJ3BpZScgfHwgY2hhcnRUeXBlID09PSAnZG9udXQnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHJlZmVyZW5jZXMuZmxhdE1hcCgocmVmZXJlbmNlKTogRHJhd25SZWZlcmVuY2VbXSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBheGlzTnVtYmVyKHJlZmVyZW5jZT8udmFsdWUpO1xuXG4gICAgaWYgKCFyZWZlcmVuY2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRvID0gYXhpc051bWJlcihyZWZlcmVuY2UudG8pO1xuICAgIGNvbnN0IGxhYmVsID0gdHlwZW9mIHJlZmVyZW5jZS5sYWJlbCA9PT0gJ3N0cmluZycgPyByZWZlcmVuY2UubGFiZWwgOiAnJztcbiAgICBjb25zdCBheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4ID0gdHdvQXhlcyAmJiByZWZlcmVuY2Uuc2Vjb25kYXJ5ID09PSB0cnVlID8gMSA6IDA7XG5cbiAgICByZXR1cm4gW3RvICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHZhbHVlXG4gICAgICA/IHsgbGFiZWwsIGxvdzogTWF0aC5taW4odmFsdWUsIHRvKSwgaGlnaDogTWF0aC5tYXgodmFsdWUsIHRvKSwgYmFuZDogdHJ1ZSwgYXhpc0luZGV4IH1cbiAgICAgIDogeyBsYWJlbCwgbG93OiB2YWx1ZSwgaGlnaDogdmFsdWUsIGJhbmQ6IGZhbHNlLCBheGlzSW5kZXggfV07XG4gIH0pO1xufVxuXG4vLyBFYWNoIHNlcmllcyBhcyBpdHMgc2hhcmUgb2YgaXRzIGNhdGVnb3J5J3MgdG90YWw6IHBlciBjYXRlZ29yeSwgdGhlXG4vLyBkZW5vbWluYXRvciBpcyB0aGUgc3VtIG9mIGV2ZXJ5IHNlcmllcycgYWJzb2x1dGUgdmFsdWUgdGhlcmUsIHNvIHRoZVxuLy8gbWFnbml0dWRlcyBvZiBhIGNhdGVnb3J5J3Mgc2hhcmVzIGFkZCB1cCB0byAxLiBBIG1peGVkLXNpZ24gY2F0ZWdvcnknc1xuLy8gbmVnYXRpdmUgdmFsdWVzIHRha2UgbmVnYXRpdmUgc2hhcmVzLCBkcmF3biBiZWxvdyB6ZXJvLiBBIG1pc3NpbmcgdmFsdWVcbi8vIHN0YXlzIG1pc3NpbmcsIGFuZCBhIGNhdGVnb3J5IHdob3NlIHRvdGFsIGlzIHplcm8gaGFzIG5vIHNoYXJlcy4gU2hhcmVkIGJ5XG4vLyB0aGUgc2NyZWVuLCB0aGUgUERGIGFuZCBQb3dlclBvaW50LCBzbyBhIDEwMCUgc3RhY2sgcmVhZHMgdGhlIHNhbWUgaW4gZWFjaC5cbmV4cG9ydCBmdW5jdGlvbiBwZXJjZW50U2hhcmVzKHZhbHVlczogKG51bWJlciB8IG51bGwpW11bXSk6IChudW1iZXIgfCBudWxsKVtdW10ge1xuICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCAuLi52YWx1ZXMubWFwKChzZXJpZXMpID0+IHNlcmllcy5sZW5ndGgpKTtcbiAgY29uc3QgdG90YWxzID0gQXJyYXkuZnJvbSh7IGxlbmd0aCB9LCAoXywgaW5kZXgpID0+IHZhbHVlc1xuICAgIC5yZWR1Y2UoKHN1bSwgc2VyaWVzKSA9PiBzdW0gKyBNYXRoLmFicyhzZXJpZXNbaW5kZXhdID8/IDApLCAwKSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiAoXG4gICAgdmFsdWUgPT09IG51bGwgfHwgIXRvdGFsc1tpbmRleF0gPyBudWxsIDogdmFsdWUgLyB0b3RhbHNbaW5kZXhdXG4gICkpKTtcbn1cblxuLy8gVGhlIHNoYXJlcyBhIDEwMCUgc3RhY2tlZCBjaGFydCBkcmF3cyBpbiBwbGFjZSBvZiBpdHMgdmFsdWVzLCBvciBudWxsIHdoZW5cbi8vIHRoZSBjaGFydCBpcyBub3Qgb25lLiBUaGUgcHJpbWFyeSBheGlzJ3MgYmFyIGFuZCBhcmVhIHNlcmllcyB0YWtlIHRoZW0sXG4vLyBlYWNoIHR5cGUncyBzZXJpZXMgc2hhcmluZyBhbW9uZyB0aGVtc2VsdmVzLCBhcyBlYWNoIHR5cGUgc3RhY2tzIGFwYXJ0LlxuLy8gTGluZXMgYW5kIHNlY29uZGFyeS1heGlzIHNlcmllcyBrZWVwIHRoZWlyIHZhbHVlcy4gQSBwaWUsIGEgd2F0ZXJmYWxsIGFuZCBhXG4vLyBjb2xvckJ5IGNoYXJ0IChvbmUgc2VyaWVzIHBlciBjYXRlZ29yeSwgZWFjaCBvZiB3aGljaCB3b3VsZCBiZSAxMDAlKSBhcmVcbi8vIG5ldmVyIDEwMCUgc3RhY2tlZCwgbm9yIGlzIGEgY2hhcnQgd2l0aCBubyBiYXIgb3IgYXJlYSBvbiBpdHMgcHJpbWFyeSBheGlzLlxuZXhwb3J0IGZ1bmN0aW9uIHBlcmNlbnRTdGFja2VkU2hhcmVzKGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsIGNvbmZpZzogQ2hhcnRDb25maWcpOiBQZXJjZW50U2hhcmVzIHwgbnVsbCB7XG4gIGNvbnN0IGNoYXJ0VHlwZSA9IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2Jhcic7XG5cbiAgaWYgKGNvbmZpZy5wZXJjZW50U3RhY2tlZCAhPT0gdHJ1ZVxuICAgIHx8IGNoYXJ0VHlwZSA9PT0gJ3BpZScgfHwgY2hhcnRUeXBlID09PSAnZG9udXQnIHx8IGNoYXJ0VHlwZSA9PT0gJ3dhdGVyZmFsbCdcbiAgICB8fCBpc0NvbG9yQnkoY29uZmlnKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdHlwZXMgPSBzZXJpZXNUeXBlcyhleHRyYWN0ZWQsIGNoYXJ0VHlwZSk7XG4gIGNvbnN0IGF4aXNJbmRleGVzID0gc2VyaWVzQXhpc0luZGV4ZXMoZXh0cmFjdGVkLCBjb25maWcpO1xuICBjb25zdCBzaGFyZXM6IFBlcmNlbnRTaGFyZXMgPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCB0eXBlIG9mIFsnYmFyJywgJ2FyZWEnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IGluZGV4ZXMgPSB0eXBlc1xuICAgICAgLm1hcCgoc2VyaWVzVHlwZSwgaW5kZXgpID0+IChzZXJpZXNUeXBlID09PSB0eXBlICYmIGF4aXNJbmRleGVzW2luZGV4XSA9PT0gMCA/IGluZGV4IDogLTEpKVxuICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ID49IDApO1xuICAgIGNvbnN0IHR5cGVTaGFyZXMgPSBwZXJjZW50U2hhcmVzKGluZGV4ZXMubWFwKChpbmRleCkgPT4gZXh0cmFjdGVkLnNlcmllc1tpbmRleF0udmFsdWVzKSk7XG4gICAgaW5kZXhlcy5mb3JFYWNoKChzZXJpZXNJbmRleCwgcG9zaXRpb24pID0+IHNoYXJlcy5zZXQoc2VyaWVzSW5kZXgsIHR5cGVTaGFyZXNbcG9zaXRpb25dKSk7XG4gIH1cblxuICByZXR1cm4gc2hhcmVzLnNpemUgPyBzaGFyZXMgOiBudWxsO1xufVxuXG4vLyBXaGVyZSBhIDEwMCUgc3RhY2tlZCBjaGFydCdzIHZhbHVlIGF4aXMgc3RhcnRzOiBhdCAtMTAwJSB3aGVuIGFueSBzaGFyZSBpc1xuLy8gbmVnYXRpdmUsIGVsc2UgYXQgemVyby5cbmV4cG9ydCBmdW5jdGlvbiBwZXJjZW50QXhpc01pbihzaGFyZXM6IFBlcmNlbnRTaGFyZXMpOiBudW1iZXIge1xuICByZXR1cm4gWy4uLnNoYXJlcy52YWx1ZXMoKV0uc29tZSgoc2VyaWVzKSA9PiBzZXJpZXMuc29tZSgoc2hhcmUpID0+IChzaGFyZSA/PyAwKSA8IDApKSA/IC0xIDogMDtcbn1cblxuLy8gVGhlIG1lYXN1cmVzIGEgY2hhcnQgcGxvdHM6IGl0cyBjb25maWd1cmVkIG9uZXMsIGVsc2UgdGhlIHF1ZXJ5J3MgbGFzdFxuLy8gY29sdW1uLCB1bmZvcm1hdHRlZC5cbmZ1bmN0aW9uIGNoYXJ0TWVhc3VyZXMoY29uZmlnOiBDaGFydENvbmZpZywgZGF0YTogQ29tcG9uZW50RGF0YSk6IENoYXJ0TWVhc3VyZVtdIHtcbiAgcmV0dXJuIGNvbmZpZy5tZWFzdXJlcz8ubGVuZ3RoXG4gICAgPyBjb25maWcubWVhc3VyZXNcbiAgICA6IFt7IGNvbHVtbjogZGF0YS5jb2x1bW5zW2RhdGEuY29sdW1ucy5sZW5ndGggLSAxXSB9XTtcbn1cblxuLy8gVGhlIHR5cGUgZWFjaCBleHRyYWN0ZWQgc2VyaWVzIGlzIGRyYXduIGFzOiBpdHMgbWVhc3VyZSdzIG93biB0eXBlIHdoZW4gaXRcbi8vIG5hbWVzIG9uZSwgdGhlIGNoYXJ0J3MgY2hhcnRUeXBlIG90aGVyd2lzZS4gTW9yZSB0aGFuIG9uZSBkaXN0aW5jdCB0eXBlIGlzIGFcbi8vIGNvbWJvIGNoYXJ0LiBTaGFyZWQgd2l0aCB0aGUgUG93ZXJQb2ludCBleHBvcnQgc28gYm90aCBtZWRpYSBkcmF3IGVhY2ggc2VyaWVzXG4vLyB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWVzVHlwZXMoZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcywgY2hhcnRUeXBlOiBBeGlzQ2hhcnRUeXBlKTogQXhpc0NoYXJ0VHlwZVtdIHtcbiAgcmV0dXJuIGV4dHJhY3RlZC5zZXJpZXMubWFwKChzZXJpZXMpID0+IHNlcmllcy50eXBlID8/IGNoYXJ0VHlwZSk7XG59XG5cbi8vIFRoZSB2YWx1ZSBheGlzIGVhY2ggZXh0cmFjdGVkIHNlcmllcyBpcyBwbG90dGVkIGFnYWluc3Q6IDEgd2hlbiBpdHMgbWVhc3VyZVxuLy8gaXMgc2Vjb25kYXJ5LCAwIG90aGVyd2lzZS4gQSBzZWNvbmQgYXhpcyBpcyBkcmF3biBvbmx5IG9uIGEgdmVydGljYWwgY2hhcnRcbi8vIHRoYXQga2VlcHMgYXQgbGVhc3Qgb25lIHNlcmllcyBvbiB0aGUgcHJpbWFyeSBheGlzLCBzbyBhIGNvbWJpbmF0aW9uIHRoZVxuLy8gc2VydmVyIHJlZnVzZXMgKGEgaG9yaXpvbnRhbCBjaGFydCwgZXZlcnkgbWVhc3VyZSBzZWNvbmRhcnksIHRoZSBvbmUgbWVhc3VyZVxuLy8gb2YgYSBzcGxpdEJ5IG9yIGNvbG9yQnkgY2hhcnQpIHBsb3RzIGV2ZXJ5dGhpbmcgb24gdGhlIHByaW1hcnkgYXhpcy4gU2hhcmVkXG4vLyB3aXRoIHRoZSBQb3dlclBvaW50IGV4cG9ydCBzbyBib3RoIG1lZGlhIHB1dCBlYWNoIHNlcmllcyBvbiB0aGUgc2FtZSBheGlzLlxuZXhwb3J0IGZ1bmN0aW9uIHNlcmllc0F4aXNJbmRleGVzKGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsIGNvbmZpZzogQ2hhcnRDb25maWcpOiBWYWx1ZUF4aXNJbmRleFtdIHtcbiAgY29uc3Qgc2Vjb25kYXJ5ID0gZXh0cmFjdGVkLnNlcmllcy5tYXAoKHNlcmllcykgPT4gISFzZXJpZXMubWVhc3VyZS5zZWNvbmRhcnkpO1xuICBjb25zdCB0d29BeGVzID0gY29uZmlnLm9yaWVudGF0aW9uICE9PSAnaG9yaXpvbnRhbCcgJiYgc2Vjb25kYXJ5LmluY2x1ZGVzKHRydWUpICYmIHNlY29uZGFyeS5pbmNsdWRlcyhmYWxzZSk7XG5cbiAgcmV0dXJuIHNlY29uZGFyeS5tYXAoKGlzU2Vjb25kYXJ5KSA9PiAodHdvQXhlcyAmJiBpc1NlY29uZGFyeSA/IDEgOiAwKSk7XG59XG5cbi8vIE9uZSBiYXIgb2YgYSB3YXRlcmZhbGwuIGBzdGFydGAgaXMgdGhlIHJ1bm5pbmcgdG90YWwgYmVmb3JlIGl0LCB3aGVyZSB0aGUgYmFyXG4vLyBzdGFydHMsIGFuZCBgY2hhbmdlYCBpdHMgc2lnbmVkIGhlaWdodCwgc28gaXQgZW5kcyBhdCBzdGFydCArIGNoYW5nZS4gVGhlXG4vLyBjbG9zaW5nIHRvdGFsIHN0YXJ0cyBhdCB6ZXJvIGFuZCBpdHMgY2hhbmdlIGlzIHRoZSB3aG9sZSBydW5uaW5nIHRvdGFsLlxuZXhwb3J0IGludGVyZmFjZSBXYXRlcmZhbGxTdGVwIHtcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgY2hhbmdlOiBudW1iZXIgfCBudWxsO1xuICBraW5kOiBXYXRlcmZhbGxTdGVwS2luZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0ZWRXYXRlcmZhbGwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0ZXBzOiBXYXRlcmZhbGxTdGVwW107XG59XG5cbmV4cG9ydCBjb25zdCBXQVRFUkZBTExfVE9UQUxfTEFCRUwgPSAnVG90YWwnO1xuXG4vLyBBIHdhdGVyZmFsbCdzIGJhcnMgZnJvbSBpdHMgb25lIG1lYXN1cmU6IGVhY2ggY2F0ZWdvcnkncyB2YWx1ZSBpcyBob3cgZmFyIHRoZVxuLy8gcnVubmluZyB0b3RhbCBtb3ZlcyB0aGVyZSwgYW5kIGEgbGFzdCBUb3RhbCBiYXIgc2hvd3Mgd2hlcmUgaXQgZW5kZWQuIEFcbi8vIGNhdGVnb3J5IHdpdGggbm8gdmFsdWUgbW92ZXMgbm90aGluZyBhbmQgZHJhd3Mgbm8gYmFyLiBTaGFyZWQgd2l0aCB0aGVcbi8vIFBvd2VyUG9pbnQgZXhwb3J0IHNvIGJvdGggbWVkaWEgZHJhdyB0aGUgc2FtZSBzdGVwcy5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0V2F0ZXJmYWxsKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRXh0cmFjdGVkV2F0ZXJmYWxsIHtcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdENoYXJ0U2VyaWVzKGNvbXBvbmVudCwgZGF0YSk7XG4gIGNvbnN0IHZhbHVlcyA9IGV4dHJhY3RlZC5zZXJpZXNbMF0/LnZhbHVlcyA/PyBbXTtcbiAgY29uc3Qgc3RlcHM6IFdhdGVyZmFsbFN0ZXBbXSA9IFtdO1xuICBsZXQgdG90YWwgPSAwO1xuXG4gIGV4dHJhY3RlZC5jYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoYW5nZSA9IHZhbHVlc1tpbmRleF0gPz8gbnVsbDtcbiAgICBzdGVwcy5wdXNoKHsgY2F0ZWdvcnksIHN0YXJ0OiB0b3RhbCwgY2hhbmdlLCBraW5kOiAoY2hhbmdlID8/IDApIDwgMCA/ICdmYWxsJyA6ICdyaXNlJyB9KTtcbiAgICB0b3RhbCArPSBjaGFuZ2UgPz8gMDtcbiAgfSk7XG5cbiAgc3RlcHMucHVzaCh7IGNhdGVnb3J5OiBXQVRFUkZBTExfVE9UQUxfTEFCRUwsIHN0YXJ0OiAwLCBjaGFuZ2U6IHRvdGFsLCBraW5kOiAndG90YWwnIH0pO1xuXG4gIHJldHVybiB7IG5hbWU6IGV4dHJhY3RlZC5zZXJpZXNbMF0/Lm5hbWUgPz8gJycsIHN0ZXBzIH07XG59XG5cbi8vIFRoZSBvbmUgcHVyZSBtYXBwaW5nIGZyb20gb3VyIHN0YW5kYXJkIGNhbWVsQ2FzZSBjaGFydCBjb25maWcgKyB0aGUgZGF0YVxuLy8gZW5kcG9pbnQncyByb3dzIHRvIGFuIEVDaGFydHMgb3B0aW9uLiBFdmVyeXRoaW5nIHZpc3VhbCB0aGF0IGlzbid0IGluIHRoZVxuLy8gcmVnaXN0ZXJlZCAncmVwb3J0JyB0aGVtZSBpcyBkZWNpZGVkIGhlcmUsIHNvIHJlcG9ydCBzdGFuZGFyZHMgaGF2ZSBleGFjdGx5XG4vLyB0d28gaG9tZXMuXG4vL1xuLy8gRXZlcnkgbnVtYmVyIGFuZCBwZXJpb2QgdGhlIGNoYXJ0IHdyaXRlcyAodmFsdWUtYXhpcyB0aWNrcywgdG9vbHRpcCB2YWx1ZXMsXG4vLyBwZXJpb2QgbGFiZWxzKSBpcyBpbiB0aGUgY29udGV4dCdzIGxvY2FsZSwgbmV2ZXIgdGhlIGJyb3dzZXIncy4gQSBtZWFzdXJlXG4vLyB3aXRoIG51bWJlci1mb3JtYXQga2V5cyBmb3JtYXRzIGl0cyB0b29sdGlwcywgYW5kIHRoZSB2YWx1ZSBheGlzIHdoZW4gZXZlcnlcbi8vIG1lYXN1cmUgb24gaXQgYWdyZWVzIChheGlzTnVtYmVyRm9ybWF0KTsgd2l0aG91dCB0aGVtIHRoZSBheGlzIGFuZCB0b29sdGlwc1xuLy8ga2VlcCB0aGUgcGxhaW4gbG9jYWxlLWdyb3VwZWQgbnVtYmVyLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hhcnRPcHRpb24oXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogRUNoYXJ0c09wdGlvbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IGNoYXJ0VHlwZSA9IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2Jhcic7XG5cbiAgaWYgKGNoYXJ0VHlwZSA9PT0gJ3BpZScgfHwgY2hhcnRUeXBlID09PSAnZG9udXQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkUGllT3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY2hhcnRUeXBlID09PSAnZG9udXQnLCBjb250ZXh0KTtcbiAgfVxuXG4gIGlmIChjaGFydFR5cGUgPT09ICd3YXRlcmZhbGwnKSB7XG4gICAgcmV0dXJuIGJ1aWxkV2F0ZXJmYWxsT3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gYnVpbGRBeGlzT3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY2hhcnRUeXBlLCBjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBeGlzT3B0aW9uKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY2hhcnRUeXBlOiBBeGlzQ2hhcnRUeXBlLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogRUNoYXJ0c09wdGlvbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3RDaGFydFNlcmllcyhjb21wb25lbnQsIGRhdGEpO1xuICBjb25zdCBob3Jpem9udGFsID0gY29uZmlnLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gIGNvbnN0IGNvbG9yQnkgPSBpc0NvbG9yQnkoY29uZmlnKTtcbiAgY29uc3QgdHlwZXMgPSBzZXJpZXNUeXBlcyhleHRyYWN0ZWQsIGNoYXJ0VHlwZSk7XG4gIGNvbnN0IGNvbWJvID0gbmV3IFNldCh0eXBlcykuc2l6ZSA+IDE7XG5cbiAgLy8gY29sb3JCeSBlbWl0cyBvbmUgc2VyaWVzIHBlciBjYXRlZ29yeTsgb3ZlcmxhcHBpbmcgdGhlbSAoYmFyR2FwIC0xMDAlKSBtYWtlc1xuICAvLyBlYWNoIHJlbmRlciBhdCB0aGUgZnVsbCBjYXRlZ29yeS1iYW5kIHdpZHRoIOKAlCBvbmUgZnVsbC13aWR0aCwgZGlzdGluY3RseVxuICAvLyBjb2xvcmVkIGJhciBwZXIgY2F0ZWdvcnkg4oCUIGluc3RlYWQgb2Ygc2lkZS1ieS1zaWRlIHNsaXZlcnMuIFRoZSBsYXlvdXQgcHJvcHNcbiAgLy8gYXJlIHJlYWQgZnJvbSB0aGUgZmlyc3Qgc2VyaWVzIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgLy9cbiAgLy8gU3RhY2tpbmcgc3VtcyBldmVyeSBzZXJpZXMgdGhhdCBzaGFyZXMgYSBzdGFjayBuYW1lLCB3aGF0ZXZlciBpdHMgdHlwZS4gSW5cbiAgLy8gYSBjb21ibyBlYWNoIHR5cGUgc3RhY2tzIG9ubHkgd2l0aCBpdHMgb3duIGtpbmQsIHNvIGEgbGluZSBvZiBhIHJhdGUgbmV2ZXJcbiAgLy8gc2l0cyBvbiB0b3Agb2YgdGhlIGJhcnMnIHRvdGFsLCBhbmQgb24gYSB0d28tYXhpcyBjaGFydCBvbmx5IHdpdGggdGhlXG4gIC8vIHNlcmllcyBvbiBpdHMgb3duIGF4aXMuXG4gIC8vXG4gIC8vIEEgMTAwJSBzdGFja2VkIGNoYXJ0IChwZXJjZW50U3RhY2tlZFNoYXJlcykgcGxvdHMgaXRzIHByaW1hcnkgYmFycyBhbmRcbiAgLy8gYXJlYXMgYXMgc2hhcmVzLCBlYWNoIHR5cGUgaW4gaXRzIG93biBzdGFjaywgYW5kIGxlYXZlcyBldmVyeSBvdGhlciBzZXJpZXNcbiAgLy8gdW5zdGFja2VkIG9uIGl0cyBvd24gdmFsdWVzLlxuICBjb25zdCBheGlzSW5kZXhlcyA9IHNlcmllc0F4aXNJbmRleGVzKGV4dHJhY3RlZCwgY29uZmlnKTtcbiAgY29uc3QgdHdvQXhlcyA9IGF4aXNJbmRleGVzLmluY2x1ZGVzKDEpO1xuICBjb25zdCBzaGFyZXMgPSBwZXJjZW50U3RhY2tlZFNoYXJlcyhleHRyYWN0ZWQsIGNvbmZpZyk7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBjaGFydFJlZmVyZW5jZXMoY29uZmlnLCB0d29BeGVzKTtcbiAgY29uc3QgYXhpc0Zvcm1hdHMgPSB2YWx1ZUF4aXNGb3JtYXRzKGNvbmZpZywgZXh0cmFjdGVkLCBheGlzSW5kZXhlcywgY29udGV4dCwgISFzaGFyZXMsIHJlZmVyZW5jZXMpO1xuICAvLyBBIHNlcmllcycgc3RhdGlzdGljIGxpbmUgaXMgdGFrZW4gb3ZlciB0aGUgcG9pbnRzIGl0IHBsb3RzLiBPbiBhIGNvbG9yQnlcbiAgLy8gY2hhcnQgZWFjaCBzZXJpZXMgaG9sZHMgb25lIGJhciwgc28gdGhlIG9uZSBsaW5lIGlzIHRha2VuIG92ZXIgdGhlIGJhcnNcbiAgLy8gdG9nZXRoZXIgYW5kIGhhbmdzIG9mZiB0aGUgZmlyc3Qgc2VyaWVzIChjb2xvckJ5U3RhdExpbmUpLlxuICBjb25zdCBzdGF0TGluZXMgPSBkcmF3c1N0YXRMaW5lcyhjb25maWcpICYmICFjb2xvckJ5O1xuICBjb25zdCBzZXJpZXM6IFNlcmllc09wdGlvbltdID0gZXh0cmFjdGVkLnNlcmllcy5tYXAoKGV4dHJhY3RlZFNlcmllcywgaW5kZXgpID0+IHtcbiAgICBjb25zdCBzZXJpZXNTaGFyZXMgPSBzaGFyZXM/LmdldChpbmRleCk7XG4gICAgbGV0IHN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlcmllc1NoYXJlcykge1xuICAgICAgc3RhY2sgPSBzdGFja0tleSh0eXBlc1tpbmRleF0sIGNvbWJvLCAwKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5zdGFja2VkICYmICFzaGFyZXMpIHtcbiAgICAgIHN0YWNrID0gc3RhY2tLZXkodHlwZXNbaW5kZXhdLCBjb21ibywgdHdvQXhlcyA/IGF4aXNJbmRleGVzW2luZGV4XSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdCA9IHN0YXRMaW5lcyA/IG1lYXN1cmVNYXJrU3RhdChleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWFya0xpbmUgPSBzdGF0ICYmIHN0YXRNYXJrTGluZShcbiAgICAgIHNlcmllc1NoYXJlcyA/PyBleHRyYWN0ZWRTZXJpZXMudmFsdWVzLFxuICAgICAgc3RhdCxcbiAgICAgIHNlcmllc1NoYXJlcyA/IHNoYXJlV3JpdGVyKGNvbnRleHQpIDogbWVhc3VyZVdyaXRlcihleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSwgY29udGV4dCksXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb24gPSBidWlsZFNlcmllcyhcbiAgICAgIGV4dHJhY3RlZFNlcmllcyxcbiAgICAgIHNlcmllc1NoYXJlcyA/IHNoYXJlRGF0YShleHRyYWN0ZWRTZXJpZXMudmFsdWVzLCBzZXJpZXNTaGFyZXMpIDogZXh0cmFjdGVkU2VyaWVzLnZhbHVlcyxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogdHlwZXNbaW5kZXhdLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgb3ZlcmxhcDogY29sb3JCeSAmJiBpbmRleCA9PT0gMCxcbiAgICAgICAgY29tYm8sXG4gICAgICAgIHRvb2x0aXA6IHNlcmllc1Rvb2x0aXAoZXh0cmFjdGVkU2VyaWVzLm1lYXN1cmUsIGNvbnRleHQpLFxuICAgICAgICBheGlzSW5kZXg6IHR3b0F4ZXMgPyBheGlzSW5kZXhlc1tpbmRleF0gOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIEEgY29sb3JCeSBjaGFydCdzIGJhcnMgdGFrZSB0aGUgcGFsZXR0ZSBieSBjYXRlZ29yeSwgYXMgaW5cbiAgICAgICAgLy8gUG93ZXJQb2ludCwgd2hhdGV2ZXIgY29sb3IgdGhlIG1lYXN1cmUgbmFtZXMuXG4gICAgICAgIGNvbG9yOiBjb2xvckJ5ID8gdW5kZWZpbmVkIDogc2VyaWVzQ29sb3IoZXh0cmFjdGVkU2VyaWVzKSxcbiAgICAgICAgbGFiZWxzOiBkYXRhTGFiZWxPcHRpb24oY29uZmlnLmRhdGFMYWJlbHMsIGRhdGFMYWJlbEZvcm1hdHRlcihcbiAgICAgICAgICBleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSxcbiAgICAgICAgICBheGlzRm9ybWF0c1theGlzSW5kZXhlc1tpbmRleF1dID8/IG51bGwsXG4gICAgICAgICAgISFzZXJpZXNTaGFyZXMsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKSksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gbWFya0xpbmUgPyB7IC4uLm9wdGlvbiwgbWFya0xpbmUgfSBhcyBTZXJpZXNPcHRpb24gOiBvcHRpb247XG4gIH0pO1xuXG4gIGlmIChjb2xvckJ5ICYmIGRyYXdzU3RhdExpbmVzKGNvbmZpZykgJiYgc2VyaWVzLmxlbmd0aCkge1xuICAgIHNlcmllc1swXSA9IGNvbG9yQnlTdGF0TGluZShzZXJpZXNbMF0sIGV4dHJhY3RlZCwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwZXJjZW50TWluID0gc2hhcmVzID8gcGVyY2VudEF4aXNNaW4oc2hhcmVzKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2F0ZWdvcnlBeGlzID0gY2F0ZWdvcnlBeGlzT3B0aW9uKGNvbmZpZywgZGF0YSwgZXh0cmFjdGVkLmNhdGVnb3JpZXMsIGhvcml6b250YWwsIGNvbnRleHQubG9jYWxlKTtcbiAgY29uc3QgdmFsdWVBeGlzID0gdHdvQXhlc1xuICAgID8gdHdvVmFsdWVBeGVzT3B0aW9uKGNvbmZpZywgYXhpc0Zvcm1hdHMsIGNvbnRleHQsIHBlcmNlbnRNaW4sIHJlZmVyZW5jZXMpXG4gICAgOiB2YWx1ZUF4aXNPcHRpb24oY29uZmlnLnZhbHVlQXhpcywgaG9yaXpvbnRhbCwgcGVyY2VudE1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHZhbHVlQXhpc0xhYmVsKGF4aXNGb3JtYXRzWzBdLCBjb250ZXh0KVxuICAgICAgOiBwZXJjZW50QXhpc0xhYmVsKGNvbnRleHQpLCB7IHBlcmNlbnRNaW4sIHJlYWNoOiByZWZlcmVuY2VSZWFjaChyZWZlcmVuY2VzLCAwKSB9KTtcblxuICBjb25zdCBsZWdlbmRQb3NpdGlvbiA9IHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWcsIHNlcmllcy5sZW5ndGgsIGNvbG9yQnkpO1xuICBjb25zdCB2YWx1ZVRpdGxlcyA9IFtjb25maWcudmFsdWVBeGlzLCB0d29BeGVzID8gY29uZmlnLnNlY29uZGFyeUF4aXMgOiB1bmRlZmluZWRdO1xuICBjb25zdCBncmFudWxhcml0eSA9IGJ1Y2tldEdyYW51bGFyaXR5KGRhdGEpO1xuXG4gIHJldHVybiB7XG4gICAgZ3JpZDogYXhpc0dyaWQobGVnZW5kUG9zaXRpb24sIGNhdGVnb3J5VGl0bGVTaWRlKGNvbmZpZywgaG9yaXpvbnRhbCksIHZhbHVlVGl0bGVTaWRlKHZhbHVlVGl0bGVzLCBob3Jpem9udGFsKSksXG4gICAgbGVnZW5kOiByZWZlcmVuY2VMZWdlbmQobGVnZW5kT3B0aW9uKGxlZ2VuZFBvc2l0aW9uKSwgc2VyaWVzLCByZWZlcmVuY2VzKSxcbiAgICAvLyBjb2xvckJ5IGNoYXJ0cyBvdmVybGFwIE4gbW9zdGx5LW51bGwgc2VyaWVzLCBzbyBhbiBheGlzIHRvb2x0aXAgd291bGQgbGlzdFxuICAgIC8vIGV2ZXJ5IGNhdGVnb3J5OyBhbiBpdGVtIHRvb2x0aXAgc2hvd3MganVzdCB0aGUgaG92ZXJlZCBiYXIuIEEgMTAwJVxuICAgIC8vIHN0YWNrZWQgY2hhcnQncyB0b29sdGlwIGdpdmVzIGVhY2ggc2hhcmUgYW5kIHRoZSB2YWx1ZSBpdCBjYW1lIGZyb20uXG4gICAgdG9vbHRpcDogc2hhcmVzXG4gICAgICA/IHtcbiAgICAgICAgdHJpZ2dlcjogJ2F4aXMnLFxuICAgICAgICBmb3JtYXR0ZXI6IChwYXJhbXM6IFRvb2x0aXBDb21wb25lbnRGb3JtYXR0ZXJDYWxsYmFja1BhcmFtcykgPT4gcGVyY2VudFRvb2x0aXAoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIGV4dHJhY3RlZCxcbiAgICAgICAgICBzaGFyZXMsXG4gICAgICAgICAgZ3JhbnVsYXJpdHksXG4gICAgICAgICAgY2hhcnREYXRlTGFiZWwoY29uZmlnKSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApLFxuICAgICAgfVxuICAgICAgOiB7IHRyaWdnZXI6IGNvbG9yQnkgPyAnaXRlbScgOiAnYXhpcycgfSxcbiAgICB4QXhpczogaG9yaXpvbnRhbCA/IHZhbHVlQXhpcyA6IGNhdGVnb3J5QXhpcyxcbiAgICB5QXhpczogaG9yaXpvbnRhbCA/IGNhdGVnb3J5QXhpcyA6IHZhbHVlQXhpcyxcbiAgICBzZXJpZXM6IFsuLi5zZXJpZXMsIC4uLnJlZmVyZW5jZUNhcnJpZXJzKHJlZmVyZW5jZXMsIGV4dHJhY3RlZC5jYXRlZ29yaWVzKV0sXG4gIH07XG59XG5cbi8vIEEgY29sb3JCeSBjaGFydCdzIHN0YXRpc3RpYyBsaW5lOiBvbmUgbGluZSBvdmVyIGV2ZXJ5IGJhciwgaHVuZyBvZmYgdGhlXG4vLyBmaXJzdCBzZXJpZXMgYW5kIGRyYXduIGluIHRoZSByZWZlcmVuY2Ugc2xhdGUsIGFzIG5vIG9uZSBjYXRlZ29yeSdzIGNvbG9yXG4vLyBzcGVha3MgZm9yIHRoZSBvdGhlcnMuXG5mdW5jdGlvbiBjb2xvckJ5U3RhdExpbmUoXG4gIGZpcnN0OiBTZXJpZXNPcHRpb24sXG4gIGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBTZXJpZXNPcHRpb24ge1xuICBjb25zdCBtZWFzdXJlID0gZXh0cmFjdGVkLnNlcmllc1swXT8ubWVhc3VyZTtcbiAgY29uc3Qgc3RhdCA9IG1lYXN1cmVNYXJrU3RhdChtZWFzdXJlKTtcbiAgY29uc3QgbWFya0xpbmUgPSBzdGF0ICYmIHN0YXRNYXJrTGluZShcbiAgICBjb2xvckJ5VmFsdWVzKGV4dHJhY3RlZCksXG4gICAgc3RhdCxcbiAgICBtZWFzdXJlV3JpdGVyKG1lYXN1cmUsIGNvbnRleHQpLFxuICAgIGAjJHtSRVBPUlRfUkVGRVJFTkNFX0NPTE9SfWAsXG4gICk7XG5cbiAgcmV0dXJuIG1hcmtMaW5lID8geyAuLi5maXJzdCwgbWFya0xpbmUgfSBhcyBTZXJpZXNPcHRpb24gOiBmaXJzdDtcbn1cblxuLy8gQSBzZXJpZXMnIHN0YXRpc3RpYyBsaW5lIGFjcm9zcyB0aGUgcGxvdCwgbGFiZWxlZCB3aXRoIHRoZSBzdGF0aXN0aWMgYW5kXG4vLyBpdHMgdmFsdWUgKCdBdmVyYWdlOiAxLDIzNC41JyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vIHBvaW50IGhhcyBhIHZhbHVlLiBJdFxuLy8gdGFrZXMgdGhlIHNlcmllcycgY29sb3IgdW5sZXNzIGl0IGlzIGdpdmVuIG9uZS5cbmZ1bmN0aW9uIHN0YXRNYXJrTGluZShcbiAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgc3RhdDogUmVwb3J0Q2hhcnRNYXJrU3RhdCxcbiAgd3JpdGU6ICh2YWx1ZTogbnVtYmVyKSA9PiBzdHJpbmcsXG4gIGNvbG9yPzogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gc2VyaWVzU3RhdCh2YWx1ZXMsIHN0YXQpO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYCR7U1RBVF9MQUJFTFtzdGF0XX06ICR7d3JpdGUodmFsdWUpfWA7XG5cbiAgcmV0dXJuIHtcbiAgICBzaWxlbnQ6IHRydWUsXG4gICAgc3ltYm9sOiAnbm9uZScsXG4gICAgbGluZVN0eWxlOiB7IHR5cGU6ICdkYXNoZWQnIGFzIGNvbnN0LCB3aWR0aDogMSwgLi4uKGNvbG9yID8geyBjb2xvciB9IDoge30pIH0sXG4gICAgbGFiZWw6IHsgZm9ybWF0dGVyOiAoKSA9PiB0ZXh0LCBwb3NpdGlvbjogJ2luc2lkZUVuZFRvcCcgYXMgY29uc3QsIGZvbnRTaXplOiBSRVBPUlRfREFUQV9MQUJFTF9GT05UX1NJWkUsIC4uLk1BUktfTEFCRUxfQk9YIH0sXG4gICAgZGF0YTogW3sgeUF4aXM6IHZhbHVlIH1dLFxuICB9O1xufVxuXG4vLyBBIHN0YXRpc3RpYydzIHZhbHVlIGluIGl0cyBtZWFzdXJlJ3MgbnVtYmVyIGZvcm1hdCwgaW4gdGhlIHJlcG9ydCBsb2NhbGUuXG5mdW5jdGlvbiBtZWFzdXJlV3JpdGVyKG1lYXN1cmU6IENoYXJ0TWVhc3VyZSB8IHVuZGVmaW5lZCwgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6ICh2YWx1ZTogbnVtYmVyKSA9PiBzdHJpbmcge1xuICByZXR1cm4gKHZhbHVlKSA9PiBmb3JtYXROdW1iZXIodmFsdWUsIG1lYXN1cmUsIGNvbnRleHQpO1xufVxuXG4vLyBBIDEwMCUgc3RhY2tlZCBzZXJpZXMnIHN0YXRpc3RpYyBpcyBhIHNoYXJlLCB3cml0dGVuIGFzIGl0cyB0b29sdGlwIHdyaXRlc1xuLy8gb25lLlxuZnVuY3Rpb24gc2hhcmVXcml0ZXIoY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6ICh2YWx1ZTogbnVtYmVyKSA9PiBzdHJpbmcge1xuICBjb25zdCByYXRpb0NvbnRleHQgPSB7IC4uLmNvbnRleHQsIHJhdGlvUGVyY2VudDogdHJ1ZSB9O1xuXG4gIHJldHVybiAodmFsdWUpID0+IGZvcm1hdE51bWJlcih2YWx1ZSwgUEVSQ0VOVF9TSEFSRV9GT1JNQVQsIHJhdGlvQ29udGV4dCk7XG59XG5cbi8vIFRoZSBzZXJpZXMgdGhhdCBjYXJyeSBhIGNoYXJ0J3MgcmVmZXJlbmNlcywgb25lIHBlciB2YWx1ZSBheGlzIHRoYXQgaGFzXG4vLyBhbnk6IGFuIGVtcHR5IGxpbmUgKGV2ZXJ5IHBvaW50IG51bGwsIHNvIGl0IGRyYXdzIG5vdGhpbmcgYW5kIHN0cmV0Y2hlcyBub1xuLy8gYXhpcykgd2hvc2UgbWFya0xpbmUgZHJhd3MgdGhlIHJlZmVyZW5jZSBsaW5lcyBhbmQgd2hvc2UgbWFya0FyZWEgZmlsbHMgdGhlXG4vLyBiYW5kcy4gSXQgaXMgc2lsZW50LCBsZWZ0IG91dCBvZiB0aGUgdG9vbHRpcCBhbmQsIGJ5IHJlZmVyZW5jZUxlZ2VuZCwgb3V0IG9mXG4vLyB0aGUgbGVnZW5kLiBJdCBoYXMgbm8gbmFtZSwgc28gbm8gbWVhc3VyZSBzZXJpZXMnIGxlZ2VuZCBlbnRyeSAod2hhdGV2ZXIgaXRzXG4vLyBuYW1lLCAnJyBpbmNsdWRlZCkgdG9nZ2xlcyBpdC5cbi8vXG4vLyBMYWJlbHMgYXJlIGZ1bmN0aW9ucywgYXMgYSBzdHJpbmcgZm9ybWF0dGVyIGlzIGEgdGVtcGxhdGUgdGhhdCB3b3VsZCByZWFkXG4vLyAne2J9JyBvciAne2N9JyBpbiBhIGxhYmVsIGFzIGEgcGxhY2Vob2xkZXIuIEVDaGFydHMgZHJhd3MgYSBtYXJrQXJlYSB1bmRlclxuLy8gdGhlIGJhcnMgYW5kIGEgbWFya0xpbmUgb3ZlciB0aGVtLCBzbyBhIGJhbmQncyBsYWJlbCByaWRlcyBhbiBpbnZpc2libGVcbi8vIG1hcmtMaW5lIG9uIGl0cyB1cHBlciBlZGdlLCBpbnNpZGUgaXRzIHRvcCBsZWZ0IGNvcm5lciwgd2hlcmUgdGhlIGZpcnN0IGJhclxuLy8gd291bGQgb3RoZXJ3aXNlIGNvdmVyIGl0LlxuZnVuY3Rpb24gcmVmZXJlbmNlQ2FycmllcnMocmVmZXJlbmNlczogRHJhd25SZWZlcmVuY2VbXSwgY2F0ZWdvcmllczogc3RyaW5nW10pOiBTZXJpZXNPcHRpb25bXSB7XG4gIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9SRUZFUkVOQ0VfQ09MT1J9YDtcblxuICByZXR1cm4gKFswLCAxXSBhcyBjb25zdCkuZmxhdE1hcCgoYXhpc0luZGV4KTogU2VyaWVzT3B0aW9uW10gPT4ge1xuICAgIGNvbnN0IG9uQXhpcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5heGlzSW5kZXggPT09IGF4aXNJbmRleCk7XG4gICAgY29uc3QgbGluZXMgPSBvbkF4aXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFyZWZlcmVuY2UuYmFuZCk7XG4gICAgY29uc3QgYmFuZHMgPSBvbkF4aXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5iYW5kKTtcblxuICAgIGlmICghb25BeGlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBbe1xuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgZGF0YTogY2F0ZWdvcmllcy5tYXAoKCkgPT4gbnVsbCksXG4gICAgICB5QXhpc0luZGV4OiBheGlzSW5kZXgsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB0b29sdGlwOiB7IHNob3c6IGZhbHNlIH0sXG4gICAgICBtYXJrTGluZToge1xuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICAgIHN5bWJvbDogJ25vbmUnLFxuICAgICAgICBsaW5lU3R5bGU6IHsgY29sb3IsIHR5cGU6ICdkYXNoZWQnLCB3aWR0aDogMSB9LFxuICAgICAgICBsYWJlbDogeyBwb3NpdGlvbjogJ2luc2lkZUVuZFRvcCcsIGNvbG9yLCBmb250U2l6ZTogUkVQT1JUX0RBVEFfTEFCRUxfRk9OVF9TSVpFLCAuLi5NQVJLX0xBQkVMX0JPWCB9LFxuICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgLi4ubGluZXMubWFwKChyZWZlcmVuY2UpID0+ICh7IHlBeGlzOiByZWZlcmVuY2UubG93LCBsYWJlbDogeyBmb3JtYXR0ZXI6ICgpID0+IHJlZmVyZW5jZS5sYWJlbCB9IH0pKSxcbiAgICAgICAgICAuLi5iYW5kcy5tYXAoKHJlZmVyZW5jZSkgPT4gKHtcbiAgICAgICAgICAgIHlBeGlzOiByZWZlcmVuY2UuaGlnaCxcbiAgICAgICAgICAgIC8vIFplcm8gd2lkdGgsIG5vdCB6ZXJvIG9wYWNpdHk6IGEgbWFya0xpbmUncyBsYWJlbCB0YWtlcyB0aGVcbiAgICAgICAgICAgIC8vIGxpbmUncyBvcGFjaXR5LlxuICAgICAgICAgICAgbGluZVN0eWxlOiB7IHdpZHRoOiAwIH0sXG4gICAgICAgICAgICBsYWJlbDogeyBwb3NpdGlvbjogJ2luc2lkZVN0YXJ0Qm90dG9tJywgZm9ybWF0dGVyOiAoKSA9PiByZWZlcmVuY2UubGFiZWwgfSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4uKGJhbmRzLmxlbmd0aCA/IHtcbiAgICAgICAgbWFya0FyZWE6IHtcbiAgICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBSRUZFUkVOQ0VfQkFORF9GSUxMIH0sXG4gICAgICAgICAgZGF0YTogYmFuZHMubWFwKChyZWZlcmVuY2UpID0+IFt7IHlBeGlzOiByZWZlcmVuY2UubG93IH0sIHsgeUF4aXM6IHJlZmVyZW5jZS5oaWdoIH1dKSxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7fSksXG4gICAgfSBhcyBTZXJpZXNPcHRpb25dO1xuICB9KTtcbn1cblxuLy8gVGhlIGxhcmdlc3QgbWFnbml0dWRlIGEgdmFsdWUgYXhpcydzIHJlZmVyZW5jZXMgcmVhY2gsIHdoaWNoIGl0cyBudW1iZXJcbi8vIGZvcm1hdCBjb3VudHMgdG93YXJkIGl0cyBwZWFrLCBhcyB0aGUgYXhpcyBzdHJldGNoZXMgdG8gdGhlbTsgMCB3aGVuIGl0XG4vLyBoYXMgbm9uZS5cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2VQZWFrKHJlZmVyZW5jZXM6IERyYXduUmVmZXJlbmNlW10sIGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXgpOiBudW1iZXIge1xuICBjb25zdCByZWFjaCA9IHJlZmVyZW5jZVJlYWNoKHJlZmVyZW5jZXMsIGF4aXNJbmRleCk7XG5cbiAgcmV0dXJuIHJlYWNoID8gTWF0aC5tYXgoTWF0aC5hYnMocmVhY2gubG93KSwgTWF0aC5hYnMocmVhY2guaGlnaCkpIDogMDtcbn1cblxuLy8gVGhlIGxlZ2VuZCBvZiBhIGNoYXJ0IHdpdGggcmVmZXJlbmNlcyBuYW1lcyBpdHMgbWVhc3VyZSBzZXJpZXMgYWxvbmUsIHNvXG4vLyBhIGNhcnJpZXIgbmV2ZXIgc2hvd3MgYXMgYSBibGFuayBlbnRyeS4gV2l0aG91dCByZWZlcmVuY2VzIGl0IGlzIGxlZnQgYXMgaXRcbi8vIHdhcy5cbmZ1bmN0aW9uIHJlZmVyZW5jZUxlZ2VuZChcbiAgbGVnZW5kOiBMZWdlbmRDb21wb25lbnRPcHRpb24sXG4gIHNlcmllczogU2VyaWVzT3B0aW9uW10sXG4gIHJlZmVyZW5jZXM6IERyYXduUmVmZXJlbmNlW10sXG4pOiBMZWdlbmRDb21wb25lbnRPcHRpb24ge1xuICByZXR1cm4gcmVmZXJlbmNlcy5sZW5ndGhcbiAgICA/IHsgLi4ubGVnZW5kLCBkYXRhOiBzZXJpZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbS5uYW1lID8/ICcnKSkgfVxuICAgIDogbGVnZW5kO1xufVxuXG4vLyBUaGUgc3BhbiBvZiB0aGUgcmVmZXJlbmNlcyBvbiBvbmUgdmFsdWUgYXhpcywgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaGFzXG4vLyBub25lLlxuZnVuY3Rpb24gcmVmZXJlbmNlUmVhY2gocmVmZXJlbmNlczogRHJhd25SZWZlcmVuY2VbXSwgYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleCk6IFJlZmVyZW5jZVJlYWNoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb25BeGlzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLmF4aXNJbmRleCA9PT0gYXhpc0luZGV4KTtcblxuICByZXR1cm4gb25BeGlzLmxlbmd0aFxuICAgID8geyBsb3c6IE1hdGgubWluKC4uLm9uQXhpcy5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLmxvdykpLCBoaWdoOiBNYXRoLm1heCguLi5vbkF4aXMubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5oaWdoKSkgfVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vLyBFQ2hhcnRzIGxlYXZlcyBhIG1hcmtMaW5lIG9yIG1hcmtBcmVhIG91dCBvZiBhbiBheGlzJ3MgZXh0ZW50LCBzbyBhXG4vLyByZWZlcmVuY2UgYmV5b25kIHRoZSBkYXRhIHdvdWxkIGZhbGwgb2ZmIHRoZSBwbG90LiBBbiBheGlzIGJvdW5kIHRoZSBjb25maWdcbi8vIGRvZXMgbm90IHBpbiByZWFjaGVzIHBhc3QgdGhlIGZ1cnRoZXN0IHJlZmVyZW5jZSwgdG8gYSByb3VuZCBudW1iZXIgd2l0aFxuLy8gcm9vbSBmb3IgaXRzIGxhYmVsIChiZXlvbmRSZWZlcmVuY2UpLCB3aGVuIHRoZSBkYXRhIChhbmQgdGhlIHplcm8gYSB2YWx1ZVxuLy8gYXhpcyBhbHdheXMgc2hvd3MpIGZhbGxzIHNob3J0IG9mIGl0LCBhbmQgaXMgbGVmdCB0byBFQ2hhcnRzIG90aGVyd2lzZTogYVxuLy8gY2FsbGJhY2sgcmV0dXJuaW5nIHVuZGVmaW5lZCBrZWVwcyB0aGUgYm91bmQgYXV0b21hdGljLiBQYXN0IHRoZSBkYXRhIGFuZFxuLy8gemVybywgYSByZWZlcmVuY2UgYmV5b25kIHRoZSBtYXggaXMgYWJvdmUgemVybyBhbmQgb25lIGJleW9uZCB0aGUgbWluIGJlbG93XG4vLyBpdC5cbmZ1bmN0aW9uIHJlYWNoTWluKHJlYWNoOiBSZWZlcmVuY2VSZWFjaCB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gcmVhY2hcbiAgICA/IChleHRlbnQ6IEF4aXNFeHRlbnQpID0+IChyZWFjaC5sb3cgPCBNYXRoLm1pbihleHRlbnQubWluLCAwKSA/IC1iZXlvbmRSZWZlcmVuY2UoLXJlYWNoLmxvdykgOiB1bmRlZmluZWQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWNoTWF4KHJlYWNoOiBSZWZlcmVuY2VSZWFjaCB8IHVuZGVmaW5lZCkge1xuICByZXR1cm4gcmVhY2hcbiAgICA/IChleHRlbnQ6IEF4aXNFeHRlbnQpID0+IChyZWFjaC5oaWdoID4gTWF0aC5tYXgoZXh0ZW50Lm1heCwgMCkgPyBiZXlvbmRSZWZlcmVuY2UocmVhY2guaGlnaCkgOiB1bmRlZmluZWQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8vIFRoZSBib3VuZCBhbiBheGlzIHRha2VzIHBhc3QgYSByZWZlcmVuY2Ugb2YgdGhpcyAocG9zaXRpdmUpIG1hZ25pdHVkZTogdGhlXG4vLyBzbWFsbGVzdCByb3VuZCBudW1iZXIgYXQgb3IgYWJvdmUgaXQgcGx1cyBSRUZFUkVOQ0VfSEVBRFJPT00uIFRoZSBzdGVwcyBhcmVcbi8vIGZpbmVyIHRoYW4gRUNoYXJ0cycgdGljayBzdGVwcywgc28gYSByZWZlcmVuY2UganVzdCBwYXN0IHRoZSBkYXRhIGRvZXMgbm90XG4vLyBkb3VibGUgdGhlIGF4aXMgKDExMCBnaXZlcyAxMjAsIG5vdCAyMDApLiBUaGUgdG9sZXJhbmNlIGtlZXBzIGEgZmxvYXQgZXJyb3Jcbi8vIGZyb20gc2tpcHBpbmcgYSByb3VuZCBudW1iZXIgdGhlIHZhbHVlIGFscmVhZHkgaXMuXG5jb25zdCBOSUNFX1NURVBTID0gWzEsIDEuMiwgMS41LCAyLCAyLjUsIDMsIDQsIDUsIDYsIDgsIDEwXTtcbmNvbnN0IE5JQ0VfVE9MRVJBTkNFID0gMWUtOTtcblxuZnVuY3Rpb24gYmV5b25kUmVmZXJlbmNlKG1hZ25pdHVkZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgdGFyZ2V0ID0gbWFnbml0dWRlICogUkVGRVJFTkNFX0hFQURST09NO1xuICBjb25zdCBwb3dlciA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAodGFyZ2V0KSkpO1xuICBjb25zdCBzdGVwID0gTklDRV9TVEVQUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAqIHBvd2VyID49IHRhcmdldCAqICgxIC0gTklDRV9UT0xFUkFOQ0UpKSA/PyAxMDtcblxuICAvLyBSb3VuZGVkIGJhY2sgdG8gdGhlIHBvd2VyJ3Mgb3duIGRpZ2l0cywgc28gMS4yIHggMC4xIHJlYWRzIDAuMTIsIG5vdFxuICAvLyAwLjEyMDAwMDAwMDAwMDAwMDAxLlxuICByZXR1cm4gTnVtYmVyKChzdGVwICogcG93ZXIpLnRvUHJlY2lzaW9uKDEyKSk7XG59XG5cbi8vIFRoZSBjYXRlZ29yeSBheGlzIG9mIGFuIGF4aXMgY2hhcnQgb3IgYSB3YXRlcmZhbGw6IHRoZSBjYXRlZ29yaWVzIGluIHJvd1xuLy8gb3JkZXIsIGxhYmVsZWQgYXMgcGVyaW9kcyB3aGVuIHRoZSByb3dzIHdlcmUgYnVja2V0ZWQgYnkgdGltZS5cbi8vXG4vLyBIb3Jpem9udGFsIGJhcnMgcmVhZCB0b3AtZG93bjogRUNoYXJ0cyBkcmF3cyBjYXRlZ29yeSAwIGF0IHRoZSBib3R0b20sIHNvIHRoZVxuLy8gYXhpcyBpcyBpbnZlcnRlZCB0byBwdXQgdGhlIGZpcnN0IHJvdyAodGhlIGxhcmdlc3Qgb2YgYSB0b3AtTiwgYSB3YXRlcmZhbGwnc1xuLy8gZmlyc3Qgc3RlcCkgYXQgdGhlIHRvcC4gVGhlIHJvdGF0ZWQgdGl0bGUgc2l0cyBqdXN0IGJleW9uZCB0aGUgbG9uZ2VzdCBsYWJlbFxuLy8gcmF0aGVyIHRoYW4gYXQgYSBmaXhlZCBnYXAgdGhhdCB3b3VsZCBwdXQgaXQgb24gdG9wIG9mIHRoZSBsYWJlbHMuXG4vL1xuLy8gQSBidWNrZXRlZCBheGlzIGFsc28gbmFtZXMgaXRzIHBlcmlvZCBpbiB0aGUgYXhpcyB0b29sdGlwJ3MgaGVhZGVyOiBFQ2hhcnRzXG4vLyBoZWFkcyBpdCB3aXRoIHRoZSByYXcgY2F0ZWdvcnkgKCcyMDI2LTAxLTAxJykgdW5sZXNzIHRoZSBheGlzIHBvaW50ZXIncyBsYWJlbFxuLy8gaGFzIGEgZm9ybWF0dGVyLCBzbyBpdCByZWFkcyAnSmFudWFyeSAyMDI2JyBpbnN0ZWFkLCBhbHdheXMgd2l0aCBpdHMgeWVhci5cbi8vIFRoZSBheGlzJ3MgZGF0ZUxhYmVsIHN0eWxlIHdyaXRlcyBib3RoIGl0cyB0aWNrIGxhYmVscyBhbmQgdGhhdCBoZWFkZXIuXG5mdW5jdGlvbiBjYXRlZ29yeUF4aXNPcHRpb24oXG4gIGNvbmZpZzogQ2hhcnRDb25maWcsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICBob3Jpem9udGFsOiBib29sZWFuLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbikge1xuICBjb25zdCBncmFudWxhcml0eSA9IGJ1Y2tldEdyYW51bGFyaXR5KGRhdGEpO1xuICBjb25zdCBkYXRlTGFiZWwgPSBjaGFydERhdGVMYWJlbChjb25maWcpO1xuICBjb25zdCBwZXJpb2RMYWJlbCA9IHBlcmlvZEF4aXNMYWJlbChncmFudWxhcml0eSwgY2F0ZWdvcmllcywgbG9jYWxlLCBkYXRlTGFiZWwpO1xuICBjb25zdCBheGlzID0ge1xuICAgIHR5cGU6ICdjYXRlZ29yeScgYXMgY29uc3QsXG4gICAgZGF0YTogY2F0ZWdvcmllcyxcbiAgICBpbnZlcnNlOiBob3Jpem9udGFsLFxuICAgIG5hbWU6IGNvbmZpZy54QXhpcz8ubGFiZWwsXG4gICAgbmFtZUxvY2F0aW9uOiAnbWlkZGxlJyBhcyBjb25zdCxcbiAgICAuLi4oZ3JhbnVsYXJpdHkgPyB7XG4gICAgICBheGlzUG9pbnRlcjoge1xuICAgICAgICBsYWJlbDoge1xuICAgICAgICAgIGZvcm1hdHRlcjogKHBhcmFtczogeyB2YWx1ZTogdW5rbm93biB9KSA9PiBmb3JtYXRQZXJpb2RMYWJlbChcbiAgICAgICAgICAgIFN0cmluZyhwYXJhbXMudmFsdWUpLFxuICAgICAgICAgICAgZ3JhbnVsYXJpdHksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgZGF0ZUxhYmVsLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gIH07XG5cbiAgaWYgKCFob3Jpem9udGFsKSB7XG4gICAgLy8gVGhlIGdhcCBjbGVhcnMgdGhlIHllYXIncyBzZWNvbmQgbGluZSB3aGVuIHRoZSBsYWJlbHMgcHJpbnQgb25lLlxuICAgIGNvbnN0IHNlY29uZExpbmUgPSBncmFudWxhcml0eSAmJiBkYXRlTGFiZWwgPT09IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLlNob3J0ICYmIHNwYW5zTXVsdGlwbGVZZWFycyhjYXRlZ29yaWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5heGlzLFxuICAgICAgbmFtZUdhcDogc2Vjb25kTGluZSA/IDQwIDogMjgsXG4gICAgICAuLi5wZXJpb2RMYWJlbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gUGVyaW9kIGxhYmVscywgc2hvcnQsIGxvbmcgb3IgbnVtZXJpYyAoJ01heScsICdRMicsICdNYXkgMjAyNicpLCBhcmVcbiAgLy8gYm91bmRlZCBpbiBsZW5ndGggYW5kIG5ldmVyIGN1dDsgb25seSBhIHBsYWluIGNhdGVnb3J5IGlzIHRydW5jYXRlZC4gVGhlIGxhYmVscyBhcmUgY3V0IGhlcmUgcmF0aGVyIHRoYW4gYnkgRUNoYXJ0cycgb3duXG4gIC8vIHRydW5jYXRpb24sIHNvIHRoZSB0aXRsZSdzIGdhcCBpcyBtZWFzdXJlZCBvbiBleGFjdGx5IHRoZSB0ZXh0IHRoZSBheGlzXG4gIC8vIGRyYXdzLlxuICBjb25zdCBzaG93biA9IGdyYW51bGFyaXR5XG4gICAgPyBudWxsXG4gICAgOiBuZXcgTWFwKGNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gW2NhdGVnb3J5LCB0cnVuY2F0ZUF4aXNMYWJlbChjYXRlZ29yeSldKSk7XG4gIGNvbnN0IGxhYmVscyA9IHNob3duID8gWy4uLnNob3duLnZhbHVlcygpXSA6IGRpc3BsYXllZENhdGVnb3J5TGFiZWxzKGNhdGVnb3JpZXMsIGdyYW51bGFyaXR5LCBsb2NhbGUsIGRhdGVMYWJlbCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5heGlzLFxuICAgIG5hbWVHYXA6IHdpZGVzdEF4aXNMYWJlbChsYWJlbHMpICsgQVhJU19MQUJFTF9NQVJHSU4gKyBBWElTX05BTUVfQ0xFQVJBTkNFLFxuICAgIC4uLihzaG93biA/IHsgYXhpc0xhYmVsOiB7IGZvcm1hdHRlcjogKHZhbHVlOiBzdHJpbmcpID0+IHNob3duLmdldCh2YWx1ZSkgPz8gdmFsdWUgfSB9IDogcGVyaW9kTGFiZWwpLFxuICB9O1xufVxuXG4vLyBUaGUgY2F0ZWdvcnkgYXhpcydzIHRpdGxlIHNpZGUsIG9yIG51bGwgd2hlbiB0aGUgYXhpcyBoYXMgbm8gdGl0bGUgdG8gbWFrZVxuLy8gcm9vbSBmb3IuXG5mdW5jdGlvbiBjYXRlZ29yeVRpdGxlU2lkZShjb25maWc6IENoYXJ0Q29uZmlnLCBob3Jpem9udGFsOiBib29sZWFuKTogQXhpc1RpdGxlU2lkZSB8IG51bGwge1xuICBpZiAoIWNvbmZpZy54QXhpcz8ubGFiZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3Jpem9udGFsID8gJ2xlZnQnIDogJ2JvdHRvbSc7XG59XG5cbi8vIFRoZSB2YWx1ZSBheGVzJyB0aXRsZSBzaWRlLCBvciBudWxsIHdoZW4gbm9uZSBvZiB0aGVtIGhhcyBhIHRpdGxlLiBBXG4vLyB2ZXJ0aWNhbCBjaGFydCdzIHRpdGxlcyBzaXQgYWJvdmUgdGhlIHBsb3QsIGF0IHRoZSB0b3Agb2YgZWFjaCBheGlzIGxpbmUsIHNvXG4vLyByb29tIGlzIG1hZGUgb25jZSBmb3IgYm90aDsgYSBob3Jpem9udGFsIGNoYXJ0J3Mgc2l0cyBiZWxvdy5cbmZ1bmN0aW9uIHZhbHVlVGl0bGVTaWRlKGF4ZXM6IChDaGFydFZhbHVlQXhpcyB8IHVuZGVmaW5lZClbXSwgaG9yaXpvbnRhbDogYm9vbGVhbik6IEF4aXNUaXRsZVNpZGUgfCBudWxsIHtcbiAgaWYgKCFheGVzLnNvbWUoKGF4aXMpID0+IGF4aXM/LmxhYmVsKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvcml6b250YWwgPyAnYm90dG9tJyA6ICd0b3AnO1xufVxuXG4vLyBUaGUgdGljayBsYWJlbHMgYXMgdGhlIGF4aXMgc2hvd3MgdGhlbTogYSBidWNrZXQncyBwcmltYXJ5IHBlcmlvZCBsYWJlbFxuLy8gKCdNYXknLCAnUTInLCAnTWF5IDIwMjYnKSwgb3RoZXJ3aXNlIHRoZSBjYXRlZ29yeSBpdHNlbGYuIFRoZSB5ZWFyIGFcbi8vIG11bHRpLXllYXIgYXhpcyBwcmludHMgdW5kZXIgYSBzaG9ydCBwZXJpb2QgaXMgbGVmdCBvdXQsIGFzIGl0IGlzIG5ldmVyIHRoZVxuLy8gd2lkZXIgbGluZS5cbmZ1bmN0aW9uIGRpc3BsYXllZENhdGVnb3J5TGFiZWxzKFxuICBjYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGdyYW51bGFyaXR5XG4gICAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IHBlcmlvZExhYmVsUGFydHMoY2F0ZWdvcnksIGdyYW51bGFyaXR5LCBsb2NhbGUsIGRhdGVMYWJlbCk/LnByaW1hcnkgPz8gY2F0ZWdvcnkpXG4gICAgOiBjYXRlZ29yaWVzO1xufVxuXG4vLyBUaGUgcGl4ZWwgd2lkdGggb2YgdGhlIHdpZGVzdCBsYWJlbC4gQSBsYWJlbCB0aGF0IGJyZWFrcyBvdmVyIHNldmVyYWwgbGluZXNcbi8vIGlzIGFzIHdpZGUgYXMgaXRzIGxvbmdlc3QgbGluZS5cbmZ1bmN0aW9uIHdpZGVzdEF4aXNMYWJlbChsYWJlbHM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgcmV0dXJuIGxhYmVscy5yZWR1Y2UoKHdpZGVzdCwgbGFiZWwpID0+IGxhYmVsLnNwbGl0KCdcXG4nKS5yZWR1Y2UoXG4gICAgKGxpbmVXaWRlc3QsIGxpbmUpID0+IE1hdGgubWF4KGxpbmVXaWRlc3QsIGF4aXNMYWJlbFdpZHRoKGxpbmUpKSxcbiAgICB3aWRlc3QsXG4gICksIDApO1xufVxuXG4vLyBBIGNhdGVnb3J5IGxhYmVsIGN1dCB0byBDQVRFR09SWV9MQUJFTF9NQVhfV0lEVEgsIGxpbmUgYnkgbGluZTogdGhlIGxvbmdlc3Rcbi8vIHN0YXJ0IG9mIGVhY2ggbGluZSB0aGF0IHN0aWxsIGZpdHMgd2l0aCB0aGUgZWxsaXBzaXMgYWZ0ZXIgaXQuXG5mdW5jdGlvbiB0cnVuY2F0ZUF4aXNMYWJlbChsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxhYmVsLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IHtcbiAgICBpZiAoYXhpc0xhYmVsV2lkdGgobGluZSkgPD0gQ0FURUdPUllfTEFCRUxfTUFYX1dJRFRIKSB7XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIHBvaW50cywgc28gYW4gZW1vamkgb3Igb3RoZXIgc3Vycm9nYXRlIHBhaXIgaXMgbmV2ZXIgc3BsaXQuXG4gICAgY29uc3QgY2hhcmFjdGVycyA9IEFycmF5LmZyb20obGluZSk7XG4gICAgY29uc3QgY3V0ID0gKGxlbmd0aDogbnVtYmVyKSA9PiBgJHtjaGFyYWN0ZXJzLnNsaWNlKDAsIGxlbmd0aCkuam9pbignJykudHJpbUVuZCgpfSR7TEFCRUxfRUxMSVBTSVN9YDtcbiAgICBsZXQgZml0cyA9IDA7XG4gICAgbGV0IHRvb0xvbmcgPSBjaGFyYWN0ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAodG9vTG9uZyAtIGZpdHMgPiAxKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLmZsb29yKChmaXRzICsgdG9vTG9uZykgLyAyKTtcbiAgICAgIGlmIChheGlzTGFiZWxXaWR0aChjdXQobGVuZ3RoKSkgPD0gQ0FURUdPUllfTEFCRUxfTUFYX1dJRFRIKSB7XG4gICAgICAgIGZpdHMgPSBsZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29Mb25nID0gbGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXQoZml0cyk7XG4gIH0pLmpvaW4oJ1xcbicpO1xufVxuXG4vLyBPbmUgbGluZSdzIHdpZHRoIGluIHRoZSBheGlzLWxhYmVsIGZvbnQsIG1lYXN1cmVkIG9uIGEgY2FudmFzIHRoZSB3YXlcbi8vIEVDaGFydHMgbWVhc3VyZXMgaXQgZm9yIGNvbnRhaW5MYWJlbC4gT3V0c2lkZSBhIGJyb3dzZXIgdGhlcmUgaXMgbm8gY2FudmFzXG4vLyB0byBtZWFzdXJlIHdpdGgsIHNvIHRoZSBsaW5lIGNvdW50cyBhcyB6ZXJvIHdpZHRoLlxubGV0IGF4aXNMYWJlbENvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBheGlzTGFiZWxXaWR0aChsaW5lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIWF4aXNMYWJlbENvbnRleHQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGF4aXNMYWJlbENvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICB9XG5cbiAgaWYgKCFheGlzTGFiZWxDb250ZXh0KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBheGlzTGFiZWxDb250ZXh0LmZvbnQgPSBBWElTX0xBQkVMX0ZPTlQ7XG5cbiAgcmV0dXJuIGF4aXNMYWJlbENvbnRleHQubWVhc3VyZVRleHQobGluZSkud2lkdGg7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2F0ZXJmYWxsT3B0aW9uKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IEVDaGFydHNPcHRpb24ge1xuICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIENoYXJ0Q29uZmlnO1xuICBjb25zdCB3YXRlcmZhbGwgPSBleHRyYWN0V2F0ZXJmYWxsKGNvbXBvbmVudCwgZGF0YSk7XG4gIGNvbnN0IGhvcml6b250YWwgPSBjb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgY29uc3QgY2F0ZWdvcmllcyA9IHdhdGVyZmFsbC5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAuY2F0ZWdvcnkpO1xuICBjb25zdCBjYXRlZ29yeUF4aXMgPSBjYXRlZ29yeUF4aXNPcHRpb24oY29uZmlnLCBkYXRhLCBjYXRlZ29yaWVzLCBob3Jpem9udGFsLCBjb250ZXh0LmxvY2FsZSk7XG4gIC8vIFRoZSBvbmUgbWVhc3VyZSdzIGZvcm1hdCB3cml0ZXMgdGhlIGF4aXMgYW5kIHRoZSB0b29sdGlwLiBUaGUgYXhpcyBoYXMgdG9cbiAgLy8gcmVhY2ggdGhlIGZ1cnRoZXN0IHBvaW50IHRoZSBydW5uaW5nIHRvdGFsIGdldHMgdG8sIG9uIGVpdGhlciBzaWRlIG9mXG4gIC8vIHplcm8sIG9yIHRoZSBmdXJ0aGVzdCByZWZlcmVuY2UuXG4gIGNvbnN0IHNwZWMgPSBjb25maWcubWVhc3VyZXM/LlswXTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNoYXJ0UmVmZXJlbmNlcyhjb25maWcsIGZhbHNlKTtcbiAgY29uc3QgdmFsdWVBeGlzID0gdmFsdWVBeGlzT3B0aW9uKGNvbmZpZy52YWx1ZUF4aXMsIGhvcml6b250YWwsIHZhbHVlQXhpc0xhYmVsKHJlc29sdmVWYWx1ZUF4aXNGb3JtYXQoXG4gICAgc3BlYyAmJiBoYXNOdW1iZXJGb3JtYXQoc3BlYykgPyBzcGVjIDogbnVsbCxcbiAgICAoKSA9PiBNYXRoLm1heChyZWZlcmVuY2VQZWFrKHJlZmVyZW5jZXMsIDApLCAuLi53YXRlcmZhbGwuc3RlcHMubWFwKChzdGVwKSA9PiBNYXRoLmFicyhzdGVwLnN0YXJ0ICsgKHN0ZXAuY2hhbmdlID8/IDApKSkpLFxuICAgIGNvbnRleHQsXG4gICksIGNvbnRleHQpLCB7IHJlYWNoOiByZWZlcmVuY2VSZWFjaChyZWZlcmVuY2VzLCAwKSB9KTtcbiAgLy8gT25lIHZpc2libGUgc2VyaWVzLCBzbyB0aGUgbGVnZW5kIGlzIGhpZGRlbiB1bmxlc3MgdGhlIGNvbmZpZyBwaW5zIGl0LlxuICBjb25zdCBsZWdlbmRQb3NpdGlvbiA9IHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWcsIDEpO1xuICBjb25zdCBncmFudWxhcml0eSA9IGJ1Y2tldEdyYW51bGFyaXR5KGRhdGEpO1xuXG4gIHJldHVybiB7XG4gICAgZ3JpZDogYXhpc0dyaWQoXG4gICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgIGNhdGVnb3J5VGl0bGVTaWRlKGNvbmZpZywgaG9yaXpvbnRhbCksXG4gICAgICB2YWx1ZVRpdGxlU2lkZShbY29uZmlnLnZhbHVlQXhpc10sIGhvcml6b250YWwpLFxuICAgICksXG4gICAgbGVnZW5kOiB7IC4uLmxlZ2VuZE9wdGlvbihsZWdlbmRQb3NpdGlvbiksIGRhdGE6IFt3YXRlcmZhbGwubmFtZV0gfSxcbiAgICAvLyBQZXIgYmFyOiB0aGUgaW52aXNpYmxlIGJhc2UgaXMgc2lsZW50LCBzbyBvbmx5IGEgc3RlcCBhbnN3ZXJzIHRoZSBob3Zlci5cbiAgICB0b29sdGlwOiB7XG4gICAgICB0cmlnZ2VyOiAnaXRlbScsXG4gICAgICBmb3JtYXR0ZXI6IChwYXJhbXM6IFRvb2x0aXBDb21wb25lbnRGb3JtYXR0ZXJDYWxsYmFja1BhcmFtcykgPT4gd2F0ZXJmYWxsVG9vbHRpcChcbiAgICAgICAgd2F0ZXJmYWxsLFxuICAgICAgICAoQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zWzBdIDogcGFyYW1zKS5kYXRhSW5kZXgsXG4gICAgICAgIGdyYW51bGFyaXR5LFxuICAgICAgICBjaGFydERhdGVMYWJlbChjb25maWcpLFxuICAgICAgICBzcGVjLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICB9LFxuICAgIHhBeGlzOiBob3Jpem9udGFsID8gdmFsdWVBeGlzIDogY2F0ZWdvcnlBeGlzLFxuICAgIHlBeGlzOiBob3Jpem9udGFsID8gY2F0ZWdvcnlBeGlzIDogdmFsdWVBeGlzLFxuICAgIHNlcmllczogWy4uLndhdGVyZmFsbFNlcmllcyh3YXRlcmZhbGwpLCAuLi5yZWZlcmVuY2VDYXJyaWVycyhyZWZlcmVuY2VzLCBjYXRlZ29yaWVzKV0sXG4gIH07XG59XG5cbi8vIEFuIGludmlzaWJsZSBiYXNlIHNlcmllcyBsaWZ0cyBlYWNoIHZpc2libGUgYmFyIHRvIHdoZXJlIGl0cyBzdGVwIHN0YXJ0cy5cbi8vIEJvdGggc3RhY2sgd2l0aCB0aGUgJ2FsbCcgc3RyYXRlZ3ksIHdoaWNoIGFkZHMgc2lnbmVkIHZhbHVlcyBpbiBzZXJpZXMgb3JkZXIsXG4vLyBzbyBhIGZhbGwgZHJhd3MgRE9XTiBmcm9tIHRoZSB0b3RhbCBiZWZvcmUgaXQsIGV2ZW4gYWNyb3NzIHplcm8uIFRoZSBkZWZhdWx0XG4vLyBzYW1lLXNpZ24gc3RhY2tpbmcgd291bGQgaGFuZyBhIG5lZ2F0aXZlIGJhciBiZWxvdyB0aGUgYXhpcyBpbnN0ZWFkLlxuZnVuY3Rpb24gd2F0ZXJmYWxsU2VyaWVzKHdhdGVyZmFsbDogRXh0cmFjdGVkV2F0ZXJmYWxsKTogU2VyaWVzT3B0aW9uW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgc3RhY2s6ICd3YXRlcmZhbGwnLFxuICAgICAgc3RhY2tTdHJhdGVneTogJ2FsbCcsXG4gICAgICBkYXRhOiB3YXRlcmZhbGwuc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLnN0YXJ0KSxcbiAgICAgIGJhck1heFdpZHRoOiA0OCxcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogJ3RyYW5zcGFyZW50JyB9LFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogd2F0ZXJmYWxsLm5hbWUsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIHN0YWNrOiAnd2F0ZXJmYWxsJyxcbiAgICAgIHN0YWNrU3RyYXRlZ3k6ICdhbGwnLFxuICAgICAgYmFyTWF4V2lkdGg6IDQ4LFxuICAgICAgLy8gVGhlIHNlcmllcyBjb2xvciBpcyB0aGUgcmlzZSBjb2xvciBzbyBhIHBpbm5lZCBsZWdlbmQgc2hvd3MgaXQ7IGVhY2hcbiAgICAgIC8vIGJhciBpcyB0aGVuIGNvbG9yZWQgYnkgd2hhdCBpdCBkb2VzIHRvIHRoZSB0b3RhbC5cbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogYCMke1JFUE9SVF9XQVRFUkZBTExfQ09MT1JTLnJpc2V9YCB9LFxuICAgICAgZGF0YTogd2F0ZXJmYWxsLnN0ZXBzLm1hcCgoc3RlcCkgPT4gKHtcbiAgICAgICAgdmFsdWU6IHN0ZXAuY2hhbmdlLFxuICAgICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IGAjJHtSRVBPUlRfV0FURVJGQUxMX0NPTE9SU1tzdGVwLmtpbmRdfWAgfSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xufVxuXG4vLyBBIHN0ZXAncyB0b29sdGlwOiBpdHMgcGVyaW9kLCBob3cgZmFyIGl0IG1vdmVkIHRoZSBydW5uaW5nIHRvdGFsIGFuZCB3aGVyZVxuLy8gdGhhdCBsZWZ0IGl0LiBUaGUgY2xvc2luZyBUb3RhbCBzaG93cyB0aGUgdG90YWwgYWxvbmUuIFRoZSBjYXRlZ29yeSBhbmQgdGhlXG4vLyBtZWFzdXJlIG5hbWUgY29tZSBmcm9tIHRoZSBkYXRhIGFuZCB0aGUgY29uZmlnLCBhbmQgRUNoYXJ0cyBzZXRzIHRoZSB0b29sdGlwXG4vLyBhcyBIVE1MLCBzbyBib3RoIGFyZSBlc2NhcGVkLiBQZXJpb2RzIGFuZCBhbW91bnRzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQnc1xuLy8gbG9jYWxlLCBhbW91bnRzIGluIHRoZSBtZWFzdXJlJ3MgbnVtYmVyIGZvcm1hdCAoYSBwbGFpbiBudW1iZXIgd2l0aG91dCBvbmUpO1xuLy8gdGhlIHdvcmRzICgnUnVubmluZyB0b3RhbCcpIHN0YXkgRW5nbGlzaC5cbmZ1bmN0aW9uIHdhdGVyZmFsbFRvb2x0aXAoXG4gIHdhdGVyZmFsbDogRXh0cmFjdGVkV2F0ZXJmYWxsLFxuICBpbmRleDogbnVtYmVyLFxuICBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4gIGRhdGVMYWJlbDogUmVwb3J0Q2hhcnREYXRlTGFiZWwsXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGVwID0gd2F0ZXJmYWxsLnN0ZXBzW2luZGV4XTtcbiAgY29uc3QgY2F0ZWdvcnkgPSBlc2NhcGVIdG1sKGdyYW51bGFyaXR5XG4gICAgPyBmb3JtYXRQZXJpb2RMYWJlbChzdGVwLmNhdGVnb3J5LCBncmFudWxhcml0eSwgdHJ1ZSwgY29udGV4dC5sb2NhbGUsIGRhdGVMYWJlbClcbiAgICA6IHN0ZXAuY2F0ZWdvcnkpO1xuICBjb25zdCBuYW1lID0gZXNjYXBlSHRtbCh3YXRlcmZhbGwubmFtZSk7XG4gIGNvbnN0IGFtb3VudCA9ICh2YWx1ZTogbnVtYmVyIHwgbnVsbCkgPT4gZm9ybWF0TnVtYmVyKHZhbHVlLCBzcGVjID8/IHt9LCBjb250ZXh0KTtcblxuICBpZiAoc3RlcC5raW5kID09PSAndG90YWwnKSB7XG4gICAgcmV0dXJuIGAke2NhdGVnb3J5fTxici8+JHtuYW1lfTogJHthbW91bnQoc3RlcC5jaGFuZ2UpfWA7XG4gIH1cblxuICBjb25zdCBzaWduID0gKHN0ZXAuY2hhbmdlID8/IDApID4gMCA/ICcrJyA6ICcnO1xuXG4gIHJldHVybiBgJHtjYXRlZ29yeX08YnIvPiR7bmFtZX06ICR7c2lnbn0ke2Ftb3VudChzdGVwLmNoYW5nZSl9YFxuICAgICsgYDxici8+UnVubmluZyB0b3RhbDogJHthbW91bnQoc3RlcC5zdGFydCArIChzdGVwLmNoYW5nZSA/PyAwKSl9YDtcbn1cblxuLy8gRGVmYXVsdCBsZWdlbmQgcGxhY2VtZW50IHdoZW4gdGhlIGNvbmZpZyBkb2Vzbid0IHBpbiBvbmU6IHBpZSBjaGFydHMgcmVhZFxuLy8gYmVzdCB3aXRoIHRoZSBzbGljZSBrZXkgYmVzaWRlIHRoZW0gKHJpZ2h0KTsgYXhpcyBjaGFydHMgb25seSBuZWVkIGEgbGVnZW5kXG4vLyB0byB0ZWxsIG11bHRpcGxlIHNlcmllcyBhcGFydCwgc28gYSBzaW5nbGUtc2VyaWVzIGNoYXJ0IGhpZGVzIGl0LiBBbiBleHBsaWNpdFxuLy8gY29uZmlnLmxlZ2VuZCAoaW5jbHVkaW5nICdoaWRkZW4nKSBhbHdheXMgd2lucy4gU2hhcmVkIHdpdGggdGhlIFBvd2VyUG9pbnRcbi8vIGV4cG9ydCBzbyBib3RoIG1lZGlhIHBsYWNlIHRoZSBsZWdlbmQgaWRlbnRpY2FsbHkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxlZ2VuZFBvc2l0aW9uKGNvbmZpZzogQ2hhcnRDb25maWcsIHNlcmllc0NvdW50OiBudW1iZXIsIGNvbG9yQnkgPSBmYWxzZSk6IExlZ2VuZFBvc2l0aW9uIHtcbiAgaWYgKGNvbmZpZy5sZWdlbmQpIHtcbiAgICByZXR1cm4gY29uZmlnLmxlZ2VuZDtcbiAgfVxuXG4gIGNvbnN0IHBpZSA9IGNvbmZpZy5jaGFydFR5cGUgPT09ICdwaWUnIHx8IGNvbmZpZy5jaGFydFR5cGUgPT09ICdkb251dCc7XG5cbiAgLy8gY29sb3JCeSBtYXBzIGVhY2ggYmFyJ3MgY29sb3IgdG8gaXRzIGNhdGVnb3J5LCBzbyBpdCBuZWVkcyBhIGxlZ2VuZCBldmVuXG4gIC8vIHRob3VnaCBpdCdzIGEgc2luZ2xlIG1lYXN1cmUuXG4gIHJldHVybiBwaWUgfHwgY29sb3JCeSB8fCBzZXJpZXNDb3VudCA+IDEgPyAocGllID8gJ3JpZ2h0JyA6ICd0b3AnKSA6ICdoaWRkZW4nO1xufVxuXG5mdW5jdGlvbiBsZWdlbmRPcHRpb24ocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogTGVnZW5kQ29tcG9uZW50T3B0aW9uIHtcbiAgaWYgKHBvc2l0aW9uID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBiYXNlOiBMZWdlbmRDb21wb25lbnRPcHRpb24gPSB7IHR5cGU6ICdzY3JvbGwnIH07XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IDAgfTtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG9yaWVudDogJ3ZlcnRpY2FsJywgbGVmdDogMCwgdG9wOiAnbWlkZGxlJyB9O1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG9yaWVudDogJ3ZlcnRpY2FsJywgcmlnaHQ6IDAsIHRvcDogJ21pZGRsZScgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgdG9wOiAwIH07XG4gIH1cbn1cblxuLy8gVGhlIHBsb3QncyBncmlkOiByb29tIG9uIHRoZSBsZWdlbmQncyBzaWRlIHNvIGl0IG5ldmVyIG92ZXJsYXBzIHRoZVxuLy8gYmFycy9saW5lcywgcGx1cyByb29tIGZvciB0aGUgY2F0ZWdvcnkgYW5kIHZhbHVlIGF4ZXMnIHRpdGxlcyBvbiB0aGVpclxuLy8gc2lkZXMsIHdoaWNoIGNvbnRhaW5MYWJlbCBkb2VzIG5vdCByZXNlcnZlIChpdCBjb3ZlcnMgdGhlIHRpY2sgbGFiZWxzIG9ubHkpLlxuZnVuY3Rpb24gYXhpc0dyaWQoXG4gIHBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbixcbiAgY2F0ZWdvcnlUaXRsZTogQXhpc1RpdGxlU2lkZSB8IG51bGwsXG4gIHZhbHVlVGl0bGU6IEF4aXNUaXRsZVNpZGUgfCBudWxsLFxuKTogRUNoYXJ0c09wdGlvblsnZ3JpZCddIHtcbiAgcmV0dXJuIFtjYXRlZ29yeVRpdGxlLCB2YWx1ZVRpdGxlXS5yZWR1Y2U8QXhpc0dyaWRSb29tPihcbiAgICAoZ3JpZCwgc2lkZSkgPT4gKHNpZGUgPyB7IC4uLmdyaWQsIFtzaWRlXTogZ3JpZFtzaWRlXSArIEFYSVNfTkFNRV9ST09NIH0gOiBncmlkKSxcbiAgICBsZWdlbmRHcmlkKHBvc2l0aW9uKSxcbiAgKTtcbn1cblxuLy8gUGxvdC1lZGdlIHJvb20gb24gd2hpY2hldmVyIHNpZGUgdGhlIGxlZ2VuZCBvY2N1cGllczsgY29udGFpbkxhYmVsIGtlZXBzIHRoZVxuLy8gdGljayBsYWJlbHMgaW5zaWRlIHdoYXQgaXMgbGVmdC5cbmZ1bmN0aW9uIGxlZ2VuZEdyaWQocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogQXhpc0dyaWRSb29tIHtcbiAgY29uc3QgYmFzZTogQXhpc0dyaWRSb29tID0geyBsZWZ0OiA4LCByaWdodDogMTYsIHRvcDogOCwgYm90dG9tOiA4LCBjb250YWluTGFiZWw6IHRydWUgfTtcblxuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIGJvdHRvbTogMzIgfTtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIGxlZnQ6IDk2IH07XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgcmlnaHQ6IDk2IH07XG4gICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCB0b3A6IDMyIH07XG4gIH1cbn1cblxuLy8gVGhlIHN0YWNrIGEgc3RhY2tlZCBzZXJpZXMgam9pbnMuIE9uIGEgdHdvLWF4aXMgY2hhcnQgKGF4aXNJbmRleCBzZXQpIGVhY2hcbi8vIHR5cGUgc3RhY2tzIHBlciBheGlzOyBvdGhlcndpc2UgYSBjb21ibyBzdGFja3MgcGVyIHR5cGUgYW5kIGEgc2luZ2xlLXR5cGVcbi8vIGNoYXJ0IHN0YWNrcyBldmVyeXRoaW5nIHRvZ2V0aGVyLlxuZnVuY3Rpb24gc3RhY2tLZXkodHlwZTogQXhpc0NoYXJ0VHlwZSwgY29tYm86IGJvb2xlYW4sIGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXggfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoYXhpc0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYHRvdGFsLSR7dHlwZX0tJHtheGlzSW5kZXh9YDtcbiAgfVxuXG4gIHJldHVybiBjb21ibyA/IGB0b3RhbC0ke3R5cGV9YCA6ICd0b3RhbCc7XG59XG5cbi8vIEhvdyBidWlsZFNlcmllcyBkcmF3cyBvbmUgc2VyaWVzOiBpdHMgZHJhd24gdHlwZSwgdGhlIHN0YWNrIGl0IGpvaW5zLCB3aGV0aGVyXG4vLyBpdCBsYXlzIHRoZSBjb2xvckJ5IG92ZXJsYXAsIHdoZXRoZXIgdGhlIGNoYXJ0IGlzIGEgY29tYm8sIGl0cyB0b29sdGlwLCBpdHNcbi8vIHZhbHVlIGF4aXMgb24gYSB0d28tYXhpcyBjaGFydCwgaXRzIG93biBDU1MgY29sb3IgKHVuZGVmaW5lZCBsZWF2ZXMgaXQgdG9cbi8vIHRoZSB0aGVtZSdzIHBhbGV0dGUgYnkgcG9zaXRpb24pLCBhbmQgaXRzIGRhdGEgbGFiZWxzIChudWxsIHByaW50cyBub25lKS5cbmludGVyZmFjZSBTZXJpZXNMYXlvdXQge1xuICB0eXBlOiBBeGlzQ2hhcnRUeXBlO1xuICBzdGFjazogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBvdmVybGFwOiBib29sZWFuO1xuICBjb21ibzogYm9vbGVhbjtcbiAgdG9vbHRpcDogU2VyaWVzVG9vbHRpcDtcbiAgYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleCB8IHVuZGVmaW5lZDtcbiAgY29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGFiZWxzOiBTZXJpZXNEYXRhTGFiZWxzIHwgbnVsbDtcbn1cblxuLy8gT25lIHNlcmllcyBvZiBhbiBheGlzIGNoYXJ0LiBBIG1lYXN1cmUncyBkaXNwbGF5IGtleXMgb25seSBhZGQgd2hhdCB0aGV5XG4vLyBjaGFuZ2UsIHNvIGEgc2VyaWVzIHRoYXQgc2V0cyBub25lIGlzIGRyYXduIGJ5IHRoZSB0aGVtZSBhcyBiZWZvcmU6IGl0cyBvd25cbi8vIGNvbG9yICh0aGUgYmFyLCB0aGUgbGluZSwgdGhlIGFyZWEgdW5kZXIgaXQgYW5kIGl0cyBsZWdlbmQga2V5IGFsbCBmb2xsb3dcbi8vIGl0ZW1TdHlsZSksIGl0cyBsaW5lIHN0eWxlIGFuZCBpdHMgbWFya2Vycywgc2hvd24gb24gZXZlcnkgcG9pbnQgdW5sZXNzXG4vLyBtYXJrZXJzIGlzIGZhbHNlLiBEYXRhIGxhYmVscyBjb21lIGxhc3QsIG9uIHRoZSBzZXJpZXMgb3Igb24gaXRzIGxhdGVzdFxuLy8gcG9pbnQuXG5mdW5jdGlvbiBidWlsZFNlcmllcyhcbiAgc2VyaWVzOiBFeHRyYWN0ZWRDaGFydFNlcmllc0l0ZW0sXG4gIHZhbHVlczogKG51bWJlciB8IG51bGwgfCBTaGFyZURhdGFJdGVtKVtdLFxuICBsYXlvdXQ6IFNlcmllc0xheW91dCxcbik6IFNlcmllc09wdGlvbiB7XG4gIC8vIE9uIGEgdHdvLWF4aXMgY2hhcnQgZXZlcnkgc2VyaWVzIG5hbWVzIGl0cyB2YWx1ZSBheGlzLlxuICBjb25zdCBheGlzID0gbGF5b3V0LmF4aXNJbmRleCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHlBeGlzSW5kZXg6IGxheW91dC5heGlzSW5kZXggfTtcbiAgY29uc3QgY29sb3IgPSBsYXlvdXQuY29sb3I7XG4gIGNvbnN0IGl0ZW1TdHlsZSA9IGNvbG9yID8geyBpdGVtU3R5bGU6IHsgY29sb3IgfSB9IDoge307XG5cbiAgaWYgKGxheW91dC50eXBlID09PSAnYmFyJykge1xuICAgIC8vICdvdXRzaWRlJyBmb2xsb3dzIGVhY2ggYmFyJ3Mgc2lnbjogcGFzdCBhIHBvc2l0aXZlIGJhcidzIGVuZCBhbmQgYmVsb3dcbiAgICAvLyAob3IgbGVmdCBvZikgYSBuZWdhdGl2ZSBvbmUncywgd2hlcmUgJ3RvcCcgd291bGQgc2l0IGF0IHRoZSB6ZXJvIGxpbmUuXG4gICAgY29uc3QgeyBzZXJpZXM6IGxhYmVscywgZGF0YSB9ID0gcGxhY2VEYXRhTGFiZWxzKGxheW91dC5sYWJlbHMsIGxheW91dC5zdGFjayA/ICdpbnNpZGUnIDogJ291dHNpZGUnLCB2YWx1ZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHNlcmllcy5uYW1lLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBkYXRhLFxuICAgICAgc3RhY2s6IGxheW91dC5zdGFjayxcbiAgICAgIHRvb2x0aXA6IGxheW91dC50b29sdGlwLFxuICAgICAgLi4uYXhpcyxcbiAgICAgIC4uLml0ZW1TdHlsZSxcbiAgICAgIGJhck1heFdpZHRoOiA0OCxcbiAgICAgIC8vIGNvbG9yQnk6IG92ZXJsYXAgdGhlIHBlci1jYXRlZ29yeSBzZXJpZXMgc28gZWFjaCBiYXIgcmVuZGVycyBmdWxsLXdpZHRoLlxuICAgICAgLi4uKGxheW91dC5vdmVybGFwID8geyBiYXJHYXA6ICctMTAwJScsIGJhckNhdGVnb3J5R2FwOiAnMjAlJyB9IDoge30pLFxuICAgICAgLi4ubGFiZWxzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBsaW5lVHlwZSA9IG1lYXN1cmVMaW5lU3R5bGUoc2VyaWVzLm1lYXN1cmUpO1xuICBjb25zdCBsaW5lU3R5bGUgPSBjb2xvciB8fCBsaW5lVHlwZVxuICAgID8geyBsaW5lU3R5bGU6IHsgLi4uKGNvbG9yID8geyBjb2xvciB9IDoge30pLCAuLi4obGluZVR5cGUgPyB7IHR5cGU6IGxpbmVUeXBlIH0gOiB7fSkgfSB9XG4gICAgOiB7fTtcbiAgY29uc3QgeyBzZXJpZXM6IGxhYmVscywgZGF0YSB9ID0gcGxhY2VEYXRhTGFiZWxzKGxheW91dC5sYWJlbHMsICd0b3AnLCB2YWx1ZXMpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogc2VyaWVzLm5hbWUsXG4gICAgdHlwZTogJ2xpbmUnLFxuICAgIGRhdGEsXG4gICAgc3RhY2s6IGxheW91dC5zdGFjayxcbiAgICB0b29sdGlwOiBsYXlvdXQudG9vbHRpcCxcbiAgICAuLi5heGlzLFxuICAgIC4uLml0ZW1TdHlsZSxcbiAgICAuLi5saW5lU3R5bGUsXG4gICAgLi4uKHNlcmllcy5tZWFzdXJlLm1hcmtlcnMgPT09IGZhbHNlID8geyBzaG93U3ltYm9sOiBmYWxzZSB9IDoge30pLFxuICAgIHNtb290aDogdHJ1ZSxcbiAgICBzeW1ib2xTaXplOiA2LFxuICAgIGFyZWFTdHlsZTogbGF5b3V0LnR5cGUgPT09ICdhcmVhJyA/IHsgb3BhY2l0eTogMC4yNSB9IDogdW5kZWZpbmVkLFxuICAgIC8vIEluIGEgY29tYm8gdGhlIGxpbmUgaXMgZHJhd24gb3ZlciB0aGUgYmFycyB3aGF0ZXZlciBvcmRlciB0aGUgbWVhc3VyZXNcbiAgICAvLyBjb21lIGluOyBhdCB0aGUgc2FtZSB6IGEgbGF0ZXIgYmFyIHNlcmllcyB3b3VsZCBwYWludCBhY3Jvc3MgaXQuXG4gICAgLi4uKGxheW91dC5jb21ibyA/IHsgejogMyB9IDoge30pLFxuICAgIC4uLmxhYmVscyxcbiAgfTtcbn1cblxuLy8gQSAxMDAlIHN0YWNrZWQgc2VyaWVzJyBwb2ludHM6IGVhY2ggc2hhcmUsIHBsb3R0ZWQgYW5kIHN0YWNrZWQsIHdpdGggdGhlXG4vLyB2YWx1ZSBpdCBjYW1lIGZyb20uXG5mdW5jdGlvbiBzaGFyZURhdGEodmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSwgc2hhcmVzOiAobnVtYmVyIHwgbnVsbClbXSk6IFNoYXJlRGF0YUl0ZW1bXSB7XG4gIHJldHVybiB2YWx1ZXMubWFwKChyYXcsIGluZGV4KSA9PiAoeyB2YWx1ZTogc2hhcmVzW2luZGV4XSA/PyBudWxsLCByYXcgfSkpO1xufVxuXG4vLyBXaGF0IGEgc2VyaWVzIHByaW50cyBiZXNpZGUgaXRzIHBvaW50cyAoQTIgZGF0YSBsYWJlbHMpOiBldmVyeSBwb2ludFxuLy8gKCdhbGwnKSwgZXZlcnkgcG9pbnQgd2hvc2UgbGFiZWwgZml0cyB3aXRob3V0IG92ZXJsYXBwaW5nIGFub3RoZXIgKCdhdXRvJyxcbi8vIExhYmVsTGF5b3V0J3MgaGlkZU92ZXJsYXApLCBvciBvbmx5IGl0cyBsYXRlc3QgcG9pbnQgKCdsYXN0JykuIG5vbmUsIGFuXG4vLyBhYnNlbnQgbW9kZSBvciBvbmUgdGhlIHZpZXdlciBkb2VzIG5vdCBrbm93IHByaW50cyBub3RoaW5nLCBhbmQgdGhlIHNlcmllc1xuLy8gaXMgbGVmdCBhcyBpdCB3YXMuIEEgY29sb3JCeSBjaGFydCdzIHNlcmllcyBlYWNoIGhvbGQgb25lIGJhciwgc28gJ2xhc3QnXG4vLyBsYWJlbHMgZXZlcnkgYmFyIHRoZXJlLCBhcyAnYWxsJyBkb2VzLlxuLy9cbi8vIFdoZXJlIHRoZSBsYWJlbCBzaXRzIGRlcGVuZHMgb24gd2hhdCB0aGUgc2VyaWVzIGRyYXdzLCBzbyBidWlsZFNlcmllc1xuLy8gcGxhY2VzIGl0IChwbGFjZURhdGFMYWJlbHMpLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMYWJlbE9wdGlvbihcbiAgbW9kZTogUmVwb3J0Q2hhcnREYXRhTGFiZWxzIHwgdW5kZWZpbmVkLFxuICBmb3JtYXR0ZXI6IERhdGFMYWJlbEZvcm1hdHRlcixcbik6IFNlcmllc0RhdGFMYWJlbHMgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IHsgc2hvdzogdHJ1ZSBhcyBjb25zdCwgZm9udFNpemU6IFJFUE9SVF9EQVRBX0xBQkVMX0ZPTlRfU0laRSwgZm9ybWF0dGVyIH07XG5cbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBSZXBvcnRDaGFydERhdGFMYWJlbHMuQWxsOlxuICAgICAgcmV0dXJuIHsgdGV4dCwgaGlkZU92ZXJsYXA6IGZhbHNlLCBsYXN0T25seTogZmFsc2UgfTtcbiAgICBjYXNlIFJlcG9ydENoYXJ0RGF0YUxhYmVscy5BdXRvOlxuICAgICAgcmV0dXJuIHsgdGV4dCwgaGlkZU92ZXJsYXA6IHRydWUsIGxhc3RPbmx5OiBmYWxzZSB9O1xuICAgIGNhc2UgUmVwb3J0Q2hhcnREYXRhTGFiZWxzLkxhc3Q6XG4gICAgICByZXR1cm4geyB0ZXh0LCBoaWRlT3ZlcmxhcDogZmFsc2UsIGxhc3RPbmx5OiB0cnVlIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vIEEgc2VyaWVzJyBkYXRhIGxhYmVscyBhdCBgcG9zaXRpb25gOiBvbiB0aGUgc2VyaWVzICgnYWxsJywgYW5kIHdpdGggdGhlXG4vLyBvdmVybGFwIGhpZGluZyAnYXV0bycpLCBvciBvbiBpdHMgbGF0ZXN0IG5vbi1lbXB0eSBwb2ludCBhbG9uZSAoJ2xhc3QnKS5cbi8vIE5vIGxhYmVscyBsZWF2ZSB0aGUgc2VyaWVzIGFuZCBpdHMgcG9pbnRzIGFzIHRoZXkgd2VyZS5cbmZ1bmN0aW9uIHBsYWNlRGF0YUxhYmVsczxQIGV4dGVuZHMgRGF0YUxhYmVsUG9zaXRpb24+KFxuICBsYWJlbHM6IFNlcmllc0RhdGFMYWJlbHMgfCBudWxsLFxuICBwb3NpdGlvbjogUCxcbiAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbCB8IFNoYXJlRGF0YUl0ZW0pW10sXG4pOiBQbGFjZWREYXRhTGFiZWxzPFA+IHtcbiAgaWYgKCFsYWJlbHMpIHtcbiAgICByZXR1cm4geyBzZXJpZXM6IHt9LCBkYXRhOiB2YWx1ZXMgfTtcbiAgfVxuXG4gIGNvbnN0IGxhYmVsOiBEYXRhTGFiZWw8UD4gPSB7IC4uLmxhYmVscy50ZXh0LCBwb3NpdGlvbiB9O1xuXG4gIGlmIChsYWJlbHMubGFzdE9ubHkpIHtcbiAgICByZXR1cm4geyBzZXJpZXM6IHt9LCBkYXRhOiBsYWJlbExhc3RQb2ludCh2YWx1ZXMsIGxhYmVsKSB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJpZXM6IHsgbGFiZWwsIC4uLihsYWJlbHMuaGlkZU92ZXJsYXAgPyB7IGxhYmVsTGF5b3V0OiB7IGhpZGVPdmVybGFwOiB0cnVlIH0gfSA6IHt9KSB9LFxuICAgIGRhdGE6IHZhbHVlcyxcbiAgfTtcbn1cblxuLy8gQSBzZXJpZXMnIHBvaW50cyB3aXRoIGl0cyBsYXRlc3Qgbm9uLWVtcHR5IHBvaW50IGNhcnJ5aW5nIHRoZSBsYWJlbC4gQVxuLy8gc2VyaWVzIHdpdGggbm8gdmFsdWUgYW55d2hlcmUgaXMgbGVmdCBhcyBpdCB3YXMuXG5mdW5jdGlvbiBsYWJlbExhc3RQb2ludDxQIGV4dGVuZHMgRGF0YUxhYmVsUG9zaXRpb24+KFxuICB2YWx1ZXM6IChudW1iZXIgfCBudWxsIHwgU2hhcmVEYXRhSXRlbSlbXSxcbiAgbGFiZWw6IERhdGFMYWJlbDxQPixcbik6IFNlcmllc0RhdGFJdGVtPFA+W10ge1xuICBjb25zdCBwb2ludFZhbHVlID0gKGl0ZW06IG51bWJlciB8IG51bGwgfCBTaGFyZURhdGFJdGVtKSA9PiAoaXNTaGFyZURhdGFJdGVtKGl0ZW0pID8gaXRlbS52YWx1ZSA6IGl0ZW0pO1xuICBjb25zdCBsYXN0ID0gdmFsdWVzLnJlZHVjZTxudW1iZXI+KChmb3VuZCwgaXRlbSwgaW5kZXgpID0+IChwb2ludFZhbHVlKGl0ZW0pID09PSBudWxsID8gZm91bmQgOiBpbmRleCksIC0xKTtcblxuICByZXR1cm4gdmFsdWVzLm1hcCgoaXRlbSwgaW5kZXgpOiBTZXJpZXNEYXRhSXRlbTxQPiA9PiB7XG4gICAgaWYgKGluZGV4ICE9PSBsYXN0KSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNTaGFyZURhdGFJdGVtKGl0ZW0pID8geyAuLi5pdGVtLCBsYWJlbCB9IDogeyB2YWx1ZTogaXRlbSwgbGFiZWwgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzU2hhcmVEYXRhSXRlbShpdGVtOiBudW1iZXIgfCBudWxsIHwgU2hhcmVEYXRhSXRlbSk6IGl0ZW0gaXMgU2hhcmVEYXRhSXRlbSB7XG4gIHJldHVybiBpdGVtICE9PSBudWxsICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jztcbn1cblxuLy8gSG93IGEgc2VyaWVzJyBkYXRhIGxhYmVscyB3cml0ZSBhIHZhbHVlLiBBIDEwMCUgc3RhY2tlZCBzZXJpZXMgcHJpbnRzIGl0c1xuLy8gc2hhcmUgYXMgYSB3aG9sZSBwZXJjZW50YWdlLCBhcyB0aGUgc2hhcmUgYXhpcydzIHRpY2tzIGRvLiBBIHNlcmllcyBvbiBhblxuLy8gYXhpcyB3aXRoIGEgbnVtYmVyIGZvcm1hdCBwcmludHMgaXRzIHZhbHVlIGluIGl0cyBtZWFzdXJlJ3MgZm9ybWF0LCBhdCB0aGVcbi8vIHVuaXRzIGFuZCBkZWNpbWFscyB0aGUgYXhpcyBkZWNpZGVkLCBzbyBhIGxhYmVsIHJlYWRzIGxpa2UgdGhlIHRpY2tzIGJlc2lkZVxuLy8gaXQuIEFueSBvdGhlciBwcmludHMgdGhlIHBsYWluIGxvY2FsZS1ncm91cGVkIG51bWJlciBpdHMgdG9vbHRpcCBzaG93cy4gQVxuLy8gc2hhcmUgcG9pbnQncyByYXcgdmFsdWUgaXMgd2hhdCBhIGxhYmVsIHJlYWRzIHdoZW4gaXQgY2FycmllcyBvbmUuXG5mdW5jdGlvbiBkYXRhTGFiZWxGb3JtYXR0ZXIoXG4gIG1lYXN1cmU6IENoYXJ0TWVhc3VyZSxcbiAgYXhpc0Zvcm1hdDogVmFsdWVBeGlzRm9ybWF0IHwgbnVsbCxcbiAgc2hhcmU6IGJvb2xlYW4sXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBEYXRhTGFiZWxGb3JtYXR0ZXIge1xuICBpZiAoc2hhcmUpIHtcbiAgICBjb25zdCBwZXJjZW50ID0gd2hvbGVQZXJjZW50Rm9ybWF0dGVyKGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIChwYXJhbXMpID0+IHBlcmNlbnQocGFyYW1zLnZhbHVlKTtcbiAgfVxuXG4gIGlmIChheGlzRm9ybWF0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgdW5pdHM6IGF4aXNGb3JtYXQuY2hhcnQudW5pdHMsIGRlY2ltYWxzOiBheGlzRm9ybWF0LmNoYXJ0LmRlY2ltYWxzIH07XG5cbiAgICByZXR1cm4gKHBhcmFtcykgPT4gZm9ybWF0TnVtYmVyKGRhdGFMYWJlbFZhbHVlKHBhcmFtcyksIG1lYXN1cmUsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIChwYXJhbXMpID0+IGZvcm1hdFBsYWluTnVtYmVyKGRhdGFMYWJlbFZhbHVlKHBhcmFtcyksIGNvbnRleHQubG9jYWxlKTtcbn1cblxuLy8gVGhlIHZhbHVlIGEgZGF0YSBsYWJlbCB3cml0ZXM6IHRoZSByYXcgdmFsdWUgaXRzIHBvaW50IGNhcnJpZXMsIGVsc2UgdGhlXG4vLyBwbG90dGVkIG9uZS5cbmZ1bmN0aW9uIGRhdGFMYWJlbFZhbHVlKHBhcmFtczogRGF0YUxhYmVsUGFyYW1zKTogdW5rbm93biB7XG4gIGNvbnN0IGRhdGEgPSBwYXJhbXMuZGF0YTtcbiAgY29uc3QgcmF3ID0gZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IHJhdz86IHVua25vd24gfSkucmF3IDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiByYXcgPz8gcGFyYW1zLnZhbHVlO1xufVxuXG4vLyBBIDEwMCUgc3RhY2tlZCBjaGFydCdzIHRvb2x0aXA6IHRoZSBjYXRlZ29yeSwgdGhlbiBlYWNoIHNlcmllcyBvbiBpdHMgb3duXG4vLyBsaW5lLCBhIHNoYXJlIGFzIGl0cyBwZXJjZW50YWdlIHRvIG9uZSBkZWNpbWFsIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZSBpdCBjYW1lXG4vLyBmcm9tIGluIGl0cyBtZWFzdXJlJ3MgZm9ybWF0ICgnMjUuMCUgKDEpJyksIGFuZCBhbnkgb3RoZXIgc2VyaWVzIGJ5IGl0cyBvd25cbi8vIHZhbHVlLiBUaGUgY2F0ZWdvcnkgYW5kIHRoZSBzZXJpZXMgbmFtZXMgY29tZSBmcm9tIHRoZSBkYXRhIGFuZCB0aGUgY29uZmlnLFxuLy8gYW5kIEVDaGFydHMgc2V0cyB0aGUgdG9vbHRpcCBhcyBIVE1MLCBzbyBib3RoIGFyZSBlc2NhcGVkLlxuZnVuY3Rpb24gcGVyY2VudFRvb2x0aXAoXG4gIHBhcmFtczogVG9vbHRpcENvbXBvbmVudEZvcm1hdHRlckNhbGxiYWNrUGFyYW1zLFxuICBleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLFxuICBzaGFyZXM6IFBlcmNlbnRTaGFyZXMsXG4gIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zIDogW3BhcmFtc107XG4gIGNvbnN0IGRhdGFJbmRleCA9IGl0ZW1zWzBdPy5kYXRhSW5kZXggPz8gMDtcbiAgY29uc3QgY2F0ZWdvcnkgPSBleHRyYWN0ZWQuY2F0ZWdvcmllc1tkYXRhSW5kZXhdID8/ICcnO1xuICBjb25zdCBoZWFkaW5nID0gZXNjYXBlSHRtbChncmFudWxhcml0eVxuICAgID8gZm9ybWF0UGVyaW9kTGFiZWwoY2F0ZWdvcnksIGdyYW51bGFyaXR5LCB0cnVlLCBjb250ZXh0LmxvY2FsZSwgZGF0ZUxhYmVsKVxuICAgIDogY2F0ZWdvcnkpO1xuICBjb25zdCByYXRpb0NvbnRleHQgPSB7IC4uLmNvbnRleHQsIHJhdGlvUGVyY2VudDogdHJ1ZSB9O1xuXG4gIGNvbnN0IGxpbmVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgY29uc3Qgc2VyaWVzID0gZXh0cmFjdGVkLnNlcmllc1tpdGVtLnNlcmllc0luZGV4ID8/IC0xXTtcbiAgICBjb25zdCBtYXJrZXIgPSB0eXBlb2YgaXRlbS5tYXJrZXIgPT09ICdzdHJpbmcnID8gaXRlbS5tYXJrZXIgOiAnJztcbiAgICBjb25zdCBsYWJlbCA9IGAke21hcmtlcn0gJHtlc2NhcGVIdG1sKGl0ZW0uc2VyaWVzTmFtZSA/PyBzZXJpZXM/Lm5hbWUgPz8gJycpfWA7XG4gICAgY29uc3QgdmFsdWUgPSBzZXJpZXNUb29sdGlwKHNlcmllcz8ubWVhc3VyZSwgY29udGV4dCkudmFsdWVGb3JtYXR0ZXIoc2VyaWVzPy52YWx1ZXNbaXRlbS5kYXRhSW5kZXhdID8/IG51bGwpO1xuICAgIGNvbnN0IHNoYXJlID0gc2hhcmVzLmdldChpdGVtLnNlcmllc0luZGV4ID8/IC0xKT8uW2l0ZW0uZGF0YUluZGV4XSA/PyBudWxsO1xuXG4gICAgcmV0dXJuIHNoYXJlID09PSBudWxsXG4gICAgICA/IGAke2xhYmVsfTogJHt2YWx1ZX1gXG4gICAgICA6IGAke2xhYmVsfTogJHtmb3JtYXROdW1iZXIoc2hhcmUsIFBFUkNFTlRfU0hBUkVfRk9STUFULCByYXRpb0NvbnRleHQpfSAoJHt2YWx1ZX0pYDtcbiAgfSk7XG5cbiAgcmV0dXJuIFtoZWFkaW5nLCAuLi5saW5lc10uam9pbignPGJyLz4nKTtcbn1cblxuLy8gQSB2YWx1ZSBheGlzOiBpdHMgdGl0bGUgYW5kIHJhbmdlIGZyb20gdGhlIGNvbmZpZywgaXRzIHRpY2sgbGFiZWxzIGZyb21cbi8vIHZhbHVlQXhpc0xhYmVsLiBBIHZlcnRpY2FsIGNoYXJ0J3MgdGl0bGUgc2l0cyBhYm92ZSB0aGUgYXhpcyBsaW5lLCByZWFkaW5nXG4vLyBhd2F5IGZyb20gdGhlIHBsb3QncyBlZGdlOyBhIGhvcml6b250YWwgY2hhcnQncyBpcyBjZW50ZXJlZCBiZWxvdyB0aGUgdGlja3MuXG4vLyBBIGJvdW5kIG9yIGludGVydmFsIHRoYXQgaXMgbm90IGEgdXNhYmxlIG51bWJlciBpcyBsZWZ0IHRvIEVDaGFydHMuIEEgMTAwJVxuLy8gc3RhY2tlZCBjaGFydCdzIHNoYXJlIGF4aXMgKGV4dHJhcy5wZXJjZW50TWluKSBoYXMgaXRzIG93biBmaXhlZCByYW5nZS5cbmZ1bmN0aW9uIHZhbHVlQXhpc09wdGlvbihcbiAgYXhpczogQ2hhcnRWYWx1ZUF4aXMgfCB1bmRlZmluZWQsXG4gIGhvcml6b250YWw6IGJvb2xlYW4sXG4gIGF4aXNMYWJlbDogVmFsdWVBeGlzTGFiZWwsXG4gIGV4dHJhczogVmFsdWVBeGlzRXh0cmFzID0ge30sXG4pIHtcbiAgY29uc3QgcmFuZ2UgPSBleHRyYXMucGVyY2VudE1pbiA9PT0gdW5kZWZpbmVkXG4gICAgPyB2YWx1ZUF4aXNSYW5nZShheGlzKVxuICAgIDogeyBtaW46IGV4dHJhcy5wZXJjZW50TWluLCBtYXg6IFBFUkNFTlRfQVhJU19NQVgsIGludGVydmFsOiBQRVJDRU5UX0FYSVNfSU5URVJWQUwgfTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICd2YWx1ZScgYXMgY29uc3QsXG4gICAgbmFtZTogYXhpcz8ubGFiZWwgfHwgdW5kZWZpbmVkLFxuICAgIG5hbWVMb2NhdGlvbjogaG9yaXpvbnRhbCA/ICdtaWRkbGUnIGFzIGNvbnN0IDogJ2VuZCcgYXMgY29uc3QsXG4gICAgbmFtZUdhcDogaG9yaXpvbnRhbCA/IDI4IDogMTAsXG4gICAgbmFtZVRleHRTdHlsZTogaG9yaXpvbnRhbCA/IHVuZGVmaW5lZCA6IHsgYWxpZ246IGV4dHJhcy5pbmRleCA9PT0gMSA/ICdyaWdodCcgYXMgY29uc3QgOiAnbGVmdCcgYXMgY29uc3QgfSxcbiAgICAvLyBBIHBpbm5lZCBib3VuZCB3aW5zOyBvbmUgbGVmdCBvcGVuIHJlYWNoZXMgdGhlIHJlZmVyZW5jZXMgKHJlYWNoTWluKS5cbiAgICBtaW46IHJhbmdlLm1pbiA/PyByZWFjaE1pbihleHRyYXMucmVhY2gpLFxuICAgIG1heDogcmFuZ2UubWF4ID8/IHJlYWNoTWF4KGV4dHJhcy5yZWFjaCksXG4gICAgaW50ZXJ2YWw6IHJhbmdlLmludGVydmFsLFxuICAgIGF4aXNMYWJlbCxcbiAgfTtcbn1cblxuLy8gVGhlIHBhcnQgb2YgYSB2YWx1ZSBheGlzJ3MgcmFuZ2UgdGhlIGNvbmZpZyBwaW5zLiBBIGJvdW5kIHRoYXQgaXMgbm90IGFcbi8vIGZpbml0ZSBudW1iZXIsIG9yIGFuIGludGVydmFsIHRoYXQgaXMgbm90IGEgcG9zaXRpdmUgb25lLCBpcyBsZWZ0IG91dCwgYW5kXG4vLyB0aGUgY2hhcnQgcGlja3MgaXQgZnJvbSB0aGUgZGF0YS4gU2hhcmVkIHdpdGggdGhlIFBvd2VyUG9pbnQgZXhwb3J0IHNvIGJvdGhcbi8vIG1lZGlhIGRyYXcgdGhlIHNhbWUgcmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVBeGlzUmFuZ2UoYXhpczogQ2hhcnRWYWx1ZUF4aXMgfCB1bmRlZmluZWQpOiB7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyOyBpbnRlcnZhbD86IG51bWJlciB9IHtcbiAgY29uc3QgaW50ZXJ2YWwgPSBheGlzTnVtYmVyKGF4aXM/LmludGVydmFsKTtcblxuICByZXR1cm4ge1xuICAgIG1pbjogYXhpc051bWJlcihheGlzPy5taW4pLFxuICAgIG1heDogYXhpc051bWJlcihheGlzPy5tYXgpLFxuICAgIGludGVydmFsOiBpbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmIGludGVydmFsID4gMCA/IGludGVydmFsIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHR3by1heGlzIGNoYXJ0J3MgdmFsdWUgYXhlczogdGhlIHByaW1hcnkgb24gdGhlIGxlZnQsIHRoZSBzZWNvbmQgb24gdGhlXG4vLyByaWdodCB3aXRob3V0IGdyaWRsaW5lcyBvZiBpdHMgb3duLiBFYWNoIGF4aXMncyB0aWNrcyB0YWtlIHRoZSBmb3JtYXQgb2YgdGhlXG4vLyBtZWFzdXJlcyBwbG90dGVkIGFnYWluc3QgaXQuIFdpdGhvdXQgYSByYW5nZSBvbiBlaXRoZXIgYXhpcyB0aGUgc2Vjb25kIGF4aXNcbi8vIGFsaWducyBpdHMgdGlja3MgdG8gdGhlIHByaW1hcnkncyBncmlkbGluZXMuXG4vL1xuLy8gT24gYSAxMDAlIHN0YWNrZWQgY2hhcnQgKHBlcmNlbnRNaW4gc2V0KSB0aGUgcHJpbWFyeSBheGlzIGlzIHRoZSBzaGFyZSBheGlzLFxuLy8gd2hvc2UgcmFuZ2UgaXMgZml4ZWQsIGFuZCB0aGUgc2Vjb25kIGF4aXMncyBzZXJpZXMgYXJlIG5vdCBzdGFja2VkLlxuZnVuY3Rpb24gdHdvVmFsdWVBeGVzT3B0aW9uKFxuICBjb25maWc6IENoYXJ0Q29uZmlnLFxuICBheGlzRm9ybWF0czogKFZhbHVlQXhpc0Zvcm1hdCB8IG51bGwpW10sXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIHBlcmNlbnRNaW46IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgcmVmZXJlbmNlczogRHJhd25SZWZlcmVuY2VbXSxcbikge1xuICBjb25zdCBwZXJjZW50ID0gcGVyY2VudE1pbiAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBsYWJlbCA9IChheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4KSA9PiB2YWx1ZUF4aXNMYWJlbChheGlzRm9ybWF0c1theGlzSW5kZXhdID8/IG51bGwsIGNvbnRleHQpO1xuXG4gIHJldHVybiBbXG4gICAgdmFsdWVBeGlzT3B0aW9uKGNvbmZpZy52YWx1ZUF4aXMsIGZhbHNlLCBwZXJjZW50ID8gcGVyY2VudEF4aXNMYWJlbChjb250ZXh0KSA6IGxhYmVsKDApLCB7XG4gICAgICBpbmRleDogMCxcbiAgICAgIHBlcmNlbnRNaW4sXG4gICAgICByZWFjaDogcmVmZXJlbmNlUmVhY2gocmVmZXJlbmNlcywgMCksXG4gICAgfSksXG4gICAge1xuICAgICAgLi4udmFsdWVBeGlzT3B0aW9uKGNvbmZpZy5zZWNvbmRhcnlBeGlzLCBmYWxzZSwgbGFiZWwoMSksIHsgaW5kZXg6IDEsIHJlYWNoOiByZWZlcmVuY2VSZWFjaChyZWZlcmVuY2VzLCAxKSB9KSxcbiAgICAgIHBvc2l0aW9uOiAncmlnaHQnIGFzIGNvbnN0LFxuICAgICAgc3BsaXRMaW5lOiB7IHNob3c6IGZhbHNlIH0sXG4gICAgICBhbGlnblRpY2tzOiAhcGVyY2VudCAmJiAhaGFzQXhpc1JhbmdlKGNvbmZpZy52YWx1ZUF4aXMpICYmICFoYXNBeGlzUmFuZ2UoY29uZmlnLnNlY29uZGFyeUF4aXMpLFxuICAgIH0sXG4gIF07XG59XG5cbi8vIFdoZXRoZXIgdGhlIGNvbmZpZyBwaW5zIGFueSBvZiBhbiBheGlzJ3MgcmFuZ2U6IGEgYm91bmQgb3IgYSB0aWNrIGludGVydmFsLlxuZnVuY3Rpb24gaGFzQXhpc1JhbmdlKGF4aXM6IENoYXJ0VmFsdWVBeGlzIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHZhbHVlQXhpc1JhbmdlKGF4aXMpKS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCk7XG59XG5cbi8vIEEgY29uZmlndXJlZCBib3VuZCBvciBpbnRlcnZhbCB3aGVuIGl0IGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSB1bmRlZmluZWQuXG5mdW5jdGlvbiBheGlzTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vLyBBIHZhbHVlIGF4aXMncyB0aWNrIGxhYmVscy5cbmludGVyZmFjZSBWYWx1ZUF4aXNMYWJlbCB7XG4gIGZvcm1hdHRlcjogKHZhbHVlOiBudW1iZXIpID0+IHN0cmluZztcbn1cblxuLy8gVGljayBsYWJlbHMgd3JpdHRlbiBpbiB0aGUgbG9jYWxlLiBFQ2hhcnRzJyBvd24gdGlja3MgYXJlIGdyb3VwZWQgZW4tVVNcbi8vIHdoYXRldmVyIHRoZSBwYWdlJ3MgbGFuZ3VhZ2UuXG4vL1xuLy8gV2l0aCBhIG51bWJlciBmb3JtYXQsIHRoZSB1bml0cyBhbmQgZGVjaW1hbHMgZGVjaWRlZCBvbmNlIGZvciB0aGUgd2hvbGVcbi8vIGF4aXMgKHJlc29sdmVWYWx1ZUF4aXNGb3JtYXQpIHdyaXRlIGV2ZXJ5IHRpY2sgYWxpa2UgKCcxLjVLJywgJzIuMEsnLCBuZXZlclxuLy8gJzJLJykuIFdpdGhvdXQgb25lLCBvciB3aGVuIGl0IGxlYXZlcyB0aGUgdGlja3MgYW4gdW5zY2FsZWQgbnVtYmVyIHdpdGggbm9cbi8vIHBpbm5lZCBkZWNpbWFscyAoZm9ybWF0ICdudW1iZXInLCBvciBwcmVjaXNpb24tbGVzcyB1bml0cyBub25lKSwgZWFjaCB0aWNrXG4vLyBpcyBhIHBsYWluIGxvY2FsZS1ncm91cGVkIG51bWJlciBrZWVwaW5nIGl0cyBvd24gZGVjaW1hbHMsIHNvIGEgMC4wMDAyIHRpY2tcbi8vIG5ldmVyIHJvdW5kcyB0byAnMCcuXG5mdW5jdGlvbiB2YWx1ZUF4aXNMYWJlbChmb3JtYXQ6IFZhbHVlQXhpc0Zvcm1hdCB8IG51bGwsIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiBWYWx1ZUF4aXNMYWJlbCB7XG4gIGlmICghZm9ybWF0IHx8IChmb3JtYXQuY2hhcnQudW5pdHMgPT09IFJlcG9ydE51bWJlclVuaXRzLk5vbmUgJiYgZm9ybWF0LmNoYXJ0LmRlY2ltYWxzID09PSBudWxsKSkge1xuICAgIHJldHVybiB7IGZvcm1hdHRlcjogKHZhbHVlOiBudW1iZXIpID0+IGZvcm1hdFBsYWluTnVtYmVyKHZhbHVlLCBjb250ZXh0LmxvY2FsZSkgfTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSB7IHVuaXRzOiBmb3JtYXQuY2hhcnQudW5pdHMsIGRlY2ltYWxzOiBmb3JtYXQuY2hhcnQuZGVjaW1hbHMgfTtcblxuICByZXR1cm4ge1xuICAgIGZvcm1hdHRlcjogKHZhbHVlOiBudW1iZXIpID0+IGZvcm1hdE51bWJlcih2YWx1ZSwgZm9ybWF0LnNwZWMsIGNvbnRleHQsIG9wdGlvbnMpLFxuICB9O1xufVxuXG4vLyBBbiBheGlzJ3MgZm9ybWF0IGZyb20gdGhlIHNwZWMgaXRzIG1lYXN1cmVzIGFncmVlIG9uLCB3aXRoIHRoZSB1bml0cyBhbmRcbi8vIGRlY2ltYWxzIGRlY2lkZWQgZnJvbSBpdHMgcGVhay4gV2l0aG91dCBhIHNwZWMgdGhlIGF4aXMgaXMgcGxhaW4sIGFuZCB0aGVcbi8vIHBlYWsgaXMgbmV2ZXIgY29tcHV0ZWQuXG5mdW5jdGlvbiByZXNvbHZlVmFsdWVBeGlzRm9ybWF0KFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCxcbiAgcGVhazogKCkgPT4gbnVtYmVyLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogVmFsdWVBeGlzRm9ybWF0IHwgbnVsbCB7XG4gIHJldHVybiBzcGVjID8geyBzcGVjLCBjaGFydDogcmVzb2x2ZUNoYXJ0TnVtYmVyRm9ybWF0KHNwZWMsIHBlYWsoKSwgY29udGV4dCkgfSA6IG51bGw7XG59XG5cbi8vIEVhY2ggdmFsdWUgYXhpcydzIGZvcm1hdCwgYnkgYXhpcyBpbmRleC4gQSBjaGFydCB3aXRoIG9uZSB2YWx1ZSBheGlzIHRha2VzXG4vLyB0aGUgZm9ybWF0IHRoZSBwbG90dGVkIHNlcmllcycgbWVhc3VyZXMgYWdyZWUgb24gKGEgc3BsaXRCeSBvciBjb2xvckJ5IGNoYXJ0XG4vLyBwbG90cyBvbmx5IGl0cyBmaXJzdCBtZWFzdXJlKSwgZnJvbSB0aGUgcGVhayBvZiBhbGwgaXRzIHNlcmllcy4gT24gYSB0d28tYXhpcyBjaGFydCBlYWNoIGF4aXMgdGFrZXMgdGhlIGZvcm1hdCBvZiB0aGUgbWVhc3VyZXNcbi8vIHBsb3R0ZWQgYWdhaW5zdCBpdCwgZnJvbSB0aGUgcGVhayBvZiBpdHMgb3duIHNlcmllcywgd2hpY2ggYXJlIG5ldmVyXG4vLyBzdGFja2VkIHdpdGggYSAxMDAlIHN0YWNrZWQgY2hhcnQncyBzaGFyZXMuIEEgcmVmZXJlbmNlIHBhc3QgdGhlIGRhdGFcbi8vIHN0cmV0Y2hlcyBpdHMgYXhpcywgc28gaXQgY291bnRzIHRvd2FyZCB0aGUgcGVhayAocmVmZXJlbmNlUGVhayk7IGEgMTAwJVxuLy8gc3RhY2tlZCBjaGFydCdzIHJlZmVyZW5jZXMgYXJlIHNoYXJlcywgd2hpY2ggdGhlIHJhdyB2YWx1ZXMnIHBlYWsgbGVhdmVzXG4vLyBvdXQuXG5mdW5jdGlvbiB2YWx1ZUF4aXNGb3JtYXRzKFxuICBjb25maWc6IENoYXJ0Q29uZmlnLFxuICBleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLFxuICBheGlzSW5kZXhlczogVmFsdWVBeGlzSW5kZXhbXSxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcGVyY2VudDogYm9vbGVhbixcbiAgcmVmZXJlbmNlczogRHJhd25SZWZlcmVuY2VbXSxcbik6IChWYWx1ZUF4aXNGb3JtYXQgfCBudWxsKVtdIHtcbiAgY29uc3QgcmVhY2ggPSAoYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleCkgPT4gKHBlcmNlbnQgJiYgYXhpc0luZGV4ID09PSAwID8gMCA6IHJlZmVyZW5jZVBlYWsocmVmZXJlbmNlcywgYXhpc0luZGV4KSk7XG5cbiAgaWYgKCFheGlzSW5kZXhlcy5pbmNsdWRlcygxKSkge1xuICAgIHJldHVybiBbcmVzb2x2ZVZhbHVlQXhpc0Zvcm1hdChcbiAgICAgIGF4aXNOdW1iZXJGb3JtYXQoZXh0cmFjdGVkLnNlcmllcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLm1lYXN1cmUpKSxcbiAgICAgICgpID0+IE1hdGgubWF4KGNoYXJ0VmFsdWVQZWFrKGV4dHJhY3RlZC5zZXJpZXMubWFwKChzZXJpZXMpID0+IHNlcmllcy52YWx1ZXMpLCAhIWNvbmZpZy5zdGFja2VkKSwgcmVhY2goMCkpLFxuICAgICAgY29udGV4dCxcbiAgICApXTtcbiAgfVxuXG4gIHJldHVybiAoWzAsIDFdIGFzIGNvbnN0KS5tYXAoKGF4aXNJbmRleCkgPT4ge1xuICAgIGNvbnN0IG9uQXhpcyA9IGV4dHJhY3RlZC5zZXJpZXMuZmlsdGVyKChfLCBpbmRleCkgPT4gYXhpc0luZGV4ZXNbaW5kZXhdID09PSBheGlzSW5kZXgpO1xuXG4gICAgcmV0dXJuIHJlc29sdmVWYWx1ZUF4aXNGb3JtYXQoXG4gICAgICBheGlzTnVtYmVyRm9ybWF0KG9uQXhpcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLm1lYXN1cmUpKSxcbiAgICAgICgpID0+IE1hdGgubWF4KGNoYXJ0VmFsdWVQZWFrKG9uQXhpcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLnZhbHVlcyksICEhY29uZmlnLnN0YWNrZWQgJiYgIXBlcmNlbnQpLCByZWFjaChheGlzSW5kZXgpKSxcbiAgICAgIGNvbnRleHQsXG4gICAgKTtcbiAgfSk7XG59XG5cbi8vIEEgMTAwJSBzdGFja2VkIGNoYXJ0J3Mgc2hhcmUgYXhpcyB0aWNrczogd2hvbGUgcGVyY2VudGFnZXMgaW4gdGhlIGxvY2FsZVxuLy8gKCcyNSUnLCAnMjUgJScgaW4gZnItQ0EpLiBUaGUgc2hhcmVzIGFyZSByYXRpb3Mgd2hhdGV2ZXIgdGhlIHJlcG9ydCdzXG4vLyBwZXJjZW50Rm9ybWF0IHNheXMgb2YgaXRzIHN0b3JlZCB2YWx1ZXMuXG5mdW5jdGlvbiBwZXJjZW50QXhpc0xhYmVsKGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiBWYWx1ZUF4aXNMYWJlbCB7XG4gIHJldHVybiB7IGZvcm1hdHRlcjogd2hvbGVQZXJjZW50Rm9ybWF0dGVyKGNvbnRleHQpIH07XG59XG5cbi8vIEEgc2hhcmUgYXMgYSB3aG9sZSBwZXJjZW50YWdlIGluIHRoZSBsb2NhbGUsIGZvciB0aGUgc2hhcmUgYXhpcydzIHRpY2tzIGFuZFxuLy8gaXRzIHNlcmllcycgZGF0YSBsYWJlbHMuXG5mdW5jdGlvbiB3aG9sZVBlcmNlbnRGb3JtYXR0ZXIoY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHtcbiAgY29uc3QgcmF0aW9Db250ZXh0ID0geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfTtcblxuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiBmb3JtYXROdW1iZXIodmFsdWUsIFBFUkNFTlRfQVhJU19GT1JNQVQsIHJhdGlvQ29udGV4dCk7XG59XG5cbi8vIFdoYXQgYSBzZXJpZXMnIHRvb2x0aXAgd3JpdGVzIGJlc2lkZSBpdHMgbmFtZS5cbmludGVyZmFjZSBTZXJpZXNUb29sdGlwIHtcbiAgdmFsdWVGb3JtYXR0ZXI6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nO1xufVxuXG4vLyBBIHNlcmllcycgdG9vbHRpcCB2YWx1ZSBpbiBpdHMgbWVhc3VyZSdzIG51bWJlciBmb3JtYXQsIHBlciB2YWx1ZSAoJ+KAlCcgd2hlblxuLy8gZW1wdHkpLiBBIG1lYXN1cmUgd2l0aG91dCBvbmUgd3JpdGVzIGl0IGFzIHRoZSBwbGFpbiB2YWx1ZSBheGlzIGRvZXMuIEFcbi8vIHZhbHVlIGNhbiBhcnJpdmUgYXMgYW4gYXJyYXkgKGEgW3ZhbHVlLCAuLi5dIGRhdGEgaXRlbSksIHdob3NlIGZpcnN0IGVudHJ5XG4vLyBpcyB0aGUgdmFsdWUuXG5mdW5jdGlvbiBzZXJpZXNUb29sdGlwKG1lYXN1cmU6IENoYXJ0TWVhc3VyZSB8IHVuZGVmaW5lZCwgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6IFNlcmllc1Rvb2x0aXAge1xuICBpZiAoIWhhc051bWJlckZvcm1hdChtZWFzdXJlKSkge1xuICAgIHJldHVybiB7IHZhbHVlRm9ybWF0dGVyOiAodmFsdWU6IHVua25vd24pID0+IGZvcm1hdFBsYWluTnVtYmVyKHZhbHVlLCBjb250ZXh0LmxvY2FsZSkgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWVGb3JtYXR0ZXI6ICh2YWx1ZTogdW5rbm93bikgPT4gZm9ybWF0TnVtYmVyKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZSwgbWVhc3VyZSwgY29udGV4dCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGllT3B0aW9uKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgZG9udXQ6IGJvb2xlYW4sXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBFQ2hhcnRzT3B0aW9uIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdENoYXJ0U2VyaWVzKGNvbXBvbmVudCwgZGF0YSk7XG4gIGNvbnN0IHZhbHVlcyA9IGV4dHJhY3RlZC5zZXJpZXNbMF0/LnZhbHVlcyA/PyBbXTtcbiAgY29uc3QgbGVnZW5kUG9zaXRpb24gPSByZXNvbHZlTGVnZW5kUG9zaXRpb24oY29uZmlnLCBleHRyYWN0ZWQuc2VyaWVzLmxlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b29sdGlwOiB7IHRyaWdnZXI6ICdpdGVtJyB9LFxuICAgIGxlZ2VuZDogbGVnZW5kT3B0aW9uKGxlZ2VuZFBvc2l0aW9uKSxcbiAgICBzZXJpZXM6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3BpZScsXG4gICAgICAgIHJhZGl1czogZG9udXQgPyBbJzQ1JScsICc3MiUnXSA6ICc3MiUnLFxuICAgICAgICBjZW50ZXI6IHBpZUNlbnRlcihsZWdlbmRQb3NpdGlvbiksXG4gICAgICAgIHRvb2x0aXA6IHNlcmllc1Rvb2x0aXAoZXh0cmFjdGVkLnNlcmllc1swXT8ubWVhc3VyZSwgY29udGV4dCksXG4gICAgICAgIGxhYmVsOiB7IHNob3c6IGZhbHNlIH0sXG4gICAgICAgIGRhdGE6IGV4dHJhY3RlZC5jYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnksIGluZGV4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbaW5kZXhdID8/IDAsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn1cblxuLy8gTnVkZ2UgdGhlIHBpZSBvZmYtY2VudGVyIHRvd2FyZCB0aGUgb3Bwb3NpdGUgZWRnZSBmcm9tIGl0cyBsZWdlbmQgc28gdGhlIHR3b1xuLy8gZG9uJ3QgY29sbGlkZTsgY2VudGVyZWQgd2hlbiB0aGUgbGVnZW5kIGlzIGhpZGRlbi5cbmZ1bmN0aW9uIHBpZUNlbnRlcihwb3NpdGlvbjogTGVnZW5kUG9zaXRpb24pOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgcmV0dXJuIFsnNjAlJywgJzUwJSddO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiBbJzQwJScsICc1MCUnXTtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgcmV0dXJuIFsnNTAlJywgJzU4JSddO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4gWyc1MCUnLCAnNDYlJ107XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbJzUwJScsICc1MCUnXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bmlxdWVWYWx1ZXMocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgY29sdW1uOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDx1bmtub3duPigpO1xuICBjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uXTtcbiAgICBpZiAoIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIG51bWVyaWModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGw7XG59XG5cbi8vIFRoZSBlZmZlY3RpdmUgdGltZSBidWNrZXQgdGhlIHJvd3Mgd2VyZSBncm91cGVkIGludG8gKGZyb20gdGhlIGRhdGEgZW5kcG9pbnQpLFxuLy8gb3IgbnVsbCB3aGVuIHRoZSB4LWF4aXMgaXNuJ3QgYSB0aW1lIGF4aXMg4oCUIGdhdGVzIHRoZSBjb21wYWN0IHBlcmlvZCBsYWJlbHMuXG5mdW5jdGlvbiBidWNrZXRHcmFudWxhcml0eShkYXRhOiBDb21wb25lbnREYXRhKTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwge1xuICByZXR1cm4gZGF0YS5ncmFudWxhcml0eSAmJiBHUkFOVUxBUklUWV9PUFRJT05TLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBkYXRhLmdyYW51bGFyaXR5KVxuICAgID8gZGF0YS5ncmFudWxhcml0eVxuICAgIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciB0aGUgcGVyaW9kLXN0YXJ0IGNhdGVnb3JpZXMgY3Jvc3MgYSB5ZWFyIGJvdW5kYXJ5LiBXaGVuIHRoZXkgZG9uJ3QsXG4vLyB0aGUgeWVhciBpcyBwdXJlIG5vaXNlIG9uIGV2ZXJ5IGxhYmVsLCBzbyBpdCdzIGRyb3BwZWQgZW50aXJlbHkuXG5leHBvcnQgZnVuY3Rpb24gc3BhbnNNdWx0aXBsZVllYXJzKGNhdGVnb3JpZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHllYXJzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgY2F0ZWdvcmllcykge1xuICAgIGNvbnN0IGRhdGUgPSBwYXJzZUlTTyhjYXRlZ29yeSk7XG4gICAgaWYgKGlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgIHllYXJzLmFkZChkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB5ZWFycy5zaXplID4gMTtcbn1cblxuLy8gQSB0aW1lIGF4aXMncyBkYXRlIGxhYmVsIHN0eWxlIHdoZW4gaXRzIGNvbmZpZyBuYW1lcyBvbmUgdGhlIHZpZXdlciBrbm93cyxcbi8vIGVsc2Ugc2hvcnQuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnREYXRlTGFiZWwoY29uZmlnOiBDaGFydENvbmZpZyB8IHVuZGVmaW5lZCk6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUmVwb3J0Q2hhcnREYXRlTGFiZWwpLmZpbmQoKHN0eWxlKSA9PiBzdHlsZSA9PT0gY29uZmlnPy54QXhpcz8uZGF0ZUxhYmVsKVxuICAgID8/IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLlNob3J0O1xufVxuXG4vLyBBIGJ1Y2tldCdzIHBlcmlvZC1zdGFydCBzcGxpdCBpbnRvIGl0cyBwcmltYXJ5IGxhYmVsIGFuZCBpdHMgeWVhci4gQSB5ZWFyXG4vLyByZWFkcyBcIjIwMjVcIiBpbiBldmVyeSBzdHlsZS4gU2hvcnQsIGluIHRoZSBsb2NhbGU6IGRheS93ZWVrIHJlYWQgXCJNYXkgMVwiXG4vLyAoJzEgbWFpJyBpbiBmci1DQSksIG1vbnRoIFwiTWF5XCIgKCdtYWknKSwgcXVhcnRlciBcIlEyXCIgKCdUMicgaW4gRnJlbmNoKS5cbi8vIExvbmcgY2FycmllcyBpdHMgeWVhciwgaW4gdGhlIGxvY2FsZTogXCJNYXkgMSwgMjAyNlwiLCBcIk1heSAyMDI2XCIgKCdtYWlcbi8vIDIwMjYnKSwgXCJRMiAyMDI2XCIuIE51bWVyaWMgaXMgdGhlIHNhbWUgaW4gZXZlcnkgbG9jYWxlOiBcIjIwMjYtMDUtMDFcIixcbi8vIFwiMjAyNi0wNVwiLCBcIjIwMjYtUTJcIi4gUmV0dXJucyBudWxsIGZvciBhIHZhbHVlIHRoYXQgaXNuJ3QgYSBwYXJzZWFibGUgZGF0ZVxuLy8gKGxlZnQgYXMtaXMgYnkgY2FsbGVycykuXG5mdW5jdGlvbiBwZXJpb2RMYWJlbFBhcnRzKFxuICB2YWx1ZTogc3RyaW5nLFxuICBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGRhdGVMYWJlbDogUmVwb3J0Q2hhcnREYXRlTGFiZWwgPSBSZXBvcnRDaGFydERhdGVMYWJlbC5TaG9ydCxcbik6IHsgcHJpbWFyeTogc3RyaW5nOyB5ZWFyOiBzdHJpbmcgfSB8IG51bGwge1xuICBjb25zdCBkYXRlID0gcGFyc2VJU08odmFsdWUpO1xuICBpZiAoIWlzVmFsaWQoZGF0ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHllYXIgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgaWYgKGdyYW51bGFyaXR5ID09PSAneWVhcicpIHtcbiAgICByZXR1cm4geyBwcmltYXJ5OiB5ZWFyLCB5ZWFyIH07XG4gIH1cblxuICByZXR1cm4geyBwcmltYXJ5OiBwZXJpb2RQcmltYXJ5TGFiZWwoZGF0ZSwgZ3JhbnVsYXJpdHksIGxvY2FsZSwgZGF0ZUxhYmVsKSwgeWVhciB9O1xufVxuXG4vLyBBIHBlcmlvZCdzIGxhYmVsIGluIHRoZSBzdHlsZSBhc2tlZCBmb3IsIHRoZSB5ZWFyIGFzaWRlIChzZWVcbi8vIHBlcmlvZExhYmVsUGFydHMpLlxuZnVuY3Rpb24gcGVyaW9kUHJpbWFyeUxhYmVsKFxuICBkYXRlOiBEYXRlLFxuICBncmFudWxhcml0eTogRXhjbHVkZTxDaGFydEdyYW51bGFyaXR5LCAneWVhcic+LFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHllYXIgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgY29uc3QgcXVhcnRlciA9IE1hdGguZmxvb3IoZGF0ZS5nZXRNb250aCgpIC8gMykgKyAxO1xuXG4gIGlmIChkYXRlTGFiZWwgPT09IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLk51bWVyaWMpIHtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBzd2l0Y2ggKGdyYW51bGFyaXR5KSB7XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LVEke3F1YXJ0ZXJ9YDtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9YDtcbiAgICAgIGRlZmF1bHQ6IC8vIGRheSwgd2VlayDigJQgdGhlIGJ1Y2tldCBzdGFydFxuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb25nID0gZGF0ZUxhYmVsID09PSBSZXBvcnRDaGFydERhdGVMYWJlbC5Mb25nO1xuICBzd2l0Y2ggKGdyYW51bGFyaXR5KSB7XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4gbG9uZ1xuICAgICAgICA/IGAke3F1YXJ0ZXJQcmVmaXgobG9jYWxlKX0ke3F1YXJ0ZXJ9ICR7eWVhcn1gXG4gICAgICAgIDogYCR7cXVhcnRlclByZWZpeChsb2NhbGUpfSR7cXVhcnRlcn1gO1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb2NhbERhdGUoZGF0ZSwgbG9jYWxlLCBsb25nID8gTU9OVEhfWUVBUiA6IE1PTlRIX0xPTkcpO1xuICAgIGRlZmF1bHQ6IC8vIGRheSwgd2VlayDigJQgdGhlIGJ1Y2tldCBzdGFydCBhcyBhIG1vbnRoIGFuZCBkYXlcbiAgICAgIHJldHVybiBmb3JtYXRMb2NhbERhdGUoZGF0ZSwgbG9jYWxlLCBsb25nID8gREFZX1NIT1JUIDogTU9OVEhfREFZKTtcbiAgfVxufVxuXG4vLyBXaGV0aGVyIGEgcGVyaW9kIGxhYmVsIGxlYXZlcyBpdHMgeWVhciB0byBiZSBhZGRlZCBhcGFydDogb25seSBhIHNob3J0IG9uZVxuLy8gZG9lcywgYSBsb25nIG9yIG51bWVyaWMgbGFiZWwgYWxyZWFkeSBjYXJyaWVzIGl0LlxuZnVuY3Rpb24gcGVyaW9kWWVhckFwYXJ0KGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5LCBkYXRlTGFiZWw6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBncmFudWxhcml0eSAhPT0gJ3llYXInICYmIGRhdGVMYWJlbCA9PT0gUmVwb3J0Q2hhcnREYXRlTGFiZWwuU2hvcnQ7XG59XG5cbmZ1bmN0aW9uIHF1YXJ0ZXJQcmVmaXgobG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICByZXR1cm4gUVVBUlRFUl9QUkVGSVhFUy5nZXQobG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKSkgPz8gUVVBUlRFUl9QUkVGSVg7XG59XG5cbi8vIEEgY29tcGFjdCBzaW5nbGUtbGluZSBwZXJpb2QgbGFiZWwg4oCUIGZvciBtZWRpYSB0aGF0IGNhbid0IGRvIGEgc3R5bGVkXG4vLyBzZWNvbmQgbGluZSwgZS5nLiBQb3dlclBvaW50LiBBIHNob3J0IGxhYmVsIGhhcyBpdHMgeWVhciBhcHBlbmRlZCBvbmx5IHdoZW5cbi8vIHRoZSBkYXRhIHNwYW5zIHllYXJzOyBhIGxvbmcgb3IgbnVtZXJpYyBvbmUgYWx3YXlzIGNhcnJpZXMgaXQuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGVyaW9kTGFiZWwoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5LFxuICBtdWx0aVllYXI6IGJvb2xlYW4sXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRlTGFiZWw6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsID0gUmVwb3J0Q2hhcnREYXRlTGFiZWwuU2hvcnQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBlcmlvZExhYmVsUGFydHModmFsdWUsIGdyYW51bGFyaXR5LCBsb2NhbGUsIGRhdGVMYWJlbCk7XG4gIGlmICghcGFydHMpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbXVsdGlZZWFyICYmIHBlcmlvZFllYXJBcGFydChncmFudWxhcml0eSwgZGF0ZUxhYmVsKSA/IGAke3BhcnRzLnByaW1hcnl9ICR7cGFydHMueWVhcn1gIDogcGFydHMucHJpbWFyeTtcbn1cblxuLy8gQSBjcm9zcy10YWIncyBjb2x1bW4gaGVhZGluZ3MsIHRoZSBvbmUgcnVsZSB0aGUgZ3JpZCBhbmQgdGhlIFBERi9Qb3dlclBvaW50XG4vLyBleHBvcnRzIHNoYXJlLiBUaGUgZmlyc3QgaXMgdGhlIHJvdyBrZXkgYW5kIGtlZXBzIGl0cyBhdXRob3JlZCBsYWJlbDsgdGhlXG4vLyByZXN0IGFyZSBwaXZvdCBWQUxVRVMuIFdoZW4gdGhlIHBpdm90IGF4aXMgaXMgYSB0aW1lIGRpbWVuc2lvbiB0aGUgc2VydmVyXG4vLyBzZW5kcyB0aGUgZ3JhaW4gaXQgYnVja2V0ZWQgYXQsIHNvIGEgcGVyaW9kLXN0YXJ0IGxpa2UgXCIyMDI2LTAxLTAxXCIgcmVhZHNcbi8vIFwiSmFudWFyeSAyMDI2XCIgKCdqYW52aWVyIDIwMjYnIGluIGZyLUNBKSwgYXMgdGhlIGNoYXJ0J3MgeC1heGlzIGxhYmVscyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBwaXZvdEhlYWRpbmdzKFxuICBjb25maWc6IExpc3RDb25maWcsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBjb2x1bW5zID0gZGF0YS5jb2x1bW5zID8/IFtdO1xuICBjb25zdCBtdWx0aVllYXIgPSBzcGFuc011bHRpcGxlWWVhcnMoY29sdW1ucyk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5sYWJlbCB8fCBjb2x1bW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnVsYXJpdHkgPyBmb3JtYXRQZXJpb2RMYWJlbChjb2x1bW4sIGRhdGEuZ3JhbnVsYXJpdHksIG11bHRpWWVhciwgbG9jYWxlKSA6IGNvbHVtbjtcbiAgfSk7XG59XG5cbi8vIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucyBhcyB0aGUgZ3JpZCBhbmQgdGhlIGV4cG9ydHMgZHJhdyB0aGVtOiBlYWNoIGhlYWRlZCBieVxuLy8gcGl2b3RIZWFkaW5ncygpLCBhbmQgZXZlcnkgcGl2b3QtdmFsdWUgY29sdW1uIGZvcm1hdHRlZCBieSB0aGUgb25lXG4vLyBjb25maWcuY2VsbEZvcm1hdC4gVGhlIHJvdyBrZXkgY29sdW1uIHN0YXlzIGFzIGl0IGNhbWUuIGBudW1lcmljYCBtYXJrcyB0aGVcbi8vIGNvbHVtbnMgd2hvc2UgY2VsbHMgYXJlIGZvcm1hdHRlZCBudW1iZXJzLCB3aGljaCBhcmUgcmlnaHQtYWxpZ25lZC5cbmV4cG9ydCBmdW5jdGlvbiBwaXZvdENvbHVtblNwZWNzKFxuICBjb25maWc6IExpc3RDb25maWcsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogKExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXSB7XG4gIGNvbnN0IGhlYWRpbmdzID0gcGl2b3RIZWFkaW5ncyhjb25maWcsIGRhdGEsIGxvY2FsZSk7XG4gIGNvbnN0IGNlbGxGb3JtYXQgPSBjb25maWcuY2VsbEZvcm1hdDtcbiAgY29uc3QgbnVtZXJpYyA9IGhhc051bWJlckZvcm1hdChjZWxsRm9ybWF0KTtcbiAgY29uc3QgY2VsbHM6IFBpY2s8TGlzdENvbHVtbiwgJ2Zvcm1hdCcgfCAncHJlY2lzaW9uJyB8ICd1bml0cyc+ID0gbnVtZXJpYyAmJiBjZWxsRm9ybWF0XG4gICAgPyB7IGZvcm1hdDogbGlzdENvbHVtbkZvcm1hdChjZWxsRm9ybWF0LmZvcm1hdCksIHByZWNpc2lvbjogY2VsbEZvcm1hdC5wcmVjaXNpb24sIHVuaXRzOiBjZWxsRm9ybWF0LnVuaXRzIH1cbiAgICA6IHt9O1xuXG4gIHJldHVybiAoZGF0YS5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbiwgaW5kZXgpID0+IGluZGV4ID09PSAwXG4gICAgPyB7IGNvbHVtbiwgbGFiZWw6IGhlYWRpbmdzW2luZGV4XSwgbnVtZXJpYzogZmFsc2UgfVxuICAgIDogeyBjb2x1bW4sIGxhYmVsOiBoZWFkaW5nc1tpbmRleF0sIC4uLmNlbGxzLCBudW1lcmljIH0pO1xufVxuXG4vLyBBIG51bWJlciBmb3JtYXQncyBzdHlsZSBhcyBhIGxpc3QgY29sdW1uJ3MgZm9ybWF0OiB0aGUgdHdvIGVudW1zIHNoYXJlXG4vLyB0aGVpciBudW1iZXIgdmFsdWVzLlxuZnVuY3Rpb24gbGlzdENvbHVtbkZvcm1hdChmb3JtYXQ6IE51bWJlckZvcm1hdFNwZWNbJ2Zvcm1hdCddKTogUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQpLmZpbmQoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gZm9ybWF0KTtcbn1cblxuLy8gRUNoYXJ0cyBjYXRlZ29yeS1heGlzIGxhYmVsIGNvbmZpZyBmb3IgYSB0aW1lIGJ1Y2tldDogdGhlIHByaW1hcnkgbGFiZWwgb25cbi8vIGxpbmUgb25lLCBhbmQg4oCUIG9ubHkgd2hlbiB0aGUgZGF0YSBzcGFucyBtdWx0aXBsZSB5ZWFycyDigJQgdGhlIHllYXIgb24gYSBzbWFsbFxuLy8gZ3JheSBzZWNvbmQgbGluZSwgY2VudGVyZWQgdW5kZXIgdGhlIHRpY2sgKHllYXIgZ3JhbnVsYXJpdHkgbmVlZHMgbm8gc2Vjb25kXG4vLyBsaW5lLCBpdCBhbHJlYWR5IGlzIHRoZSB5ZWFyLCBhbmQgbmVpdGhlciBkb2VzIGEgbG9uZyBvciBudW1lcmljIGxhYmVsLFxuLy8gd2hpY2ggY2FycmllcyBpdHMgeWVhcikuIEVtcHR5IGZvciBhIG5vbi10aW1lIGF4aXMgKGxhYmVscyBhcy1pcykuXG5mdW5jdGlvbiBwZXJpb2RBeGlzTGFiZWwoXG4gIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbiAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRlTGFiZWw6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLFxuKTogeyBheGlzTGFiZWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHtcbiAgaWYgKCFncmFudWxhcml0eSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IG11bHRpWWVhciA9IHNwYW5zTXVsdGlwbGVZZWFycyhjYXRlZ29yaWVzKTtcblxuICByZXR1cm4ge1xuICAgIGF4aXNMYWJlbDoge1xuICAgICAgZm9ybWF0dGVyOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBlcmlvZExhYmVsUGFydHModmFsdWUsIGdyYW51bGFyaXR5LCBsb2NhbGUsIGRhdGVMYWJlbCk7XG4gICAgICAgIGlmICghcGFydHMpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXVsdGlZZWFyICYmIHBlcmlvZFllYXJBcGFydChncmFudWxhcml0eSwgZGF0ZUxhYmVsKVxuICAgICAgICAgID8gYCR7cGFydHMucHJpbWFyeX1cXG57eXJ8JHtwYXJ0cy55ZWFyfX1gXG4gICAgICAgICAgOiBwYXJ0cy5wcmltYXJ5O1xuICAgICAgfSxcbiAgICAgIHJpY2g6IHsgeXI6IHsgZm9udFNpemU6IDEwLCBjb2xvcjogJyM5YWEwYTYnLCBsaW5lSGVpZ2h0OiAxNCB9IH0sXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
1927
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvb3B0aW9uLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLE9BQU8sRUFDUCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFFBQVEsRUFDUixRQUFRLEVBQ1IsVUFBVSxFQUNWLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLEdBQUcsSUFBSSxRQUFRLEVBQ2YsR0FBRyxJQUFJLFVBQVUsRUFDakIsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsU0FBUyxFQUNULFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGVBQWUsRUFFZixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsZUFBZSxFQUNmLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixVQUFVLEdBQ1gsTUFBTSxV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O0FBQzlFLDBFQUEwRTtBQUMxRSxxRUFBcUU7QUFDckUsU0FBUyxlQUFlLENBQ3RCLFdBQW9DLEVBQ3BDLFVBQW9CLEVBQ3BCLE1BQXVCLEVBQ3ZCLFNBQStCO0lBRS9CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxPQUFPO1FBQ0wsU0FBUyxFQUFFO1lBQ1QsU0FBUyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQzNCLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFFRCxPQUFPLFNBQVMsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztvQkFDekQsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sU0FBUyxLQUFLLENBQUMsSUFBSSxHQUFHO29CQUN4QyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNwQixDQUFDO1lBQ0QsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNqRTtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFQ2hhcnRzT3B0aW9uLCBMZWdlbmRDb21wb25lbnRPcHRpb24sIFNlcmllc09wdGlvbiwgVG9vbHRpcENvbXBvbmVudEZvcm1hdHRlckNhbGxiYWNrUGFyYW1zIH0gZnJvbSAnZWNoYXJ0cyc7XG5cbmltcG9ydCB7XG4gIGFkZERheXMsXG4gIGFkZE1vbnRocyxcbiAgYWRkUXVhcnRlcnMsXG4gIGFkZFdlZWtzLFxuICBhZGRZZWFycyxcbiAgZW5kT2ZNb250aCxcbiAgZm9ybWF0SVNPLFxuICBpc0xhc3REYXlPZk1vbnRoLFxuICBpc1ZhbGlkLFxuICBtYXggYXMgbGF0ZXN0T2YsXG4gIG1pbiBhcyBlYXJsaWVzdE9mLFxuICBwYXJzZUlTTyxcbiAgc3RhcnRPZkRheSxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSZXBvcnRDaGFydENvbG9yIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtY29sb3IuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydERhdGFMYWJlbHMgfSBmcm9tICcuL2VudW1zL3JlcG9ydC1jaGFydC1kYXRhLWxhYmVscy5lbnVtJztcbmltcG9ydCB7IFJlcG9ydENoYXJ0RGF0ZUxhYmVsIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydENoYXJ0TGluZVN0eWxlIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtY2hhcnQtbGluZS1zdHlsZS5lbnVtJztcbmltcG9ydCB7IFJlcG9ydENoYXJ0TWFya1N0YXQgfSBmcm9tICcuL2VudW1zL3JlcG9ydC1jaGFydC1tYXJrLXN0YXQuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0TnVtYmVyVW5pdHMgfSBmcm9tICcuL2VudW1zL3JlcG9ydC1udW1iZXItdW5pdHMuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7XG4gIGF4aXNOdW1iZXJGb3JtYXQsXG4gIENoYXJ0TnVtYmVyRm9ybWF0LFxuICBjaGFydFZhbHVlUGVhayxcbiAgY29tcGFyaXNvbk9mZnNldExhYmVsLFxuICBEQVlfU0hPUlQsXG4gIGRhdGVGb3JtYXQsXG4gIGZvcm1hdERheVJhbmdlLFxuICBmb3JtYXREYXlXaW5kb3csXG4gIGZvcm1hdExvY2FsRGF0ZSxcbiAgRm9ybWF0dGVkT3V0cHV0VmFsdWUsXG4gIGZvcm1hdE51bWJlcixcbiAgZm9ybWF0T3V0cHV0VmFsdWUsXG4gIGZvcm1hdFBsYWluTnVtYmVyLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIGxhbmVPdXRwdXRBbGlhcyxcbiAgTU9OVEhfREFZLFxuICBNT05USF9MT05HLFxuICBNT05USF9ZRUFSLFxuICByZXNvbHZlQ2hhcnROdW1iZXJGb3JtYXQsXG4gIHdpbmRvd1RleHQsXG59IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIEF4aXNDaGFydFR5cGUsXG4gIENoYXJ0Q29uZmlnLFxuICBDaGFydEdyYW51bGFyaXR5LFxuICBDaGFydE1lYXN1cmUsXG4gIENoYXJ0UmVmZXJlbmNlLFxuICBDaGFydFZhbHVlQXhpcyxcbiAgQ29tcGFyaXNvbk9mZnNldCxcbiAgQ29tcGFyaXNvbldpbmRvdyxcbiAgQ29tcG9uZW50Q29tcGFyaXNvbixcbiAgQ29tcG9uZW50RGF0YSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGVnZW5kUG9zaXRpb24sXG4gIExpc3RDb2x1bW4sXG4gIExpc3RDb25maWcsXG4gIE51bWJlckZvcm1hdFNwZWMsXG4gIE91dHB1dE1ldGEsXG4gIE91dHB1dFJvbGUsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXYXRlcmZhbGxTdGVwS2luZCxcbiAgV2luZG93TWV0YSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZXNjYXBlSHRtbCB9IGZyb20gJy4vdGV4dCc7XG5pbXBvcnQge1xuICBSRVBPUlRfQ0hBUlRfQ09MT1JfQllfTkFNRSxcbiAgUkVQT1JUX0NIQVJUX0NPTE9SUyxcbiAgUkVQT1JUX0NIQVJUX0NPTE9SU19DU1MsXG4gIFJFUE9SVF9SRUZFUkVOQ0VfQ09MT1IsXG4gIFJFUE9SVF9XQVRFUkZBTExfQ09MT1JTLFxufSBmcm9tICcuL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgUkVQT1JUX0FYSVNfTEFCRUxfRk9OVF9TSVpFLCBSRVBPUlRfQ0hBUlRfRk9OVF9GQU1JTFksIFJFUE9SVF9EQVRBX0xBQkVMX0ZPTlRfU0laRSB9IGZyb20gJy4vdGhlbWUvdHlwb2dyYXBoeSc7XG5cblxuLy8gUm9vbSBmb3IgYW4gYXhpcyB0aXRsZS4gRUNoYXJ0cyA1J3MgY29udGFpbkxhYmVsIGtlZXBzIHRoZSBUSUNLIGxhYmVscyBpbnNpZGVcbi8vIHRoZSBncmlkIGJ1dCBub3QgdGhlIGF4aXMgbmFtZSwgc28gd2l0aG91dCB0aGlzIGEgdmVydGljYWwgY2hhcnQncyBjYXRlZ29yeVxuLy8gdGl0bGUgcnVucyBvZmYgdGhlIGJvdHRvbSBlZGdlIG9yIHVuZGVyIGEgYm90dG9tIGxlZ2VuZCwgYW5kIGl0cyB2YWx1ZSB0aXRsZVxuLy8gYWJvdmUgdGhlIHBsb3QgcnVucyBvZmYgdGhlIHRvcCBvciB1bmRlciBhIHRvcCBsZWdlbmQuXG5jb25zdCBBWElTX05BTUVfUk9PTSA9IDIwO1xuLy8gRUNoYXJ0cycgb3duIGRlZmF1bHQgZ2FwIGJldHdlZW4gdGhlIGF4aXMgbGluZSBhbmQgaXRzIHRpY2sgbGFiZWxzLlxuY29uc3QgQVhJU19MQUJFTF9NQVJHSU4gPSA4O1xuLy8gQ2xlYXJhbmNlIGJldHdlZW4gdGhlIGxvbmdlc3QgdGljayBsYWJlbCBhbmQgYSBob3Jpem9udGFsIGNoYXJ0J3Mgcm90YXRlZFxuLy8gdGl0bGUsIHNvIHRoZSB0d28gbmV2ZXIgdG91Y2guXG5jb25zdCBBWElTX05BTUVfQ0xFQVJBTkNFID0gNjtcbi8vIEEgaG9yaXpvbnRhbCBjaGFydCdzIGNhdGVnb3J5IGxhYmVscyBhcmUgY3V0IHNob3J0IHdpdGggYW4gZWxsaXBzaXMgcGFzdFxuLy8gdGhpcyB3aWR0aCAodGhlIHRvb2x0aXAgc3RpbGwgc2hvd3MgdGhlbSBpbiBmdWxsKSwgc28gb25lIGxvbmcgbGFiZWwgY2Fubm90XG4vLyBzcXVlZXplIHRoZSBwbG90IGF3YXkuXG5jb25zdCBDQVRFR09SWV9MQUJFTF9NQVhfV0lEVEggPSAxNjA7XG5jb25zdCBMQUJFTF9FTExJUFNJUyA9ICfigKYnO1xuLy8gVGhlIGZvbnQgdGhlIHRoZW1lIGRyYXdzIGF4aXMgbGFiZWxzIGluLCBhcyBhIGNhbnZhcyBmb250IHN0cmluZy4gTGFiZWxzIGFyZVxuLy8gbWVhc3VyZWQgaW4gaXQgdGhlIHdheSBFQ2hhcnRzIG1lYXN1cmVzIHRoZW0gZm9yIGNvbnRhaW5MYWJlbCwgc28gYVxuLy8gaG9yaXpvbnRhbCBjaGFydCdzIHRpdGxlIGxhbmRzIGV4YWN0bHkgYmV5b25kIHRoZSB3aWRlc3QgbGFiZWwuXG5jb25zdCBBWElTX0xBQkVMX0ZPTlQgPSBgJHtSRVBPUlRfQVhJU19MQUJFTF9GT05UX1NJWkV9cHggJHtSRVBPUlRfQ0hBUlRfRk9OVF9GQU1JTFl9YDtcbi8vIFRoZSBsZXR0ZXIgYSBxdWFydGVyIGxhYmVsIHN0YXJ0cyB3aXRoLCBieSBsYW5ndWFnZSBzdWJ0YWcuIEZyZW5jaCB3cml0ZXMgdGhlXG4vLyBzZWNvbmQgcXVhcnRlciAnVDInICh0cmltZXN0cmUpOyBldmVyeSBvdGhlciBsYW5ndWFnZSByZWFkcyAnUTInLlxuY29uc3QgUVVBUlRFUl9QUkVGSVhFUyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtbJ2ZyJywgJ1QnXV0pO1xuY29uc3QgUVVBUlRFUl9QUkVGSVggPSAnUSc7XG4vLyBBIDEwMCUgc3RhY2tlZCBjaGFydCdzIHZhbHVlIGF4aXM6IHdob2xlIHBlcmNlbnRhZ2VzLCBhIGdyaWRsaW5lIGV2ZXJ5IDI1JSxcbi8vIHVwIHRvIDEwMCUuIEl0cyB0b29sdGlwIGdpdmVzIGVhY2ggc2hhcmUgdG8gb25lIGRlY2ltYWwuXG5jb25zdCBQRVJDRU5UX0FYSVNfRk9STUFUOiBOdW1iZXJGb3JtYXRTcGVjID0geyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQsIHByZWNpc2lvbjogMCB9O1xuY29uc3QgUEVSQ0VOVF9TSEFSRV9GT1JNQVQ6IE51bWJlckZvcm1hdFNwZWMgPSB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCwgcHJlY2lzaW9uOiAxIH07XG5leHBvcnQgY29uc3QgUEVSQ0VOVF9BWElTX01BWCA9IDE7XG5leHBvcnQgY29uc3QgUEVSQ0VOVF9BWElTX0lOVEVSVkFMID0gMC4yNTtcbi8vIEEgcmVmZXJlbmNlIGJhbmQncyBmaWxsOiB0aGUgcmVmZXJlbmNlIHNsYXRlLCBmYWludCBlbm91Z2ggdGhhdCB0aGUgc2VyaWVzXG4vLyBkcmF3biBhY3Jvc3MgaXQgc3RheSByZWFkYWJsZS5cbmNvbnN0IFJFRkVSRU5DRV9CQU5EX0ZJTEwgPSAncmdiYSg4MiwgOTYsIDEwOSwgMC4wOCknO1xuLy8gQSByZWZlcmVuY2UncyBvciBzdGF0aXN0aWMgbGluZSdzIGxhYmVsIHNpdHMgb24gYSBsaWdodCBib3gsIHNvIGl0IHN0YXlzXG4vLyByZWFkYWJsZSB3aGVyZSBpdCBjcm9zc2VzIGEgYmFyIG9yIGEgbGluZS5cbmNvbnN0IE1BUktfTEFCRUxfQk9YID0geyBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpJywgcGFkZGluZzogWzEsIDNdLCBib3JkZXJSYWRpdXM6IDIgfTtcbi8vIFRoZSByb29tIGFuIGF4aXMgc3RyZXRjaGVkIHRvIGEgcmVmZXJlbmNlIGxlYXZlcyBhYm92ZSBpdCwgZm9yIGl0cyBsYWJlbDpcbi8vIHRoZSBib3VuZCBpcyB0aGUgcm91bmQgbnVtYmVyIGF0IG9yIHBhc3QgdGhlIHJlZmVyZW5jZSBwbHVzIHRoaXMgc2hhcmUuXG5jb25zdCBSRUZFUkVOQ0VfSEVBRFJPT00gPSAxLjA1O1xuXG4vLyBIb3cgYSBjaGFydCBtYXJrcyB3aGF0IHRoZSBzZXJ2ZXIgc2F5cyBvZiBpdHMgbnVtYmVycyAoQ29tcG9uZW50RGF0YSdzXG4vLyBjb21wYXJpc29uLCBvdXRwdXRzLCB3aW5kb3dzIGFuZCBwYXJ0aWFsUGVyaW9kKS4gVGhlIHdvcmRzIGFyZSBpbnRlcmZhY2Vcbi8vIHRleHQsIEVuZ2xpc2ggaW4gZXZlcnkgcmVwb3J0IGxvY2FsZS5cbi8vIC0gVGhlIGhlYWRpbmcgb2YgYSBwZXJpb2Qgbm90IG92ZXIgeWV0ICgnU2VwdGVtYmVyIDIwMjYgKHRvIGRhdGUpJykuXG5jb25zdCBQQVJUSUFMX1BFUklPRF9URVhUID0gJ3RvIGRhdGUnO1xuLy8gLSBBIGNvbXBhcmVkIHNlcmllcycgbmFtZTogaXRzIG1lYXN1cmUncywgdGhlbiBpdHMgcm9sZSBhbmQgbGFuZSAoJ1JldmVudWVcbi8vICAgY2hhbmdlICh2cyBwcmV2aW91cyB3ZWVrKScpLiBBIHByaW9yIGtlZXBzIHRoZSBtZWFzdXJlJ3MgbmFtZSBhbG9uZS5cbmNvbnN0IFJPTEVfTkFNRV9TVUZGSVhFUzogUmVjb3JkPEV4Y2x1ZGU8T3V0cHV0Um9sZSwgJ2N1cnJlbnQnPiwgc3RyaW5nPiA9IHtcbiAgcHJpb3I6ICcnLFxuICBjaGFuZ2U6ICcgY2hhbmdlJyxcbiAgcGVyY2VudF9jaGFuZ2U6ICcgJSBjaGFuZ2UnLFxufTtcbi8vIC0gQSBwcmlvciBzZXJpZXMnIGJhcnM6IGl0cyBjdXJyZW50IHNlcmllcycgY29sb3IsIGZhZGVkLCB3aXRoIGEgZGFzaGVkXG4vLyAgIGVkZ2UuIEl0cyBsaW5lIGlzIGRhc2hlZCAoUFJJT1JfTElORV9TVFlMRSkgdW5sZXNzIGl0cyBtZWFzdXJlIG5hbWVzIG9uZS5cbmNvbnN0IFBSSU9SX0JBUl9PUEFDSVRZID0gMC40NTtcbmNvbnN0IFBSSU9SX0xJTkVfU1RZTEUgPSBSZXBvcnRDaGFydExpbmVTdHlsZS5EYXNoZWQ7XG4vLyAtIFRoZSBwZXJpb2Qgbm90IG92ZXIgeWV0OiBpdHMgYmFyIGhhdGNoZWQgaW4gbGlnaHQgc3RyaXBlcywgaXRzIHBvaW50IG9uIGFcbi8vICAgbGluZSBkcmF3biBsYXJnZXIgd2l0aCBhIGRhc2hlZCBlZGdlLCBhbmQsIHdoZW4gaXQgaXMgdGhlIGxhc3Qgb25lLCB0aGVcbi8vICAgbGluZSdzIGxhc3Qgc2VnbWVudCBkYXNoZWQuXG5jb25zdCBQQVJUSUFMX0xJTkVfU1RZTEUgPSBSZXBvcnRDaGFydExpbmVTdHlsZS5EYXNoZWQ7XG5jb25zdCBQQVJUSUFMX0JBUl9ERUNBTCA9IHtcbiAgc3ltYm9sOiAnbm9uZScsXG4gIGRhc2hBcnJheVg6IFsxLCAwXSxcbiAgZGFzaEFycmF5WTogWzMsIDVdLFxuICByb3RhdGlvbjogLU1hdGguUEkgLyA0LFxuICBjb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC42KScsXG59O1xuY29uc3QgUEFSVElBTF9QT0lOVF9NQVJLID0geyBzeW1ib2w6ICdlbXB0eUNpcmNsZScsIHN5bWJvbFNpemU6IDksIGl0ZW1TdHlsZTogeyBib3JkZXJUeXBlOiAnZGFzaGVkJyB9IH07XG4vLyAtIEEgdmFsdWUgYXhpcyBvZiByYW5rcyBvbmx5OiByYW5rIDEgYXQgdGhlIHRvcCwgd2hvbGUgc3RlcHMsIGZyb20gMS5cbmNvbnN0IFJBTktfQVhJU19GT1JNQVQ6IE51bWJlckZvcm1hdFNwZWMgPSB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLCBwcmVjaXNpb246IDAgfTtcbi8vIChTaGFyZWQgd2l0aCB0aGUgUG93ZXJQb2ludCBleHBvcnQsIHdob3NlIHJhbmsgYXhlcyBzdGFydCB0aGVyZSB0b28uKVxuZXhwb3J0IGNvbnN0IFJBTktfQVhJU19NSU4gPSAxO1xuLy8gLSBBIHZhbHVlIGF4aXMgb2YgMC0xIGZyYWN0aW9ucyBvbmx5IChzaGFyZXMsIHBlcmNlbnQgY2hhbmdlcykgaXMgYVxuLy8gICBwZXJjZW50IGF4aXMsIGl0cyBkZWNpbWFscyBkZWNpZGVkIGJ5IGl0cyBwZWFrLlxuY29uc3QgRlJBQ1RJT05fQVhJU19GT1JNQVQ6IE51bWJlckZvcm1hdFNwZWMgPSB7IGZvcm1hdDogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCB9O1xuLy8gLSBCZXR3ZWVuIGEgdG9vbHRpcCB2YWx1ZSBhbmQgd2hhdCBpdCBjb3ZlcnMuXG5jb25zdCBUT09MVElQX0RFVEFJTF9TRVBBUkFUT1IgPSAnIMK3ICc7XG4vLyAtIFRoZSBwcmlvciBhIHRvb2x0aXAgdmFsdWUgaXMgY29tcGFyZWQgd2l0aCwgd2hlbiB0aGUgY2hhcnQgZG9lcyBub3QgcGxvdFxuLy8gICBpdCAoJ3ZzIDUwJSAoU2VwIDEg4oCTIDIsIDIwMjYpJykuXG5jb25zdCBDT01QQVJFRF9QUklPUl9QUkVGSVggPSAndnMnO1xuXG4vLyBUaGUgd29yZHMgYSBzdGF0aXN0aWMgbGluZSdzIGxhYmVsIHN0YXJ0cyB3aXRoLiBUaGV5IGFyZSBpbnRlcmZhY2UgdGV4dCxcbi8vIEVuZ2xpc2ggaW4gZXZlcnkgcmVwb3J0IGxvY2FsZTsgb25seSB0aGUgdmFsdWUgYWZ0ZXIgdGhlbSBmb2xsb3dzIGl0LlxuZXhwb3J0IGNvbnN0IFNUQVRfTEFCRUw6IFJlY29yZDxSZXBvcnRDaGFydE1hcmtTdGF0LCBzdHJpbmc+ID0ge1xuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5BdmVyYWdlXTogJ0F2ZXJhZ2UnLFxuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5NZWRpYW5dOiAnTWVkaWFuJyxcbiAgW1JlcG9ydENoYXJ0TWFya1N0YXQuTWluXTogJ01pbmltdW0nLFxuICBbUmVwb3J0Q2hhcnRNYXJrU3RhdC5NYXhdOiAnTWF4aW11bScsXG59O1xuXG4vLyBXaGljaCBlZGdlIG9mIHRoZSBwbG90IGFuIGF4aXMgdGl0bGUgc2l0cyBvbi4gVGhlIGNhdGVnb3J5IGF4aXMncyBpcyBiZWxvdyBhXG4vLyB2ZXJ0aWNhbCBjaGFydCBhbmQgdG8gdGhlIGxlZnQgb2YgYSBob3Jpem9udGFsIG9uZTsgdGhlIHZhbHVlIGF4aXMncyBpcyBhYm92ZVxuLy8gYSB2ZXJ0aWNhbCBjaGFydCBhbmQgYmVsb3cgYSBob3Jpem9udGFsIG9uZS5cbnR5cGUgQXhpc1RpdGxlU2lkZSA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbi8vIFdoaWNoIHZhbHVlIGF4aXMgYSBzZXJpZXMgaXMgcGxvdHRlZCBhZ2FpbnN0OiAwIHRoZSBwcmltYXJ5LCAxIHRoZSBzZWNvbmRcbi8vIGF4aXMgb24gdGhlIHJpZ2h0LlxuZXhwb3J0IHR5cGUgVmFsdWVBeGlzSW5kZXggPSAwIHwgMTtcblxuLy8gV2hhdCB2YWx1ZUF4aXNPcHRpb24gYWRkcyBmb3Igb25lIGF4aXMuIGBpbmRleGAgaXMgdGhlIGF4aXMgb2YgYSB0d28tYXhpc1xuLy8gY2hhcnQgaXQgYnVpbGRzOiB0aGUgc2Vjb25kIG9uZSdzIHRpdGxlIGlzIGFsaWduZWQgdG8gcmVhZCBsZWZ0d2FyZCBmcm9tIHRoZVxuLy8gcmlnaHQgZWRnZS4gYHBlcmNlbnRNaW5gIG1ha2VzIGl0IGEgMTAwJSBzdGFja2VkIGNoYXJ0J3Mgc2hhcmUgYXhpcywgZnJvbVxuLy8gdGhhdCBib3VuZCAoMCwgb3IgLTEgd2hlbiBhIHNoYXJlIGlzIG5lZ2F0aXZlKSB1cCB0byAxMDAlLCB3aGF0ZXZlciByYW5nZVxuLy8gdGhlIGNvbmZpZyBwaW5zLiBgcmVhY2hgIGlzIHRoZSBzcGFuIG9mIHRoZSByZWZlcmVuY2VzIHBsb3R0ZWQgYWdhaW5zdCBpdCxcbi8vIHdoaWNoIHRoZSBheGlzIHN0cmV0Y2hlcyB0byB3aGVuIHRoZSBkYXRhIGZhbGxzIHNob3J0IG9mIHRoZW0uIGByYW5rYFxuLy8gaW52ZXJ0cyBpdC5cbmludGVyZmFjZSBWYWx1ZUF4aXNFeHRyYXMge1xuICBpbmRleD86IFZhbHVlQXhpc0luZGV4O1xuICBwZXJjZW50TWluPzogbnVtYmVyO1xuICByZWFjaD86IFJlZmVyZW5jZVJlYWNoO1xuICAvLyBFdmVyeSBzZXJpZXMgb24gdGhlIGF4aXMgcGxvdHMgYSByYW5rOiBpdCBydW5zIGZyb20gcmFuayAxIGF0IHRoZSB0b3AgaW5cbiAgLy8gd2hvbGUgc3RlcHMuXG4gIHJhbms/OiBib29sZWFuO1xufVxuXG4vLyBBIHJlZmVyZW5jZSBhcyB0aGUgY2hhcnQgZHJhd3MgaXQ6IGl0cyBsb3dlciBhbmQgdXBwZXIgZWRnZSAodGhlIHNhbWUgdmFsdWVcbi8vIGZvciBhIGxpbmUpLCB3aGV0aGVyIGl0IGlzIGEgYmFuZCwgYW5kIHRoZSB2YWx1ZSBheGlzIGl0IGlzIHBsb3R0ZWQgYWdhaW5zdC5cbi8vIFNoYXJlZCB3aXRoIHRoZSBQb3dlclBvaW50IGV4cG9ydCwgd2hpY2ggZHJhd3MgZWFjaCBlZGdlIGFzIGEgY29uc3RhbnQgbGluZS5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhd25SZWZlcmVuY2Uge1xuICBsYWJlbDogc3RyaW5nO1xuICBsb3c6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xuICBiYW5kOiBib29sZWFuO1xuICBheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4O1xufVxuXG4vLyBUaGUgbG93ZXN0IGFuZCBoaWdoZXN0IGVkZ2Ugb2YgdGhlIHJlZmVyZW5jZXMgb24gb25lIHZhbHVlIGF4aXMuXG5pbnRlcmZhY2UgUmVmZXJlbmNlUmVhY2gge1xuICBsb3c6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xufVxuXG4vLyBXaGF0IEVDaGFydHMgaGFuZHMgYSB2YWx1ZSBheGlzJ3MgbWluIGFuZCBtYXggY2FsbGJhY2tzOiB0aGUgZXh0ZW50IG9mIHRoZVxuLy8gZGF0YSBwbG90dGVkIGFnYWluc3QgaXQuXG5pbnRlcmZhY2UgQXhpc0V4dGVudCB7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbn1cblxuLy8gT25lIHBvaW50IG9mIGEgMTAwJSBzdGFja2VkIHNlcmllczogaXRzIHNoYXJlIG9mIHRoZSBjYXRlZ29yeSdzIHRvdGFsLFxuLy8gd2hpY2ggRUNoYXJ0cyBwbG90cyBhbmQgc3RhY2tzLCBhbmQgdGhlIHZhbHVlIGl0IGNhbWUgZnJvbS5cbmludGVyZmFjZSBTaGFyZURhdGFJdGVtIHtcbiAgdmFsdWU6IG51bWJlciB8IG51bGw7XG4gIHJhdzogbnVtYmVyIHwgbnVsbDtcbn1cblxuLy8gQSBwb2ludCB0aGF0IHByaW50cyBpdHMgb3duIGRhdGEgbGFiZWw6IGEgJ2xhc3QnIHNlcmllcycgbGF0ZXN0IHBvaW50LFxuLy8ga2VlcGluZyB0aGUgcmF3IHZhbHVlIGEgMTAwJSBzdGFja2VkIHBvaW50IGNhcnJpZXMuXG5pbnRlcmZhY2UgTGFiZWxlZERhdGFJdGVtPFAgZXh0ZW5kcyBEYXRhTGFiZWxQb3NpdGlvbj4ge1xuICB2YWx1ZTogbnVtYmVyIHwgbnVsbDtcbiAgcmF3PzogbnVtYmVyIHwgbnVsbDtcbiAgbGFiZWw6IERhdGFMYWJlbDxQPjtcbn1cblxudHlwZSBTZXJpZXNEYXRhSXRlbTxQIGV4dGVuZHMgRGF0YUxhYmVsUG9zaXRpb24+ID0gbnVtYmVyIHwgbnVsbCB8IFNoYXJlRGF0YUl0ZW0gfCBMYWJlbGVkRGF0YUl0ZW08UD47XG5cbi8vIFdoYXQgYSBkYXRhIGxhYmVsJ3MgZm9ybWF0dGVyIGlzIGhhbmRlZDogdGhlIHBvaW50J3MgcGxvdHRlZCB2YWx1ZSwgaXRzXG4vLyBkYXRhIGl0ZW0gYXMgZ2l2ZW4gKGEgbnVtYmVyLCBvciBhbiBvYmplY3QgY2FycnlpbmcgdGhlIHJhdyB2YWx1ZSksIGFuZCBpdHNcbi8vIGluZGV4LlxuaW50ZXJmYWNlIERhdGFMYWJlbFBhcmFtcyB7XG4gIHZhbHVlPzogdW5rbm93bjtcbiAgZGF0YT86IHVua25vd247XG4gIGRhdGFJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YUxhYmVsRm9ybWF0dGVyID0gKHBhcmFtczogRGF0YUxhYmVsUGFyYW1zKSA9PiBzdHJpbmc7XG5cbi8vIFdoZXJlIGEgZGF0YSBsYWJlbCBzaXRzOiAnb3V0c2lkZScgcGFzdCBhbiB1bnN0YWNrZWQgYmFyJ3MgZW5kLCBvbiB0aGUgc2lkZVxuLy8gaXRzIHNpZ24gcG9pbnRzIHRvOyAnaW5zaWRlJyBhIHN0YWNrZWQgYmFyOyAndG9wJyBhYm92ZSBhIGxpbmUgb3IgYXJlYVxuLy8gcG9pbnQuIEVDaGFydHMgdGFrZXMgJ291dHNpZGUnIG9uIGEgYmFyIG9ubHkuXG5leHBvcnQgdHlwZSBEYXRhTGFiZWxQb3NpdGlvbiA9ICd0b3AnIHwgJ2luc2lkZScgfCAnb3V0c2lkZSc7XG5cbi8vIE9uZSBFQ2hhcnRzIGxhYmVsLCBhcyBhIHNlcmllcyBvciBhIHNpbmdsZSBwb2ludCBwcmludHMgaXQuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFMYWJlbDxQIGV4dGVuZHMgRGF0YUxhYmVsUG9zaXRpb24gPSBEYXRhTGFiZWxQb3NpdGlvbj4ge1xuICBzaG93OiB0cnVlO1xuICBwb3NpdGlvbjogUDtcbiAgZm9udFNpemU6IG51bWJlcjtcbiAgZm9ybWF0dGVyOiBEYXRhTGFiZWxGb3JtYXR0ZXI7XG59XG5cbi8vIEEgc2VyaWVzJyBkYXRhIGxhYmVscyBhcyBkYXRhTGFiZWxPcHRpb24gZGVjaWRlcyB0aGVtLCBiZWZvcmUgYnVpbGRTZXJpZXNcbi8vIHBsYWNlcyB0aGVtIGJ5IHdoYXQgdGhlIHNlcmllcyBkcmF3czogdGhlIGxhYmVsJ3MgdGV4dCBhbmQgc2l6ZSwgd2hldGhlclxuLy8gbGFiZWxzIHRoYXQgd291bGQgb3ZlcmxhcCBhcmUgaGlkZGVuICgnYXV0bycpLCBhbmQgd2hldGhlciBvbmx5IHRoZSBsYXRlc3Rcbi8vIHBvaW50IHByaW50cyBvbmUgKCdsYXN0JykuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmllc0RhdGFMYWJlbHMge1xuICB0ZXh0OiBPbWl0PERhdGFMYWJlbCwgJ3Bvc2l0aW9uJz47XG4gIGhpZGVPdmVybGFwOiBib29sZWFuO1xuICBsYXN0T25seTogYm9vbGVhbjtcbn1cblxuLy8gQSBzZXJpZXMnIGRhdGEgbGFiZWxzIHBsYWNlZDogYHNlcmllc2AgaXMgc3ByZWFkIG92ZXIgdGhlIHNlcmllcyAoaXRzXG4vLyBsYWJlbCwgYW5kIGZvciAnYXV0bycgdGhlIG92ZXJsYXAgaGlkaW5nKSwgYW5kIGBkYXRhYCBpcyBpdHMgcG9pbnRzLCB0aGVcbi8vIGxhdGVzdCBub24tZW1wdHkgb25lIGNhcnJ5aW5nIHRoZSBsYWJlbCBmb3IgJ2xhc3QnLlxuaW50ZXJmYWNlIFBsYWNlZERhdGFMYWJlbHM8UCBleHRlbmRzIERhdGFMYWJlbFBvc2l0aW9uPiB7XG4gIHNlcmllczogeyBsYWJlbD86IERhdGFMYWJlbDxQPjsgbGFiZWxMYXlvdXQ/OiB7IGhpZGVPdmVybGFwOiBib29sZWFuIH0gfTtcbiAgZGF0YTogU2VyaWVzRGF0YUl0ZW08UD5bXTtcbn1cblxuLy8gQSB2YWx1ZSBheGlzJ3MgbnVtYmVyIGZvcm1hdCwgZGVjaWRlZCBvbmNlIGZvciB0aGUgYXhpczogdGhlIGZvcm1hdCB0aGVcbi8vIG1lYXN1cmVzIHBsb3R0ZWQgYWdhaW5zdCBpdCBhZ3JlZSBvbiAoYXhpc051bWJlckZvcm1hdCksIHdpdGggdGhlIHVuaXRzIGFuZFxuLy8gZGVjaW1hbHMgaXRzIHBlYWsgY2FsbHMgZm9yLCBhbmQgdGhlIGNvbnRleHQgaXRzIHRpY2tzIGFyZSB3cml0dGVuIGluIChhblxuLy8gYXhpcyBvZiAwLTEgZnJhY3Rpb25zIHJlYWRzIHRoZW0gYXMgcmF0aW9zIHdoYXRldmVyIHRoZSByZXBvcnQnc1xuLy8gcGVyY2VudEZvcm1hdCkuIG51bGwgaXMgYSBwbGFpbiBheGlzLiBJdHMgdGlja3MgYW5kIGl0cyBzZXJpZXMnIGRhdGEgbGFiZWxzXG4vLyBib3RoIHdyaXRlIGluIGl0LlxuaW50ZXJmYWNlIFZhbHVlQXhpc0Zvcm1hdCB7XG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWM7XG4gIGNoYXJ0OiBDaGFydE51bWJlckZvcm1hdDtcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbn1cblxuLy8gVGhlIHNoYXJlcyBhIDEwMCUgc3RhY2tlZCBjaGFydCBkcmF3cywgYnkgdGhlIGluZGV4IG9mIHRoZSBleHRyYWN0ZWQgc2VyaWVzXG4vLyB0aGV5IHJlcGxhY2UuXG5leHBvcnQgdHlwZSBQZXJjZW50U2hhcmVzID0gTWFwPG51bWJlciwgKG51bWJlciB8IG51bGwpW10+O1xuXG4vLyBUaGUgcGxvdCdzIGRpc3RhbmNlIGZyb20gZWFjaCBlZGdlIG9mIHRoZSBjaGFydCwgaW4gcGl4ZWxzLlxuaW50ZXJmYWNlIEF4aXNHcmlkUm9vbSB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgcmlnaHQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuICBjb250YWluTGFiZWw6IGJvb2xlYW47XG59XG5cblxuLy8gY29sb3JCeSBhcHBsaWVzIG9ubHkgdG8gc2luZ2xlLWRpbWVuc2lvbiBiYXIgY2hhcnRzLCBhbmQgb25seSB3aGVuIHNwbGl0Qnlcbi8vIGlzbid0IGFscmVhZHkgZHJpdmluZyBtdWx0aXBsZSBzZXJpZXM6IGl0IGNvbG9ycyBlYWNoIGJhciBieSBpdHMgY2F0ZWdvcnkgYW5kXG4vLyBzaG93cyBhIGxlZ2VuZCAob25lIHNlcmllcyBwZXIgY2F0ZWdvcnksIG92ZXJsYXBwZWQgdG8gZnVsbCB3aWR0aCkuXG4vL1xuLy8gSXQgaXMgdGhlIERFRkFVTFQgZm9yIGEgY2F0ZWdvcmljYWwgYmFyIGNoYXJ0IHJhdGhlciB0aGFuIHNvbWV0aGluZyB0aGUgY29uZmlnXG4vLyBoYXMgdG8gYXNrIGZvci4gQSBiYXIgY2hhcnQgd2hvc2UgeC1heGlzIGlzIGEgY2F0ZWdvcnkg4oCUIHJlZ2lvbnMsIHN0YXR1c2VzLFxuLy8gc3RvcmVzIOKAlCBpcyBjb21wYXJpbmcgdGhvc2UgY2F0ZWdvcmllcyB0byBlYWNoIG90aGVyLCBhbmQgb25lIGZsYXQgY29sb3Igd2l0aFxuLy8gbm8gbGVnZW5kIGlzIHRoZSB3cm9uZyByZWFkaW5nIG9mIGl0IGluIGVzc2VudGlhbGx5IGV2ZXJ5IGNhc2UuIFJlcXVpcmluZ1xuLy8gY29sb3JCeSB0byBvcHQgaW4gbWVhbnQgZXZlcnkgc3VjaCBjaGFydCByZW5kZXJlZCBtb25vY2hyb21lIHVubGVzcyB3aG9ldmVyXG4vLyB3cm90ZSB0aGUgY29uZmlnIHJlbWVtYmVyZWQgYW4gb3B0aW9uYWwgcHJvcGVydHksIHdoaWNoIGlzIGEgZGVmYXVsdCBzZXQgdGhlXG4vLyB3cm9uZyB3YXkgcm91bmQ6IHRoZSBjb21tb24gY2FzZSBzaG91bGQgbm90IG5lZWQgdGhlIGZsYWcuXG4vL1xuLy8gQSBUSU1FIGF4aXMgaXMgZXhjbHVkZWQ6IGNvbnNlY3V0aXZlIHBlcmlvZHMgYXJlIG9uZSBzZXJpZXMgbW92aW5nLCBub3Rcbi8vIGNhdGVnb3JpZXMgYmVpbmcgY29tcGFyZWQsIGFuZCBjb2xvcmluZyBlYWNoIG1vbnRoIGRpZmZlcmVudGx5IHJlYWRzIGFzXG4vLyB1bnJlbGF0ZWQgZ3JvdXBzLiBFeHBsaWNpdGx5IG9wdGluZyBvdXQg4oCUIGNvbG9yQnk6IHtjb2x1bW46ICcnfSwgYSBjb2xvciBvblxuLy8gdGhlIG1lYXN1cmUgb3IgYSBjb25maWcubGVnZW5kIG9mICdoaWRkZW4nIOKAlCBzdGlsbCB3aW5zLCBzbyBhIGNhbGxlciB0aGF0XG4vLyB3YW50cyBvbmUgZmxhdCBjb2xvciBjYW4gc2F5IHNvLlxuLy9cbi8vIFwiQmFyIGNoYXJ0XCIgaXMgdGhlIHR5cGUgdGhlIGxvbmUgbWVhc3VyZSBpcyBhY3R1YWxseSBEUkFXTiBhczogaXRzIG93biB0eXBlXG4vLyB3aGVuIGl0IG5hbWVzIG9uZSwgd2hpY2ggY2FuIHR1cm4gYSBsaW5lIGNoYXJ0J3Mgc2luZ2xlIHNlcmllcyBpbnRvIGJhcnMgb3Jcbi8vIGEgYmFyIGNoYXJ0J3MgaW50byBhIGxpbmUuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xvckJ5KGNvbmZpZzogQ2hhcnRDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKGNvbmZpZy5zcGxpdEJ5Py5jb2x1bW4gfHwgKGNvbmZpZy5tZWFzdXJlcz8uWzBdPy50eXBlID8/IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2JhcicpICE9PSAnYmFyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjb25maWcuY29sb3JCeSkge1xuICAgIHJldHVybiAhIWNvbmZpZy5jb2xvckJ5LmNvbHVtbjtcbiAgfVxuXG4gIC8vIEEgbWVhc3VyZSBnaXZlbiBpdHMgb3duIGNvbG9yIGFza3MgZm9yIG9uZSBmbGF0IGNvbG9yLlxuICBpZiAobWVhc3VyZUNvbG9ySGV4KGNvbmZpZy5tZWFzdXJlcz8uWzBdKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoY29uZmlnLnhBeGlzPy5raW5kID8/ICdjYXRlZ29yeScpID09PSAnY2F0ZWdvcnknXG4gICAgJiYgIWNvbmZpZy54QXhpcz8uZ3JhbnVsYXJpdHlcbiAgICAmJiAoY29uZmlnLm1lYXN1cmVzPy5sZW5ndGggPz8gMSkgPD0gMTtcbn1cblxuXG4vLyBUaGUgY29sdW1uIGNvbG9yQnkgZ3JvdXBzIGJ5IOKAlCBpdHMgb3duIHdoZW4gdGhlIGNvbmZpZyBuYW1lZCBvbmUsIG90aGVyd2lzZVxuLy8gdGhlIHgtYXhpcyBpdCBkZWZhdWx0cyB0byBjb2xvcmluZy5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckJ5Q29sdW1uKGNvbmZpZzogQ2hhcnRDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNDb2xvckJ5KGNvbmZpZylcbiAgICA/IChjb25maWcuY29sb3JCeT8uY29sdW1uIHx8IGNvbmZpZy54QXhpcz8uY29sdW1uKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5cbi8vIENhdGVnb3JpZXMgKyBuYW1lZCBzZXJpZXMgZXh0cmFjdGVkIGZyb20gYSBjaGFydCBjb21wb25lbnQncyBjb25maWcgKyByb3dzIOKAlFxuLy8gdGhlIG9uZSBwaXZvdCAoc3BsaXRCeSDihpIgc2VyaWVzLCBtZWFzdXJlcyDihpIgc2VyaWVzKSBzaGFyZWQgYnkgdGhlIG9uLXNjcmVlblxuLy8gRUNoYXJ0cyBvcHRpb24gYmVsb3cgQU5EIHRoZSBQb3dlclBvaW50IGV4cG9ydCdzIG5hdGl2ZSBjaGFydCBkYXRhLCBzbyBib3RoXG4vLyBtZWRpYSBwbG90IGlkZW50aWNhbCBudW1iZXJzLlxuLy9cbi8vIEEgc2VyaWVzJyBgdHlwZWAgaXMgdGhlIHR5cGUgaXRzIG1lYXN1cmUgYXNrcyB0byBiZSBkcmF3biBhcywgYW5kIGlzIGFic2VudFxuLy8gd2hlbiB0aGUgbWVhc3VyZSBsZWF2ZXMgaXQgdG8gdGhlIGNoYXJ0J3MgY2hhcnRUeXBlIChzZWUgc2VyaWVzVHlwZXMpLiBJdHNcbi8vIGBtZWFzdXJlYCBpcyB0aGUgb25lIGl0IHBsb3RzLCB3aG9zZSBudW1iZXIgZm9ybWF0IGl0cyB0b29sdGlwIHVzZXMgYW5kXG4vLyB3aG9zZSBkaXNwbGF5IGtleXMgKGNvbG9yLCBheGlzKSBpdCBmb2xsb3dzLCBhbmQgYG1lYXN1cmVJbmRleGAgdGhhdFxuLy8gbWVhc3VyZSdzIHBvc2l0aW9uOiB0aGUgZmlyc3QgbWVhc3VyZSwgMCwgZm9yIGV2ZXJ5IHNlcmllcyBvZiBhIHNwbGl0Qnkgb3Jcbi8vIGNvbG9yQnkgY2hhcnQuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RlZENoYXJ0U2VyaWVzIHtcbiAgY2F0ZWdvcmllczogc3RyaW5nW107XG4gIHNlcmllczogRXh0cmFjdGVkQ2hhcnRTZXJpZXNJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdGVkQ2hhcnRTZXJpZXNJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdO1xuICB0eXBlPzogQXhpc0NoYXJ0VHlwZTtcbiAgbWVhc3VyZTogQ2hhcnRNZWFzdXJlO1xuICBtZWFzdXJlSW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDaGFydFNlcmllcyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZGF0YTogQ29tcG9uZW50RGF0YSk6IEV4dHJhY3RlZENoYXJ0U2VyaWVzIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3QgeyB4Q29sdW1uLCBncm91cENvbHVtbiB9ID0gY2hhcnRDb2x1bW5zKGNvbmZpZywgZGF0YSk7XG4gIGNvbnN0IG1lYXN1cmVzID0gY2hhcnRNZWFzdXJlcyhjb25maWcsIGRhdGEpO1xuXG4gIGNvbnN0IHJhd0NhdGVnb3JpZXMgPSB1bmlxdWVWYWx1ZXMoZGF0YS5yb3dzLCB4Q29sdW1uKTtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IHJhd0NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gU3RyaW5nKGNhdGVnb3J5ID8/ICfigJQnKSk7XG4gIGNvbnN0IHNlcmllczogRXh0cmFjdGVkQ2hhcnRTZXJpZXNbJ3NlcmllcyddID0gW107XG5cbiAgaWYgKGdyb3VwQ29sdW1uKSB7XG4gICAgLy8gT25lIHNlcmllcyBwZXIgZ3JvdXAgdmFsdWUgKHNwbGl0QnkvY29sb3JCeSksIHBpdm90ZWQgb3ZlciB0aGUgZmlyc3QgbWVhc3VyZS5cbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZXNbMF07XG4gICAgZm9yIChjb25zdCBncm91cFZhbHVlIG9mIHVuaXF1ZVZhbHVlcyhkYXRhLnJvd3MsIGdyb3VwQ29sdW1uKSkge1xuICAgICAgc2VyaWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBTdHJpbmcoZ3JvdXBWYWx1ZSA/PyAn4oCUJyksXG4gICAgICAgIHZhbHVlczogY2F0ZWdvcnlWYWx1ZXMoZGF0YS5yb3dzLCB4Q29sdW1uLCByYXdDYXRlZ29yaWVzLCBtZWFzdXJlLmNvbHVtbiwgKHJvdykgPT4gcm93W2dyb3VwQ29sdW1uXSA9PT0gZ3JvdXBWYWx1ZSksXG4gICAgICAgIHR5cGU6IG1lYXN1cmUudHlwZSxcbiAgICAgICAgbWVhc3VyZSxcbiAgICAgICAgbWVhc3VyZUluZGV4OiAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgW21lYXN1cmVJbmRleCwgbWVhc3VyZV0gb2YgbWVhc3VyZXMuZW50cmllcygpKSB7XG4gICAgICBzZXJpZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGNvbXBhcmVkU2VyaWVzTmFtZShtZWFzdXJlLCBtZWFzdXJlcywgZGF0YSkgPz8gbWVhc3VyZS5sYWJlbCA/PyBtZWFzdXJlLmNvbHVtbixcbiAgICAgICAgdmFsdWVzOiBjYXRlZ29yeVZhbHVlcyhkYXRhLnJvd3MsIHhDb2x1bW4sIHJhd0NhdGVnb3JpZXMsIG1lYXN1cmUuY29sdW1uKSxcbiAgICAgICAgdHlwZTogbWVhc3VyZS50eXBlLFxuICAgICAgICBtZWFzdXJlLFxuICAgICAgICBtZWFzdXJlSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjYXRlZ29yaWVzLCBzZXJpZXMgfTtcbn1cblxuLy8gVGhlIGNvbHVtbiBhIGNoYXJ0J3MgY2F0ZWdvcmllcyBjb21lIGZyb20sIGFuZCB0aGUgb25lIHRoYXQgc3BsaXRzIGl0c1xuLy8gZmlyc3QgbWVhc3VyZSBpbnRvIGEgc2VyaWVzIHBlciB2YWx1ZSwgaWYgYW55LiBjb2xvckJ5IGVtaXRzIG9uZSBzZXJpZXMgcGVyXG4vLyBjYXRlZ29yeSB0b28gKHNvIGVhY2ggYmFyIGNhcnJpZXMgaXRzIG93biBjb2xvciArIGxlZ2VuZCBlbnRyeSksIGJ1dCB0aGVcbi8vIGJhcnMgYXJlIG92ZXJsYXBwZWQgdG8gZnVsbCB3aWR0aCBpbiBidWlsZEF4aXNPcHRpb24gcmF0aGVyIHRoYW4gbGFpZFxuLy8gc2lkZS1ieS1zaWRlLiBzcGxpdEJ5IHdpbnMgaWYgYm90aCBhcmUgc2V0LlxuZnVuY3Rpb24gY2hhcnRDb2x1bW5zKGNvbmZpZzogQ2hhcnRDb25maWcsIGRhdGE6IENvbXBvbmVudERhdGEpOiB7IHhDb2x1bW46IHN0cmluZzsgZ3JvdXBDb2x1bW46IHN0cmluZyB8IHVuZGVmaW5lZCB9IHtcbiAgcmV0dXJuIHtcbiAgICB4Q29sdW1uOiBjb25maWcueEF4aXM/LmNvbHVtbiA/PyBkYXRhLmNvbHVtbnNbMF0sXG4gICAgZ3JvdXBDb2x1bW46IGNvbmZpZy5zcGxpdEJ5Py5jb2x1bW4gfHwgY29sb3JCeUNvbHVtbihjb25maWcpLFxuICB9O1xufVxuXG4vLyBPbmUgY29sdW1uJ3MgdmFsdWVzIGJ5IGNhdGVnb3J5LCBmcm9tIHRoZSByb3dzIGBtYXRjaGAga2VlcHMgKGFsbCBvZiB0aGVtXG4vLyB3aGVuIGl0IGlzIGxlZnQgb3V0KS4gQSBjYXRlZ29yeSB3aXRoIG5vIHJvdyBoYXMgbm8gdmFsdWUuXG5mdW5jdGlvbiBjYXRlZ29yeVZhbHVlcyhcbiAgcm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgeENvbHVtbjogc3RyaW5nLFxuICByYXdDYXRlZ29yaWVzOiB1bmtub3duW10sXG4gIGNvbHVtbjogc3RyaW5nLFxuICBtYXRjaD86IChyb3c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBib29sZWFuLFxuKTogKG51bWJlciB8IG51bGwpW10ge1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDx1bmtub3duLCB1bmtub3duPigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKCFtYXRjaCB8fCBtYXRjaChyb3cpKSB7XG4gICAgICBieUNhdGVnb3J5LnNldChyb3dbeENvbHVtbl0sIHJvd1tjb2x1bW5dKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmF3Q2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBudW1lcmljKGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSkpO1xufVxuXG4vLyBBIGNvbXBhcmVkIHNlcmllcycgbmFtZSwgd29yZGVkIGZyb20gaXRzIGxhbmUncyBvZmZzZXQgcmF0aGVyIHRoYW4gZnJvbSBpdHNcbi8vIG93biBsYWJlbCwgc28gYSBjaGFydCB0aGUgdmlld2VyIHJlZ3JvdXBlZCBzYXlzIHdoYXQgaXQgbm93IGNvbXBhcmVzOlxuLy8gJ1JldmVudWUgKHZzIHByZXZpb3VzIHdlZWspJywgJ1JldmVudWUgY2hhbmdlICh2cyBwcmV2aW91cyB3ZWVrKScsICdSZXZlbnVlXG4vLyAlIGNoYW5nZSAodnMgcHJldmlvdXMgeWVhciknLiBUaGUgbWVhc3VyZSBpcyBuYW1lZCBhcyBpdHMgY3VycmVudCB2YWx1ZSdzXG4vLyBzZXJpZXMgaXMuIG51bGwgZm9yIGFueSBvdGhlciBzZXJpZXMsIHdoaWNoIGtlZXBzIGl0cyBvd24gbmFtZSwgYW5kIGZvclxuLy8gZGF0YSB3aXRob3V0IHRoZSBjb21wYXJpc29uIGtleXMuXG5mdW5jdGlvbiBjb21wYXJlZFNlcmllc05hbWUobWVhc3VyZTogQ2hhcnRNZWFzdXJlLCBtZWFzdXJlczogQ2hhcnRNZWFzdXJlW10sIGRhdGE6IENvbXBvbmVudERhdGEpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgb3V0cHV0ID0gZGF0YS5vdXRwdXRzPy5bbWVhc3VyZS5jb2x1bW5dO1xuICBjb25zdCBvZmZzZXQgPSBvdXRwdXQ/Lm9mZnNldCA/IGRhdGEuY29tcGFyaXNvbj8ub2Zmc2V0cz8uW291dHB1dC5vZmZzZXQgLSAxXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIW91dHB1dCB8fCAhb2Zmc2V0IHx8ICFvdXRwdXQucm9sZSB8fCBvdXRwdXQucm9sZSA9PT0gJ2N1cnJlbnQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gY3VycmVudE91dHB1dEFsaWFzKGRhdGEub3V0cHV0cywgbWVhc3VyZS5jb2x1bW4pO1xuICBjb25zdCBsYWJlbCA9IG1lYXN1cmVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmNvbHVtbiA9PT0gY3VycmVudCk/LmxhYmVsID8/IGN1cnJlbnQ7XG5cbiAgcmV0dXJuIGAke2xhYmVsfSR7Uk9MRV9OQU1FX1NVRkZJWEVTW291dHB1dC5yb2xlXX0gKCR7Y29tcGFyaXNvbk9mZnNldExhYmVsKG9mZnNldCl9KWA7XG59XG5cbi8vIFRoZSBjb2x1bW4gYW4gb3V0cHV0J3MgY3VycmVudCB2YWx1ZSBpcyBpbjogaXRzIGxhbmUncyBjdXJyZW50IG91dHB1dCwgZWxzZVxuLy8gZm9yIGEgcmFuayBvciBhIHNoYXJlIHRoZSB1bmNvbXBhcmVkIG9uZSBvZiB0aGUgc2FtZSBtZWFzdXJlLCBlbHNlIHRoZVxuLy8gbWVhc3VyZSdzIG93biBjb2x1bW4gKGEgd2luZG93ZWQgdmFsdWUncyBzb3VyY2UpLlxuZnVuY3Rpb24gY3VycmVudE91dHB1dEFsaWFzKG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIE91dHB1dE1ldGE+LCBhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1thbGlhc107XG4gIGNvbnN0IHVuY29tcGFyZWQgPSBvdXRwdXQua2luZCA9PT0gJ3ZhbHVlJ1xuICAgID8gdW5kZWZpbmVkXG4gICAgOiBPYmplY3Qua2V5cyhvdXRwdXRzKS5maW5kKChrZXkpID0+IG91dHB1dHNba2V5XS5tZWFzdXJlID09PSBvdXRwdXQubWVhc3VyZVxuICAgICAgJiYgb3V0cHV0c1trZXldLmtpbmQgPT09IG91dHB1dC5raW5kXG4gICAgICAmJiBvdXRwdXRzW2tleV0ucm9sZSA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIGxhbmVPdXRwdXRBbGlhcyhvdXRwdXRzLCBhbGlhcywgJ2N1cnJlbnQnKSA/PyB1bmNvbXBhcmVkID8/IG91dHB1dC5tZWFzdXJlO1xufVxuXG4vLyBBIHNlcmllcycgb3duIGNvbG9yIGFzIENTUyBoZXg6IGl0cyBtZWFzdXJlJ3MgbmFtZWQgY29sb3IsIG9yIHVuZGVmaW5lZCB3aGVuXG4vLyBpdCBuYW1lcyBub25lIChvciBhIG5hbWUgdGhlIHBhbGV0dGUgZG9lcyBub3Qga25vdykgYW5kIHRoZSB0aGVtZSBjb2xvcnMgaXRcbi8vIGJ5IGl0cyBwb3NpdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpZXNDb2xvcihzZXJpZXM6IEV4dHJhY3RlZENoYXJ0U2VyaWVzSXRlbSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhleCA9IG5hbWVkQ29sb3JIZXgoc2VyaWVzKTtcblxuICByZXR1cm4gaGV4ID8gYCMke2hleH1gIDogdW5kZWZpbmVkO1xufVxuXG4vLyBBIHNlcmllcycgY29sb3IgYXMgdGhlIGJhcmUgaGV4IFBvd2VyUG9pbnQgdGFrZXM6IGl0cyBtZWFzdXJlJ3MgbmFtZWQgY29sb3IsXG4vLyBlbHNlIHRoZSBwYWxldHRlIGNvbG9yIG9mIGl0cyBwb3NpdGlvbiwgYXMgdGhlIHNjcmVlbidzIHRoZW1lIHBpY2tzIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIHNlcmllc0hleChzZXJpZXM6IEV4dHJhY3RlZENoYXJ0U2VyaWVzSXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lZENvbG9ySGV4KHNlcmllcykgPz8gUkVQT1JUX0NIQVJUX0NPTE9SU1tpbmRleCAlIFJFUE9SVF9DSEFSVF9DT0xPUlMubGVuZ3RoXTtcbn1cblxuZnVuY3Rpb24gbmFtZWRDb2xvckhleChzZXJpZXM6IEV4dHJhY3RlZENoYXJ0U2VyaWVzSXRlbSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtZWFzdXJlQ29sb3JIZXgoc2VyaWVzLm1lYXN1cmUpO1xufVxuXG4vLyBBIG1lYXN1cmUncyBuYW1lZCBjb2xvciBhcyBiYXJlIGhleCwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgbmFtZXMgbm9uZSBvciBhXG4vLyBuYW1lIHRoZSBwYWxldHRlIGRvZXMgbm90IGtub3cuIFRoZSBuYW1lIGlzIHJlYWQgdGhyb3VnaCB0aGUgZW51bSwgc28gYVxuLy8gc3RvcmVkIG5hbWUgc3VjaCBhcyAnX19wcm90b19fJyBuZXZlciByZWFjaGVzIHRoZSBsb29rdXAgb2JqZWN0LlxuZnVuY3Rpb24gbWVhc3VyZUNvbG9ySGV4KG1lYXN1cmU6IENoYXJ0TWVhc3VyZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbG9yID0gT2JqZWN0LnZhbHVlcyhSZXBvcnRDaGFydENvbG9yKS5maW5kKChuYW1lKSA9PiBuYW1lID09PSBtZWFzdXJlPy5jb2xvcik7XG5cbiAgcmV0dXJuIGNvbG9yID8gUkVQT1JUX0NIQVJUX0NPTE9SX0JZX05BTUVbY29sb3JdIDogdW5kZWZpbmVkO1xufVxuXG4vLyBBIG1lYXN1cmUncyBsaW5lIHN0eWxlIHdoZW4gaXQgbmFtZXMgb25lIEVDaGFydHMga25vd3MsIGVsc2UgdW5kZWZpbmVkIGFuZFxuLy8gdGhlIGxpbmUgaXMgc29saWQuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZUxpbmVTdHlsZShtZWFzdXJlOiBDaGFydE1lYXN1cmUgfCB1bmRlZmluZWQpOiBSZXBvcnRDaGFydExpbmVTdHlsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFJlcG9ydENoYXJ0TGluZVN0eWxlKS5maW5kKChzdHlsZSkgPT4gc3R5bGUgPT09IG1lYXN1cmU/LmxpbmUpO1xufVxuXG4vLyBBIG1lYXN1cmUncyBzdGF0aXN0aWMgbGluZSB3aGVuIGl0IG5hbWVzIG9uZSB0aGUgdmlld2VyIGtub3dzLCBlbHNlXG4vLyB1bmRlZmluZWQgYW5kIGl0IGRyYXdzIG5vbmUuXG5leHBvcnQgZnVuY3Rpb24gbWVhc3VyZU1hcmtTdGF0KG1lYXN1cmU6IENoYXJ0TWVhc3VyZSB8IHVuZGVmaW5lZCk6IFJlcG9ydENoYXJ0TWFya1N0YXQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhSZXBvcnRDaGFydE1hcmtTdGF0KS5maW5kKChzdGF0KSA9PiBzdGF0ID09PSBtZWFzdXJlPy5tYXJrTGluZSk7XG59XG5cbi8vIEEgc2VyaWVzJyBzdGF0aXN0aWMgb3ZlciBpdHMgcG9pbnRzIHRoYXQgaGF2ZSBhIHZhbHVlOiB0aGVpciBtZWFuLCB0aGVpclxuLy8gbWVkaWFuICh0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMgd2hlbiB0aGUgY291bnQgaXMgZXZlbiksIHRoZVxuLy8gbG93ZXN0IG9yIHRoZSBoaWdoZXN0LiBudWxsIHdoZW4gbm8gcG9pbnQgaGFzIGEgdmFsdWUuIFNoYXJlZCB3aXRoIHRoZVxuLy8gUG93ZXJQb2ludCBleHBvcnQgc28gYm90aCBtZWRpYSBkcmF3IHRoZSBsaW5lIGF0IHRoZSBzYW1lIGhlaWdodC5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpZXNTdGF0KHZhbHVlczogKG51bWJlciB8IG51bGwpW10sIHN0YXQ6IFJlcG9ydENoYXJ0TWFya1N0YXQpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcHJlc2VudCA9IHZhbHVlcy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgbnVtYmVyID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG5cbiAgaWYgKCFwcmVzZW50Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChzdGF0KSB7XG4gICAgY2FzZSBSZXBvcnRDaGFydE1hcmtTdGF0LkF2ZXJhZ2U6XG4gICAgICByZXR1cm4gcHJlc2VudC5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IHN1bSArIHZhbHVlLCAwKSAvIHByZXNlbnQubGVuZ3RoO1xuICAgIGNhc2UgUmVwb3J0Q2hhcnRNYXJrU3RhdC5NZWRpYW46IHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5wcmVzZW50XS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKHNvcnRlZC5sZW5ndGggLyAyKTtcblxuICAgICAgcmV0dXJuIHNvcnRlZC5sZW5ndGggJSAyID8gc29ydGVkW21pZGRsZV0gOiAoc29ydGVkW21pZGRsZSAtIDFdICsgc29ydGVkW21pZGRsZV0pIC8gMjtcbiAgICB9XG4gICAgY2FzZSBSZXBvcnRDaGFydE1hcmtTdGF0Lk1pbjpcbiAgICAgIHJldHVybiBNYXRoLm1pbiguLi5wcmVzZW50KTtcbiAgICBjYXNlIFJlcG9ydENoYXJ0TWFya1N0YXQuTWF4OlxuICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLnByZXNlbnQpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBXaGV0aGVyIGEgY2hhcnQgZHJhd3Mgc3RhdGlzdGljIGxpbmVzLiBBIGhvcml6b250YWwgY2hhcnQncyB2YWx1ZXMgcnVuXG4vLyBhbG9uZyB4LCBhbmQgUG93ZXJQb2ludCBjYW5ub3QgZHJhdyBhIGxpbmUgYmVzaWRlIGhvcml6b250YWwgYmFycywgc29cbi8vIG5laXRoZXIgbWVkaXVtIGRyYXdzIG9uZSB0aGVyZS5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3c1N0YXRMaW5lcyhjb25maWc6IENoYXJ0Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcub3JpZW50YXRpb24gIT09ICdob3Jpem9udGFsJztcbn1cblxuLy8gQSBjb2xvckJ5IGNoYXJ0J3Mgb25lIHZhbHVlIHBlciBjYXRlZ29yeTogc2VyaWVzIGkgaG9sZHMgY2F0ZWdvcnkgaSdzIGJhci5cbi8vIFBvd2VyUG9pbnQgZHJhd3MgdGhlc2UgYXMgaXRzIG9uZSBzZXJpZXMsIGFuZCBhIHN0YXRpc3RpYyBsaW5lIGlzIHRha2VuXG4vLyBvdmVyIHRoZW0uXG5leHBvcnQgZnVuY3Rpb24gY29sb3JCeVZhbHVlcyhleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzKTogKG51bWJlciB8IG51bGwpW10ge1xuICByZXR1cm4gZXh0cmFjdGVkLmNhdGVnb3JpZXMubWFwKChfLCBpbmRleCkgPT4gZXh0cmFjdGVkLnNlcmllc1tpbmRleF0/LnZhbHVlc1tpbmRleF0gPz8gbnVsbCk7XG59XG5cbi8vIFRoZSByZWZlcmVuY2VzIGEgY2hhcnQgZHJhd3MuIEEgdmVydGljYWwgYXhpcyBjaGFydCBhbmQgYSB3YXRlcmZhbGwgZHJhd1xuLy8gdGhlbTsgYSBwaWUgaGFzIG5vIHZhbHVlIGF4aXMsIGFuZCBhIGhvcml6b250YWwgY2hhcnQgaXMgbGVmdCB3aXRob3V0IHRoZW1cbi8vIGFzIFBvd2VyUG9pbnQgY2Fubm90IGRyYXcgYSBsaW5lIGJlc2lkZSBob3Jpem9udGFsIGJhcnMuIEFuIGVudHJ5IHdpdGhvdXQgYVxuLy8gZmluaXRlIHZhbHVlIGlzIHNraXBwZWQsIGFuZCBvbmUgd2hvc2UgYHRvYCBpcyBtaXNzaW5nIG9yIGVxdWFsIHRvIGl0cyB2YWx1ZVxuLy8gaXMgYSBsaW5lLiBzZWNvbmRhcnkgcmVhY2hlcyB0aGUgc2Vjb25kIHZhbHVlIGF4aXMgb25seSBvbiBhIGNoYXJ0IHRoYXQgaGFzXG4vLyBvbmUgKHR3b0F4ZXMpLiBTaGFyZWQgd2l0aCB0aGUgUG93ZXJQb2ludCBleHBvcnQuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnRSZWZlcmVuY2VzKGNvbmZpZzogQ2hhcnRDb25maWcsIHR3b0F4ZXM6IGJvb2xlYW4pOiBEcmF3blJlZmVyZW5jZVtdIHtcbiAgY29uc3QgY2hhcnRUeXBlID0gY29uZmlnLmNoYXJ0VHlwZSA/PyAnYmFyJztcbiAgY29uc3QgcmVmZXJlbmNlczogKENoYXJ0UmVmZXJlbmNlIHwgbnVsbCB8IHVuZGVmaW5lZClbXSA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnJlZmVyZW5jZXMpID8gY29uZmlnLnJlZmVyZW5jZXMgOiBbXTtcblxuICBpZiAoY29uZmlnLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgfHwgY2hhcnRUeXBlID09PSAncGllJyB8fCBjaGFydFR5cGUgPT09ICdkb251dCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gcmVmZXJlbmNlcy5mbGF0TWFwKChyZWZlcmVuY2UpOiBEcmF3blJlZmVyZW5jZVtdID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF4aXNOdW1iZXIocmVmZXJlbmNlPy52YWx1ZSk7XG5cbiAgICBpZiAoIXJlZmVyZW5jZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdG8gPSBheGlzTnVtYmVyKHJlZmVyZW5jZS50byk7XG4gICAgY29uc3QgbGFiZWwgPSB0eXBlb2YgcmVmZXJlbmNlLmxhYmVsID09PSAnc3RyaW5nJyA/IHJlZmVyZW5jZS5sYWJlbCA6ICcnO1xuICAgIGNvbnN0IGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXggPSB0d29BeGVzICYmIHJlZmVyZW5jZS5zZWNvbmRhcnkgPT09IHRydWUgPyAxIDogMDtcblxuICAgIHJldHVybiBbdG8gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdmFsdWVcbiAgICAgID8geyBsYWJlbCwgbG93OiBNYXRoLm1pbih2YWx1ZSwgdG8pLCBoaWdoOiBNYXRoLm1heCh2YWx1ZSwgdG8pLCBiYW5kOiB0cnVlLCBheGlzSW5kZXggfVxuICAgICAgOiB7IGxhYmVsLCBsb3c6IHZhbHVlLCBoaWdoOiB2YWx1ZSwgYmFuZDogZmFsc2UsIGF4aXNJbmRleCB9XTtcbiAgfSk7XG59XG5cbi8vIEVhY2ggc2VyaWVzIGFzIGl0cyBzaGFyZSBvZiBpdHMgY2F0ZWdvcnkncyB0b3RhbDogcGVyIGNhdGVnb3J5LCB0aGVcbi8vIGRlbm9taW5hdG9yIGlzIHRoZSBzdW0gb2YgZXZlcnkgc2VyaWVzJyBhYnNvbHV0ZSB2YWx1ZSB0aGVyZSwgc28gdGhlXG4vLyBtYWduaXR1ZGVzIG9mIGEgY2F0ZWdvcnkncyBzaGFyZXMgYWRkIHVwIHRvIDEuIEEgbWl4ZWQtc2lnbiBjYXRlZ29yeSdzXG4vLyBuZWdhdGl2ZSB2YWx1ZXMgdGFrZSBuZWdhdGl2ZSBzaGFyZXMsIGRyYXduIGJlbG93IHplcm8uIEEgbWlzc2luZyB2YWx1ZVxuLy8gc3RheXMgbWlzc2luZywgYW5kIGEgY2F0ZWdvcnkgd2hvc2UgdG90YWwgaXMgemVybyBoYXMgbm8gc2hhcmVzLiBTaGFyZWQgYnlcbi8vIHRoZSBzY3JlZW4sIHRoZSBQREYgYW5kIFBvd2VyUG9pbnQsIHNvIGEgMTAwJSBzdGFjayByZWFkcyB0aGUgc2FtZSBpbiBlYWNoLlxuZXhwb3J0IGZ1bmN0aW9uIHBlcmNlbnRTaGFyZXModmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXVtdKTogKG51bWJlciB8IG51bGwpW11bXSB7XG4gIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDAsIC4uLnZhbHVlcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLmxlbmd0aCkpO1xuICBjb25zdCB0b3RhbHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0sIChfLCBpbmRleCkgPT4gdmFsdWVzXG4gICAgLnJlZHVjZSgoc3VtLCBzZXJpZXMpID0+IHN1bSArIE1hdGguYWJzKHNlcmllc1tpbmRleF0gPz8gMCksIDApKTtcblxuICByZXR1cm4gdmFsdWVzLm1hcCgoc2VyaWVzKSA9PiBzZXJpZXMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fCAhdG90YWxzW2luZGV4XSA/IG51bGwgOiB2YWx1ZSAvIHRvdGFsc1tpbmRleF1cbiAgKSkpO1xufVxuXG4vLyBUaGUgc2hhcmVzIGEgMTAwJSBzdGFja2VkIGNoYXJ0IGRyYXdzIGluIHBsYWNlIG9mIGl0cyB2YWx1ZXMsIG9yIG51bGwgd2hlblxuLy8gdGhlIGNoYXJ0IGlzIG5vdCBvbmUuIFRoZSBwcmltYXJ5IGF4aXMncyBiYXIgYW5kIGFyZWEgc2VyaWVzIHRha2UgdGhlbSxcbi8vIGVhY2ggdHlwZSdzIHNlcmllcyBzaGFyaW5nIGFtb25nIHRoZW1zZWx2ZXMsIGFzIGVhY2ggdHlwZSBzdGFja3MgYXBhcnQuXG4vLyBMaW5lcyBhbmQgc2Vjb25kYXJ5LWF4aXMgc2VyaWVzIGtlZXAgdGhlaXIgdmFsdWVzLiBBIHBpZSwgYSB3YXRlcmZhbGwgYW5kIGFcbi8vIGNvbG9yQnkgY2hhcnQgKG9uZSBzZXJpZXMgcGVyIGNhdGVnb3J5LCBlYWNoIG9mIHdoaWNoIHdvdWxkIGJlIDEwMCUpIGFyZVxuLy8gbmV2ZXIgMTAwJSBzdGFja2VkLCBub3IgaXMgYSBjaGFydCB3aXRoIG5vIGJhciBvciBhcmVhIG9uIGl0cyBwcmltYXJ5IGF4aXMuXG5leHBvcnQgZnVuY3Rpb24gcGVyY2VudFN0YWNrZWRTaGFyZXMoZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcywgY29uZmlnOiBDaGFydENvbmZpZyk6IFBlcmNlbnRTaGFyZXMgfCBudWxsIHtcbiAgY29uc3QgY2hhcnRUeXBlID0gY29uZmlnLmNoYXJ0VHlwZSA/PyAnYmFyJztcblxuICBpZiAoY29uZmlnLnBlcmNlbnRTdGFja2VkICE9PSB0cnVlXG4gICAgfHwgY2hhcnRUeXBlID09PSAncGllJyB8fCBjaGFydFR5cGUgPT09ICdkb251dCcgfHwgY2hhcnRUeXBlID09PSAnd2F0ZXJmYWxsJ1xuICAgIHx8IGlzQ29sb3JCeShjb25maWcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB0eXBlcyA9IHNlcmllc1R5cGVzKGV4dHJhY3RlZCwgY2hhcnRUeXBlKTtcbiAgY29uc3QgYXhpc0luZGV4ZXMgPSBzZXJpZXNBeGlzSW5kZXhlcyhleHRyYWN0ZWQsIGNvbmZpZyk7XG4gIGNvbnN0IHNoYXJlczogUGVyY2VudFNoYXJlcyA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IHR5cGUgb2YgWydiYXInLCAnYXJlYSddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgaW5kZXhlcyA9IHR5cGVzXG4gICAgICAubWFwKChzZXJpZXNUeXBlLCBpbmRleCkgPT4gKHNlcmllc1R5cGUgPT09IHR5cGUgJiYgYXhpc0luZGV4ZXNbaW5kZXhdID09PSAwID8gaW5kZXggOiAtMSkpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggPj0gMCk7XG4gICAgY29uc3QgdHlwZVNoYXJlcyA9IHBlcmNlbnRTaGFyZXMoaW5kZXhlcy5tYXAoKGluZGV4KSA9PiBleHRyYWN0ZWQuc2VyaWVzW2luZGV4XS52YWx1ZXMpKTtcbiAgICBpbmRleGVzLmZvckVhY2goKHNlcmllc0luZGV4LCBwb3NpdGlvbikgPT4gc2hhcmVzLnNldChzZXJpZXNJbmRleCwgdHlwZVNoYXJlc1twb3NpdGlvbl0pKTtcbiAgfVxuXG4gIHJldHVybiBzaGFyZXMuc2l6ZSA/IHNoYXJlcyA6IG51bGw7XG59XG5cbi8vIFdoZXJlIGEgMTAwJSBzdGFja2VkIGNoYXJ0J3MgdmFsdWUgYXhpcyBzdGFydHM6IGF0IC0xMDAlIHdoZW4gYW55IHNoYXJlIGlzXG4vLyBuZWdhdGl2ZSwgZWxzZSBhdCB6ZXJvLlxuZXhwb3J0IGZ1bmN0aW9uIHBlcmNlbnRBeGlzTWluKHNoYXJlczogUGVyY2VudFNoYXJlcyk6IG51bWJlciB7XG4gIHJldHVybiBbLi4uc2hhcmVzLnZhbHVlcygpXS5zb21lKChzZXJpZXMpID0+IHNlcmllcy5zb21lKChzaGFyZSkgPT4gKHNoYXJlID8/IDApIDwgMCkpID8gLTEgOiAwO1xufVxuXG4vLyBUaGUgbWVhc3VyZXMgYSBjaGFydCBwbG90czogaXRzIGNvbmZpZ3VyZWQgb25lcywgZWxzZSB0aGUgcXVlcnkncyBsYXN0XG4vLyBjb2x1bW4sIHVuZm9ybWF0dGVkLlxuZnVuY3Rpb24gY2hhcnRNZWFzdXJlcyhjb25maWc6IENoYXJ0Q29uZmlnLCBkYXRhOiBDb21wb25lbnREYXRhKTogQ2hhcnRNZWFzdXJlW10ge1xuICByZXR1cm4gY29uZmlnLm1lYXN1cmVzPy5sZW5ndGhcbiAgICA/IGNvbmZpZy5tZWFzdXJlc1xuICAgIDogW3sgY29sdW1uOiBkYXRhLmNvbHVtbnNbZGF0YS5jb2x1bW5zLmxlbmd0aCAtIDFdIH1dO1xufVxuXG4vLyBUaGUgdHlwZSBlYWNoIGV4dHJhY3RlZCBzZXJpZXMgaXMgZHJhd24gYXM6IGl0cyBtZWFzdXJlJ3Mgb3duIHR5cGUgd2hlbiBpdFxuLy8gbmFtZXMgb25lLCB0aGUgY2hhcnQncyBjaGFydFR5cGUgb3RoZXJ3aXNlLiBNb3JlIHRoYW4gb25lIGRpc3RpbmN0IHR5cGUgaXMgYVxuLy8gY29tYm8gY2hhcnQuIFNoYXJlZCB3aXRoIHRoZSBQb3dlclBvaW50IGV4cG9ydCBzbyBib3RoIG1lZGlhIGRyYXcgZWFjaCBzZXJpZXNcbi8vIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpZXNUeXBlcyhleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLCBjaGFydFR5cGU6IEF4aXNDaGFydFR5cGUpOiBBeGlzQ2hhcnRUeXBlW10ge1xuICByZXR1cm4gZXh0cmFjdGVkLnNlcmllcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLnR5cGUgPz8gY2hhcnRUeXBlKTtcbn1cblxuLy8gVGhlIHZhbHVlIGF4aXMgZWFjaCBleHRyYWN0ZWQgc2VyaWVzIGlzIHBsb3R0ZWQgYWdhaW5zdDogMSB3aGVuIGl0cyBtZWFzdXJlXG4vLyBpcyBzZWNvbmRhcnksIDAgb3RoZXJ3aXNlLiBBIHNlY29uZCBheGlzIGlzIGRyYXduIG9ubHkgb24gYSB2ZXJ0aWNhbCBjaGFydFxuLy8gdGhhdCBrZWVwcyBhdCBsZWFzdCBvbmUgc2VyaWVzIG9uIHRoZSBwcmltYXJ5IGF4aXMsIHNvIGEgY29tYmluYXRpb24gdGhlXG4vLyBzZXJ2ZXIgcmVmdXNlcyAoYSBob3Jpem9udGFsIGNoYXJ0LCBldmVyeSBtZWFzdXJlIHNlY29uZGFyeSwgdGhlIG9uZSBtZWFzdXJlXG4vLyBvZiBhIHNwbGl0Qnkgb3IgY29sb3JCeSBjaGFydCkgcGxvdHMgZXZlcnl0aGluZyBvbiB0aGUgcHJpbWFyeSBheGlzLiBTaGFyZWRcbi8vIHdpdGggdGhlIFBvd2VyUG9pbnQgZXhwb3J0IHNvIGJvdGggbWVkaWEgcHV0IGVhY2ggc2VyaWVzIG9uIHRoZSBzYW1lIGF4aXMuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWVzQXhpc0luZGV4ZXMoZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcywgY29uZmlnOiBDaGFydENvbmZpZyk6IFZhbHVlQXhpc0luZGV4W10ge1xuICBjb25zdCBzZWNvbmRhcnkgPSBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzKSA9PiAhIXNlcmllcy5tZWFzdXJlLnNlY29uZGFyeSk7XG4gIGNvbnN0IHR3b0F4ZXMgPSBjb25maWcub3JpZW50YXRpb24gIT09ICdob3Jpem9udGFsJyAmJiBzZWNvbmRhcnkuaW5jbHVkZXModHJ1ZSkgJiYgc2Vjb25kYXJ5LmluY2x1ZGVzKGZhbHNlKTtcblxuICByZXR1cm4gc2Vjb25kYXJ5Lm1hcCgoaXNTZWNvbmRhcnkpID0+ICh0d29BeGVzICYmIGlzU2Vjb25kYXJ5ID8gMSA6IDApKTtcbn1cblxuLy8gT25lIGJhciBvZiBhIHdhdGVyZmFsbC4gYHN0YXJ0YCBpcyB0aGUgcnVubmluZyB0b3RhbCBiZWZvcmUgaXQsIHdoZXJlIHRoZSBiYXJcbi8vIHN0YXJ0cywgYW5kIGBjaGFuZ2VgIGl0cyBzaWduZWQgaGVpZ2h0LCBzbyBpdCBlbmRzIGF0IHN0YXJ0ICsgY2hhbmdlLiBUaGVcbi8vIGNsb3NpbmcgdG90YWwgc3RhcnRzIGF0IHplcm8gYW5kIGl0cyBjaGFuZ2UgaXMgdGhlIHdob2xlIHJ1bm5pbmcgdG90YWwuXG5leHBvcnQgaW50ZXJmYWNlIFdhdGVyZmFsbFN0ZXAge1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICBzdGFydDogbnVtYmVyO1xuICBjaGFuZ2U6IG51bWJlciB8IG51bGw7XG4gIGtpbmQ6IFdhdGVyZmFsbFN0ZXBLaW5kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RlZFdhdGVyZmFsbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgc3RlcHM6IFdhdGVyZmFsbFN0ZXBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFdBVEVSRkFMTF9UT1RBTF9MQUJFTCA9ICdUb3RhbCc7XG5cbi8vIEEgd2F0ZXJmYWxsJ3MgYmFycyBmcm9tIGl0cyBvbmUgbWVhc3VyZTogZWFjaCBjYXRlZ29yeSdzIHZhbHVlIGlzIGhvdyBmYXIgdGhlXG4vLyBydW5uaW5nIHRvdGFsIG1vdmVzIHRoZXJlLCBhbmQgYSBsYXN0IFRvdGFsIGJhciBzaG93cyB3aGVyZSBpdCBlbmRlZC4gQVxuLy8gY2F0ZWdvcnkgd2l0aCBubyB2YWx1ZSBtb3ZlcyBub3RoaW5nIGFuZCBkcmF3cyBubyBiYXIuIFNoYXJlZCB3aXRoIHRoZVxuLy8gUG93ZXJQb2ludCBleHBvcnQgc28gYm90aCBtZWRpYSBkcmF3IHRoZSBzYW1lIHN0ZXBzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RXYXRlcmZhbGwoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGRhdGE6IENvbXBvbmVudERhdGEpOiBFeHRyYWN0ZWRXYXRlcmZhbGwge1xuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0Q2hhcnRTZXJpZXMoY29tcG9uZW50LCBkYXRhKTtcbiAgY29uc3QgdmFsdWVzID0gZXh0cmFjdGVkLnNlcmllc1swXT8udmFsdWVzID8/IFtdO1xuICBjb25zdCBzdGVwczogV2F0ZXJmYWxsU3RlcFtdID0gW107XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZXh0cmFjdGVkLmNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY2hhbmdlID0gdmFsdWVzW2luZGV4XSA/PyBudWxsO1xuICAgIHN0ZXBzLnB1c2goeyBjYXRlZ29yeSwgc3RhcnQ6IHRvdGFsLCBjaGFuZ2UsIGtpbmQ6IChjaGFuZ2UgPz8gMCkgPCAwID8gJ2ZhbGwnIDogJ3Jpc2UnIH0pO1xuICAgIHRvdGFsICs9IGNoYW5nZSA/PyAwO1xuICB9KTtcblxuICBzdGVwcy5wdXNoKHsgY2F0ZWdvcnk6IFdBVEVSRkFMTF9UT1RBTF9MQUJFTCwgc3RhcnQ6IDAsIGNoYW5nZTogdG90YWwsIGtpbmQ6ICd0b3RhbCcgfSk7XG5cbiAgcmV0dXJuIHsgbmFtZTogZXh0cmFjdGVkLnNlcmllc1swXT8ubmFtZSA/PyAnJywgc3RlcHMgfTtcbn1cblxuLy8gVGhlIG9uZSBwdXJlIG1hcHBpbmcgZnJvbSBvdXIgc3RhbmRhcmQgY2FtZWxDYXNlIGNoYXJ0IGNvbmZpZyArIHRoZSBkYXRhXG4vLyBlbmRwb2ludCdzIHJvd3MgdG8gYW4gRUNoYXJ0cyBvcHRpb24uIEV2ZXJ5dGhpbmcgdmlzdWFsIHRoYXQgaXNuJ3QgaW4gdGhlXG4vLyByZWdpc3RlcmVkICdyZXBvcnQnIHRoZW1lIGlzIGRlY2lkZWQgaGVyZSwgc28gcmVwb3J0IHN0YW5kYXJkcyBoYXZlIGV4YWN0bHlcbi8vIHR3byBob21lcy5cbi8vXG4vLyBFdmVyeSBudW1iZXIgYW5kIHBlcmlvZCB0aGUgY2hhcnQgd3JpdGVzICh2YWx1ZS1heGlzIHRpY2tzLCB0b29sdGlwIHZhbHVlcyxcbi8vIHBlcmlvZCBsYWJlbHMpIGlzIGluIHRoZSBjb250ZXh0J3MgbG9jYWxlLCBuZXZlciB0aGUgYnJvd3NlcidzLiBBIG1lYXN1cmVcbi8vIHdpdGggbnVtYmVyLWZvcm1hdCBrZXlzIGZvcm1hdHMgaXRzIHRvb2x0aXBzLCBhbmQgdGhlIHZhbHVlIGF4aXMgd2hlbiBldmVyeVxuLy8gbWVhc3VyZSBvbiBpdCBhZ3JlZXMgKGF4aXNOdW1iZXJGb3JtYXQpOyB3aXRob3V0IHRoZW0gdGhlIGF4aXMgYW5kIHRvb2x0aXBzXG4vLyBrZWVwIHRoZSBwbGFpbiBsb2NhbGUtZ3JvdXBlZCBudW1iZXIuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDaGFydE9wdGlvbihcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBFQ2hhcnRzT3B0aW9uIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3QgY2hhcnRUeXBlID0gY29uZmlnLmNoYXJ0VHlwZSA/PyAnYmFyJztcblxuICBpZiAoY2hhcnRUeXBlID09PSAncGllJyB8fCBjaGFydFR5cGUgPT09ICdkb251dCcpIHtcbiAgICByZXR1cm4gYnVpbGRQaWVPcHRpb24oY29tcG9uZW50LCBkYXRhLCBjaGFydFR5cGUgPT09ICdkb251dCcsIGNvbnRleHQpO1xuICB9XG5cbiAgaWYgKGNoYXJ0VHlwZSA9PT0gJ3dhdGVyZmFsbCcpIHtcbiAgICByZXR1cm4gYnVpbGRXYXRlcmZhbGxPcHRpb24oY29tcG9uZW50LCBkYXRhLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEF4aXNPcHRpb24oY29tcG9uZW50LCBkYXRhLCBjaGFydFR5cGUsIGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZEF4aXNPcHRpb24oXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjaGFydFR5cGU6IEF4aXNDaGFydFR5cGUsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBFQ2hhcnRzT3B0aW9uIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdENoYXJ0U2VyaWVzKGNvbXBvbmVudCwgZGF0YSk7XG4gIGNvbnN0IGhvcml6b250YWwgPSBjb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgY29uc3QgY29sb3JCeSA9IGlzQ29sb3JCeShjb25maWcpO1xuICBjb25zdCB0eXBlcyA9IHNlcmllc1R5cGVzKGV4dHJhY3RlZCwgY2hhcnRUeXBlKTtcbiAgY29uc3QgY29tYm8gPSBuZXcgU2V0KHR5cGVzKS5zaXplID4gMTtcblxuICAvLyBjb2xvckJ5IGVtaXRzIG9uZSBzZXJpZXMgcGVyIGNhdGVnb3J5OyBvdmVybGFwcGluZyB0aGVtIChiYXJHYXAgLTEwMCUpIG1ha2VzXG4gIC8vIGVhY2ggcmVuZGVyIGF0IHRoZSBmdWxsIGNhdGVnb3J5LWJhbmQgd2lkdGgg4oCUIG9uZSBmdWxsLXdpZHRoLCBkaXN0aW5jdGx5XG4gIC8vIGNvbG9yZWQgYmFyIHBlciBjYXRlZ29yeSDigJQgaW5zdGVhZCBvZiBzaWRlLWJ5LXNpZGUgc2xpdmVycy4gVGhlIGxheW91dCBwcm9wc1xuICAvLyBhcmUgcmVhZCBmcm9tIHRoZSBmaXJzdCBzZXJpZXMgb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAvL1xuICAvLyBTdGFja2luZyBzdW1zIGV2ZXJ5IHNlcmllcyB0aGF0IHNoYXJlcyBhIHN0YWNrIG5hbWUsIHdoYXRldmVyIGl0cyB0eXBlLiBJblxuICAvLyBhIGNvbWJvIGVhY2ggdHlwZSBzdGFja3Mgb25seSB3aXRoIGl0cyBvd24ga2luZCwgc28gYSBsaW5lIG9mIGEgcmF0ZSBuZXZlclxuICAvLyBzaXRzIG9uIHRvcCBvZiB0aGUgYmFycycgdG90YWwsIGFuZCBvbiBhIHR3by1heGlzIGNoYXJ0IG9ubHkgd2l0aCB0aGVcbiAgLy8gc2VyaWVzIG9uIGl0cyBvd24gYXhpcy5cbiAgLy9cbiAgLy8gQSAxMDAlIHN0YWNrZWQgY2hhcnQgKHBlcmNlbnRTdGFja2VkU2hhcmVzKSBwbG90cyBpdHMgcHJpbWFyeSBiYXJzIGFuZFxuICAvLyBhcmVhcyBhcyBzaGFyZXMsIGVhY2ggdHlwZSBpbiBpdHMgb3duIHN0YWNrLCBhbmQgbGVhdmVzIGV2ZXJ5IG90aGVyIHNlcmllc1xuICAvLyB1bnN0YWNrZWQgb24gaXRzIG93biB2YWx1ZXMuXG4gIC8vXG4gIC8vIFdoYXQgdGhlIHNlcnZlciBzYXlzIG9mIHRoZSBudW1iZXJzIChjaGFydEFubm90YXRpb25zKSBtYXJrcyB0aGVtOiBhXG4gIC8vIHByaW9yIHNlcmllcyBkYXNoZWQgaW4gaXRzIGN1cnJlbnQgc2VyaWVzJyBjb2xvciwgdGhlIHBlcmlvZCBub3Qgb3ZlciB5ZXRcbiAgLy8gaGF0Y2hlZCBvciBkYXNoZWQsIHJhbmtzIG9uIGFuIGludmVydGVkIGF4aXMsIGZyYWN0aW9ucyBvbiBhIHBlcmNlbnQgYXhpcyxcbiAgLy8gYW5kIHRoZSB0b29sdGlwIG5hbWluZyBlYWNoIHByaW9yJ3MgZGF5cyBhbmQgZWFjaCB3aW5kb3cuIERhdGEgd2l0aG91dFxuICAvLyB0aG9zZSBrZXlzIGRyYXdzIGV4YWN0bHkgYXMgYmVmb3JlLlxuICBjb25zdCBheGlzSW5kZXhlcyA9IHNlcmllc0F4aXNJbmRleGVzKGV4dHJhY3RlZCwgY29uZmlnKTtcbiAgY29uc3QgdHdvQXhlcyA9IGF4aXNJbmRleGVzLmluY2x1ZGVzKDEpO1xuICBjb25zdCBzaGFyZXMgPSBwZXJjZW50U3RhY2tlZFNoYXJlcyhleHRyYWN0ZWQsIGNvbmZpZyk7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBjaGFydFJlZmVyZW5jZXMoY29uZmlnLCB0d29BeGVzKTtcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSBjaGFydEFubm90YXRpb25zKGNvbmZpZywgZGF0YSwgZXh0cmFjdGVkLCBjb2xvckJ5KTtcbiAgY29uc3QgYXhpc0Zvcm1hdHMgPSB2YWx1ZUF4aXNGb3JtYXRzKFxuICAgIGNvbmZpZyxcbiAgICBhbm5vdGF0aW9ucyA/IGFubm90YXRlZEF4aXNTZXJpZXMoZXh0cmFjdGVkLCBhbm5vdGF0aW9ucykgOiBleHRyYWN0ZWQsXG4gICAgYXhpc0luZGV4ZXMsXG4gICAgYW5ub3RhdGlvbnMgJiYgIXNoYXJlcyA/IGFubm90YXRlZEF4aXNDb250ZXh0cyhhbm5vdGF0aW9ucywgYXhpc0luZGV4ZXMsIGNvbnRleHQpIDogW2NvbnRleHQsIGNvbnRleHRdLFxuICAgICEhc2hhcmVzLFxuICAgIHJlZmVyZW5jZXMsXG4gICk7XG4gIGNvbnN0IHJhbmtBeGVzID0gYW5ub3RhdGlvbnMgJiYgIXNoYXJlcyA/IHJhbmtBeGlzRmxhZ3MoYW5ub3RhdGlvbnMub3V0cHV0cywgYXhpc0luZGV4ZXMpIDogW2ZhbHNlLCBmYWxzZV07XG4gIC8vIEEgc2VyaWVzJyBzdGF0aXN0aWMgbGluZSBpcyB0YWtlbiBvdmVyIHRoZSBwb2ludHMgaXQgcGxvdHMuIE9uIGEgY29sb3JCeVxuICAvLyBjaGFydCBlYWNoIHNlcmllcyBob2xkcyBvbmUgYmFyLCBzbyB0aGUgb25lIGxpbmUgaXMgdGFrZW4gb3ZlciB0aGUgYmFyc1xuICAvLyB0b2dldGhlciBhbmQgaGFuZ3Mgb2ZmIHRoZSBmaXJzdCBzZXJpZXMgKGNvbG9yQnlTdGF0TGluZSkuXG4gIGNvbnN0IHN0YXRMaW5lcyA9IGRyYXdzU3RhdExpbmVzKGNvbmZpZykgJiYgIWNvbG9yQnk7XG4gIGNvbnN0IHNlcmllczogU2VyaWVzT3B0aW9uW10gPSBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoZXh0cmFjdGVkU2VyaWVzLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHNlcmllc1NoYXJlcyA9IHNoYXJlcz8uZ2V0KGluZGV4KTtcbiAgICBsZXQgc3RhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VyaWVzU2hhcmVzKSB7XG4gICAgICBzdGFjayA9IHN0YWNrS2V5KHR5cGVzW2luZGV4XSwgY29tYm8sIDApO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnN0YWNrZWQgJiYgIXNoYXJlcykge1xuICAgICAgc3RhY2sgPSBzdGFja0tleSh0eXBlc1tpbmRleF0sIGNvbWJvLCB0d29BeGVzID8gYXhpc0luZGV4ZXNbaW5kZXhdIDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBBbiBvdXRwdXQgc2VyaWVzIChhIGNvbXBhcmVkLCB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCB2YWx1ZSkgd3JpdGVzXG4gICAgLy8gaXRzIHRvb2x0aXAsIGRhdGEgbGFiZWxzIGFuZCBzdGF0aXN0aWMgbGluZSBieSB3aGF0IGl0IGhvbGRzLlxuICAgIGNvbnN0IHdyaXRlID0gYW5ub3RhdGlvbnMgJiYgIXNlcmllc1NoYXJlcyAmJiBhbm5vdGF0aW9ucy5vdXRwdXRzW2luZGV4XVxuICAgICAgPyBvdXRwdXRXcml0ZXIoYW5ub3RhdGlvbnMsIGluZGV4LCBleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSwgY29udGV4dClcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzdGF0ID0gc3RhdExpbmVzID8gbWVhc3VyZU1hcmtTdGF0KGV4dHJhY3RlZFNlcmllcy5tZWFzdXJlKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXJrTGluZSA9IHN0YXQgJiYgc3RhdE1hcmtMaW5lKFxuICAgICAgc2VyaWVzU2hhcmVzID8/IGV4dHJhY3RlZFNlcmllcy52YWx1ZXMsXG4gICAgICBzdGF0LFxuICAgICAgc2VyaWVzU2hhcmVzID8gc2hhcmVXcml0ZXIoY29udGV4dCkgOiB3cml0ZSA/PyBtZWFzdXJlV3JpdGVyKGV4dHJhY3RlZFNlcmllcy5tZWFzdXJlLCBjb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbiA9IGJ1aWxkU2VyaWVzKFxuICAgICAgZXh0cmFjdGVkU2VyaWVzLFxuICAgICAgc2VyaWVzU2hhcmVzID8gc2hhcmVEYXRhKGV4dHJhY3RlZFNlcmllcy52YWx1ZXMsIHNlcmllc1NoYXJlcykgOiBleHRyYWN0ZWRTZXJpZXMudmFsdWVzLFxuICAgICAge1xuICAgICAgICB0eXBlOiB0eXBlc1tpbmRleF0sXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBvdmVybGFwOiBjb2xvckJ5ICYmIGluZGV4ID09PSAwLFxuICAgICAgICBjb21ibyxcbiAgICAgICAgdG9vbHRpcDogd3JpdGUgPyB7IHZhbHVlRm9ybWF0dGVyOiB3cml0ZSB9IDogc2VyaWVzVG9vbHRpcChleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSwgY29udGV4dCksXG4gICAgICAgIGF4aXNJbmRleDogdHdvQXhlcyA/IGF4aXNJbmRleGVzW2luZGV4XSA6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gQSBjb2xvckJ5IGNoYXJ0J3MgYmFycyB0YWtlIHRoZSBwYWxldHRlIGJ5IGNhdGVnb3J5LCBhcyBpblxuICAgICAgICAvLyBQb3dlclBvaW50LCB3aGF0ZXZlciBjb2xvciB0aGUgbWVhc3VyZSBuYW1lcy5cbiAgICAgICAgY29sb3I6IGNvbG9yQnkgPyB1bmRlZmluZWQgOiBhbm5vdGF0aW9ucz8uY29sb3JzPy5baW5kZXhdID8/IHNlcmllc0NvbG9yKGV4dHJhY3RlZFNlcmllcyksXG4gICAgICAgIGxhYmVsczogZGF0YUxhYmVsT3B0aW9uKGNvbmZpZy5kYXRhTGFiZWxzLCB3cml0ZVxuICAgICAgICAgID8gb3V0cHV0TGFiZWxGb3JtYXR0ZXIod3JpdGUpXG4gICAgICAgICAgOiBkYXRhTGFiZWxGb3JtYXR0ZXIoXG4gICAgICAgICAgICBleHRyYWN0ZWRTZXJpZXMubWVhc3VyZSxcbiAgICAgICAgICAgIGF4aXNGb3JtYXRzW2F4aXNJbmRleGVzW2luZGV4XV0gPz8gbnVsbCxcbiAgICAgICAgICAgICEhc2VyaWVzU2hhcmVzLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICApKSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZWQgPSBhbm5vdGF0aW9ucyA/IG1hcmtTZXJpZXMob3B0aW9uLCBhbm5vdGF0aW9ucywgaW5kZXgsIGV4dHJhY3RlZFNlcmllcy5tZWFzdXJlKSA6IG9wdGlvbjtcblxuICAgIHJldHVybiBtYXJrTGluZSA/IHsgLi4ubWFya2VkLCBtYXJrTGluZSB9IGFzIFNlcmllc09wdGlvbiA6IG1hcmtlZDtcbiAgfSk7XG5cbiAgaWYgKGNvbG9yQnkgJiYgZHJhd3NTdGF0TGluZXMoY29uZmlnKSAmJiBzZXJpZXMubGVuZ3RoKSB7XG4gICAgc2VyaWVzWzBdID0gY29sb3JCeVN0YXRMaW5lKHNlcmllc1swXSwgZXh0cmFjdGVkLCBjb250ZXh0LCBhbm5vdGF0aW9ucz8ub3V0cHV0c1swXVxuICAgICAgPyBvdXRwdXRXcml0ZXIoYW5ub3RhdGlvbnMsIDAsIGV4dHJhY3RlZC5zZXJpZXNbMF0ubWVhc3VyZSwgY29udGV4dClcbiAgICAgIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8vIERyYXduIGFmdGVyIHRoZSBtZWFzdXJlIHNlcmllcywgc28gYSB0b29sdGlwIHJlYWRzIGEgc2VyaWVzIGJ5IGl0cyBpbmRleC5cbiAgY29uc3Qgc2VnbWVudHMgPSBhbm5vdGF0aW9ucyA/IHBhcnRpYWxTZWdtZW50cyhzZXJpZXMsIGFubm90YXRpb25zKSA6IFtdO1xuICBjb25zdCBwZXJjZW50TWluID0gc2hhcmVzID8gcGVyY2VudEF4aXNNaW4oc2hhcmVzKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2F0ZWdvcnlBeGlzID0gY2F0ZWdvcnlBeGlzT3B0aW9uKGNvbmZpZywgZGF0YSwgZXh0cmFjdGVkLmNhdGVnb3JpZXMsIGhvcml6b250YWwsIGNvbnRleHQubG9jYWxlKTtcbiAgLy8gQW4gYXhpcyBvZiByYXRlIGNoYW5nZXMgYWxvbmUgcmVhZHMgaW4gcGVyY2VudGFnZSBwb2ludHMsIGFzIGl0cyB2YWx1ZXMgZG8uXG4gIGNvbnN0IGF4aXNMYWJlbHMgPSAoWzAsIDFdIGFzIGNvbnN0KS5tYXAoKGF4aXNJbmRleCkgPT4gKGFubm90YXRpb25zICYmICFzaGFyZXNcbiAgICA/IHBvaW50c0F4aXNMYWJlbChhbm5vdGF0aW9ucywgZXh0cmFjdGVkLCBheGlzSW5kZXhlcywgYXhpc0luZGV4LCBjb250ZXh0KVxuICAgIDogbnVsbCkgPz8gdmFsdWVBeGlzTGFiZWwoYXhpc0Zvcm1hdHNbYXhpc0luZGV4XSA/PyBudWxsLCBjb250ZXh0KSk7XG4gIGNvbnN0IHZhbHVlQXhpcyA9IHR3b0F4ZXNcbiAgICA/IHR3b1ZhbHVlQXhlc09wdGlvbihjb25maWcsIGF4aXNMYWJlbHMsIGNvbnRleHQsIHBlcmNlbnRNaW4sIHJlZmVyZW5jZXMsIHJhbmtBeGVzKVxuICAgIDogdmFsdWVBeGlzT3B0aW9uKGNvbmZpZy52YWx1ZUF4aXMsIGhvcml6b250YWwsIHBlcmNlbnRNaW4gPT09IHVuZGVmaW5lZFxuICAgICAgPyBheGlzTGFiZWxzWzBdXG4gICAgICA6IHBlcmNlbnRBeGlzTGFiZWwoY29udGV4dCksIHsgcGVyY2VudE1pbiwgcmVhY2g6IHJlZmVyZW5jZVJlYWNoKHJlZmVyZW5jZXMsIDApLCByYW5rOiByYW5rQXhlc1swXSB9KTtcblxuICBjb25zdCBsZWdlbmRQb3NpdGlvbiA9IHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWcsIHNlcmllcy5sZW5ndGgsIGNvbG9yQnkpO1xuICBjb25zdCB2YWx1ZVRpdGxlcyA9IFtjb25maWcudmFsdWVBeGlzLCB0d29BeGVzID8gY29uZmlnLnNlY29uZGFyeUF4aXMgOiB1bmRlZmluZWRdO1xuICBjb25zdCBncmFudWxhcml0eSA9IGJ1Y2tldEdyYW51bGFyaXR5KGRhdGEpO1xuXG4gIHJldHVybiB7XG4gICAgZ3JpZDogYXhpc0dyaWQobGVnZW5kUG9zaXRpb24sIGNhdGVnb3J5VGl0bGVTaWRlKGNvbmZpZywgaG9yaXpvbnRhbCksIHZhbHVlVGl0bGVTaWRlKHZhbHVlVGl0bGVzLCBob3Jpem9udGFsKSksXG4gICAgbGVnZW5kOiByZWZlcmVuY2VMZWdlbmQobGVnZW5kT3B0aW9uKGxlZ2VuZFBvc2l0aW9uKSwgc2VyaWVzLCByZWZlcmVuY2VzKSxcbiAgICAvLyBjb2xvckJ5IGNoYXJ0cyBvdmVybGFwIE4gbW9zdGx5LW51bGwgc2VyaWVzLCBzbyBhbiBheGlzIHRvb2x0aXAgd291bGQgbGlzdFxuICAgIC8vIGV2ZXJ5IGNhdGVnb3J5OyBhbiBpdGVtIHRvb2x0aXAgc2hvd3MganVzdCB0aGUgaG92ZXJlZCBiYXIuIEEgMTAwJVxuICAgIC8vIHN0YWNrZWQgY2hhcnQncyB0b29sdGlwIGdpdmVzIGVhY2ggc2hhcmUgYW5kIHRoZSB2YWx1ZSBpdCBjYW1lIGZyb20uIEFcbiAgICAvLyBjaGFydCB3aXRoIHRoZSBzZXJ2ZXIncyBhbm5vdGF0aW9ucyBuYW1lcyB3aGF0IGVhY2ggdmFsdWUgY292ZXJzLlxuICAgIHRvb2x0aXA6IHNoYXJlc1xuICAgICAgPyB7XG4gICAgICAgIHRyaWdnZXI6ICdheGlzJyxcbiAgICAgICAgZm9ybWF0dGVyOiAocGFyYW1zOiBUb29sdGlwQ29tcG9uZW50Rm9ybWF0dGVyQ2FsbGJhY2tQYXJhbXMpID0+IHBlcmNlbnRUb29sdGlwKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBleHRyYWN0ZWQsXG4gICAgICAgICAgc2hhcmVzLFxuICAgICAgICAgIGdyYW51bGFyaXR5LFxuICAgICAgICAgIGNoYXJ0RGF0ZUxhYmVsKGNvbmZpZyksXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKSxcbiAgICAgIH1cbiAgICAgIDogYW5ub3RhdGVkQ2hhcnRUb29sdGlwKGFubm90YXRpb25zICYmICFjb2xvckJ5ID8ge1xuICAgICAgICBleHRyYWN0ZWQsXG4gICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICBvd25lcnM6IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5vd25lciksXG4gICAgICAgIGdyYW51bGFyaXR5LFxuICAgICAgICBkYXRlTGFiZWw6IGNoYXJ0RGF0ZUxhYmVsKGNvbmZpZyksXG4gICAgICAgIGNvbnRleHQsXG4gICAgICB9IDogbnVsbCkgPz8geyB0cmlnZ2VyOiBjb2xvckJ5ID8gJ2l0ZW0nIDogJ2F4aXMnIH0sXG4gICAgeEF4aXM6IGhvcml6b250YWwgPyB2YWx1ZUF4aXMgOiBjYXRlZ29yeUF4aXMsXG4gICAgeUF4aXM6IGhvcml6b250YWwgPyBjYXRlZ29yeUF4aXMgOiB2YWx1ZUF4aXMsXG4gICAgc2VyaWVzOiBbLi4uc2VyaWVzLCAuLi5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQuc2VyaWVzKSwgLi4ucmVmZXJlbmNlQ2FycmllcnMocmVmZXJlbmNlcywgZXh0cmFjdGVkLmNhdGVnb3JpZXMpXSxcbiAgfTtcbn1cblxuLy8gV2hhdCB0aGUgc2VydmVyIHNheXMgb2YgdGhlIHNlcmllcyBhbiBheGlzIGNoYXJ0IHBsb3RzLCByZWFkIGZyb20gdGhlXG4vLyBkYXRhJ3MgY29tcGFyaXNvbiwgb3V0cHV0cywgd2luZG93cyBhbmQgcGFydGlhbFBlcmlvZCBieSBlYWNoIHNlcmllcydcbi8vIG1lYXN1cmUgY29sdW1uLiBjaGFydEFubm90YXRpb25zIGlzIG51bGwgd2hlbiB0aGUgZGF0YSBjYXJyaWVzIG5vbmUgb2Zcbi8vIHRob3NlIGtleXMsIGFuZCB0aGUgY2hhcnQgZHJhd3MgZXhhY3RseSBhcyBiZWZvcmUuXG5pbnRlcmZhY2UgQ2hhcnRBbm5vdGF0aW9ucyB7XG4gIG91dHB1dHM6IChPdXRwdXRNZXRhIHwgbnVsbClbXTtcbiAgd2luZG93czogKFdpbmRvd01ldGEgfCBudWxsKVtdO1xuICAvLyBUaGUgY2hhcnQgbWVhc3VyZSBhbiBvdXRwdXQgdGFrZXMgaXRzIG1lYXN1cmUncyBmb3JtYXQgZnJvbTogaXRzIGN1cnJlbnRcbiAgLy8gdmFsdWUncywgd2hlbiB0aGUgY2hhcnQgcGxvdHMgaXQuXG4gIG1lYXN1cmVTcGVjczogKENoYXJ0TWVhc3VyZSB8IHVuZGVmaW5lZClbXTtcbiAgLy8gQSBjaGFuZ2Ugb3IgcGVyY2VudCBjaGFuZ2Ugc2VyaWVzJyBwcmlvciB2YWx1ZXMgYnkgY2F0ZWdvcnksIHdoaWNoIHRlbGxcbiAgLy8gYSBtaXNzaW5nIGJhc2VsaW5lIGZyb20gYSB6ZXJvIG9uZTsgbnVsbCBmb3IgYW55IG90aGVyIHNlcmllcy5cbiAgcHJpb3JzOiAoKG51bWJlciB8IG51bGwpW10gfCBudWxsKVtdO1xuICAvLyBUaGUgbGFuZSBwcmlvciBhIGN1cnJlbnQsIGNoYW5nZSBvciBwZXJjZW50IGNoYW5nZSBzZXJpZXMgaXMgY29tcGFyZWRcbiAgLy8gd2l0aCwgd2hlbiB0aGUgY2hhcnQgZG9lcyBub3QgcGxvdCB0aGF0IHByaW9yIGl0c2VsZjogaXRzIHRvb2x0aXAgbGluZVxuICAvLyBuYW1lcyB0aGUgcHJpb3IncyB2YWx1ZSBhbmQgZGF5cy4gbnVsbCBmb3IgYW55IG90aGVyIHNlcmllcy5cbiAgbGFuZVByaW9yczogKExhbmVQcmlvciB8IG51bGwpW107XG4gIC8vIEV2ZXJ5IHNlcmllcycgb3duIENTUyBjb2xvciwgc28gYSBwcmlvciBzZXJpZXMgYW5kIGEgcGFydGlhbCBzZWdtZW50IGNhblxuICAvLyBzaGFyZSBhbm90aGVyJ3M7IG51bGwgb24gYSBjb2xvckJ5IGNoYXJ0LCB3aGljaCBjb2xvcnMgYnkgY2F0ZWdvcnkuXG4gIGNvbG9yczogc3RyaW5nW10gfCBudWxsO1xuICBwcmlvclNlcmllczogYm9vbGVhbltdO1xuICBjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbDtcbiAgLy8gVGhlIGNhdGVnb3J5IG9mIHRoZSBwZXJpb2Qgbm90IG92ZXIgeWV0LCBvciBudWxsLlxuICBwYXJ0aWFsSW5kZXg6IG51bWJlciB8IG51bGw7XG59XG5cbi8vIEEgc2VyaWVzJyBsYW5lIHByaW9yOiBpdHMgb3V0cHV0LCBpdHMgdmFsdWVzIGJ5IGNhdGVnb3J5LCBhbmQgYSBrZXkgdGhhdFxuLy8gbmFtZXMgaXQgb25jZSBpbiBhIHRvb2x0aXAgKHRoZSBwcmlvciBjb2x1bW4sIGFuZCBvbiBhIHNwbGl0QnkgY2hhcnQgdGhlXG4vLyBncm91cCkuXG5pbnRlcmZhY2UgTGFuZVByaW9yIHtcbiAga2V5OiBzdHJpbmc7XG4gIG91dHB1dDogT3V0cHV0TWV0YTtcbiAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXTtcbn1cblxuLy8gVGhlIGtleXMgb2YgYSBidWlsdCBheGlzIHNlcmllcyB0aGF0IHRoZSBhbm5vdGF0aW9ucyByZWFkIGFuZCByZXBsYWNlLlxuaW50ZXJmYWNlIERyYXduU2VyaWVzIHtcbiAgdHlwZT86IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGRhdGE/OiBTZXJpZXNEYXRhSXRlbTxEYXRhTGFiZWxQb3NpdGlvbj5bXTtcbiAgaXRlbVN0eWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxpbmVTdHlsZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBBIGRhc2hlZCBsYXN0IHNlZ21lbnQgKHBhcnRpYWxTZWdtZW50cyksIGRyYXduIGFmdGVyIHRoZSBtZWFzdXJlIHNlcmllcyxcbi8vIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNlcmllcyBpdCBjb250aW51ZXMuXG5pbnRlcmZhY2UgUGFydGlhbFNlZ21lbnQge1xuICBzZXJpZXM6IFNlcmllc09wdGlvbjtcbiAgb3duZXI6IG51bWJlcjtcbn1cblxuLy8gV2hhdCBhbiBhbm5vdGF0ZWQgY2hhcnQncyBheGlzIHRvb2x0aXAgcmVhZHMuIG93bmVycyBob2xkcywgYnkgcG9zaXRpb24sXG4vLyB0aGUgc2VyaWVzIGVhY2ggcGFydGlhbCBzZWdtZW50IGNvbnRpbnVlcy5cbmludGVyZmFjZSBBbm5vdGF0ZWRUb29sdGlwU291cmNlIHtcbiAgZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcztcbiAgYW5ub3RhdGlvbnM6IENoYXJ0QW5ub3RhdGlvbnM7XG4gIG93bmVyczogbnVtYmVyW107XG4gIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbDtcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbDtcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gY2hhcnRBbm5vdGF0aW9ucyhcbiAgY29uZmlnOiBDaGFydENvbmZpZyxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcyxcbiAgY29sb3JCeTogYm9vbGVhbixcbik6IENoYXJ0QW5ub3RhdGlvbnMgfCBudWxsIHtcbiAgaWYgKCFkYXRhLmNvbXBhcmlzb24gJiYgIWRhdGEub3V0cHV0cyAmJiAhZGF0YS53aW5kb3dzICYmIChkYXRhLnBhcnRpYWxQZXJpb2QgPz8gbnVsbCkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbnMgPSBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzKSA9PiBzZXJpZXMubWVhc3VyZS5jb2x1bW4pO1xuICBjb25zdCBvdXRwdXRzID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gZGF0YS5vdXRwdXRzPy5bY29sdW1uXSA/PyBudWxsKTtcbiAgY29uc3QgY3VycmVudHMgPSBjb2x1bW5zLm1hcCgoY29sdW1uLCBpbmRleCkgPT4gKG91dHB1dHNbaW5kZXhdID8gY3VycmVudE91dHB1dEFsaWFzKGRhdGEub3V0cHV0cywgY29sdW1uKSA6IG51bGwpKTtcbiAgY29uc3QgbWVhc3VyZXMgPSBjaGFydE1lYXN1cmVzKGNvbmZpZywgZGF0YSk7XG4gIC8vIEEgcHJpb3Igc2VyaWVzJyBjdXJyZW50IHNlcmllcywgYnkgaW5kZXg7IC0xIGZvciBhbnkgb3RoZXIuXG4gIGNvbnN0IHNvdXJjZXMgPSBjdXJyZW50cy5tYXAoKGN1cnJlbnQsIGluZGV4KSA9PiAob3V0cHV0c1tpbmRleF0/LnJvbGUgPT09ICdwcmlvcicgPyBjb2x1bW5zLmluZGV4T2YoY3VycmVudCkgOiAtMSkpO1xuICBjb25zdCBwYXJ0aWFsSW5kZXggPSAoZGF0YS5wYXJ0aWFsUGVyaW9kID8/IG51bGwpID09PSBudWxsID8gLTEgOiBleHRyYWN0ZWQuY2F0ZWdvcmllcy5pbmRleE9mKFN0cmluZyhkYXRhLnBhcnRpYWxQZXJpb2QpKTtcbiAgY29uc3QgbGFuZXMgPSBsYW5lUHJpb3JWYWx1ZXMoY29uZmlnLCBkYXRhLCBleHRyYWN0ZWQsIG91dHB1dHMpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0cHV0cyxcbiAgICB3aW5kb3dzOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBkYXRhLndpbmRvd3M/Lltjb2x1bW5dID8/IG51bGwpLFxuICAgIG1lYXN1cmVTcGVjczogY3VycmVudHMubWFwKChjdXJyZW50KSA9PiBtZWFzdXJlcy5maW5kKChtZWFzdXJlKSA9PiBtZWFzdXJlLmNvbHVtbiA9PT0gY3VycmVudCkpLFxuICAgIHByaW9yczogbGFuZXMubWFwKChsYW5lLCBpbmRleCkgPT4gKGlzRGVsdGFSb2xlKG91dHB1dHNbaW5kZXhdPy5yb2xlKSA/IGxhbmU/LnByaW9yLnZhbHVlcyA/PyBudWxsIDogbnVsbCkpLFxuICAgIGxhbmVQcmlvcnM6IGxhbmVzLm1hcCgobGFuZSkgPT4gKGxhbmUgJiYgIWNvbHVtbnMuaW5jbHVkZXMobGFuZS5hbGlhcykgPyBsYW5lLnByaW9yIDogbnVsbCkpLFxuICAgIGNvbG9yczogY29sb3JCeSA/IG51bGwgOiBhbm5vdGF0ZWRDb2xvcnMoZXh0cmFjdGVkLCBzb3VyY2VzKSxcbiAgICBwcmlvclNlcmllczogb3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gb3V0cHV0Py5yb2xlID09PSAncHJpb3InKSxcbiAgICBjb21wYXJpc29uOiBkYXRhLmNvbXBhcmlzb24gPz8gbnVsbCxcbiAgICBwYXJ0aWFsSW5kZXg6IHBhcnRpYWxJbmRleCA8IDAgPyBudWxsIDogcGFydGlhbEluZGV4LFxuICB9O1xufVxuXG4vLyBBIGN1cnJlbnQsIGNoYW5nZSBvciBwZXJjZW50IGNoYW5nZSBzZXJpZXMnIGxhbmUgcHJpb3IsIGJ5IGNhdGVnb3J5OiBpdHNcbi8vIGxhbmUncyBwcmlvciBjb2x1bW4gaW4gdGhlIHNhbWUgcm93cyAodGhlIHNhbWUgZ3JvdXAncyBvbiBhIHNwbGl0QnkgY2hhcnQpLFxuLy8gYW5kIHRoYXQgY29sdW1uJ3MgYWxpYXMuXG5mdW5jdGlvbiBsYW5lUHJpb3JWYWx1ZXMoXG4gIGNvbmZpZzogQ2hhcnRDb25maWcsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsXG4gIG91dHB1dHM6IChPdXRwdXRNZXRhIHwgbnVsbClbXSxcbik6ICh7IGFsaWFzOiBzdHJpbmc7IHByaW9yOiBMYW5lUHJpb3IgfSB8IG51bGwpW10ge1xuICBjb25zdCB7IHhDb2x1bW4sIGdyb3VwQ29sdW1uIH0gPSBjaGFydENvbHVtbnMoY29uZmlnLCBkYXRhKTtcbiAgY29uc3QgcmF3Q2F0ZWdvcmllcyA9IHVuaXF1ZVZhbHVlcyhkYXRhLnJvd3MsIHhDb2x1bW4pO1xuICBjb25zdCBncm91cHMgPSBncm91cENvbHVtbiA/IHVuaXF1ZVZhbHVlcyhkYXRhLnJvd3MsIGdyb3VwQ29sdW1uKSA6IFtdO1xuXG4gIHJldHVybiBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHJvbGUgPSBvdXRwdXRzW2luZGV4XT8ucm9sZTtcbiAgICBjb25zdCBhbGlhcyA9IHJvbGUgPT09ICdjdXJyZW50JyB8fCBpc0RlbHRhUm9sZShyb2xlKVxuICAgICAgPyBsYW5lT3V0cHV0QWxpYXMoZGF0YS5vdXRwdXRzLCBzZXJpZXMubWVhc3VyZS5jb2x1bW4sICdwcmlvcicpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgb3V0cHV0ID0gYWxpYXMgPyBkYXRhLm91dHB1dHM/LlthbGlhc10gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWFsaWFzIHx8ICFvdXRwdXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gZ3JvdXBDb2x1bW4gPyAocm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gcm93W2dyb3VwQ29sdW1uXSA9PT0gZ3JvdXBzW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBhbGlhcyxcbiAgICAgIHByaW9yOiB7XG4gICAgICAgIGtleTogZ3JvdXBDb2x1bW4gPyBgJHthbGlhc31cXHUwMDAwJHtpbmRleH1gIDogYWxpYXMsXG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgdmFsdWVzOiBjYXRlZ29yeVZhbHVlcyhkYXRhLnJvd3MsIHhDb2x1bW4sIHJhd0NhdGVnb3JpZXMsIGFsaWFzLCBtYXRjaCksXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0RlbHRhUm9sZShyb2xlOiBPdXRwdXRSb2xlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcm9sZSA9PT0gJ2NoYW5nZScgfHwgcm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJztcbn1cblxuLy8gRWFjaCBzZXJpZXMnIGNvbG9yIGFzIHRoZSB0aGVtZSB3b3VsZCBoYW5kIGl0IG91dDogaXRzIG1lYXN1cmUncyBuYW1lZFxuLy8gY29sb3IsIGVsc2UgdGhlIG5leHQgcGFsZXR0ZSBjb2xvciBhbW9uZyB0aGUgc2VyaWVzIHdpdGhvdXQgb25lLiBBIHByaW9yXG4vLyBzZXJpZXMgdGhhdCBuYW1lcyBubyBjb2xvciB0YWtlcyBpdHMgY3VycmVudCBzZXJpZXMnIGNvbG9yIChzb3VyY2VzKSBhbmRcbi8vIG5vIHBhbGV0dGUgY29sb3Igb2YgaXRzIG93bi5cbmZ1bmN0aW9uIGFubm90YXRlZENvbG9ycyhleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLCBzb3VyY2VzOiBudW1iZXJbXSk6IHN0cmluZ1tdIHtcbiAgbGV0IHNsb3QgPSAwO1xuICBjb25zdCBvd24gPSBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5hbWVkID0gc2VyaWVzQ29sb3Ioc2VyaWVzKTtcblxuICAgIGlmIChuYW1lZCB8fCBzb3VyY2VzW2luZGV4XSA+PSAwKSB7XG4gICAgICByZXR1cm4gbmFtZWQgPz8gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gUkVQT1JUX0NIQVJUX0NPTE9SU19DU1Nbc2xvdCsrICUgUkVQT1JUX0NIQVJUX0NPTE9SU19DU1MubGVuZ3RoXTtcbiAgfSk7XG5cbiAgcmV0dXJuIG93bi5tYXAoKGNvbG9yLCBpbmRleCkgPT4gY29sb3IgPz8gb3duW3NvdXJjZXNbaW5kZXhdXSBhcyBzdHJpbmcpO1xufVxuXG4vLyBBIHNlcmllcycgbWFya3M6IGEgcHJpb3IgZHJhd24gaW4gaXRzIGN1cnJlbnQgc2VyaWVzJyBjb2xvciBmYW1pbHksIGRhc2hlZCxcbi8vIGFuZCB0aGUgcGVyaW9kIG5vdCBvdmVyIHlldCBoYXRjaGVkIChhIGJhcikgb3IgcmluZ2VkIChhIHBvaW50KS5cbmZ1bmN0aW9uIG1hcmtTZXJpZXMoXG4gIG9wdGlvbjogU2VyaWVzT3B0aW9uLFxuICBhbm5vdGF0aW9uczogQ2hhcnRBbm5vdGF0aW9ucyxcbiAgaW5kZXg6IG51bWJlcixcbiAgbWVhc3VyZTogQ2hhcnRNZWFzdXJlLFxuKTogU2VyaWVzT3B0aW9uIHtcbiAgY29uc3QgcHJpb3IgPSBhbm5vdGF0aW9ucy5wcmlvclNlcmllc1tpbmRleF0gPyBwcmlvclN0eWxlKG9wdGlvbiwgbWVhc3VyZSwgYW5ub3RhdGlvbnMuY29sb3JzPy5baW5kZXhdKSA6IG9wdGlvbjtcblxuICByZXR1cm4gYW5ub3RhdGlvbnMucGFydGlhbEluZGV4ID09PSBudWxsID8gcHJpb3IgOiBtYXJrUGFydGlhbFBvaW50KHByaW9yLCBhbm5vdGF0aW9ucy5wYXJ0aWFsSW5kZXgpO1xufVxuXG4vLyBBIHByaW9yJ3MgYmFycyBhcmUgZmFkZWQgd2l0aCBhIGRhc2hlZCBlZGdlOyBpdHMgbGluZSBpcyBkYXNoZWQgdW5sZXNzIGl0c1xuLy8gbWVhc3VyZSBuYW1lcyBhIGxpbmUgc3R5bGUuXG5mdW5jdGlvbiBwcmlvclN0eWxlKG9wdGlvbjogU2VyaWVzT3B0aW9uLCBtZWFzdXJlOiBDaGFydE1lYXN1cmUsIGNvbG9yOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTZXJpZXNPcHRpb24ge1xuICBjb25zdCBkcmF3biA9IG9wdGlvbiBhcyBEcmF3blNlcmllcztcblxuICBpZiAoZHJhd24udHlwZSA9PT0gJ2JhcicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgaXRlbVN0eWxlOiB7XG4gICAgICAgIC4uLmRyYXduLml0ZW1TdHlsZSxcbiAgICAgICAgb3BhY2l0eTogUFJJT1JfQkFSX09QQUNJVFksXG4gICAgICAgIGJvcmRlcldpZHRoOiAxLFxuICAgICAgICBib3JkZXJUeXBlOiAnZGFzaGVkJyxcbiAgICAgICAgLi4uKGNvbG9yID8geyBib3JkZXJDb2xvcjogY29sb3IgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBTZXJpZXNPcHRpb247XG4gIH1cblxuICByZXR1cm4geyAuLi5vcHRpb24sIGxpbmVTdHlsZTogeyAuLi5kcmF3bi5saW5lU3R5bGUsIHR5cGU6IG1lYXN1cmVMaW5lU3R5bGUobWVhc3VyZSkgPz8gUFJJT1JfTElORV9TVFlMRSB9IH0gYXMgU2VyaWVzT3B0aW9uO1xufVxuXG4vLyBUaGUgcG9pbnQgb2YgdGhlIHBlcmlvZCBub3Qgb3ZlciB5ZXQsIHdoZW4gaXQgaGFzIGEgdmFsdWUuXG5mdW5jdGlvbiBtYXJrUGFydGlhbFBvaW50KG9wdGlvbjogU2VyaWVzT3B0aW9uLCBwYXJ0aWFsSW5kZXg6IG51bWJlcik6IFNlcmllc09wdGlvbiB7XG4gIGNvbnN0IGRyYXduID0gb3B0aW9uIGFzIERyYXduU2VyaWVzO1xuICBjb25zdCBkYXRhID0gWy4uLihkcmF3bi5kYXRhID8/IFtdKV07XG4gIGNvbnN0IGl0ZW0gPSBkYXRhW3BhcnRpYWxJbmRleF07XG5cbiAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBwb2ludFZhbHVlKGl0ZW0pID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuXG4gIGNvbnN0IG1hcmsgPSBkcmF3bi50eXBlID09PSAnYmFyJyA/IHsgaXRlbVN0eWxlOiB7IGRlY2FsOiBQQVJUSUFMX0JBUl9ERUNBTCB9IH0gOiBQQVJUSUFMX1BPSU5UX01BUks7XG4gIGRhdGFbcGFydGlhbEluZGV4XSA9ICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyB7IC4uLml0ZW0sIC4uLm1hcmsgfSA6IHsgdmFsdWU6IGl0ZW0sIC4uLm1hcmsgfSkgYXMgU2VyaWVzRGF0YUl0ZW08RGF0YUxhYmVsUG9zaXRpb24+O1xuXG4gIHJldHVybiB7IC4uLm9wdGlvbiwgZGF0YSB9IGFzIFNlcmllc09wdGlvbjtcbn1cblxuLy8gQSBsaW5lIG9yIGFyZWEgc2VyaWVzIHdob3NlIGxhc3QgcGVyaW9kIGlzIG5vdCBvdmVyIHlldCBkcmF3cyBpdHMgbGFzdFxuLy8gc2VnbWVudCBkYXNoZWQ6IHRoZSBzZXJpZXMgc3RvcHMgb25lIHBvaW50IHNob3J0LCBhbmQgYSBzZWdtZW50IHNlcmllc1xuLy8gY2FycmllcyBpdHMgbGFzdCB0d28gcG9pbnRzLCBkYXNoZWQsIGluIGl0cyBjb2xvciBhbmQgdW5kZXIgaXRzIG5hbWUsIHNvXG4vLyB0aGUgb25lIGxlZ2VuZCBlbnRyeSB0b2dnbGVzIGJvdGguIEEgc3RhY2tlZCBzZXJpZXMga2VlcHMgaXRzIGxpbmUgd2hvbGUgKGFcbi8vIHNlZ21lbnQgd291bGQgc3RhY2sgb24gdG9wIG9mIGl0KSwgYW5kIGEgZ2FwIHN0YXlzIGEgZ2FwLiBSZXBsYWNlcyBlYWNoXG4vLyBzdWNoIHNlcmllcyBpbiBgc2VyaWVzYCBhbmQgcmV0dXJucyB0aGUgc2VnbWVudHMuXG5mdW5jdGlvbiBwYXJ0aWFsU2VnbWVudHMoc2VyaWVzOiBTZXJpZXNPcHRpb25bXSwgYW5ub3RhdGlvbnM6IENoYXJ0QW5ub3RhdGlvbnMpOiBQYXJ0aWFsU2VnbWVudFtdIHtcbiAgY29uc3QgbGFzdCA9IGFubm90YXRpb25zLnBhcnRpYWxJbmRleDtcbiAgY29uc3Qgc2VnbWVudHM6IFBhcnRpYWxTZWdtZW50W10gPSBbXTtcblxuICBzZXJpZXMuZm9yRWFjaCgob3B0aW9uLCBvd25lcikgPT4ge1xuICAgIGNvbnN0IGRyYXduID0gb3B0aW9uIGFzIERyYXduU2VyaWVzO1xuICAgIGNvbnN0IGRhdGEgPSBkcmF3bi5kYXRhID8/IFtdO1xuICAgIGNvbnN0IGNvbG9yID0gYW5ub3RhdGlvbnMuY29sb3JzPy5bb3duZXJdO1xuXG4gICAgaWYgKGxhc3QgPT09IG51bGwgfHwgbGFzdCA8IDEgfHwgbGFzdCAhPT0gZGF0YS5sZW5ndGggLSAxIHx8IGRyYXduLnR5cGUgIT09ICdsaW5lJyB8fCBkcmF3bi5zdGFjayB8fCAhY29sb3JcbiAgICAgIHx8IHBvaW50VmFsdWUoZGF0YVtsYXN0IC0gMV0pID09PSBudWxsIHx8IHBvaW50VmFsdWUoZGF0YVtsYXN0XSkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXJpZXNbb3duZXJdID0geyAuLi5vcHRpb24sIGRhdGE6IFsuLi5kYXRhLnNsaWNlKDAsIGxhc3QpLCBudWxsXSB9IGFzIFNlcmllc09wdGlvbjtcbiAgICBzZWdtZW50cy5wdXNoKHsgb3duZXIsIHNlcmllczogc2VnbWVudFNlcmllcyhvcHRpb24sIGNvbG9yLCBsYXN0KSB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNlZ21lbnRzO1xufVxuXG4vLyBUaGUgZGFzaGVkIHNlZ21lbnQgZnJvbSB0aGUgcG9pbnQgYmVmb3JlIHRoZSBsYXN0IHRvIHRoZSBsYXN0IG9uZSwgd2hpY2hcbi8vIGtlZXBzIGl0cyBtYXJrcyBhbmQgaXRzIGRhdGEgbGFiZWwuIFRoZSBwb2ludCBiZWZvcmUgaXQgaXMgZHJhd24sIGFuZFxuLy8gbGFiZWxlZCwgYnkgdGhlIHNlcmllcyBpdHNlbGYuXG5mdW5jdGlvbiBzZWdtZW50U2VyaWVzKG9wdGlvbjogU2VyaWVzT3B0aW9uLCBjb2xvcjogc3RyaW5nLCBsYXN0OiBudW1iZXIpOiBTZXJpZXNPcHRpb24ge1xuICBjb25zdCBkcmF3biA9IG9wdGlvbiBhcyBEcmF3blNlcmllcztcbiAgY29uc3QgZGF0YSA9IGRyYXduLmRhdGEgPz8gW107XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb24sXG4gICAgbWFya0xpbmU6IHVuZGVmaW5lZCxcbiAgICBsaW5lU3R5bGU6IHsgLi4uZHJhd24ubGluZVN0eWxlLCBjb2xvciwgdHlwZTogUEFSVElBTF9MSU5FX1NUWUxFIH0sXG4gICAgZGF0YTogZGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbmRleCA9PT0gbGFzdCAtIDEgPyB7IHZhbHVlOiBwb2ludFZhbHVlKGl0ZW0pLCBzeW1ib2w6ICdub25lJywgbGFiZWw6IHsgc2hvdzogZmFsc2UgfSB9IDogbnVsbDtcbiAgICB9KSxcbiAgfSBhcyBTZXJpZXNPcHRpb247XG59XG5cbi8vIEEgcG9pbnQncyBwbG90dGVkIHZhbHVlLCB3aGV0aGVyIGl0IGlzIGEgYmFyZSBudW1iZXIgb3IgYW4gb2JqZWN0LlxuZnVuY3Rpb24gcG9pbnRWYWx1ZShpdGVtOiBTZXJpZXNEYXRhSXRlbTxEYXRhTGFiZWxQb3NpdGlvbj4gfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09ICdudW1iZXInID8gaXRlbSA6IGl0ZW0udmFsdWU7XG59XG5cbi8vIEhvdyBhbiBvdXRwdXQgc2VyaWVzIHdyaXRlcyBhIHZhbHVlOiBmb3JtYXRPdXRwdXRWYWx1ZSdzIHJ1bGVzIChhIHNpZ25lZFxuLy8gY2hhbmdlLCBwb2ludHMsICfigJQnIHdpdGggdGhlIG5vLWJhc2VsaW5lIHRpdGxlLCByYW5rcyBhbmQgc2hhcmVzKSB3aXRoIGl0c1xuLy8gbWVhc3VyZSdzIGZvcm1hdCBhbmQgdGhlIGNvbXBhcmlzb24ncyBmbG9vci4gR2l2ZW4gdGhlIHBvaW50J3MgaW5kZXggKGFcbi8vIHRvb2x0aXAsIGEgZGF0YSBsYWJlbCksIGEgY2hhbmdlIHJlYWRzIGl0cyBwcmlvciB0aGVyZSwgd2hpY2ggdGVsbHMgYVxuLy8gbWlzc2luZyBiYXNlbGluZSBmcm9tIGEgemVybyBvbmUuIFRoZSB0aXRsZSBzYXlzIHdoeSBhIHZhbHVlIHJlYWRzICfigJQnIG9yXG4vLyAnbi9hJy5cbmZ1bmN0aW9uIG91dHB1dFZhbHVlKFxuICBhbm5vdGF0aW9uczogQ2hhcnRBbm5vdGF0aW9ucyxcbiAgaW5kZXg6IG51bWJlcixcbiAgbWVhc3VyZTogQ2hhcnRNZWFzdXJlLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogKHZhbHVlOiB1bmtub3duLCBkYXRhSW5kZXg/OiBudW1iZXIpID0+IEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgY29uc3Qgb3V0cHV0ID0gYW5ub3RhdGlvbnMub3V0cHV0c1tpbmRleF07XG4gIGNvbnN0IHByaW9ycyA9IGFubm90YXRpb25zLnByaW9yc1tpbmRleF07XG5cbiAgcmV0dXJuICh2YWx1ZSwgZGF0YUluZGV4KSA9PiBmb3JtYXRPdXRwdXRWYWx1ZShBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWUsIG91dHB1dCwgbWVhc3VyZSwgY29udGV4dCwge1xuICAgIG1lYXN1cmVTcGVjOiBhbm5vdGF0aW9ucy5tZWFzdXJlU3BlY3NbaW5kZXhdLFxuICAgIGZsb29yOiBhbm5vdGF0aW9ucy5jb21wYXJpc29uPy5mbG9vciA/PyBudWxsLFxuICAgIC4uLihwcmlvcnMgJiYgZGF0YUluZGV4ICE9PSB1bmRlZmluZWQgPyB7IHByaW9yOiBwcmlvcnNbZGF0YUluZGV4XSA/PyBudWxsIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vLyBBbiBvdXRwdXQgdmFsdWUncyB0ZXh0IGFsb25lLCBmb3IgYSBzZXJpZXMnIG93biB0b29sdGlwIGFuZCBpdHMgZGF0YSBsYWJlbHMuXG5mdW5jdGlvbiBvdXRwdXRXcml0ZXIoXG4gIGFubm90YXRpb25zOiBDaGFydEFubm90YXRpb25zLFxuICBpbmRleDogbnVtYmVyLFxuICBtZWFzdXJlOiBDaGFydE1lYXN1cmUsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiAodmFsdWU6IHVua25vd24sIGRhdGFJbmRleD86IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgY29uc3Qgd3JpdGUgPSBvdXRwdXRWYWx1ZShhbm5vdGF0aW9ucywgaW5kZXgsIG1lYXN1cmUsIGNvbnRleHQpO1xuXG4gIHJldHVybiAodmFsdWUsIGRhdGFJbmRleCkgPT4gd3JpdGUodmFsdWUsIGRhdGFJbmRleCkudGV4dDtcbn1cblxuZnVuY3Rpb24gb3V0cHV0TGFiZWxGb3JtYXR0ZXIod3JpdGU6ICh2YWx1ZTogdW5rbm93biwgZGF0YUluZGV4PzogbnVtYmVyKSA9PiBzdHJpbmcpOiBEYXRhTGFiZWxGb3JtYXR0ZXIge1xuICByZXR1cm4gKHBhcmFtcykgPT4gd3JpdGUoZGF0YUxhYmVsVmFsdWUocGFyYW1zKSwgcGFyYW1zLmRhdGFJbmRleCk7XG59XG5cbi8vIFRoZSBjaGFydCdzIHNlcmllcyBhcyBpdHMgdmFsdWUgYXhlcyByZWFkIHRoZW06IGFuIG91dHB1dCBzZXJpZXMgd2hvc2Vcbi8vIHNsb3QgbmFtZXMgbm8gZm9ybWF0IHRha2VzIGl0cyBvdXRwdXQncyAob3V0cHV0QXhpc01lYXN1cmUpLlxuZnVuY3Rpb24gYW5ub3RhdGVkQXhpc1NlcmllcyhleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLCBhbm5vdGF0aW9uczogQ2hhcnRBbm5vdGF0aW9ucyk6IEV4dHJhY3RlZENoYXJ0U2VyaWVzIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5leHRyYWN0ZWQsXG4gICAgc2VyaWVzOiBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzLCBpbmRleCkgPT4gKHtcbiAgICAgIC4uLnNlcmllcyxcbiAgICAgIG1lYXN1cmU6IG91dHB1dEF4aXNNZWFzdXJlKHNlcmllcy5tZWFzdXJlLCBhbm5vdGF0aW9ucy5vdXRwdXRzW2luZGV4XSwgYW5ub3RhdGlvbnMubWVhc3VyZVNwZWNzW2luZGV4XSksXG4gICAgfSkpLFxuICB9O1xufVxuXG4vLyBUaGUgZm9ybWF0IGFuIG91dHB1dCdzIGF4aXMgcmVhZHMgd2hlbiBpdHMgc2xvdCBuYW1lcyBub25lOiBhIHJhbmsncyB3aG9sZVxuLy8gbnVtYmVycywgYSAwLTEgZnJhY3Rpb24ncyBwZXJjZW50LCBhbmQgYSBjb21wYXJlZCBvciB3aW5kb3dlZCB2YWx1ZSBpdHNcbi8vIG1lYXN1cmUncyBmb3JtYXQuIFRoZSBzbG90J3Mgb3duIHByZWNpc2lvbiBhbmQgdW5pdHMgc3RpbGwgYXBwbHkuXG5mdW5jdGlvbiBvdXRwdXRBeGlzTWVhc3VyZShcbiAgbWVhc3VyZTogQ2hhcnRNZWFzdXJlLFxuICBvdXRwdXQ6IE91dHB1dE1ldGEgfCBudWxsLFxuICBtZWFzdXJlU3BlYzogQ2hhcnRNZWFzdXJlIHwgdW5kZWZpbmVkLFxuKTogQ2hhcnRNZWFzdXJlIHtcbiAgaWYgKCFvdXRwdXQgfHwgbmFtZXNWYWx1ZUZvcm1hdChtZWFzdXJlKSkge1xuICAgIHJldHVybiBtZWFzdXJlO1xuICB9XG5cbiAgbGV0IGJhc2U6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsID0gbWVhc3VyZVNwZWMgJiYgaGFzTnVtYmVyRm9ybWF0KG1lYXN1cmVTcGVjKSA/IGZvcm1hdEtleXMobWVhc3VyZVNwZWMpIDogbnVsbDtcbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycpIHtcbiAgICBiYXNlID0gUkFOS19BWElTX0ZPUk1BVDtcbiAgfSBlbHNlIGlmIChpc0ZyYWN0aW9uT3V0cHV0KG91dHB1dCkpIHtcbiAgICBiYXNlID0gRlJBQ1RJT05fQVhJU19GT1JNQVQ7XG4gIH1cblxuICByZXR1cm4gYmFzZVxuICAgID8geyAuLi5tZWFzdXJlLCAuLi5iYXNlLCAuLi5mb3JtYXRLZXlzKHsgcHJlY2lzaW9uOiBtZWFzdXJlLnByZWNpc2lvbiwgdW5pdHM6IG1lYXN1cmUudW5pdHMgfSkgfSBhcyBDaGFydE1lYXN1cmVcbiAgICA6IG1lYXN1cmU7XG59XG5cbmZ1bmN0aW9uIG5hbWVzVmFsdWVGb3JtYXQoc3BlYzogTnVtYmVyRm9ybWF0U3BlYyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhSZXBvcnRWYWx1ZUZvcm1hdCkuc29tZSgoZm9ybWF0KSA9PiBmb3JtYXQgPT09IHNwZWMuZm9ybWF0KTtcbn1cblxuLy8gQSBzcGVjJ3MgbnVtYmVyLWZvcm1hdCBrZXlzIHRoYXQgYXJlIHNldC5cbmZ1bmN0aW9uIGZvcm1hdEtleXMoc3BlYzogTnVtYmVyRm9ybWF0U3BlYyk6IE51bWJlckZvcm1hdFNwZWMge1xuICByZXR1cm4ge1xuICAgIC4uLigoc3BlYy5mb3JtYXQgPz8gbnVsbCkgIT09IG51bGwgPyB7IGZvcm1hdDogc3BlYy5mb3JtYXQgfSA6IHt9KSxcbiAgICAuLi4oKHNwZWMucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsID8geyBwcmVjaXNpb246IHNwZWMucHJlY2lzaW9uIH0gOiB7fSksXG4gICAgLi4uKChzcGVjLnVuaXRzID8/IG51bGwpICE9PSBudWxsID8geyB1bml0czogc3BlYy51bml0cyB9IDoge30pLFxuICB9O1xufVxuXG4vLyBFYWNoIHZhbHVlIGF4aXMncyBjb250ZXh0OiBvbmUgdGhhdCBwbG90cyBvbmx5IDAtMSBmcmFjdGlvbnMgcmVhZHMgdGhlbSBhc1xuLy8gcmF0aW9zLCB3aGF0ZXZlciB0aGUgcmVwb3J0J3MgcGVyY2VudEZvcm1hdCBzYXlzIG9mIGl0cyBzdG9yZWQgdmFsdWVzLlxuZnVuY3Rpb24gYW5ub3RhdGVkQXhpc0NvbnRleHRzKFxuICBhbm5vdGF0aW9uczogQ2hhcnRBbm5vdGF0aW9ucyxcbiAgYXhpc0luZGV4ZXM6IFZhbHVlQXhpc0luZGV4W10sXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBSZXBvcnRGb3JtYXRDb250ZXh0W10ge1xuICByZXR1cm4gKFswLCAxXSBhcyBjb25zdCkubWFwKChheGlzSW5kZXgpID0+IChldmVyeU9uQXhpcyhhbm5vdGF0aW9ucy5vdXRwdXRzLCBheGlzSW5kZXhlcywgYXhpc0luZGV4LCBpc0ZyYWN0aW9uT3V0cHV0KVxuICAgID8geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfVxuICAgIDogY29udGV4dCkpO1xufVxuXG4vLyBXaGljaCB2YWx1ZSBheGVzLCBieSBpbmRleCwgcGxvdCBub3RoaW5nIGJ1dCByYW5rcy5cbmZ1bmN0aW9uIHJhbmtBeGlzRmxhZ3Mob3V0cHV0czogKE91dHB1dE1ldGEgfCBudWxsKVtdLCBheGlzSW5kZXhlczogVmFsdWVBeGlzSW5kZXhbXSk6IGJvb2xlYW5bXSB7XG4gIHJldHVybiAoWzAsIDFdIGFzIGNvbnN0KS5tYXAoKGF4aXNJbmRleCkgPT4gZXZlcnlPbkF4aXMob3V0cHV0cywgYXhpc0luZGV4ZXMsIGF4aXNJbmRleCwgaXNSYW5rUG9zaXRpb24pKTtcbn1cblxuLy8gSG93IGEgY2hhcnQgdGhhdCBwbG90cyBhIHByaW9yIHNlcmllcyBjb2xvcnMgZWFjaCBzZXJpZXMsIGZvciB0aGVcbi8vIFBvd2VyUG9pbnQgZXhwb3J0OiBldmVyeSBzZXJpZXMnIGNvbG9yIGFzIGJhcmUgaGV4LCBhIHByaW9yIHRha2luZyBpdHNcbi8vIGN1cnJlbnQgc2VyaWVzJyBjb2xvciBhbmQgbm8gcGFsZXR0ZSBjb2xvciBvZiBpdHMgb3duIChhbm5vdGF0ZWRDb2xvcnMpLFxuLy8gYW5kIHdoaWNoIHNlcmllcyBhcmUgcHJpb3JzLCB3aGljaCBhIGxpbmUgZHJhd3MgZGFzaGVkLiBudWxsIHdoZW4gdGhlIGNoYXJ0XG4vLyBwbG90cyBubyBwcmlvciBzZXJpZXMsIGFuZCBvbiBhIGNvbG9yQnkgY2hhcnQ7IGl0cyBzZXJpZXMga2VlcCBzZXJpZXNIZXguXG5leHBvcnQgZnVuY3Rpb24gcHJpb3JTZXJpZXNTdHlsZXMoXG4gIGNvbmZpZzogQ2hhcnRDb25maWcsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsXG4pOiB7IGNvbG9yczogc3RyaW5nW107IHByaW9yczogYm9vbGVhbltdIH0gfCBudWxsIHtcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSBjaGFydEFubm90YXRpb25zKGNvbmZpZywgZGF0YSwgZXh0cmFjdGVkLCBpc0NvbG9yQnkoY29uZmlnKSk7XG5cbiAgaWYgKCFhbm5vdGF0aW9ucz8uY29sb3JzIHx8ICFhbm5vdGF0aW9ucy5wcmlvclNlcmllcy5zb21lKChwcmlvcikgPT4gcHJpb3IpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbG9yczogYW5ub3RhdGlvbnMuY29sb3JzLm1hcCgoY29sb3IpID0+IGNvbG9yLnJlcGxhY2UoJyMnLCAnJykpLFxuICAgIHByaW9yczogYW5ub3RhdGlvbnMucHJpb3JTZXJpZXMsXG4gIH07XG59XG5cbi8vIFdoaWNoIHZhbHVlIGF4ZXMsIGJ5IGluZGV4LCBwbG90IG5vdGhpbmcgYnV0IHJhbmtzLCB3aGljaCB0aGUgY2hhcnQgZHJhd3Ncbi8vIGludmVydGVkIHdpdGggcmFuayAxIGF0IHRoZSB0b3AuIFNoYXJlZCB3aXRoIHRoZSBQb3dlclBvaW50IGV4cG9ydC5cbmV4cG9ydCBmdW5jdGlvbiByYW5rVmFsdWVBeGVzKGV4dHJhY3RlZDogRXh0cmFjdGVkQ2hhcnRTZXJpZXMsIGRhdGE6IENvbXBvbmVudERhdGEsIGNvbmZpZzogQ2hhcnRDb25maWcpOiBib29sZWFuW10ge1xuICByZXR1cm4gcmFua0F4aXNGbGFncyhcbiAgICBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoc2VyaWVzKSA9PiBkYXRhLm91dHB1dHM/LltzZXJpZXMubWVhc3VyZS5jb2x1bW5dID8/IG51bGwpLFxuICAgIHNlcmllc0F4aXNJbmRleGVzKGV4dHJhY3RlZCwgY29uZmlnKSxcbiAgKTtcbn1cblxuLy8gV2hldGhlciBhbiBheGlzIGhhcyBzZXJpZXMgYW5kIGV2ZXJ5IG9uZSBvZiB0aGVtIHBhc3NlcyB0aGUgdGVzdC5cbmZ1bmN0aW9uIGV2ZXJ5T25BeGlzKFxuICBvdXRwdXRzOiAoT3V0cHV0TWV0YSB8IG51bGwpW10sXG4gIGF4aXNJbmRleGVzOiBWYWx1ZUF4aXNJbmRleFtdLFxuICBheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4LFxuICB0ZXN0OiAob3V0cHV0OiBPdXRwdXRNZXRhKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9uQXhpcyA9IG91dHB1dHMuZmlsdGVyKChfLCBpbmRleCkgPT4gYXhpc0luZGV4ZXNbaW5kZXhdID09PSBheGlzSW5kZXgpO1xuXG4gIHJldHVybiBvbkF4aXMubGVuZ3RoID4gMCAmJiBvbkF4aXMuZXZlcnkoKG91dHB1dCkgPT4gISFvdXRwdXQgJiYgdGVzdChvdXRwdXQpKTtcbn1cblxuLy8gQSBzaGFyZSBhbmQgYSBwZXJjZW50IGNoYW5nZSBhcmUgMC0xIGZyYWN0aW9ucywgd2hhdGV2ZXIgcGVyY2VudEZvcm1hdCBzYXlzLlxuZnVuY3Rpb24gaXNGcmFjdGlvbk91dHB1dChvdXRwdXQ6IE91dHB1dE1ldGEpOiBib29sZWFuIHtcbiAgcmV0dXJuIG91dHB1dC5raW5kID09PSAnc2hhcmUnIHx8IG91dHB1dC5yb2xlID09PSAncGVyY2VudF9jaGFuZ2UnO1xufVxuXG4vLyBBIHZhbHVlIGF4aXMncyB0aWNrIGxhYmVscyB3aGVuIGV2ZXJ5IHNlcmllcyBvbiBpdCBpcyBhIGNoYW5nZSBvZiBhIHJhdGVcbi8vIChhIHNoYXJlJ3MsIG9yIGEgcGVyY2VudC1mb3JtYXQgdmFsdWUncyk6IHNpZ25lZCBwZXJjZW50YWdlIHBvaW50cywgYXMgdGhlXG4vLyBzZXJpZXMnIHRvb2x0aXBzIGFuZCBkYXRhIGxhYmVscyB3cml0ZSB0aGVtICgnKzUuMCBwcCcpLiBudWxsIGZvciBhbnkgb3RoZXJcbi8vIGF4aXMuXG5mdW5jdGlvbiBwb2ludHNBeGlzTGFiZWwoXG4gIGFubm90YXRpb25zOiBDaGFydEFubm90YXRpb25zLFxuICBleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLFxuICBheGlzSW5kZXhlczogVmFsdWVBeGlzSW5kZXhbXSxcbiAgYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IFZhbHVlQXhpc0xhYmVsIHwgbnVsbCB7XG4gIGNvbnN0IG9uQXhpcyA9IGV4dHJhY3RlZC5zZXJpZXNcbiAgICAubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpXG4gICAgLmZpbHRlcigoaW5kZXgpID0+IGF4aXNJbmRleGVzW2luZGV4XSA9PT0gYXhpc0luZGV4KTtcbiAgY29uc3QgcG9pbnRzID0gb25BeGlzLmxlbmd0aCA+IDAgJiYgb25BeGlzLmV2ZXJ5KChpbmRleCkgPT4gaXNQb2ludHNDaGFuZ2UoXG4gICAgYW5ub3RhdGlvbnMub3V0cHV0c1tpbmRleF0sXG4gICAgb3V0cHV0QXhpc01lYXN1cmUoZXh0cmFjdGVkLnNlcmllc1tpbmRleF0ubWVhc3VyZSwgYW5ub3RhdGlvbnMub3V0cHV0c1tpbmRleF0sIGFubm90YXRpb25zLm1lYXN1cmVTcGVjc1tpbmRleF0pLFxuICApKTtcblxuICBpZiAoIXBvaW50cykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgd3JpdGUgPSBvdXRwdXRXcml0ZXIoYW5ub3RhdGlvbnMsIG9uQXhpc1swXSwgZXh0cmFjdGVkLnNlcmllc1tvbkF4aXNbMF1dLm1lYXN1cmUsIGNvbnRleHQpO1xuXG4gIHJldHVybiB7IGZvcm1hdHRlcjogKHZhbHVlOiBudW1iZXIpID0+IHdyaXRlKHZhbHVlKSB9O1xufVxuXG4vLyBBIGNoYW5nZSBvZiBhIHJhdGUsIHdoaWNoIHByaW50cyBpbiBwZXJjZW50YWdlIHBvaW50czogYSBzaGFyZSdzIGNoYW5nZSwgb3Jcbi8vIHRoZSBjaGFuZ2Ugb2YgYSB2YWx1ZSB3aG9zZSBmb3JtYXQgKGl0cyBzbG90J3MsIGVsc2UgaXRzIG1lYXN1cmUncykgaXMgYVxuLy8gcGVyY2VudC5cbmZ1bmN0aW9uIGlzUG9pbnRzQ2hhbmdlKG91dHB1dDogT3V0cHV0TWV0YSB8IG51bGwsIGF4aXNNZWFzdXJlOiBDaGFydE1lYXN1cmUpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhb3V0cHV0ICYmIG91dHB1dC5yb2xlID09PSAnY2hhbmdlJyAmJiBvdXRwdXQua2luZCAhPT0gJ3JhbmsnXG4gICAgJiYgKG91dHB1dC5raW5kID09PSAnc2hhcmUnIHx8IGF4aXNNZWFzdXJlLmZvcm1hdCA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCk7XG59XG5cbi8vIEEgcmFuaywgY3VycmVudCBvciBwcmlvcjsgYSByYW5rIGNoYW5nZSBpcyBhIGRpZmZlcmVuY2UsIG5vdCBhIHBvc2l0aW9uLlxuZnVuY3Rpb24gaXNSYW5rUG9zaXRpb24ob3V0cHV0OiBPdXRwdXRNZXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXQua2luZCA9PT0gJ3JhbmsnICYmIG91dHB1dC5yb2xlICE9PSAnY2hhbmdlJztcbn1cblxuZnVuY3Rpb24gYW5ub3RhdGVkQ2hhcnRUb29sdGlwKHNvdXJjZTogQW5ub3RhdGVkVG9vbHRpcFNvdXJjZSB8IG51bGwpIHtcbiAgcmV0dXJuIHNvdXJjZVxuICAgID8ge1xuICAgICAgdHJpZ2dlcjogJ2F4aXMnIGFzIGNvbnN0LFxuICAgICAgZm9ybWF0dGVyOiAocGFyYW1zOiBUb29sdGlwQ29tcG9uZW50Rm9ybWF0dGVyQ2FsbGJhY2tQYXJhbXMpID0+IGFubm90YXRlZFRvb2x0aXAocGFyYW1zLCBzb3VyY2UpLFxuICAgIH1cbiAgICA6IG51bGw7XG59XG5cbi8vIFRoZSBwZXJpb2QsIHdpdGggJ3RvIGRhdGUnIHdoZW4gaXQgaXMgbm90IG92ZXIgeWV0LCB0aGVuIGVhY2ggc2VyaWVzIHNob3duXG4vLyAoYSBsZWdlbmQgY2FuIGhpZGUgc29tZSk6IGl0cyB2YWx1ZSB3cml0dGVuIGJ5IHdoYXQgaXQgaXMsIGFuZCB3aGF0IGl0XG4vLyBjb3ZlcnMuIEEgcGFydGlhbCBzZWdtZW50IHNwZWFrcyBmb3IgaXRzIHNlcmllcy4gTmFtZXMgYW5kIHZhbHVlcyBjb21lIGZyb21cbi8vIHRoZSBkYXRhIGFuZCB0aGUgY29uZmlnLCBhbmQgRUNoYXJ0cyBzZXRzIHRoZSB0b29sdGlwIGFzIEhUTUwsIHNvIGJvdGggYXJlXG4vLyBlc2NhcGVkLlxuZnVuY3Rpb24gYW5ub3RhdGVkVG9vbHRpcChwYXJhbXM6IFRvb2x0aXBDb21wb25lbnRGb3JtYXR0ZXJDYWxsYmFja1BhcmFtcywgc291cmNlOiBBbm5vdGF0ZWRUb29sdGlwU291cmNlKTogc3RyaW5nIHtcbiAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBwYXJhbXMgOiBbcGFyYW1zXTtcbiAgY29uc3QgZGF0YUluZGV4ID0gaXRlbXNbMF0/LmRhdGFJbmRleCA/PyAwO1xuICBjb25zdCBjb3VudCA9IHNvdXJjZS5leHRyYWN0ZWQuc2VyaWVzLmxlbmd0aDtcbiAgY29uc3QgbWFya2VycyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgY29uc3Qgc2VyaWVzSW5kZXggPSBpdGVtLnNlcmllc0luZGV4ID8/IC0xO1xuICAgIGNvbnN0IG93bmVyID0gc2VyaWVzSW5kZXggPCBjb3VudCA/IHNlcmllc0luZGV4IDogc291cmNlLm93bmVyc1tzZXJpZXNJbmRleCAtIGNvdW50XTtcblxuICAgIGlmIChvd25lciAhPT0gdW5kZWZpbmVkICYmIG93bmVyID49IDAgJiYgIW1hcmtlcnMuaGFzKG93bmVyKSkge1xuICAgICAgbWFya2Vycy5zZXQob3duZXIsIHR5cGVvZiBpdGVtLm1hcmtlciA9PT0gJ3N0cmluZycgPyBpdGVtLm1hcmtlciA6ICcnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuYW1lZFByaW9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5tYXJrZXJzLmVudHJpZXMoKV1cbiAgICAuc29ydCgoW2ZpcnN0XSwgW3NlY29uZF0pID0+IGZpcnN0IC0gc2Vjb25kKVxuICAgIC5tYXAoKFtpbmRleCwgbWFya2VyXSkgPT4gYW5ub3RhdGVkVG9vbHRpcExpbmUoc291cmNlLCBpbmRleCwgZGF0YUluZGV4LCBtYXJrZXIsIG5hbWVkUHJpb3JzKSk7XG5cbiAgcmV0dXJuIFthbm5vdGF0ZWRUb29sdGlwSGVhZGluZyhzb3VyY2UsIGRhdGFJbmRleCksIC4uLmxpbmVzXS5qb2luKCc8YnIvPicpO1xufVxuXG5mdW5jdGlvbiBhbm5vdGF0ZWRUb29sdGlwSGVhZGluZyhzb3VyY2U6IEFubm90YXRlZFRvb2x0aXBTb3VyY2UsIGRhdGFJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2F0ZWdvcnkgPSBzb3VyY2UuZXh0cmFjdGVkLmNhdGVnb3JpZXNbZGF0YUluZGV4XSA/PyAnJztcbiAgY29uc3QgcGVyaW9kID0gc291cmNlLmdyYW51bGFyaXR5XG4gICAgPyBmb3JtYXRQZXJpb2RMYWJlbChjYXRlZ29yeSwgc291cmNlLmdyYW51bGFyaXR5LCB0cnVlLCBzb3VyY2UuY29udGV4dC5sb2NhbGUsIHNvdXJjZS5kYXRlTGFiZWwpXG4gICAgOiBjYXRlZ29yeTtcblxuICByZXR1cm4gZXNjYXBlSHRtbChkYXRhSW5kZXggPT09IHNvdXJjZS5hbm5vdGF0aW9ucy5wYXJ0aWFsSW5kZXggPyBgJHtwZXJpb2R9ICgke1BBUlRJQUxfUEVSSU9EX1RFWFR9KWAgOiBwZXJpb2QpO1xufVxuXG4vLyAn4pePIFJldmVudWUgKHZzIHByZXZpb3VzIG1vbnRoKTogJDgxMyDCtyBBdWcgMSDigJMgMTUsIDIwMjYnLCBhbmQgd2h5IGEgdmFsdWVcbi8vIHJlYWRzICfigJQnIG9yICduL2EnIHdoZW4gaXQgZG9lcyAoJ05vIGJhc2VsaW5lOiBubyBkYXRhIGJlZm9yZSBKdW4gMTAsIDIwMjYnKS5cbi8vIEEgdmFsdWUgY29tcGFyZWQgd2l0aCBhIHByaW9yIHRoZSBjaGFydCBkb2VzIG5vdCBwbG90IG5hbWVzIHRoYXQgcHJpb3Jcbi8vIG9uY2UsIG9uIHRoZSBmaXJzdCBsaW5lIHNob3duIHRoYXQgaXMgY29tcGFyZWQgd2l0aCBpdDogJ1JhdGUgJSBjaGFuZ2UgKHZzXG4vLyBwcmV2aW91cyBtb250aCk6IC0xMCUgwrcgdnMgNTAlIChTZXAgMSDigJMgMiwgMjAyNiknLiBuYW1lZFByaW9ycyBob2xkcyB0aGVcbi8vIHByaW9ycyBhbHJlYWR5IG5hbWVkLlxuZnVuY3Rpb24gYW5ub3RhdGVkVG9vbHRpcExpbmUoXG4gIHNvdXJjZTogQW5ub3RhdGVkVG9vbHRpcFNvdXJjZSxcbiAgaW5kZXg6IG51bWJlcixcbiAgZGF0YUluZGV4OiBudW1iZXIsXG4gIG1hcmtlcjogc3RyaW5nLFxuICBuYW1lZFByaW9yczogU2V0PHN0cmluZz4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzZXJpZXMgPSBzb3VyY2UuZXh0cmFjdGVkLnNlcmllc1tpbmRleF07XG4gIGNvbnN0IHZhbHVlID0gc2VyaWVzLnZhbHVlc1tkYXRhSW5kZXhdID8/IG51bGw7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IHNvdXJjZS5hbm5vdGF0aW9ucy5vdXRwdXRzW2luZGV4XVxuICAgID8gb3V0cHV0VmFsdWUoc291cmNlLmFubm90YXRpb25zLCBpbmRleCwgc2VyaWVzLm1lYXN1cmUsIHNvdXJjZS5jb250ZXh0KSh2YWx1ZSwgZGF0YUluZGV4KVxuICAgIDogeyB0ZXh0OiBzZXJpZXNUb29sdGlwKHNlcmllcy5tZWFzdXJlLCBzb3VyY2UuY29udGV4dCkudmFsdWVGb3JtYXR0ZXIodmFsdWUpLCB0aXRsZTogbnVsbCB9O1xuICBjb25zdCBsYW5lUHJpb3IgPSBzb3VyY2UuYW5ub3RhdGlvbnMubGFuZVByaW9yc1tpbmRleF07XG4gIGNvbnN0IGNvbXBhcmVkID0gbGFuZVByaW9yICYmICFuYW1lZFByaW9ycy5oYXMobGFuZVByaW9yLmtleSlcbiAgICA/IGNvbXBhcmVkUHJpb3JEZXRhaWwoc291cmNlLCBpbmRleCwgbGFuZVByaW9yLCBkYXRhSW5kZXgpXG4gICAgOiAnJztcbiAgaWYgKGxhbmVQcmlvcikge1xuICAgIG5hbWVkUHJpb3JzLmFkZChsYW5lUHJpb3Iua2V5KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gW2Zvcm1hdHRlZC50ZXh0LCBzZXJpZXNEZXRhaWwoc291cmNlLCBpbmRleCwgZGF0YUluZGV4KSwgY29tcGFyZWQsIGZvcm1hdHRlZC50aXRsZSA/PyAnJ107XG5cbiAgcmV0dXJuIGAke21hcmtlcn0gJHtlc2NhcGVIdG1sKHNlcmllcy5uYW1lKX06ICR7ZXNjYXBlSHRtbChwYXJ0cy5maWx0ZXIoKHBhcnQpID0+ICEhcGFydCkuam9pbihUT09MVElQX0RFVEFJTF9TRVBBUkFUT1IpKX1gO1xufVxuXG4vLyBUaGUgcHJpb3IgYSB2YWx1ZSBpcyBjb21wYXJlZCB3aXRoLCB3aGVuIHRoZSBjaGFydCBkb2VzIG5vdCBwbG90IGl0OiBpdHNcbi8vIHZhbHVlIGluIGl0cyBtZWFzdXJlJ3MgZm9ybWF0LCBhbmQgaXRzIGRheXMgKCd2cyA1MCUgKFNlcCAxIOKAkyAyLCAyMDI2KScpLlxuLy8gVGhlIG1lYXN1cmUncyBmb3JtYXQgaXMgdGhlIGN1cnJlbnQgc2VyaWVzJyB3aGVuIHRoZSBjaGFydCBwbG90cyBpdCwgZWxzZVxuLy8gYSBjaGFuZ2Ugc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQgKGEgY2hhbmdlIGlzIGluIGl0cyBtZWFzdXJlJ3MgdW5pdHMpLlxuZnVuY3Rpb24gY29tcGFyZWRQcmlvckRldGFpbChcbiAgc291cmNlOiBBbm5vdGF0ZWRUb29sdGlwU291cmNlLFxuICBpbmRleDogbnVtYmVyLFxuICBsYW5lUHJpb3I6IExhbmVQcmlvcixcbiAgZGF0YUluZGV4OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBhbm5vdGF0aW9ucyA9IHNvdXJjZS5hbm5vdGF0aW9ucztcbiAgY29uc3QgbWVhc3VyZSA9IHNvdXJjZS5leHRyYWN0ZWQuc2VyaWVzW2luZGV4XS5tZWFzdXJlO1xuICBjb25zdCBtZWFzdXJlU3BlYyA9IGFubm90YXRpb25zLm1lYXN1cmVTcGVjc1tpbmRleF1cbiAgICA/PyAoYW5ub3RhdGlvbnMub3V0cHV0c1tpbmRleF0/LnJvbGUgIT09ICdwZXJjZW50X2NoYW5nZScgJiYgbmFtZXNWYWx1ZUZvcm1hdChtZWFzdXJlKSA/IG1lYXN1cmUgOiBudWxsKTtcbiAgY29uc3QgdGV4dCA9IGZvcm1hdE91dHB1dFZhbHVlKGxhbmVQcmlvci52YWx1ZXNbZGF0YUluZGV4XSA/PyBudWxsLCBsYW5lUHJpb3Iub3V0cHV0LCBudWxsLCBzb3VyY2UuY29udGV4dCwge1xuICAgIG1lYXN1cmVTcGVjLFxuICAgIGZsb29yOiBhbm5vdGF0aW9ucy5jb21wYXJpc29uPy5mbG9vciA/PyBudWxsLFxuICB9KS50ZXh0O1xuICBjb25zdCB3aW5kb3cgPSBwcmlvckRldGFpbChzb3VyY2UsIGxhbmVQcmlvci5vdXRwdXQsIGRhdGFJbmRleCk7XG5cbiAgcmV0dXJuIHdpbmRvdyA/IGAke0NPTVBBUkVEX1BSSU9SX1BSRUZJWH0gJHt0ZXh0fSAoJHt3aW5kb3d9KWAgOiBgJHtDT01QQVJFRF9QUklPUl9QUkVGSVh9ICR7dGV4dH1gO1xufVxuXG4vLyBXaGF0IGEgc2VyaWVzJyB2YWx1ZSBjb3ZlcnMsIHdoZW4gdGhlIHNlcnZlciBzYXlzOiBhIHByaW9yJ3MgZGF5cywgb3IgYVxuLy8gd2luZG93ZWQgdmFsdWUncyB3aW5kb3cgKCdSb2xsaW5nIDMtbW9udGggdG90YWwnKSwgd2hvc2UgZGF5cyB0aGUgbm90ZVxuLy8gdW5kZXIgdGhlIGNoYXJ0IG5hbWVzLlxuZnVuY3Rpb24gc2VyaWVzRGV0YWlsKHNvdXJjZTogQW5ub3RhdGVkVG9vbHRpcFNvdXJjZSwgaW5kZXg6IG51bWJlciwgZGF0YUluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBvdXRwdXQgPSBzb3VyY2UuYW5ub3RhdGlvbnMub3V0cHV0c1tpbmRleF07XG4gIGNvbnN0IHdpbmRvdyA9IHNvdXJjZS5hbm5vdGF0aW9ucy53aW5kb3dzW2luZGV4XTtcblxuICBpZiAob3V0cHV0Py5yb2xlID09PSAncHJpb3InKSB7XG4gICAgcmV0dXJuIHByaW9yRGV0YWlsKHNvdXJjZSwgb3V0cHV0LCBkYXRhSW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHdpbmRvdyA/IHdpbmRvd1RleHQoeyAuLi53aW5kb3csIHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfSwgc291cmNlLmNvbnRleHQubG9jYWxlLCBzb3VyY2UuZ3JhbnVsYXJpdHkpIDogJyc7XG59XG5cbi8vIEEgcHJpb3IgdmFsdWUncyBkYXlzLiBBIHJhbmdlIGNvbXBhcmlzb24gY29tcGFyZXMgZXZlcnkgcG9pbnQgd2l0aCB0aGVcbi8vIHNhbWUgd2luZG93LiBBIHNlcmllcyBjb21wYXJpc29uIGNvbXBhcmVzIGVhY2ggcGVyaW9kIHdpdGggdGhlIHBlcmlvZCBpdHNcbi8vIGxhbmUncyBvZmZzZXQgYmFjazsgYSBwZXJpb2RfZW5kIGNvbXBhcmlzb24gcmVhZHMgdGhlIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhhdFxuLy8gcGVyaW9kICgnb24gQXVnIDMxLCAyMDI2JykuXG5mdW5jdGlvbiBwcmlvckRldGFpbChzb3VyY2U6IEFubm90YXRlZFRvb2x0aXBTb3VyY2UsIG91dHB1dDogT3V0cHV0TWV0YSwgZGF0YUluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjb21wYXJpc29uID0gc291cmNlLmFubm90YXRpb25zLmNvbXBhcmlzb247XG4gIGNvbnN0IGxhbmUgPSAob3V0cHV0Lm9mZnNldCA/PyAxKSAtIDE7XG4gIGNvbnN0IG9mZnNldCA9IGNvbXBhcmlzb24/Lm9mZnNldHM/LltsYW5lXTtcbiAgY29uc3QgbG9jYWxlID0gc291cmNlLmNvbnRleHQubG9jYWxlO1xuXG4gIGlmICghY29tcGFyaXNvbiB8fCAhb2Zmc2V0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGNvbXBhcmlzb24ubW9kZSA9PT0gJ3JhbmdlJyB8fCAhc291cmNlLmdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgcHJpb3IgPSBjb21wYXJpc29uLnByaW9ycz8uW2xhbmVdO1xuXG4gICAgcmV0dXJuIHByaW9yID8gZm9ybWF0RGF5V2luZG93KHByaW9yLCBjb21wYXJpc29uLnRpbWV6b25lLCBsb2NhbGUpIDogJyc7XG4gIH1cblxuICBjb25zdCBwYXJ0aWFsID0gZGF0YUluZGV4ID09PSBzb3VyY2UuYW5ub3RhdGlvbnMucGFydGlhbEluZGV4ICYmIGNvbXBhcmlzb24uYWxpZ24gPT09ICd0b19kYXRlJztcbiAgY29uc3QgdG9kYXkgPSBwYXJ0aWFsID8gem9uZVRvZGF5KGNvbXBhcmlzb24udGltZXpvbmUpIDogbnVsbDtcbiAgY29uc3Qgd2luZG93ID0gcHJpb3JQZXJpb2RXaW5kb3coc291cmNlLmV4dHJhY3RlZC5jYXRlZ29yaWVzW2RhdGFJbmRleF0gPz8gJycsIHNvdXJjZS5ncmFudWxhcml0eSwgb2Zmc2V0LCB0b2RheSk7XG5cbiAgaWYgKCF3aW5kb3cpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoY29tcGFyaXNvbi5tb2RlID09PSAncGVyaW9kX2VuZCcpIHtcbiAgICByZXR1cm4gYG9uICR7Zm9ybWF0RGF5UmFuZ2Uod2luZG93LmVuZCwgd2luZG93LmVuZCwgbG9jYWxlKX1gO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdERheVdpbmRvdyhcbiAgICB7IC4uLndpdGhpbkxhbmVTcGFuKHdpbmRvdywgY29tcGFyaXNvbi5wcmlvcnM/LltsYW5lXSksIHRocm91Z2g6IHBhcnRpYWwgPyBjb21wYXJpc29uLmN1cnJlbnQ/LnRocm91Z2ggPz8gbnVsbCA6IG51bGwgfSxcbiAgICBjb21wYXJpc29uLnRpbWV6b25lLFxuICAgIGxvY2FsZSxcbiAgKTtcbn1cblxuLy8gQSBzZXJpZXMgbGFuZSByZWFkcyB0aGUgc3BhbiBzaG93biBtb3ZlZCBiYWNrIGJ5IGl0cyBvZmZzZXQgKHRoZSBzZXJ2ZXInc1xuLy8gY29tcGFyaXNvbi5wcmlvcnNbbGFuZV0pLCBzbyB0aGUgZWFybGllciBjb3B5IG9mIGEgcGVyaW9kIHRoZSBzcGFuIHN0YXJ0c1xuLy8gb3IgZW5kcyBpbnNpZGUgaG9sZHMgb25seSB0aGUgZGF5cyB3aXRoaW4gaXQ6IGEgc3BhbiBmcm9tIE1hciAxNSBzZXRzXG4vLyBNYXJjaCBhZ2FpbnN0IEZlYiAxNSDigJMgMjgsIG5vdCB0aGUgd2hvbGUgb2YgRmVicnVhcnkuXG5mdW5jdGlvbiB3aXRoaW5MYW5lU3BhbihcbiAgd2luZG93OiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0sXG4gIHNwYW46IENvbXBhcmlzb25XaW5kb3cgfCB1bmRlZmluZWQsXG4pOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0ge1xuICBpZiAoIXNwYW4pIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSB3aW5kb3cuc3RhcnQgPCBzcGFuLnN0YXJ0ID8gc3Bhbi5zdGFydCA6IHdpbmRvdy5zdGFydDtcbiAgY29uc3QgZW5kID0gd2luZG93LmVuZCA+IHNwYW4uZW5kID8gc3Bhbi5lbmQgOiB3aW5kb3cuZW5kO1xuXG4gIHJldHVybiBzdGFydCA8PSBlbmQgPyB7IHN0YXJ0LCBlbmQgfSA6IHdpbmRvdztcbn1cblxuLy8gVGhlIGRheXMgb25lIHBlcmlvZCBvZiB0aGUgYXhpcyBpcyBjb21wYXJlZCB3aXRoOiB0aGUgcGVyaW9kIG1vdmVkIGJhY2sgYnlcbi8vIHRoZSBsYW5lJ3Mgb2Zmc2V0LiBBIHBlcmlvZCBub3Qgb3ZlciB5ZXQsIGNvbXBhcmVkIHRvIGRhdGUsIHJ1bnMgb25seSB0b1xuLy8gdG9kYXkgbW92ZWQgYmFjayAocHJpb3JUb0RhdGVFbmQpLiBudWxsIGZvciBhIGNhdGVnb3J5IHRoYXQgaXMgbm90IGEgZGF5LFxuLy8gb3IgYW4gb2Zmc2V0IHdpdGhvdXQgYSB1bml0IChhIGN1c3RvbSByYW5nZSkuXG5mdW5jdGlvbiBwcmlvclBlcmlvZFdpbmRvdyhcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHksXG4gIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCxcbiAgdG9kYXk6IERhdGUgfCBudWxsLFxuKTogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGNvbnN0IHN0YXJ0ID0gcGFyc2VJU08oY2F0ZWdvcnkpO1xuICBjb25zdCB1bml0ID0gb2Zmc2V0LnVuaXQ7XG4gIGNvbnN0IGNvdW50ID0gb2Zmc2V0LmNvdW50O1xuXG4gIGlmICghaXNWYWxpZChzdGFydCkgfHwgIXVuaXQgfHwgIWNvdW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBiYWNrID0gKGRhdGU6IERhdGUpID0+IGFkZFBlcmlvZHMoZGF0ZSwgdW5pdCwgLWNvdW50KTtcbiAgY29uc3QgZnVsbEVuZCA9IGFkZERheXMoYmFjayhhZGRQZXJpb2RzKHN0YXJ0LCBncmFudWxhcml0eSwgMSkpLCAtMSk7XG4gIGNvbnN0IGVuZCA9IHRvZGF5ID8gZWFybGllc3RPZihbZnVsbEVuZCwgcHJpb3JUb0RhdGVFbmQodG9kYXksIHN0YXJ0LCBiYWNrLCB1bml0KV0pIDogZnVsbEVuZDtcblxuICByZXR1cm4geyBzdGFydDogY2FsZW5kYXJEYXkoYmFjayhzdGFydCkpLCBlbmQ6IGNhbGVuZGFyRGF5KGxhdGVzdE9mKFtlbmQsIGJhY2soc3RhcnQpXSkpIH07XG59XG5cbi8vIFRvZGF5LCBrZXB0IGluc2lkZSB0aGUgcGVyaW9kLCBtb3ZlZCBiYWNrIGJ5IHRoZSBvZmZzZXQ7IHdoZW4gdG9kYXkgaXMgdGhlXG4vLyBsYXN0IGRheSBvZiBpdHMgbW9udGgsIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGggaXQgbGFuZHMgaW4gKHRoZVxuLy8gc2VydmVyJ3MgZW5kLW9mLW1vbnRoIHJ1bGU6IFNlcCAzMCBjb21wYXJlcyB3aXRoIEF1ZyAzMSwgbm90IEF1ZyAzMCkuXG5mdW5jdGlvbiBwcmlvclRvRGF0ZUVuZChcbiAgdG9kYXk6IERhdGUsXG4gIHBlcmlvZFN0YXJ0OiBEYXRlLFxuICBiYWNrOiAoZGF0ZTogRGF0ZSkgPT4gRGF0ZSxcbiAgdW5pdDogQ2hhcnRHcmFudWxhcml0eSxcbik6IERhdGUge1xuICBjb25zdCBkYXkgPSBsYXRlc3RPZihbc3RhcnRPZkRheSh0b2RheSksIHBlcmlvZFN0YXJ0XSk7XG4gIGNvbnN0IG1vdmVkID0gYmFjayhkYXkpO1xuXG4gIHJldHVybiBpc0xhc3REYXlPZk1vbnRoKGRheSkgJiYgdW5pdCAhPT0gJ2RheScgJiYgdW5pdCAhPT0gJ3dlZWsnID8gZW5kT2ZNb250aChtb3ZlZCkgOiBtb3ZlZDtcbn1cblxuZnVuY3Rpb24gYWRkUGVyaW9kcyhkYXRlOiBEYXRlLCB1bml0OiBDaGFydEdyYW51bGFyaXR5LCBjb3VudDogbnVtYmVyKTogRGF0ZSB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ2RheSc6XG4gICAgICByZXR1cm4gYWRkRGF5cyhkYXRlLCBjb3VudCk7XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgICByZXR1cm4gYWRkV2Vla3MoZGF0ZSwgY291bnQpO1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgcmV0dXJuIGFkZFF1YXJ0ZXJzKGRhdGUsIGNvdW50KTtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHJldHVybiBhZGRZZWFycyhkYXRlLCBjb3VudCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhZGRNb250aHMoZGF0ZSwgY291bnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGVuZGFyRGF5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0SVNPKGRhdGUsIHsgcmVwcmVzZW50YXRpb246ICdkYXRlJyB9KTtcbn1cblxuLy8gVG9kYXkncyBjYWxlbmRhciBkYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIGFzIGxvY2FsIG1pZG5pZ2h0LiBUaGUgc2VydmVyXG4vLyBtYXJrcyB3aGljaCBwZXJpb2QgaG9sZHMgdG9kYXkgKHBhcnRpYWxQZXJpb2QpIGJ1dCBub3QgdGhlIGRheSBpdHNlbGY7IHRoZVxuLy8gcHJpb3Igb2YgdGhhdCBwZXJpb2QgaXMgY2xpcHBlZCBhdCB0aGUgc2FtZSBkYXkuIEFuIHVua25vd24gem9uZSByZWFkcyB0aGVcbi8vIGJyb3dzZXIncyBvd24gZGF5LlxuZnVuY3Rpb24gem9uZVRvZGF5KHRpbWV6b25lOiBzdHJpbmcpOiBEYXRlIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJ0cyA9IGRhdGVGb3JtYXQoJ2VuLVVTJywgeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnIH0sIHRpbWV6b25lKVxuICAgICAgLmZvcm1hdFRvUGFydHMobmV3IERhdGUoKSk7XG4gICAgY29uc3QgcGFydCA9ICh0eXBlOiBJbnRsLkRhdGVUaW1lRm9ybWF0UGFydFR5cGVzKSA9PiBOdW1iZXIocGFydHMuZmluZCgoZm91bmQpID0+IGZvdW5kLnR5cGUgPT09IHR5cGUpPy52YWx1ZSk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZShwYXJ0KCd5ZWFyJyksIHBhcnQoJ21vbnRoJykgLSAxLCBwYXJ0KCdkYXknKSk7XG5cbiAgICBpZiAoaXNWYWxpZCh0b2RheSkpIHtcbiAgICAgIHJldHVybiB0b2RheTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIEFuIHVua25vd24gem9uZTogdGhlIGJyb3dzZXIncyBkYXkgYmVsb3cuXG4gIH1cblxuICByZXR1cm4gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbn1cblxuLy8gQSBjb2xvckJ5IGNoYXJ0J3Mgc3RhdGlzdGljIGxpbmU6IG9uZSBsaW5lIG92ZXIgZXZlcnkgYmFyLCBodW5nIG9mZiB0aGVcbi8vIGZpcnN0IHNlcmllcyBhbmQgZHJhd24gaW4gdGhlIHJlZmVyZW5jZSBzbGF0ZSwgYXMgbm8gb25lIGNhdGVnb3J5J3MgY29sb3Jcbi8vIHNwZWFrcyBmb3IgdGhlIG90aGVycy5cbmZ1bmN0aW9uIGNvbG9yQnlTdGF0TGluZShcbiAgZmlyc3Q6IFNlcmllc09wdGlvbixcbiAgZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcyxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgd3JpdGU/OiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nLFxuKTogU2VyaWVzT3B0aW9uIHtcbiAgY29uc3QgbWVhc3VyZSA9IGV4dHJhY3RlZC5zZXJpZXNbMF0/Lm1lYXN1cmU7XG4gIGNvbnN0IHN0YXQgPSBtZWFzdXJlTWFya1N0YXQobWVhc3VyZSk7XG4gIGNvbnN0IG1hcmtMaW5lID0gc3RhdCAmJiBzdGF0TWFya0xpbmUoXG4gICAgY29sb3JCeVZhbHVlcyhleHRyYWN0ZWQpLFxuICAgIHN0YXQsXG4gICAgd3JpdGUgPz8gbWVhc3VyZVdyaXRlcihtZWFzdXJlLCBjb250ZXh0KSxcbiAgICBgIyR7UkVQT1JUX1JFRkVSRU5DRV9DT0xPUn1gLFxuICApO1xuXG4gIHJldHVybiBtYXJrTGluZSA/IHsgLi4uZmlyc3QsIG1hcmtMaW5lIH0gYXMgU2VyaWVzT3B0aW9uIDogZmlyc3Q7XG59XG5cbi8vIEEgc2VyaWVzJyBzdGF0aXN0aWMgbGluZSBhY3Jvc3MgdGhlIHBsb3QsIGxhYmVsZWQgd2l0aCB0aGUgc3RhdGlzdGljIGFuZFxuLy8gaXRzIHZhbHVlICgnQXZlcmFnZTogMSwyMzQuNScpLCBvciB1bmRlZmluZWQgd2hlbiBubyBwb2ludCBoYXMgYSB2YWx1ZS4gSXRcbi8vIHRha2VzIHRoZSBzZXJpZXMnIGNvbG9yIHVubGVzcyBpdCBpcyBnaXZlbiBvbmUuXG5mdW5jdGlvbiBzdGF0TWFya0xpbmUoXG4gIHZhbHVlczogKG51bWJlciB8IG51bGwpW10sXG4gIHN0YXQ6IFJlcG9ydENoYXJ0TWFya1N0YXQsXG4gIHdyaXRlOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nLFxuICBjb2xvcj86IHN0cmluZyxcbikge1xuICBjb25zdCB2YWx1ZSA9IHNlcmllc1N0YXQodmFsdWVzLCBzdGF0KTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdGV4dCA9IGAke1NUQVRfTEFCRUxbc3RhdF19OiAke3dyaXRlKHZhbHVlKX1gO1xuXG4gIHJldHVybiB7XG4gICAgc2lsZW50OiB0cnVlLFxuICAgIHN5bWJvbDogJ25vbmUnLFxuICAgIGxpbmVTdHlsZTogeyB0eXBlOiAnZGFzaGVkJyBhcyBjb25zdCwgd2lkdGg6IDEsIC4uLihjb2xvciA/IHsgY29sb3IgfSA6IHt9KSB9LFxuICAgIGxhYmVsOiB7IGZvcm1hdHRlcjogKCkgPT4gdGV4dCwgcG9zaXRpb246ICdpbnNpZGVFbmRUb3AnIGFzIGNvbnN0LCBmb250U2l6ZTogUkVQT1JUX0RBVEFfTEFCRUxfRk9OVF9TSVpFLCAuLi5NQVJLX0xBQkVMX0JPWCB9LFxuICAgIGRhdGE6IFt7IHlBeGlzOiB2YWx1ZSB9XSxcbiAgfTtcbn1cblxuLy8gQSBzdGF0aXN0aWMncyB2YWx1ZSBpbiBpdHMgbWVhc3VyZSdzIG51bWJlciBmb3JtYXQsIGluIHRoZSByZXBvcnQgbG9jYWxlLlxuZnVuY3Rpb24gbWVhc3VyZVdyaXRlcihtZWFzdXJlOiBDaGFydE1lYXN1cmUgfCB1bmRlZmluZWQsIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgcmV0dXJuICh2YWx1ZSkgPT4gZm9ybWF0TnVtYmVyKHZhbHVlLCBtZWFzdXJlLCBjb250ZXh0KTtcbn1cblxuLy8gQSAxMDAlIHN0YWNrZWQgc2VyaWVzJyBzdGF0aXN0aWMgaXMgYSBzaGFyZSwgd3JpdHRlbiBhcyBpdHMgdG9vbHRpcCB3cml0ZXNcbi8vIG9uZS5cbmZ1bmN0aW9uIHNoYXJlV3JpdGVyKGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nIHtcbiAgY29uc3QgcmF0aW9Db250ZXh0ID0geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfTtcblxuICByZXR1cm4gKHZhbHVlKSA9PiBmb3JtYXROdW1iZXIodmFsdWUsIFBFUkNFTlRfU0hBUkVfRk9STUFULCByYXRpb0NvbnRleHQpO1xufVxuXG4vLyBUaGUgc2VyaWVzIHRoYXQgY2FycnkgYSBjaGFydCdzIHJlZmVyZW5jZXMsIG9uZSBwZXIgdmFsdWUgYXhpcyB0aGF0IGhhc1xuLy8gYW55OiBhbiBlbXB0eSBsaW5lIChldmVyeSBwb2ludCBudWxsLCBzbyBpdCBkcmF3cyBub3RoaW5nIGFuZCBzdHJldGNoZXMgbm9cbi8vIGF4aXMpIHdob3NlIG1hcmtMaW5lIGRyYXdzIHRoZSByZWZlcmVuY2UgbGluZXMgYW5kIHdob3NlIG1hcmtBcmVhIGZpbGxzIHRoZVxuLy8gYmFuZHMuIEl0IGlzIHNpbGVudCwgbGVmdCBvdXQgb2YgdGhlIHRvb2x0aXAgYW5kLCBieSByZWZlcmVuY2VMZWdlbmQsIG91dCBvZlxuLy8gdGhlIGxlZ2VuZC4gSXQgaGFzIG5vIG5hbWUsIHNvIG5vIG1lYXN1cmUgc2VyaWVzJyBsZWdlbmQgZW50cnkgKHdoYXRldmVyIGl0c1xuLy8gbmFtZSwgJycgaW5jbHVkZWQpIHRvZ2dsZXMgaXQuXG4vL1xuLy8gTGFiZWxzIGFyZSBmdW5jdGlvbnMsIGFzIGEgc3RyaW5nIGZvcm1hdHRlciBpcyBhIHRlbXBsYXRlIHRoYXQgd291bGQgcmVhZFxuLy8gJ3tifScgb3IgJ3tjfScgaW4gYSBsYWJlbCBhcyBhIHBsYWNlaG9sZGVyLiBFQ2hhcnRzIGRyYXdzIGEgbWFya0FyZWEgdW5kZXJcbi8vIHRoZSBiYXJzIGFuZCBhIG1hcmtMaW5lIG92ZXIgdGhlbSwgc28gYSBiYW5kJ3MgbGFiZWwgcmlkZXMgYW4gaW52aXNpYmxlXG4vLyBtYXJrTGluZSBvbiBpdHMgdXBwZXIgZWRnZSwgaW5zaWRlIGl0cyB0b3AgbGVmdCBjb3JuZXIsIHdoZXJlIHRoZSBmaXJzdCBiYXJcbi8vIHdvdWxkIG90aGVyd2lzZSBjb3ZlciBpdC5cbmZ1bmN0aW9uIHJlZmVyZW5jZUNhcnJpZXJzKHJlZmVyZW5jZXM6IERyYXduUmVmZXJlbmNlW10sIGNhdGVnb3JpZXM6IHN0cmluZ1tdKTogU2VyaWVzT3B0aW9uW10ge1xuICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfUkVGRVJFTkNFX0NPTE9SfWA7XG5cbiAgcmV0dXJuIChbMCwgMV0gYXMgY29uc3QpLmZsYXRNYXAoKGF4aXNJbmRleCk6IFNlcmllc09wdGlvbltdID0+IHtcbiAgICBjb25zdCBvbkF4aXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiByZWZlcmVuY2UuYXhpc0luZGV4ID09PSBheGlzSW5kZXgpO1xuICAgIGNvbnN0IGxpbmVzID0gb25BeGlzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhcmVmZXJlbmNlLmJhbmQpO1xuICAgIGNvbnN0IGJhbmRzID0gb25BeGlzLmZpbHRlcigocmVmZXJlbmNlKSA9PiByZWZlcmVuY2UuYmFuZCk7XG5cbiAgICBpZiAoIW9uQXhpcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3tcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIGRhdGE6IGNhdGVnb3JpZXMubWFwKCgpID0+IG51bGwpLFxuICAgICAgeUF4aXNJbmRleDogYXhpc0luZGV4LFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgdG9vbHRpcDogeyBzaG93OiBmYWxzZSB9LFxuICAgICAgbWFya0xpbmU6IHtcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICBzeW1ib2w6ICdub25lJyxcbiAgICAgICAgbGluZVN0eWxlOiB7IGNvbG9yLCB0eXBlOiAnZGFzaGVkJywgd2lkdGg6IDEgfSxcbiAgICAgICAgbGFiZWw6IHsgcG9zaXRpb246ICdpbnNpZGVFbmRUb3AnLCBjb2xvciwgZm9udFNpemU6IFJFUE9SVF9EQVRBX0xBQkVMX0ZPTlRfU0laRSwgLi4uTUFSS19MQUJFTF9CT1ggfSxcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIC4uLmxpbmVzLm1hcCgocmVmZXJlbmNlKSA9PiAoeyB5QXhpczogcmVmZXJlbmNlLmxvdywgbGFiZWw6IHsgZm9ybWF0dGVyOiAoKSA9PiByZWZlcmVuY2UubGFiZWwgfSB9KSksXG4gICAgICAgICAgLi4uYmFuZHMubWFwKChyZWZlcmVuY2UpID0+ICh7XG4gICAgICAgICAgICB5QXhpczogcmVmZXJlbmNlLmhpZ2gsXG4gICAgICAgICAgICAvLyBaZXJvIHdpZHRoLCBub3QgemVybyBvcGFjaXR5OiBhIG1hcmtMaW5lJ3MgbGFiZWwgdGFrZXMgdGhlXG4gICAgICAgICAgICAvLyBsaW5lJ3Mgb3BhY2l0eS5cbiAgICAgICAgICAgIGxpbmVTdHlsZTogeyB3aWR0aDogMCB9LFxuICAgICAgICAgICAgbGFiZWw6IHsgcG9zaXRpb246ICdpbnNpZGVTdGFydEJvdHRvbScsIGZvcm1hdHRlcjogKCkgPT4gcmVmZXJlbmNlLmxhYmVsIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC4uLihiYW5kcy5sZW5ndGggPyB7XG4gICAgICAgIG1hcmtBcmVhOiB7XG4gICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogUkVGRVJFTkNFX0JBTkRfRklMTCB9LFxuICAgICAgICAgIGRhdGE6IGJhbmRzLm1hcCgocmVmZXJlbmNlKSA9PiBbeyB5QXhpczogcmVmZXJlbmNlLmxvdyB9LCB7IHlBeGlzOiByZWZlcmVuY2UuaGlnaCB9XSksXG4gICAgICAgIH0sXG4gICAgICB9IDoge30pLFxuICAgIH0gYXMgU2VyaWVzT3B0aW9uXTtcbiAgfSk7XG59XG5cbi8vIFRoZSBsYXJnZXN0IG1hZ25pdHVkZSBhIHZhbHVlIGF4aXMncyByZWZlcmVuY2VzIHJlYWNoLCB3aGljaCBpdHMgbnVtYmVyXG4vLyBmb3JtYXQgY291bnRzIHRvd2FyZCBpdHMgcGVhaywgYXMgdGhlIGF4aXMgc3RyZXRjaGVzIHRvIHRoZW07IDAgd2hlbiBpdFxuLy8gaGFzIG5vbmUuXG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlUGVhayhyZWZlcmVuY2VzOiBEcmF3blJlZmVyZW5jZVtdLCBheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4KTogbnVtYmVyIHtcbiAgY29uc3QgcmVhY2ggPSByZWZlcmVuY2VSZWFjaChyZWZlcmVuY2VzLCBheGlzSW5kZXgpO1xuXG4gIHJldHVybiByZWFjaCA/IE1hdGgubWF4KE1hdGguYWJzKHJlYWNoLmxvdyksIE1hdGguYWJzKHJlYWNoLmhpZ2gpKSA6IDA7XG59XG5cbi8vIFRoZSBsZWdlbmQgb2YgYSBjaGFydCB3aXRoIHJlZmVyZW5jZXMgbmFtZXMgaXRzIG1lYXN1cmUgc2VyaWVzIGFsb25lLCBzb1xuLy8gYSBjYXJyaWVyIG5ldmVyIHNob3dzIGFzIGEgYmxhbmsgZW50cnkuIFdpdGhvdXQgcmVmZXJlbmNlcyBpdCBpcyBsZWZ0IGFzIGl0XG4vLyB3YXMuXG5mdW5jdGlvbiByZWZlcmVuY2VMZWdlbmQoXG4gIGxlZ2VuZDogTGVnZW5kQ29tcG9uZW50T3B0aW9uLFxuICBzZXJpZXM6IFNlcmllc09wdGlvbltdLFxuICByZWZlcmVuY2VzOiBEcmF3blJlZmVyZW5jZVtdLFxuKTogTGVnZW5kQ29tcG9uZW50T3B0aW9uIHtcbiAgcmV0dXJuIHJlZmVyZW5jZXMubGVuZ3RoXG4gICAgPyB7IC4uLmxlZ2VuZCwgZGF0YTogc2VyaWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0ubmFtZSA/PyAnJykpIH1cbiAgICA6IGxlZ2VuZDtcbn1cblxuLy8gVGhlIHNwYW4gb2YgdGhlIHJlZmVyZW5jZXMgb24gb25lIHZhbHVlIGF4aXMsIG9yIHVuZGVmaW5lZCB3aGVuIGl0IGhhc1xuLy8gbm9uZS5cbmZ1bmN0aW9uIHJlZmVyZW5jZVJlYWNoKHJlZmVyZW5jZXM6IERyYXduUmVmZXJlbmNlW10sIGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXgpOiBSZWZlcmVuY2VSZWFjaCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9uQXhpcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5heGlzSW5kZXggPT09IGF4aXNJbmRleCk7XG5cbiAgcmV0dXJuIG9uQXhpcy5sZW5ndGhcbiAgICA/IHsgbG93OiBNYXRoLm1pbiguLi5vbkF4aXMubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5sb3cpKSwgaGlnaDogTWF0aC5tYXgoLi4ub25BeGlzLm1hcCgocmVmZXJlbmNlKSA9PiByZWZlcmVuY2UuaGlnaCkpIH1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLy8gRUNoYXJ0cyBsZWF2ZXMgYSBtYXJrTGluZSBvciBtYXJrQXJlYSBvdXQgb2YgYW4gYXhpcydzIGV4dGVudCwgc28gYVxuLy8gcmVmZXJlbmNlIGJleW9uZCB0aGUgZGF0YSB3b3VsZCBmYWxsIG9mZiB0aGUgcGxvdC4gQW4gYXhpcyBib3VuZCB0aGUgY29uZmlnXG4vLyBkb2VzIG5vdCBwaW4gcmVhY2hlcyBwYXN0IHRoZSBmdXJ0aGVzdCByZWZlcmVuY2UsIHRvIGEgcm91bmQgbnVtYmVyIHdpdGhcbi8vIHJvb20gZm9yIGl0cyBsYWJlbCAoYmV5b25kUmVmZXJlbmNlKSwgd2hlbiB0aGUgZGF0YSAoYW5kIHRoZSB6ZXJvIGEgdmFsdWVcbi8vIGF4aXMgYWx3YXlzIHNob3dzKSBmYWxscyBzaG9ydCBvZiBpdCwgYW5kIGlzIGxlZnQgdG8gRUNoYXJ0cyBvdGhlcndpc2U6IGFcbi8vIGNhbGxiYWNrIHJldHVybmluZyB1bmRlZmluZWQga2VlcHMgdGhlIGJvdW5kIGF1dG9tYXRpYy4gUGFzdCB0aGUgZGF0YSBhbmRcbi8vIHplcm8sIGEgcmVmZXJlbmNlIGJleW9uZCB0aGUgbWF4IGlzIGFib3ZlIHplcm8gYW5kIG9uZSBiZXlvbmQgdGhlIG1pbiBiZWxvd1xuLy8gaXQuXG5mdW5jdGlvbiByZWFjaE1pbihyZWFjaDogUmVmZXJlbmNlUmVhY2ggfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHJlYWNoXG4gICAgPyAoZXh0ZW50OiBBeGlzRXh0ZW50KSA9PiAocmVhY2gubG93IDwgTWF0aC5taW4oZXh0ZW50Lm1pbiwgMCkgPyAtYmV5b25kUmVmZXJlbmNlKC1yZWFjaC5sb3cpIDogdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFjaE1heChyZWFjaDogUmVmZXJlbmNlUmVhY2ggfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHJlYWNoXG4gICAgPyAoZXh0ZW50OiBBeGlzRXh0ZW50KSA9PiAocmVhY2guaGlnaCA+IE1hdGgubWF4KGV4dGVudC5tYXgsIDApID8gYmV5b25kUmVmZXJlbmNlKHJlYWNoLmhpZ2gpIDogdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vLyBUaGUgYm91bmQgYW4gYXhpcyB0YWtlcyBwYXN0IGEgcmVmZXJlbmNlIG9mIHRoaXMgKHBvc2l0aXZlKSBtYWduaXR1ZGU6IHRoZVxuLy8gc21hbGxlc3Qgcm91bmQgbnVtYmVyIGF0IG9yIGFib3ZlIGl0IHBsdXMgUkVGRVJFTkNFX0hFQURST09NLiBUaGUgc3RlcHMgYXJlXG4vLyBmaW5lciB0aGFuIEVDaGFydHMnIHRpY2sgc3RlcHMsIHNvIGEgcmVmZXJlbmNlIGp1c3QgcGFzdCB0aGUgZGF0YSBkb2VzIG5vdFxuLy8gZG91YmxlIHRoZSBheGlzICgxMTAgZ2l2ZXMgMTIwLCBub3QgMjAwKS4gVGhlIHRvbGVyYW5jZSBrZWVwcyBhIGZsb2F0IGVycm9yXG4vLyBmcm9tIHNraXBwaW5nIGEgcm91bmQgbnVtYmVyIHRoZSB2YWx1ZSBhbHJlYWR5IGlzLlxuY29uc3QgTklDRV9TVEVQUyA9IFsxLCAxLjIsIDEuNSwgMiwgMi41LCAzLCA0LCA1LCA2LCA4LCAxMF07XG5jb25zdCBOSUNFX1RPTEVSQU5DRSA9IDFlLTk7XG5cbmZ1bmN0aW9uIGJleW9uZFJlZmVyZW5jZShtYWduaXR1ZGU6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHRhcmdldCA9IG1hZ25pdHVkZSAqIFJFRkVSRU5DRV9IRUFEUk9PTTtcbiAgY29uc3QgcG93ZXIgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZzEwKHRhcmdldCkpKTtcbiAgY29uc3Qgc3RlcCA9IE5JQ0VfU1RFUFMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgKiBwb3dlciA+PSB0YXJnZXQgKiAoMSAtIE5JQ0VfVE9MRVJBTkNFKSkgPz8gMTA7XG5cbiAgLy8gUm91bmRlZCBiYWNrIHRvIHRoZSBwb3dlcidzIG93biBkaWdpdHMsIHNvIDEuMiB4IDAuMSByZWFkcyAwLjEyLCBub3RcbiAgLy8gMC4xMjAwMDAwMDAwMDAwMDAwMS5cbiAgcmV0dXJuIE51bWJlcigoc3RlcCAqIHBvd2VyKS50b1ByZWNpc2lvbigxMikpO1xufVxuXG4vLyBUaGUgY2F0ZWdvcnkgYXhpcyBvZiBhbiBheGlzIGNoYXJ0IG9yIGEgd2F0ZXJmYWxsOiB0aGUgY2F0ZWdvcmllcyBpbiByb3dcbi8vIG9yZGVyLCBsYWJlbGVkIGFzIHBlcmlvZHMgd2hlbiB0aGUgcm93cyB3ZXJlIGJ1Y2tldGVkIGJ5IHRpbWUuXG4vL1xuLy8gSG9yaXpvbnRhbCBiYXJzIHJlYWQgdG9wLWRvd246IEVDaGFydHMgZHJhd3MgY2F0ZWdvcnkgMCBhdCB0aGUgYm90dG9tLCBzbyB0aGVcbi8vIGF4aXMgaXMgaW52ZXJ0ZWQgdG8gcHV0IHRoZSBmaXJzdCByb3cgKHRoZSBsYXJnZXN0IG9mIGEgdG9wLU4sIGEgd2F0ZXJmYWxsJ3Ncbi8vIGZpcnN0IHN0ZXApIGF0IHRoZSB0b3AuIFRoZSByb3RhdGVkIHRpdGxlIHNpdHMganVzdCBiZXlvbmQgdGhlIGxvbmdlc3QgbGFiZWxcbi8vIHJhdGhlciB0aGFuIGF0IGEgZml4ZWQgZ2FwIHRoYXQgd291bGQgcHV0IGl0IG9uIHRvcCBvZiB0aGUgbGFiZWxzLlxuLy9cbi8vIEEgYnVja2V0ZWQgYXhpcyBhbHNvIG5hbWVzIGl0cyBwZXJpb2QgaW4gdGhlIGF4aXMgdG9vbHRpcCdzIGhlYWRlcjogRUNoYXJ0c1xuLy8gaGVhZHMgaXQgd2l0aCB0aGUgcmF3IGNhdGVnb3J5ICgnMjAyNi0wMS0wMScpIHVubGVzcyB0aGUgYXhpcyBwb2ludGVyJ3MgbGFiZWxcbi8vIGhhcyBhIGZvcm1hdHRlciwgc28gaXQgcmVhZHMgJ0phbnVhcnkgMjAyNicgaW5zdGVhZCwgYWx3YXlzIHdpdGggaXRzIHllYXIuXG4vLyBUaGUgYXhpcydzIGRhdGVMYWJlbCBzdHlsZSB3cml0ZXMgYm90aCBpdHMgdGljayBsYWJlbHMgYW5kIHRoYXQgaGVhZGVyLlxuZnVuY3Rpb24gY2F0ZWdvcnlBeGlzT3B0aW9uKFxuICBjb25maWc6IENoYXJ0Q29uZmlnLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgaG9yaXpvbnRhbDogYm9vbGVhbixcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pIHtcbiAgY29uc3QgZ3JhbnVsYXJpdHkgPSBidWNrZXRHcmFudWxhcml0eShkYXRhKTtcbiAgY29uc3QgZGF0ZUxhYmVsID0gY2hhcnREYXRlTGFiZWwoY29uZmlnKTtcbiAgY29uc3QgcGVyaW9kTGFiZWwgPSBwZXJpb2RBeGlzTGFiZWwoZ3JhbnVsYXJpdHksIGNhdGVnb3JpZXMsIGxvY2FsZSwgZGF0ZUxhYmVsKTtcbiAgY29uc3QgYXhpcyA9IHtcbiAgICB0eXBlOiAnY2F0ZWdvcnknIGFzIGNvbnN0LFxuICAgIGRhdGE6IGNhdGVnb3JpZXMsXG4gICAgaW52ZXJzZTogaG9yaXpvbnRhbCxcbiAgICBuYW1lOiBjb25maWcueEF4aXM/LmxhYmVsLFxuICAgIG5hbWVMb2NhdGlvbjogJ21pZGRsZScgYXMgY29uc3QsXG4gICAgLi4uKGdyYW51bGFyaXR5ID8ge1xuICAgICAgYXhpc1BvaW50ZXI6IHtcbiAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICBmb3JtYXR0ZXI6IChwYXJhbXM6IHsgdmFsdWU6IHVua25vd24gfSkgPT4gZm9ybWF0UGVyaW9kTGFiZWwoXG4gICAgICAgICAgICBTdHJpbmcocGFyYW1zLnZhbHVlKSxcbiAgICAgICAgICAgIGdyYW51bGFyaXR5LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIGRhdGVMYWJlbCxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICB9O1xuXG4gIGlmICghaG9yaXpvbnRhbCkge1xuICAgIC8vIFRoZSBnYXAgY2xlYXJzIHRoZSB5ZWFyJ3Mgc2Vjb25kIGxpbmUgd2hlbiB0aGUgbGFiZWxzIHByaW50IG9uZS5cbiAgICBjb25zdCBzZWNvbmRMaW5lID0gZ3JhbnVsYXJpdHkgJiYgZGF0ZUxhYmVsID09PSBSZXBvcnRDaGFydERhdGVMYWJlbC5TaG9ydCAmJiBzcGFuc011bHRpcGxlWWVhcnMoY2F0ZWdvcmllcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXhpcyxcbiAgICAgIG5hbWVHYXA6IHNlY29uZExpbmUgPyA0MCA6IDI4LFxuICAgICAgLi4ucGVyaW9kTGFiZWwsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFBlcmlvZCBsYWJlbHMsIHNob3J0LCBsb25nIG9yIG51bWVyaWMgKCdNYXknLCAnUTInLCAnTWF5IDIwMjYnKSwgYXJlXG4gIC8vIGJvdW5kZWQgaW4gbGVuZ3RoIGFuZCBuZXZlciBjdXQ7IG9ubHkgYSBwbGFpbiBjYXRlZ29yeSBpcyB0cnVuY2F0ZWQuIFRoZSBsYWJlbHMgYXJlIGN1dCBoZXJlIHJhdGhlciB0aGFuIGJ5IEVDaGFydHMnIG93blxuICAvLyB0cnVuY2F0aW9uLCBzbyB0aGUgdGl0bGUncyBnYXAgaXMgbWVhc3VyZWQgb24gZXhhY3RseSB0aGUgdGV4dCB0aGUgYXhpc1xuICAvLyBkcmF3cy5cbiAgY29uc3Qgc2hvd24gPSBncmFudWxhcml0eVxuICAgID8gbnVsbFxuICAgIDogbmV3IE1hcChjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IFtjYXRlZ29yeSwgdHJ1bmNhdGVBeGlzTGFiZWwoY2F0ZWdvcnkpXSkpO1xuICBjb25zdCBsYWJlbHMgPSBzaG93biA/IFsuLi5zaG93bi52YWx1ZXMoKV0gOiBkaXNwbGF5ZWRDYXRlZ29yeUxhYmVscyhjYXRlZ29yaWVzLCBncmFudWxhcml0eSwgbG9jYWxlLCBkYXRlTGFiZWwpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uYXhpcyxcbiAgICBuYW1lR2FwOiB3aWRlc3RBeGlzTGFiZWwobGFiZWxzKSArIEFYSVNfTEFCRUxfTUFSR0lOICsgQVhJU19OQU1FX0NMRUFSQU5DRSxcbiAgICAuLi4oc2hvd24gPyB7IGF4aXNMYWJlbDogeyBmb3JtYXR0ZXI6ICh2YWx1ZTogc3RyaW5nKSA9PiBzaG93bi5nZXQodmFsdWUpID8/IHZhbHVlIH0gfSA6IHBlcmlvZExhYmVsKSxcbiAgfTtcbn1cblxuLy8gVGhlIGNhdGVnb3J5IGF4aXMncyB0aXRsZSBzaWRlLCBvciBudWxsIHdoZW4gdGhlIGF4aXMgaGFzIG5vIHRpdGxlIHRvIG1ha2Vcbi8vIHJvb20gZm9yLlxuZnVuY3Rpb24gY2F0ZWdvcnlUaXRsZVNpZGUoY29uZmlnOiBDaGFydENvbmZpZywgaG9yaXpvbnRhbDogYm9vbGVhbik6IEF4aXNUaXRsZVNpZGUgfCBudWxsIHtcbiAgaWYgKCFjb25maWcueEF4aXM/LmxhYmVsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaG9yaXpvbnRhbCA/ICdsZWZ0JyA6ICdib3R0b20nO1xufVxuXG4vLyBUaGUgdmFsdWUgYXhlcycgdGl0bGUgc2lkZSwgb3IgbnVsbCB3aGVuIG5vbmUgb2YgdGhlbSBoYXMgYSB0aXRsZS4gQVxuLy8gdmVydGljYWwgY2hhcnQncyB0aXRsZXMgc2l0IGFib3ZlIHRoZSBwbG90LCBhdCB0aGUgdG9wIG9mIGVhY2ggYXhpcyBsaW5lLCBzb1xuLy8gcm9vbSBpcyBtYWRlIG9uY2UgZm9yIGJvdGg7IGEgaG9yaXpvbnRhbCBjaGFydCdzIHNpdHMgYmVsb3cuXG5mdW5jdGlvbiB2YWx1ZVRpdGxlU2lkZShheGVzOiAoQ2hhcnRWYWx1ZUF4aXMgfCB1bmRlZmluZWQpW10sIGhvcml6b250YWw6IGJvb2xlYW4pOiBBeGlzVGl0bGVTaWRlIHwgbnVsbCB7XG4gIGlmICghYXhlcy5zb21lKChheGlzKSA9PiBheGlzPy5sYWJlbCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3Jpem9udGFsID8gJ2JvdHRvbScgOiAndG9wJztcbn1cblxuLy8gVGhlIHRpY2sgbGFiZWxzIGFzIHRoZSBheGlzIHNob3dzIHRoZW06IGEgYnVja2V0J3MgcHJpbWFyeSBwZXJpb2QgbGFiZWxcbi8vICgnTWF5JywgJ1EyJywgJ01heSAyMDI2JyksIG90aGVyd2lzZSB0aGUgY2F0ZWdvcnkgaXRzZWxmLiBUaGUgeWVhciBhXG4vLyBtdWx0aS15ZWFyIGF4aXMgcHJpbnRzIHVuZGVyIGEgc2hvcnQgcGVyaW9kIGlzIGxlZnQgb3V0LCBhcyBpdCBpcyBuZXZlciB0aGVcbi8vIHdpZGVyIGxpbmUuXG5mdW5jdGlvbiBkaXNwbGF5ZWRDYXRlZ29yeUxhYmVscyhcbiAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGRhdGVMYWJlbDogUmVwb3J0Q2hhcnREYXRlTGFiZWwsXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBncmFudWxhcml0eVxuICAgID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBwZXJpb2RMYWJlbFBhcnRzKGNhdGVnb3J5LCBncmFudWxhcml0eSwgbG9jYWxlLCBkYXRlTGFiZWwpPy5wcmltYXJ5ID8/IGNhdGVnb3J5KVxuICAgIDogY2F0ZWdvcmllcztcbn1cblxuLy8gVGhlIHBpeGVsIHdpZHRoIG9mIHRoZSB3aWRlc3QgbGFiZWwuIEEgbGFiZWwgdGhhdCBicmVha3Mgb3ZlciBzZXZlcmFsIGxpbmVzXG4vLyBpcyBhcyB3aWRlIGFzIGl0cyBsb25nZXN0IGxpbmUuXG5mdW5jdGlvbiB3aWRlc3RBeGlzTGFiZWwobGFiZWxzOiBzdHJpbmdbXSk6IG51bWJlciB7XG4gIHJldHVybiBsYWJlbHMucmVkdWNlKCh3aWRlc3QsIGxhYmVsKSA9PiBsYWJlbC5zcGxpdCgnXFxuJykucmVkdWNlKFxuICAgIChsaW5lV2lkZXN0LCBsaW5lKSA9PiBNYXRoLm1heChsaW5lV2lkZXN0LCBheGlzTGFiZWxXaWR0aChsaW5lKSksXG4gICAgd2lkZXN0LFxuICApLCAwKTtcbn1cblxuLy8gQSBjYXRlZ29yeSBsYWJlbCBjdXQgdG8gQ0FURUdPUllfTEFCRUxfTUFYX1dJRFRILCBsaW5lIGJ5IGxpbmU6IHRoZSBsb25nZXN0XG4vLyBzdGFydCBvZiBlYWNoIGxpbmUgdGhhdCBzdGlsbCBmaXRzIHdpdGggdGhlIGVsbGlwc2lzIGFmdGVyIGl0LlxuZnVuY3Rpb24gdHJ1bmNhdGVBeGlzTGFiZWwobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsYWJlbC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiB7XG4gICAgaWYgKGF4aXNMYWJlbFdpZHRoKGxpbmUpIDw9IENBVEVHT1JZX0xBQkVMX01BWF9XSURUSCkge1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuXG4gICAgLy8gQ29kZSBwb2ludHMsIHNvIGFuIGVtb2ppIG9yIG90aGVyIHN1cnJvZ2F0ZSBwYWlyIGlzIG5ldmVyIHNwbGl0LlxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBBcnJheS5mcm9tKGxpbmUpO1xuICAgIGNvbnN0IGN1dCA9IChsZW5ndGg6IG51bWJlcikgPT4gYCR7Y2hhcmFjdGVycy5zbGljZSgwLCBsZW5ndGgpLmpvaW4oJycpLnRyaW1FbmQoKX0ke0xBQkVMX0VMTElQU0lTfWA7XG4gICAgbGV0IGZpdHMgPSAwO1xuICAgIGxldCB0b29Mb25nID0gY2hhcmFjdGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKHRvb0xvbmcgLSBmaXRzID4gMSkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5mbG9vcigoZml0cyArIHRvb0xvbmcpIC8gMik7XG4gICAgICBpZiAoYXhpc0xhYmVsV2lkdGgoY3V0KGxlbmd0aCkpIDw9IENBVEVHT1JZX0xBQkVMX01BWF9XSURUSCkge1xuICAgICAgICBmaXRzID0gbGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9vTG9uZyA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3V0KGZpdHMpO1xuICB9KS5qb2luKCdcXG4nKTtcbn1cblxuLy8gT25lIGxpbmUncyB3aWR0aCBpbiB0aGUgYXhpcy1sYWJlbCBmb250LCBtZWFzdXJlZCBvbiBhIGNhbnZhcyB0aGUgd2F5XG4vLyBFQ2hhcnRzIG1lYXN1cmVzIGl0IGZvciBjb250YWluTGFiZWwuIE91dHNpZGUgYSBicm93c2VyIHRoZXJlIGlzIG5vIGNhbnZhc1xuLy8gdG8gbWVhc3VyZSB3aXRoLCBzbyB0aGUgbGluZSBjb3VudHMgYXMgemVybyB3aWR0aC5cbmxldCBheGlzTGFiZWxDb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gYXhpc0xhYmVsV2lkdGgobGluZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKCFheGlzTGFiZWxDb250ZXh0ICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBheGlzTGFiZWxDb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcbiAgfVxuXG4gIGlmICghYXhpc0xhYmVsQ29udGV4dCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgYXhpc0xhYmVsQ29udGV4dC5mb250ID0gQVhJU19MQUJFTF9GT05UO1xuXG4gIHJldHVybiBheGlzTGFiZWxDb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhdGVyZmFsbE9wdGlvbihcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBFQ2hhcnRzT3B0aW9uIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3Qgd2F0ZXJmYWxsID0gZXh0cmFjdFdhdGVyZmFsbChjb21wb25lbnQsIGRhdGEpO1xuICBjb25zdCBob3Jpem9udGFsID0gY29uZmlnLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gIGNvbnN0IGNhdGVnb3JpZXMgPSB3YXRlcmZhbGwuc3RlcHMubWFwKChzdGVwKSA9PiBzdGVwLmNhdGVnb3J5KTtcbiAgY29uc3QgY2F0ZWdvcnlBeGlzID0gY2F0ZWdvcnlBeGlzT3B0aW9uKGNvbmZpZywgZGF0YSwgY2F0ZWdvcmllcywgaG9yaXpvbnRhbCwgY29udGV4dC5sb2NhbGUpO1xuICAvLyBUaGUgb25lIG1lYXN1cmUncyBmb3JtYXQgd3JpdGVzIHRoZSBheGlzIGFuZCB0aGUgdG9vbHRpcC4gVGhlIGF4aXMgaGFzIHRvXG4gIC8vIHJlYWNoIHRoZSBmdXJ0aGVzdCBwb2ludCB0aGUgcnVubmluZyB0b3RhbCBnZXRzIHRvLCBvbiBlaXRoZXIgc2lkZSBvZlxuICAvLyB6ZXJvLCBvciB0aGUgZnVydGhlc3QgcmVmZXJlbmNlLlxuICBjb25zdCBzcGVjID0gY29uZmlnLm1lYXN1cmVzPy5bMF07XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBjaGFydFJlZmVyZW5jZXMoY29uZmlnLCBmYWxzZSk7XG4gIGNvbnN0IHZhbHVlQXhpcyA9IHZhbHVlQXhpc09wdGlvbihjb25maWcudmFsdWVBeGlzLCBob3Jpem9udGFsLCB2YWx1ZUF4aXNMYWJlbChyZXNvbHZlVmFsdWVBeGlzRm9ybWF0KFxuICAgIHNwZWMgJiYgaGFzTnVtYmVyRm9ybWF0KHNwZWMpID8gc3BlYyA6IG51bGwsXG4gICAgKCkgPT4gTWF0aC5tYXgocmVmZXJlbmNlUGVhayhyZWZlcmVuY2VzLCAwKSwgLi4ud2F0ZXJmYWxsLnN0ZXBzLm1hcCgoc3RlcCkgPT4gTWF0aC5hYnMoc3RlcC5zdGFydCArIChzdGVwLmNoYW5nZSA/PyAwKSkpKSxcbiAgICBjb250ZXh0LFxuICApLCBjb250ZXh0KSwgeyByZWFjaDogcmVmZXJlbmNlUmVhY2gocmVmZXJlbmNlcywgMCkgfSk7XG4gIC8vIE9uZSB2aXNpYmxlIHNlcmllcywgc28gdGhlIGxlZ2VuZCBpcyBoaWRkZW4gdW5sZXNzIHRoZSBjb25maWcgcGlucyBpdC5cbiAgY29uc3QgbGVnZW5kUG9zaXRpb24gPSByZXNvbHZlTGVnZW5kUG9zaXRpb24oY29uZmlnLCAxKTtcbiAgY29uc3QgZ3JhbnVsYXJpdHkgPSBidWNrZXRHcmFudWxhcml0eShkYXRhKTtcblxuICByZXR1cm4ge1xuICAgIGdyaWQ6IGF4aXNHcmlkKFxuICAgICAgbGVnZW5kUG9zaXRpb24sXG4gICAgICBjYXRlZ29yeVRpdGxlU2lkZShjb25maWcsIGhvcml6b250YWwpLFxuICAgICAgdmFsdWVUaXRsZVNpZGUoW2NvbmZpZy52YWx1ZUF4aXNdLCBob3Jpem9udGFsKSxcbiAgICApLFxuICAgIGxlZ2VuZDogeyAuLi5sZWdlbmRPcHRpb24obGVnZW5kUG9zaXRpb24pLCBkYXRhOiBbd2F0ZXJmYWxsLm5hbWVdIH0sXG4gICAgLy8gUGVyIGJhcjogdGhlIGludmlzaWJsZSBiYXNlIGlzIHNpbGVudCwgc28gb25seSBhIHN0ZXAgYW5zd2VycyB0aGUgaG92ZXIuXG4gICAgdG9vbHRpcDoge1xuICAgICAgdHJpZ2dlcjogJ2l0ZW0nLFxuICAgICAgZm9ybWF0dGVyOiAocGFyYW1zOiBUb29sdGlwQ29tcG9uZW50Rm9ybWF0dGVyQ2FsbGJhY2tQYXJhbXMpID0+IHdhdGVyZmFsbFRvb2x0aXAoXG4gICAgICAgIHdhdGVyZmFsbCxcbiAgICAgICAgKEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtc1swXSA6IHBhcmFtcykuZGF0YUluZGV4LFxuICAgICAgICBncmFudWxhcml0eSxcbiAgICAgICAgY2hhcnREYXRlTGFiZWwoY29uZmlnKSxcbiAgICAgICAgc3BlYyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgfSxcbiAgICB4QXhpczogaG9yaXpvbnRhbCA/IHZhbHVlQXhpcyA6IGNhdGVnb3J5QXhpcyxcbiAgICB5QXhpczogaG9yaXpvbnRhbCA/IGNhdGVnb3J5QXhpcyA6IHZhbHVlQXhpcyxcbiAgICBzZXJpZXM6IFsuLi53YXRlcmZhbGxTZXJpZXMod2F0ZXJmYWxsKSwgLi4ucmVmZXJlbmNlQ2FycmllcnMocmVmZXJlbmNlcywgY2F0ZWdvcmllcyldLFxuICB9O1xufVxuXG4vLyBBbiBpbnZpc2libGUgYmFzZSBzZXJpZXMgbGlmdHMgZWFjaCB2aXNpYmxlIGJhciB0byB3aGVyZSBpdHMgc3RlcCBzdGFydHMuXG4vLyBCb3RoIHN0YWNrIHdpdGggdGhlICdhbGwnIHN0cmF0ZWd5LCB3aGljaCBhZGRzIHNpZ25lZCB2YWx1ZXMgaW4gc2VyaWVzIG9yZGVyLFxuLy8gc28gYSBmYWxsIGRyYXdzIERPV04gZnJvbSB0aGUgdG90YWwgYmVmb3JlIGl0LCBldmVuIGFjcm9zcyB6ZXJvLiBUaGUgZGVmYXVsdFxuLy8gc2FtZS1zaWduIHN0YWNraW5nIHdvdWxkIGhhbmcgYSBuZWdhdGl2ZSBiYXIgYmVsb3cgdGhlIGF4aXMgaW5zdGVhZC5cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh3YXRlcmZhbGw6IEV4dHJhY3RlZFdhdGVyZmFsbCk6IFNlcmllc09wdGlvbltdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIHN0YWNrOiAnd2F0ZXJmYWxsJyxcbiAgICAgIHN0YWNrU3RyYXRlZ3k6ICdhbGwnLFxuICAgICAgZGF0YTogd2F0ZXJmYWxsLnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5zdGFydCksXG4gICAgICBiYXJNYXhXaWR0aDogNDgsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6ICd0cmFuc3BhcmVudCcgfSxcbiAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IHdhdGVyZmFsbC5uYW1lLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBzdGFjazogJ3dhdGVyZmFsbCcsXG4gICAgICBzdGFja1N0cmF0ZWd5OiAnYWxsJyxcbiAgICAgIGJhck1heFdpZHRoOiA0OCxcbiAgICAgIC8vIFRoZSBzZXJpZXMgY29sb3IgaXMgdGhlIHJpc2UgY29sb3Igc28gYSBwaW5uZWQgbGVnZW5kIHNob3dzIGl0OyBlYWNoXG4gICAgICAvLyBiYXIgaXMgdGhlbiBjb2xvcmVkIGJ5IHdoYXQgaXQgZG9lcyB0byB0aGUgdG90YWwuXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IGAjJHtSRVBPUlRfV0FURVJGQUxMX0NPTE9SUy5yaXNlfWAgfSxcbiAgICAgIGRhdGE6IHdhdGVyZmFsbC5zdGVwcy5tYXAoKHN0ZXApID0+ICh7XG4gICAgICAgIHZhbHVlOiBzdGVwLmNoYW5nZSxcbiAgICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBgIyR7UkVQT1JUX1dBVEVSRkFMTF9DT0xPUlNbc3RlcC5raW5kXX1gIH0sXG4gICAgICB9KSksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gQSBzdGVwJ3MgdG9vbHRpcDogaXRzIHBlcmlvZCwgaG93IGZhciBpdCBtb3ZlZCB0aGUgcnVubmluZyB0b3RhbCBhbmQgd2hlcmVcbi8vIHRoYXQgbGVmdCBpdC4gVGhlIGNsb3NpbmcgVG90YWwgc2hvd3MgdGhlIHRvdGFsIGFsb25lLiBUaGUgY2F0ZWdvcnkgYW5kIHRoZVxuLy8gbWVhc3VyZSBuYW1lIGNvbWUgZnJvbSB0aGUgZGF0YSBhbmQgdGhlIGNvbmZpZywgYW5kIEVDaGFydHMgc2V0cyB0aGUgdG9vbHRpcFxuLy8gYXMgSFRNTCwgc28gYm90aCBhcmUgZXNjYXBlZC4gUGVyaW9kcyBhbmQgYW1vdW50cyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3Ncbi8vIGxvY2FsZSwgYW1vdW50cyBpbiB0aGUgbWVhc3VyZSdzIG51bWJlciBmb3JtYXQgKGEgcGxhaW4gbnVtYmVyIHdpdGhvdXQgb25lKTtcbi8vIHRoZSB3b3JkcyAoJ1J1bm5pbmcgdG90YWwnKSBzdGF5IEVuZ2xpc2guXG5mdW5jdGlvbiB3YXRlcmZhbGxUb29sdGlwKFxuICB3YXRlcmZhbGw6IEV4dHJhY3RlZFdhdGVyZmFsbCxcbiAgaW5kZXg6IG51bWJlcixcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuICBkYXRlTGFiZWw6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RlcCA9IHdhdGVyZmFsbC5zdGVwc1tpbmRleF07XG4gIGNvbnN0IGNhdGVnb3J5ID0gZXNjYXBlSHRtbChncmFudWxhcml0eVxuICAgID8gZm9ybWF0UGVyaW9kTGFiZWwoc3RlcC5jYXRlZ29yeSwgZ3JhbnVsYXJpdHksIHRydWUsIGNvbnRleHQubG9jYWxlLCBkYXRlTGFiZWwpXG4gICAgOiBzdGVwLmNhdGVnb3J5KTtcbiAgY29uc3QgbmFtZSA9IGVzY2FwZUh0bWwod2F0ZXJmYWxsLm5hbWUpO1xuICBjb25zdCBhbW91bnQgPSAodmFsdWU6IG51bWJlciB8IG51bGwpID0+IGZvcm1hdE51bWJlcih2YWx1ZSwgc3BlYyA/PyB7fSwgY29udGV4dCk7XG5cbiAgaWYgKHN0ZXAua2luZCA9PT0gJ3RvdGFsJykge1xuICAgIHJldHVybiBgJHtjYXRlZ29yeX08YnIvPiR7bmFtZX06ICR7YW1vdW50KHN0ZXAuY2hhbmdlKX1gO1xuICB9XG5cbiAgY29uc3Qgc2lnbiA9IChzdGVwLmNoYW5nZSA/PyAwKSA+IDAgPyAnKycgOiAnJztcblxuICByZXR1cm4gYCR7Y2F0ZWdvcnl9PGJyLz4ke25hbWV9OiAke3NpZ259JHthbW91bnQoc3RlcC5jaGFuZ2UpfWBcbiAgICArIGA8YnIvPlJ1bm5pbmcgdG90YWw6ICR7YW1vdW50KHN0ZXAuc3RhcnQgKyAoc3RlcC5jaGFuZ2UgPz8gMCkpfWA7XG59XG5cbi8vIERlZmF1bHQgbGVnZW5kIHBsYWNlbWVudCB3aGVuIHRoZSBjb25maWcgZG9lc24ndCBwaW4gb25lOiBwaWUgY2hhcnRzIHJlYWRcbi8vIGJlc3Qgd2l0aCB0aGUgc2xpY2Uga2V5IGJlc2lkZSB0aGVtIChyaWdodCk7IGF4aXMgY2hhcnRzIG9ubHkgbmVlZCBhIGxlZ2VuZFxuLy8gdG8gdGVsbCBtdWx0aXBsZSBzZXJpZXMgYXBhcnQsIHNvIGEgc2luZ2xlLXNlcmllcyBjaGFydCBoaWRlcyBpdC4gQW4gZXhwbGljaXRcbi8vIGNvbmZpZy5sZWdlbmQgKGluY2x1ZGluZyAnaGlkZGVuJykgYWx3YXlzIHdpbnMuIFNoYXJlZCB3aXRoIHRoZSBQb3dlclBvaW50XG4vLyBleHBvcnQgc28gYm90aCBtZWRpYSBwbGFjZSB0aGUgbGVnZW5kIGlkZW50aWNhbGx5LlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWc6IENoYXJ0Q29uZmlnLCBzZXJpZXNDb3VudDogbnVtYmVyLCBjb2xvckJ5ID0gZmFsc2UpOiBMZWdlbmRQb3NpdGlvbiB7XG4gIGlmIChjb25maWcubGVnZW5kKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5sZWdlbmQ7XG4gIH1cblxuICBjb25zdCBwaWUgPSBjb25maWcuY2hhcnRUeXBlID09PSAncGllJyB8fCBjb25maWcuY2hhcnRUeXBlID09PSAnZG9udXQnO1xuXG4gIC8vIGNvbG9yQnkgbWFwcyBlYWNoIGJhcidzIGNvbG9yIHRvIGl0cyBjYXRlZ29yeSwgc28gaXQgbmVlZHMgYSBsZWdlbmQgZXZlblxuICAvLyB0aG91Z2ggaXQncyBhIHNpbmdsZSBtZWFzdXJlLlxuICByZXR1cm4gcGllIHx8IGNvbG9yQnkgfHwgc2VyaWVzQ291bnQgPiAxID8gKHBpZSA/ICdyaWdodCcgOiAndG9wJykgOiAnaGlkZGVuJztcbn1cblxuZnVuY3Rpb24gbGVnZW5kT3B0aW9uKHBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbik6IExlZ2VuZENvbXBvbmVudE9wdGlvbiB7XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2hpZGRlbicpIHtcbiAgICByZXR1cm4geyBzaG93OiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgYmFzZTogTGVnZW5kQ29tcG9uZW50T3B0aW9uID0geyB0eXBlOiAnc2Nyb2xsJyB9O1xuXG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYm90dG9tOiAwIH07XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBvcmllbnQ6ICd2ZXJ0aWNhbCcsIGxlZnQ6IDAsIHRvcDogJ21pZGRsZScgfTtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBvcmllbnQ6ICd2ZXJ0aWNhbCcsIHJpZ2h0OiAwLCB0b3A6ICdtaWRkbGUnIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogMCB9O1xuICB9XG59XG5cbi8vIFRoZSBwbG90J3MgZ3JpZDogcm9vbSBvbiB0aGUgbGVnZW5kJ3Mgc2lkZSBzbyBpdCBuZXZlciBvdmVybGFwcyB0aGVcbi8vIGJhcnMvbGluZXMsIHBsdXMgcm9vbSBmb3IgdGhlIGNhdGVnb3J5IGFuZCB2YWx1ZSBheGVzJyB0aXRsZXMgb24gdGhlaXJcbi8vIHNpZGVzLCB3aGljaCBjb250YWluTGFiZWwgZG9lcyBub3QgcmVzZXJ2ZSAoaXQgY292ZXJzIHRoZSB0aWNrIGxhYmVscyBvbmx5KS5cbmZ1bmN0aW9uIGF4aXNHcmlkKFxuICBwb3NpdGlvbjogTGVnZW5kUG9zaXRpb24sXG4gIGNhdGVnb3J5VGl0bGU6IEF4aXNUaXRsZVNpZGUgfCBudWxsLFxuICB2YWx1ZVRpdGxlOiBBeGlzVGl0bGVTaWRlIHwgbnVsbCxcbik6IEVDaGFydHNPcHRpb25bJ2dyaWQnXSB7XG4gIHJldHVybiBbY2F0ZWdvcnlUaXRsZSwgdmFsdWVUaXRsZV0ucmVkdWNlPEF4aXNHcmlkUm9vbT4oXG4gICAgKGdyaWQsIHNpZGUpID0+IChzaWRlID8geyAuLi5ncmlkLCBbc2lkZV06IGdyaWRbc2lkZV0gKyBBWElTX05BTUVfUk9PTSB9IDogZ3JpZCksXG4gICAgbGVnZW5kR3JpZChwb3NpdGlvbiksXG4gICk7XG59XG5cbi8vIFBsb3QtZWRnZSByb29tIG9uIHdoaWNoZXZlciBzaWRlIHRoZSBsZWdlbmQgb2NjdXBpZXM7IGNvbnRhaW5MYWJlbCBrZWVwcyB0aGVcbi8vIHRpY2sgbGFiZWxzIGluc2lkZSB3aGF0IGlzIGxlZnQuXG5mdW5jdGlvbiBsZWdlbmRHcmlkKHBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbik6IEF4aXNHcmlkUm9vbSB7XG4gIGNvbnN0IGJhc2U6IEF4aXNHcmlkUm9vbSA9IHsgbGVmdDogOCwgcmlnaHQ6IDE2LCB0b3A6IDgsIGJvdHRvbTogOCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IDMyIH07XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBsZWZ0OiA5NiB9O1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIHJpZ2h0OiA5NiB9O1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgdG9wOiAzMiB9O1xuICB9XG59XG5cbi8vIFRoZSBzdGFjayBhIHN0YWNrZWQgc2VyaWVzIGpvaW5zLiBPbiBhIHR3by1heGlzIGNoYXJ0IChheGlzSW5kZXggc2V0KSBlYWNoXG4vLyB0eXBlIHN0YWNrcyBwZXIgYXhpczsgb3RoZXJ3aXNlIGEgY29tYm8gc3RhY2tzIHBlciB0eXBlIGFuZCBhIHNpbmdsZS10eXBlXG4vLyBjaGFydCBzdGFja3MgZXZlcnl0aGluZyB0b2dldGhlci5cbmZ1bmN0aW9uIHN0YWNrS2V5KHR5cGU6IEF4aXNDaGFydFR5cGUsIGNvbWJvOiBib29sZWFuLCBheGlzSW5kZXg6IFZhbHVlQXhpc0luZGV4IHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGF4aXNJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGB0b3RhbC0ke3R5cGV9LSR7YXhpc0luZGV4fWA7XG4gIH1cblxuICByZXR1cm4gY29tYm8gPyBgdG90YWwtJHt0eXBlfWAgOiAndG90YWwnO1xufVxuXG4vLyBIb3cgYnVpbGRTZXJpZXMgZHJhd3Mgb25lIHNlcmllczogaXRzIGRyYXduIHR5cGUsIHRoZSBzdGFjayBpdCBqb2lucywgd2hldGhlclxuLy8gaXQgbGF5cyB0aGUgY29sb3JCeSBvdmVybGFwLCB3aGV0aGVyIHRoZSBjaGFydCBpcyBhIGNvbWJvLCBpdHMgdG9vbHRpcCwgaXRzXG4vLyB2YWx1ZSBheGlzIG9uIGEgdHdvLWF4aXMgY2hhcnQsIGl0cyBvd24gQ1NTIGNvbG9yICh1bmRlZmluZWQgbGVhdmVzIGl0IHRvXG4vLyB0aGUgdGhlbWUncyBwYWxldHRlIGJ5IHBvc2l0aW9uKSwgYW5kIGl0cyBkYXRhIGxhYmVscyAobnVsbCBwcmludHMgbm9uZSkuXG5pbnRlcmZhY2UgU2VyaWVzTGF5b3V0IHtcbiAgdHlwZTogQXhpc0NoYXJ0VHlwZTtcbiAgc3RhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgb3ZlcmxhcDogYm9vbGVhbjtcbiAgY29tYm86IGJvb2xlYW47XG4gIHRvb2x0aXA6IFNlcmllc1Rvb2x0aXA7XG4gIGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXggfCB1bmRlZmluZWQ7XG4gIGNvbG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxhYmVsczogU2VyaWVzRGF0YUxhYmVscyB8IG51bGw7XG59XG5cbi8vIE9uZSBzZXJpZXMgb2YgYW4gYXhpcyBjaGFydC4gQSBtZWFzdXJlJ3MgZGlzcGxheSBrZXlzIG9ubHkgYWRkIHdoYXQgdGhleVxuLy8gY2hhbmdlLCBzbyBhIHNlcmllcyB0aGF0IHNldHMgbm9uZSBpcyBkcmF3biBieSB0aGUgdGhlbWUgYXMgYmVmb3JlOiBpdHMgb3duXG4vLyBjb2xvciAodGhlIGJhciwgdGhlIGxpbmUsIHRoZSBhcmVhIHVuZGVyIGl0IGFuZCBpdHMgbGVnZW5kIGtleSBhbGwgZm9sbG93XG4vLyBpdGVtU3R5bGUpLCBpdHMgbGluZSBzdHlsZSBhbmQgaXRzIG1hcmtlcnMsIHNob3duIG9uIGV2ZXJ5IHBvaW50IHVubGVzc1xuLy8gbWFya2VycyBpcyBmYWxzZS4gRGF0YSBsYWJlbHMgY29tZSBsYXN0LCBvbiB0aGUgc2VyaWVzIG9yIG9uIGl0cyBsYXRlc3Rcbi8vIHBvaW50LlxuZnVuY3Rpb24gYnVpbGRTZXJpZXMoXG4gIHNlcmllczogRXh0cmFjdGVkQ2hhcnRTZXJpZXNJdGVtLFxuICB2YWx1ZXM6IChudW1iZXIgfCBudWxsIHwgU2hhcmVEYXRhSXRlbSlbXSxcbiAgbGF5b3V0OiBTZXJpZXNMYXlvdXQsXG4pOiBTZXJpZXNPcHRpb24ge1xuICAvLyBPbiBhIHR3by1heGlzIGNoYXJ0IGV2ZXJ5IHNlcmllcyBuYW1lcyBpdHMgdmFsdWUgYXhpcy5cbiAgY29uc3QgYXhpcyA9IGxheW91dC5heGlzSW5kZXggPT09IHVuZGVmaW5lZCA/IHt9IDogeyB5QXhpc0luZGV4OiBsYXlvdXQuYXhpc0luZGV4IH07XG4gIGNvbnN0IGNvbG9yID0gbGF5b3V0LmNvbG9yO1xuICBjb25zdCBpdGVtU3R5bGUgPSBjb2xvciA/IHsgaXRlbVN0eWxlOiB7IGNvbG9yIH0gfSA6IHt9O1xuXG4gIGlmIChsYXlvdXQudHlwZSA9PT0gJ2JhcicpIHtcbiAgICAvLyAnb3V0c2lkZScgZm9sbG93cyBlYWNoIGJhcidzIHNpZ246IHBhc3QgYSBwb3NpdGl2ZSBiYXIncyBlbmQgYW5kIGJlbG93XG4gICAgLy8gKG9yIGxlZnQgb2YpIGEgbmVnYXRpdmUgb25lJ3MsIHdoZXJlICd0b3AnIHdvdWxkIHNpdCBhdCB0aGUgemVybyBsaW5lLlxuICAgIGNvbnN0IHsgc2VyaWVzOiBsYWJlbHMsIGRhdGEgfSA9IHBsYWNlRGF0YUxhYmVscyhsYXlvdXQubGFiZWxzLCBsYXlvdXQuc3RhY2sgPyAnaW5zaWRlJyA6ICdvdXRzaWRlJywgdmFsdWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBzZXJpZXMubmFtZSxcbiAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgZGF0YSxcbiAgICAgIHN0YWNrOiBsYXlvdXQuc3RhY2ssXG4gICAgICB0b29sdGlwOiBsYXlvdXQudG9vbHRpcCxcbiAgICAgIC4uLmF4aXMsXG4gICAgICAuLi5pdGVtU3R5bGUsXG4gICAgICBiYXJNYXhXaWR0aDogNDgsXG4gICAgICAvLyBjb2xvckJ5OiBvdmVybGFwIHRoZSBwZXItY2F0ZWdvcnkgc2VyaWVzIHNvIGVhY2ggYmFyIHJlbmRlcnMgZnVsbC13aWR0aC5cbiAgICAgIC4uLihsYXlvdXQub3ZlcmxhcCA/IHsgYmFyR2FwOiAnLTEwMCUnLCBiYXJDYXRlZ29yeUdhcDogJzIwJScgfSA6IHt9KSxcbiAgICAgIC4uLmxhYmVscyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGluZVR5cGUgPSBtZWFzdXJlTGluZVN0eWxlKHNlcmllcy5tZWFzdXJlKTtcbiAgY29uc3QgbGluZVN0eWxlID0gY29sb3IgfHwgbGluZVR5cGVcbiAgICA/IHsgbGluZVN0eWxlOiB7IC4uLihjb2xvciA/IHsgY29sb3IgfSA6IHt9KSwgLi4uKGxpbmVUeXBlID8geyB0eXBlOiBsaW5lVHlwZSB9IDoge30pIH0gfVxuICAgIDoge307XG4gIGNvbnN0IHsgc2VyaWVzOiBsYWJlbHMsIGRhdGEgfSA9IHBsYWNlRGF0YUxhYmVscyhsYXlvdXQubGFiZWxzLCAndG9wJywgdmFsdWVzKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IHNlcmllcy5uYW1lLFxuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBkYXRhLFxuICAgIHN0YWNrOiBsYXlvdXQuc3RhY2ssXG4gICAgdG9vbHRpcDogbGF5b3V0LnRvb2x0aXAsXG4gICAgLi4uYXhpcyxcbiAgICAuLi5pdGVtU3R5bGUsXG4gICAgLi4ubGluZVN0eWxlLFxuICAgIC4uLihzZXJpZXMubWVhc3VyZS5tYXJrZXJzID09PSBmYWxzZSA/IHsgc2hvd1N5bWJvbDogZmFsc2UgfSA6IHt9KSxcbiAgICBzbW9vdGg6IHRydWUsXG4gICAgc3ltYm9sU2l6ZTogNixcbiAgICBhcmVhU3R5bGU6IGxheW91dC50eXBlID09PSAnYXJlYScgPyB7IG9wYWNpdHk6IDAuMjUgfSA6IHVuZGVmaW5lZCxcbiAgICAvLyBJbiBhIGNvbWJvIHRoZSBsaW5lIGlzIGRyYXduIG92ZXIgdGhlIGJhcnMgd2hhdGV2ZXIgb3JkZXIgdGhlIG1lYXN1cmVzXG4gICAgLy8gY29tZSBpbjsgYXQgdGhlIHNhbWUgeiBhIGxhdGVyIGJhciBzZXJpZXMgd291bGQgcGFpbnQgYWNyb3NzIGl0LlxuICAgIC4uLihsYXlvdXQuY29tYm8gPyB7IHo6IDMgfSA6IHt9KSxcbiAgICAuLi5sYWJlbHMsXG4gIH07XG59XG5cbi8vIEEgMTAwJSBzdGFja2VkIHNlcmllcycgcG9pbnRzOiBlYWNoIHNoYXJlLCBwbG90dGVkIGFuZCBzdGFja2VkLCB3aXRoIHRoZVxuLy8gdmFsdWUgaXQgY2FtZSBmcm9tLlxuZnVuY3Rpb24gc2hhcmVEYXRhKHZhbHVlczogKG51bWJlciB8IG51bGwpW10sIHNoYXJlczogKG51bWJlciB8IG51bGwpW10pOiBTaGFyZURhdGFJdGVtW10ge1xuICByZXR1cm4gdmFsdWVzLm1hcCgocmF3LCBpbmRleCkgPT4gKHsgdmFsdWU6IHNoYXJlc1tpbmRleF0gPz8gbnVsbCwgcmF3IH0pKTtcbn1cblxuLy8gV2hhdCBhIHNlcmllcyBwcmludHMgYmVzaWRlIGl0cyBwb2ludHMgKEEyIGRhdGEgbGFiZWxzKTogZXZlcnkgcG9pbnRcbi8vICgnYWxsJyksIGV2ZXJ5IHBvaW50IHdob3NlIGxhYmVsIGZpdHMgd2l0aG91dCBvdmVybGFwcGluZyBhbm90aGVyICgnYXV0bycsXG4vLyBMYWJlbExheW91dCdzIGhpZGVPdmVybGFwKSwgb3Igb25seSBpdHMgbGF0ZXN0IHBvaW50ICgnbGFzdCcpLiBub25lLCBhblxuLy8gYWJzZW50IG1vZGUgb3Igb25lIHRoZSB2aWV3ZXIgZG9lcyBub3Qga25vdyBwcmludHMgbm90aGluZywgYW5kIHRoZSBzZXJpZXNcbi8vIGlzIGxlZnQgYXMgaXQgd2FzLiBBIGNvbG9yQnkgY2hhcnQncyBzZXJpZXMgZWFjaCBob2xkIG9uZSBiYXIsIHNvICdsYXN0J1xuLy8gbGFiZWxzIGV2ZXJ5IGJhciB0aGVyZSwgYXMgJ2FsbCcgZG9lcy5cbi8vXG4vLyBXaGVyZSB0aGUgbGFiZWwgc2l0cyBkZXBlbmRzIG9uIHdoYXQgdGhlIHNlcmllcyBkcmF3cywgc28gYnVpbGRTZXJpZXNcbi8vIHBsYWNlcyBpdCAocGxhY2VEYXRhTGFiZWxzKS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGFiZWxPcHRpb24oXG4gIG1vZGU6IFJlcG9ydENoYXJ0RGF0YUxhYmVscyB8IHVuZGVmaW5lZCxcbiAgZm9ybWF0dGVyOiBEYXRhTGFiZWxGb3JtYXR0ZXIsXG4pOiBTZXJpZXNEYXRhTGFiZWxzIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSB7IHNob3c6IHRydWUgYXMgY29uc3QsIGZvbnRTaXplOiBSRVBPUlRfREFUQV9MQUJFTF9GT05UX1NJWkUsIGZvcm1hdHRlciB9O1xuXG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgUmVwb3J0Q2hhcnREYXRhTGFiZWxzLkFsbDpcbiAgICAgIHJldHVybiB7IHRleHQsIGhpZGVPdmVybGFwOiBmYWxzZSwgbGFzdE9ubHk6IGZhbHNlIH07XG4gICAgY2FzZSBSZXBvcnRDaGFydERhdGFMYWJlbHMuQXV0bzpcbiAgICAgIHJldHVybiB7IHRleHQsIGhpZGVPdmVybGFwOiB0cnVlLCBsYXN0T25seTogZmFsc2UgfTtcbiAgICBjYXNlIFJlcG9ydENoYXJ0RGF0YUxhYmVscy5MYXN0OlxuICAgICAgcmV0dXJuIHsgdGV4dCwgaGlkZU92ZXJsYXA6IGZhbHNlLCBsYXN0T25seTogdHJ1ZSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBBIHNlcmllcycgZGF0YSBsYWJlbHMgYXQgYHBvc2l0aW9uYDogb24gdGhlIHNlcmllcyAoJ2FsbCcsIGFuZCB3aXRoIHRoZVxuLy8gb3ZlcmxhcCBoaWRpbmcgJ2F1dG8nKSwgb3Igb24gaXRzIGxhdGVzdCBub24tZW1wdHkgcG9pbnQgYWxvbmUgKCdsYXN0JykuXG4vLyBObyBsYWJlbHMgbGVhdmUgdGhlIHNlcmllcyBhbmQgaXRzIHBvaW50cyBhcyB0aGV5IHdlcmUuXG5mdW5jdGlvbiBwbGFjZURhdGFMYWJlbHM8UCBleHRlbmRzIERhdGFMYWJlbFBvc2l0aW9uPihcbiAgbGFiZWxzOiBTZXJpZXNEYXRhTGFiZWxzIHwgbnVsbCxcbiAgcG9zaXRpb246IFAsXG4gIHZhbHVlczogKG51bWJlciB8IG51bGwgfCBTaGFyZURhdGFJdGVtKVtdLFxuKTogUGxhY2VkRGF0YUxhYmVsczxQPiB7XG4gIGlmICghbGFiZWxzKSB7XG4gICAgcmV0dXJuIHsgc2VyaWVzOiB7fSwgZGF0YTogdmFsdWVzIH07XG4gIH1cblxuICBjb25zdCBsYWJlbDogRGF0YUxhYmVsPFA+ID0geyAuLi5sYWJlbHMudGV4dCwgcG9zaXRpb24gfTtcblxuICBpZiAobGFiZWxzLmxhc3RPbmx5KSB7XG4gICAgcmV0dXJuIHsgc2VyaWVzOiB7fSwgZGF0YTogbGFiZWxMYXN0UG9pbnQodmFsdWVzLCBsYWJlbCkgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VyaWVzOiB7IGxhYmVsLCAuLi4obGFiZWxzLmhpZGVPdmVybGFwID8geyBsYWJlbExheW91dDogeyBoaWRlT3ZlcmxhcDogdHJ1ZSB9IH0gOiB7fSkgfSxcbiAgICBkYXRhOiB2YWx1ZXMsXG4gIH07XG59XG5cbi8vIEEgc2VyaWVzJyBwb2ludHMgd2l0aCBpdHMgbGF0ZXN0IG5vbi1lbXB0eSBwb2ludCBjYXJyeWluZyB0aGUgbGFiZWwuIEFcbi8vIHNlcmllcyB3aXRoIG5vIHZhbHVlIGFueXdoZXJlIGlzIGxlZnQgYXMgaXQgd2FzLlxuZnVuY3Rpb24gbGFiZWxMYXN0UG9pbnQ8UCBleHRlbmRzIERhdGFMYWJlbFBvc2l0aW9uPihcbiAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbCB8IFNoYXJlRGF0YUl0ZW0pW10sXG4gIGxhYmVsOiBEYXRhTGFiZWw8UD4sXG4pOiBTZXJpZXNEYXRhSXRlbTxQPltdIHtcbiAgY29uc3QgbGFzdCA9IHZhbHVlcy5yZWR1Y2U8bnVtYmVyPigoZm91bmQsIGl0ZW0sIGluZGV4KSA9PiAocG9pbnRWYWx1ZShpdGVtKSA9PT0gbnVsbCA/IGZvdW5kIDogaW5kZXgpLCAtMSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5tYXAoKGl0ZW0sIGluZGV4KTogU2VyaWVzRGF0YUl0ZW08UD4gPT4ge1xuICAgIGlmIChpbmRleCAhPT0gbGFzdCkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzU2hhcmVEYXRhSXRlbShpdGVtKSA/IHsgLi4uaXRlbSwgbGFiZWwgfSA6IHsgdmFsdWU6IGl0ZW0sIGxhYmVsIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1NoYXJlRGF0YUl0ZW0oaXRlbTogbnVtYmVyIHwgbnVsbCB8IFNoYXJlRGF0YUl0ZW0pOiBpdGVtIGlzIFNoYXJlRGF0YUl0ZW0ge1xuICByZXR1cm4gaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCc7XG59XG5cbi8vIEhvdyBhIHNlcmllcycgZGF0YSBsYWJlbHMgd3JpdGUgYSB2YWx1ZS4gQSAxMDAlIHN0YWNrZWQgc2VyaWVzIHByaW50cyBpdHNcbi8vIHNoYXJlIGFzIGEgd2hvbGUgcGVyY2VudGFnZSwgYXMgdGhlIHNoYXJlIGF4aXMncyB0aWNrcyBkby4gQSBzZXJpZXMgb24gYW5cbi8vIGF4aXMgd2l0aCBhIG51bWJlciBmb3JtYXQgcHJpbnRzIGl0cyB2YWx1ZSBpbiBpdHMgbWVhc3VyZSdzIGZvcm1hdCwgYXQgdGhlXG4vLyB1bml0cyBhbmQgZGVjaW1hbHMgdGhlIGF4aXMgZGVjaWRlZCwgc28gYSBsYWJlbCByZWFkcyBsaWtlIHRoZSB0aWNrcyBiZXNpZGVcbi8vIGl0LiBBbnkgb3RoZXIgcHJpbnRzIHRoZSBwbGFpbiBsb2NhbGUtZ3JvdXBlZCBudW1iZXIgaXRzIHRvb2x0aXAgc2hvd3MuIEFcbi8vIHNoYXJlIHBvaW50J3MgcmF3IHZhbHVlIGlzIHdoYXQgYSBsYWJlbCByZWFkcyB3aGVuIGl0IGNhcnJpZXMgb25lLlxuZnVuY3Rpb24gZGF0YUxhYmVsRm9ybWF0dGVyKFxuICBtZWFzdXJlOiBDaGFydE1lYXN1cmUsXG4gIGF4aXNGb3JtYXQ6IFZhbHVlQXhpc0Zvcm1hdCB8IG51bGwsXG4gIHNoYXJlOiBib29sZWFuLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogRGF0YUxhYmVsRm9ybWF0dGVyIHtcbiAgaWYgKHNoYXJlKSB7XG4gICAgY29uc3QgcGVyY2VudCA9IHdob2xlUGVyY2VudEZvcm1hdHRlcihjb250ZXh0KTtcblxuICAgIHJldHVybiAocGFyYW1zKSA9PiBwZXJjZW50KHBhcmFtcy52YWx1ZSk7XG4gIH1cblxuICBpZiAoYXhpc0Zvcm1hdCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHVuaXRzOiBheGlzRm9ybWF0LmNoYXJ0LnVuaXRzLCBkZWNpbWFsczogYXhpc0Zvcm1hdC5jaGFydC5kZWNpbWFscyB9O1xuXG4gICAgcmV0dXJuIChwYXJhbXMpID0+IGZvcm1hdE51bWJlcihkYXRhTGFiZWxWYWx1ZShwYXJhbXMpLCBtZWFzdXJlLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiAocGFyYW1zKSA9PiBmb3JtYXRQbGFpbk51bWJlcihkYXRhTGFiZWxWYWx1ZShwYXJhbXMpLCBjb250ZXh0LmxvY2FsZSk7XG59XG5cbi8vIFRoZSB2YWx1ZSBhIGRhdGEgbGFiZWwgd3JpdGVzOiB0aGUgcmF3IHZhbHVlIGl0cyBwb2ludCBjYXJyaWVzLCBlbHNlIHRoZVxuLy8gcGxvdHRlZCBvbmUuXG5mdW5jdGlvbiBkYXRhTGFiZWxWYWx1ZShwYXJhbXM6IERhdGFMYWJlbFBhcmFtcyk6IHVua25vd24ge1xuICBjb25zdCBkYXRhID0gcGFyYW1zLmRhdGE7XG4gIGNvbnN0IHJhdyA9IGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyByYXc/OiB1bmtub3duIH0pLnJhdyA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gcmF3ID8/IHBhcmFtcy52YWx1ZTtcbn1cblxuLy8gQSAxMDAlIHN0YWNrZWQgY2hhcnQncyB0b29sdGlwOiB0aGUgY2F0ZWdvcnksIHRoZW4gZWFjaCBzZXJpZXMgb24gaXRzIG93blxuLy8gbGluZSwgYSBzaGFyZSBhcyBpdHMgcGVyY2VudGFnZSB0byBvbmUgZGVjaW1hbCBmb2xsb3dlZCBieSB0aGUgdmFsdWUgaXQgY2FtZVxuLy8gZnJvbSBpbiBpdHMgbWVhc3VyZSdzIGZvcm1hdCAoJzI1LjAlICgxKScpLCBhbmQgYW55IG90aGVyIHNlcmllcyBieSBpdHMgb3duXG4vLyB2YWx1ZS4gVGhlIGNhdGVnb3J5IGFuZCB0aGUgc2VyaWVzIG5hbWVzIGNvbWUgZnJvbSB0aGUgZGF0YSBhbmQgdGhlIGNvbmZpZyxcbi8vIGFuZCBFQ2hhcnRzIHNldHMgdGhlIHRvb2x0aXAgYXMgSFRNTCwgc28gYm90aCBhcmUgZXNjYXBlZC5cbmZ1bmN0aW9uIHBlcmNlbnRUb29sdGlwKFxuICBwYXJhbXM6IFRvb2x0aXBDb21wb25lbnRGb3JtYXR0ZXJDYWxsYmFja1BhcmFtcyxcbiAgZXh0cmFjdGVkOiBFeHRyYWN0ZWRDaGFydFNlcmllcyxcbiAgc2hhcmVzOiBQZXJjZW50U2hhcmVzLFxuICBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4gIGRhdGVMYWJlbDogUmVwb3J0Q2hhcnREYXRlTGFiZWwsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtcyA6IFtwYXJhbXNdO1xuICBjb25zdCBkYXRhSW5kZXggPSBpdGVtc1swXT8uZGF0YUluZGV4ID8/IDA7XG4gIGNvbnN0IGNhdGVnb3J5ID0gZXh0cmFjdGVkLmNhdGVnb3JpZXNbZGF0YUluZGV4XSA/PyAnJztcbiAgY29uc3QgaGVhZGluZyA9IGVzY2FwZUh0bWwoZ3JhbnVsYXJpdHlcbiAgICA/IGZvcm1hdFBlcmlvZExhYmVsKGNhdGVnb3J5LCBncmFudWxhcml0eSwgdHJ1ZSwgY29udGV4dC5sb2NhbGUsIGRhdGVMYWJlbClcbiAgICA6IGNhdGVnb3J5KTtcbiAgY29uc3QgcmF0aW9Db250ZXh0ID0geyAuLi5jb250ZXh0LCByYXRpb1BlcmNlbnQ6IHRydWUgfTtcblxuICBjb25zdCBsaW5lcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgIGNvbnN0IHNlcmllcyA9IGV4dHJhY3RlZC5zZXJpZXNbaXRlbS5zZXJpZXNJbmRleCA/PyAtMV07XG4gICAgY29uc3QgbWFya2VyID0gdHlwZW9mIGl0ZW0ubWFya2VyID09PSAnc3RyaW5nJyA/IGl0ZW0ubWFya2VyIDogJyc7XG4gICAgY29uc3QgbGFiZWwgPSBgJHttYXJrZXJ9ICR7ZXNjYXBlSHRtbChpdGVtLnNlcmllc05hbWUgPz8gc2VyaWVzPy5uYW1lID8/ICcnKX1gO1xuICAgIGNvbnN0IHZhbHVlID0gc2VyaWVzVG9vbHRpcChzZXJpZXM/Lm1lYXN1cmUsIGNvbnRleHQpLnZhbHVlRm9ybWF0dGVyKHNlcmllcz8udmFsdWVzW2l0ZW0uZGF0YUluZGV4XSA/PyBudWxsKTtcbiAgICBjb25zdCBzaGFyZSA9IHNoYXJlcy5nZXQoaXRlbS5zZXJpZXNJbmRleCA/PyAtMSk/LltpdGVtLmRhdGFJbmRleF0gPz8gbnVsbDtcblxuICAgIHJldHVybiBzaGFyZSA9PT0gbnVsbFxuICAgICAgPyBgJHtsYWJlbH06ICR7dmFsdWV9YFxuICAgICAgOiBgJHtsYWJlbH06ICR7Zm9ybWF0TnVtYmVyKHNoYXJlLCBQRVJDRU5UX1NIQVJFX0ZPUk1BVCwgcmF0aW9Db250ZXh0KX0gKCR7dmFsdWV9KWA7XG4gIH0pO1xuXG4gIHJldHVybiBbaGVhZGluZywgLi4ubGluZXNdLmpvaW4oJzxici8+Jyk7XG59XG5cbi8vIEEgdmFsdWUgYXhpczogaXRzIHRpdGxlIGFuZCByYW5nZSBmcm9tIHRoZSBjb25maWcsIGl0cyB0aWNrIGxhYmVscyBmcm9tXG4vLyB2YWx1ZUF4aXNMYWJlbC4gQSB2ZXJ0aWNhbCBjaGFydCdzIHRpdGxlIHNpdHMgYWJvdmUgdGhlIGF4aXMgbGluZSwgcmVhZGluZ1xuLy8gYXdheSBmcm9tIHRoZSBwbG90J3MgZWRnZTsgYSBob3Jpem9udGFsIGNoYXJ0J3MgaXMgY2VudGVyZWQgYmVsb3cgdGhlIHRpY2tzLlxuLy8gQSBib3VuZCBvciBpbnRlcnZhbCB0aGF0IGlzIG5vdCBhIHVzYWJsZSBudW1iZXIgaXMgbGVmdCB0byBFQ2hhcnRzLiBBIDEwMCVcbi8vIHN0YWNrZWQgY2hhcnQncyBzaGFyZSBheGlzIChleHRyYXMucGVyY2VudE1pbikgaGFzIGl0cyBvd24gZml4ZWQgcmFuZ2UuXG5mdW5jdGlvbiB2YWx1ZUF4aXNPcHRpb24oXG4gIGF4aXM6IENoYXJ0VmFsdWVBeGlzIHwgdW5kZWZpbmVkLFxuICBob3Jpem9udGFsOiBib29sZWFuLFxuICBheGlzTGFiZWw6IFZhbHVlQXhpc0xhYmVsLFxuICBleHRyYXM6IFZhbHVlQXhpc0V4dHJhcyA9IHt9LFxuKSB7XG4gIGNvbnN0IHJhbmdlID0gZXh0cmFzLnBlcmNlbnRNaW4gPT09IHVuZGVmaW5lZFxuICAgID8gdmFsdWVBeGlzUmFuZ2UoYXhpcylcbiAgICA6IHsgbWluOiBleHRyYXMucGVyY2VudE1pbiwgbWF4OiBQRVJDRU5UX0FYSVNfTUFYLCBpbnRlcnZhbDogUEVSQ0VOVF9BWElTX0lOVEVSVkFMIH07XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndmFsdWUnIGFzIGNvbnN0LFxuICAgIG5hbWU6IGF4aXM/LmxhYmVsIHx8IHVuZGVmaW5lZCxcbiAgICBuYW1lTG9jYXRpb246IGhvcml6b250YWwgPyAnbWlkZGxlJyBhcyBjb25zdCA6ICdlbmQnIGFzIGNvbnN0LFxuICAgIG5hbWVHYXA6IGhvcml6b250YWwgPyAyOCA6IDEwLFxuICAgIG5hbWVUZXh0U3R5bGU6IGhvcml6b250YWwgPyB1bmRlZmluZWQgOiB7IGFsaWduOiBleHRyYXMuaW5kZXggPT09IDEgPyAncmlnaHQnIGFzIGNvbnN0IDogJ2xlZnQnIGFzIGNvbnN0IH0sXG4gICAgLy8gQSBwaW5uZWQgYm91bmQgd2luczsgb25lIGxlZnQgb3BlbiByZWFjaGVzIHRoZSByZWZlcmVuY2VzIChyZWFjaE1pbiksXG4gICAgLy8gb3Igb24gYSByYW5rIGF4aXMgc3RhcnRzIGF0IHJhbmsgMS5cbiAgICBtaW46IHJhbmdlLm1pbiA/PyAoZXh0cmFzLnJhbmsgPyBSQU5LX0FYSVNfTUlOIDogcmVhY2hNaW4oZXh0cmFzLnJlYWNoKSksXG4gICAgbWF4OiByYW5nZS5tYXggPz8gcmVhY2hNYXgoZXh0cmFzLnJlYWNoKSxcbiAgICBpbnRlcnZhbDogcmFuZ2UuaW50ZXJ2YWwsXG4gICAgYXhpc0xhYmVsLFxuICAgIC4uLihleHRyYXMucmFuayA/IHsgaW52ZXJzZTogdHJ1ZSwgbWluSW50ZXJ2YWw6IDEgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gVGhlIHBhcnQgb2YgYSB2YWx1ZSBheGlzJ3MgcmFuZ2UgdGhlIGNvbmZpZyBwaW5zLiBBIGJvdW5kIHRoYXQgaXMgbm90IGFcbi8vIGZpbml0ZSBudW1iZXIsIG9yIGFuIGludGVydmFsIHRoYXQgaXMgbm90IGEgcG9zaXRpdmUgb25lLCBpcyBsZWZ0IG91dCwgYW5kXG4vLyB0aGUgY2hhcnQgcGlja3MgaXQgZnJvbSB0aGUgZGF0YS4gU2hhcmVkIHdpdGggdGhlIFBvd2VyUG9pbnQgZXhwb3J0IHNvIGJvdGhcbi8vIG1lZGlhIGRyYXcgdGhlIHNhbWUgcmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVBeGlzUmFuZ2UoYXhpczogQ2hhcnRWYWx1ZUF4aXMgfCB1bmRlZmluZWQpOiB7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyOyBpbnRlcnZhbD86IG51bWJlciB9IHtcbiAgY29uc3QgaW50ZXJ2YWwgPSBheGlzTnVtYmVyKGF4aXM/LmludGVydmFsKTtcblxuICByZXR1cm4ge1xuICAgIG1pbjogYXhpc051bWJlcihheGlzPy5taW4pLFxuICAgIG1heDogYXhpc051bWJlcihheGlzPy5tYXgpLFxuICAgIGludGVydmFsOiBpbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmIGludGVydmFsID4gMCA/IGludGVydmFsIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHR3by1heGlzIGNoYXJ0J3MgdmFsdWUgYXhlczogdGhlIHByaW1hcnkgb24gdGhlIGxlZnQsIHRoZSBzZWNvbmQgb24gdGhlXG4vLyByaWdodCB3aXRob3V0IGdyaWRsaW5lcyBvZiBpdHMgb3duLiBFYWNoIGF4aXMncyB0aWNrcyB0YWtlIHRoZSBmb3JtYXQgb2YgdGhlXG4vLyBtZWFzdXJlcyBwbG90dGVkIGFnYWluc3QgaXQgKGF4aXNMYWJlbHMpLiBXaXRob3V0IGEgcmFuZ2Ugb24gZWl0aGVyIGF4aXMgdGhlXG4vLyBzZWNvbmQgYXhpcyBhbGlnbnMgaXRzIHRpY2tzIHRvIHRoZSBwcmltYXJ5J3MgZ3JpZGxpbmVzLlxuLy9cbi8vIE9uIGEgMTAwJSBzdGFja2VkIGNoYXJ0IChwZXJjZW50TWluIHNldCkgdGhlIHByaW1hcnkgYXhpcyBpcyB0aGUgc2hhcmUgYXhpcyxcbi8vIHdob3NlIHJhbmdlIGlzIGZpeGVkLCBhbmQgdGhlIHNlY29uZCBheGlzJ3Mgc2VyaWVzIGFyZSBub3Qgc3RhY2tlZC4gQW4gYXhpc1xuLy8gb2YgcmFua3MgYWxvbmUgKHJhbmtBeGVzKSBpcyBpbnZlcnRlZCwgYW5kIHRoZSBheGVzIHRoZW4ga2VlcCB0aGVpciBvd25cbi8vIHRpY2tzLCBzbyBhIHJhbmsgYXhpcyBzdGVwcyBieSB3aG9sZSByYW5rcy5cbmZ1bmN0aW9uIHR3b1ZhbHVlQXhlc09wdGlvbihcbiAgY29uZmlnOiBDaGFydENvbmZpZyxcbiAgYXhpc0xhYmVsczogVmFsdWVBeGlzTGFiZWxbXSxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcGVyY2VudE1pbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICByZWZlcmVuY2VzOiBEcmF3blJlZmVyZW5jZVtdLFxuICByYW5rQXhlczogYm9vbGVhbltdLFxuKSB7XG4gIGNvbnN0IHBlcmNlbnQgPSBwZXJjZW50TWluICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhYmVsID0gKGF4aXNJbmRleDogVmFsdWVBeGlzSW5kZXgpID0+IGF4aXNMYWJlbHNbYXhpc0luZGV4XTtcblxuICByZXR1cm4gW1xuICAgIHZhbHVlQXhpc09wdGlvbihjb25maWcudmFsdWVBeGlzLCBmYWxzZSwgcGVyY2VudCA/IHBlcmNlbnRBeGlzTGFiZWwoY29udGV4dCkgOiBsYWJlbCgwKSwge1xuICAgICAgaW5kZXg6IDAsXG4gICAgICBwZXJjZW50TWluLFxuICAgICAgcmVhY2g6IHJlZmVyZW5jZVJlYWNoKHJlZmVyZW5jZXMsIDApLFxuICAgICAgcmFuazogcmFua0F4ZXNbMF0sXG4gICAgfSksXG4gICAge1xuICAgICAgLi4udmFsdWVBeGlzT3B0aW9uKGNvbmZpZy5zZWNvbmRhcnlBeGlzLCBmYWxzZSwgbGFiZWwoMSksIHtcbiAgICAgICAgaW5kZXg6IDEsXG4gICAgICAgIHJlYWNoOiByZWZlcmVuY2VSZWFjaChyZWZlcmVuY2VzLCAxKSxcbiAgICAgICAgcmFuazogcmFua0F4ZXNbMV0sXG4gICAgICB9KSxcbiAgICAgIHBvc2l0aW9uOiAncmlnaHQnIGFzIGNvbnN0LFxuICAgICAgc3BsaXRMaW5lOiB7IHNob3c6IGZhbHNlIH0sXG4gICAgICBhbGlnblRpY2tzOiAhcGVyY2VudCAmJiAhcmFua0F4ZXNbMF0gJiYgIXJhbmtBeGVzWzFdXG4gICAgICAgICYmICFoYXNBeGlzUmFuZ2UoY29uZmlnLnZhbHVlQXhpcykgJiYgIWhhc0F4aXNSYW5nZShjb25maWcuc2Vjb25kYXJ5QXhpcyksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gV2hldGhlciB0aGUgY29uZmlnIHBpbnMgYW55IG9mIGFuIGF4aXMncyByYW5nZTogYSBib3VuZCBvciBhIHRpY2sgaW50ZXJ2YWwuXG5mdW5jdGlvbiBoYXNBeGlzUmFuZ2UoYXhpczogQ2hhcnRWYWx1ZUF4aXMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWVBeGlzUmFuZ2UoYXhpcykpLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuLy8gQSBjb25maWd1cmVkIGJvdW5kIG9yIGludGVydmFsIHdoZW4gaXQgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIHVuZGVmaW5lZC5cbmZ1bmN0aW9uIGF4aXNOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8vIEEgdmFsdWUgYXhpcydzIHRpY2sgbGFiZWxzLlxuaW50ZXJmYWNlIFZhbHVlQXhpc0xhYmVsIHtcbiAgZm9ybWF0dGVyOiAodmFsdWU6IG51bWJlcikgPT4gc3RyaW5nO1xufVxuXG4vLyBUaWNrIGxhYmVscyB3cml0dGVuIGluIHRoZSBsb2NhbGUuIEVDaGFydHMnIG93biB0aWNrcyBhcmUgZ3JvdXBlZCBlbi1VU1xuLy8gd2hhdGV2ZXIgdGhlIHBhZ2UncyBsYW5ndWFnZS5cbi8vXG4vLyBXaXRoIGEgbnVtYmVyIGZvcm1hdCwgdGhlIHVuaXRzIGFuZCBkZWNpbWFscyBkZWNpZGVkIG9uY2UgZm9yIHRoZSB3aG9sZVxuLy8gYXhpcyAocmVzb2x2ZVZhbHVlQXhpc0Zvcm1hdCkgd3JpdGUgZXZlcnkgdGljayBhbGlrZSAoJzEuNUsnLCAnMi4wSycsIG5ldmVyXG4vLyAnMksnKS4gV2l0aG91dCBvbmUsIG9yIHdoZW4gaXQgbGVhdmVzIHRoZSB0aWNrcyBhbiB1bnNjYWxlZCBudW1iZXIgd2l0aCBub1xuLy8gcGlubmVkIGRlY2ltYWxzIChmb3JtYXQgJ251bWJlcicsIG9yIHByZWNpc2lvbi1sZXNzIHVuaXRzIG5vbmUpLCBlYWNoIHRpY2tcbi8vIGlzIGEgcGxhaW4gbG9jYWxlLWdyb3VwZWQgbnVtYmVyIGtlZXBpbmcgaXRzIG93biBkZWNpbWFscywgc28gYSAwLjAwMDIgdGlja1xuLy8gbmV2ZXIgcm91bmRzIHRvICcwJy5cbmZ1bmN0aW9uIHZhbHVlQXhpc0xhYmVsKGZvcm1hdDogVmFsdWVBeGlzRm9ybWF0IHwgbnVsbCwgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6IFZhbHVlQXhpc0xhYmVsIHtcbiAgaWYgKCFmb3JtYXQgfHwgKGZvcm1hdC5jaGFydC51bml0cyA9PT0gUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSAmJiBmb3JtYXQuY2hhcnQuZGVjaW1hbHMgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHsgZm9ybWF0dGVyOiAodmFsdWU6IG51bWJlcikgPT4gZm9ybWF0UGxhaW5OdW1iZXIodmFsdWUsIGNvbnRleHQubG9jYWxlKSB9O1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgdW5pdHM6IGZvcm1hdC5jaGFydC51bml0cywgZGVjaW1hbHM6IGZvcm1hdC5jaGFydC5kZWNpbWFscyB9O1xuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0dGVyOiAodmFsdWU6IG51bWJlcikgPT4gZm9ybWF0TnVtYmVyKHZhbHVlLCBmb3JtYXQuc3BlYywgZm9ybWF0LmNvbnRleHQsIG9wdGlvbnMpLFxuICB9O1xufVxuXG4vLyBBbiBheGlzJ3MgZm9ybWF0IGZyb20gdGhlIHNwZWMgaXRzIG1lYXN1cmVzIGFncmVlIG9uLCB3aXRoIHRoZSB1bml0cyBhbmRcbi8vIGRlY2ltYWxzIGRlY2lkZWQgZnJvbSBpdHMgcGVhay4gV2l0aG91dCBhIHNwZWMgdGhlIGF4aXMgaXMgcGxhaW4sIGFuZCB0aGVcbi8vIHBlYWsgaXMgbmV2ZXIgY29tcHV0ZWQuXG5mdW5jdGlvbiByZXNvbHZlVmFsdWVBeGlzRm9ybWF0KFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCxcbiAgcGVhazogKCkgPT4gbnVtYmVyLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogVmFsdWVBeGlzRm9ybWF0IHwgbnVsbCB7XG4gIHJldHVybiBzcGVjID8geyBzcGVjLCBjaGFydDogcmVzb2x2ZUNoYXJ0TnVtYmVyRm9ybWF0KHNwZWMsIHBlYWsoKSwgY29udGV4dCksIGNvbnRleHQgfSA6IG51bGw7XG59XG5cbi8vIEVhY2ggdmFsdWUgYXhpcydzIGZvcm1hdCwgYnkgYXhpcyBpbmRleC4gQSBjaGFydCB3aXRoIG9uZSB2YWx1ZSBheGlzIHRha2VzXG4vLyB0aGUgZm9ybWF0IHRoZSBwbG90dGVkIHNlcmllcycgbWVhc3VyZXMgYWdyZWUgb24gKGEgc3BsaXRCeSBvciBjb2xvckJ5IGNoYXJ0XG4vLyBwbG90cyBvbmx5IGl0cyBmaXJzdCBtZWFzdXJlKSwgZnJvbSB0aGUgcGVhayBvZiBhbGwgaXRzIHNlcmllcy4gT24gYSB0d28tYXhpcyBjaGFydCBlYWNoIGF4aXMgdGFrZXMgdGhlIGZvcm1hdCBvZiB0aGUgbWVhc3VyZXNcbi8vIHBsb3R0ZWQgYWdhaW5zdCBpdCwgZnJvbSB0aGUgcGVhayBvZiBpdHMgb3duIHNlcmllcywgd2hpY2ggYXJlIG5ldmVyXG4vLyBzdGFja2VkIHdpdGggYSAxMDAlIHN0YWNrZWQgY2hhcnQncyBzaGFyZXMuIEEgcmVmZXJlbmNlIHBhc3QgdGhlIGRhdGFcbi8vIHN0cmV0Y2hlcyBpdHMgYXhpcywgc28gaXQgY291bnRzIHRvd2FyZCB0aGUgcGVhayAocmVmZXJlbmNlUGVhayk7IGEgMTAwJVxuLy8gc3RhY2tlZCBjaGFydCdzIHJlZmVyZW5jZXMgYXJlIHNoYXJlcywgd2hpY2ggdGhlIHJhdyB2YWx1ZXMnIHBlYWsgbGVhdmVzXG4vLyBvdXQuIGNvbnRleHRzIGhvbGRzIGVhY2ggYXhpcydzIGNvbnRleHQgKGFubm90YXRlZEF4aXNDb250ZXh0cykuXG5mdW5jdGlvbiB2YWx1ZUF4aXNGb3JtYXRzKFxuICBjb25maWc6IENoYXJ0Q29uZmlnLFxuICBleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLFxuICBheGlzSW5kZXhlczogVmFsdWVBeGlzSW5kZXhbXSxcbiAgY29udGV4dHM6IFJlcG9ydEZvcm1hdENvbnRleHRbXSxcbiAgcGVyY2VudDogYm9vbGVhbixcbiAgcmVmZXJlbmNlczogRHJhd25SZWZlcmVuY2VbXSxcbik6IChWYWx1ZUF4aXNGb3JtYXQgfCBudWxsKVtdIHtcbiAgY29uc3QgcmVhY2ggPSAoYXhpc0luZGV4OiBWYWx1ZUF4aXNJbmRleCkgPT4gKHBlcmNlbnQgJiYgYXhpc0luZGV4ID09PSAwID8gMCA6IHJlZmVyZW5jZVBlYWsocmVmZXJlbmNlcywgYXhpc0luZGV4KSk7XG5cbiAgaWYgKCFheGlzSW5kZXhlcy5pbmNsdWRlcygxKSkge1xuICAgIHJldHVybiBbcmVzb2x2ZVZhbHVlQXhpc0Zvcm1hdChcbiAgICAgIGF4aXNOdW1iZXJGb3JtYXQoZXh0cmFjdGVkLnNlcmllcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLm1lYXN1cmUpKSxcbiAgICAgICgpID0+IE1hdGgubWF4KGNoYXJ0VmFsdWVQZWFrKGV4dHJhY3RlZC5zZXJpZXMubWFwKChzZXJpZXMpID0+IHNlcmllcy52YWx1ZXMpLCAhIWNvbmZpZy5zdGFja2VkKSwgcmVhY2goMCkpLFxuICAgICAgY29udGV4dHNbMF0sXG4gICAgKV07XG4gIH1cblxuICByZXR1cm4gKFswLCAxXSBhcyBjb25zdCkubWFwKChheGlzSW5kZXgpID0+IHtcbiAgICBjb25zdCBvbkF4aXMgPSBleHRyYWN0ZWQuc2VyaWVzLmZpbHRlcigoXywgaW5kZXgpID0+IGF4aXNJbmRleGVzW2luZGV4XSA9PT0gYXhpc0luZGV4KTtcblxuICAgIHJldHVybiByZXNvbHZlVmFsdWVBeGlzRm9ybWF0KFxuICAgICAgYXhpc051bWJlckZvcm1hdChvbkF4aXMubWFwKChzZXJpZXMpID0+IHNlcmllcy5tZWFzdXJlKSksXG4gICAgICAoKSA9PiBNYXRoLm1heChjaGFydFZhbHVlUGVhayhvbkF4aXMubWFwKChzZXJpZXMpID0+IHNlcmllcy52YWx1ZXMpLCAhIWNvbmZpZy5zdGFja2VkICYmICFwZXJjZW50KSwgcmVhY2goYXhpc0luZGV4KSksXG4gICAgICBjb250ZXh0c1theGlzSW5kZXhdLFxuICAgICk7XG4gIH0pO1xufVxuXG4vLyBBIDEwMCUgc3RhY2tlZCBjaGFydCdzIHNoYXJlIGF4aXMgdGlja3M6IHdob2xlIHBlcmNlbnRhZ2VzIGluIHRoZSBsb2NhbGVcbi8vICgnMjUlJywgJzI1ICUnIGluIGZyLUNBKS4gVGhlIHNoYXJlcyBhcmUgcmF0aW9zIHdoYXRldmVyIHRoZSByZXBvcnQnc1xuLy8gcGVyY2VudEZvcm1hdCBzYXlzIG9mIGl0cyBzdG9yZWQgdmFsdWVzLlxuZnVuY3Rpb24gcGVyY2VudEF4aXNMYWJlbChjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0KTogVmFsdWVBeGlzTGFiZWwge1xuICByZXR1cm4geyBmb3JtYXR0ZXI6IHdob2xlUGVyY2VudEZvcm1hdHRlcihjb250ZXh0KSB9O1xufVxuXG4vLyBBIHNoYXJlIGFzIGEgd2hvbGUgcGVyY2VudGFnZSBpbiB0aGUgbG9jYWxlLCBmb3IgdGhlIHNoYXJlIGF4aXMncyB0aWNrcyBhbmRcbi8vIGl0cyBzZXJpZXMnIGRhdGEgbGFiZWxzLlxuZnVuY3Rpb24gd2hvbGVQZXJjZW50Rm9ybWF0dGVyKGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyB7XG4gIGNvbnN0IHJhdGlvQ29udGV4dCA9IHsgLi4uY29udGV4dCwgcmF0aW9QZXJjZW50OiB0cnVlIH07XG5cbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gZm9ybWF0TnVtYmVyKHZhbHVlLCBQRVJDRU5UX0FYSVNfRk9STUFULCByYXRpb0NvbnRleHQpO1xufVxuXG4vLyBXaGF0IGEgc2VyaWVzJyB0b29sdGlwIHdyaXRlcyBiZXNpZGUgaXRzIG5hbWUuXG5pbnRlcmZhY2UgU2VyaWVzVG9vbHRpcCB7XG4gIHZhbHVlRm9ybWF0dGVyOiAodmFsdWU6IHVua25vd24pID0+IHN0cmluZztcbn1cblxuLy8gQSBzZXJpZXMnIHRvb2x0aXAgdmFsdWUgaW4gaXRzIG1lYXN1cmUncyBudW1iZXIgZm9ybWF0LCBwZXIgdmFsdWUgKCfigJQnIHdoZW5cbi8vIGVtcHR5KS4gQSBtZWFzdXJlIHdpdGhvdXQgb25lIHdyaXRlcyBpdCBhcyB0aGUgcGxhaW4gdmFsdWUgYXhpcyBkb2VzLiBBXG4vLyB2YWx1ZSBjYW4gYXJyaXZlIGFzIGFuIGFycmF5IChhIFt2YWx1ZSwgLi4uXSBkYXRhIGl0ZW0pLCB3aG9zZSBmaXJzdCBlbnRyeVxuLy8gaXMgdGhlIHZhbHVlLlxuZnVuY3Rpb24gc2VyaWVzVG9vbHRpcChtZWFzdXJlOiBDaGFydE1lYXN1cmUgfCB1bmRlZmluZWQsIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQpOiBTZXJpZXNUb29sdGlwIHtcbiAgaWYgKCFoYXNOdW1iZXJGb3JtYXQobWVhc3VyZSkpIHtcbiAgICByZXR1cm4geyB2YWx1ZUZvcm1hdHRlcjogKHZhbHVlOiB1bmtub3duKSA9PiBmb3JtYXRQbGFpbk51bWJlcih2YWx1ZSwgY29udGV4dC5sb2NhbGUpIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlRm9ybWF0dGVyOiAodmFsdWU6IHVua25vd24pID0+IGZvcm1hdE51bWJlcihBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWUsIG1lYXN1cmUsIGNvbnRleHQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBpZU9wdGlvbihcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIGRvbnV0OiBib29sZWFuLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogRUNoYXJ0c09wdGlvbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3RDaGFydFNlcmllcyhjb21wb25lbnQsIGRhdGEpO1xuICBjb25zdCB2YWx1ZXMgPSBleHRyYWN0ZWQuc2VyaWVzWzBdPy52YWx1ZXMgPz8gW107XG4gIGNvbnN0IGxlZ2VuZFBvc2l0aW9uID0gcmVzb2x2ZUxlZ2VuZFBvc2l0aW9uKGNvbmZpZywgZXh0cmFjdGVkLnNlcmllcy5sZW5ndGgpO1xuXG4gIHJldHVybiB7XG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiAnaXRlbScgfSxcbiAgICBsZWdlbmQ6IGxlZ2VuZE9wdGlvbihsZWdlbmRQb3NpdGlvbiksXG4gICAgc2VyaWVzOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdwaWUnLFxuICAgICAgICByYWRpdXM6IGRvbnV0ID8gWyc0NSUnLCAnNzIlJ10gOiAnNzIlJyxcbiAgICAgICAgY2VudGVyOiBwaWVDZW50ZXIobGVnZW5kUG9zaXRpb24pLFxuICAgICAgICB0b29sdGlwOiBzZXJpZXNUb29sdGlwKGV4dHJhY3RlZC5zZXJpZXNbMF0/Lm1lYXN1cmUsIGNvbnRleHQpLFxuICAgICAgICBsYWJlbDogeyBzaG93OiBmYWxzZSB9LFxuICAgICAgICBkYXRhOiBleHRyYWN0ZWQuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBjYXRlZ29yeSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVzW2luZGV4XSA/PyAwLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbi8vIE51ZGdlIHRoZSBwaWUgb2ZmLWNlbnRlciB0b3dhcmQgdGhlIG9wcG9zaXRlIGVkZ2UgZnJvbSBpdHMgbGVnZW5kIHNvIHRoZSB0d29cbi8vIGRvbid0IGNvbGxpZGU7IGNlbnRlcmVkIHdoZW4gdGhlIGxlZ2VuZCBpcyBoaWRkZW4uXG5mdW5jdGlvbiBwaWVDZW50ZXIocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogW3N0cmluZywgc3RyaW5nXSB7XG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiBbJzYwJScsICc1MCUnXTtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gWyc0MCUnLCAnNTAlJ107XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHJldHVybiBbJzUwJScsICc1OCUnXTtcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgcmV0dXJuIFsnNTAlJywgJzQ2JSddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWyc1MCUnLCAnNTAlJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5pcXVlVmFsdWVzKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIGNvbHVtbjogc3RyaW5nKTogdW5rbm93bltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgY29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbl07XG4gICAgaWYgKCFzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBudW1lcmljKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBudWxsO1xufVxuXG4vLyBUaGUgZWZmZWN0aXZlIHRpbWUgYnVja2V0IHRoZSByb3dzIHdlcmUgZ3JvdXBlZCBpbnRvIChmcm9tIHRoZSBkYXRhIGVuZHBvaW50KSxcbi8vIG9yIG51bGwgd2hlbiB0aGUgeC1heGlzIGlzbid0IGEgdGltZSBheGlzIOKAlCBnYXRlcyB0aGUgY29tcGFjdCBwZXJpb2QgbGFiZWxzLlxuZnVuY3Rpb24gYnVja2V0R3JhbnVsYXJpdHkoZGF0YTogQ29tcG9uZW50RGF0YSk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgcmV0dXJuIGRhdGEuZ3JhbnVsYXJpdHkgJiYgR1JBTlVMQVJJVFlfT1BUSU9OUy5zb21lKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gZGF0YS5ncmFudWxhcml0eSlcbiAgICA/IGRhdGEuZ3JhbnVsYXJpdHlcbiAgICA6IG51bGw7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHBlcmlvZC1zdGFydCBjYXRlZ29yaWVzIGNyb3NzIGEgeWVhciBib3VuZGFyeS4gV2hlbiB0aGV5IGRvbid0LFxuLy8gdGhlIHllYXIgaXMgcHVyZSBub2lzZSBvbiBldmVyeSBsYWJlbCwgc28gaXQncyBkcm9wcGVkIGVudGlyZWx5LlxuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zTXVsdGlwbGVZZWFycyhjYXRlZ29yaWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB5ZWFycyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBkYXRlID0gcGFyc2VJU08oY2F0ZWdvcnkpO1xuICAgIGlmIChpc1ZhbGlkKGRhdGUpKSB7XG4gICAgICB5ZWFycy5hZGQoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geWVhcnMuc2l6ZSA+IDE7XG59XG5cbi8vIEEgdGltZSBheGlzJ3MgZGF0ZSBsYWJlbCBzdHlsZSB3aGVuIGl0cyBjb25maWcgbmFtZXMgb25lIHRoZSB2aWV3ZXIga25vd3MsXG4vLyBlbHNlIHNob3J0LlxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0RGF0ZUxhYmVsKGNvbmZpZzogQ2hhcnRDb25maWcgfCB1bmRlZmluZWQpOiBSZXBvcnRDaGFydERhdGVMYWJlbCB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKFJlcG9ydENoYXJ0RGF0ZUxhYmVsKS5maW5kKChzdHlsZSkgPT4gc3R5bGUgPT09IGNvbmZpZz8ueEF4aXM/LmRhdGVMYWJlbClcbiAgICA/PyBSZXBvcnRDaGFydERhdGVMYWJlbC5TaG9ydDtcbn1cblxuLy8gQSBidWNrZXQncyBwZXJpb2Qtc3RhcnQgc3BsaXQgaW50byBpdHMgcHJpbWFyeSBsYWJlbCBhbmQgaXRzIHllYXIuIEEgeWVhclxuLy8gcmVhZHMgXCIyMDI1XCIgaW4gZXZlcnkgc3R5bGUuIFNob3J0LCBpbiB0aGUgbG9jYWxlOiBkYXkvd2VlayByZWFkIFwiTWF5IDFcIlxuLy8gKCcxIG1haScgaW4gZnItQ0EpLCBtb250aCBcIk1heVwiICgnbWFpJyksIHF1YXJ0ZXIgXCJRMlwiICgnVDInIGluIEZyZW5jaCkuXG4vLyBMb25nIGNhcnJpZXMgaXRzIHllYXIsIGluIHRoZSBsb2NhbGU6IFwiTWF5IDEsIDIwMjZcIiwgXCJNYXkgMjAyNlwiICgnbWFpXG4vLyAyMDI2JyksIFwiUTIgMjAyNlwiLiBOdW1lcmljIGlzIHRoZSBzYW1lIGluIGV2ZXJ5IGxvY2FsZTogXCIyMDI2LTA1LTAxXCIsXG4vLyBcIjIwMjYtMDVcIiwgXCIyMDI2LVEyXCIuIFJldHVybnMgbnVsbCBmb3IgYSB2YWx1ZSB0aGF0IGlzbid0IGEgcGFyc2VhYmxlIGRhdGVcbi8vIChsZWZ0IGFzLWlzIGJ5IGNhbGxlcnMpLlxuZnVuY3Rpb24gcGVyaW9kTGFiZWxQYXJ0cyhcbiAgdmFsdWU6IHN0cmluZyxcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHksXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRlTGFiZWw6IFJlcG9ydENoYXJ0RGF0ZUxhYmVsID0gUmVwb3J0Q2hhcnREYXRlTGFiZWwuU2hvcnQsXG4pOiB7IHByaW1hcnk6IHN0cmluZzsgeWVhcjogc3RyaW5nIH0gfCBudWxsIHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlKTtcbiAgaWYgKCFpc1ZhbGlkKGRhdGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB5ZWFyID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIGlmIChncmFudWxhcml0eSA9PT0gJ3llYXInKSB7XG4gICAgcmV0dXJuIHsgcHJpbWFyeTogeWVhciwgeWVhciB9O1xuICB9XG5cbiAgcmV0dXJuIHsgcHJpbWFyeTogcGVyaW9kUHJpbWFyeUxhYmVsKGRhdGUsIGdyYW51bGFyaXR5LCBsb2NhbGUsIGRhdGVMYWJlbCksIHllYXIgfTtcbn1cblxuLy8gQSBwZXJpb2QncyBsYWJlbCBpbiB0aGUgc3R5bGUgYXNrZWQgZm9yLCB0aGUgeWVhciBhc2lkZSAoc2VlXG4vLyBwZXJpb2RMYWJlbFBhcnRzKS5cbmZ1bmN0aW9uIHBlcmlvZFByaW1hcnlMYWJlbChcbiAgZGF0ZTogRGF0ZSxcbiAgZ3JhbnVsYXJpdHk6IEV4Y2x1ZGU8Q2hhcnRHcmFudWxhcml0eSwgJ3llYXInPixcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGRhdGVMYWJlbDogUmVwb3J0Q2hhcnREYXRlTGFiZWwsXG4pOiBzdHJpbmcge1xuICBjb25zdCB5ZWFyID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmZsb29yKGRhdGUuZ2V0TW9udGgoKSAvIDMpICsgMTtcblxuICBpZiAoZGF0ZUxhYmVsID09PSBSZXBvcnRDaGFydERhdGVMYWJlbC5OdW1lcmljKSB7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgc3dpdGNoIChncmFudWxhcml0eSkge1xuICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS1RJHtxdWFydGVyfWA7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofWA7XG4gICAgICBkZWZhdWx0OiAvLyBkYXksIHdlZWsg4oCUIHRoZSBidWNrZXQgc3RhcnRcbiAgICAgICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9uZyA9IGRhdGVMYWJlbCA9PT0gUmVwb3J0Q2hhcnREYXRlTGFiZWwuTG9uZztcbiAgc3dpdGNoIChncmFudWxhcml0eSkge1xuICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgcmV0dXJuIGxvbmdcbiAgICAgICAgPyBgJHtxdWFydGVyUHJlZml4KGxvY2FsZSl9JHtxdWFydGVyfSAke3llYXJ9YFxuICAgICAgICA6IGAke3F1YXJ0ZXJQcmVmaXgobG9jYWxlKX0ke3F1YXJ0ZXJ9YDtcbiAgICBjYXNlICdtb250aCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9jYWxEYXRlKGRhdGUsIGxvY2FsZSwgbG9uZyA/IE1PTlRIX1lFQVIgOiBNT05USF9MT05HKTtcbiAgICBkZWZhdWx0OiAvLyBkYXksIHdlZWsg4oCUIHRoZSBidWNrZXQgc3RhcnQgYXMgYSBtb250aCBhbmQgZGF5XG4gICAgICByZXR1cm4gZm9ybWF0TG9jYWxEYXRlKGRhdGUsIGxvY2FsZSwgbG9uZyA/IERBWV9TSE9SVCA6IE1PTlRIX0RBWSk7XG4gIH1cbn1cblxuLy8gV2hldGhlciBhIHBlcmlvZCBsYWJlbCBsZWF2ZXMgaXRzIHllYXIgdG8gYmUgYWRkZWQgYXBhcnQ6IG9ubHkgYSBzaG9ydCBvbmVcbi8vIGRvZXMsIGEgbG9uZyBvciBudW1lcmljIGxhYmVsIGFscmVhZHkgY2FycmllcyBpdC5cbmZ1bmN0aW9uIHBlcmlvZFllYXJBcGFydChncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSwgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ3JhbnVsYXJpdHkgIT09ICd5ZWFyJyAmJiBkYXRlTGFiZWwgPT09IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLlNob3J0O1xufVxuXG5mdW5jdGlvbiBxdWFydGVyUHJlZml4KGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgcmV0dXJuIFFVQVJURVJfUFJFRklYRVMuZ2V0KGxvY2FsZS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCkpID8/IFFVQVJURVJfUFJFRklYO1xufVxuXG4vLyBBIGNvbXBhY3Qgc2luZ2xlLWxpbmUgcGVyaW9kIGxhYmVsIOKAlCBmb3IgbWVkaWEgdGhhdCBjYW4ndCBkbyBhIHN0eWxlZFxuLy8gc2Vjb25kIGxpbmUsIGUuZy4gUG93ZXJQb2ludC4gQSBzaG9ydCBsYWJlbCBoYXMgaXRzIHllYXIgYXBwZW5kZWQgb25seSB3aGVuXG4vLyB0aGUgZGF0YSBzcGFucyB5ZWFyczsgYSBsb25nIG9yIG51bWVyaWMgb25lIGFsd2F5cyBjYXJyaWVzIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFBlcmlvZExhYmVsKFxuICB2YWx1ZTogc3RyaW5nLFxuICBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSxcbiAgbXVsdGlZZWFyOiBib29sZWFuLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCA9IFJlcG9ydENoYXJ0RGF0ZUxhYmVsLlNob3J0LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBwZXJpb2RMYWJlbFBhcnRzKHZhbHVlLCBncmFudWxhcml0eSwgbG9jYWxlLCBkYXRlTGFiZWwpO1xuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG11bHRpWWVhciAmJiBwZXJpb2RZZWFyQXBhcnQoZ3JhbnVsYXJpdHksIGRhdGVMYWJlbCkgPyBgJHtwYXJ0cy5wcmltYXJ5fSAke3BhcnRzLnllYXJ9YCA6IHBhcnRzLnByaW1hcnk7XG59XG5cbi8vIEEgY3Jvc3MtdGFiJ3MgY29sdW1uIGhlYWRpbmdzLCB0aGUgb25lIHJ1bGUgdGhlIGdyaWQgYW5kIHRoZSBQREYvUG93ZXJQb2ludFxuLy8gZXhwb3J0cyBzaGFyZS4gVGhlIGZpcnN0IGlzIHRoZSByb3cga2V5IGFuZCBrZWVwcyBpdHMgYXV0aG9yZWQgbGFiZWw7IHRoZVxuLy8gcmVzdCBhcmUgcGl2b3QgVkFMVUVTLiBXaGVuIHRoZSBwaXZvdCBheGlzIGlzIGEgdGltZSBkaW1lbnNpb24gdGhlIHNlcnZlclxuLy8gc2VuZHMgdGhlIGdyYWluIGl0IGJ1Y2tldGVkIGF0LCBzbyBhIHBlcmlvZC1zdGFydCBsaWtlIFwiMjAyNi0wMS0wMVwiIHJlYWRzXG4vLyBcIkphbnVhcnkgMjAyNlwiICgnamFudmllciAyMDI2JyBpbiBmci1DQSksIGFzIHRoZSBjaGFydCdzIHgtYXhpcyBsYWJlbHMgaXQuXG5leHBvcnQgZnVuY3Rpb24gcGl2b3RIZWFkaW5ncyhcbiAgY29uZmlnOiBMaXN0Q29uZmlnLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29sdW1ucyA9IGRhdGEuY29sdW1ucyA/PyBbXTtcbiAgY29uc3QgbXVsdGlZZWFyID0gc3BhbnNNdWx0aXBsZVllYXJzKGNvbHVtbnMpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8ubGFiZWwgfHwgY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhLmdyYW51bGFyaXR5ID8gZm9ybWF0UGVyaW9kTGFiZWwoY29sdW1uLCBkYXRhLmdyYW51bGFyaXR5LCBtdWx0aVllYXIsIGxvY2FsZSkgOiBjb2x1bW47XG4gIH0pO1xufVxuXG4vLyBBIGNyb3NzLXRhYidzIGNvbHVtbnMgYXMgdGhlIGdyaWQgYW5kIHRoZSBleHBvcnRzIGRyYXcgdGhlbTogZWFjaCBoZWFkZWQgYnlcbi8vIHBpdm90SGVhZGluZ3MoKSwgYW5kIGV2ZXJ5IHBpdm90LXZhbHVlIGNvbHVtbiBmb3JtYXR0ZWQgYnkgdGhlIG9uZVxuLy8gY29uZmlnLmNlbGxGb3JtYXQuIFRoZSByb3cga2V5IGNvbHVtbiBzdGF5cyBhcyBpdCBjYW1lLiBgbnVtZXJpY2AgbWFya3MgdGhlXG4vLyBjb2x1bW5zIHdob3NlIGNlbGxzIGFyZSBmb3JtYXR0ZWQgbnVtYmVycywgd2hpY2ggYXJlIHJpZ2h0LWFsaWduZWQuXG5leHBvcnQgZnVuY3Rpb24gcGl2b3RDb2x1bW5TcGVjcyhcbiAgY29uZmlnOiBMaXN0Q29uZmlnLFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10ge1xuICBjb25zdCBoZWFkaW5ncyA9IHBpdm90SGVhZGluZ3MoY29uZmlnLCBkYXRhLCBsb2NhbGUpO1xuICBjb25zdCBjZWxsRm9ybWF0ID0gY29uZmlnLmNlbGxGb3JtYXQ7XG4gIGNvbnN0IG51bWVyaWMgPSBoYXNOdW1iZXJGb3JtYXQoY2VsbEZvcm1hdCk7XG4gIGNvbnN0IGNlbGxzOiBQaWNrPExpc3RDb2x1bW4sICdmb3JtYXQnIHwgJ3ByZWNpc2lvbicgfCAndW5pdHMnPiA9IG51bWVyaWMgJiYgY2VsbEZvcm1hdFxuICAgID8geyBmb3JtYXQ6IGxpc3RDb2x1bW5Gb3JtYXQoY2VsbEZvcm1hdC5mb3JtYXQpLCBwcmVjaXNpb246IGNlbGxGb3JtYXQucHJlY2lzaW9uLCB1bml0czogY2VsbEZvcm1hdC51bml0cyB9XG4gICAgOiB7fTtcblxuICByZXR1cm4gKGRhdGEuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4sIGluZGV4KSA9PiBpbmRleCA9PT0gMFxuICAgID8geyBjb2x1bW4sIGxhYmVsOiBoZWFkaW5nc1tpbmRleF0sIG51bWVyaWM6IGZhbHNlIH1cbiAgICA6IHsgY29sdW1uLCBsYWJlbDogaGVhZGluZ3NbaW5kZXhdLCAuLi5jZWxscywgbnVtZXJpYyB9KTtcbn1cblxuLy8gQSBudW1iZXIgZm9ybWF0J3Mgc3R5bGUgYXMgYSBsaXN0IGNvbHVtbidzIGZvcm1hdDogdGhlIHR3byBlbnVtcyBzaGFyZVxuLy8gdGhlaXIgbnVtYmVyIHZhbHVlcy5cbmZ1bmN0aW9uIGxpc3RDb2x1bW5Gb3JtYXQoZm9ybWF0OiBOdW1iZXJGb3JtYXRTcGVjWydmb3JtYXQnXSk6IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhSZXBvcnRMaXN0Q29sdW1uRm9ybWF0KS5maW5kKCh2YWx1ZSkgPT4gdmFsdWUgPT09IGZvcm1hdCk7XG59XG5cbi8vIEVDaGFydHMgY2F0ZWdvcnktYXhpcyBsYWJlbCBjb25maWcgZm9yIGEgdGltZSBidWNrZXQ6IHRoZSBwcmltYXJ5IGxhYmVsIG9uXG4vLyBsaW5lIG9uZSwgYW5kIOKAlCBvbmx5IHdoZW4gdGhlIGRhdGEgc3BhbnMgbXVsdGlwbGUgeWVhcnMg4oCUIHRoZSB5ZWFyIG9uIGEgc21hbGxcbi8vIGdyYXkgc2Vjb25kIGxpbmUsIGNlbnRlcmVkIHVuZGVyIHRoZSB0aWNrICh5ZWFyIGdyYW51bGFyaXR5IG5lZWRzIG5vIHNlY29uZFxuLy8gbGluZSwgaXQgYWxyZWFkeSBpcyB0aGUgeWVhciwgYW5kIG5laXRoZXIgZG9lcyBhIGxvbmcgb3IgbnVtZXJpYyBsYWJlbCxcbi8vIHdoaWNoIGNhcnJpZXMgaXRzIHllYXIpLiBFbXB0eSBmb3IgYSBub24tdGltZSBheGlzIChsYWJlbHMgYXMtaXMpLlxuZnVuY3Rpb24gcGVyaW9kQXhpc0xhYmVsKFxuICBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZGF0ZUxhYmVsOiBSZXBvcnRDaGFydERhdGVMYWJlbCxcbik6IHsgYXhpc0xhYmVsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB7XG4gIGlmICghZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBtdWx0aVllYXIgPSBzcGFuc011bHRpcGxlWWVhcnMoY2F0ZWdvcmllcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBheGlzTGFiZWw6IHtcbiAgICAgIGZvcm1hdHRlcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwZXJpb2RMYWJlbFBhcnRzKHZhbHVlLCBncmFudWxhcml0eSwgbG9jYWxlLCBkYXRlTGFiZWwpO1xuICAgICAgICBpZiAoIXBhcnRzKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG11bHRpWWVhciAmJiBwZXJpb2RZZWFyQXBhcnQoZ3JhbnVsYXJpdHksIGRhdGVMYWJlbClcbiAgICAgICAgICA/IGAke3BhcnRzLnByaW1hcnl9XFxue3lyfCR7cGFydHMueWVhcn19YFxuICAgICAgICAgIDogcGFydHMucHJpbWFyeTtcbiAgICAgIH0sXG4gICAgICByaWNoOiB7IHlyOiB7IGZvbnRTaXplOiAxMCwgY29sb3I6ICcjOWFhMGE2JywgbGluZUhlaWdodDogMTQgfSB9LFxuICAgIH0sXG4gIH07XG59XG4iXX0=