@firestitch/report 18.6.1 → 18.8.0

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 (97) hide show
  1. package/app/reports/components/component-chart/component-chart.component.d.ts +6 -7
  2. package/app/reports/components/component-kpi/component-kpi.component.d.ts +17 -9
  3. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  4. package/app/reports/components/component-list/component-list.component.d.ts +39 -10
  5. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  6. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -10
  7. package/app/reports/components/report-component/report-component.component.d.ts +5 -12
  8. package/app/reports/data/report.data.d.ts +2 -3
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  10. package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
  11. package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
  12. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -2
  13. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  14. package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
  15. package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
  16. package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
  17. package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
  18. package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
  19. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  20. package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
  21. package/app/reports/enums/report-number-units.enum.d.ts +6 -0
  22. package/app/reports/enums/report-value-format.enum.d.ts +5 -0
  23. package/app/reports/export/offscreen-chart.d.ts +2 -2
  24. package/app/reports/export/report-export-collector.service.d.ts +37 -8
  25. package/app/reports/export/report-pdf.service.d.ts +6 -0
  26. package/app/reports/export/report-pptx.service.d.ts +24 -0
  27. package/app/reports/format.d.ts +64 -3
  28. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  29. package/app/reports/interfaces/report.interface.d.ts +205 -14
  30. package/app/reports/kpi-card.d.ts +48 -0
  31. package/app/reports/layout.d.ts +0 -9
  32. package/app/reports/list-config.d.ts +16 -0
  33. package/app/reports/option-builder.d.ts +76 -9
  34. package/app/reports/output-notes.d.ts +14 -0
  35. package/app/reports/pipes/report-date.pipe.d.ts +2 -1
  36. package/app/reports/pipes/report-number.pipe.d.ts +8 -0
  37. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  38. package/app/reports/report-filter-items.d.ts +5 -2
  39. package/app/reports/report-url-state.d.ts +4 -0
  40. package/app/reports/services/report-filter-state.service.d.ts +27 -2
  41. package/app/reports/theme/palette.d.ts +6 -0
  42. package/app/reports/theme/typography.d.ts +2 -0
  43. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +23 -20
  44. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +56 -29
  45. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  46. package/esm2022/app/reports/components/component-list/component-list.component.mjs +218 -32
  47. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  48. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -61
  49. package/esm2022/app/reports/components/report-component/report-component.component.mjs +99 -100
  50. package/esm2022/app/reports/data/report.data.mjs +20 -7
  51. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  52. package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
  53. package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
  54. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +138 -20
  55. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  56. package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
  57. package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
  58. package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
  59. package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
  60. package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
  61. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  62. package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
  63. package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
  64. package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
  65. package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
  66. package/esm2022/app/reports/export/report-export-collector.service.mjs +186 -40
  67. package/esm2022/app/reports/export/report-pdf.service.mjs +332 -67
  68. package/esm2022/app/reports/export/report-pptx.service.mjs +765 -106
  69. package/esm2022/app/reports/format.mjs +917 -57
  70. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  71. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  72. package/esm2022/app/reports/kpi-card.mjs +174 -0
  73. package/esm2022/app/reports/layout.mjs +1 -46
  74. package/esm2022/app/reports/list-config.mjs +106 -0
  75. package/esm2022/app/reports/option-builder.mjs +1457 -117
  76. package/esm2022/app/reports/output-notes.mjs +158 -0
  77. package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
  78. package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
  79. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  80. package/esm2022/app/reports/report-filter-items.mjs +28 -3
  81. package/esm2022/app/reports/report-url-state.mjs +56 -15
  82. package/esm2022/app/reports/services/report-filter-state.service.mjs +274 -22
  83. package/esm2022/app/reports/theme/echarts.mjs +8 -2
  84. package/esm2022/app/reports/theme/palette.mjs +35 -1
  85. package/esm2022/app/reports/theme/typography.mjs +8 -1
  86. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  87. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  88. package/esm2022/public_api.mjs +10 -1
  89. package/fesm2022/{firestitch-report-echarts-Djtmaxj1.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +9 -3
  90. package/fesm2022/firestitch-report-echarts-qCBE3LqM.mjs.map +1 -0
  91. package/fesm2022/{firestitch-report-firestitch-report-D3zseBZc.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +5523 -875
  92. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  93. package/fesm2022/firestitch-report.mjs +1 -1
  94. package/package.json +1 -1
  95. package/public_api.d.ts +9 -0
  96. package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +0 -1
  97. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +0 -1
@@ -1,14 +1,51 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { formatMeasureValue, resolveReportTimezone } from '../format';
3
- import { DEFAULT_COMPONENT_PADDING, pageGeometry } from '../layout';
2
+ import { ReportKpiTrend } from '../enums/report-kpi-trend.enum';
3
+ import { resolveReportTimezone } from '../format';
4
+ import { kpiCardView, kpiSparklineGeometry, } from '../kpi-card';
5
+ import { DEFAULT_COMPONENT_PADDING } from '../layout';
4
6
  import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, textParagraphs, } from '../text';
7
+ import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR } from '../theme/palette';
5
8
  import { renderChartImage } from './offscreen-chart';
6
- import { coverLines, emptyLabel, exportCell, listColumns, listHeadings, moreRowsNotice, } from './report-export-collector.service';
9
+ import { coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, } from './report-export-collector.service';
7
10
  import * as i0 from "@angular/core";
8
11
  // Inches → points (the PDF unit).
9
12
  const PT = 72;
10
13
  // Component title strip height, points.
11
14
  const TITLE_H = 18;
15
+ // The small print a component may carry, points: the days it reads under its
16
+ // title (a subtitle line), its notes at the foot of its box (a line each), and
17
+ // the lines of a KPI card under its value. A chart's or a list's notes give
18
+ // way before its body would shrink under MIN_BODY_H.
19
+ const SMALL_SIZE = 7.5;
20
+ const SUBTITLE_H = 11;
21
+ const NOTE_LINE_H = 10;
22
+ const MIN_BODY_H = 40;
23
+ const MUTED_COLOR = '#7b8794';
24
+ // A KPI card's parts, top to bottom, points (kpiExportParts sheds the
25
+ // sparkline, then the target, then the notes on a short tile). The value's
26
+ // baseline sits KPI_VALUE_BASELINE under its top.
27
+ const KPI_HEIGHTS = {
28
+ value: 30,
29
+ label: 13,
30
+ delta: 13,
31
+ window: NOTE_LINE_H,
32
+ target: NOTE_LINE_H + 6,
33
+ sparkline: 28,
34
+ note: NOTE_LINE_H,
35
+ };
36
+ const KPI_VALUE_BASELINE = 23;
37
+ const KPI_DELTA_SIZE = 9;
38
+ // The delta's triangle: its side, and the gap before the change.
39
+ const KPI_ARROW = 6;
40
+ const KPI_ARROW_GAP = 3;
41
+ // The target's progress bar, and the track it fills.
42
+ const KPI_BAR_W = 120;
43
+ const KPI_BAR_H = 3;
44
+ const KPI_TRACK_COLOR = '#e4e7eb';
45
+ // The sparkline's widest box, its top and bottom inset, and its dots' radius.
46
+ const KPI_SPARKLINE_W = 140;
47
+ const KPI_SPARKLINE_INSET = 3;
48
+ const KPI_DOT_R = 1.5;
12
49
  // Rows fetched for a list's PDF table. A table that outgrows its box
13
50
  // continues onto pages of its own, so this is how far it may run: about 12-15
14
51
  // continuation pages on a letter page, and a tenth of the server's 5000-row
@@ -42,7 +79,7 @@ const LIST_INDENT = 16;
42
79
  // longer result ends in a row pointing to the component's CSV export.
43
80
  export class ReportPdfService {
44
81
  async export(collected) {
45
- const context = await this._context(collected.report);
82
+ const context = await this._context(collected);
46
83
  this._titlePage(context.doc, collected, context.pageW, context.pageH);
47
84
  // The physical page number {{page.number}} prints: report pages and
48
85
  // their continuation pages alike, the title page not counted.
@@ -59,7 +96,8 @@ export class ReportPdfService {
59
96
  }
60
97
  context.doc.save(`${this._slug(collected.report.name)}.pdf`);
61
98
  }
62
- async _context(report) {
99
+ async _context(collected) {
100
+ const report = collected.report;
63
101
  const { jsPDF } = await import('jspdf');
64
102
  const autoTable = (await import('jspdf-autotable')).default;
65
103
  const pageW = report.pageWidth * PT;
@@ -71,6 +109,7 @@ export class ReportPdfService {
71
109
  jsPDF,
72
110
  report,
73
111
  timezone: resolveReportTimezone(report),
112
+ formatContext: collected.formatContext,
74
113
  pageW,
75
114
  pageH,
76
115
  orientation,
@@ -81,17 +120,15 @@ export class ReportPdfService {
81
120
  // overflows.
82
121
  async _renderPage(context, collectedPage, index, pageNumber, overflows) {
83
122
  const { doc, report } = context;
84
- const geometry = pageGeometry(report, collectedPage.page);
85
123
  const tokens = this._tokens(report, collectedPage.page, index, pageNumber);
86
124
  doc.addPage([context.pageW, context.pageH], context.orientation);
87
125
  this._renderMaster(context, collectedPage.page, tokens);
88
126
  for (const item of collectedPage.components) {
89
- const box = geometry.get(item.component.id);
90
127
  if (item.component.type === 'text') {
91
- this._renderText(doc, item.component, box ?? item.component, tokens);
128
+ this._renderText(doc, item.component, tokens);
92
129
  }
93
130
  else {
94
- await this._renderComponent(context, item, overflows, box);
131
+ await this._renderComponent(context, item, overflows);
95
132
  }
96
133
  }
97
134
  }
@@ -100,7 +137,7 @@ export class ReportPdfService {
100
137
  return;
101
138
  }
102
139
  for (const component of context.report.master?.components ?? []) {
103
- this._renderText(context.doc, component, component, tokens);
140
+ this._renderText(context.doc, component, tokens);
104
141
  }
105
142
  }
106
143
  _titlePage(doc, collected, pageW, pageH) {
@@ -111,19 +148,19 @@ export class ReportPdfService {
111
148
  doc.setFont('helvetica', 'normal');
112
149
  doc.setFontSize(11);
113
150
  doc.setTextColor('#52606d');
114
- doc.text(coverLines(collected), 40, pageH * 0.35 + 26);
151
+ doc.text(coverLines(collected).map((line) => this._pdfText(line)), 40, pageH * 0.35 + 26);
115
152
  }
116
153
  // A text block, laid out by hand: jsPDF draws strings, not rich text, so each
117
154
  // paragraph's runs are broken into words, wrapped to the block's width and
118
155
  // drawn word by word in their own font, size and color. Lines past the
119
156
  // block's height are dropped — the canvas clips the block there too.
120
- _renderText(doc, component, box, tokens) {
157
+ _renderText(doc, component, tokens) {
121
158
  const padding = component.config?.padding;
122
159
  const inset = (value) => (value ?? DEFAULT_COMPONENT_PADDING) * PT;
123
- const left = box.x * PT + inset(padding?.left);
124
- const top = box.y * PT + inset(padding?.top);
125
- const width = box.w * PT - inset(padding?.left) - inset(padding?.right);
126
- const bottom = (box.y + box.h) * PT - inset(padding?.bottom);
160
+ const left = component.x * PT + inset(padding?.left);
161
+ const top = component.y * PT + inset(padding?.top);
162
+ const width = component.w * PT - inset(padding?.left) - inset(padding?.right);
163
+ const bottom = (component.y + component.h) * PT - inset(padding?.bottom);
127
164
  let cursorY = top;
128
165
  let listNumber = 0;
129
166
  for (const paragraph of textParagraphs(component.config?.html ?? '', tokens)) {
@@ -247,39 +284,73 @@ export class ReportPdfService {
247
284
  reportName: report.name,
248
285
  };
249
286
  }
250
- async _renderComponent(context, item, overflows, geometry) {
287
+ async _renderComponent(context, item, overflows) {
251
288
  const { doc } = context;
252
289
  const component = item.component;
253
- // Geometry arrives in inches (flow layout pre-resolved); the PDF draws in
254
- // points.
255
- const inches = geometry ?? component;
256
- const x = inches.x * PT;
257
- const y = inches.y * PT;
258
- const w = inches.w * PT;
259
- const h = inches.h * PT;
260
- if (component.title) {
261
- this._componentTitle(doc, component.title, x, y, w);
262
- }
263
- const bodyY = y + TITLE_H;
264
- const bodyH = Math.max(20, h - TITLE_H);
290
+ // Geometry is stored in inches; the PDF draws in points.
291
+ const x = component.x * PT;
292
+ const y = component.y * PT;
293
+ const w = component.w * PT;
294
+ const h = component.h * PT;
295
+ const title = exportTitle(component, item.search);
296
+ if (title) {
297
+ this._componentTitle(doc, title, x, y, w);
298
+ }
299
+ // A chart or list that compares or has a timeframe names its days under
300
+ // the title, and its notes sit at the foot of its box; a KPI card draws
301
+ // both itself. Neither takes room from a component without those keys.
302
+ const locale = context.formatContext.locale;
303
+ const subtitle = this._pdfText(exportWindowsLine(item, context.timezone, locale));
304
+ const notes = component.type === 'kpi' ? [] : exportNoteLines(item, context.timezone, locale);
305
+ const top = y + TITLE_H + (subtitle ? SUBTITLE_H : 0);
306
+ const room = Math.max(20, y + h - top);
307
+ const kept = notes.slice(0, Math.max(0, Math.floor((room - MIN_BODY_H) / NOTE_LINE_H)));
308
+ if (subtitle) {
309
+ this._smallLine(doc, subtitle, x, y + TITLE_H, w, 'left', 'normal');
310
+ }
311
+ const bodyY = top;
312
+ const bodyH = Math.max(20, room - kept.length * NOTE_LINE_H);
313
+ kept.forEach((line, index) => {
314
+ this._smallLine(doc, this._pdfText(line), x, bodyY + bodyH + index * NOTE_LINE_H, w, 'left', 'italic');
315
+ });
265
316
  if (!item.data || !item.data.rows?.length) {
266
317
  this._boxNote(doc, emptyLabel(item), x, bodyY, w, bodyH);
267
318
  return;
268
319
  }
269
320
  switch (component.type) {
270
321
  case 'chart': {
271
- const image = await renderChartImage(component, item.data, w, bodyH);
322
+ const image = await renderChartImage(component, item.data, w, bodyH, context.formatContext);
272
323
  doc.addImage(image, 'PNG', x, bodyY, w, bodyH);
273
324
  break;
274
325
  }
275
326
  case 'list':
276
- this._renderTable(context, component, item.data, x, bodyY, w, bodyH, overflows);
327
+ this._renderTable(context, item, x, bodyY, w, bodyH, overflows);
277
328
  break;
278
329
  case 'kpi':
279
- this._renderKpi(context, component, item.data, x, bodyY, w, bodyH);
330
+ this._renderKpi(context, item, x, bodyY, w, bodyH);
280
331
  break;
281
332
  }
282
333
  }
334
+ // One line of small grey print, cut to the width with an ellipsis: a
335
+ // subtitle, a note or a line of a KPI card. y is the line's top; the line is
336
+ // NOTE_LINE_H tall.
337
+ _smallLine(doc, text, x, y, w, align, style) {
338
+ doc.setFont('helvetica', style);
339
+ doc.setFontSize(SMALL_SIZE);
340
+ doc.setTextColor(MUTED_COLOR);
341
+ doc.text(this._fit(doc, text, w), align === 'center' ? x + w / 2 : x, y + SMALL_SIZE, { align });
342
+ }
343
+ // The text, ellipsized to the width in the doc's current font.
344
+ _fit(doc, text, width) {
345
+ if (doc.getTextWidth(text) <= width) {
346
+ return text;
347
+ }
348
+ let cut = text;
349
+ while (cut.length > 1 && doc.getTextWidth(`${cut}…`) > width) {
350
+ cut = cut.slice(0, -1);
351
+ }
352
+ return `${cut.trimEnd()}…`;
353
+ }
283
354
  // The bold strip over a component, and over each of its continuation pages.
284
355
  _componentTitle(doc, title, x, y, w) {
285
356
  doc.setFont('helvetica', 'bold');
@@ -299,15 +370,19 @@ export class ReportPdfService {
299
370
  // how many the box holds; when they do not all fit, the box's last row says
300
371
  // the table continues and the rest go to overflows for continuation pages.
301
372
  // A box too short for even the head carries the notice as a line instead.
302
- // Points throughout.
303
- _renderTable(context, component, data, x, y, w, h, overflows) {
304
- const head = listHeadings(component, data);
305
- const cells = this._tableCells(component, data, context.timezone);
373
+ // A totals row closes the table once: in the box when every row fits it,
374
+ // else after the last continuation row. Points throughout.
375
+ _renderTable(context, item, x, y, w, h, overflows) {
376
+ const { component, search, hiddenColumns } = item;
377
+ const data = item.data;
378
+ const head = listHeadings(component, data, context.formatContext.locale, hiddenColumns)
379
+ .map((heading) => this._pdfText(heading));
380
+ const { cells, numeric, foot } = this._tableCells(context, component, data, hiddenColumns);
306
381
  const omitted = Math.max(0, (data.paging?.total ?? cells.length) - cells.length);
307
382
  const bottom = context.pageH - (y + h);
308
- const { fit, columnStyles } = this._measure(context, head, cells, x, y, w, bottom);
383
+ const { fit, columnStyles } = this._measure(context, head, cells, numeric, foot, x, y, w, bottom);
309
384
  if (fit === cells.length && omitted === 0) {
310
- this._drawTable(context, this._tableOptions(context, head, cells, x, y, w, bottom, columnStyles));
385
+ this._drawTable(context, this._tableOptions(context, head, numeric, cells, x, y, w, bottom, columnStyles, foot));
311
386
  return;
312
387
  }
313
388
  // The notice takes the place of the last row that fit, so that row moves
@@ -315,25 +390,39 @@ export class ReportPdfService {
315
390
  // never fits one box, so the CSV notice always lands on a continuation
316
391
  // page.
317
392
  const kept = Math.max(0, fit - 1);
318
- overflows.push({ component, head, rows: cells.slice(kept), omitted, x, w, columnStyles });
393
+ overflows.push({ component, search, head, numeric, rows: cells.slice(kept), omitted, foot, x, w, columnStyles });
319
394
  if (fit >= 1) {
320
395
  const body = [...cells.slice(0, kept), this._noticeRow(CONTINUED_NOTICE, head.length, true)];
321
- this._drawTable(context, this._tableOptions(context, head, body, x, y, w, bottom, columnStyles));
396
+ this._drawTable(context, this._tableOptions(context, head, numeric, body, x, y, w, bottom, columnStyles));
322
397
  }
323
398
  else {
324
399
  this._boxNote(context.doc, CONTINUED_NOTICE, x, y, w, h);
325
400
  }
326
401
  }
327
- // Each fetched row as the strings its table cells print.
328
- _tableCells(component, data, timezone) {
329
- const columns = listColumns(component, data);
330
- return data.rows.map((row) => columns.map((column) => exportCell(row[column.column], column.format, timezone)));
402
+ // Each fetched row as the strings its table cells print, in the report's
403
+ // zone, locale and currency, which columns hold formatted numbers, and the
404
+ // totals row (null without one). The columns the viewer hid are left out.
405
+ _tableCells(context, component, data, hiddenColumns) {
406
+ const columns = listColumns(component, data, context.formatContext.locale, hiddenColumns);
407
+ const cells = data.rows.map((row) => columns.map((column) => this._pdfText(exportCell(row[column.column], column, context.timezone, context.formatContext, row))));
408
+ const foot = listTotalsRow(data, columns, context.timezone, context.formatContext);
409
+ return {
410
+ cells,
411
+ numeric: columns.map((column) => column.numeric),
412
+ foot: foot ? foot.map((cell) => this._pdfText(cell)) : null,
413
+ };
331
414
  }
332
415
  // The autoTable options every list table shares: the dry run, the on-page
333
416
  // draw and the continuation pages, so the three lay a table out alike. The
334
417
  // font is named rather than inherited, since the doc carries whatever the
335
418
  // last text drawn left set. bottom is the margin under the table, points.
336
- _tableOptions(context, head, body, x, startY, w, bottom, columnStyles) {
419
+ //
420
+ // A column of formatted numbers is right-aligned, its heading and total
421
+ // too: the body through columnStyles, which autoTable applies to body cells
422
+ // only, and the heading and total through the didParseCell hook, on every
423
+ // page the heading repeats. A totals row (foot) prints once, under the
424
+ // table's last row, bold on the border gray.
425
+ _tableOptions(context, head, numeric, body, x, startY, w, bottom, columnStyles, foot) {
337
426
  return {
338
427
  theme: 'grid',
339
428
  head: [head],
@@ -346,6 +435,18 @@ export class ReportPdfService {
346
435
  headStyles: { fillColor: '#4e79a7', textColor: '#ffffff', fontStyle: 'bold' },
347
436
  alternateRowStyles: { fillColor: '#f5f7fa' },
348
437
  ...(columnStyles ? { columnStyles } : {}),
438
+ ...(foot
439
+ ? {
440
+ foot: [foot],
441
+ showFoot: 'lastPage',
442
+ footStyles: { fillColor: '#e4e7eb', textColor: '#1f2933', fontStyle: 'bold' },
443
+ }
444
+ : {}),
445
+ didParseCell: (hook) => {
446
+ if ((hook.section === 'head' || hook.section === 'foot') && numeric[hook.column.index]) {
447
+ hook.cell.styles.halign = 'right';
448
+ }
449
+ },
349
450
  };
350
451
  }
351
452
  // A notice as a table row: one italic grey cell spanning every column. A
@@ -356,15 +457,26 @@ export class ReportPdfService {
356
457
  return [{
357
458
  content: text,
358
459
  colSpan: span,
359
- styles: { fontStyle: 'italic', textColor: '#7b8794', ...(singleLine ? { overflow: 'ellipsize' } : {}) },
460
+ // Left-aligned whatever the first column is: a spanned cell otherwise
461
+ // takes columnStyles[0], right-aligned when that column is numeric.
462
+ styles: {
463
+ fontStyle: 'italic',
464
+ textColor: '#7b8794',
465
+ halign: 'left',
466
+ ...(singleLine ? { overflow: 'ellipsize' } : {}),
467
+ },
360
468
  }];
361
469
  }
362
470
  // Lays every fetched row out once on a scratch document of the same page
363
471
  // size, with the options the real draw uses, and reads back how many body
364
- // rows the box's page holds (fit) and the column widths autoTable chose.
365
- // fit 0 means not even one body row fits under the head (or the head itself
366
- // did not fit): autoTable moved to a new page before drawing. The real document is untouched.
367
- _measure(context, head, cells, x, y, w, bottom) {
472
+ // rows the box's page holds (fit) and the column widths autoTable chose,
473
+ // with each numeric column's right alignment merged in, so the on-page
474
+ // table and its continuation pages carry both. The totals row is laid out
475
+ // too, so the widths hold it, and a table whose rows fit the box but whose
476
+ // totals row does not moves its last row on. fit 0 means not even one
477
+ // body row fits under the head (or the head itself did not fit): autoTable
478
+ // moved to a new page before drawing. The real document is untouched.
479
+ _measure(context, head, cells, numeric, foot, x, y, w, bottom) {
368
480
  const scratch = new context.jsPDF({
369
481
  unit: 'pt',
370
482
  format: [context.pageW, context.pageH],
@@ -372,7 +484,7 @@ export class ReportPdfService {
372
484
  });
373
485
  let fit = 0;
374
486
  context.autoTable(scratch, {
375
- ...this._tableOptions(context, head, cells, x, y, w, bottom),
487
+ ...this._tableOptions(context, head, numeric, cells, x, y, w, bottom, undefined, foot),
376
488
  didDrawCell: (hook) => {
377
489
  if (hook.section === 'body' && scratch.getCurrentPageInfo().pageNumber === 1) {
378
490
  fit = Math.max(fit, hook.row.index + 1);
@@ -382,7 +494,9 @@ export class ReportPdfService {
382
494
  const columns = scratch.lastAutoTable.columns;
383
495
  const columnStyles = {};
384
496
  columns.forEach((column, index) => {
385
- columnStyles[index] = { cellWidth: column.width };
497
+ columnStyles[index] = numeric[index]
498
+ ? { cellWidth: column.width, halign: 'right' }
499
+ : { cellWidth: column.width };
386
500
  });
387
501
  // A row taller than a whole page is split rather than moved, so a last
388
502
  // row that started on the first page can still have run past it.
@@ -421,14 +535,14 @@ export class ReportPdfService {
421
535
  let counter = pageNumber;
422
536
  doc.addPage([context.pageW, context.pageH], context.orientation);
423
537
  context.autoTable(doc, {
424
- ...this._tableOptions(context, overflow.head, body, x, top + TITLE_H, w, bottom, overflow.columnStyles),
538
+ ...this._tableOptions(context, overflow.head, overflow.numeric, body, x, top + TITLE_H, w, bottom, overflow.columnStyles, overflow.foot),
425
539
  margin: { top: top + TITLE_H, bottom, left: x, right: context.pageW - x - w },
426
540
  showHead: 'everyPage',
427
541
  // Fires on every page the table draws on, the first included.
428
542
  willDrawPage: () => {
429
543
  counter += 1;
430
544
  this._renderMaster(context, page, this._tokens(report, page, index, counter));
431
- this._componentTitle(doc, this._continuedTitle(overflow.component), x, top, w);
545
+ this._componentTitle(doc, this._continuedTitle(overflow.component, overflow.search), x, top, w);
432
546
  },
433
547
  });
434
548
  return counter;
@@ -438,26 +552,177 @@ export class ReportPdfService {
438
552
  _continuationMargin(band) {
439
553
  return band ? band * PT + CONTINUATION_GAP : NO_BAND_MARGIN;
440
554
  }
441
- _continuedTitle(component) {
442
- return component.title ? `${component.title} (continued)` : 'Continued';
555
+ _continuedTitle(component, search) {
556
+ const title = exportTitle(component, search);
557
+ return title ? `${title} (continued)` : 'Continued';
443
558
  }
444
- _renderKpi(context, component, data, x, y, w, h) {
445
- const { doc, report } = context;
446
- const config = component.config;
447
- const row = data.rows[0] ?? {};
448
- const column = config.measure?.column ?? Object.keys(row)[0];
449
- const value = formatMeasureValue(row[column], config.measure?.format, config.measure?.precision, report.percentFormat === 'ratio');
559
+ // A KPI tile: the card the screen draws (kpi-card.ts decides every line),
560
+ // stacked and centered in the body. A card with only its value and label
561
+ // keeps the tile's long-standing layout.
562
+ _renderKpi(context, item, x, y, w, h) {
563
+ const { doc } = context;
564
+ const config = item.component.config;
565
+ const view = kpiCardView(config, item.data, { format: context.formatContext, timezone: context.timezone });
566
+ const value = this._pdfText(view.value);
567
+ const notes = exportNoteLines(item, context.timezone, context.formatContext.locale);
568
+ if (!kpiCardHasExtras(view, notes)) {
569
+ doc.setFont('helvetica', 'bold');
570
+ doc.setFontSize(26);
571
+ doc.setTextColor('#1f2933');
572
+ doc.text(value, x + w / 2, y + h / 2, { align: 'center' });
573
+ if (view.label) {
574
+ doc.setFont('helvetica', 'normal');
575
+ doc.setFontSize(9);
576
+ doc.setTextColor('#7b8794');
577
+ doc.text(view.label, x + w / 2, y + h / 2 + 16, { align: 'center' });
578
+ }
579
+ return;
580
+ }
581
+ const parts = kpiExportParts(view, notes, h, KPI_HEIGHTS);
582
+ let top = y + Math.max(0, (h - kpiExportHeight(view, parts, KPI_HEIGHTS)) / 2);
450
583
  doc.setFont('helvetica', 'bold');
451
584
  doc.setFontSize(26);
452
585
  doc.setTextColor('#1f2933');
453
- doc.text(value, x + w / 2, y + h / 2, { align: 'center' });
454
- if (config.measure?.label) {
586
+ doc.text(value, x + w / 2, top + KPI_VALUE_BASELINE, { align: 'center' });
587
+ top += KPI_HEIGHTS.value;
588
+ if (view.label) {
455
589
  doc.setFont('helvetica', 'normal');
456
590
  doc.setFontSize(9);
457
- doc.setTextColor('#7b8794');
458
- doc.text(config.measure.label, x + w / 2, y + h / 2 + 16, { align: 'center' });
591
+ doc.setTextColor(MUTED_COLOR);
592
+ doc.text(this._fit(doc, this._pdfText(view.label), w), x + w / 2, top + 9, { align: 'center' });
593
+ top += KPI_HEIGHTS.label;
594
+ }
595
+ if (parts.delta && view.delta) {
596
+ this._kpiDelta(doc, view.delta, x, top, w);
597
+ top += KPI_HEIGHTS.delta;
598
+ }
599
+ if (parts.window) {
600
+ this._smallLine(doc, this._pdfText(view.window), x, top, w, 'center', 'normal');
601
+ top += KPI_HEIGHTS.window;
602
+ }
603
+ if (parts.target && view.target) {
604
+ this._kpiTarget(doc, view.target, x, top, w);
605
+ top += KPI_HEIGHTS.target;
606
+ }
607
+ if (parts.sparkline && view.sparkline) {
608
+ this._kpiSparkline(doc, view.sparkline.values, view.sparkline.partial, x, top, w);
609
+ top += KPI_HEIGHTS.sparkline;
610
+ }
611
+ for (const line of parts.notes) {
612
+ this._smallLine(doc, this._pdfText(line), x, top, w, 'center', 'italic');
613
+ top += KPI_HEIGHTS.note;
459
614
  }
460
615
  }
616
+ // The delta row, centered as one group: a triangle pointing the way the
617
+ // value moved (none when the shown change rounds to zero) and the change in
618
+ // the color of what it means, then what it is compared with in grey.
619
+ _kpiDelta(doc, delta, x, top, w) {
620
+ const color = `#${REPORT_KPI_CHANGE_COLORS[delta.tone]}`;
621
+ const change = this._pdfText(delta.text);
622
+ const arrow = delta.trend === ReportKpiTrend.Flat ? 0 : KPI_ARROW + KPI_ARROW_GAP;
623
+ doc.setFont('helvetica', 'bold');
624
+ doc.setFontSize(KPI_DELTA_SIZE);
625
+ const changeWidth = doc.getTextWidth(change);
626
+ doc.setFont('helvetica', 'normal');
627
+ const compared = delta.compared
628
+ ? this._fit(doc, ` ${this._pdfText(delta.compared)}`, Math.max(0, w - arrow - changeWidth))
629
+ : '';
630
+ const width = arrow + changeWidth + (compared ? doc.getTextWidth(compared) : 0);
631
+ const baseline = top + KPI_DELTA_SIZE;
632
+ let left = x + Math.max(0, (w - width) / 2);
633
+ if (arrow) {
634
+ const up = delta.trend === ReportKpiTrend.Up;
635
+ const tip = up ? baseline - KPI_ARROW : baseline;
636
+ const base = up ? baseline : baseline - KPI_ARROW;
637
+ doc.setFillColor(color);
638
+ doc.triangle(left, base, left + KPI_ARROW, base, left + KPI_ARROW / 2, tip, 'F');
639
+ left += arrow;
640
+ }
641
+ doc.setFont('helvetica', 'bold');
642
+ doc.setTextColor(color);
643
+ doc.text(change, left, baseline);
644
+ if (compared) {
645
+ doc.setFont('helvetica', 'normal');
646
+ doc.setTextColor(MUTED_COLOR);
647
+ doc.text(compared, left + changeWidth, baseline);
648
+ }
649
+ }
650
+ // The target line ('Goal: $1,000 · 56% of target') and, when the server sent
651
+ // the progress, a bar filled that far: green once the target is met.
652
+ _kpiTarget(doc, target, x, top, w) {
653
+ const text = target.progress ? `${target.text} · ${target.progress}` : target.text;
654
+ this._smallLine(doc, this._pdfText(text), x, top, w, 'center', 'normal');
655
+ if (target.fill === null) {
656
+ return;
657
+ }
658
+ const barW = Math.min(w * 0.6, KPI_BAR_W);
659
+ const barX = x + (w - barW) / 2;
660
+ const barY = top + NOTE_LINE_H + 1;
661
+ doc.setFillColor(KPI_TRACK_COLOR);
662
+ doc.rect(barX, barY, barW, KPI_BAR_H, 'F');
663
+ if (target.fill > 0) {
664
+ doc.setFillColor(`#${REPORT_KPI_CHANGE_COLORS[target.tone]}`);
665
+ doc.rect(barX, barY, barW * target.fill, KPI_BAR_H, 'F');
666
+ }
667
+ }
668
+ // The sparkline in a box under the card's lines, as the screen draws it
669
+ // (kpiSparklineGeometry, a 0-100 box): a vector line per run of values, a
670
+ // dot for a lone value, and the last point's marker, hollow while its period
671
+ // is partial.
672
+ _kpiSparkline(doc, values, partial, x, top, w) {
673
+ const geometry = kpiSparklineGeometry(values, partial);
674
+ const boxW = Math.min(w * 0.7, KPI_SPARKLINE_W);
675
+ const boxH = KPI_HEIGHTS.sparkline - 2 * KPI_SPARKLINE_INSET;
676
+ const left = x + (w - boxW) / 2;
677
+ const at = (point) => ({
678
+ x: left + point.x * boxW / 100,
679
+ y: top + KPI_SPARKLINE_INSET + point.y * boxH / 100,
680
+ });
681
+ const color = `#${REPORT_KPI_SPARKLINE_COLOR}`;
682
+ doc.setDrawColor(color);
683
+ doc.setFillColor(color);
684
+ doc.setLineWidth(1);
685
+ for (const line of geometry.lines) {
686
+ const points = line.split(' ').map((pair) => {
687
+ const [px, py] = pair.split(',').map(Number);
688
+ return at({ x: px, y: py });
689
+ });
690
+ const steps = points.slice(1).map((point, index) => [point.x - points[index].x, point.y - points[index].y]);
691
+ doc.lines(steps, points[0].x, points[0].y, [1, 1], 'S', false);
692
+ }
693
+ for (const dot of geometry.dots) {
694
+ const point = at(dot);
695
+ doc.circle(point.x, point.y, KPI_DOT_R, 'F');
696
+ }
697
+ if (geometry.last) {
698
+ const point = at(geometry.last);
699
+ if (geometry.last.hollow) {
700
+ doc.setFillColor('#ffffff');
701
+ doc.circle(point.x, point.y, KPI_DOT_R, 'FD');
702
+ }
703
+ else {
704
+ doc.circle(point.x, point.y, KPI_DOT_R, 'F');
705
+ }
706
+ }
707
+ }
708
+ // A formatted value as jsPDF can draw it. Its standard fonts write text in
709
+ // WinAnsi, which has the no-break space (U+00A0, fr-CA's digit grouping) but
710
+ // not the narrow one (U+202F, which other locales group and space with), the
711
+ // thin and hair spaces (U+2009, U+200A, which Intl puts around a date
712
+ // range's dash: 'Sep 1 – 30, 2026'), the minus sign (U+2212, some locales'
713
+ // negative sign) or a rank change's triangles: each would print as stray
714
+ // glyphs. The narrow space becomes a no-break space, so a number still never
715
+ // wraps across a line; the thin and hair spaces a plain space; the minus
716
+ // sign a hyphen; and a rank's rise a plus sign and its fall a hyphen
717
+ // ('▲ 2' reads '+2').
718
+ _pdfText(text) {
719
+ return text
720
+ .replace(/\u202F/g, '\u00A0')
721
+ .replace(/[\u2009\u200A]/g, ' ')
722
+ .replace(/\u2212/g, '-')
723
+ .replace(/\u25B2\s?/g, '+')
724
+ .replace(/\u25BC\s?/g, '-');
725
+ }
461
726
  _slug(name) {
462
727
  return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';
463
728
  }
@@ -467,4 +732,4 @@ export class ReportPdfService {
467
732
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
468
733
  type: Injectable
469
734
  }] });
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFTdEUsT0FBTyxFQUFxQix5QkFBeUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkYsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFDK0MsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDakgsY0FBYyxHQUNmLE1BQU0sbUNBQW1DLENBQUM7O0FBRzNDLGtDQUFrQztBQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFZCx3Q0FBd0M7QUFDeEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBRW5CLHFFQUFxRTtBQUNyRSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRWpDLHdFQUF3RTtBQUN4RSxnRUFBZ0U7QUFDaEUseUNBQXlDO0FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sUUFBUSxHQUF1QixFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRTFFLDBEQUEw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LENBQUM7UUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUUzRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDMUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsSUFBWTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDO0lBQzVGLENBQUM7d0dBbGlCVSxnQkFBZ0I7NEdBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0TWVhc3VyZVZhbHVlLCByZXNvbHZlUmVwb3J0VGltZXpvbmUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0SGVhZGVyRm9vdGVyLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50R2VvbWV0cnksIERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcsIHBhZ2VHZW9tZXRyeSB9IGZyb20gJy4uL2xheW91dCc7XG5pbXBvcnQge1xuICBERUZBVUxUX1RFWFRfQ09MT1IsIERFRkFVTFRfVEVYVF9TSVpFLCBUZXh0UGFyYWdyYXBoLCBUZXh0UnVuLCBUZXh0VG9rZW5Db250ZXh0LCB0ZXh0UGFyYWdyYXBocyxcbn0gZnJvbSAnLi4vdGV4dCc7XG5pbXBvcnQgeyByZW5kZXJDaGFydEltYWdlIH0gZnJvbSAnLi9vZmZzY3JlZW4tY2hhcnQnO1xuaW1wb3J0IHtcbiAgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRQYWdlLCBDb2xsZWN0ZWRSZXBvcnQsIGNvdmVyTGluZXMsIGVtcHR5TGFiZWwsIGV4cG9ydENlbGwsIGxpc3RDb2x1bW5zLCBsaXN0SGVhZGluZ3MsXG4gIG1vcmVSb3dzTm90aWNlLFxufSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBBIHRleHQgbGluZSdzIGhlaWdodCBhcyBhIG11bHRpcGxlIG9mIGl0cyBsYXJnZXN0IGZvbnQgc2l6ZSDigJQgdGhlIGNhbnZhc1xuLy8gc3R5bGVzaGVldCdzIGxpbmUtaGVpZ2h0LCBzbyBhIGJsb2NrIHdyYXBzIGFuZCBzdGFja3MgdGhlIHNhbWUgd2F5LlxuY29uc3QgVEVYVF9MSU5FX0hFSUdIVCA9IDEuMjU7XG5cbi8vIEhvdyBmYXIgYSBsaXN0IGl0ZW0ncyB0ZXh0IHNpdHMgZnJvbSB0aGUgYmxvY2sncyBlZGdlLCBwb2ludHM7IHRoZSBtYXJrZXJcbi8vIGhhbmdzIGluIHRoYXQgc3BhY2UuXG5jb25zdCBMSVNUX0lOREVOVCA9IDE2O1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBleHBvcnQoKS5cbi8vIFNpemVzIGFyZSBwb2ludHMuXG5pbnRlcmZhY2UgUGRmRXhwb3J0Q29udGV4dCB7XG4gIGRvYzogYW55O1xuICBhdXRvVGFibGU6IGFueTtcbiAganNQREY6IGFueTtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHBhZ2VXOiBudW1iZXI7XG4gIHBhZ2VIOiBudW1iZXI7XG4gIG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCc7XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLlxudHlwZSBQZGZDb2x1bW5TdHlsZXMgPSBSZWNvcmQ8bnVtYmVyLCB7IGNlbGxXaWR0aDogbnVtYmVyIH0+O1xuXG4vLyBBIHRhYmxlIGJvZHkgY2VsbDogcGxhaW4gdGV4dCwgb3IgYSBub3RpY2Ugcm93J3Mgb25lIGNlbGwgc3Bhbm5pbmcgZXZlcnlcbi8vIGNvbHVtbi5cbnR5cGUgUGRmVGFibGVDZWxsID0gc3RyaW5nIHwgeyBjb250ZW50OiBzdHJpbmc7IGNvbFNwYW46IG51bWJlcjsgc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuXG4vLyBUaGUgcm93cyBvZiBhIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBjYXJyaWVkIG9udG8gY29udGludWF0aW9uXG4vLyBwYWdlcyBhZnRlciBpdHMgcmVwb3J0IHBhZ2UuIHggYW5kIHcgYXJlIHRoZSBib3gncywgaW4gcG9pbnRzLCBhbmQgdGhlXG4vLyBjb2x1bW4gd2lkdGhzIGFyZSB0aGUgb25lcyB0aGUgb24tcGFnZSB0YWJsZSB3YXMgZHJhd24gd2l0aCwgc28gdGhlIHRhYmxlXG4vLyByZWFkcyBhcyBvbmUgYWNyb3NzIHBhZ2VzLlxuaW50ZXJmYWNlIFBkZlRhYmxlT3ZlcmZsb3cge1xuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgaGVhZDogc3RyaW5nW107XG4gIHJvd3M6IHN0cmluZ1tdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0KGNvbGxlY3RlZC5yZXBvcnQpO1xuXG4gICAgdGhpcy5fdGl0bGVQYWdlKGNvbnRleHQuZG9jLCBjb2xsZWN0ZWQsIGNvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUgpO1xuXG4gICAgLy8gVGhlIHBoeXNpY2FsIHBhZ2UgbnVtYmVyIHt7cGFnZS5udW1iZXJ9fSBwcmludHM6IHJlcG9ydCBwYWdlcyBhbmRcbiAgICAvLyB0aGVpciBjb250aW51YXRpb24gcGFnZXMgYWxpa2UsIHRoZSB0aXRsZSBwYWdlIG5vdCBjb3VudGVkLlxuICAgIGxldCBwYWdlTnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBjb2xsZWN0ZWRQYWdlXSBvZiBjb2xsZWN0ZWQucGFnZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSA9IFtdO1xuICAgICAgcGFnZU51bWJlciArPSAxO1xuXG4gICAgICBhd2FpdCB0aGlzLl9yZW5kZXJQYWdlKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBvdmVyZmxvd3MpO1xuXG4gICAgICAvLyBFYWNoIGNvbnRpbnVhdGlvbiBhcHBlbmRzIGl0cyBwYWdlcyBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgc29cbiAgICAgIC8vIHR3byBsaXN0cyB0aGF0IG92ZXJmbG93ZWQgb24gb25lIHBhZ2UgZm9sbG93IGl0IGJhY2sgdG8gYmFjay5cbiAgICAgIGZvciAoY29uc3Qgb3ZlcmZsb3cgb2Ygb3ZlcmZsb3dzKSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSB0aGlzLl9yZW5kZXJDb250aW51YXRpb24oY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQuZG9jLnNhdmUoYCR7dGhpcy5fc2x1Zyhjb2xsZWN0ZWQucmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRleHQocmVwb3J0OiBSZXBvcnQpOiBQcm9taXNlPFBkZkV4cG9ydENvbnRleHQ+IHtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgYXV0b1RhYmxlID0gKGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJykpLmRlZmF1bHQ7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBwYWdlVyxcbiAgICAgIHBhZ2VILFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHBhZ2VHZW9tZXRyeShyZXBvcnQsIGNvbGxlY3RlZFBhZ2UucGFnZSk7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKHJlcG9ydCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlcik7XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIHRva2Vucyk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGVkUGFnZS5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBib3ggPSBnZW9tZXRyeS5nZXQoaXRlbS5jb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoaXRlbS5jb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlclRleHQoZG9jLCBpdGVtLmNvbXBvbmVudCwgYm94ID8/IGl0ZW0uY29tcG9uZW50LCB0b2tlbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29tcG9uZW50KGNvbnRleHQsIGl0ZW0sIG92ZXJmbG93cywgYm94KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29udGV4dC5yZXBvcnQubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgICB0aGlzLl9yZW5kZXJUZXh0KGNvbnRleHQuZG9jLCBjb21wb25lbnQsIGNvbXBvbmVudCwgdG9rZW5zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90aXRsZVBhZ2UoZG9jOiBhbnksIGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0LCBwYWdlVzogbnVtYmVyLCBwYWdlSDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI4KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQoY29sbGVjdGVkLnJlcG9ydC5uYW1lLCA0MCwgcGFnZUggKiAwLjM1KTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDExKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjNTI2MDZkJyk7XG5cbiAgICBkb2MudGV4dChjb3ZlckxpbmVzKGNvbGxlY3RlZCksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIGVhY2hcbiAgLy8gcGFyYWdyYXBoJ3MgcnVucyBhcmUgYnJva2VuIGludG8gd29yZHMsIHdyYXBwZWQgdG8gdGhlIGJsb2NrJ3Mgd2lkdGggYW5kXG4gIC8vIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd24gZm9udCwgc2l6ZSBhbmQgY29sb3IuIExpbmVzIHBhc3QgdGhlXG4gIC8vIGJsb2NrJ3MgaGVpZ2h0IGFyZSBkcm9wcGVkIOKAlCB0aGUgY2FudmFzIGNsaXBzIHRoZSBibG9jayB0aGVyZSB0b28uXG4gIHByaXZhdGUgX3JlbmRlclRleHQoZG9jOiBhbnksIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBib3g6IENvbXBvbmVudEdlb21ldHJ5LCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIGNvbnN0IGxlZnQgPSBib3gueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCk7XG4gICAgY29uc3QgdG9wID0gYm94LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCk7XG4gICAgY29uc3Qgd2lkdGggPSBib3gudyAqIFBUIC0gaW5zZXQocGFkZGluZz8ubGVmdCkgLSBpbnNldChwYWRkaW5nPy5yaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gKGJveC55ICsgYm94LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pO1xuXG4gICAgbGV0IGN1cnNvclkgPSB0b3A7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgdGV4dFBhcmFncmFwaHMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKSkge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBsaW5lSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICAgIGlmIChjdXJzb3JZICsgbGluZUhlaWdodCA+IGJvdHRvbSArIDAuNSkge1xuICAgICAgICAgIGN1cnNvclkgPSBJbmZpbml0eTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gY3Vyc29yWSArIHNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgICAgICBsZXQgeCA9IGxlZnQgKyBpbmRlbnQgKyB0aGlzLl9hbGlnbk9mZnNldChwYXJhZ3JhcGguYWxpZ24sIHdpZHRoIC0gaW5kZW50LCBsaW5lV2lkdGgpO1xuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgbGVmdCwgYmFzZWxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgICAgICB4ICs9IHdvcmQud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3JZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnNvclkgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yWSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQnJlYWsgYSBwYXJhZ3JhcGgncyBydW5zIGludG8gbGluZXMgb2YgbWVhc3VyZWQgd29yZHMgdGhhdCBmaXQgdGhlIHdpZHRoLlxuICAvLyBBIHdvcmQga2VlcHMgaXRzIHRyYWlsaW5nIHNwYWNlIHNvIHNwYWNpbmcgc3Vydml2ZXMgcnVuIGJvdW5kYXJpZXMuXG4gIHByaXZhdGUgX3dyYXAoZG9jOiBhbnksIHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgd2lkdGg6IG51bWJlcik6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSB7XG4gICAgY29uc3QgbGluZXM6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IGxpbmVXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHJ1biBvZiBwYXJhZ3JhcGgucnVucykge1xuICAgICAgY29uc3Qgc2l6ZSA9IHJ1bi5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRTtcbiAgICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHNpemUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHQgb2YgcnVuLnRleHQubWF0Y2goL1xcUytcXHMqfFxccysvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0sIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCBhIHRleHQgYmxvY2sncyB0b2tlbnMgZmlsbCB3aXRoIG9uIHRoaXMgcGFnZS4gVGhlIG51bWJlciBpcyB0aGVcbiAgLy8gcGh5c2ljYWwgcGFnZSBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMsIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCDigJQgdGhlXG4gIC8vIHRpdGxlIHBhZ2UgaXMgbm90IGEgcmVwb3J0IHBhZ2UuIFRoZSBuYW1lIHN0YXlzIHRoZSByZXBvcnQgcGFnZSdzLCBzbyBhXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlIGlzIG5hbWVkIGZvciB0aGUgcGFnZSBpdHMgdGFibGUgc3RhcnRlZCBvbi5cbiAgcHJpdmF0ZSBfdG9rZW5zKHJlcG9ydDogUmVwb3J0LCBwYWdlOiBSZXBvcnRQYWdlLCBpbmRleDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcixcbiAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHJlcG9ydE5hbWU6IHJlcG9ydC5uYW1lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICAgZ2VvbWV0cnk/OiBDb21wb25lbnRHZW9tZXRyeSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29tcG9uZW50ID0gaXRlbS5jb21wb25lbnQ7XG4gICAgLy8gR2VvbWV0cnkgYXJyaXZlcyBpbiBpbmNoZXMgKGZsb3cgbGF5b3V0IHByZS1yZXNvbHZlZCk7IHRoZSBQREYgZHJhd3MgaW5cbiAgICAvLyBwb2ludHMuXG4gICAgY29uc3QgaW5jaGVzID0gZ2VvbWV0cnkgPz8gY29tcG9uZW50O1xuICAgIGNvbnN0IHggPSBpbmNoZXMueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBpbmNoZXMueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBpbmNoZXMudyAqIFBUO1xuICAgIGNvbnN0IGggPSBpbmNoZXMuaCAqIFBUO1xuXG4gICAgaWYgKGNvbXBvbmVudC50aXRsZSkge1xuICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCBjb21wb25lbnQudGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHlZID0geSArIFRJVExFX0g7XG4gICAgY29uc3QgYm9keUggPSBNYXRoLm1heCgyMCwgaCAtIFRJVExFX0gpO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEgfHwgIWl0ZW0uZGF0YS5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoZG9jLCBlbXB0eUxhYmVsKGl0ZW0pLCB4LCBib2R5WSwgdywgYm9keUgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShjb250ZXh0LCBjb21wb25lbnQsIGl0ZW0uZGF0YSwgeCwgYm9keVksIHcsIGJvZHlILCBvdmVyZmxvd3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2twaSc6XG4gICAgICAgIHRoaXMuX3JlbmRlcktwaShjb250ZXh0LCBjb21wb25lbnQsIGl0ZW0uZGF0YSwgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGJvbGQgc3RyaXAgb3ZlciBhIGNvbXBvbmVudCwgYW5kIG92ZXIgZWFjaCBvZiBpdHMgY29udGludWF0aW9uIHBhZ2VzLlxuICBwcml2YXRlIF9jb21wb25lbnRUaXRsZShkb2M6IGFueSwgdGl0bGU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodGl0bGUsIHgsIHkgKyAxMCwgeyBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEFuIGl0YWxpYyBncmV5IGxpbmUgY2VudGVyZWQgaW4gYSBjb21wb25lbnQncyBib2R5LCBmb3IgYSBib2R5IHRoYXQgaG9sZHNcbiAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gaXRzIGNvbnRlbnQuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzdiODc5NCcpO1xuICAgIGRvYy50ZXh0KHRleHQsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIG9uLXBhZ2UgdGFibGUuIEFsbCBvZiBpdHMgZmV0Y2hlZCByb3dzIGFyZSBsYWlkIG91dCBvbmNlIHRvIGxlYXJuXG4gIC8vIGhvdyBtYW55IHRoZSBib3ggaG9sZHM7IHdoZW4gdGhleSBkbyBub3QgYWxsIGZpdCwgdGhlIGJveCdzIGxhc3Qgcm93IHNheXNcbiAgLy8gdGhlIHRhYmxlIGNvbnRpbnVlcyBhbmQgdGhlIHJlc3QgZ28gdG8gb3ZlcmZsb3dzIGZvciBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgYm94IHRvbyBzaG9ydCBmb3IgZXZlbiB0aGUgaGVhZCBjYXJyaWVzIHRoZSBub3RpY2UgYXMgYSBsaW5lIGluc3RlYWQuXG4gIC8vIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoZWFkID0gbGlzdEhlYWRpbmdzKGNvbXBvbmVudCwgZGF0YSk7XG4gICAgY29uc3QgY2VsbHMgPSB0aGlzLl90YWJsZUNlbGxzKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC50aW1lem9uZSk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIGNlbGxzLCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIG5vdGljZSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIGxhc3Qgcm93IHRoYXQgZml0LCBzbyB0aGF0IHJvdyBtb3Zlc1xuICAgIC8vIHRvIHRoZSBjb250aW51YXRpb24uIG9taXR0ZWQgPiAwIG1lYW5zIGEgZnVsbCBQREZfTElTVF9ST1dTIGZldGNoLCB3aGljaFxuICAgIC8vIG5ldmVyIGZpdHMgb25lIGJveCwgc28gdGhlIENTViBub3RpY2UgYWx3YXlzIGxhbmRzIG9uIGEgY29udGludWF0aW9uXG4gICAgLy8gcGFnZS5cbiAgICBjb25zdCBrZXB0ID0gTWF0aC5tYXgoMCwgZml0IC0gMSk7XG4gICAgb3ZlcmZsb3dzLnB1c2goeyBjb21wb25lbnQsIGhlYWQsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludC5cbiAgcHJpdmF0ZSBfdGFibGVDZWxscyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZGF0YTogQ29tcG9uZW50RGF0YSwgdGltZXpvbmU6IHN0cmluZyk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEucm93cy5tYXAoKHJvdykgPT4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gZXhwb3J0Q2VsbChyb3dbY29sdW1uLmNvbHVtbl0sIGNvbHVtbi5mb3JtYXQsIHRpbWV6b25lKSkpO1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIHByaXZhdGUgX3RhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGJvZHk6IFBkZlRhYmxlQ2VsbFtdW10sXG4gICAgeDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdzogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgICBjb2x1bW5TdHlsZXM/OiBQZGZDb2x1bW5TdHlsZXMsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQ6IFtoZWFkXSxcbiAgICAgIGJvZHksXG4gICAgICBzdGFydFksXG4gICAgICBtYXJnaW46IHsgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdywgYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3LFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7IGZvbnQ6ICdoZWx2ZXRpY2EnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250U2l6ZTogOCwgY2VsbFBhZGRpbmc6IDMsIHRleHRDb2xvcjogJyMxZjI5MzMnIH0sXG4gICAgICBoZWFkU3R5bGVzOiB7IGZpbGxDb2xvcjogJyM0ZTc5YTcnLCB0ZXh0Q29sb3I6ICcjZmZmZmZmJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgIGFsdGVybmF0ZVJvd1N0eWxlczogeyBmaWxsQ29sb3I6ICcjZjVmN2ZhJyB9LFxuICAgICAgLi4uKGNvbHVtblN0eWxlcyA/IHsgY29sdW1uU3R5bGVzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgbm90aWNlIGFzIGEgdGFibGUgcm93OiBvbmUgaXRhbGljIGdyZXkgY2VsbCBzcGFubmluZyBldmVyeSBjb2x1bW4uIEFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGlzIGVsbGlwc2l6ZWQgYXQgdGhlIGJveCdzIHdpZHRoIGFuZCBrZWVwcyB0aGUgZGF0YVxuICAvLyBjZWxscycgZm9udCBzaXplIGFuZCBwYWRkaW5nLCBzbyBpdCBpcyBuZXZlciB0YWxsZXIgdGhhbiB0aGUgZGF0YSByb3dcbiAgLy8gd2hvc2UgcGxhY2UgaXQgdGFrZXMuXG4gIHByaXZhdGUgX25vdGljZVJvdyh0ZXh0OiBzdHJpbmcsIHNwYW46IG51bWJlciwgc2luZ2xlTGluZTogYm9vbGVhbik6IFBkZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICBjb2xTcGFuOiBzcGFuLFxuICAgICAgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2l0YWxpYycsIHRleHRDb2xvcjogJyM3Yjg3OTQnLCAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSkgfSxcbiAgICB9XTtcbiAgfVxuXG4gIC8vIExheXMgZXZlcnkgZmV0Y2hlZCByb3cgb3V0IG9uY2Ugb24gYSBzY3JhdGNoIGRvY3VtZW50IG9mIHRoZSBzYW1lIHBhZ2VcbiAgLy8gc2l6ZSwgd2l0aCB0aGUgb3B0aW9ucyB0aGUgcmVhbCBkcmF3IHVzZXMsIGFuZCByZWFkcyBiYWNrIGhvdyBtYW55IGJvZHlcbiAgLy8gcm93cyB0aGUgYm94J3MgcGFnZSBob2xkcyAoZml0KSBhbmQgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLlxuICAvLyBmaXQgMCBtZWFucyBub3QgZXZlbiBvbmUgYm9keSByb3cgZml0cyB1bmRlciB0aGUgaGVhZCAob3IgdGhlIGhlYWQgaXRzZWxmXG4gIC8vIGRpZCBub3QgZml0KTogYXV0b1RhYmxlIG1vdmVkIHRvIGEgbmV3IHBhZ2UgYmVmb3JlIGRyYXdpbmcuIFRoZSByZWFsIGRvY3VtZW50IGlzIHVudG91Y2hlZC5cbiAgcHJpdmF0ZSBfbWVhc3VyZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGNlbGxzOiBzdHJpbmdbXVtdLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiB7IGZpdDogbnVtYmVyOyBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyB9IHtcbiAgICBjb25zdCBzY3JhdGNoID0gbmV3IGNvbnRleHQuanNQREYoe1xuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLFxuICAgICAgb3JpZW50YXRpb246IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgfSk7XG4gICAgbGV0IGZpdCA9IDA7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShzY3JhdGNoLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSksXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoaG9vay5zZWN0aW9uID09PSAnYm9keScgJiYgc2NyYXRjaC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgZml0ID0gTWF0aC5tYXgoZml0LCBob29rLnJvdy5pbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uczogeyB3aWR0aDogbnVtYmVyIH1bXSA9IHNjcmF0Y2gubGFzdEF1dG9UYWJsZS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzID0ge307XG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICBjb2x1bW5TdHlsZXNbaW5kZXhdID0geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQSByb3cgdGFsbGVyIHRoYW4gYSB3aG9sZSBwYWdlIGlzIHNwbGl0IHJhdGhlciB0aGFuIG1vdmVkLCBzbyBhIGxhc3RcbiAgICAvLyByb3cgdGhhdCBzdGFydGVkIG9uIHRoZSBmaXJzdCBwYWdlIGNhbiBzdGlsbCBoYXZlIHJ1biBwYXN0IGl0LlxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBzY3JhdGNoLmdldE51bWJlck9mUGFnZXMoKSA+IDEpIHtcbiAgICAgIGZpdCAtPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB7IGZpdCwgY29sdW1uU3R5bGVzIH07XG4gIH1cblxuICAvLyBEcmF3cyBhbiBvbi1wYWdlIHRhYmxlLCB0aGVuIHJlbW92ZXMgYW55IHBhZ2UgdGhlIGRyYXcgYWRkZWQuIFRoYXQgc2hvdWxkXG4gIC8vIG5ldmVyIGhhcHBlbjogdGhlIG1lYXN1cmVkIGZpdCwgdGhlIGlkZW50aWNhbCBjb2x1bW4gd2lkdGhzIGFuZCBhXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBrZWVwIHRoZSB0YWJsZSBpbnNpZGUgaXRzIGJveC4gVGhlIGNoZWNrIGV4aXN0cyBzbyBhXG4gIC8vIHN0cmF5IHBhZ2UgY2FuIG5ldmVyIGNhdGNoIHRoZSByZXBvcnQgcGFnZSdzIHJlbWFpbmluZyBjb21wb25lbnRzLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCBvcHRpb25zKTtcblxuICAgIHdoaWxlIChkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpID4gcGFnZXMpIHtcbiAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGRvYy5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb2Ygb25lIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBvbiBwYWdlcyBhcHBlbmRlZCBhZnRlclxuICAvLyB0aGUgcmVwb3J0IHBhZ2UsIGVhY2ggd2l0aCB0aGUgcGFnZSdzIGhlYWRlciBhbmQgZm9vdGVyLCB0aGUgdGFibGUnc1xuICAvLyB0aXRsZSBhbmQgaXRzIGhlYWQgYWdhaW4uIFRoZSB0YWJsZSBzaXRzIENPTlRJTlVBVElPTl9HQVAgaW5zaWRlIHRoZVxuICAvLyBiYW5kcy4gUmV0dXJucyB0aGUgcGh5c2ljYWwgcGFnZSBjb3VudGVyIGFmdGVyIHRoZXNlIHBhZ2VzLlxuICBwcml2YXRlIF9yZW5kZXJDb250aW51YXRpb24oXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93OiBQZGZUYWJsZU92ZXJmbG93LFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHsgZG9jLCByZXBvcnQgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IE5PX0JBTkRTO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5oZWFkZXJIZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5mb290ZXJIZWlnaHQpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93LmhlYWQubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgbGV0IGNvdW50ZXIgPSBwYWdlTnVtYmVyO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBvdmVyZmxvdy5oZWFkLCBib2R5LCB4LCB0b3AgKyBUSVRMRV9ILCB3LCBib3R0b20sIG92ZXJmbG93LmNvbHVtblN0eWxlcyksXG4gICAgICBtYXJnaW46IHsgdG9wOiB0b3AgKyBUSVRMRV9ILCBib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcgfSxcbiAgICAgIHNob3dIZWFkOiAnZXZlcnlQYWdlJyxcbiAgICAgIC8vIEZpcmVzIG9uIGV2ZXJ5IHBhZ2UgdGhlIHRhYmxlIGRyYXdzIG9uLCB0aGUgZmlyc3QgaW5jbHVkZWQuXG4gICAgICB3aWxsRHJhd1BhZ2U6ICgpID0+IHtcbiAgICAgICAgY291bnRlciArPSAxO1xuICAgICAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgcGFnZSwgdGhpcy5fdG9rZW5zKHJlcG9ydCwgcGFnZSwgaW5kZXgsIGNvdW50ZXIpKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aGlzLl9jb250aW51ZWRUaXRsZShvdmVyZmxvdy5jb21wb25lbnQpLCB4LCB0b3AsIHcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG5cbiAgLy8gVGhlIG1hcmdpbiBhIGNvbnRpbnVhdGlvbiB0YWJsZSBrZWVwcyBmcm9tIG9uZSBlZGdlOiBpbnNpZGUgdGhlIGJhbmQgd2hlblxuICAvLyB0aGUgcGFnZSBoYXMgb25lLlxuICBwcml2YXRlIF9jb250aW51YXRpb25NYXJnaW4oYmFuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYmFuZCA/IGJhbmQgKiBQVCArIENPTlRJTlVBVElPTl9HQVAgOiBOT19CQU5EX01BUkdJTjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRpbnVlZFRpdGxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnRpdGxlID8gYCR7Y29tcG9uZW50LnRpdGxlfSAoY29udGludWVkKWAgOiAnQ29udGludWVkJztcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHJvdyA9IGRhdGEucm93c1swXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb25maWcubWVhc3VyZT8uY29sdW1uID8/IE9iamVjdC5rZXlzKHJvdylbMF07XG4gICAgY29uc3QgdmFsdWUgPSBmb3JtYXRNZWFzdXJlVmFsdWUoXG4gICAgICByb3dbY29sdW1uXSxcbiAgICAgIGNvbmZpZy5tZWFzdXJlPy5mb3JtYXQsXG4gICAgICBjb25maWcubWVhc3VyZT8ucHJlY2lzaW9uLFxuICAgICAgcmVwb3J0LnBlcmNlbnRGb3JtYXQgPT09ICdyYXRpbycsXG4gICAgKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG5cbiAgICBpZiAoY29uZmlnLm1lYXN1cmU/LmxhYmVsKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzdiODc5NCcpO1xuICAgICAgZG9jLnRleHQoY29uZmlnLm1lYXN1cmUubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NsdWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAncmVwb3J0JztcbiAgfVxufVxuIl19
735
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWxELE9BQU8sRUFDMkMsV0FBVyxFQUFFLG9CQUFvQixHQUNsRixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEQsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFDaUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQ3hHLGVBQWUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQy9HLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxHQUM1QyxNQUFNLG1DQUFtQyxDQUFDOztBQUczQyxrQ0FBa0M7QUFDbEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRWQsd0NBQXdDO0FBQ3hDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUVuQiw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLE1B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S0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUU3QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLHNFQUFzRTtJQUN0RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUscUVBQXFFO0lBQ3JFLHNCQUFzQjtJQUNkLFFBQVEsQ0FBQyxJQUFZO1FBQzNCLE9BQU8sSUFBSTthQUNSLE9BQU8sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO2FBQzVCLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUM7YUFDL0IsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUM7YUFDdkIsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUM7YUFDMUIsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQS96QlUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IHJlc29sdmVSZXBvcnRUaW1lem9uZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBLcGlDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRIZWFkZXJGb290ZXIsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBLcGlDYXJkRGVsdGEsIEtwaUNhcmRUYXJnZXQsIEtwaVNwYXJrbGluZVBvaW50LCBrcGlDYXJkVmlldywga3BpU3BhcmtsaW5lR2VvbWV0cnksXG59IGZyb20gJy4uL2twaS1jYXJkJztcbmltcG9ydCB7IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVGV4dFBhcmFncmFwaCwgVGV4dFJ1biwgVGV4dFRva2VuQ29udGV4dCwgdGV4dFBhcmFncmFwaHMsXG59IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTLCBSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUiB9IGZyb20gJy4uL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIENvbGxlY3RlZENvbXBvbmVudCwgQ29sbGVjdGVkUGFnZSwgQ29sbGVjdGVkUmVwb3J0LCBLcGlFeHBvcnRIZWlnaHRzLCBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLFxuICBleHBvcnROb3RlTGluZXMsIGV4cG9ydFRpdGxlLCBleHBvcnRXaW5kb3dzTGluZSwga3BpQ2FyZEhhc0V4dHJhcywga3BpRXhwb3J0SGVpZ2h0LCBrcGlFeHBvcnRQYXJ0cywgbGlzdENvbHVtbnMsXG4gIGxpc3RIZWFkaW5ncywgbGlzdFRvdGFsc1JvdywgbW9yZVJvd3NOb3RpY2UsXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG5cbi8vIFRoZSBzbWFsbCBwcmludCBhIGNvbXBvbmVudCBtYXkgY2FycnksIHBvaW50czogdGhlIGRheXMgaXQgcmVhZHMgdW5kZXIgaXRzXG4vLyB0aXRsZSAoYSBzdWJ0aXRsZSBsaW5lKSwgaXRzIG5vdGVzIGF0IHRoZSBmb290IG9mIGl0cyBib3ggKGEgbGluZSBlYWNoKSwgYW5kXG4vLyB0aGUgbGluZXMgb2YgYSBLUEkgY2FyZCB1bmRlciBpdHMgdmFsdWUuIEEgY2hhcnQncyBvciBhIGxpc3QncyBub3RlcyBnaXZlXG4vLyB3YXkgYmVmb3JlIGl0cyBib2R5IHdvdWxkIHNocmluayB1bmRlciBNSU5fQk9EWV9ILlxuY29uc3QgU01BTExfU0laRSA9IDcuNTtcbmNvbnN0IFNVQlRJVExFX0ggPSAxMTtcbmNvbnN0IE5PVEVfTElORV9IID0gMTA7XG5jb25zdCBNSU5fQk9EWV9IID0gNDA7XG5jb25zdCBNVVRFRF9DT0xPUiA9ICcjN2I4Nzk0JztcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9ICcjZTRlN2ViJztcbi8vIFRoZSBzcGFya2xpbmUncyB3aWRlc3QgYm94LCBpdHMgdG9wIGFuZCBib3R0b20gaW5zZXQsIGFuZCBpdHMgZG90cycgcmFkaXVzLlxuY29uc3QgS1BJX1NQQVJLTElORV9XID0gMTQwO1xuY29uc3QgS1BJX1NQQVJLTElORV9JTlNFVCA9IDM7XG5jb25zdCBLUElfRE9UX1IgPSAxLjU7XG5cbi8vIFJvd3MgZmV0Y2hlZCBmb3IgYSBsaXN0J3MgUERGIHRhYmxlLiBBIHRhYmxlIHRoYXQgb3V0Z3Jvd3MgaXRzIGJveFxuLy8gY29udGludWVzIG9udG8gcGFnZXMgb2YgaXRzIG93biwgc28gdGhpcyBpcyBob3cgZmFyIGl0IG1heSBydW46IGFib3V0IDEyLTE1XG4vLyBjb250aW51YXRpb24gcGFnZXMgb24gYSBsZXR0ZXIgcGFnZSwgYW5kIGEgdGVudGggb2YgdGhlIHNlcnZlcidzIDUwMDAtcm93XG4vLyBjZWlsaW5nLiBBIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIG1vcmVSb3dzTm90aWNlKCkgcm93LlxuZXhwb3J0IGNvbnN0IFBERl9MSVNUX1JPV1MgPSA1MDA7XG5cbi8vIEhvdyBmYXIgYSBjb250aW51YXRpb24gdGFibGUgc2l0cyBpbnNpZGUgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGJhbmRzLFxuLy8gcG9pbnRzLiBBIHBhZ2Ugd2l0aCBubyBiYW5kIChvciB3aXRoIHRoZSBtYXN0ZXIgaGlkZGVuKSBrZWVwc1xuLy8gTk9fQkFORF9NQVJHSU4gZnJvbSB0aGF0IGVkZ2UgaW5zdGVhZC5cbmNvbnN0IENPTlRJTlVBVElPTl9HQVAgPSAwLjI1ICogUFQ7XG5jb25zdCBOT19CQU5EX01BUkdJTiA9IDAuNSAqIFBUO1xuY29uc3QgTk9fQkFORFM6IFJlcG9ydEhlYWRlckZvb3RlciA9IHsgaGVhZGVySGVpZ2h0OiAwLCBmb290ZXJIZWlnaHQ6IDAgfTtcblxuLy8gVGhlIGxhc3Qgcm93IG9mIGEgbGlzdCBib3ggd2hvc2Ugcm93cyBjYXJyeSBvbiBwYXN0IGl0LlxuY29uc3QgQ09OVElOVUVEX05PVElDRSA9ICdDb250aW51ZWQgb24gdGhlIGZvbGxvd2luZyBwYWdlcyc7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgZXZlcnkgZHJhd2luZyBzdGVwIG9mIG9uZSBleHBvcnQgc2hhcmVzLCBidWlsdCBvbmNlIGluIGV4cG9ydCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICBqc1BERjogYW55O1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbiAgcGFnZVc6IG51bWJlcjtcbiAgcGFnZUg6IG51bWJlcjtcbiAgb3JpZW50YXRpb246ICdsYW5kc2NhcGUnIHwgJ3BvcnRyYWl0Jztcbn1cblxuLy8gRml4ZWQgY29sdW1uIHdpZHRocywgYnkgY29sdW1uIGluZGV4LCBpbiBwb2ludHMsIGFuZCB0aGUgcmlnaHQgYWxpZ25tZW50IG9mXG4vLyBhIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycy5cbnR5cGUgUGRmQ29sdW1uU3R5bGVzID0gUmVjb3JkPG51bWJlciwgeyBjZWxsV2lkdGg6IG51bWJlcjsgaGFsaWduPzogJ3JpZ2h0JyB9PjtcblxuLy8gQSB0YWJsZSBib2R5IGNlbGw6IHBsYWluIHRleHQsIG9yIGEgbm90aWNlIHJvdydzIG9uZSBjZWxsIHNwYW5uaW5nIGV2ZXJ5XG4vLyBjb2x1bW4uXG50eXBlIFBkZlRhYmxlQ2VsbCA9IHN0cmluZyB8IHsgY29udGVudDogc3RyaW5nOyBjb2xTcGFuOiBudW1iZXI7IHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuLy8gVGhlIHJvd3Mgb2YgYSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgY2FycmllZCBvbnRvIGNvbnRpbnVhdGlvblxuLy8gcGFnZXMgYWZ0ZXIgaXRzIHJlcG9ydCBwYWdlLiB4IGFuZCB3IGFyZSB0aGUgYm94J3MsIGluIHBvaW50cywgYW5kIHRoZVxuLy8gY29sdW1uIHdpZHRocyBhbmQgYWxpZ25tZW50cyBhcmUgdGhlIG9uZXMgdGhlIG9uLXBhZ2UgdGFibGUgd2FzIGRyYXduIHdpdGgsXG4vLyBzbyB0aGUgdGFibGUgcmVhZHMgYXMgb25lIGFjcm9zcyBwYWdlcy5cbmludGVyZmFjZSBQZGZUYWJsZU92ZXJmbG93IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIFRoZSB0ZXh0IHRoZSBsaXN0IHdhcyBzZWFyY2hlZCBieSwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgaGVhZDogc3RyaW5nW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgcm93czogc3RyaW5nW11bXTtcbiAgb21pdHRlZDogbnVtYmVyO1xuICAvLyBUaGUgbGlzdCdzIHRvdGFscyByb3csIHdoaWNoIGNsb3NlcyB0aGUgbGFzdCBjb250aW51YXRpb24gcGFnZS5cbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICB4OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG59XG5cbi8vIEJ1aWxkcyB0aGUgUERGIGNsaWVudC1zaWRlIHdpdGgganNwZGYuIFRoZSByZXBvcnQncyB1bml0IGlzIGluY2hlcyBhbmQgUERGc1xuLy8gYXJlIHBvaW50cyBhdCBleGFjdGx5IDcyL2luY2gsIHNvIGVhY2ggcmVwb3J0IHBhZ2UgYmVjb21lcyBvbmUgUERGIHBhZ2Ugb2Zcbi8vIHRoZSBleGFjdCBwaHlzaWNhbCBzaXplIGFuZCBjb21wb25lbnRzIGxhbmQgYXQgdGhlaXIgcHJlY2lzZSBwb3NpdGlvbnMuXG4vLyBDaGFydHMgYXJlIHJlbmRlcmVkIHRocm91Z2ggYW4gb2Zmc2NyZWVuIEVDaGFydHMgaW5zdGFuY2UgYXQgM8OXIHBpeGVsXG4vLyByYXRpbyDigJQgcGl4ZWwtaWRlbnRpY2FsIHRvIHRoZSBzY3JlZW4sIGNyaXNwIGF0IHByaW50IHNpemUg4oCUIGFuZCB0YWJsZXMgYXJlXG4vLyBkcmF3biB3aXRoIGpzcGRmLWF1dG90YWJsZS4gQm90aCBsaWJyYXJpZXMgbG9hZCBsYXppbHkgaW50byB0aGVpciBvd24gY2h1bmtzLlxuLy9cbi8vIEEgbGlzdCB0YWJsZSBpcyBmaXR0ZWQgdG8gaXRzIGJveCBieSBsYXlpbmcgaXQgb3V0IGZpcnN0LCBuZXZlciBieSBhXG4vLyByb3ctaGVpZ2h0IGVzdGltYXRlLCBzbyBpdCBjYW5ub3Qgc3BpbGwgcGFzdCB0aGUgYm94LiBUaGUgcm93cyB0aGF0IGRvIG5vdFxuLy8gZml0IGNvbnRpbnVlIG9uIHBhZ2VzIG9mIHRoZWlyIG93biBhZnRlciB0aGUgcmVwb3J0IHBhZ2UsIHVuZGVyIHRoZSBzYW1lXG4vLyBoZWFkZXIvZm9vdGVyIGFuZCB3aXRoIHRoZSBzYW1lIGNvbHVtbiB3aWR0aHMsIHVwIHRvIFBERl9MSVNUX1JPV1M7IGFcbi8vIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIHJvdyBwb2ludGluZyB0byB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgYXV0b1RhYmxlID0gKGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJykpLmRlZmF1bHQ7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBmb3JtYXRDb250ZXh0OiBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dCxcbiAgICAgIHBhZ2VXLFxuICAgICAgcGFnZUgsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLy8gT25lIHJlcG9ydCBwYWdlOiB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZmlyc3QsIHVuZGVyIHRoZSBwYWdlJ3Mgb3duXG4gIC8vIGNvbXBvbmVudHMuIEEgbGlzdCB0aGF0IG91dGdyb3dzIGl0cyBib3ggbGVhdmVzIGl0cyByZW1haW5pbmcgcm93cyBpblxuICAvLyBvdmVyZmxvd3MuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlclBhZ2UoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb2xsZWN0ZWRQYWdlOiBDb2xsZWN0ZWRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX3Rva2VucyhyZXBvcnQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIpO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLl9yZW5kZXJUZXh0KGRvYywgaXRlbS5jb21wb25lbnQsIHRva2Vucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgb3ZlcmZsb3dzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29udGV4dC5yZXBvcnQubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKSB7XG4gICAgICB0aGlzLl9yZW5kZXJUZXh0KGNvbnRleHQuZG9jLCBjb21wb25lbnQsIHRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIGVhY2hcbiAgLy8gcGFyYWdyYXBoJ3MgcnVucyBhcmUgYnJva2VuIGludG8gd29yZHMsIHdyYXBwZWQgdG8gdGhlIGJsb2NrJ3Mgd2lkdGggYW5kXG4gIC8vIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd24gZm9udCwgc2l6ZSBhbmQgY29sb3IuIExpbmVzIHBhc3QgdGhlXG4gIC8vIGJsb2NrJ3MgaGVpZ2h0IGFyZSBkcm9wcGVkIOKAlCB0aGUgY2FudmFzIGNsaXBzIHRoZSBibG9jayB0aGVyZSB0b28uXG4gIHByaXZhdGUgX3JlbmRlclRleHQoZG9jOiBhbnksIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIGNvbnN0IGxlZnQgPSBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCk7XG4gICAgY29uc3QgdG9wID0gY29tcG9uZW50LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCk7XG4gICAgY29uc3Qgd2lkdGggPSBjb21wb25lbnQudyAqIFBUIC0gaW5zZXQocGFkZGluZz8ubGVmdCkgLSBpbnNldChwYWRkaW5nPy5yaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gKGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pO1xuXG4gICAgbGV0IGN1cnNvclkgPSB0b3A7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgdGV4dFBhcmFncmFwaHMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKSkge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBsaW5lSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICAgIGlmIChjdXJzb3JZICsgbGluZUhlaWdodCA+IGJvdHRvbSArIDAuNSkge1xuICAgICAgICAgIGN1cnNvclkgPSBJbmZpbml0eTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gY3Vyc29yWSArIHNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgICAgICBsZXQgeCA9IGxlZnQgKyBpbmRlbnQgKyB0aGlzLl9hbGlnbk9mZnNldChwYXJhZ3JhcGguYWxpZ24sIHdpZHRoIC0gaW5kZW50LCBsaW5lV2lkdGgpO1xuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgbGVmdCwgYmFzZWxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgICAgICB4ICs9IHdvcmQud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3JZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnNvclkgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yWSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQnJlYWsgYSBwYXJhZ3JhcGgncyBydW5zIGludG8gbGluZXMgb2YgbWVhc3VyZWQgd29yZHMgdGhhdCBmaXQgdGhlIHdpZHRoLlxuICAvLyBBIHdvcmQga2VlcHMgaXRzIHRyYWlsaW5nIHNwYWNlIHNvIHNwYWNpbmcgc3Vydml2ZXMgcnVuIGJvdW5kYXJpZXMuXG4gIHByaXZhdGUgX3dyYXAoZG9jOiBhbnksIHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgd2lkdGg6IG51bWJlcik6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSB7XG4gICAgY29uc3QgbGluZXM6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IGxpbmVXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHJ1biBvZiBwYXJhZ3JhcGgucnVucykge1xuICAgICAgY29uc3Qgc2l6ZSA9IHJ1bi5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRTtcbiAgICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHNpemUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHQgb2YgcnVuLnRleHQubWF0Y2goL1xcUytcXHMqfFxccysvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0sIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCBhIHRleHQgYmxvY2sncyB0b2tlbnMgZmlsbCB3aXRoIG9uIHRoaXMgcGFnZS4gVGhlIG51bWJlciBpcyB0aGVcbiAgLy8gcGh5c2ljYWwgcGFnZSBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMsIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCDigJQgdGhlXG4gIC8vIHRpdGxlIHBhZ2UgaXMgbm90IGEgcmVwb3J0IHBhZ2UuIFRoZSBuYW1lIHN0YXlzIHRoZSByZXBvcnQgcGFnZSdzLCBzbyBhXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlIGlzIG5hbWVkIGZvciB0aGUgcGFnZSBpdHMgdGFibGUgc3RhcnRlZCBvbi5cbiAgcHJpdmF0ZSBfdG9rZW5zKHJlcG9ydDogUmVwb3J0LCBwYWdlOiBSZXBvcnRQYWdlLCBpbmRleDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcixcbiAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHJlcG9ydE5hbWU6IHJlcG9ydC5uYW1lLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGlzIHN0b3JlZCBpbiBpbmNoZXM7IHRoZSBQREYgZHJhd3MgaW4gcG9pbnRzLlxuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIGl0ZW0uc2VhcmNoKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCAhaXRlbS5kYXRhLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFibGUoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlILCBvdmVyZmxvd3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2twaSc6XG4gICAgICAgIHRoaXMuX3JlbmRlcktwaShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgbGluZSBvZiBzbWFsbCBncmV5IHByaW50LCBjdXQgdG8gdGhlIHdpZHRoIHdpdGggYW4gZWxsaXBzaXM6IGFcbiAgLy8gc3VidGl0bGUsIGEgbm90ZSBvciBhIGxpbmUgb2YgYSBLUEkgY2FyZC4geSBpcyB0aGUgbGluZSdzIHRvcDsgdGhlIGxpbmUgaXNcbiAgLy8gTk9URV9MSU5FX0ggdGFsbC5cbiAgcHJpdmF0ZSBfc21hbGxMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLFxuICAgIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyxcbiAgICBzdHlsZTogJ25vcm1hbCcgfCAnaXRhbGljJyxcbiAgKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoU01BTExfU0laRSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGV4dCwgdyksIGFsaWduID09PSAnY2VudGVyJyA/IHggKyB3IC8gMiA6IHgsIHkgKyBTTUFMTF9TSVpFLCB7IGFsaWduIH0pO1xuICB9XG5cbiAgLy8gVGhlIHRleHQsIGVsbGlwc2l6ZWQgdG8gdGhlIHdpZHRoIGluIHRoZSBkb2MncyBjdXJyZW50IGZvbnQuXG4gIHByaXZhdGUgX2ZpdChkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jLmdldFRleHRXaWR0aCh0ZXh0KSA8PSB3aWR0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGN1dCA9IHRleHQ7XG4gICAgd2hpbGUgKGN1dC5sZW5ndGggPiAxICYmIGRvYy5nZXRUZXh0V2lkdGgoYCR7Y3V0feKApmApID4gd2lkdGgpIHtcbiAgICAgIGN1dCA9IGN1dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2N1dC50cmltRW5kKCl94oCmYDtcbiAgfVxuXG4gIC8vIFRoZSBib2xkIHN0cmlwIG92ZXIgYSBjb21wb25lbnQsIGFuZCBvdmVyIGVhY2ggb2YgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgcHJpdmF0ZSBfY29tcG9uZW50VGl0bGUoZG9jOiBhbnksIHRpdGxlOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHRpdGxlLCB4LCB5ICsgMTAsIHsgbWF4V2lkdGg6IHcgfSk7XG4gIH1cblxuICAvLyBBbiBpdGFsaWMgZ3JleSBsaW5lIGNlbnRlcmVkIGluIGEgY29tcG9uZW50J3MgYm9keSwgZm9yIGEgYm9keSB0aGF0IGhvbGRzXG4gIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuIGl0cyBjb250ZW50LlxuICBwcml2YXRlIF9ib3hOb3RlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnaXRhbGljJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM3Yjg3OTQnKTtcbiAgICBkb2MudGV4dCh0ZXh0LCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gIH1cblxuICAvLyBBIGxpc3QncyBvbi1wYWdlIHRhYmxlLiBBbGwgb2YgaXRzIGZldGNoZWQgcm93cyBhcmUgbGFpZCBvdXQgb25jZSB0byBsZWFyblxuICAvLyBob3cgbWFueSB0aGUgYm94IGhvbGRzOyB3aGVuIHRoZXkgZG8gbm90IGFsbCBmaXQsIHRoZSBib3gncyBsYXN0IHJvdyBzYXlzXG4gIC8vIHRoZSB0YWJsZSBjb250aW51ZXMgYW5kIHRoZSByZXN0IGdvIHRvIG92ZXJmbG93cyBmb3IgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGJveCB0b28gc2hvcnQgZm9yIGV2ZW4gdGhlIGhlYWQgY2FycmllcyB0aGUgbm90aWNlIGFzIGEgbGluZSBpbnN0ZWFkLlxuICAvLyBBIHRvdGFscyByb3cgY2xvc2VzIHRoZSB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsXG4gIC8vIGVsc2UgYWZ0ZXIgdGhlIGxhc3QgY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9ID0gaXRlbTtcbiAgICBjb25zdCBkYXRhID0gaXRlbS5kYXRhIGFzIENvbXBvbmVudERhdGE7XG4gICAgY29uc3QgaGVhZCA9IGxpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpXG4gICAgICAubWFwKChoZWFkaW5nKSA9PiB0aGlzLl9wZGZUZXh0KGhlYWRpbmcpKTtcbiAgICBjb25zdCB7IGNlbGxzLCBudW1lcmljLCBmb290IH0gPSB0aGlzLl90YWJsZUNlbGxzKGNvbnRleHQsIGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBub3RpY2UgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBsYXN0IHJvdyB0aGF0IGZpdCwgc28gdGhhdCByb3cgbW92ZXNcbiAgICAvLyB0byB0aGUgY29udGludWF0aW9uLiBvbWl0dGVkID4gMCBtZWFucyBhIGZ1bGwgUERGX0xJU1RfUk9XUyBmZXRjaCwgd2hpY2hcbiAgICAvLyBuZXZlciBmaXRzIG9uZSBib3gsIHNvIHRoZSBDU1Ygbm90aWNlIGFsd2F5cyBsYW5kcyBvbiBhIGNvbnRpbnVhdGlvblxuICAgIC8vIHBhZ2UuXG4gICAgY29uc3Qga2VwdCA9IE1hdGgubWF4KDAsIGZpdCAtIDEpO1xuICAgIG92ZXJmbG93cy5wdXNoKHsgY29tcG9uZW50LCBzZWFyY2gsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgYm9keTogUGRmVGFibGVDZWxsW11bXSxcbiAgICB4OiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICAgIGNvbHVtblN0eWxlcz86IFBkZkNvbHVtblN0eWxlcyxcbiAgICBmb290Pzogc3RyaW5nW10gfCBudWxsLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkOiBbaGVhZF0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczogeyBmb250OiAnaGVsdmV0aWNhJywgZm9udFN0eWxlOiAnbm9ybWFsJywgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiAnIzdiODc5NCcsXG4gICAgICAgIGhhbGlnbjogJ2xlZnQnLFxuICAgICAgICAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSksXG4gICAgICB9LFxuICAgIH1dO1xuICB9XG5cbiAgLy8gTGF5cyBldmVyeSBmZXRjaGVkIHJvdyBvdXQgb25jZSBvbiBhIHNjcmF0Y2ggZG9jdW1lbnQgb2YgdGhlIHNhbWUgcGFnZVxuICAvLyBzaXplLCB3aXRoIHRoZSBvcHRpb25zIHRoZSByZWFsIGRyYXcgdXNlcywgYW5kIHJlYWRzIGJhY2sgaG93IG1hbnkgYm9keVxuICAvLyByb3dzIHRoZSBib3gncyBwYWdlIGhvbGRzIChmaXQpIGFuZCB0aGUgY29sdW1uIHdpZHRocyBhdXRvVGFibGUgY2hvc2UsXG4gIC8vIHdpdGggZWFjaCBudW1lcmljIGNvbHVtbidzIHJpZ2h0IGFsaWdubWVudCBtZXJnZWQgaW4sIHNvIHRoZSBvbi1wYWdlXG4gIC8vIHRhYmxlIGFuZCBpdHMgY29udGludWF0aW9uIHBhZ2VzIGNhcnJ5IGJvdGguIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0XG4gIC8vIHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LCBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZVxuICAvLyB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lXG4gIC8vIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQgKG9yIHRoZSBoZWFkIGl0c2VsZiBkaWQgbm90IGZpdCk6IGF1dG9UYWJsZVxuICAvLyBtb3ZlZCB0byBhIG5ldyBwYWdlIGJlZm9yZSBkcmF3aW5nLiBUaGUgcmVhbCBkb2N1bWVudCBpcyB1bnRvdWNoZWQuXG4gIHByaXZhdGUgX21lYXN1cmUoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBjZWxsczogc3RyaW5nW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgZm9vdDogc3RyaW5nW10gfCBudWxsLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiB7IGZpdDogbnVtYmVyOyBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyB9IHtcbiAgICBjb25zdCBzY3JhdGNoID0gbmV3IGNvbnRleHQuanNQREYoe1xuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLFxuICAgICAgb3JpZW50YXRpb246IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgfSk7XG4gICAgbGV0IGZpdCA9IDA7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShzY3JhdGNoLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgdW5kZWZpbmVkLCBmb290KSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmIChob29rLnNlY3Rpb24gPT09ICdib2R5JyAmJiBzY3JhdGNoLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgPT09IDEpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IHdpZHRoOiBudW1iZXIgfVtdID0gc2NyYXRjaC5sYXN0QXV0b1RhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSBudW1lcmljW2luZGV4XVxuICAgICAgICA/IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGgsIGhhbGlnbjogJ3JpZ2h0JyB9XG4gICAgICAgIDogeyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQSByb3cgdGFsbGVyIHRoYW4gYSB3aG9sZSBwYWdlIGlzIHNwbGl0IHJhdGhlciB0aGFuIG1vdmVkLCBzbyBhIGxhc3RcbiAgICAvLyByb3cgdGhhdCBzdGFydGVkIG9uIHRoZSBmaXJzdCBwYWdlIGNhbiBzdGlsbCBoYXZlIHJ1biBwYXN0IGl0LlxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBzY3JhdGNoLmdldE51bWJlck9mUGFnZXMoKSA+IDEpIHtcbiAgICAgIGZpdCAtPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB7IGZpdCwgY29sdW1uU3R5bGVzIH07XG4gIH1cblxuICAvLyBEcmF3cyBhbiBvbi1wYWdlIHRhYmxlLCB0aGVuIHJlbW92ZXMgYW55IHBhZ2UgdGhlIGRyYXcgYWRkZWQuIFRoYXQgc2hvdWxkXG4gIC8vIG5ldmVyIGhhcHBlbjogdGhlIG1lYXN1cmVkIGZpdCwgdGhlIGlkZW50aWNhbCBjb2x1bW4gd2lkdGhzIGFuZCBhXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBrZWVwIHRoZSB0YWJsZSBpbnNpZGUgaXRzIGJveC4gVGhlIGNoZWNrIGV4aXN0cyBzbyBhXG4gIC8vIHN0cmF5IHBhZ2UgY2FuIG5ldmVyIGNhdGNoIHRoZSByZXBvcnQgcGFnZSdzIHJlbWFpbmluZyBjb21wb25lbnRzLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCBvcHRpb25zKTtcblxuICAgIHdoaWxlIChkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpID4gcGFnZXMpIHtcbiAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGRvYy5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb2Ygb25lIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBvbiBwYWdlcyBhcHBlbmRlZCBhZnRlclxuICAvLyB0aGUgcmVwb3J0IHBhZ2UsIGVhY2ggd2l0aCB0aGUgcGFnZSdzIGhlYWRlciBhbmQgZm9vdGVyLCB0aGUgdGFibGUnc1xuICAvLyB0aXRsZSBhbmQgaXRzIGhlYWQgYWdhaW4uIFRoZSB0YWJsZSBzaXRzIENPTlRJTlVBVElPTl9HQVAgaW5zaWRlIHRoZVxuICAvLyBiYW5kcy4gUmV0dXJucyB0aGUgcGh5c2ljYWwgcGFnZSBjb3VudGVyIGFmdGVyIHRoZXNlIHBhZ2VzLlxuICBwcml2YXRlIF9yZW5kZXJDb250aW51YXRpb24oXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93OiBQZGZUYWJsZU92ZXJmbG93LFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHsgZG9jLCByZXBvcnQgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogcmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IE5PX0JBTkRTO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5oZWFkZXJIZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5mb290ZXJIZWlnaHQpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93LmhlYWQubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgbGV0IGNvdW50ZXIgPSBwYWdlTnVtYmVyO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhcbiAgICAgICAgY29udGV4dCwgb3ZlcmZsb3cuaGVhZCwgb3ZlcmZsb3cubnVtZXJpYywgYm9keSwgeCwgdG9wICsgVElUTEVfSCwgdywgYm90dG9tLCBvdmVyZmxvdy5jb2x1bW5TdHlsZXMsXG4gICAgICAgIG92ZXJmbG93LmZvb3QsXG4gICAgICApLFxuICAgICAgbWFyZ2luOiB7IHRvcDogdG9wICsgVElUTEVfSCwgYm90dG9tLCBsZWZ0OiB4LCByaWdodDogY29udGV4dC5wYWdlVyAtIHggLSB3IH0sXG4gICAgICBzaG93SGVhZDogJ2V2ZXJ5UGFnZScsXG4gICAgICAvLyBGaXJlcyBvbiBldmVyeSBwYWdlIHRoZSB0YWJsZSBkcmF3cyBvbiwgdGhlIGZpcnN0IGluY2x1ZGVkLlxuICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgIGNvdW50ZXIgKz0gMTtcbiAgICAgICAgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIHBhZ2UsIHRoaXMuX3Rva2VucyhyZXBvcnQsIHBhZ2UsIGluZGV4LCBjb3VudGVyKSk7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGhpcy5fY29udGludWVkVGl0bGUob3ZlcmZsb3cuY29tcG9uZW50LCBvdmVyZmxvdy5zZWFyY2gpLCB4LCB0b3AsIHcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG5cbiAgLy8gVGhlIG1hcmdpbiBhIGNvbnRpbnVhdGlvbiB0YWJsZSBrZWVwcyBmcm9tIG9uZSBlZGdlOiBpbnNpZGUgdGhlIGJhbmQgd2hlblxuICAvLyB0aGUgcGFnZSBoYXMgb25lLlxuICBwcml2YXRlIF9jb250aW51YXRpb25NYXJnaW4oYmFuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYmFuZCA/IGJhbmQgKiBQVCArIENPTlRJTlVBVElPTl9HQVAgOiBOT19CQU5EX01BUkdJTjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRpbnVlZFRpdGxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzZWFyY2g/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCBzZWFyY2gpO1xuXG4gICAgcmV0dXJuIHRpdGxlID8gYCR7dGl0bGV9IChjb250aW51ZWQpYCA6ICdDb250aW51ZWQnO1xuICB9XG5cbiAgLy8gQSBLUEkgdGlsZTogdGhlIGNhcmQgdGhlIHNjcmVlbiBkcmF3cyAoa3BpLWNhcmQudHMgZGVjaWRlcyBldmVyeSBsaW5lKSxcbiAgLy8gc3RhY2tlZCBhbmQgY2VudGVyZWQgaW4gdGhlIGJvZHkuIEEgY2FyZCB3aXRoIG9ubHkgaXRzIHZhbHVlIGFuZCBsYWJlbFxuICAvLyBrZWVwcyB0aGUgdGlsZSdzIGxvbmctc3RhbmRpbmcgbGF5b3V0LlxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjb25maWcgPSBpdGVtLmNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHZpZXcgPSBrcGlDYXJkVmlldyhjb25maWcsIGl0ZW0uZGF0YSwgeyBmb3JtYXQ6IGNvbnRleHQuZm9ybWF0Q29udGV4dCwgdGltZXpvbmU6IGNvbnRleHQudGltZXpvbmUgfSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZGZUZXh0KHZpZXcudmFsdWUpO1xuICAgIGNvbnN0IG5vdGVzID0gZXhwb3J0Tm90ZUxpbmVzKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUpO1xuXG4gICAgaWYgKCFrcGlDYXJkSGFzRXh0cmFzKHZpZXcsIG5vdGVzKSkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoMjYpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICAgIGRvYy50ZXh0KHZpZXcubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPSBrcGlFeHBvcnRQYXJ0cyh2aWV3LCBub3RlcywgaCwgS1BJX0hFSUdIVFMpO1xuICAgIGxldCB0b3AgPSB5ICsgTWF0aC5tYXgoMCwgKGggLSBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIEtQSV9IRUlHSFRTKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHRvcCArIEtQSV9WQUxVRV9CQVNFTElORSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgdG9wICs9IEtQSV9IRUlHSFRTLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgIGRvYy50ZXh0KHRoaXMuX2ZpdChkb2MsIHRoaXMuX3BkZlRleHQodmlldy5sYWJlbCksIHcpLCB4ICsgdyAvIDIsIHRvcCArIDksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgdG9wICs9IEtQSV9IRUlHSFRTLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnKTtcbiAgICAgIHRvcCArPSBLUElfSEVJR0hUUy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5zcGFya2xpbmUgJiYgdmlldy5zcGFya2xpbmUpIHtcbiAgICAgIHRoaXMuX2twaVNwYXJrbGluZShkb2MsIHZpZXcuc3BhcmtsaW5lLnZhbHVlcywgdmlldy5zcGFya2xpbmUucGFydGlhbCwgeCwgdG9wLCB3KTtcbiAgICAgIHRvcCArPSBLUElfSEVJR0hUUy5zcGFya2xpbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHBhcnRzLm5vdGVzKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnaXRhbGljJyk7XG4gICAgICB0b3AgKz0gS1BJX0hFSUdIVFMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1tkZWx0YS50b25lXX1gO1xuICAgIGNvbnN0IGNoYW5nZSA9IHRoaXMuX3BkZlRleHQoZGVsdGEudGV4dCk7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBLUElfQVJST1cgKyBLUElfQVJST1dfR0FQO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKEtQSV9ERUxUQV9TSVpFKTtcbiAgICBjb25zdCBjaGFuZ2VXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoY2hhbmdlKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgY29uc3QgY29tcGFyZWQgPSBkZWx0YS5jb21wYXJlZFxuICAgICAgPyB0aGlzLl9maXQoZG9jLCBgICR7dGhpcy5fcGRmVGV4dChkZWx0YS5jb21wYXJlZCl9YCwgTWF0aC5tYXgoMCwgdyAtIGFycm93IC0gY2hhbmdlV2lkdGgpKVxuICAgICAgOiAnJztcbiAgICBjb25zdCB3aWR0aCA9IGFycm93ICsgY2hhbmdlV2lkdGggKyAoY29tcGFyZWQgPyBkb2MuZ2V0VGV4dFdpZHRoKGNvbXBhcmVkKSA6IDApO1xuICAgIGNvbnN0IGJhc2VsaW5lID0gdG9wICsgS1BJX0RFTFRBX1NJWkU7XG4gICAgbGV0IGxlZnQgPSB4ICsgTWF0aC5tYXgoMCwgKHcgLSB3aWR0aCkgLyAyKTtcblxuICAgIGlmIChhcnJvdykge1xuICAgICAgY29uc3QgdXAgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuVXA7XG4gICAgICBjb25zdCB0aXAgPSB1cCA/IGJhc2VsaW5lIC0gS1BJX0FSUk9XIDogYmFzZWxpbmU7XG4gICAgICBjb25zdCBiYXNlID0gdXAgPyBiYXNlbGluZSA6IGJhc2VsaW5lIC0gS1BJX0FSUk9XO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgS1BJX0FSUk9XLCBiYXNlLCBsZWZ0ICsgS1BJX0FSUk9XIC8gMiwgdGlwLCAnRicpO1xuICAgICAgbGVmdCArPSBhcnJvdztcbiAgICB9XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKGNvbG9yKTtcbiAgICBkb2MudGV4dChjaGFuZ2UsIGxlZnQsIGJhc2VsaW5lKTtcblxuICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQoY29tcGFyZWQsIGxlZnQgKyBjaGFuZ2VXaWR0aCwgYmFzZWxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgbGluZSAoJ0dvYWw6ICQxLDAwMCDCtyA1NiUgb2YgdGFyZ2V0JykgYW5kLCB3aGVuIHRoZSBzZXJ2ZXIgc2VudFxuICAvLyB0aGUgcHJvZ3Jlc3MsIGEgYmFyIGZpbGxlZCB0aGF0IGZhcjogZ3JlZW4gb25jZSB0aGUgdGFyZ2V0IGlzIG1ldC5cbiAgcHJpdmF0ZSBfa3BpVGFyZ2V0KGRvYzogYW55LCB0YXJnZXQ6IEtwaUNhcmRUYXJnZXQsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSB0YXJnZXQucHJvZ3Jlc3MgPyBgJHt0YXJnZXQudGV4dH0gwrcgJHt0YXJnZXQucHJvZ3Jlc3N9YCA6IHRhcmdldC50ZXh0O1xuXG4gICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh0ZXh0KSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ25vcm1hbCcpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVyA9IE1hdGgubWluKHcgKiAwLjYsIEtQSV9CQVJfVyk7XG4gICAgY29uc3QgYmFyWCA9IHggKyAodyAtIGJhclcpIC8gMjtcbiAgICBjb25zdCBiYXJZID0gdG9wICsgTk9URV9MSU5FX0ggKyAxO1xuXG4gICAgZG9jLnNldEZpbGxDb2xvcihLUElfVFJBQ0tfQ09MT1IpO1xuICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcsIEtQSV9CQVJfSCwgJ0YnKTtcblxuICAgIGlmICh0YXJnZXQuZmlsbCA+IDApIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoYCMke1JFUE9SVF9LUElfQ0hBTkdFX0NPTE9SU1t0YXJnZXQudG9uZV19YCk7XG4gICAgICBkb2MucmVjdChiYXJYLCBiYXJZLCBiYXJXICogdGFyZ2V0LmZpbGwsIEtQSV9CQVJfSCwgJ0YnKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgc3BhcmtsaW5lIGluIGEgYm94IHVuZGVyIHRoZSBjYXJkJ3MgbGluZXMsIGFzIHRoZSBzY3JlZW4gZHJhd3MgaXRcbiAgLy8gKGtwaVNwYXJrbGluZUdlb21ldHJ5LCBhIDAtMTAwIGJveCk6IGEgdmVjdG9yIGxpbmUgcGVyIHJ1biBvZiB2YWx1ZXMsIGFcbiAgLy8gZG90IGZvciBhIGxvbmUgdmFsdWUsIGFuZCB0aGUgbGFzdCBwb2ludCdzIG1hcmtlciwgaG9sbG93IHdoaWxlIGl0cyBwZXJpb2RcbiAgLy8gaXMgcGFydGlhbC5cbiAgcHJpdmF0ZSBfa3BpU3BhcmtsaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHZhbHVlczogKG51bWJlciB8IG51bGwpW10sXG4gICAgcGFydGlhbDogYm9vbGVhbixcbiAgICB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0ga3BpU3BhcmtsaW5lR2VvbWV0cnkodmFsdWVzLCBwYXJ0aWFsKTtcbiAgICBjb25zdCBib3hXID0gTWF0aC5taW4odyAqIDAuNywgS1BJX1NQQVJLTElORV9XKTtcbiAgICBjb25zdCBib3hIID0gS1BJX0hFSUdIVFMuc3BhcmtsaW5lIC0gMiAqIEtQSV9TUEFSS0xJTkVfSU5TRVQ7XG4gICAgY29uc3QgbGVmdCA9IHggKyAodyAtIGJveFcpIC8gMjtcbiAgICBjb25zdCBhdCA9IChwb2ludDogS3BpU3BhcmtsaW5lUG9pbnQpID0+ICh7XG4gICAgICB4OiBsZWZ0ICsgcG9pbnQueCAqIGJveFcgLyAxMDAsXG4gICAgICB5OiB0b3AgKyBLUElfU1BBUktMSU5FX0lOU0VUICsgcG9pbnQueSAqIGJveEggLyAxMDAsXG4gICAgfSk7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1J9YDtcblxuICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgIGRvYy5zZXRMaW5lV2lkdGgoMSk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2VvbWV0cnkubGluZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50cyA9IGxpbmUuc3BsaXQoJyAnKS5tYXAoKHBhaXIpID0+IHtcbiAgICAgICAgY29uc3QgW3B4LCBweV0gPSBwYWlyLnNwbGl0KCcsJykubWFwKE51bWJlcik7XG5cbiAgICAgICAgcmV0dXJuIGF0KHsgeDogcHgsIHk6IHB5IH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGVwcyA9IHBvaW50cy5zbGljZSgxKS5tYXAoKHBvaW50LCBpbmRleCkgPT4gW3BvaW50LnggLSBwb2ludHNbaW5kZXhdLngsIHBvaW50LnkgLSBwb2ludHNbaW5kZXhdLnldKTtcblxuICAgICAgZG9jLmxpbmVzKHN0ZXBzLCBwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnksIFsxLCAxXSwgJ1MnLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkb3Qgb2YgZ2VvbWV0cnkuZG90cykge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChkb3QpO1xuICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5Lmxhc3QpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gYXQoZ2VvbWV0cnkubGFzdCk7XG5cbiAgICAgIGlmIChnZW9tZXRyeS5sYXN0LmhvbGxvdykge1xuICAgICAgICBkb2Muc2V0RmlsbENvbG9yKCcjZmZmZmZmJyk7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRkQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgZm9ybWF0dGVkIHZhbHVlIGFzIGpzUERGIGNhbiBkcmF3IGl0LiBJdHMgc3RhbmRhcmQgZm9udHMgd3JpdGUgdGV4dCBpblxuICAvLyBXaW5BbnNpLCB3aGljaCBoYXMgdGhlIG5vLWJyZWFrIHNwYWNlIChVKzAwQTAsIGZyLUNBJ3MgZGlnaXQgZ3JvdXBpbmcpIGJ1dFxuICAvLyBub3QgdGhlIG5hcnJvdyBvbmUgKFUrMjAyRiwgd2hpY2ggb3RoZXIgbG9jYWxlcyBncm91cCBhbmQgc3BhY2Ugd2l0aCksIHRoZVxuICAvLyB0aGluIGFuZCBoYWlyIHNwYWNlcyAoVSsyMDA5LCBVKzIwMEEsIHdoaWNoIEludGwgcHV0cyBhcm91bmQgYSBkYXRlXG4gIC8vIHJhbmdlJ3MgZGFzaDogJ1NlcCAxIOKAkyAzMCwgMjAyNicpLCB0aGUgbWludXMgc2lnbiAoVSsyMjEyLCBzb21lIGxvY2FsZXMnXG4gIC8vIG5lZ2F0aXZlIHNpZ24pIG9yIGEgcmFuayBjaGFuZ2UncyB0cmlhbmdsZXM6IGVhY2ggd291bGQgcHJpbnQgYXMgc3RyYXlcbiAgLy8gZ2x5cGhzLiBUaGUgbmFycm93IHNwYWNlIGJlY29tZXMgYSBuby1icmVhayBzcGFjZSwgc28gYSBudW1iZXIgc3RpbGwgbmV2ZXJcbiAgLy8gd3JhcHMgYWNyb3NzIGEgbGluZTsgdGhlIHRoaW4gYW5kIGhhaXIgc3BhY2VzIGEgcGxhaW4gc3BhY2U7IHRoZSBtaW51c1xuICAvLyBzaWduIGEgaHlwaGVuOyBhbmQgYSByYW5rJ3MgcmlzZSBhIHBsdXMgc2lnbiBhbmQgaXRzIGZhbGwgYSBoeXBoZW5cbiAgLy8gKCfilrIgMicgcmVhZHMgJysyJykuXG4gIHByaXZhdGUgX3BkZlRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcdTIwMkYvZywgJ1xcdTAwQTAnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUyMDA5XFx1MjAwQV0vZywgJyAnKVxuICAgICAgLnJlcGxhY2UoL1xcdTIyMTIvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QjJcXHM/L2csICcrJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyNUJDXFxzPy9nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpIHx8ICdyZXBvcnQnO1xuICB9XG59XG4iXX0=