@firestitch/report 18.8.1 → 18.10.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 (208) hide show
  1. package/app/reports/anchor-at-point.d.ts +14 -0
  2. package/app/reports/canvas-landing-page.d.ts +2 -0
  3. package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
  4. package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
  5. package/app/reports/components/component-text/component-text.component.d.ts +47 -2
  6. package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
  7. package/app/reports/components/report-canvas/report-canvas.component.d.ts +37 -9
  8. package/app/reports/components/report-component/report-component.component.d.ts +45 -2
  9. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
  10. package/app/reports/data/report.data.d.ts +18 -2
  11. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +25 -2
  12. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +15 -6
  13. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
  14. package/app/reports/drill-crumbs.d.ts +12 -0
  15. package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
  16. package/app/reports/export/report-export-collector.service.d.ts +35 -4
  17. package/app/reports/export/report-export.service.d.ts +3 -1
  18. package/app/reports/export/report-filter-lines.d.ts +18 -0
  19. package/app/reports/export/report-pdf.service.d.ts +18 -2
  20. package/app/reports/export/report-pptx.service.d.ts +15 -2
  21. package/app/reports/export/report-text-layout.service.d.ts +35 -0
  22. package/app/reports/filter-settings-rules.d.ts +33 -0
  23. package/app/reports/format.d.ts +2 -1
  24. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
  25. package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
  26. package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
  27. package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
  28. package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
  29. package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
  30. package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
  31. package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
  32. package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
  33. package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
  34. package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
  35. package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
  36. package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
  37. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
  38. package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
  39. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
  40. package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
  41. package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
  42. package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
  43. package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
  44. package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
  45. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
  46. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
  47. package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
  48. package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
  49. package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
  50. package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
  51. package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
  52. package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
  53. package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
  54. package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
  55. package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
  56. package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
  57. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
  58. package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
  59. package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
  60. package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
  61. package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
  62. package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
  63. package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
  64. package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
  65. package/app/reports/interfaces/report-url-link.interface.d.ts +4 -0
  66. package/app/reports/interfaces/report-url-value-name.type.d.ts +1 -0
  67. package/app/reports/interfaces/report-url-write.interface.d.ts +4 -0
  68. package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
  69. package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
  70. package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
  71. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
  72. package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
  73. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
  74. package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
  75. package/app/reports/interfaces/report-view.interface.d.ts +7 -0
  76. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
  77. package/app/reports/interfaces/report-views.interface.d.ts +7 -0
  78. package/app/reports/interfaces/report.interface.d.ts +48 -5
  79. package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
  80. package/app/reports/layout.d.ts +2 -0
  81. package/app/reports/mark-click.d.ts +20 -0
  82. package/app/reports/option-builder.d.ts +12 -1
  83. package/app/reports/report-chat-viewer-state.d.ts +8 -0
  84. package/app/reports/report-date-presets.d.ts +2 -0
  85. package/app/reports/report-filter-items.d.ts +27 -22
  86. package/app/reports/report-tile.d.ts +2 -0
  87. package/app/reports/report-url-state.d.ts +27 -10
  88. package/app/reports/report-view-config.d.ts +36 -0
  89. package/app/reports/report-view-menu.d.ts +15 -0
  90. package/app/reports/report-viewer-features.d.ts +5 -0
  91. package/app/reports/services/report-filter-options.service.d.ts +26 -0
  92. package/app/reports/services/report-filter-state.service.d.ts +65 -2
  93. package/app/reports/services/report-view.service.d.ts +51 -0
  94. package/app/reports/text.d.ts +50 -0
  95. package/app/reports/tile-data-state.d.ts +7 -0
  96. package/app/reports/tile-loads.d.ts +4 -0
  97. package/app/reports/values.d.ts +17 -0
  98. package/app/reports/views/report/fs-ai-report.component.d.ts +9 -1
  99. package/app/reports/views/report/report.component.d.ts +6 -0
  100. package/esm2022/app/reports/anchor-at-point.mjs +49 -0
  101. package/esm2022/app/reports/canvas-landing-page.mjs +25 -0
  102. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
  103. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
  104. package/esm2022/app/reports/components/component-list/component-list.component.mjs +7 -1
  105. package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
  106. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
  107. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +296 -55
  108. package/esm2022/app/reports/components/report-component/report-component.component.mjs +318 -76
  109. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
  110. package/esm2022/app/reports/data/report.data.mjs +103 -8
  111. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +210 -44
  112. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +86 -90
  113. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
  114. package/esm2022/app/reports/drill-crumbs.mjs +73 -0
  115. package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
  116. package/esm2022/app/reports/export/report-export-collector.service.mjs +299 -125
  117. package/esm2022/app/reports/export/report-export.service.mjs +57 -19
  118. package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
  119. package/esm2022/app/reports/export/report-pdf.service.mjs +315 -71
  120. package/esm2022/app/reports/export/report-pptx.service.mjs +293 -71
  121. package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
  122. package/esm2022/app/reports/filter-settings-rules.mjs +283 -0
  123. package/esm2022/app/reports/format.mjs +13 -30
  124. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
  125. package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
  126. package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
  127. package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
  128. package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
  129. package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
  130. package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
  131. package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
  132. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
  133. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
  134. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
  135. package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
  136. package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
  137. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  138. package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
  139. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  140. package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
  141. package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
  142. package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
  143. package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
  144. package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
  145. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
  146. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
  147. package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
  148. package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
  149. package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
  150. package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
  151. package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
  152. package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
  153. package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
  154. package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
  155. package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
  156. package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
  157. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
  158. package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
  159. package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
  160. package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
  161. package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
  162. package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
  163. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
  164. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
  165. package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +2 -0
  166. package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +2 -0
  167. package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +2 -0
  168. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
  169. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
  170. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
  171. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
  172. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
  173. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
  174. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
  175. package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
  176. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
  177. package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
  178. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  179. package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
  180. package/esm2022/app/reports/layout.mjs +11 -1
  181. package/esm2022/app/reports/mark-click.mjs +193 -0
  182. package/esm2022/app/reports/option-builder.mjs +159 -15
  183. package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
  184. package/esm2022/app/reports/report-date-presets.mjs +18 -0
  185. package/esm2022/app/reports/report-filter-items.mjs +343 -72
  186. package/esm2022/app/reports/report-tile.mjs +12 -0
  187. package/esm2022/app/reports/report-url-state.mjs +596 -108
  188. package/esm2022/app/reports/report-view-config.mjs +697 -0
  189. package/esm2022/app/reports/report-view-menu.mjs +119 -0
  190. package/esm2022/app/reports/report-viewer-features.mjs +42 -0
  191. package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
  192. package/esm2022/app/reports/services/report-filter-state.service.mjs +715 -71
  193. package/esm2022/app/reports/services/report-view.service.mjs +358 -0
  194. package/esm2022/app/reports/text.mjs +293 -85
  195. package/esm2022/app/reports/tile-data-state.mjs +127 -0
  196. package/esm2022/app/reports/tile-loads.mjs +38 -0
  197. package/esm2022/app/reports/values.mjs +183 -0
  198. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +180 -46
  199. package/esm2022/app/reports/views/report/report.component.mjs +106 -23
  200. package/esm2022/public_api.mjs +24 -1
  201. package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs → firestitch-report-echarts-UBg8Wlhd.mjs} +2 -2
  202. package/fesm2022/{firestitch-report-echarts-CFnbJx44.mjs.map → firestitch-report-echarts-UBg8Wlhd.mjs.map} +1 -1
  203. package/fesm2022/{firestitch-report-firestitch-report-CSylkyko.mjs → firestitch-report-firestitch-report-B1keNrcK.mjs} +11315 -4201
  204. package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +1 -0
  205. package/fesm2022/firestitch-report.mjs +1 -1
  206. package/package.json +1 -1
  207. package/public_api.d.ts +23 -0
  208. package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +0 -1
@@ -1,12 +1,14 @@
1
- import { Injectable } from '@angular/core';
1
+ import { Injectable, inject } from '@angular/core';
2
2
  import { ReportKpiTrend } from '../enums/report-kpi-trend.enum';
3
3
  import { resolveReportTimezone } from '../format';
4
4
  import { kpiCardView, kpiSparklineGeometry, } from '../kpi-card';
5
5
  import { DEFAULT_COMPONENT_PADDING } from '../layout';
6
- import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, textParagraphs, } from '../text';
6
+ import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, TEXT_TABLE_BORDER_COLOR, TEXT_TABLE_BORDER_WIDTH, TEXT_TABLE_CELL_PADDING, TEXT_TABLE_MARGIN, textBlocks, } from '../text';
7
7
  import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR, REPORT_KPI_TRACK_COLOR, REPORT_MUTED_TEXT_COLOR, } from '../theme/palette';
8
+ import { isDrawn } from '../values';
8
9
  import { renderChartImage } from './offscreen-chart';
9
- import { coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, } from './report-export-collector.service';
10
+ import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, textOverflow, } from './report-export-collector.service';
11
+ import { ReportTextLayoutService } from './report-text-layout.service';
10
12
  import * as i0 from "@angular/core";
11
13
  // Inches → points (the PDF unit).
12
14
  const PT = 72;
@@ -65,6 +67,9 @@ const TEXT_LINE_HEIGHT = 1.25;
65
67
  // How far a list item's text sits from the block's edge, points; the marker
66
68
  // hangs in that space.
67
69
  const LIST_INDENT = 16;
70
+ // What the export's overflow gate says the PDF does with a text block that does
71
+ // not fit its box.
72
+ const PDF_OVERFLOW_NOTE = 'The PDF cuts it off at the bottom of its box.';
68
73
  // Builds the PDF client-side with jspdf. The report's unit is inches and PDFs
69
74
  // are points at exactly 72/inch, so each report page becomes one PDF page of
70
75
  // the exact physical size and components land at their precise positions.
@@ -77,8 +82,15 @@ const LIST_INDENT = 16;
77
82
  // fit continue on pages of their own after the report page, under the same
78
83
  // header/footer and with the same column widths, up to PDF_LIST_ROWS; a
79
84
  // longer result ends in a row pointing to the component's CSV export.
85
+ //
86
+ // A text block's tables are drawn by autoTable too, from the line its words
87
+ // reach, in the column widths the canvas gives them (ReportTextLayoutService).
88
+ // A text block is cut at the bottom of its box, as the canvas clips it, and
89
+ // build() hands the file back unsaved with the blocks it cut, so the export
90
+ // can ask about them before it saves.
80
91
  export class ReportPdfService {
81
- async export(collected) {
92
+ _textLayout = inject(ReportTextLayoutService);
93
+ async build(collected) {
82
94
  const context = await this._context(collected);
83
95
  this._titlePage(context.doc, collected, context.pageW, context.pageH);
84
96
  // The physical page number {{page.number}} prints: report pages and
@@ -91,10 +103,16 @@ export class ReportPdfService {
91
103
  // Each continuation appends its pages at the end of the document, so
92
104
  // two lists that overflowed on one page follow it back to back.
93
105
  for (const overflow of overflows) {
94
- pageNumber = this._renderContinuation(context, collectedPage.page, index, pageNumber, overflow);
106
+ pageNumber = await this._renderContinuation(context, collectedPage.page, index, pageNumber, overflow);
95
107
  }
96
108
  }
97
- context.doc.save(`${this._slug(collected.report.name)}.pdf`);
109
+ return {
110
+ overflows: [...context.textOverflows.values()],
111
+ overflowNote: PDF_OVERFLOW_NOTE,
112
+ save: () => {
113
+ context.doc.save(`${this._slug(collected.report.name)}.pdf`);
114
+ },
115
+ };
98
116
  }
99
117
  async _context(collected) {
100
118
  const report = collected.report;
@@ -113,31 +131,47 @@ export class ReportPdfService {
113
131
  pageW,
114
132
  pageH,
115
133
  orientation,
134
+ masterValues: this._pdfValues(collected.masterValues),
135
+ textOverflows: new Map(),
116
136
  };
117
137
  }
118
138
  // One report page: the header and footer first, under the page's own
119
139
  // components. A list that outgrows its box leaves its remaining rows in
120
- // overflows.
140
+ // overflows. The page's text fills its value tokens with the page's values.
121
141
  async _renderPage(context, collectedPage, index, pageNumber, overflows) {
122
142
  const { doc, report } = context;
123
143
  const tokens = this._tokens(report, collectedPage.page, index, pageNumber);
144
+ const pageTokens = { ...tokens, values: this._pdfValues(collectedPage.values) };
124
145
  doc.addPage([context.pageW, context.pageH], context.orientation);
125
- this._renderMaster(context, collectedPage.page, tokens);
146
+ await this._renderMaster(context, collectedPage.page, tokens);
126
147
  for (const item of collectedPage.components) {
127
- if (item.component.type === 'text') {
128
- this._renderText(doc, item.component, tokens);
129
- }
130
- else {
148
+ if (item.component.type !== 'text') {
131
149
  await this._renderComponent(context, item, overflows);
132
150
  }
151
+ else if (await this._renderText(context, item.component, pageTokens)) {
152
+ this._recordOverflow(context, item.component, tokens.pageName, pageTokens);
153
+ }
133
154
  }
134
155
  }
135
- _renderMaster(context, page, tokens) {
156
+ // The header and footer, their value tokens filled with the master's values
157
+ // whichever page they sit on: a report page or a continuation page.
158
+ async _renderMaster(context, page, tokens) {
136
159
  if (page.masterHidden) {
137
160
  return;
138
161
  }
139
- for (const component of context.report.master?.components ?? []) {
140
- this._renderText(context.doc, component, tokens);
162
+ const masterTokens = { ...tokens, values: context.masterValues };
163
+ for (const component of (context.report.master?.components ?? []).filter(isDrawn)) {
164
+ if (await this._renderText(context, component, masterTokens)) {
165
+ this._recordOverflow(context, component, HEADER_FOOTER_NAME, masterTokens);
166
+ }
167
+ }
168
+ }
169
+ // Lists a text block that was cut, under the page the export's overflow gate
170
+ // names it by. A block cut again on a later page (a header or footer) keeps
171
+ // the first entry.
172
+ _recordOverflow(context, component, page, tokens) {
173
+ if (!context.textOverflows.has(component.id)) {
174
+ context.textOverflows.set(component.id, textOverflow(component, page, tokens));
141
175
  }
142
176
  }
143
177
  _titlePage(doc, collected, pageW, pageH) {
@@ -150,54 +184,232 @@ export class ReportPdfService {
150
184
  doc.setTextColor('#52606d');
151
185
  doc.text(coverLines(collected).map((line) => this._pdfText(line)), 40, pageH * 0.35 + 26);
152
186
  }
153
- // A text block, laid out by hand: jsPDF draws strings, not rich text, so each
154
- // paragraph's runs are broken into words, wrapped to the block's width and
155
- // drawn word by word in their own font, size and color. Lines past the
156
- // block's height are dropped — the canvas clips the block there too.
157
- _renderText(doc, component, tokens) {
187
+ // A text block, laid out by hand: jsPDF draws strings, not rich text, so the
188
+ // words between its tables are drawn line by line (_drawParagraphs) and each
189
+ // table by autoTable from the line the words above it reach
190
+ // (_drawTextTable). Only a block with a table is measured, for the edges
191
+ // and column widths the canvas gives its tables. Whatever runs past
192
+ // the block's height is left off — the canvas clips the block there too.
193
+ // Returns whether anything was.
194
+ async _renderText(context, component, tokens) {
195
+ const box = this._textBox(component);
196
+ const blocks = textBlocks(component.config?.html ?? '', tokens);
197
+ const layout = blocks.some((block) => block.kind === 'table')
198
+ ? await this._textLayout.measure(component, tokens)
199
+ : null;
200
+ let cursorY = box.top;
201
+ let tableIndex = 0;
202
+ // The cursor sits on a table's bottom margin, nothing drawn since: the
203
+ // next table's top margin is the same space, as two block margins that
204
+ // meet collapse into one on the canvas.
205
+ let onMargin = false;
206
+ for (const block of blocks) {
207
+ const drawn = block.kind === 'text'
208
+ ? this._drawParagraphs(context.doc, block.paragraphs, box, cursorY)
209
+ : this._drawTextTable(context, block.table, layout?.tables[tableIndex++] ?? null, box, onMargin ? cursorY : cursorY + TEXT_TABLE_MARGIN);
210
+ if (drawn.cut) {
211
+ return true;
212
+ }
213
+ cursorY = drawn.cursorY;
214
+ onMargin = block.kind === 'table' || (onMargin && !block.paragraphs.length);
215
+ }
216
+ return false;
217
+ }
218
+ // Where a text block's words go: inside its padding, each edge 1/8" unless
219
+ // set.
220
+ _textBox(component) {
158
221
  const padding = component.config?.padding;
159
222
  const inset = (value) => (value ?? DEFAULT_COMPONENT_PADDING) * PT;
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);
164
- let cursorY = top;
223
+ return {
224
+ left: component.x * PT + inset(padding?.left),
225
+ top: component.y * PT + inset(padding?.top),
226
+ width: component.w * PT - inset(padding?.left) - inset(padding?.right),
227
+ bottom: (component.y + component.h) * PT - inset(padding?.bottom),
228
+ };
229
+ }
230
+ // Paragraphs drawn line by line from cursorY down: each one's runs are broken
231
+ // into words, wrapped to the box's width and drawn word by word in their own
232
+ // font, size and color, a list item's marker hung in its indent. The first
233
+ // line that would run past the box's bottom ends the drawing, cut.
234
+ _drawParagraphs(doc, paragraphs, box, cursorY) {
235
+ let y = cursorY;
165
236
  let listNumber = 0;
166
- for (const paragraph of textParagraphs(component.config?.html ?? '', tokens)) {
237
+ for (const paragraph of paragraphs) {
167
238
  listNumber = paragraph.bullet === 'number' ? listNumber + 1 : 0;
168
239
  const indent = paragraph.bullet ? LIST_INDENT : 0;
169
- const lines = this._wrap(doc, paragraph, width - indent);
170
- lines.forEach((line, lineIndex) => {
171
- const size = Math.max(...line.map((word) => word.size), paragraph.runs[0]?.fontSize ?? DEFAULT_TEXT_SIZE);
172
- const lineHeight = size * TEXT_LINE_HEIGHT;
173
- if (cursorY + lineHeight > bottom + 0.5) {
174
- cursorY = Infinity;
175
- return;
240
+ const lines = this._wrap(doc, paragraph, box.width - indent);
241
+ for (const [lineIndex, line] of lines.entries()) {
242
+ const size = this._lineSize(paragraph, line);
243
+ if (y + size * TEXT_LINE_HEIGHT > box.bottom + 0.5) {
244
+ return { cursorY: y, cut: true };
176
245
  }
177
- const baseline = cursorY + size;
178
- const lineWidth = line.reduce((sum, word) => sum + word.width, 0);
179
- let x = left + indent + this._alignOffset(paragraph.align, width - indent, lineWidth);
180
246
  if (lineIndex === 0 && paragraph.bullet) {
181
247
  this._font(doc, line[0]?.run ?? { text: '' }, size);
182
- doc.text(paragraph.bullet === 'number' ? `${listNumber}.` : '•', left, baseline);
183
- }
184
- for (const word of line) {
185
- this._drawWord(doc, word, x, baseline);
186
- x += word.width;
248
+ doc.text(paragraph.bullet === 'number' ? `${listNumber}.` : '•', box.left, y + size);
187
249
  }
188
- cursorY += lineHeight;
189
- });
190
- if (cursorY === Infinity) {
191
- break;
250
+ this._drawLine(doc, line, paragraph.align, box.left + indent, box.width - indent, y + size);
251
+ y += size * TEXT_LINE_HEIGHT;
192
252
  }
193
253
  // An empty paragraph is still a line.
194
254
  if (!lines.length) {
195
- cursorY += DEFAULT_TEXT_SIZE * TEXT_LINE_HEIGHT;
255
+ y += DEFAULT_TEXT_SIZE * TEXT_LINE_HEIGHT;
196
256
  }
197
257
  }
258
+ return { cursorY: y, cut: false };
259
+ }
260
+ // How far _drawParagraphs takes its cursor down drawing the paragraphs whole
261
+ // at a width.
262
+ _paragraphsHeight(doc, paragraphs, width) {
263
+ return paragraphs.reduce((height, paragraph) => {
264
+ const lines = this._wrap(doc, paragraph, width - (paragraph.bullet ? LIST_INDENT : 0));
265
+ return height + (lines.length
266
+ ? lines.reduce((sum, line) => sum + this._lineSize(paragraph, line) * TEXT_LINE_HEIGHT, 0)
267
+ : DEFAULT_TEXT_SIZE * TEXT_LINE_HEIGHT);
268
+ }, 0);
269
+ }
270
+ // A line's font size: its largest word's, and never under its paragraph's
271
+ // first run's.
272
+ _lineSize(paragraph, line) {
273
+ return Math.max(...line.map((word) => word.size), paragraph.runs[0]?.fontSize ?? DEFAULT_TEXT_SIZE);
274
+ }
275
+ // One wrapped line on its baseline, aligned within the width from left.
276
+ _drawLine(doc, line, align, left, width, baseline) {
277
+ const lineWidth = line.reduce((sum, word) => sum + word.width, 0);
278
+ let x = left + this._alignOffset(align, width, lineWidth);
279
+ for (const word of line) {
280
+ this._drawWord(doc, word, x, baseline);
281
+ x += word.width;
282
+ }
283
+ }
284
+ // A table in a text block, drawn by autoTable from top (_renderText puts it
285
+ // TEXT_TABLE_MARGIN under the line the words above it reach), in the one
286
+ // look every renderer draws (TEXT_TABLE_* in text.ts). Its left edge, width
287
+ // and column widths are the canvas's (layout), else the box's width split
288
+ // evenly. A row is as tall as its cells' words wrapped as _drawParagraphs
289
+ // wraps them, and the words are drawn into each cell once autoTable has
290
+ // drawn its grid lines and fill (_drawTextCell), so they keep their runs'
291
+ // fonts and colors. Only the rows the box holds are drawn, and a table that
292
+ // loses any is cut. The cursor it leaves is TEXT_TABLE_MARGIN under it.
293
+ _drawTextTable(context, table, layout, box, top) {
294
+ if (top >= box.bottom) {
295
+ return { cursorY: top, cut: true };
296
+ }
297
+ const left = box.left + (layout?.left ?? 0) * PT;
298
+ const width = layout ? layout.width * PT : box.width;
299
+ const columnWidths = layout?.columnWidths.length === table.columns
300
+ ? layout.columnWidths.map((columnWidth) => columnWidth * PT)
301
+ : Array.from({ length: table.columns }, () => width / table.columns);
302
+ const body = table.rows.map((row) => row.cells.map((cell) => this._textCellInput(context.doc, cell, columnWidths)));
303
+ const options = this._textTableOptions(context, columnWidths, left, top, width, box.bottom);
304
+ const fit = this._textTableFit(context, { ...options, body });
305
+ if (fit) {
306
+ this._drawTable(context, { ...options, body: this._keptRows(body, fit) });
307
+ }
308
+ return {
309
+ cursorY: fit ? context.doc.lastAutoTable.finalY + TEXT_TABLE_MARGIN : top,
310
+ cut: fit < table.rows.length,
311
+ };
312
+ }
313
+ // A text table's cell as autoTable takes it: its spans and fill and, when it
314
+ // is one row tall, the height its words need at the width it spans. A cell
315
+ // that spans rows shares theirs.
316
+ _textCellInput(doc, cell, columnWidths) {
317
+ const padding = TEXT_TABLE_CELL_PADDING;
318
+ const width = columnWidths
319
+ .slice(cell.column, cell.column + cell.colSpan)
320
+ .reduce((sum, columnWidth) => sum + columnWidth, 0) - 2 * padding.horizontal;
321
+ return {
322
+ content: '',
323
+ colSpan: cell.colSpan,
324
+ rowSpan: cell.rowSpan,
325
+ textCell: cell,
326
+ styles: {
327
+ ...(cell.fill ? { fillColor: cell.fill } : {}),
328
+ ...(cell.rowSpan === 1
329
+ ? { minCellHeight: this._paragraphsHeight(doc, cell.paragraphs, width) + 2 * padding.vertical }
330
+ : {}),
331
+ },
332
+ };
333
+ }
334
+ // The autoTable options a text table's dry run and its draw share. Every
335
+ // column is listed and fixed at its width: autoTable would otherwise count
336
+ // the columns of the first row, which may be narrower than the grid. A row
337
+ // is never split at the box's bottom: it fits whole or moves past it. bottom
338
+ // is the box's.
339
+ _textTableOptions(context, columnWidths, left, top, width, bottom) {
340
+ const padding = TEXT_TABLE_CELL_PADDING;
341
+ return {
342
+ theme: 'plain',
343
+ columns: columnWidths.map((_, index) => ({ dataKey: index })),
344
+ startY: top,
345
+ margin: { left, right: context.pageW - left - width, bottom: context.pageH - bottom },
346
+ tableWidth: width,
347
+ columnStyles: Object.fromEntries(columnWidths.map((cellWidth, index) => [index, { cellWidth }])),
348
+ rowPageBreak: 'avoid',
349
+ styles: {
350
+ font: 'helvetica',
351
+ fontStyle: 'normal',
352
+ fontSize: DEFAULT_TEXT_SIZE,
353
+ cellPadding: {
354
+ top: padding.vertical, right: padding.horizontal, bottom: padding.vertical, left: padding.horizontal,
355
+ },
356
+ lineColor: TEXT_TABLE_BORDER_COLOR,
357
+ lineWidth: TEXT_TABLE_BORDER_WIDTH,
358
+ valign: 'middle',
359
+ textColor: DEFAULT_TEXT_COLOR,
360
+ },
361
+ didDrawCell: (hook) => this._drawTextCell(hook),
362
+ };
363
+ }
364
+ // How many of a text table's rows its box holds: the rows autoTable draws
365
+ // whole on the first page when it lays the table out on a scratch document
366
+ // of the same page size, as _measure does for a list. A row taller than a
367
+ // page is split across pages rather than moved, so it does not count.
368
+ _textTableFit(context, options) {
369
+ const scratch = this._scratchDocument(context);
370
+ let fit = 0;
371
+ context.autoTable(scratch, {
372
+ ...options,
373
+ didDrawCell: (hook) => {
374
+ if (scratch.getCurrentPageInfo().pageNumber === 1 && !hook.row.spansMultiplePages) {
375
+ fit = Math.max(fit, hook.row.index + 1);
376
+ }
377
+ },
378
+ });
379
+ return fit;
380
+ }
381
+ // The first `fit` rows, a cell that spans down past the last of them cut
382
+ // there.
383
+ _keptRows(body, fit) {
384
+ return body.slice(0, fit).map((row) => row.map((input) => {
385
+ const rowSpan = Math.min(input.rowSpan, fit - input.textCell.row);
386
+ return rowSpan === input.rowSpan ? input : { ...input, rowSpan };
387
+ }));
388
+ }
389
+ // A text table cell's words, drawn once autoTable has drawn the cell: inside
390
+ // its padding, wrapped to its width and placed by its vertical alignment, the
391
+ // middle unless set. Lines past the cell are left off.
392
+ _drawTextCell(hook) {
393
+ const cell = hook.cell.raw?.textCell;
394
+ if (!cell) {
395
+ return;
396
+ }
397
+ const { x, y, width, height } = hook.cell;
398
+ const box = {
399
+ left: x + hook.cell.padding('left'),
400
+ top: y + hook.cell.padding('top'),
401
+ width: width - hook.cell.padding('horizontal'),
402
+ bottom: y + height - hook.cell.padding('bottom'),
403
+ };
404
+ const spare = Math.max(0, box.bottom - box.top - this._paragraphsHeight(hook.doc, cell.paragraphs, box.width));
405
+ const offset = cell.valign === 'top' ? 0 : (cell.valign === 'bottom' ? spare : spare / 2);
406
+ this._drawParagraphs(hook.doc, cell.paragraphs, box, box.top + offset);
198
407
  }
199
408
  // Break a paragraph's runs into lines of measured words that fit the width.
200
- // A word keeps its trailing space so spacing survives run boundaries.
409
+ // A word keeps its trailing space so spacing survives run boundaries. A
410
+ // no-break space is part of its word, never a break between two: a number
411
+ // grouped with one (fr-CA's thousands, or a narrow space _pdfText turned
412
+ // into one) stays on one line.
201
413
  _wrap(doc, paragraph, width) {
202
414
  const lines = [];
203
415
  let line = [];
@@ -205,7 +417,7 @@ export class ReportPdfService {
205
417
  for (const run of paragraph.runs) {
206
418
  const size = run.fontSize ?? DEFAULT_TEXT_SIZE;
207
419
  this._font(doc, run, size);
208
- for (const text of run.text.match(/\S+\s*|\s+/g) ?? []) {
420
+ for (const text of run.text.match(/(?:[^\s]|\u00a0)+[^\S\u00a0]*|[^\S\u00a0]+/g) ?? []) {
209
421
  const wordWidth = doc.getTextWidth(text);
210
422
  if (line.length && lineWidth + wordWidth - this._trailingSpace(doc, text) > width) {
211
423
  lines.push(line);
@@ -292,7 +504,7 @@ export class ReportPdfService {
292
504
  const y = component.y * PT;
293
505
  const w = component.w * PT;
294
506
  const h = component.h * PT;
295
- const title = exportTitle(component, item.search);
507
+ const title = exportTitle(component, item.search, item.crumbs);
296
508
  if (title) {
297
509
  this._componentTitle(doc, title, x, y, w);
298
510
  }
@@ -352,11 +564,14 @@ export class ReportPdfService {
352
564
  return `${cut.trimEnd()}…`;
353
565
  }
354
566
  // The bold strip over a component, and over each of its continuation pages.
567
+ // A drilled title's crumbs are written in the report's locale, so the title
568
+ // goes through _pdfText like any formatted text (the › between crumbs is
569
+ // WinAnsi and stays).
355
570
  _componentTitle(doc, title, x, y, w) {
356
571
  doc.setFont('helvetica', 'bold');
357
572
  doc.setFontSize(9);
358
573
  doc.setTextColor('#1f2933');
359
- doc.text(title, x, y + 10, { maxWidth: w });
574
+ doc.text(this._pdfText(title), x, y + 10, { maxWidth: w });
360
575
  }
361
576
  // An italic grey line centered in a component's body, for a body that holds
362
577
  // something other than its content.
@@ -390,7 +605,9 @@ export class ReportPdfService {
390
605
  // never fits one box, so the CSV notice always lands on a continuation
391
606
  // page.
392
607
  const kept = Math.max(0, fit - 1);
393
- overflows.push({ component, search, head, numeric, rows: cells.slice(kept), omitted, foot, x, w, columnStyles });
608
+ overflows.push({
609
+ component, search, crumbs: item.crumbs, head, numeric, rows: cells.slice(kept), omitted, foot, x, w, columnStyles,
610
+ });
394
611
  if (fit >= 1) {
395
612
  const body = [...cells.slice(0, kept), this._noticeRow(CONTINUED_NOTICE, head.length, true)];
396
613
  this._drawTable(context, this._tableOptions(context, head, numeric, body, x, y, w, bottom, columnStyles));
@@ -477,11 +694,7 @@ export class ReportPdfService {
477
694
  // body row fits under the head (or the head itself did not fit): autoTable
478
695
  // moved to a new page before drawing. The real document is untouched.
479
696
  _measure(context, head, cells, numeric, foot, x, y, w, bottom) {
480
- const scratch = new context.jsPDF({
481
- unit: 'pt',
482
- format: [context.pageW, context.pageH],
483
- orientation: context.orientation,
484
- });
697
+ const scratch = this._scratchDocument(context);
485
698
  let fit = 0;
486
699
  context.autoTable(scratch, {
487
700
  ...this._tableOptions(context, head, numeric, cells, x, y, w, bottom, undefined, foot),
@@ -505,10 +718,20 @@ export class ReportPdfService {
505
718
  }
506
719
  return { fit, columnStyles };
507
720
  }
508
- // Draws an on-page table, then removes any page the draw added. That should
509
- // never happen: the measured fit, the identical column widths and a
510
- // single-line notice keep the table inside its box. The check exists so a
511
- // stray page can never catch the report page's remaining components.
721
+ // A blank document of the export's page size, for laying a table out to see
722
+ // what fits before the real one is drawn on.
723
+ _scratchDocument(context) {
724
+ return new context.jsPDF({
725
+ unit: 'pt',
726
+ format: [context.pageW, context.pageH],
727
+ orientation: context.orientation,
728
+ });
729
+ }
730
+ // Draws an on-page table (a list's, or a text block's), then removes any
731
+ // page the draw added. That should never happen: the measured fit, the
732
+ // identical column widths and a single-line notice keep the table inside its
733
+ // box. The check exists so a stray page can never catch the report page's
734
+ // remaining components.
512
735
  _drawTable(context, options) {
513
736
  const { doc } = context;
514
737
  const page = doc.getCurrentPageInfo().pageNumber;
@@ -523,16 +746,17 @@ export class ReportPdfService {
523
746
  // the report page, each with the page's header and footer, the table's
524
747
  // title and its head again. The table sits CONTINUATION_GAP inside the
525
748
  // bands. Returns the physical page counter after these pages.
526
- _renderContinuation(context, page, index, pageNumber, overflow) {
527
- const { doc, report } = context;
528
- const bands = page.masterHidden ? NO_BANDS : report.config?.headerFooter ?? NO_BANDS;
749
+ async _renderContinuation(context, page, index, pageNumber, overflow) {
750
+ const { doc } = context;
751
+ const bands = page.masterHidden ? NO_BANDS : context.report.config?.headerFooter ?? NO_BANDS;
529
752
  const top = this._continuationMargin(bands.headerHeight);
530
753
  const bottom = this._continuationMargin(bands.footerHeight);
531
754
  const { x, w } = overflow;
532
755
  const body = overflow.omitted > 0
533
756
  ? [...overflow.rows, this._noticeRow(moreRowsNotice(overflow.omitted), overflow.head.length, false)]
534
757
  : overflow.rows;
535
- let counter = pageNumber;
758
+ // The document's pages the table draws on, in order.
759
+ const pages = [];
536
760
  doc.addPage([context.pageW, context.pageH], context.orientation);
537
761
  context.autoTable(doc, {
538
762
  ...this._tableOptions(context, overflow.head, overflow.numeric, body, x, top + TITLE_H, w, bottom, overflow.columnStyles, overflow.foot),
@@ -540,20 +764,32 @@ export class ReportPdfService {
540
764
  showHead: 'everyPage',
541
765
  // Fires on every page the table draws on, the first included.
542
766
  willDrawPage: () => {
543
- counter += 1;
544
- this._renderMaster(context, page, this._tokens(report, page, index, counter));
545
- this._componentTitle(doc, this._continuedTitle(overflow.component, overflow.search), x, top, w);
767
+ pages.push(doc.getCurrentPageInfo().pageNumber);
768
+ this._componentTitle(doc, this._continuedTitle(overflow.component, overflow.search, overflow.crumbs), x, top, w);
546
769
  },
547
770
  });
548
- return counter;
771
+ await this._renderContinuationMasters(context, page, index, pageNumber, pages);
772
+ return pageNumber + pages.length;
773
+ }
774
+ // The header and footer of each continuation page, numbered on from
775
+ // pageNumber. They go on once the table is drawn, since a text block with a
776
+ // table is measured before it is drawn, which autoTable's page hook cannot
777
+ // wait for; they sit in the bands, clear of the table.
778
+ async _renderContinuationMasters(context, page, index, pageNumber, pages) {
779
+ const { doc, report } = context;
780
+ for (const [offset, documentPage] of pages.entries()) {
781
+ doc.setPage(documentPage);
782
+ await this._renderMaster(context, page, this._tokens(report, page, index, pageNumber + offset + 1));
783
+ }
784
+ doc.setPage(doc.getNumberOfPages());
549
785
  }
550
786
  // The margin a continuation table keeps from one edge: inside the band when
551
787
  // the page has one.
552
788
  _continuationMargin(band) {
553
789
  return band ? band * PT + CONTINUATION_GAP : NO_BAND_MARGIN;
554
790
  }
555
- _continuedTitle(component, search) {
556
- const title = exportTitle(component, search);
791
+ _continuedTitle(component, search, crumbs) {
792
+ const title = exportTitle(component, search, crumbs);
557
793
  return title ? `${title} (continued)` : 'Continued';
558
794
  }
559
795
  // A KPI tile: the card the screen draws (kpi-card.ts decides every line),
@@ -727,6 +963,14 @@ export class ReportPdfService {
727
963
  .replace(/\u25B2\s?/g, '+')
728
964
  .replace(/\u25BC\s?/g, '-');
729
965
  }
966
+ // A layer's values with each number as jsPDF can draw it (_pdfText), so a
967
+ // value grouped with narrow spaces reads, and wraps, like any other number.
968
+ _pdfValues(values) {
969
+ return Object.fromEntries(Object.entries(values).map(([key, value]) => [
970
+ key,
971
+ value.text === undefined ? value : { ...value, text: this._pdfText(value.text) },
972
+ ]));
973
+ }
730
974
  _slug(name) {
731
975
  return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';
732
976
  }
@@ -736,4 +980,4 @@ export class ReportPdfService {
736
980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
737
981
  type: Injectable
738
982
  }] });
739
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWxELE9BQU8sRUFDMkMsV0FBVyxFQUFFLG9CQUFvQixHQUNsRixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEQsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFDTCx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsR0FDdEcsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQ2lFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUN4RyxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUMvRyxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsR0FDOUQsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFHM0Msa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFFbkIsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUscURBQXFEO0FB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LEtBQUssQ0FBQyxRQUFRO1lBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQztZQUMzRixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLFdBQVcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUM1QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUU3QyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7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RSxzQkFBc0I7SUFDZCxRQUFRLENBQUMsSUFBWTtRQUMzQixPQUFPLElBQUk7YUFDUixPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQzthQUM1QixPQUFPLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDO2FBQy9CLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQ3ZCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDO2FBQzFCLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDNUYsQ0FBQzt3R0FwMEJVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZXBvcnRLcGlUcmVuZCB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1rcGktdHJlbmQuZW51bSc7XG5pbXBvcnQgeyByZXNvbHZlUmVwb3J0VGltZXpvbmUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0SGVhZGVyRm9vdGVyLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgS3BpQ2FyZERlbHRhLCBLcGlDYXJkVGFyZ2V0LCBLcGlTcGFya2xpbmVQb2ludCwga3BpQ2FyZFZpZXcsIGtwaVNwYXJrbGluZUdlb21ldHJ5LFxufSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEVYVF9DT0xPUiwgREVGQVVMVF9URVhUX1NJWkUsIFRleHRQYXJhZ3JhcGgsIFRleHRSdW4sIFRleHRUb2tlbkNvbnRleHQsIHRleHRQYXJhZ3JhcGhzLFxufSBmcm9tICcuLi90ZXh0JztcbmltcG9ydCB7XG4gIFJFUE9SVF9LUElfQ0hBTkdFX0NPTE9SUywgUkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1IsIFJFUE9SVF9LUElfVFJBQ0tfQ09MT1IsIFJFUE9SVF9NVVRFRF9URVhUX0NPTE9SLFxufSBmcm9tICcuLi90aGVtZS9wYWxldHRlJztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQge1xuICBDb2xsZWN0ZWRDb21wb25lbnQsIENvbGxlY3RlZFBhZ2UsIENvbGxlY3RlZFJlcG9ydCwgS3BpRXhwb3J0SGVpZ2h0cywgY292ZXJMaW5lcywgZW1wdHlMYWJlbCwgZXhwb3J0Q2VsbCxcbiAgZXhwb3J0Tm90ZUxpbmVzLCBleHBvcnRUaXRsZSwgZXhwb3J0V2luZG93c0xpbmUsIGtwaUNhcmRIYXNFeHRyYXMsIGtwaUV4cG9ydEhlaWdodCwga3BpRXhwb3J0UGFydHMsIGxpc3RDb2x1bW5zLFxuICBsaXN0SGVhZGluZ3MsIGxpc3RUb3RhbHNSb3csIG1vcmVSb3dzTm90aWNlLCBzY2FsZWRLcGlIZWlnaHRzLFxufSBmcm9tICcuL3JlcG9ydC1leHBvcnQtY29sbGVjdG9yLnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBUaGUgc21hbGwgcHJpbnQgYSBjb21wb25lbnQgbWF5IGNhcnJ5LCBwb2ludHM6IHRoZSBkYXlzIGl0IHJlYWRzIHVuZGVyIGl0c1xuLy8gdGl0bGUgKGEgc3VidGl0bGUgbGluZSksIGl0cyBub3RlcyBhdCB0aGUgZm9vdCBvZiBpdHMgYm94IChhIGxpbmUgZWFjaCksIGFuZFxuLy8gdGhlIGxpbmVzIG9mIGEgS1BJIGNhcmQgdW5kZXIgaXRzIHZhbHVlLiBBIGNoYXJ0J3Mgb3IgYSBsaXN0J3Mgbm90ZXMgZ2l2ZVxuLy8gd2F5IGJlZm9yZSBpdHMgYm9keSB3b3VsZCBzaHJpbmsgdW5kZXIgTUlOX0JPRFlfSC5cbmNvbnN0IFNNQUxMX1NJWkUgPSA3LjU7XG5jb25zdCBTVUJUSVRMRV9IID0gMTE7XG5jb25zdCBOT1RFX0xJTkVfSCA9IDEwO1xuY29uc3QgTUlOX0JPRFlfSCA9IDQwO1xuY29uc3QgTVVURURfQ09MT1IgPSBgIyR7UkVQT1JUX01VVEVEX1RFWFRfQ09MT1J9YDtcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9IGAjJHtSRVBPUlRfS1BJX1RSQUNLX0NPTE9SfWA7XG4vLyBUaGUgc3BhcmtsaW5lJ3Mgd2lkZXN0IGJveCwgaXRzIHRvcCBhbmQgYm90dG9tIGluc2V0LCBhbmQgaXRzIGRvdHMnIHJhZGl1cy5cbmNvbnN0IEtQSV9TUEFSS0xJTkVfVyA9IDE0MDtcbmNvbnN0IEtQSV9TUEFSS0xJTkVfSU5TRVQgPSAzO1xuY29uc3QgS1BJX0RPVF9SID0gMS41O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBBIHRleHQgbGluZSdzIGhlaWdodCBhcyBhIG11bHRpcGxlIG9mIGl0cyBsYXJnZXN0IGZvbnQgc2l6ZSDigJQgdGhlIGNhbnZhc1xuLy8gc3R5bGVzaGVldCdzIGxpbmUtaGVpZ2h0LCBzbyBhIGJsb2NrIHdyYXBzIGFuZCBzdGFja3MgdGhlIHNhbWUgd2F5LlxuY29uc3QgVEVYVF9MSU5FX0hFSUdIVCA9IDEuMjU7XG5cbi8vIEhvdyBmYXIgYSBsaXN0IGl0ZW0ncyB0ZXh0IHNpdHMgZnJvbSB0aGUgYmxvY2sncyBlZGdlLCBwb2ludHM7IHRoZSBtYXJrZXJcbi8vIGhhbmdzIGluIHRoYXQgc3BhY2UuXG5jb25zdCBMSVNUX0lOREVOVCA9IDE2O1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBleHBvcnQoKS5cbi8vIFNpemVzIGFyZSBwb2ludHMuXG5pbnRlcmZhY2UgUGRmRXhwb3J0Q29udGV4dCB7XG4gIGRvYzogYW55O1xuICBhdXRvVGFibGU6IGFueTtcbiAganNQREY6IGFueTtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHBhZ2VXOiBudW1iZXI7XG4gIHBhZ2VIOiBudW1iZXI7XG4gIG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCc7XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIEEgdGFibGUgYm9keSBjZWxsOiBwbGFpbiB0ZXh0LCBvciBhIG5vdGljZSByb3cncyBvbmUgY2VsbCBzcGFubmluZyBldmVyeVxuLy8gY29sdW1uLlxudHlwZSBQZGZUYWJsZUNlbGwgPSBzdHJpbmcgfCB7IGNvbnRlbnQ6IHN0cmluZzsgY29sU3BhbjogbnVtYmVyOyBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbi8vIFRoZSByb3dzIG9mIGEgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIGNhcnJpZWQgb250byBjb250aW51YXRpb25cbi8vIHBhZ2VzIGFmdGVyIGl0cyByZXBvcnQgcGFnZS4geCBhbmQgdyBhcmUgdGhlIGJveCdzLCBpbiBwb2ludHMsIGFuZCB0aGVcbi8vIGNvbHVtbiB3aWR0aHMgYW5kIGFsaWdubWVudHMgYXJlIHRoZSBvbmVzIHRoZSBvbi1wYWdlIHRhYmxlIHdhcyBkcmF3biB3aXRoLFxuLy8gc28gdGhlIHRhYmxlIHJlYWRzIGFzIG9uZSBhY3Jvc3MgcGFnZXMuXG5pbnRlcmZhY2UgUGRmVGFibGVPdmVyZmxvdyB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBUaGUgdGV4dCB0aGUgbGlzdCB3YXMgc2VhcmNoZWQgYnksIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIGhlYWQ6IHN0cmluZ1tdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIHJvd3M6IHN0cmluZ1tdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgLy8gVGhlIGxpc3QncyB0b3RhbHMgcm93LCB3aGljaCBjbG9zZXMgdGhlIGxhc3QgY29udGludWF0aW9uIHBhZ2UuXG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0UGRmU2VydmljZSB7XG5cbiAgcHVibGljIGFzeW5jIGV4cG9ydChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0KGNvbGxlY3RlZCk7XG5cbiAgICB0aGlzLl90aXRsZVBhZ2UoY29udGV4dC5kb2MsIGNvbGxlY3RlZCwgY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSCk7XG5cbiAgICAvLyBUaGUgcGh5c2ljYWwgcGFnZSBudW1iZXIge3twYWdlLm51bWJlcn19IHByaW50czogcmVwb3J0IHBhZ2VzIGFuZFxuICAgIC8vIHRoZWlyIGNvbnRpbnVhdGlvbiBwYWdlcyBhbGlrZSwgdGhlIHRpdGxlIHBhZ2Ugbm90IGNvdW50ZWQuXG4gICAgbGV0IHBhZ2VOdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGNvbGxlY3RlZFBhZ2VdIG9mIGNvbGxlY3RlZC5wYWdlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdID0gW107XG4gICAgICBwYWdlTnVtYmVyICs9IDE7XG5cbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlclBhZ2UoY29udGV4dCwgY29sbGVjdGVkUGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93cyk7XG5cbiAgICAgIC8vIEVhY2ggY29udGludWF0aW9uIGFwcGVuZHMgaXRzIHBhZ2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCBzb1xuICAgICAgLy8gdHdvIGxpc3RzIHRoYXQgb3ZlcmZsb3dlZCBvbiBvbmUgcGFnZSBmb2xsb3cgaXQgYmFjayB0byBiYWNrLlxuICAgICAgZm9yIChjb25zdCBvdmVyZmxvdyBvZiBvdmVyZmxvd3MpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IHRoaXMuX3JlbmRlckNvbnRpbnVhdGlvbihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBvdmVyZmxvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dC5kb2Muc2F2ZShgJHt0aGlzLl9zbHVnKGNvbGxlY3RlZC5yZXBvcnQubmFtZSl9LnBkZmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGV4dChjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IFByb21pc2U8UGRmRXhwb3J0Q29udGV4dD4ge1xuICAgIGNvbnN0IHJlcG9ydCA9IGNvbGxlY3RlZC5yZXBvcnQ7XG4gICAgY29uc3QgeyBqc1BERiB9ID0gYXdhaXQgaW1wb3J0KCdqc3BkZicpO1xuICAgIGNvbnN0IGF1dG9UYWJsZSA9IChhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpKS5kZWZhdWx0O1xuXG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcGFnZVcgPj0gcGFnZUggPyAnbGFuZHNjYXBlJyA6ICdwb3J0cmFpdCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jOiBuZXcganNQREYoeyBvcmllbnRhdGlvbiwgdW5pdDogJ3B0JywgZm9ybWF0OiBbcGFnZVcsIHBhZ2VIXSB9KSxcbiAgICAgIGF1dG9UYWJsZSxcbiAgICAgIGpzUERGLFxuICAgICAgcmVwb3J0LFxuICAgICAgdGltZXpvbmU6IHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpLFxuICAgICAgZm9ybWF0Q29udGV4dDogY29sbGVjdGVkLmZvcm1hdENvbnRleHQsXG4gICAgICBwYWdlVyxcbiAgICAgIHBhZ2VILFxuICAgICAgb3JpZW50YXRpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgdG9rZW5zKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0ZWRQYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgIGlmIChpdGVtLmNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGV4dChkb2MsIGl0ZW0uY29tcG9uZW50LCB0b2tlbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29tcG9uZW50KGNvbnRleHQsIGl0ZW0sIG92ZXJmbG93cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTWFzdGVyKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIHRva2VuczogVGV4dFRva2VuQ29udGV4dCk6IHZvaWQge1xuICAgIGlmIChwYWdlLm1hc3RlckhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbnRleHQucmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkge1xuICAgICAgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LmRvYywgY29tcG9uZW50LCB0b2tlbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGRvYy50ZXh0KGNvdmVyTGluZXMoY29sbGVjdGVkKS5tYXAoKGxpbmUpID0+IHRoaXMuX3BkZlRleHQobGluZSkpLCA0MCwgcGFnZUggKiAwLjM1ICsgMjYpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrLCBsYWlkIG91dCBieSBoYW5kOiBqc1BERiBkcmF3cyBzdHJpbmdzLCBub3QgcmljaCB0ZXh0LCBzbyBlYWNoXG4gIC8vIHBhcmFncmFwaCdzIHJ1bnMgYXJlIGJyb2tlbiBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBibG9jaydzIHdpZHRoIGFuZFxuICAvLyBkcmF3biB3b3JkIGJ5IHdvcmQgaW4gdGhlaXIgb3duIGZvbnQsIHNpemUgYW5kIGNvbG9yLiBMaW5lcyBwYXN0IHRoZVxuICAvLyBibG9jaydzIGhlaWdodCBhcmUgZHJvcHBlZCDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICBwcml2YXRlIF9yZW5kZXJUZXh0KGRvYzogYW55LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgaW5zZXQgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gKHZhbHVlID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcpICogUFQ7XG5cbiAgICBjb25zdCBsZWZ0ID0gY29tcG9uZW50LnggKiBQVCArIGluc2V0KHBhZGRpbmc/LmxlZnQpO1xuICAgIGNvbnN0IHRvcCA9IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApO1xuICAgIGNvbnN0IHdpZHRoID0gY29tcG9uZW50LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IChjb21wb25lbnQueSArIGNvbXBvbmVudC5oKSAqIFBUIC0gaW5zZXQocGFkZGluZz8uYm90dG9tKTtcblxuICAgIGxldCBjdXJzb3JZID0gdG9wO1xuICAgIGxldCBsaXN0TnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIHRleHRQYXJhZ3JhcGhzKGNvbXBvbmVudC5jb25maWc/Lmh0bWwgPz8gJycsIHRva2VucykpIHtcbiAgICAgIGxpc3ROdW1iZXIgPSBwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGxpc3ROdW1iZXIgKyAxIDogMDtcbiAgICAgIGNvbnN0IGluZGVudCA9IHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDA7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gaW5kZW50KTtcblxuICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgbGluZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBNYXRoLm1heCguLi5saW5lLm1hcCgod29yZCkgPT4gd29yZC5zaXplKSwgcGFyYWdyYXBoLnJ1bnNbMF0/LmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgICBpZiAoY3Vyc29yWSArIGxpbmVIZWlnaHQgPiBib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICBjdXJzb3JZID0gSW5maW5pdHk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZSA9IGN1cnNvclkgKyBzaXplO1xuICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBsaW5lLnJlZHVjZSgoc3VtLCB3b3JkKSA9PiBzdW0gKyB3b3JkLndpZHRoLCAwKTtcbiAgICAgICAgbGV0IHggPSBsZWZ0ICsgaW5kZW50ICsgdGhpcy5fYWxpZ25PZmZzZXQocGFyYWdyYXBoLmFsaWduLCB3aWR0aCAtIGluZGVudCwgbGluZVdpZHRoKTtcblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGxlZnQsIGJhc2VsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICAgICAgdGhpcy5fZHJhd1dvcmQoZG9jLCB3b3JkLCB4LCBiYXNlbGluZSk7XG4gICAgICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY3Vyc29yWSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJzb3JZID09PSBJbmZpbml0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQW4gZW1wdHkgcGFyYWdyYXBoIGlzIHN0aWxsIGEgbGluZS5cbiAgICAgIGlmICghbGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnNvclkgKz0gREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICBsZXQgbGluZTogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9LCB4OiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSB3b3JkLnJ1bjtcblxuICAgIGlmIChydW4uaGlnaGxpZ2h0KSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKHJ1bi5oaWdobGlnaHQpO1xuICAgICAgZG9jLnJlY3QoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjksIHdvcmQud2lkdGgsIHdvcmQuc2l6ZSAqIDEuMTUsICdGJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udChkb2MsIHJ1biwgd29yZC5zaXplKTtcbiAgICBkb2MudGV4dCh3b3JkLnRleHQsIHgsIGJhc2VsaW5lKTtcblxuICAgIGNvbnN0IGNvbG9yID0gcnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUjtcbiAgICBjb25zdCBpbmtXaWR0aCA9IHdvcmQud2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgd29yZC50ZXh0KTtcbiAgICBpZiAocnVuLnVuZGVybGluZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMiwgeCArIGlua1dpZHRoLCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIpO1xuICAgIH1cbiAgICBpZiAocnVuLnN0cmlrZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLmxpbmspIHtcbiAgICAgIGRvYy5saW5rKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplLCBpbmtXaWR0aCwgd29yZC5zaXplICogMS4yLCB7IHVybDogcnVuLmxpbmsgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8ganNQREYncyBzdGFuZGFyZCBmb250cyBhcmUgSGVsdmV0aWNhLCBUaW1lcyBhbmQgQ291cmllcjsgYSBibG9jaydzIGZhY2UgaXNcbiAgLy8gbWFwcGVkIG9udG8gd2hpY2hldmVyIG9mIHRoZSB0aHJlZSBpdCByZXNlbWJsZXMuXG4gIHByaXZhdGUgX2ZvbnQoZG9jOiBhbnksIHJ1bjogVGV4dFJ1biwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmFjZSA9IChydW4uZm9udEZhY2UgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmFtaWx5ID0gL2NvdXJpZXJ8bW9uby8udGVzdChmYWNlKVxuICAgICAgPyAnY291cmllcidcbiAgICAgIDogKC90aW1lc3xnZW9yZ2lhfHNlcmlmLy50ZXN0KGZhY2UpICYmICFmYWNlLmluY2x1ZGVzKCdzYW5zJykgPyAndGltZXMnIDogJ2hlbHZldGljYScpO1xuICAgIGNvbnN0IHN0eWxlID0gcnVuLmJvbGQgJiYgcnVuLml0YWxpY1xuICAgICAgPyAnYm9sZGl0YWxpYydcbiAgICAgIDogKHJ1bi5ib2xkID8gJ2JvbGQnIDogKHJ1bi5pdGFsaWMgPyAnaXRhbGljJyA6ICdub3JtYWwnKSk7XG5cbiAgICBkb2Muc2V0Rm9udChmYW1pbHksIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYWlsaW5nU3BhY2UoZG9jOiBhbnksIHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhaWxpbmcgPSB0ZXh0Lmxlbmd0aCAtIHRleHQudHJpbUVuZCgpLmxlbmd0aDtcblxuICAgIHJldHVybiB0cmFpbGluZyA/IGRvYy5nZXRUZXh0V2lkdGgoJyAnKSAqIHRyYWlsaW5nIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduT2Zmc2V0KGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLCB3aWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh3aWR0aCAtIGxpbmVXaWR0aCkgLyAyKTtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHdpZHRoIC0gbGluZVdpZHRoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGlzIHBhZ2UuIFRoZSBudW1iZXIgaXMgdGhlXG4gIC8vIHBoeXNpY2FsIHBhZ2UgYW1vbmcgdGhlIHJlcG9ydCdzIHBhZ2VzLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQg4oCUIHRoZVxuICAvLyB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLiBUaGUgbmFtZSBzdGF5cyB0aGUgcmVwb3J0IHBhZ2Uncywgc28gYVxuICAvLyBjb250aW51YXRpb24gcGFnZSBpcyBuYW1lZCBmb3IgdGhlIHBhZ2UgaXRzIHRhYmxlIHN0YXJ0ZWQgb24uXG4gIHByaXZhdGUgX3Rva2VucyhyZXBvcnQ6IFJlcG9ydCwgcGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogVGV4dFRva2VuQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBwYWdlTmFtZTogcGFnZS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWAsXG4gICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29tcG9uZW50KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtLmNvbXBvbmVudDtcbiAgICAvLyBHZW9tZXRyeSBpcyBzdG9yZWQgaW4gaW5jaGVzOyB0aGUgUERGIGRyYXdzIGluIHBvaW50cy5cbiAgICBjb25zdCB4ID0gY29tcG9uZW50LnggKiBQVDtcbiAgICBjb25zdCB5ID0gY29tcG9uZW50LnkgKiBQVDtcbiAgICBjb25zdCB3ID0gY29tcG9uZW50LncgKiBQVDtcbiAgICBjb25zdCBoID0gY29tcG9uZW50LmggKiBQVDtcblxuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCBpdGVtLnNlYXJjaCk7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShkb2MsIHRpdGxlLCB4LCB5LCB3KTtcbiAgICB9XG5cbiAgICAvLyBBIGNoYXJ0IG9yIGxpc3QgdGhhdCBjb21wYXJlcyBvciBoYXMgYSB0aW1lZnJhbWUgbmFtZXMgaXRzIGRheXMgdW5kZXJcbiAgICAvLyB0aGUgdGl0bGUsIGFuZCBpdHMgbm90ZXMgc2l0IGF0IHRoZSBmb290IG9mIGl0cyBib3g7IGEgS1BJIGNhcmQgZHJhd3NcbiAgICAvLyBib3RoIGl0c2VsZi4gTmVpdGhlciB0YWtlcyByb29tIGZyb20gYSBjb21wb25lbnQgd2l0aG91dCB0aG9zZSBrZXlzLlxuICAgIGNvbnN0IGxvY2FsZSA9IGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGU7XG4gICAgY29uc3Qgc3VidGl0bGUgPSB0aGlzLl9wZGZUZXh0KGV4cG9ydFdpbmRvd3NMaW5lKGl0ZW0sIGNvbnRleHQudGltZXpvbmUsIGxvY2FsZSkpO1xuICAgIGNvbnN0IG5vdGVzID0gY29tcG9uZW50LnR5cGUgPT09ICdrcGknID8gW10gOiBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKTtcbiAgICBjb25zdCB0b3AgPSB5ICsgVElUTEVfSCArIChzdWJ0aXRsZSA/IFNVQlRJVExFX0ggOiAwKTtcbiAgICBjb25zdCByb29tID0gTWF0aC5tYXgoMjAsIHkgKyBoIC0gdG9wKTtcbiAgICBjb25zdCBrZXB0ID0gbm90ZXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigocm9vbSAtIE1JTl9CT0RZX0gpIC8gTk9URV9MSU5FX0gpKSk7XG5cbiAgICBpZiAoc3VidGl0bGUpIHtcbiAgICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHN1YnRpdGxlLCB4LCB5ICsgVElUTEVfSCwgdywgJ2xlZnQnLCAnbm9ybWFsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keVkgPSB0b3A7XG4gICAgY29uc3QgYm9keUggPSBNYXRoLm1heCgyMCwgcm9vbSAtIGtlcHQubGVuZ3RoICogTk9URV9MSU5FX0gpO1xuXG4gICAga2VwdC5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgYm9keVkgKyBib2R5SCArIGluZGV4ICogTk9URV9MSU5FX0gsIHcsICdsZWZ0JywgJ2l0YWxpYycpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFpdGVtLmRhdGEgfHwgIWl0ZW0uZGF0YS5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoZG9jLCBlbXB0eUxhYmVsKGl0ZW0pLCB4LCBib2R5WSwgdywgYm9keUgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG4gICAgICAgIGRvYy5hZGRJbWFnZShpbWFnZSwgJ1BORycsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHRoaXMuX3JlbmRlclRhYmxlKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCwgb3ZlcmZsb3dzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrcGknOlxuICAgICAgICB0aGlzLl9yZW5kZXJLcGkoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gT25lIGxpbmUgb2Ygc21hbGwgZ3JleSBwcmludCwgY3V0IHRvIHRoZSB3aWR0aCB3aXRoIGFuIGVsbGlwc2lzOiBhXG4gIC8vIHN1YnRpdGxlLCBhIG5vdGUgb3IgYSBsaW5lIG9mIGEgS1BJIGNhcmQuIHkgaXMgdGhlIGxpbmUncyB0b3A7IHRoZSBsaW5lIGlzXG4gIC8vIE5PVEVfTElORV9IIHRhbGwsIHRpbWVzIHRoZSBzY2FsZSBhIHNob3J0IEtQSSB0aWxlIHNocmlua3MgaXRzIGxpbmVzIGJ5LlxuICBwcml2YXRlIF9zbWFsbExpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsXG4gICAgYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInLFxuICAgIHN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnLFxuICAgIHNjYWxlID0gMSxcbiAgKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoU01BTExfU0laRSAqIHNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICBkb2MudGV4dCh0aGlzLl9maXQoZG9jLCB0ZXh0LCB3KSwgYWxpZ24gPT09ICdjZW50ZXInID8geCArIHcgLyAyIDogeCwgeSArIFNNQUxMX1NJWkUgKiBzY2FsZSwgeyBhbGlnbiB9KTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0LCBlbGxpcHNpemVkIHRvIHRoZSB3aWR0aCBpbiB0aGUgZG9jJ3MgY3VycmVudCBmb250LlxuICBwcml2YXRlIF9maXQoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGRvYy5nZXRUZXh0V2lkdGgodGV4dCkgPD0gd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGxldCBjdXQgPSB0ZXh0O1xuICAgIHdoaWxlIChjdXQubGVuZ3RoID4gMSAmJiBkb2MuZ2V0VGV4dFdpZHRoKGAke2N1dH3igKZgKSA+IHdpZHRoKSB7XG4gICAgICBjdXQgPSBjdXQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtjdXQudHJpbUVuZCgpfeKApmA7XG4gIH1cblxuICAvLyBUaGUgYm9sZCBzdHJpcCBvdmVyIGEgY29tcG9uZW50LCBhbmQgb3ZlciBlYWNoIG9mIGl0cyBjb250aW51YXRpb24gcGFnZXMuXG4gIHByaXZhdGUgX2NvbXBvbmVudFRpdGxlKGRvYzogYW55LCB0aXRsZTogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICB9XG5cbiAgLy8gQW4gaXRhbGljIGdyZXkgbGluZSBjZW50ZXJlZCBpbiBhIGNvbXBvbmVudCdzIGJvZHksIGZvciBhIGJvZHkgdGhhdCBob2xkc1xuICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHMgY29udGVudC5cbiAgcHJpdmF0ZSBfYm94Tm90ZShkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2l0YWxpYycpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICBkb2MudGV4dCh0ZXh0LCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gIH1cblxuICAvLyBBIGxpc3QncyBvbi1wYWdlIHRhYmxlLiBBbGwgb2YgaXRzIGZldGNoZWQgcm93cyBhcmUgbGFpZCBvdXQgb25jZSB0byBsZWFyblxuICAvLyBob3cgbWFueSB0aGUgYm94IGhvbGRzOyB3aGVuIHRoZXkgZG8gbm90IGFsbCBmaXQsIHRoZSBib3gncyBsYXN0IHJvdyBzYXlzXG4gIC8vIHRoZSB0YWJsZSBjb250aW51ZXMgYW5kIHRoZSByZXN0IGdvIHRvIG92ZXJmbG93cyBmb3IgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGJveCB0b28gc2hvcnQgZm9yIGV2ZW4gdGhlIGhlYWQgY2FycmllcyB0aGUgbm90aWNlIGFzIGEgbGluZSBpbnN0ZWFkLlxuICAvLyBBIHRvdGFscyByb3cgY2xvc2VzIHRoZSB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsXG4gIC8vIGVsc2UgYWZ0ZXIgdGhlIGxhc3QgY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9ID0gaXRlbTtcbiAgICBjb25zdCBkYXRhID0gaXRlbS5kYXRhIGFzIENvbXBvbmVudERhdGE7XG4gICAgY29uc3QgaGVhZCA9IGxpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpXG4gICAgICAubWFwKChoZWFkaW5nKSA9PiB0aGlzLl9wZGZUZXh0KGhlYWRpbmcpKTtcbiAgICBjb25zdCB7IGNlbGxzLCBudW1lcmljLCBmb290IH0gPSB0aGlzLl90YWJsZUNlbGxzKGNvbnRleHQsIGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBub3RpY2UgdGFrZXMgdGhlIHBsYWNlIG9mIHRoZSBsYXN0IHJvdyB0aGF0IGZpdCwgc28gdGhhdCByb3cgbW92ZXNcbiAgICAvLyB0byB0aGUgY29udGludWF0aW9uLiBvbWl0dGVkID4gMCBtZWFucyBhIGZ1bGwgUERGX0xJU1RfUk9XUyBmZXRjaCwgd2hpY2hcbiAgICAvLyBuZXZlciBmaXRzIG9uZSBib3gsIHNvIHRoZSBDU1Ygbm90aWNlIGFsd2F5cyBsYW5kcyBvbiBhIGNvbnRpbnVhdGlvblxuICAgIC8vIHBhZ2UuXG4gICAgY29uc3Qga2VwdCA9IE1hdGgubWF4KDAsIGZpdCAtIDEpO1xuICAgIG92ZXJmbG93cy5wdXNoKHsgY29tcG9uZW50LCBzZWFyY2gsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBzdHJpbmdbXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgYm9keTogUGRmVGFibGVDZWxsW11bXSxcbiAgICB4OiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICAgIGNvbHVtblN0eWxlcz86IFBkZkNvbHVtblN0eWxlcyxcbiAgICBmb290Pzogc3RyaW5nW10gfCBudWxsLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkOiBbaGVhZF0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczogeyBmb250OiAnaGVsdmV0aWNhJywgZm9udFN0eWxlOiAnbm9ybWFsJywgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiBNVVRFRF9DT0xPUixcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsXG4gICAgICAgIC4uLihzaW5nbGVMaW5lID8geyBvdmVyZmxvdzogJ2VsbGlwc2l6ZScgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfV07XG4gIH1cblxuICAvLyBMYXlzIGV2ZXJ5IGZldGNoZWQgcm93IG91dCBvbmNlIG9uIGEgc2NyYXRjaCBkb2N1bWVudCBvZiB0aGUgc2FtZSBwYWdlXG4gIC8vIHNpemUsIHdpdGggdGhlIG9wdGlvbnMgdGhlIHJlYWwgZHJhdyB1c2VzLCBhbmQgcmVhZHMgYmFjayBob3cgbWFueSBib2R5XG4gIC8vIHJvd3MgdGhlIGJveCdzIHBhZ2UgaG9sZHMgKGZpdCkgYW5kIHRoZSBjb2x1bW4gd2lkdGhzIGF1dG9UYWJsZSBjaG9zZSxcbiAgLy8gd2l0aCBlYWNoIG51bWVyaWMgY29sdW1uJ3MgcmlnaHQgYWxpZ25tZW50IG1lcmdlZCBpbiwgc28gdGhlIG9uLXBhZ2VcbiAgLy8gdGFibGUgYW5kIGl0cyBjb250aW51YXRpb24gcGFnZXMgY2FycnkgYm90aC4gVGhlIHRvdGFscyByb3cgaXMgbGFpZCBvdXRcbiAgLy8gdG9vLCBzbyB0aGUgd2lkdGhzIGhvbGQgaXQsIGFuZCBhIHRhYmxlIHdob3NlIHJvd3MgZml0IHRoZSBib3ggYnV0IHdob3NlXG4gIC8vIHRvdGFscyByb3cgZG9lcyBub3QgbW92ZXMgaXRzIGxhc3Qgcm93IG9uLiBmaXQgMCBtZWFucyBub3QgZXZlbiBvbmVcbiAgLy8gYm9keSByb3cgZml0cyB1bmRlciB0aGUgaGVhZCAob3IgdGhlIGhlYWQgaXRzZWxmIGRpZCBub3QgZml0KTogYXV0b1RhYmxlXG4gIC8vIG1vdmVkIHRvIGEgbmV3IHBhZ2UgYmVmb3JlIGRyYXdpbmcuIFRoZSByZWFsIGRvY3VtZW50IGlzIHVudG91Y2hlZC5cbiAgcHJpdmF0ZSBfbWVhc3VyZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGNlbGxzOiBzdHJpbmdbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBmb290OiBzdHJpbmdbXSB8IG51bGwsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IHsgZml0OiBudW1iZXI7IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzIH0ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhvb2suc2VjdGlvbiA9PT0gJ2JvZHknICYmIHNjcmF0Y2guZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlciA9PT0gMSkge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IHsgd2lkdGg6IG51bWJlciB9W10gPSBzY3JhdGNoLmxhc3RBdXRvVGFibGUuY29sdW1ucztcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgY29sdW1uU3R5bGVzW2luZGV4XSA9IG51bWVyaWNbaW5kZXhdXG4gICAgICAgID8geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCwgaGFsaWduOiAncmlnaHQnIH1cbiAgICAgICAgOiB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUsIHRoZW4gcmVtb3ZlcyBhbnkgcGFnZSB0aGUgZHJhdyBhZGRlZC4gVGhhdCBzaG91bGRcbiAgLy8gbmV2ZXIgaGFwcGVuOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHMgYW5kIGFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBUaGUgY2hlY2sgZXhpc3RzIHNvIGFcbiAgLy8gc3RyYXkgcGFnZSBjYW4gbmV2ZXIgY2F0Y2ggdGhlIHJlcG9ydCBwYWdlJ3MgcmVtYWluaW5nIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgX2RyYXdUYWJsZShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHBhZ2UgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIG9wdGlvbnMpO1xuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2Fpbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlXG4gIC8vIGJhbmRzLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCBiYW5kcyA9IHBhZ2UubWFzdGVySGlkZGVuID8gTk9fQkFORFMgOiByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICBsZXQgY291bnRlciA9IHBhZ2VOdW1iZXI7XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGNvbnRleHQuYXV0b1RhYmxlKGRvYywge1xuICAgICAgLi4udGhpcy5fdGFibGVPcHRpb25zKFxuICAgICAgICBjb250ZXh0LCBvdmVyZmxvdy5oZWFkLCBvdmVyZmxvdy5udW1lcmljLCBib2R5LCB4LCB0b3AgKyBUSVRMRV9ILCB3LCBib3R0b20sIG92ZXJmbG93LmNvbHVtblN0eWxlcyxcbiAgICAgICAgb3ZlcmZsb3cuZm9vdCxcbiAgICAgICksXG4gICAgICBtYXJnaW46IHsgdG9wOiB0b3AgKyBUSVRMRV9ILCBib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcgfSxcbiAgICAgIHNob3dIZWFkOiAnZXZlcnlQYWdlJyxcbiAgICAgIC8vIEZpcmVzIG9uIGV2ZXJ5IHBhZ2UgdGhlIHRhYmxlIGRyYXdzIG9uLCB0aGUgZmlyc3QgaW5jbHVkZWQuXG4gICAgICB3aWxsRHJhd1BhZ2U6ICgpID0+IHtcbiAgICAgICAgY291bnRlciArPSAxO1xuICAgICAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgcGFnZSwgdGhpcy5fdG9rZW5zKHJlcG9ydCwgcGFnZSwgaW5kZXgsIGNvdW50ZXIpKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aGlzLl9jb250aW51ZWRUaXRsZShvdmVyZmxvdy5jb21wb25lbnQsIG92ZXJmbG93LnNlYXJjaCksIHgsIHRvcCwgdyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICAvLyBUaGUgbWFyZ2luIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gb25lIGVkZ2U6IGluc2lkZSB0aGUgYmFuZCB3aGVuXG4gIC8vIHRoZSBwYWdlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBiYW5kID8gYmFuZCAqIFBUICsgQ09OVElOVUFUSU9OX0dBUCA6IE5PX0JBTkRfTUFSR0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGludWVkVGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHNlYXJjaCk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICAvLyBBIEtQSSB0aWxlOiB0aGUgY2FyZCB0aGUgc2NyZWVuIGRyYXdzIChrcGktY2FyZC50cyBkZWNpZGVzIGV2ZXJ5IGxpbmUpLFxuICAvLyBzdGFja2VkIGFuZCBjZW50ZXJlZCBpbiB0aGUgYm9keS4gQSBjYXJkIHdpdGggb25seSBpdHMgdmFsdWUgYW5kIGxhYmVsXG4gIC8vIGtlZXBzIHRoZSB0aWxlJ3MgbG9uZy1zdGFuZGluZyBsYXlvdXQuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3QgdmlldyA9IGtwaUNhcmRWaWV3KGNvbmZpZywgaXRlbS5kYXRhLCB7IGZvcm1hdDogY29udGV4dC5mb3JtYXRDb250ZXh0LCB0aW1lem9uZTogY29udGV4dC50aW1lem9uZSB9KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQodmlldy52YWx1ZSk7XG4gICAgY29uc3Qgbm90ZXMgPSBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSk7XG5cbiAgICBpZiAoIWtwaUNhcmRIYXNFeHRyYXModmlldywgbm90ZXMpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgICBkb2MudGV4dCh2aWV3LmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGlsZSB0b28gc2hvcnQgZm9yIHRoZSBjYXJkJ3MgbGluZXMgc2hyaW5rcyB0aGVtIGFsbCBhbGlrZS5cbiAgICBjb25zdCBwYXJ0cyA9IGtwaUV4cG9ydFBhcnRzKHZpZXcsIG5vdGVzLCBoLCBLUElfSEVJR0hUUyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IHNjYWxlZEtwaUhlaWdodHMoS1BJX0hFSUdIVFMsIHBhcnRzLnNjYWxlKTtcbiAgICBsZXQgdG9wID0geSArIE1hdGgubWF4KDAsIChoIC0ga3BpRXhwb3J0SGVpZ2h0KHZpZXcsIHBhcnRzLCBoZWlnaHRzKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNiAqIHBhcnRzLnNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgdG9wICsgS1BJX1ZBTFVFX0JBU0VMSU5FICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIHRvcCArPSBoZWlnaHRzLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSAqIHBhcnRzLnNjYWxlKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LmxhYmVsKSwgdyksIHggKyB3IC8gMiwgdG9wICsgOSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnLCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy50YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnNwYXJrbGluZSAmJiB2aWV3LnNwYXJrbGluZSkge1xuICAgICAgdGhpcy5fa3BpU3BhcmtsaW5lKGRvYywgdmlldy5zcGFya2xpbmUudmFsdWVzLCB2aWV3LnNwYXJrbGluZS5wYXJ0aWFsLCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMuc3BhcmtsaW5lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0cy5ub3Rlcykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ2l0YWxpYycpO1xuICAgICAgdG9wICs9IGhlaWdodHMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlciwgc2NhbGUgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW2RlbHRhLnRvbmVdfWA7XG4gICAgY29uc3QgY2hhbmdlID0gdGhpcy5fcGRmVGV4dChkZWx0YS50ZXh0KTtcbiAgICBjb25zdCBzaXplID0gS1BJX0RFTFRBX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzaWRlID0gS1BJX0FSUk9XICogc2NhbGU7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBzaWRlICsgS1BJX0FSUk9XX0dBUCAqIHNjYWxlO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IGNoYW5nZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjaGFuZ2UpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBjb25zdCBjb21wYXJlZCA9IGRlbHRhLmNvbXBhcmVkXG4gICAgICA/IHRoaXMuX2ZpdChkb2MsIGAgJHt0aGlzLl9wZGZUZXh0KGRlbHRhLmNvbXBhcmVkKX1gLCBNYXRoLm1heCgwLCB3IC0gYXJyb3cgLSBjaGFuZ2VXaWR0aCkpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHdpZHRoID0gYXJyb3cgKyBjaGFuZ2VXaWR0aCArIChjb21wYXJlZCA/IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFyZWQpIDogMCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSB0b3AgKyBzaXplO1xuICAgIGxldCBsZWZ0ID0geCArIE1hdGgubWF4KDAsICh3IC0gd2lkdGgpIC8gMik7XG5cbiAgICBpZiAoYXJyb3cpIHtcbiAgICAgIGNvbnN0IHVwID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLlVwO1xuICAgICAgY29uc3QgdGlwID0gdXAgPyBiYXNlbGluZSAtIHNpZGUgOiBiYXNlbGluZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB1cCA/IGJhc2VsaW5lIDogYmFzZWxpbmUgLSBzaWRlO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgc2lkZSwgYmFzZSwgbGVmdCArIHNpZGUgLyAyLCB0aXAsICdGJyk7XG4gICAgICBsZWZ0ICs9IGFycm93O1xuICAgIH1cblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3IpO1xuICAgIGRvYy50ZXh0KGNoYW5nZSwgbGVmdCwgYmFzZWxpbmUpO1xuXG4gICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dChjb21wYXJlZCwgbGVmdCArIGNoYW5nZVdpZHRoLCBiYXNlbGluZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBsaW5lICgnR29hbDogJDEsMDAwIMK3IDU2JSBvZiB0YXJnZXQnKSBhbmQsIHdoZW4gdGhlIHNlcnZlciBzZW50XG4gIC8vIHRoZSBwcm9ncmVzcywgYSBiYXIgZmlsbGVkIHRoYXQgZmFyOiBncmVlbiBvbmNlIHRoZSB0YXJnZXQgaXMgbWV0LlxuICBwcml2YXRlIF9rcGlUYXJnZXQoZG9jOiBhbnksIHRhcmdldDogS3BpQ2FyZFRhcmdldCwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRhcmdldC5wcm9ncmVzcyA/IGAke3RhcmdldC50ZXh0fSDCtyAke3RhcmdldC5wcm9ncmVzc31gIDogdGFyZ2V0LnRleHQ7XG5cbiAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHRleHQpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJXID0gTWF0aC5taW4odyAqIDAuNiwgS1BJX0JBUl9XKTtcbiAgICBjb25zdCBiYXJYID0geCArICh3IC0gYmFyVykgLyAyO1xuICAgIGNvbnN0IGJhclkgPSB0b3AgKyBOT1RFX0xJTkVfSCArIDE7XG5cbiAgICBkb2Muc2V0RmlsbENvbG9yKEtQSV9UUkFDS19DT0xPUik7XG4gICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVywgS1BJX0JBUl9ILCAnRicpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID4gMCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW3RhcmdldC50b25lXX1gKTtcbiAgICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcgKiB0YXJnZXQuZmlsbCwgS1BJX0JBUl9ILCAnRicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzcGFya2xpbmUgaW4gYSBib3ggdW5kZXIgdGhlIGNhcmQncyBsaW5lcywgYXMgdGhlIHNjcmVlbiBkcmF3cyBpdFxuICAvLyAoa3BpU3BhcmtsaW5lR2VvbWV0cnksIGEgMC0xMDAgYm94KTogYSB2ZWN0b3IgbGluZSBwZXIgcnVuIG9mIHZhbHVlcywgYVxuICAvLyBkb3QgZm9yIGEgbG9uZSB2YWx1ZSwgYW5kIHRoZSBsYXN0IHBvaW50J3MgbWFya2VyLCBob2xsb3cgd2hpbGUgaXRzIHBlcmlvZFxuICAvLyBpcyBwYXJ0aWFsLlxuICBwcml2YXRlIF9rcGlTcGFya2xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgICBwYXJ0aWFsOiBib29sZWFuLFxuICAgIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBrcGlTcGFya2xpbmVHZW9tZXRyeSh2YWx1ZXMsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1pbih3ICogMC43LCBLUElfU1BBUktMSU5FX1cpO1xuICAgIGNvbnN0IGJveEggPSBLUElfSEVJR0hUUy5zcGFya2xpbmUgLSAyICogS1BJX1NQQVJLTElORV9JTlNFVDtcbiAgICBjb25zdCBsZWZ0ID0geCArICh3IC0gYm94VykgLyAyO1xuICAgIGNvbnN0IGF0ID0gKHBvaW50OiBLcGlTcGFya2xpbmVQb2ludCkgPT4gKHtcbiAgICAgIHg6IGxlZnQgKyBwb2ludC54ICogYm94VyAvIDEwMCxcbiAgICAgIHk6IHRvcCArIEtQSV9TUEFSS0xJTkVfSU5TRVQgKyBwb2ludC55ICogYm94SCAvIDEwMCxcbiAgICB9KTtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gO1xuXG4gICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldExpbmVXaWR0aCgxKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeS5saW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbGluZS5zcGxpdCgnICcpLm1hcCgocGFpcikgPT4ge1xuICAgICAgICBjb25zdCBbcHgsIHB5XSA9IHBhaXIuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gYXQoeyB4OiBweCwgeTogcHkgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZXBzID0gcG9pbnRzLnNsaWNlKDEpLm1hcCgocG9pbnQsIGluZGV4KSA9PiBbcG9pbnQueCAtIHBvaW50c1tpbmRleF0ueCwgcG9pbnQueSAtIHBvaW50c1tpbmRleF0ueV0pO1xuXG4gICAgICBkb2MubGluZXMoc3RlcHMsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueSwgWzEsIDFdLCAnUycsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRvdCBvZiBnZW9tZXRyeS5kb3RzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGRvdCk7XG4gICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkubGFzdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChnZW9tZXRyeS5sYXN0KTtcblxuICAgICAgaWYgKGdlb21ldHJ5Lmxhc3QuaG9sbG93KSB7XG4gICAgICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGRCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQSBmb3JtYXR0ZWQgdmFsdWUgYXMganNQREYgY2FuIGRyYXcgaXQuIEl0cyBzdGFuZGFyZCBmb250cyB3cml0ZSB0ZXh0IGluXG4gIC8vIFdpbkFuc2ksIHdoaWNoIGhhcyB0aGUgbm8tYnJlYWsgc3BhY2UgKFUrMDBBMCwgZnItQ0EncyBkaWdpdCBncm91cGluZykgYnV0XG4gIC8vIG5vdCB0aGUgbmFycm93IG9uZSAoVSsyMDJGLCB3aGljaCBvdGhlciBsb2NhbGVzIGdyb3VwIGFuZCBzcGFjZSB3aXRoKSwgdGhlXG4gIC8vIHRoaW4gYW5kIGhhaXIgc3BhY2VzIChVKzIwMDksIFUrMjAwQSwgd2hpY2ggSW50bCBwdXRzIGFyb3VuZCBhIGRhdGVcbiAgLy8gcmFuZ2UncyBkYXNoOiAnU2VwIDEg4oCTIDMwLCAyMDI2JyksIHRoZSBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcydcbiAgLy8gbmVnYXRpdmUgc2lnbikgb3IgYSByYW5rIGNoYW5nZSdzIHRyaWFuZ2xlczogZWFjaCB3b3VsZCBwcmludCBhcyBzdHJheVxuICAvLyBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbCBuZXZlclxuICAvLyB3cmFwcyBhY3Jvc3MgYSBsaW5lOyB0aGUgdGhpbiBhbmQgaGFpciBzcGFjZXMgYSBwbGFpbiBzcGFjZTsgdGhlIG1pbnVzXG4gIC8vIHNpZ24gYSBoeXBoZW47IGFuZCBhIHJhbmsncyByaXNlIGEgcGx1cyBzaWduIGFuZCBpdHMgZmFsbCBhIGh5cGhlblxuICAvLyAoJ+KWsiAyJyByZWFkcyAnKzInKS5cbiAgcHJpdmF0ZSBfcGRmVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFx1MjAyRi9nLCAnXFx1MDBBMCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMDlcXHUyMDBBXS9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCMlxccz8vZywgJysnKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QkNcXHM/L2csICctJyk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==
983
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQWlGLFVBQVUsR0FDN0csTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUNMLHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixHQUN0RyxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUM0RCxrQkFBa0IsRUFDbkYsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDckcsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQzNHLFlBQVksR0FDYixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFB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QUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUNwRSxVQUFVLENBQUMsTUFBaUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JFLEdBQUc7WUFDSCxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtTQUNqRixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxLQUFLLENBQUMsSUFBWTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDO0lBQzVGLENBQUM7d0dBOW1DVSxnQkFBZ0I7NEdBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZXBvcnRLcGlUcmVuZCB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1rcGktdHJlbmQuZW51bSc7XG5pbXBvcnQgeyByZXNvbHZlUmVwb3J0VGltZXpvbmUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0SGVhZGVyRm9vdGVyLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgS3BpQ2FyZERlbHRhLCBLcGlDYXJkVGFyZ2V0LCBLcGlTcGFya2xpbmVQb2ludCwga3BpQ2FyZFZpZXcsIGtwaVNwYXJrbGluZUdlb21ldHJ5LFxufSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HIH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEVYVF9DT0xPUiwgREVGQVVMVF9URVhUX1NJWkUsIFRFWFRfVEFCTEVfQk9SREVSX0NPTE9SLCBURVhUX1RBQkxFX0JPUkRFUl9XSURUSCwgVEVYVF9UQUJMRV9DRUxMX1BBRERJTkcsXG4gIFRFWFRfVEFCTEVfTUFSR0lOLCBUZXh0UGFyYWdyYXBoLCBUZXh0UnVuLCBUZXh0VGFibGUsIFRleHRUYWJsZUNlbGwsIFRleHRUb2tlbkNvbnRleHQsIFRleHRWYWx1ZSwgdGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi4vdGV4dCc7XG5pbXBvcnQge1xuICBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlMsIFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SLCBSRVBPUlRfS1BJX1RSQUNLX0NPTE9SLCBSRVBPUlRfTVVURURfVEVYVF9DT0xPUixcbn0gZnJvbSAnLi4vdGhlbWUvcGFsZXR0ZSc7XG5pbXBvcnQgeyBpc0RyYXduIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQge1xuICBCdWlsdEV4cG9ydCwgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRQYWdlLCBDb2xsZWN0ZWRSZXBvcnQsIEhFQURFUl9GT09URVJfTkFNRSwgS3BpRXhwb3J0SGVpZ2h0cywgVGV4dE92ZXJmbG93LFxuICBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLCBleHBvcnROb3RlTGluZXMsIGV4cG9ydFRpdGxlLCBleHBvcnRXaW5kb3dzTGluZSwga3BpQ2FyZEhhc0V4dHJhcyxcbiAga3BpRXhwb3J0SGVpZ2h0LCBrcGlFeHBvcnRQYXJ0cywgbGlzdENvbHVtbnMsIGxpc3RIZWFkaW5ncywgbGlzdFRvdGFsc1JvdywgbW9yZVJvd3NOb3RpY2UsIHNjYWxlZEtwaUhlaWdodHMsXG4gIHRleHRPdmVyZmxvdyxcbn0gZnJvbSAnLi9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlLCBUZXh0VGFibGVMYXlvdXQgfSBmcm9tICcuL3JlcG9ydC10ZXh0LWxheW91dC5zZXJ2aWNlJztcblxuXG4vLyBJbmNoZXMg4oaSIHBvaW50cyAodGhlIFBERiB1bml0KS5cbmNvbnN0IFBUID0gNzI7XG5cbi8vIENvbXBvbmVudCB0aXRsZSBzdHJpcCBoZWlnaHQsIHBvaW50cy5cbmNvbnN0IFRJVExFX0ggPSAxODtcblxuLy8gVGhlIHNtYWxsIHByaW50IGEgY29tcG9uZW50IG1heSBjYXJyeSwgcG9pbnRzOiB0aGUgZGF5cyBpdCByZWFkcyB1bmRlciBpdHNcbi8vIHRpdGxlIChhIHN1YnRpdGxlIGxpbmUpLCBpdHMgbm90ZXMgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveCAoYSBsaW5lIGVhY2gpLCBhbmRcbi8vIHRoZSBsaW5lcyBvZiBhIEtQSSBjYXJkIHVuZGVyIGl0cyB2YWx1ZS4gQSBjaGFydCdzIG9yIGEgbGlzdCdzIG5vdGVzIGdpdmVcbi8vIHdheSBiZWZvcmUgaXRzIGJvZHkgd291bGQgc2hyaW5rIHVuZGVyIE1JTl9CT0RZX0guXG5jb25zdCBTTUFMTF9TSVpFID0gNy41O1xuY29uc3QgU1VCVElUTEVfSCA9IDExO1xuY29uc3QgTk9URV9MSU5FX0ggPSAxMDtcbmNvbnN0IE1JTl9CT0RZX0ggPSA0MDtcbmNvbnN0IE1VVEVEX0NPTE9SID0gYCMke1JFUE9SVF9NVVRFRF9URVhUX0NPTE9SfWA7XG5cbi8vIEEgS1BJIGNhcmQncyBwYXJ0cywgdG9wIHRvIGJvdHRvbSwgcG9pbnRzIChrcGlFeHBvcnRQYXJ0cyBzaGVkcyB0aGVcbi8vIHNwYXJrbGluZSwgdGhlbiB0aGUgdGFyZ2V0LCB0aGVuIHRoZSBub3RlcyBvbiBhIHNob3J0IHRpbGUpLiBUaGUgdmFsdWUnc1xuLy8gYmFzZWxpbmUgc2l0cyBLUElfVkFMVUVfQkFTRUxJTkUgdW5kZXIgaXRzIHRvcC5cbmNvbnN0IEtQSV9IRUlHSFRTOiBLcGlFeHBvcnRIZWlnaHRzID0ge1xuICB2YWx1ZTogMzAsXG4gIGxhYmVsOiAxMyxcbiAgZGVsdGE6IDEzLFxuICB3aW5kb3c6IE5PVEVfTElORV9ILFxuICB0YXJnZXQ6IE5PVEVfTElORV9IICsgNixcbiAgc3BhcmtsaW5lOiAyOCxcbiAgbm90ZTogTk9URV9MSU5FX0gsXG59O1xuY29uc3QgS1BJX1ZBTFVFX0JBU0VMSU5FID0gMjM7XG5jb25zdCBLUElfREVMVEFfU0laRSA9IDk7XG4vLyBUaGUgZGVsdGEncyB0cmlhbmdsZTogaXRzIHNpZGUsIGFuZCB0aGUgZ2FwIGJlZm9yZSB0aGUgY2hhbmdlLlxuY29uc3QgS1BJX0FSUk9XID0gNjtcbmNvbnN0IEtQSV9BUlJPV19HQVAgPSAzO1xuLy8gVGhlIHRhcmdldCdzIHByb2dyZXNzIGJhciwgYW5kIHRoZSB0cmFjayBpdCBmaWxscy5cbmNvbnN0IEtQSV9CQVJfVyA9IDEyMDtcbmNvbnN0IEtQSV9CQVJfSCA9IDM7XG5jb25zdCBLUElfVFJBQ0tfQ09MT1IgPSBgIyR7UkVQT1JUX0tQSV9UUkFDS19DT0xPUn1gO1xuLy8gVGhlIHNwYXJrbGluZSdzIHdpZGVzdCBib3gsIGl0cyB0b3AgYW5kIGJvdHRvbSBpbnNldCwgYW5kIGl0cyBkb3RzJyByYWRpdXMuXG5jb25zdCBLUElfU1BBUktMSU5FX1cgPSAxNDA7XG5jb25zdCBLUElfU1BBUktMSU5FX0lOU0VUID0gMztcbmNvbnN0IEtQSV9ET1RfUiA9IDEuNTtcblxuLy8gUm93cyBmZXRjaGVkIGZvciBhIGxpc3QncyBQREYgdGFibGUuIEEgdGFibGUgdGhhdCBvdXRncm93cyBpdHMgYm94XG4vLyBjb250aW51ZXMgb250byBwYWdlcyBvZiBpdHMgb3duLCBzbyB0aGlzIGlzIGhvdyBmYXIgaXQgbWF5IHJ1bjogYWJvdXQgMTItMTVcbi8vIGNvbnRpbnVhdGlvbiBwYWdlcyBvbiBhIGxldHRlciBwYWdlLCBhbmQgYSB0ZW50aCBvZiB0aGUgc2VydmVyJ3MgNTAwMC1yb3dcbi8vIGNlaWxpbmcuIEEgbG9uZ2VyIHJlc3VsdCBlbmRzIGluIGEgbW9yZVJvd3NOb3RpY2UoKSByb3cuXG5leHBvcnQgY29uc3QgUERGX0xJU1RfUk9XUyA9IDUwMDtcblxuLy8gSG93IGZhciBhIGNvbnRpbnVhdGlvbiB0YWJsZSBzaXRzIGluc2lkZSB0aGUgaGVhZGVyIGFuZCBmb290ZXIgYmFuZHMsXG4vLyBwb2ludHMuIEEgcGFnZSB3aXRoIG5vIGJhbmQgKG9yIHdpdGggdGhlIG1hc3RlciBoaWRkZW4pIGtlZXBzXG4vLyBOT19CQU5EX01BUkdJTiBmcm9tIHRoYXQgZWRnZSBpbnN0ZWFkLlxuY29uc3QgQ09OVElOVUFUSU9OX0dBUCA9IDAuMjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRfTUFSR0lOID0gMC41ICogUFQ7XG5jb25zdCBOT19CQU5EUzogUmVwb3J0SGVhZGVyRm9vdGVyID0geyBoZWFkZXJIZWlnaHQ6IDAsIGZvb3RlckhlaWdodDogMCB9O1xuXG4vLyBUaGUgbGFzdCByb3cgb2YgYSBsaXN0IGJveCB3aG9zZSByb3dzIGNhcnJ5IG9uIHBhc3QgaXQuXG5jb25zdCBDT05USU5VRURfTk9USUNFID0gJ0NvbnRpbnVlZCBvbiB0aGUgZm9sbG93aW5nIHBhZ2VzJztcblxuLy8gQSB0ZXh0IGxpbmUncyBoZWlnaHQgYXMgYSBtdWx0aXBsZSBvZiBpdHMgbGFyZ2VzdCBmb250IHNpemUg4oCUIHRoZSBjYW52YXNcbi8vIHN0eWxlc2hlZXQncyBsaW5lLWhlaWdodCwgc28gYSBibG9jayB3cmFwcyBhbmQgc3RhY2tzIHRoZSBzYW1lIHdheS5cbmNvbnN0IFRFWFRfTElORV9IRUlHSFQgPSAxLjI1O1xuXG4vLyBIb3cgZmFyIGEgbGlzdCBpdGVtJ3MgdGV4dCBzaXRzIGZyb20gdGhlIGJsb2NrJ3MgZWRnZSwgcG9pbnRzOyB0aGUgbWFya2VyXG4vLyBoYW5ncyBpbiB0aGF0IHNwYWNlLlxuY29uc3QgTElTVF9JTkRFTlQgPSAxNjtcblxuLy8gV2hhdCB0aGUgZXhwb3J0J3Mgb3ZlcmZsb3cgZ2F0ZSBzYXlzIHRoZSBQREYgZG9lcyB3aXRoIGEgdGV4dCBibG9jayB0aGF0IGRvZXNcbi8vIG5vdCBmaXQgaXRzIGJveC5cbmNvbnN0IFBERl9PVkVSRkxPV19OT1RFID0gJ1RoZSBQREYgY3V0cyBpdCBvZmYgYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94Lic7XG5cbi8vIFdoYXQgZXZlcnkgZHJhd2luZyBzdGVwIG9mIG9uZSBleHBvcnQgc2hhcmVzLCBidWlsdCBvbmNlIGluIGJ1aWxkKCkuXG4vLyBTaXplcyBhcmUgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZkV4cG9ydENvbnRleHQge1xuICBkb2M6IGFueTtcbiAgYXV0b1RhYmxlOiBhbnk7XG4gIGpzUERGOiBhbnk7XG4gIHJlcG9ydDogUmVwb3J0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICBmb3JtYXRDb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICBwYWdlVzogbnVtYmVyO1xuICBwYWdlSDogbnVtYmVyO1xuICBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScgfCAncG9ydHJhaXQnO1xuICAvLyBXaGF0IHRoZSBoZWFkZXIgYW5kIGZvb3RlcidzIHZhbHVlIHRva2VucyBmaWxsIHdpdGgsIHRoZSBzYW1lIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UsIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCAoX3BkZlZhbHVlcykuXG4gIG1hc3RlclZhbHVlczogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPjtcbiAgLy8gVGhlIHRleHQgYmxvY2tzIGN1dCBvZmYgYXQgdGhlIGJvdHRvbSBvZiB0aGVpciBib3gsIGJ5IGNvbXBvbmVudCBpZCwgc28gYVxuICAvLyBoZWFkZXIgb3IgZm9vdGVyIGJsb2NrIGN1dCBvbiBldmVyeSBwYWdlIGlzIGxpc3RlZCBvbmNlLlxuICB0ZXh0T3ZlcmZsb3dzOiBNYXA8bnVtYmVyLCBUZXh0T3ZlcmZsb3c+O1xufVxuXG4vLyBBIHdvcmQgb2YgYSB3cmFwcGVkIGxpbmUgKF93cmFwKTogaXRzIHJ1biwgaXRzIHRleHQgd2l0aCBhbnkgdHJhaWxpbmcgc3BhY2UsXG4vLyBpdHMgZm9udCBzaXplIGFuZCBpdHMgd2lkdGgsIHBvaW50cy5cbmludGVyZmFjZSBQZGZXb3JkIHtcbiAgcnVuOiBUZXh0UnVuO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbn1cblxuLy8gV2hlcmUgYSB0ZXh0IGJsb2NrJ3Mgd29yZHMgYXJlIGRyYXduLCBwb2ludHM6IHRoZSBsZWZ0IGVkZ2UgYW5kIHdpZHRoIHRoZXlcbi8vIHdyYXAgdG8sIHRoZSB0b3Agb2YgdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgYm90dG9tIG5vIGxpbmUgbWF5IHJ1biBwYXN0LiBBXG4vLyB0ZXh0IHRhYmxlJ3MgY2VsbCBkcmF3cyBpdHMgd29yZHMgdGhlIHNhbWUgd2F5LCBpbnNpZGUgaXRzIHBhZGRpbmcuXG5pbnRlcmZhY2UgUGRmVGV4dEJveCB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xufVxuXG4vLyBXaGVyZSB0aGUgbmV4dCBwYXJ0IG9mIGEgdGV4dCBibG9jayBzdGFydHMsIGFuZCB3aGV0aGVyIHRoZSBwYXJ0IGp1c3QgZHJhd25cbi8vIHdhcyBjdXQgb2ZmIGF0IHRoZSBib3R0b20gb2YgaXRzIGJveC5cbmludGVyZmFjZSBQZGZUZXh0Q3Vyc29yIHtcbiAgY3Vyc29yWTogbnVtYmVyO1xuICBjdXQ6IGJvb2xlYW47XG59XG5cbi8vIEEgdGV4dCB0YWJsZSdzIGNlbGwgYXMgYXV0b1RhYmxlIHRha2VzIGl0LiBJdCBwcmludHMgbm8gdGV4dCBvZiBpdHMgb3duOiB0aGVcbi8vIGNlbGwncyB3b3JkcyAodGV4dENlbGwpIGFyZSBkcmF3biBpbnRvIGl0IG9uY2UgaXRzIGdyaWQgbGluZXMgYW5kIGZpbGwgYXJlXG4vLyAoX2RyYXdUZXh0Q2VsbCkuXG5pbnRlcmZhY2UgUGRmVGV4dENlbGxJbnB1dCB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgY29sU3BhbjogbnVtYmVyO1xuICByb3dTcGFuOiBudW1iZXI7XG4gIHRleHRDZWxsOiBUZXh0VGFibGVDZWxsO1xuICBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyBGaXhlZCBjb2x1bW4gd2lkdGhzLCBieSBjb2x1bW4gaW5kZXgsIGluIHBvaW50cywgYW5kIHRoZSByaWdodCBhbGlnbm1lbnQgb2Zcbi8vIGEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzLlxudHlwZSBQZGZDb2x1bW5TdHlsZXMgPSBSZWNvcmQ8bnVtYmVyLCB7IGNlbGxXaWR0aDogbnVtYmVyOyBoYWxpZ24/OiAncmlnaHQnIH0+O1xuXG4vLyBBIHRhYmxlIGJvZHkgY2VsbDogcGxhaW4gdGV4dCwgb3IgYSBub3RpY2Ugcm93J3Mgb25lIGNlbGwgc3Bhbm5pbmcgZXZlcnlcbi8vIGNvbHVtbi5cbnR5cGUgUGRmVGFibGVDZWxsID0gc3RyaW5nIHwgeyBjb250ZW50OiBzdHJpbmc7IGNvbFNwYW46IG51bWJlcjsgc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuXG4vLyBUaGUgcm93cyBvZiBhIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBjYXJyaWVkIG9udG8gY29udGludWF0aW9uXG4vLyBwYWdlcyBhZnRlciBpdHMgcmVwb3J0IHBhZ2UuIHggYW5kIHcgYXJlIHRoZSBib3gncywgaW4gcG9pbnRzLCBhbmQgdGhlXG4vLyBjb2x1bW4gd2lkdGhzIGFuZCBhbGlnbm1lbnRzIGFyZSB0aGUgb25lcyB0aGUgb24tcGFnZSB0YWJsZSB3YXMgZHJhd24gd2l0aCxcbi8vIHNvIHRoZSB0YWJsZSByZWFkcyBhcyBvbmUgYWNyb3NzIHBhZ2VzLlxuaW50ZXJmYWNlIFBkZlRhYmxlT3ZlcmZsb3cge1xuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgLy8gVGhlIHRleHQgdGhlIGxpc3Qgd2FzIHNlYXJjaGVkIGJ5LCBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aXRsZS5cbiAgc2VhcmNoPzogc3RyaW5nO1xuICAvLyBUaGUgY3J1bWJzIG9mIGl0cyBkcmlsbCBwYXRoLCBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aXRsZS5cbiAgY3J1bWJzPzogc3RyaW5nW107XG4gIGhlYWQ6IHN0cmluZ1tdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIHJvd3M6IHN0cmluZ1tdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgLy8gVGhlIGxpc3QncyB0b3RhbHMgcm93LCB3aGljaCBjbG9zZXMgdGhlIGxhc3QgY29udGludWF0aW9uIHBhZ2UuXG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuXG4vL1xuLy8gQSB0ZXh0IGJsb2NrJ3MgdGFibGVzIGFyZSBkcmF3biBieSBhdXRvVGFibGUgdG9vLCBmcm9tIHRoZSBsaW5lIGl0cyB3b3Jkc1xuLy8gcmVhY2gsIGluIHRoZSBjb2x1bW4gd2lkdGhzIHRoZSBjYW52YXMgZ2l2ZXMgdGhlbSAoUmVwb3J0VGV4dExheW91dFNlcnZpY2UpLlxuLy8gQSB0ZXh0IGJsb2NrIGlzIGN1dCBhdCB0aGUgYm90dG9tIG9mIGl0cyBib3gsIGFzIHRoZSBjYW52YXMgY2xpcHMgaXQsIGFuZFxuLy8gYnVpbGQoKSBoYW5kcyB0aGUgZmlsZSBiYWNrIHVuc2F2ZWQgd2l0aCB0aGUgYmxvY2tzIGl0IGN1dCwgc28gdGhlIGV4cG9ydFxuLy8gY2FuIGFzayBhYm91dCB0aGVtIGJlZm9yZSBpdCBzYXZlcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90ZXh0TGF5b3V0ID0gaW5qZWN0KFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlKTtcblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPEJ1aWx0RXhwb3J0PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3ZlcmZsb3dzOiBbLi4uY29udGV4dC50ZXh0T3ZlcmZsb3dzLnZhbHVlcygpXSxcbiAgICAgIG92ZXJmbG93Tm90ZTogUERGX09WRVJGTE9XX05PVEUsXG4gICAgICBzYXZlOiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuZG9jLnNhdmUoYCR7dGhpcy5fc2x1Zyhjb2xsZWN0ZWQucmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRleHQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPFBkZkV4cG9ydENvbnRleHQ+IHtcbiAgICBjb25zdCByZXBvcnQgPSBjb2xsZWN0ZWQucmVwb3J0O1xuICAgIGNvbnN0IHsganNQREYgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgICBjb25zdCBhdXRvVGFibGUgPSAoYXdhaXQgaW1wb3J0KCdqc3BkZi1hdXRvdGFibGUnKSkuZGVmYXVsdDtcblxuICAgIGNvbnN0IHBhZ2VXID0gcmVwb3J0LnBhZ2VXaWR0aCAqIFBUO1xuICAgIGNvbnN0IHBhZ2VIID0gcmVwb3J0LnBhZ2VIZWlnaHQgKiBQVDtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvYzogbmV3IGpzUERGKHsgb3JpZW50YXRpb24sIHVuaXQ6ICdwdCcsIGZvcm1hdDogW3BhZ2VXLCBwYWdlSF0gfSksXG4gICAgICBhdXRvVGFibGUsXG4gICAgICBqc1BERixcbiAgICAgIHJlcG9ydCxcbiAgICAgIHRpbWV6b25lOiByZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSxcbiAgICAgIGZvcm1hdENvbnRleHQ6IGNvbGxlY3RlZC5mb3JtYXRDb250ZXh0LFxuICAgICAgcGFnZVcsXG4gICAgICBwYWdlSCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgbWFzdGVyVmFsdWVzOiB0aGlzLl9wZGZWYWx1ZXMoY29sbGVjdGVkLm1hc3RlclZhbHVlcyksXG4gICAgICB0ZXh0T3ZlcmZsb3dzOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLiBUaGUgcGFnZSdzIHRleHQgZmlsbHMgaXRzIHZhbHVlIHRva2VucyB3aXRoIHRoZSBwYWdlJ3MgdmFsdWVzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyKTtcbiAgICBjb25zdCBwYWdlVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogdGhpcy5fcGRmVmFsdWVzKGNvbGxlY3RlZFBhZ2UudmFsdWVzKSB9O1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICBhd2FpdCB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb21wb25lbnQoY29udGV4dCwgaXRlbSwgb3ZlcmZsb3dzKTtcbiAgICAgIH0gZWxzZSBpZiAoYXdhaXQgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LCBpdGVtLmNvbXBvbmVudCwgcGFnZVRva2VucykpIHtcbiAgICAgICAgdGhpcy5fcmVjb3JkT3ZlcmZsb3coY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHRva2Vucy5wYWdlTmFtZSwgcGFnZVRva2Vucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyLCB0aGVpciB2YWx1ZSB0b2tlbnMgZmlsbGVkIHdpdGggdGhlIG1hc3RlcidzIHZhbHVlc1xuICAvLyB3aGljaGV2ZXIgcGFnZSB0aGV5IHNpdCBvbjogYSByZXBvcnQgcGFnZSBvciBhIGNvbnRpbnVhdGlvbiBwYWdlLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJNYXN0ZXIoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgcGFnZTogUmVwb3J0UGFnZSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhZ2UubWFzdGVySGlkZGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFzdGVyVG9rZW5zID0geyAuLi50b2tlbnMsIHZhbHVlczogY29udGV4dC5tYXN0ZXJWYWx1ZXMgfTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIChjb250ZXh0LnJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcihpc0RyYXduKSkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgY29tcG9uZW50LCBtYXN0ZXJUb2tlbnMpKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZE92ZXJmbG93KGNvbnRleHQsIGNvbXBvbmVudCwgSEVBREVSX0ZPT1RFUl9OQU1FLCBtYXN0ZXJUb2tlbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExpc3RzIGEgdGV4dCBibG9jayB0aGF0IHdhcyBjdXQsIHVuZGVyIHRoZSBwYWdlIHRoZSBleHBvcnQncyBvdmVyZmxvdyBnYXRlXG4gIC8vIG5hbWVzIGl0IGJ5LiBBIGJsb2NrIGN1dCBhZ2FpbiBvbiBhIGxhdGVyIHBhZ2UgKGEgaGVhZGVyIG9yIGZvb3Rlcikga2VlcHNcbiAgLy8gdGhlIGZpcnN0IGVudHJ5LlxuICBwcml2YXRlIF9yZWNvcmRPdmVyZmxvdyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHBhZ2U6IHN0cmluZyxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICk6IHZvaWQge1xuICAgIGlmICghY29udGV4dC50ZXh0T3ZlcmZsb3dzLmhhcyhjb21wb25lbnQuaWQpKSB7XG4gICAgICBjb250ZXh0LnRleHRPdmVyZmxvd3Muc2V0KGNvbXBvbmVudC5pZCwgdGV4dE92ZXJmbG93KGNvbXBvbmVudCwgcGFnZSwgdG9rZW5zKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIHRoZVxuICAvLyB3b3JkcyBiZXR3ZWVuIGl0cyB0YWJsZXMgYXJlIGRyYXduIGxpbmUgYnkgbGluZSAoX2RyYXdQYXJhZ3JhcGhzKSBhbmQgZWFjaFxuICAvLyB0YWJsZSBieSBhdXRvVGFibGUgZnJvbSB0aGUgbGluZSB0aGUgd29yZHMgYWJvdmUgaXQgcmVhY2hcbiAgLy8gKF9kcmF3VGV4dFRhYmxlKS4gT25seSBhIGJsb2NrIHdpdGggYSB0YWJsZSBpcyBtZWFzdXJlZCwgZm9yIHRoZSBlZGdlc1xuICAvLyBhbmQgY29sdW1uIHdpZHRocyB0aGUgY2FudmFzIGdpdmVzIGl0cyB0YWJsZXMuIFdoYXRldmVyIHJ1bnMgcGFzdFxuICAvLyB0aGUgYmxvY2sncyBoZWlnaHQgaXMgbGVmdCBvZmYg4oCUIHRoZSBjYW52YXMgY2xpcHMgdGhlIGJsb2NrIHRoZXJlIHRvby5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIGFueXRoaW5nIHdhcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyVGV4dChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYm94ID0gdGhpcy5fdGV4dEJveChjb21wb25lbnQpO1xuICAgIGNvbnN0IGJsb2NrcyA9IHRleHRCbG9ja3MoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKTtcbiAgICBjb25zdCBsYXlvdXQgPSBibG9ja3Muc29tZSgoYmxvY2spID0+IGJsb2NrLmtpbmQgPT09ICd0YWJsZScpXG4gICAgICA/IGF3YWl0IHRoaXMuX3RleHRMYXlvdXQubWVhc3VyZShjb21wb25lbnQsIHRva2VucylcbiAgICAgIDogbnVsbDtcbiAgICBsZXQgY3Vyc29yWSA9IGJveC50b3A7XG4gICAgbGV0IHRhYmxlSW5kZXggPSAwO1xuICAgIC8vIFRoZSBjdXJzb3Igc2l0cyBvbiBhIHRhYmxlJ3MgYm90dG9tIG1hcmdpbiwgbm90aGluZyBkcmF3biBzaW5jZTogdGhlXG4gICAgLy8gbmV4dCB0YWJsZSdzIHRvcCBtYXJnaW4gaXMgdGhlIHNhbWUgc3BhY2UsIGFzIHR3byBibG9jayBtYXJnaW5zIHRoYXRcbiAgICAvLyBtZWV0IGNvbGxhcHNlIGludG8gb25lIG9uIHRoZSBjYW52YXMuXG4gICAgbGV0IG9uTWFyZ2luID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgY29uc3QgZHJhd24gPSBibG9jay5raW5kID09PSAndGV4dCdcbiAgICAgICAgPyB0aGlzLl9kcmF3UGFyYWdyYXBocyhjb250ZXh0LmRvYywgYmxvY2sucGFyYWdyYXBocywgYm94LCBjdXJzb3JZKVxuICAgICAgICA6IHRoaXMuX2RyYXdUZXh0VGFibGUoXG4gICAgICAgICAgY29udGV4dCwgYmxvY2sudGFibGUsIGxheW91dD8udGFibGVzW3RhYmxlSW5kZXgrK10gPz8gbnVsbCwgYm94LFxuICAgICAgICAgIG9uTWFyZ2luID8gY3Vyc29yWSA6IGN1cnNvclkgKyBURVhUX1RBQkxFX01BUkdJTixcbiAgICAgICAgKTtcblxuICAgICAgaWYgKGRyYXduLmN1dCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY3Vyc29yWSA9IGRyYXduLmN1cnNvclk7XG4gICAgICBvbk1hcmdpbiA9IGJsb2NrLmtpbmQgPT09ICd0YWJsZScgfHwgKG9uTWFyZ2luICYmICFibG9jay5wYXJhZ3JhcGhzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2hlcmUgYSB0ZXh0IGJsb2NrJ3Mgd29yZHMgZ286IGluc2lkZSBpdHMgcGFkZGluZywgZWFjaCBlZGdlIDEvOFwiIHVubGVzc1xuICAvLyBzZXQuXG4gIHByaXZhdGUgX3RleHRCb3goY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBQZGZUZXh0Qm94IHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCksXG4gICAgICB0b3A6IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApLFxuICAgICAgd2lkdGg6IGNvbXBvbmVudC53ICogUFQgLSBpbnNldChwYWRkaW5nPy5sZWZ0KSAtIGluc2V0KHBhZGRpbmc/LnJpZ2h0KSxcbiAgICAgIGJvdHRvbTogKGNvbXBvbmVudC55ICsgY29tcG9uZW50LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJhZ3JhcGhzIGRyYXduIGxpbmUgYnkgbGluZSBmcm9tIGN1cnNvclkgZG93bjogZWFjaCBvbmUncyBydW5zIGFyZSBicm9rZW5cbiAgLy8gaW50byB3b3Jkcywgd3JhcHBlZCB0byB0aGUgYm94J3Mgd2lkdGggYW5kIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd25cbiAgLy8gZm9udCwgc2l6ZSBhbmQgY29sb3IsIGEgbGlzdCBpdGVtJ3MgbWFya2VyIGh1bmcgaW4gaXRzIGluZGVudC4gVGhlIGZpcnN0XG4gIC8vIGxpbmUgdGhhdCB3b3VsZCBydW4gcGFzdCB0aGUgYm94J3MgYm90dG9tIGVuZHMgdGhlIGRyYXdpbmcsIGN1dC5cbiAgcHJpdmF0ZSBfZHJhd1BhcmFncmFwaHMoZG9jOiBhbnksIHBhcmFncmFwaHM6IFRleHRQYXJhZ3JhcGhbXSwgYm94OiBQZGZUZXh0Qm94LCBjdXJzb3JZOiBudW1iZXIpOiBQZGZUZXh0Q3Vyc29yIHtcbiAgICBsZXQgeSA9IGN1cnNvclk7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgcGFyYWdyYXBocykge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgYm94LndpZHRoIC0gaW5kZW50KTtcblxuICAgICAgZm9yIChjb25zdCBbbGluZUluZGV4LCBsaW5lXSBvZiBsaW5lcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2xpbmVTaXplKHBhcmFncmFwaCwgbGluZSk7XG4gICAgICAgIGlmICh5ICsgc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQgPiBib3guYm90dG9tICsgMC41KSB7XG4gICAgICAgICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGJveC5sZWZ0LCB5ICsgc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kcmF3TGluZShkb2MsIGxpbmUsIHBhcmFncmFwaC5hbGlnbiwgYm94LmxlZnQgKyBpbmRlbnQsIGJveC53aWR0aCAtIGluZGVudCwgeSArIHNpemUpO1xuICAgICAgICB5ICs9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgeSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY3Vyc29yWTogeSwgY3V0OiBmYWxzZSB9O1xuICB9XG5cbiAgLy8gSG93IGZhciBfZHJhd1BhcmFncmFwaHMgdGFrZXMgaXRzIGN1cnNvciBkb3duIGRyYXdpbmcgdGhlIHBhcmFncmFwaHMgd2hvbGVcbiAgLy8gYXQgYSB3aWR0aC5cbiAgcHJpdmF0ZSBfcGFyYWdyYXBoc0hlaWdodChkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCB3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcGFyYWdyYXBocy5yZWR1Y2UoKGhlaWdodCwgcGFyYWdyYXBoKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gKHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDApKTtcblxuICAgICAgcmV0dXJuIGhlaWdodCArIChsaW5lcy5sZW5ndGhcbiAgICAgICAgPyBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKSAqIFRFWFRfTElORV9IRUlHSFQsIDApXG4gICAgICAgIDogREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIEEgbGluZSdzIGZvbnQgc2l6ZTogaXRzIGxhcmdlc3Qgd29yZCdzLCBhbmQgbmV2ZXIgdW5kZXIgaXRzIHBhcmFncmFwaCdzXG4gIC8vIGZpcnN0IHJ1bidzLlxuICBwcml2YXRlIF9saW5lU2l6ZShwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIGxpbmU6IFBkZldvcmRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICB9XG5cbiAgLy8gT25lIHdyYXBwZWQgbGluZSBvbiBpdHMgYmFzZWxpbmUsIGFsaWduZWQgd2l0aGluIHRoZSB3aWR0aCBmcm9tIGxlZnQuXG4gIHByaXZhdGUgX2RyYXdMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIGxpbmU6IFBkZldvcmRbXSxcbiAgICBhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSxcbiAgICBsZWZ0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgIGxldCB4ID0gbGVmdCArIHRoaXMuX2FsaWduT2Zmc2V0KGFsaWduLCB3aWR0aCwgbGluZVdpZHRoKTtcblxuICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgIHggKz0gd29yZC53aWR0aDtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRhYmxlIGluIGEgdGV4dCBibG9jaywgZHJhd24gYnkgYXV0b1RhYmxlIGZyb20gdG9wIChfcmVuZGVyVGV4dCBwdXRzIGl0XG4gIC8vIFRFWFRfVEFCTEVfTUFSR0lOIHVuZGVyIHRoZSBsaW5lIHRoZSB3b3JkcyBhYm92ZSBpdCByZWFjaCksIGluIHRoZSBvbmVcbiAgLy8gbG9vayBldmVyeSByZW5kZXJlciBkcmF3cyAoVEVYVF9UQUJMRV8qIGluIHRleHQudHMpLiBJdHMgbGVmdCBlZGdlLCB3aWR0aFxuICAvLyBhbmQgY29sdW1uIHdpZHRocyBhcmUgdGhlIGNhbnZhcydzIChsYXlvdXQpLCBlbHNlIHRoZSBib3gncyB3aWR0aCBzcGxpdFxuICAvLyBldmVubHkuIEEgcm93IGlzIGFzIHRhbGwgYXMgaXRzIGNlbGxzJyB3b3JkcyB3cmFwcGVkIGFzIF9kcmF3UGFyYWdyYXBoc1xuICAvLyB3cmFwcyB0aGVtLCBhbmQgdGhlIHdvcmRzIGFyZSBkcmF3biBpbnRvIGVhY2ggY2VsbCBvbmNlIGF1dG9UYWJsZSBoYXNcbiAgLy8gZHJhd24gaXRzIGdyaWQgbGluZXMgYW5kIGZpbGwgKF9kcmF3VGV4dENlbGwpLCBzbyB0aGV5IGtlZXAgdGhlaXIgcnVucydcbiAgLy8gZm9udHMgYW5kIGNvbG9ycy4gT25seSB0aGUgcm93cyB0aGUgYm94IGhvbGRzIGFyZSBkcmF3biwgYW5kIGEgdGFibGUgdGhhdFxuICAvLyBsb3NlcyBhbnkgaXMgY3V0LiBUaGUgY3Vyc29yIGl0IGxlYXZlcyBpcyBURVhUX1RBQkxFX01BUkdJTiB1bmRlciBpdC5cbiAgcHJpdmF0ZSBfZHJhd1RleHRUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHRhYmxlOiBUZXh0VGFibGUsXG4gICAgbGF5b3V0OiBUZXh0VGFibGVMYXlvdXQgfCBudWxsLFxuICAgIGJveDogUGRmVGV4dEJveCxcbiAgICB0b3A6IG51bWJlcixcbiAgKTogUGRmVGV4dEN1cnNvciB7XG4gICAgaWYgKHRvcCA+PSBib3guYm90dG9tKSB7XG4gICAgICByZXR1cm4geyBjdXJzb3JZOiB0b3AsIGN1dDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBib3gubGVmdCArIChsYXlvdXQ/LmxlZnQgPz8gMCkgKiBQVDtcbiAgICBjb25zdCB3aWR0aCA9IGxheW91dCA/IGxheW91dC53aWR0aCAqIFBUIDogYm94LndpZHRoO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGxheW91dD8uY29sdW1uV2lkdGhzLmxlbmd0aCA9PT0gdGFibGUuY29sdW1uc1xuICAgICAgPyBsYXlvdXQuY29sdW1uV2lkdGhzLm1hcCgoY29sdW1uV2lkdGgpID0+IGNvbHVtbldpZHRoICogUFQpXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IHRhYmxlLmNvbHVtbnMgfSwgKCkgPT4gd2lkdGggLyB0YWJsZS5jb2x1bW5zKTtcbiAgICBjb25zdCBib2R5ID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LmNlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5fdGV4dENlbGxJbnB1dChjb250ZXh0LmRvYywgY2VsbCwgY29sdW1uV2lkdGhzKSkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl90ZXh0VGFibGVPcHRpb25zKGNvbnRleHQsIGNvbHVtbldpZHRocywgbGVmdCwgdG9wLCB3aWR0aCwgYm94LmJvdHRvbSk7XG4gICAgY29uc3QgZml0ID0gdGhpcy5fdGV4dFRhYmxlRml0KGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keSB9KTtcblxuICAgIGlmIChmaXQpIHtcbiAgICAgIHRoaXMuX2RyYXdUYWJsZShjb250ZXh0LCB7IC4uLm9wdGlvbnMsIGJvZHk6IHRoaXMuX2tlcHRSb3dzKGJvZHksIGZpdCkgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvclk6IGZpdCA/IGNvbnRleHQuZG9jLmxhc3RBdXRvVGFibGUuZmluYWxZICsgVEVYVF9UQUJMRV9NQVJHSU4gOiB0b3AsXG4gICAgICBjdXQ6IGZpdCA8IHRhYmxlLnJvd3MubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUncyBjZWxsIGFzIGF1dG9UYWJsZSB0YWtlcyBpdDogaXRzIHNwYW5zIGFuZCBmaWxsIGFuZCwgd2hlbiBpdFxuICAvLyBpcyBvbmUgcm93IHRhbGwsIHRoZSBoZWlnaHQgaXRzIHdvcmRzIG5lZWQgYXQgdGhlIHdpZHRoIGl0IHNwYW5zLiBBIGNlbGxcbiAgLy8gdGhhdCBzcGFucyByb3dzIHNoYXJlcyB0aGVpcnMuXG4gIHByaXZhdGUgX3RleHRDZWxsSW5wdXQoZG9jOiBhbnksIGNlbGw6IFRleHRUYWJsZUNlbGwsIGNvbHVtbldpZHRoczogbnVtYmVyW10pOiBQZGZUZXh0Q2VsbElucHV0IHtcbiAgICBjb25zdCBwYWRkaW5nID0gVEVYVF9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgY29uc3Qgd2lkdGggPSBjb2x1bW5XaWR0aHNcbiAgICAgIC5zbGljZShjZWxsLmNvbHVtbiwgY2VsbC5jb2x1bW4gKyBjZWxsLmNvbFNwYW4pXG4gICAgICAucmVkdWNlKChzdW0sIGNvbHVtbldpZHRoKSA9PiBzdW0gKyBjb2x1bW5XaWR0aCwgMCkgLSAyICogcGFkZGluZy5ob3Jpem9udGFsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogY2VsbC5yb3dTcGFuLFxuICAgICAgdGV4dENlbGw6IGNlbGwsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgLi4uKGNlbGwuZmlsbCA/IHsgZmlsbENvbG9yOiBjZWxsLmZpbGwgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNlbGwucm93U3BhbiA9PT0gMVxuICAgICAgICAgID8geyBtaW5DZWxsSGVpZ2h0OiB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGRvYywgY2VsbC5wYXJhZ3JhcGhzLCB3aWR0aCkgKyAyICogcGFkZGluZy52ZXJ0aWNhbCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgYSB0ZXh0IHRhYmxlJ3MgZHJ5IHJ1biBhbmQgaXRzIGRyYXcgc2hhcmUuIEV2ZXJ5XG4gIC8vIGNvbHVtbiBpcyBsaXN0ZWQgYW5kIGZpeGVkIGF0IGl0cyB3aWR0aDogYXV0b1RhYmxlIHdvdWxkIG90aGVyd2lzZSBjb3VudFxuICAvLyB0aGUgY29sdW1ucyBvZiB0aGUgZmlyc3Qgcm93LCB3aGljaCBtYXkgYmUgbmFycm93ZXIgdGhhbiB0aGUgZ3JpZC4gQSByb3dcbiAgLy8gaXMgbmV2ZXIgc3BsaXQgYXQgdGhlIGJveCdzIGJvdHRvbTogaXQgZml0cyB3aG9sZSBvciBtb3ZlcyBwYXN0IGl0LiBib3R0b21cbiAgLy8gaXMgdGhlIGJveCdzLlxuICBwcml2YXRlIF90ZXh0VGFibGVPcHRpb25zKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sdW1uV2lkdGhzOiBudW1iZXJbXSxcbiAgICBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBURVhUX1RBQkxFX0NFTExfUEFERElORztcblxuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogJ3BsYWluJyxcbiAgICAgIGNvbHVtbnM6IGNvbHVtbldpZHRocy5tYXAoKF8sIGluZGV4KSA9PiAoeyBkYXRhS2V5OiBpbmRleCB9KSksXG4gICAgICBzdGFydFk6IHRvcCxcbiAgICAgIG1hcmdpbjogeyBsZWZ0LCByaWdodDogY29udGV4dC5wYWdlVyAtIGxlZnQgLSB3aWR0aCwgYm90dG9tOiBjb250ZXh0LnBhZ2VIIC0gYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3aWR0aCxcbiAgICAgIGNvbHVtblN0eWxlczogT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtbldpZHRocy5tYXAoKGNlbGxXaWR0aCwgaW5kZXgpID0+IFtpbmRleCwgeyBjZWxsV2lkdGggfV0pKSxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IERFRkFVTFRfVEVYVF9TSVpFLFxuICAgICAgICBjZWxsUGFkZGluZzoge1xuICAgICAgICAgIHRvcDogcGFkZGluZy52ZXJ0aWNhbCwgcmlnaHQ6IHBhZGRpbmcuaG9yaXpvbnRhbCwgYm90dG9tOiBwYWRkaW5nLnZlcnRpY2FsLCBsZWZ0OiBwYWRkaW5nLmhvcml6b250YWwsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVDb2xvcjogVEVYVF9UQUJMRV9CT1JERVJfQ09MT1IsXG4gICAgICAgIGxpbmVXaWR0aDogVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsXG4gICAgICAgIHZhbGlnbjogJ21pZGRsZScsXG4gICAgICAgIHRleHRDb2xvcjogREVGQVVMVF9URVhUX0NPTE9SLFxuICAgICAgfSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB0aGlzLl9kcmF3VGV4dENlbGwoaG9vayksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhvdyBtYW55IG9mIGEgdGV4dCB0YWJsZSdzIHJvd3MgaXRzIGJveCBob2xkczogdGhlIHJvd3MgYXV0b1RhYmxlIGRyYXdzXG4gIC8vIHdob2xlIG9uIHRoZSBmaXJzdCBwYWdlIHdoZW4gaXQgbGF5cyB0aGUgdGFibGUgb3V0IG9uIGEgc2NyYXRjaCBkb2N1bWVudFxuICAvLyBvZiB0aGUgc2FtZSBwYWdlIHNpemUsIGFzIF9tZWFzdXJlIGRvZXMgZm9yIGEgbGlzdC4gQSByb3cgdGFsbGVyIHRoYW4gYVxuICAvLyBwYWdlIGlzIHNwbGl0IGFjcm9zcyBwYWdlcyByYXRoZXIgdGhhbiBtb3ZlZCwgc28gaXQgZG9lcyBub3QgY291bnQuXG4gIHByaXZhdGUgX3RleHRUYWJsZUZpdChjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc2NyYXRjaC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyID09PSAxICYmICFob29rLnJvdy5zcGFuc011bHRpcGxlUGFnZXMpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZml0O1xuICB9XG5cbiAgLy8gVGhlIGZpcnN0IGBmaXRgIHJvd3MsIGEgY2VsbCB0aGF0IHNwYW5zIGRvd24gcGFzdCB0aGUgbGFzdCBvZiB0aGVtIGN1dFxuICAvLyB0aGVyZS5cbiAgcHJpdmF0ZSBfa2VwdFJvd3MoYm9keTogUGRmVGV4dENlbGxJbnB1dFtdW10sIGZpdDogbnVtYmVyKTogUGRmVGV4dENlbGxJbnB1dFtdW10ge1xuICAgIHJldHVybiBib2R5LnNsaWNlKDAsIGZpdCkubWFwKChyb3cpID0+IHJvdy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCByb3dTcGFuID0gTWF0aC5taW4oaW5wdXQucm93U3BhbiwgZml0IC0gaW5wdXQudGV4dENlbGwucm93KTtcblxuICAgICAgcmV0dXJuIHJvd1NwYW4gPT09IGlucHV0LnJvd1NwYW4gPyBpbnB1dCA6IHsgLi4uaW5wdXQsIHJvd1NwYW4gfTtcbiAgICB9KSk7XG4gIH1cblxuICAvLyBBIHRleHQgdGFibGUgY2VsbCdzIHdvcmRzLCBkcmF3biBvbmNlIGF1dG9UYWJsZSBoYXMgZHJhd24gdGhlIGNlbGw6IGluc2lkZVxuICAvLyBpdHMgcGFkZGluZywgd3JhcHBlZCB0byBpdHMgd2lkdGggYW5kIHBsYWNlZCBieSBpdHMgdmVydGljYWwgYWxpZ25tZW50LCB0aGVcbiAgLy8gbWlkZGxlIHVubGVzcyBzZXQuIExpbmVzIHBhc3QgdGhlIGNlbGwgYXJlIGxlZnQgb2ZmLlxuICBwcml2YXRlIF9kcmF3VGV4dENlbGwoaG9vazogYW55KTogdm9pZCB7XG4gICAgY29uc3QgY2VsbDogVGV4dFRhYmxlQ2VsbCB8IHVuZGVmaW5lZCA9IGhvb2suY2VsbC5yYXc/LnRleHRDZWxsO1xuICAgIGlmICghY2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gaG9vay5jZWxsO1xuICAgIGNvbnN0IGJveDogUGRmVGV4dEJveCA9IHtcbiAgICAgIGxlZnQ6IHggKyBob29rLmNlbGwucGFkZGluZygnbGVmdCcpLFxuICAgICAgdG9wOiB5ICsgaG9vay5jZWxsLnBhZGRpbmcoJ3RvcCcpLFxuICAgICAgd2lkdGg6IHdpZHRoIC0gaG9vay5jZWxsLnBhZGRpbmcoJ2hvcml6b250YWwnKSxcbiAgICAgIGJvdHRvbTogeSArIGhlaWdodCAtIGhvb2suY2VsbC5wYWRkaW5nKCdib3R0b20nKSxcbiAgICB9O1xuICAgIGNvbnN0IHNwYXJlID0gTWF0aC5tYXgoMCwgYm94LmJvdHRvbSAtIGJveC50b3AgLSB0aGlzLl9wYXJhZ3JhcGhzSGVpZ2h0KGhvb2suZG9jLCBjZWxsLnBhcmFncmFwaHMsIGJveC53aWR0aCkpO1xuICAgIGNvbnN0IG9mZnNldCA9IGNlbGwudmFsaWduID09PSAndG9wJyA/IDAgOiAoY2VsbC52YWxpZ24gPT09ICdib3R0b20nID8gc3BhcmUgOiBzcGFyZSAvIDIpO1xuXG4gICAgdGhpcy5fZHJhd1BhcmFncmFwaHMoaG9vay5kb2MsIGNlbGwucGFyYWdyYXBocywgYm94LCBib3gudG9wICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLiBBXG4gIC8vIG5vLWJyZWFrIHNwYWNlIGlzIHBhcnQgb2YgaXRzIHdvcmQsIG5ldmVyIGEgYnJlYWsgYmV0d2VlbiB0d286IGEgbnVtYmVyXG4gIC8vIGdyb3VwZWQgd2l0aCBvbmUgKGZyLUNBJ3MgdGhvdXNhbmRzLCBvciBhIG5hcnJvdyBzcGFjZSBfcGRmVGV4dCB0dXJuZWRcbiAgLy8gaW50byBvbmUpIHN0YXlzIG9uIG9uZSBsaW5lLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiBQZGZXb3JkW11bXSB7XG4gICAgY29uc3QgbGluZXM6IFBkZldvcmRbXVtdID0gW107XG4gICAgbGV0IGxpbmU6IFBkZldvcmRbXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC8oPzpbXlxcc118XFx1MDBhMCkrW15cXFNcXHUwMGEwXSp8W15cXFNcXHUwMGEwXSsvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogUGRmV29yZCwgeDogbnVtYmVyLCBiYXNlbGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gd29yZC5ydW47XG5cbiAgICBpZiAocnVuLmhpZ2hsaWdodCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihydW4uaGlnaGxpZ2h0KTtcbiAgICAgIGRvYy5yZWN0KHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC45LCB3b3JkLndpZHRoLCB3b3JkLnNpemUgKiAxLjE1LCAnRicpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHdvcmQuc2l6ZSk7XG4gICAgZG9jLnRleHQod29yZC50ZXh0LCB4LCBiYXNlbGluZSk7XG5cbiAgICBjb25zdCBjb2xvciA9IHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1I7XG4gICAgY29uc3QgaW5rV2lkdGggPSB3b3JkLndpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHdvcmQudGV4dCk7XG4gICAgaWYgKHJ1bi51bmRlcmxpbmUpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyKTtcbiAgICB9XG4gICAgaWYgKHJ1bi5zdHJpa2UpIHtcbiAgICAgIGRvYy5zZXREcmF3Q29sb3IoY29sb3IpO1xuICAgICAgZG9jLnNldExpbmVXaWR0aCh3b3JkLnNpemUgLyAxNik7XG4gICAgICBkb2MubGluZSh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMywgeCArIGlua1dpZHRoLCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuMyk7XG4gICAgfVxuXG4gICAgaWYgKHJ1bi5saW5rKSB7XG4gICAgICBkb2MubGluayh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSwgaW5rV2lkdGgsIHdvcmQuc2l6ZSAqIDEuMiwgeyB1cmw6IHJ1bi5saW5rIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGpzUERGJ3Mgc3RhbmRhcmQgZm9udHMgYXJlIEhlbHZldGljYSwgVGltZXMgYW5kIENvdXJpZXI7IGEgYmxvY2sncyBmYWNlIGlzXG4gIC8vIG1hcHBlZCBvbnRvIHdoaWNoZXZlciBvZiB0aGUgdGhyZWUgaXQgcmVzZW1ibGVzLlxuICBwcml2YXRlIF9mb250KGRvYzogYW55LCBydW46IFRleHRSdW4sIHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZhY2UgPSAocnVuLmZvbnRGYWNlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZhbWlseSA9IC9jb3VyaWVyfG1vbm8vLnRlc3QoZmFjZSlcbiAgICAgID8gJ2NvdXJpZXInXG4gICAgICA6ICgvdGltZXN8Z2VvcmdpYXxzZXJpZi8udGVzdChmYWNlKSAmJiAhZmFjZS5pbmNsdWRlcygnc2FucycpID8gJ3RpbWVzJyA6ICdoZWx2ZXRpY2EnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJ1bi5ib2xkICYmIHJ1bi5pdGFsaWNcbiAgICAgID8gJ2JvbGRpdGFsaWMnXG4gICAgICA6IChydW4uYm9sZCA/ICdib2xkJyA6IChydW4uaXRhbGljID8gJ2l0YWxpYycgOiAnbm9ybWFsJykpO1xuXG4gICAgZG9jLnNldEZvbnQoZmFtaWx5LCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IocnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUik7XG4gIH1cblxuICBwcml2YXRlIF90cmFpbGluZ1NwYWNlKGRvYzogYW55LCB0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRyYWlsaW5nID0gdGV4dC5sZW5ndGggLSB0ZXh0LnRyaW1FbmQoKS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdHJhaWxpbmcgPyBkb2MuZ2V0VGV4dFdpZHRoKCcgJykgKiB0cmFpbGluZyA6IDA7XG4gIH1cblxuICBwcml2YXRlIF9hbGlnbk9mZnNldChhbGlnbjogVGV4dFBhcmFncmFwaFsnYWxpZ24nXSwgd2lkdGg6IG51bWJlciwgbGluZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAod2lkdGggLSBsaW5lV2lkdGgpIC8gMik7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB3aWR0aCAtIGxpbmVXaWR0aCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBXaGF0IGEgdGV4dCBibG9jaydzIHRva2VucyBmaWxsIHdpdGggb24gdGhpcyBwYWdlLiBUaGUgbnVtYmVyIGlzIHRoZVxuICAvLyBwaHlzaWNhbCBwYWdlIGFtb25nIHRoZSByZXBvcnQncyBwYWdlcywgY29udGludWF0aW9uIHBhZ2VzIGluY2x1ZGVkIOKAlCB0aGVcbiAgLy8gdGl0bGUgcGFnZSBpcyBub3QgYSByZXBvcnQgcGFnZS4gVGhlIG5hbWUgc3RheXMgdGhlIHJlcG9ydCBwYWdlJ3MsIHNvIGFcbiAgLy8gY29udGludWF0aW9uIHBhZ2UgaXMgbmFtZWQgZm9yIHRoZSBwYWdlIGl0cyB0YWJsZSBzdGFydGVkIG9uLlxuICBwcml2YXRlIF90b2tlbnMocmVwb3J0OiBSZXBvcnQsIHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIsIHBhZ2VOdW1iZXI6IG51bWJlcik6IFRleHRUb2tlbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlTnVtYmVyLFxuICAgICAgcGFnZU5hbWU6IHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gLFxuICAgICAgcmVwb3J0TmFtZTogcmVwb3J0Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbXBvbmVudChcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29tcG9uZW50ID0gaXRlbS5jb21wb25lbnQ7XG4gICAgLy8gR2VvbWV0cnkgaXMgc3RvcmVkIGluIGluY2hlczsgdGhlIFBERiBkcmF3cyBpbiBwb2ludHMuXG4gICAgY29uc3QgeCA9IGNvbXBvbmVudC54ICogUFQ7XG4gICAgY29uc3QgeSA9IGNvbXBvbmVudC55ICogUFQ7XG4gICAgY29uc3QgdyA9IGNvbXBvbmVudC53ICogUFQ7XG4gICAgY29uc3QgaCA9IGNvbXBvbmVudC5oICogUFQ7XG5cbiAgICBjb25zdCB0aXRsZSA9IGV4cG9ydFRpdGxlKGNvbXBvbmVudCwgaXRlbS5zZWFyY2gsIGl0ZW0uY3J1bWJzKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCAhaXRlbS5kYXRhLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFibGUoY29udGV4dCwgaXRlbSwgeCwgYm9keVksIHcsIGJvZHlILCBvdmVyZmxvd3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2twaSc6XG4gICAgICAgIHRoaXMuX3JlbmRlcktwaShjb250ZXh0LCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgbGluZSBvZiBzbWFsbCBncmV5IHByaW50LCBjdXQgdG8gdGhlIHdpZHRoIHdpdGggYW4gZWxsaXBzaXM6IGFcbiAgLy8gc3VidGl0bGUsIGEgbm90ZSBvciBhIGxpbmUgb2YgYSBLUEkgY2FyZC4geSBpcyB0aGUgbGluZSdzIHRvcDsgdGhlIGxpbmUgaXNcbiAgLy8gTk9URV9MSU5FX0ggdGFsbCwgdGltZXMgdGhlIHNjYWxlIGEgc2hvcnQgS1BJIHRpbGUgc2hyaW5rcyBpdHMgbGluZXMgYnkuXG4gIHByaXZhdGUgX3NtYWxsTGluZShcbiAgICBkb2M6IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcixcbiAgICBhbGlnbjogJ2xlZnQnIHwgJ2NlbnRlcicsXG4gICAgc3R5bGU6ICdub3JtYWwnIHwgJ2l0YWxpYycsXG4gICAgc2NhbGUgPSAxLFxuICApOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShTTUFMTF9TSVpFICogc2NhbGUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgIGRvYy50ZXh0KHRoaXMuX2ZpdChkb2MsIHRleHQsIHcpLCBhbGlnbiA9PT0gJ2NlbnRlcicgPyB4ICsgdyAvIDIgOiB4LCB5ICsgU01BTExfU0laRSAqIHNjYWxlLCB7IGFsaWduIH0pO1xuICB9XG5cbiAgLy8gVGhlIHRleHQsIGVsbGlwc2l6ZWQgdG8gdGhlIHdpZHRoIGluIHRoZSBkb2MncyBjdXJyZW50IGZvbnQuXG4gIHByaXZhdGUgX2ZpdChkb2M6IGFueSwgdGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoZG9jLmdldFRleHRXaWR0aCh0ZXh0KSA8PSB3aWR0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGN1dCA9IHRleHQ7XG4gICAgd2hpbGUgKGN1dC5sZW5ndGggPiAxICYmIGRvYy5nZXRUZXh0V2lkdGgoYCR7Y3V0feKApmApID4gd2lkdGgpIHtcbiAgICAgIGN1dCA9IGN1dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke2N1dC50cmltRW5kKCl94oCmYDtcbiAgfVxuXG4gIC8vIFRoZSBib2xkIHN0cmlwIG92ZXIgYSBjb21wb25lbnQsIGFuZCBvdmVyIGVhY2ggb2YgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBkcmlsbGVkIHRpdGxlJ3MgY3J1bWJzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUsIHNvIHRoZSB0aXRsZVxuICAvLyBnb2VzIHRocm91Z2ggX3BkZlRleHQgbGlrZSBhbnkgZm9ybWF0dGVkIHRleHQgKHRoZSDigLogYmV0d2VlbiBjcnVtYnMgaXNcbiAgLy8gV2luQW5zaSBhbmQgc3RheXMpLlxuICBwcml2YXRlIF9jb21wb25lbnRUaXRsZShkb2M6IGFueSwgdGl0bGU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodGhpcy5fcGRmVGV4dCh0aXRsZSksIHgsIHkgKyAxMCwgeyBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEFuIGl0YWxpYyBncmV5IGxpbmUgY2VudGVyZWQgaW4gYSBjb21wb25lbnQncyBib2R5LCBmb3IgYSBib2R5IHRoYXQgaG9sZHNcbiAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gaXRzIGNvbnRlbnQuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICB9XG5cbiAgLy8gQSBsaXN0J3Mgb24tcGFnZSB0YWJsZS4gQWxsIG9mIGl0cyBmZXRjaGVkIHJvd3MgYXJlIGxhaWQgb3V0IG9uY2UgdG8gbGVhcm5cbiAgLy8gaG93IG1hbnkgdGhlIGJveCBob2xkczsgd2hlbiB0aGV5IGRvIG5vdCBhbGwgZml0LCB0aGUgYm94J3MgbGFzdCByb3cgc2F5c1xuICAvLyB0aGUgdGFibGUgY29udGludWVzIGFuZCB0aGUgcmVzdCBnbyB0byBvdmVyZmxvd3MgZm9yIGNvbnRpbnVhdGlvbiBwYWdlcy5cbiAgLy8gQSBib3ggdG9vIHNob3J0IGZvciBldmVuIHRoZSBoZWFkIGNhcnJpZXMgdGhlIG5vdGljZSBhcyBhIGxpbmUgaW5zdGVhZC5cbiAgLy8gQSB0b3RhbHMgcm93IGNsb3NlcyB0aGUgdGFibGUgb25jZTogaW4gdGhlIGJveCB3aGVuIGV2ZXJ5IHJvdyBmaXRzIGl0LFxuICAvLyBlbHNlIGFmdGVyIHRoZSBsYXN0IGNvbnRpbnVhdGlvbiByb3cuIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfSA9IGl0ZW07XG4gICAgY29uc3QgZGF0YSA9IGl0ZW0uZGF0YSBhcyBDb21wb25lbnREYXRhO1xuICAgIGNvbnN0IGhlYWQgPSBsaXN0SGVhZGluZ3MoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKVxuICAgICAgLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSk7XG4gICAgY29uc3QgeyBjZWxscywgbnVtZXJpYywgZm9vdCB9ID0gdGhpcy5fdGFibGVDZWxscyhjb250ZXh0LCBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMpO1xuICAgIGNvbnN0IG9taXR0ZWQgPSBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMgfSA9IHRoaXMuX21lYXN1cmUoY29udGV4dCwgaGVhZCwgY2VsbHMsIG51bWVyaWMsIGZvb3QsIHgsIHksIHcsIGJvdHRvbSk7XG5cbiAgICBpZiAoZml0ID09PSBjZWxscy5sZW5ndGggJiYgb21pdHRlZCA9PT0gMCkge1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB0aGlzLl90YWJsZU9wdGlvbnMoY29udGV4dCwgaGVhZCwgbnVtZXJpYywgY2VsbHMsIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzLCBmb290KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgbm90aWNlIHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgbGFzdCByb3cgdGhhdCBmaXQsIHNvIHRoYXQgcm93IG1vdmVzXG4gICAgLy8gdG8gdGhlIGNvbnRpbnVhdGlvbi4gb21pdHRlZCA+IDAgbWVhbnMgYSBmdWxsIFBERl9MSVNUX1JPV1MgZmV0Y2gsIHdoaWNoXG4gICAgLy8gbmV2ZXIgZml0cyBvbmUgYm94LCBzbyB0aGUgQ1NWIG5vdGljZSBhbHdheXMgbGFuZHMgb24gYSBjb250aW51YXRpb25cbiAgICAvLyBwYWdlLlxuICAgIGNvbnN0IGtlcHQgPSBNYXRoLm1heCgwLCBmaXQgLSAxKTtcbiAgICBvdmVyZmxvd3MucHVzaCh7XG4gICAgICBjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzOiBpdGVtLmNydW1icywgaGVhZCwgbnVtZXJpYywgcm93czogY2VsbHMuc2xpY2Uoa2VwdCksIG9taXR0ZWQsIGZvb3QsIHgsIHcsIGNvbHVtblN0eWxlcyxcbiAgICB9KTtcblxuICAgIGlmIChmaXQgPj0gMSkge1xuICAgICAgY29uc3QgYm9keSA9IFsuLi5jZWxscy5zbGljZSgwLCBrZXB0KSwgdGhpcy5fbm90aWNlUm93KENPTlRJTlVFRF9OT1RJQ0UsIGhlYWQubGVuZ3RoLCB0cnVlKV07XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIG51bWVyaWMsIGJvZHksIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoY29udGV4dC5kb2MsIENPTlRJTlVFRF9OT1RJQ0UsIHgsIHksIHcsIGgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggZmV0Y2hlZCByb3cgYXMgdGhlIHN0cmluZ3MgaXRzIHRhYmxlIGNlbGxzIHByaW50LCBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gem9uZSwgbG9jYWxlIGFuZCBjdXJyZW5jeSwgd2hpY2ggY29sdW1ucyBob2xkIGZvcm1hdHRlZCBudW1iZXJzLCBhbmQgdGhlXG4gIC8vIHRvdGFscyByb3cgKG51bGwgd2l0aG91dCBvbmUpLiBUaGUgY29sdW1ucyB0aGUgdmlld2VyIGhpZCBhcmUgbGVmdCBvdXQuXG4gIHByaXZhdGUgX3RhYmxlQ2VsbHMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBkYXRhOiBDb21wb25lbnREYXRhLFxuICAgIGhpZGRlbkNvbHVtbnM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICApOiB7IGNlbGxzOiBzdHJpbmdbXVtdOyBudW1lcmljOiBib29sZWFuW107IGZvb3Q6IHN0cmluZ1tdIHwgbnVsbCB9IHtcbiAgICBjb25zdCBjb2x1bW5zID0gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlLCBoaWRkZW5Db2x1bW5zKTtcbiAgICBjb25zdCBjZWxscyA9IGRhdGEucm93cy5tYXAoKHJvdykgPT4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gdGhpcy5fcGRmVGV4dChcbiAgICAgIGV4cG9ydENlbGwocm93W2NvbHVtbi5jb2x1bW5dLCBjb2x1bW4sIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCwgcm93KSxcbiAgICApKSk7XG4gICAgY29uc3QgZm9vdCA9IGxpc3RUb3RhbHNSb3coZGF0YSwgY29sdW1ucywgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjZWxscyxcbiAgICAgIG51bWVyaWM6IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5udW1lcmljKSxcbiAgICAgIGZvb3Q6IGZvb3QgPyBmb290Lm1hcCgoY2VsbCkgPT4gdGhpcy5fcGRmVGV4dChjZWxsKSkgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgYXV0b1RhYmxlIG9wdGlvbnMgZXZlcnkgbGlzdCB0YWJsZSBzaGFyZXM6IHRoZSBkcnkgcnVuLCB0aGUgb24tcGFnZVxuICAvLyBkcmF3IGFuZCB0aGUgY29udGludWF0aW9uIHBhZ2VzLCBzbyB0aGUgdGhyZWUgbGF5IGEgdGFibGUgb3V0IGFsaWtlLiBUaGVcbiAgLy8gZm9udCBpcyBuYW1lZCByYXRoZXIgdGhhbiBpbmhlcml0ZWQsIHNpbmNlIHRoZSBkb2MgY2FycmllcyB3aGF0ZXZlciB0aGVcbiAgLy8gbGFzdCB0ZXh0IGRyYXduIGxlZnQgc2V0LiBib3R0b20gaXMgdGhlIG1hcmdpbiB1bmRlciB0aGUgdGFibGUsIHBvaW50cy5cbiAgLy9cbiAgLy8gQSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMgaXMgcmlnaHQtYWxpZ25lZCwgaXRzIGhlYWRpbmcgYW5kIHRvdGFsXG4gIC8vIHRvbzogdGhlIGJvZHkgdGhyb3VnaCBjb2x1bW5TdHlsZXMsIHdoaWNoIGF1dG9UYWJsZSBhcHBsaWVzIHRvIGJvZHkgY2VsbHNcbiAgLy8gb25seSwgYW5kIHRoZSBoZWFkaW5nIGFuZCB0b3RhbCB0aHJvdWdoIHRoZSBkaWRQYXJzZUNlbGwgaG9vaywgb24gZXZlcnlcbiAgLy8gcGFnZSB0aGUgaGVhZGluZyByZXBlYXRzLiBBIHRvdGFscyByb3cgKGZvb3QpIHByaW50cyBvbmNlLCB1bmRlciB0aGVcbiAgLy8gdGFibGUncyBsYXN0IHJvdywgYm9sZCBvbiB0aGUgYm9yZGVyIGdyYXkuXG4gIHByaXZhdGUgX3RhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBib2R5OiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIHg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICAgY29sdW1uU3R5bGVzPzogUGRmQ29sdW1uU3R5bGVzLFxuICAgIGZvb3Q/OiBzdHJpbmdbXSB8IG51bGwsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQ6IFtoZWFkXSxcbiAgICAgIGJvZHksXG4gICAgICBzdGFydFksXG4gICAgICBtYXJnaW46IHsgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdywgYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3LFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7IGZvbnQ6ICdoZWx2ZXRpY2EnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250U2l6ZTogOCwgY2VsbFBhZGRpbmc6IDMsIHRleHRDb2xvcjogJyMxZjI5MzMnIH0sXG4gICAgICBoZWFkU3R5bGVzOiB7IGZpbGxDb2xvcjogJyM0ZTc5YTcnLCB0ZXh0Q29sb3I6ICcjZmZmZmZmJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgIGFsdGVybmF0ZVJvd1N0eWxlczogeyBmaWxsQ29sb3I6ICcjZjVmN2ZhJyB9LFxuICAgICAgLi4uKGNvbHVtblN0eWxlcyA/IHsgY29sdW1uU3R5bGVzIH0gOiB7fSksXG4gICAgICAuLi4oZm9vdFxuICAgICAgICA/IHtcbiAgICAgICAgICBmb290OiBbZm9vdF0sXG4gICAgICAgICAgc2hvd0Zvb3Q6ICdsYXN0UGFnZScsXG4gICAgICAgICAgZm9vdFN0eWxlczogeyBmaWxsQ29sb3I6ICcjZTRlN2ViJywgdGV4dENvbG9yOiAnIzFmMjkzMycsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBkaWRQYXJzZUNlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChob29rLnNlY3Rpb24gPT09ICdoZWFkJyB8fCBob29rLnNlY3Rpb24gPT09ICdmb290JykgJiYgbnVtZXJpY1tob29rLmNvbHVtbi5pbmRleF0pIHtcbiAgICAgICAgICBob29rLmNlbGwuc3R5bGVzLmhhbGlnbiA9ICdyaWdodCc7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgbm90aWNlIGFzIGEgdGFibGUgcm93OiBvbmUgaXRhbGljIGdyZXkgY2VsbCBzcGFubmluZyBldmVyeSBjb2x1bW4uIEFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGlzIGVsbGlwc2l6ZWQgYXQgdGhlIGJveCdzIHdpZHRoIGFuZCBrZWVwcyB0aGUgZGF0YVxuICAvLyBjZWxscycgZm9udCBzaXplIGFuZCBwYWRkaW5nLCBzbyBpdCBpcyBuZXZlciB0YWxsZXIgdGhhbiB0aGUgZGF0YSByb3dcbiAgLy8gd2hvc2UgcGxhY2UgaXQgdGFrZXMuXG4gIHByaXZhdGUgX25vdGljZVJvdyh0ZXh0OiBzdHJpbmcsIHNwYW46IG51bWJlciwgc2luZ2xlTGluZTogYm9vbGVhbik6IFBkZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICBjb2xTcGFuOiBzcGFuLFxuICAgICAgLy8gTGVmdC1hbGlnbmVkIHdoYXRldmVyIHRoZSBmaXJzdCBjb2x1bW4gaXM6IGEgc3Bhbm5lZCBjZWxsIG90aGVyd2lzZVxuICAgICAgLy8gdGFrZXMgY29sdW1uU3R5bGVzWzBdLCByaWdodC1hbGlnbmVkIHdoZW4gdGhhdCBjb2x1bW4gaXMgbnVtZXJpYy5cbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250U3R5bGU6ICdpdGFsaWMnLFxuICAgICAgICB0ZXh0Q29sb3I6IE1VVEVEX0NPTE9SLFxuICAgICAgICBoYWxpZ246ICdsZWZ0JyxcbiAgICAgICAgLi4uKHNpbmdsZUxpbmUgPyB7IG92ZXJmbG93OiAnZWxsaXBzaXplJyB9IDoge30pLFxuICAgICAgfSxcbiAgICB9XTtcbiAgfVxuXG4gIC8vIExheXMgZXZlcnkgZmV0Y2hlZCByb3cgb3V0IG9uY2Ugb24gYSBzY3JhdGNoIGRvY3VtZW50IG9mIHRoZSBzYW1lIHBhZ2VcbiAgLy8gc2l6ZSwgd2l0aCB0aGUgb3B0aW9ucyB0aGUgcmVhbCBkcmF3IHVzZXMsIGFuZCByZWFkcyBiYWNrIGhvdyBtYW55IGJvZHlcbiAgLy8gcm93cyB0aGUgYm94J3MgcGFnZSBob2xkcyAoZml0KSBhbmQgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLFxuICAvLyB3aXRoIGVhY2ggbnVtZXJpYyBjb2x1bW4ncyByaWdodCBhbGlnbm1lbnQgbWVyZ2VkIGluLCBzbyB0aGUgb24tcGFnZVxuICAvLyB0YWJsZSBhbmQgaXRzIGNvbnRpbnVhdGlvbiBwYWdlcyBjYXJyeSBib3RoLiBUaGUgdG90YWxzIHJvdyBpcyBsYWlkIG91dFxuICAvLyB0b28sIHNvIHRoZSB3aWR0aHMgaG9sZCBpdCwgYW5kIGEgdGFibGUgd2hvc2Ugcm93cyBmaXQgdGhlIGJveCBidXQgd2hvc2VcbiAgLy8gdG90YWxzIHJvdyBkb2VzIG5vdCBtb3ZlcyBpdHMgbGFzdCByb3cgb24uIGZpdCAwIG1lYW5zIG5vdCBldmVuIG9uZVxuICAvLyBib2R5IHJvdyBmaXRzIHVuZGVyIHRoZSBoZWFkIChvciB0aGUgaGVhZCBpdHNlbGYgZGlkIG5vdCBmaXQpOiBhdXRvVGFibGVcbiAgLy8gbW92ZWQgdG8gYSBuZXcgcGFnZSBiZWZvcmUgZHJhd2luZy4gVGhlIHJlYWwgZG9jdW1lbnQgaXMgdW50b3VjaGVkLlxuICBwcml2YXRlIF9tZWFzdXJlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogc3RyaW5nW10sXG4gICAgY2VsbHM6IHN0cmluZ1tdW10sXG4gICAgbnVtZXJpYzogYm9vbGVhbltdLFxuICAgIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgKTogeyBmaXQ6IG51bWJlcjsgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgfSB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICAgZGlkRHJhd0NlbGw6IChob29rOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhvb2suc2VjdGlvbiA9PT0gJ2JvZHknICYmIHNjcmF0Y2guZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlciA9PT0gMSkge1xuICAgICAgICAgIGZpdCA9IE1hdGgubWF4KGZpdCwgaG9vay5yb3cuaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IHsgd2lkdGg6IG51bWJlciB9W10gPSBzY3JhdGNoLmxhc3RBdXRvVGFibGUuY29sdW1ucztcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcyA9IHt9O1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgY29sdW1uU3R5bGVzW2luZGV4XSA9IG51bWVyaWNbaW5kZXhdXG4gICAgICAgID8geyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCwgaGFsaWduOiAncmlnaHQnIH1cbiAgICAgICAgOiB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIEEgYmxhbmsgZG9jdW1lbnQgb2YgdGhlIGV4cG9ydCdzIHBhZ2Ugc2l6ZSwgZm9yIGxheWluZyBhIHRhYmxlIG91dCB0byBzZWVcbiAgLy8gd2hhdCBmaXRzIGJlZm9yZSB0aGUgcmVhbCBvbmUgaXMgZHJhd24gb24uXG4gIHByaXZhdGUgX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0KTogYW55IHtcbiAgICByZXR1cm4gbmV3IGNvbnRleHQuanNQREYoe1xuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLFxuICAgICAgb3JpZW50YXRpb246IGNvbnRleHQub3JpZW50YXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyBEcmF3cyBhbiBvbi1wYWdlIHRhYmxlIChhIGxpc3Qncywgb3IgYSB0ZXh0IGJsb2NrJ3MpLCB0aGVuIHJlbW92ZXMgYW55XG4gIC8vIHBhZ2UgdGhlIGRyYXcgYWRkZWQuIFRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbjogdGhlIG1lYXN1cmVkIGZpdCwgdGhlXG4gIC8vIGlkZW50aWNhbCBjb2x1bW4gd2lkdGhzIGFuZCBhIHNpbmdsZS1saW5lIG5vdGljZSBrZWVwIHRoZSB0YWJsZSBpbnNpZGUgaXRzXG4gIC8vIGJveC4gVGhlIGNoZWNrIGV4aXN0cyBzbyBhIHN0cmF5IHBhZ2UgY2FuIG5ldmVyIGNhdGNoIHRoZSByZXBvcnQgcGFnZSdzXG4gIC8vIHJlbWFpbmluZyBjb21wb25lbnRzLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCBvcHRpb25zKTtcblxuICAgIHdoaWxlIChkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpID4gcGFnZXMpIHtcbiAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgIH1cblxuICAgIGRvYy5zZXRQYWdlKHBhZ2UpO1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb2Ygb25lIGxpc3QgdGhhdCBkaWQgbm90IGZpdCBpdHMgYm94LCBvbiBwYWdlcyBhcHBlbmRlZCBhZnRlclxuICAvLyB0aGUgcmVwb3J0IHBhZ2UsIGVhY2ggd2l0aCB0aGUgcGFnZSdzIGhlYWRlciBhbmQgZm9vdGVyLCB0aGUgdGFibGUnc1xuICAvLyB0aXRsZSBhbmQgaXRzIGhlYWQgYWdhaW4uIFRoZSB0YWJsZSBzaXRzIENPTlRJTlVBVElPTl9HQVAgaW5zaWRlIHRoZVxuICAvLyBiYW5kcy4gUmV0dXJucyB0aGUgcGh5c2ljYWwgcGFnZSBjb3VudGVyIGFmdGVyIHRoZXNlIHBhZ2VzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb250aW51YXRpb24oXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93OiBQZGZUYWJsZU92ZXJmbG93LFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGJhbmRzID0gcGFnZS5tYXN0ZXJIaWRkZW4gPyBOT19CQU5EUyA6IGNvbnRleHQucmVwb3J0LmNvbmZpZz8uaGVhZGVyRm9vdGVyID8/IE5PX0JBTkRTO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5oZWFkZXJIZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kcy5mb290ZXJIZWlnaHQpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93LmhlYWQubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgLy8gVGhlIGRvY3VtZW50J3MgcGFnZXMgdGhlIHRhYmxlIGRyYXdzIG9uLCBpbiBvcmRlci5cbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoXG4gICAgICAgIGNvbnRleHQsIG92ZXJmbG93LmhlYWQsIG92ZXJmbG93Lm51bWVyaWMsIGJvZHksIHgsIHRvcCArIFRJVExFX0gsIHcsIGJvdHRvbSwgb3ZlcmZsb3cuY29sdW1uU3R5bGVzLFxuICAgICAgICBvdmVyZmxvdy5mb290LFxuICAgICAgKSxcbiAgICAgIG1hcmdpbjogeyB0b3A6IHRvcCArIFRJVExFX0gsIGJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdyB9LFxuICAgICAgc2hvd0hlYWQ6ICdldmVyeVBhZ2UnLFxuICAgICAgLy8gRmlyZXMgb24gZXZlcnkgcGFnZSB0aGUgdGFibGUgZHJhd3Mgb24sIHRoZSBmaXJzdCBpbmNsdWRlZC5cbiAgICAgIHdpbGxEcmF3UGFnZTogKCkgPT4ge1xuICAgICAgICBwYWdlcy5wdXNoKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoZG9jLCB0aGlzLl9jb250aW51ZWRUaXRsZShvdmVyZmxvdy5jb21wb25lbnQsIG92ZXJmbG93LnNlYXJjaCwgb3ZlcmZsb3cuY3J1bWJzKSwgeCwgdG9wLCB3KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLl9yZW5kZXJDb250aW51YXRpb25NYXN0ZXJzKGNvbnRleHQsIHBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyLCBwYWdlcyk7XG5cbiAgICByZXR1cm4gcGFnZU51bWJlciArIHBhZ2VzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciBvZiBlYWNoIGNvbnRpbnVhdGlvbiBwYWdlLCBudW1iZXJlZCBvbiBmcm9tXG4gIC8vIHBhZ2VOdW1iZXIuIFRoZXkgZ28gb24gb25jZSB0aGUgdGFibGUgaXMgZHJhd24sIHNpbmNlIGEgdGV4dCBibG9jayB3aXRoIGFcbiAgLy8gdGFibGUgaXMgbWVhc3VyZWQgYmVmb3JlIGl0IGlzIGRyYXduLCB3aGljaCBhdXRvVGFibGUncyBwYWdlIGhvb2sgY2Fubm90XG4gIC8vIHdhaXQgZm9yOyB0aGV5IHNpdCBpbiB0aGUgYmFuZHMsIGNsZWFyIG9mIHRoZSB0YWJsZS5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29udGludWF0aW9uTWFzdGVycyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgcGFnZXM6IG51bWJlcltdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYywgcmVwb3J0IH0gPSBjb250ZXh0O1xuXG4gICAgZm9yIChjb25zdCBbb2Zmc2V0LCBkb2N1bWVudFBhZ2VdIG9mIHBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgZG9jLnNldFBhZ2UoZG9jdW1lbnRQYWdlKTtcbiAgICAgIGF3YWl0IHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBwYWdlLCB0aGlzLl90b2tlbnMocmVwb3J0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciArIG9mZnNldCArIDEpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgfVxuXG4gIC8vIFRoZSBtYXJnaW4gYSBjb250aW51YXRpb24gdGFibGUga2VlcHMgZnJvbSBvbmUgZWRnZTogaW5zaWRlIHRoZSBiYW5kIHdoZW5cbiAgLy8gdGhlIHBhZ2UgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uTWFyZ2luKGJhbmQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGJhbmQgPyBiYW5kICogUFQgKyBDT05USU5VQVRJT05fR0FQIDogTk9fQkFORF9NQVJHSU47XG4gIH1cblxuICBwcml2YXRlIF9jb250aW51ZWRUaXRsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgc2VhcmNoPzogc3RyaW5nLCBjcnVtYnM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzKTtcblxuICAgIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAoY29udGludWVkKWAgOiAnQ29udGludWVkJztcbiAgfVxuXG4gIC8vIEEgS1BJIHRpbGU6IHRoZSBjYXJkIHRoZSBzY3JlZW4gZHJhd3MgKGtwaS1jYXJkLnRzIGRlY2lkZXMgZXZlcnkgbGluZSksXG4gIC8vIHN0YWNrZWQgYW5kIGNlbnRlcmVkIGluIHRoZSBib2R5LiBBIGNhcmQgd2l0aCBvbmx5IGl0cyB2YWx1ZSBhbmQgbGFiZWxcbiAgLy8ga2VlcHMgdGhlIHRpbGUncyBsb25nLXN0YW5kaW5nIGxheW91dC5cbiAgcHJpdmF0ZSBfcmVuZGVyS3BpKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgY29uZmlnID0gaXRlbS5jb21wb25lbnQuY29uZmlnIGFzIEtwaUNvbmZpZztcbiAgICBjb25zdCB2aWV3ID0ga3BpQ2FyZFZpZXcoY29uZmlnLCBpdGVtLmRhdGEsIHsgZm9ybWF0OiBjb250ZXh0LmZvcm1hdENvbnRleHQsIHRpbWV6b25lOiBjb250ZXh0LnRpbWV6b25lIH0pO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fcGRmVGV4dCh2aWV3LnZhbHVlKTtcbiAgICBjb25zdCBub3RlcyA9IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQubG9jYWxlKTtcblxuICAgIGlmICgha3BpQ2FyZEhhc0V4dHJhcyh2aWV3LCBub3RlcykpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDI2KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG5cbiAgICAgIGlmICh2aWV3LmxhYmVsKSB7XG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICAgIGRvYy50ZXh0KHZpZXcubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSB0aWxlIHRvbyBzaG9ydCBmb3IgdGhlIGNhcmQncyBsaW5lcyBzaHJpbmtzIHRoZW0gYWxsIGFsaWtlLlxuICAgIGNvbnN0IHBhcnRzID0ga3BpRXhwb3J0UGFydHModmlldywgbm90ZXMsIGgsIEtQSV9IRUlHSFRTKTtcbiAgICBjb25zdCBoZWlnaHRzID0gc2NhbGVkS3BpSGVpZ2h0cyhLUElfSEVJR0hUUywgcGFydHMuc2NhbGUpO1xuICAgIGxldCB0b3AgPSB5ICsgTWF0aC5tYXgoMCwgKGggLSBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIGhlaWdodHMpKSAvIDIpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI2ICogcGFydHMuc2NhbGUpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB0b3AgKyBLUElfVkFMVUVfQkFTRUxJTkUgKiBwYXJ0cy5zY2FsZSwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgdG9wICs9IGhlaWdodHMudmFsdWU7XG5cbiAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5ICogcGFydHMuc2NhbGUpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dCh0aGlzLl9maXQoZG9jLCB0aGlzLl9wZGZUZXh0KHZpZXcubGFiZWwpLCB3KSwgeCArIHcgLyAyLCB0b3AgKyA5ICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgICAgdG9wICs9IGhlaWdodHMubGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmRlbHRhICYmIHZpZXcuZGVsdGEpIHtcbiAgICAgIHRoaXMuX2twaURlbHRhKGRvYywgdmlldy5kZWx0YSwgeCwgdG9wLCB3LCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5kZWx0YTtcbiAgICB9XG5cbiAgICBpZiAocGFydHMud2luZG93KSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHZpZXcud2luZG93KSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ25vcm1hbCcsIHBhcnRzLnNjYWxlKTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLndpbmRvdztcbiAgICB9XG5cbiAgICBpZiAocGFydHMudGFyZ2V0ICYmIHZpZXcudGFyZ2V0KSB7XG4gICAgICB0aGlzLl9rcGlUYXJnZXQoZG9jLCB2aWV3LnRhcmdldCwgeCwgdG9wLCB3KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLnRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAocGFydHMuc3BhcmtsaW5lICYmIHZpZXcuc3BhcmtsaW5lKSB7XG4gICAgICB0aGlzLl9rcGlTcGFya2xpbmUoZG9jLCB2aWV3LnNwYXJrbGluZS52YWx1ZXMsIHZpZXcuc3BhcmtsaW5lLnBhcnRpYWwsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5zcGFya2xpbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHBhcnRzLm5vdGVzKSB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnaXRhbGljJyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy5ub3RlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBkZWx0YSByb3csIGNlbnRlcmVkIGFzIG9uZSBncm91cDogYSB0cmlhbmdsZSBwb2ludGluZyB0aGUgd2F5IHRoZVxuICAvLyB2YWx1ZSBtb3ZlZCAobm9uZSB3aGVuIHRoZSBzaG93biBjaGFuZ2Ugcm91bmRzIHRvIHplcm8pIGFuZCB0aGUgY2hhbmdlIGluXG4gIC8vIHRoZSBjb2xvciBvZiB3aGF0IGl0IG1lYW5zLCB0aGVuIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aCBpbiBncmV5LlxuICBwcml2YXRlIF9rcGlEZWx0YShkb2M6IGFueSwgZGVsdGE6IEtwaUNhcmREZWx0YSwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyLCBzY2FsZSA9IDEpOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbZGVsdGEudG9uZV19YDtcbiAgICBjb25zdCBjaGFuZ2UgPSB0aGlzLl9wZGZUZXh0KGRlbHRhLnRleHQpO1xuICAgIGNvbnN0IHNpemUgPSBLUElfREVMVEFfU0laRSAqIHNjYWxlO1xuICAgIGNvbnN0IHNpZGUgPSBLUElfQVJST1cgKiBzY2FsZTtcbiAgICBjb25zdCBhcnJvdyA9IGRlbHRhLnRyZW5kID09PSBSZXBvcnRLcGlUcmVuZC5GbGF0ID8gMCA6IHNpZGUgKyBLUElfQVJST1dfR0FQICogc2NhbGU7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgY29uc3QgY2hhbmdlV2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGNoYW5nZSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGNvbnN0IGNvbXBhcmVkID0gZGVsdGEuY29tcGFyZWRcbiAgICAgID8gdGhpcy5fZml0KGRvYywgYCAke3RoaXMuX3BkZlRleHQoZGVsdGEuY29tcGFyZWQpfWAsIE1hdGgubWF4KDAsIHcgLSBhcnJvdyAtIGNoYW5nZVdpZHRoKSlcbiAgICAgIDogJyc7XG4gICAgY29uc3Qgd2lkdGggPSBhcnJvdyArIGNoYW5nZVdpZHRoICsgKGNvbXBhcmVkID8gZG9jLmdldFRleHRXaWR0aChjb21wYXJlZCkgOiAwKTtcbiAgICBjb25zdCBiYXNlbGluZSA9IHRvcCArIHNpemU7XG4gICAgbGV0IGxlZnQgPSB4ICsgTWF0aC5tYXgoMCwgKHcgLSB3aWR0aCkgLyAyKTtcblxuICAgIGlmIChhcnJvdykge1xuICAgICAgY29uc3QgdXAgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuVXA7XG4gICAgICBjb25zdCB0aXAgPSB1cCA/IGJhc2VsaW5lIC0gc2lkZSA6IGJhc2VsaW5lO1xuICAgICAgY29uc3QgYmFzZSA9IHVwID8gYmFzZWxpbmUgOiBiYXNlbGluZSAtIHNpZGU7XG5cbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgICAgZG9jLnRyaWFuZ2xlKGxlZnQsIGJhc2UsIGxlZnQgKyBzaWRlLCBiYXNlLCBsZWZ0ICsgc2lkZSAvIDIsIHRpcCwgJ0YnKTtcbiAgICAgIGxlZnQgKz0gYXJyb3c7XG4gICAgfVxuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldFRleHRDb2xvcihjb2xvcik7XG4gICAgZG9jLnRleHQoY2hhbmdlLCBsZWZ0LCBiYXNlbGluZSk7XG5cbiAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKE1VVEVEX0NPTE9SKTtcbiAgICAgIGRvYy50ZXh0KGNvbXBhcmVkLCBsZWZ0ICsgY2hhbmdlV2lkdGgsIGJhc2VsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGxpbmUgKCdHb2FsOiAkMSwwMDAgwrcgNTYlIG9mIHRhcmdldCcpIGFuZCwgd2hlbiB0aGUgc2VydmVyIHNlbnRcbiAgLy8gdGhlIHByb2dyZXNzLCBhIGJhciBmaWxsZWQgdGhhdCBmYXI6IGdyZWVuIG9uY2UgdGhlIHRhcmdldCBpcyBtZXQuXG4gIHByaXZhdGUgX2twaVRhcmdldChkb2M6IGFueSwgdGFyZ2V0OiBLcGlDYXJkVGFyZ2V0LCB4OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gdGFyZ2V0LnByb2dyZXNzID8gYCR7dGFyZ2V0LnRleHR9IMK3ICR7dGFyZ2V0LnByb2dyZXNzfWAgOiB0YXJnZXQudGV4dDtcblxuICAgIHRoaXMuX3NtYWxsTGluZShkb2MsIHRoaXMuX3BkZlRleHQodGV4dCksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnKTtcblxuICAgIGlmICh0YXJnZXQuZmlsbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhclcgPSBNYXRoLm1pbih3ICogMC42LCBLUElfQkFSX1cpO1xuICAgIGNvbnN0IGJhclggPSB4ICsgKHcgLSBiYXJXKSAvIDI7XG4gICAgY29uc3QgYmFyWSA9IHRvcCArIE5PVEVfTElORV9IICsgMTtcblxuICAgIGRvYy5zZXRGaWxsQ29sb3IoS1BJX1RSQUNLX0NPTE9SKTtcbiAgICBkb2MucmVjdChiYXJYLCBiYXJZLCBiYXJXLCBLUElfQkFSX0gsICdGJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPiAwKSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbdGFyZ2V0LnRvbmVdfWApO1xuICAgICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVyAqIHRhcmdldC5maWxsLCBLUElfQkFSX0gsICdGJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHNwYXJrbGluZSBpbiBhIGJveCB1bmRlciB0aGUgY2FyZCdzIGxpbmVzLCBhcyB0aGUgc2NyZWVuIGRyYXdzIGl0XG4gIC8vIChrcGlTcGFya2xpbmVHZW9tZXRyeSwgYSAwLTEwMCBib3gpOiBhIHZlY3RvciBsaW5lIHBlciBydW4gb2YgdmFsdWVzLCBhXG4gIC8vIGRvdCBmb3IgYSBsb25lIHZhbHVlLCBhbmQgdGhlIGxhc3QgcG9pbnQncyBtYXJrZXIsIGhvbGxvdyB3aGlsZSBpdHMgcGVyaW9kXG4gIC8vIGlzIHBhcnRpYWwuXG4gIHByaXZhdGUgX2twaVNwYXJrbGluZShcbiAgICBkb2M6IGFueSxcbiAgICB2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdLFxuICAgIHBhcnRpYWw6IGJvb2xlYW4sXG4gICAgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGtwaVNwYXJrbGluZUdlb21ldHJ5KHZhbHVlcywgcGFydGlhbCk7XG4gICAgY29uc3QgYm94VyA9IE1hdGgubWluKHcgKiAwLjcsIEtQSV9TUEFSS0xJTkVfVyk7XG4gICAgY29uc3QgYm94SCA9IEtQSV9IRUlHSFRTLnNwYXJrbGluZSAtIDIgKiBLUElfU1BBUktMSU5FX0lOU0VUO1xuICAgIGNvbnN0IGxlZnQgPSB4ICsgKHcgLSBib3hXKSAvIDI7XG4gICAgY29uc3QgYXQgPSAocG9pbnQ6IEtwaVNwYXJrbGluZVBvaW50KSA9PiAoe1xuICAgICAgeDogbGVmdCArIHBvaW50LnggKiBib3hXIC8gMTAwLFxuICAgICAgeTogdG9wICsgS1BJX1NQQVJLTElORV9JTlNFVCArIHBvaW50LnkgKiBib3hIIC8gMTAwLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbG9yID0gYCMke1JFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SfWA7XG5cbiAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICBkb2Muc2V0TGluZVdpZHRoKDEpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5LmxpbmVzKSB7XG4gICAgICBjb25zdCBwb2ludHMgPSBsaW5lLnNwbGl0KCcgJykubWFwKChwYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtweCwgcHldID0gcGFpci5zcGxpdCgnLCcpLm1hcChOdW1iZXIpO1xuXG4gICAgICAgIHJldHVybiBhdCh7IHg6IHB4LCB5OiBweSB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RlcHMgPSBwb2ludHMuc2xpY2UoMSkubWFwKChwb2ludCwgaW5kZXgpID0+IFtwb2ludC54IC0gcG9pbnRzW2luZGV4XS54LCBwb2ludC55IC0gcG9pbnRzW2luZGV4XS55XSk7XG5cbiAgICAgIGRvYy5saW5lcyhzdGVwcywgcG9pbnRzWzBdLngsIHBvaW50c1swXS55LCBbMSwgMV0sICdTJywgZmFsc2UpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZG90IG9mIGdlb21ldHJ5LmRvdHMpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gYXQoZG90KTtcbiAgICAgIGRvYy5jaXJjbGUocG9pbnQueCwgcG9pbnQueSwgS1BJX0RPVF9SLCAnRicpO1xuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS5sYXN0KSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGdlb21ldHJ5Lmxhc3QpO1xuXG4gICAgICBpZiAoZ2VvbWV0cnkubGFzdC5ob2xsb3cpIHtcbiAgICAgICAgZG9jLnNldEZpbGxDb2xvcignI2ZmZmZmZicpO1xuICAgICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0ZEJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBIGZvcm1hdHRlZCB2YWx1ZSBhcyBqc1BERiBjYW4gZHJhdyBpdC4gSXRzIHN0YW5kYXJkIGZvbnRzIHdyaXRlIHRleHQgaW5cbiAgLy8gV2luQW5zaSwgd2hpY2ggaGFzIHRoZSBuby1icmVhayBzcGFjZSAoVSswMEEwLCBmci1DQSdzIGRpZ2l0IGdyb3VwaW5nKSBidXRcbiAgLy8gbm90IHRoZSBuYXJyb3cgb25lIChVKzIwMkYsIHdoaWNoIG90aGVyIGxvY2FsZXMgZ3JvdXAgYW5kIHNwYWNlIHdpdGgpLCB0aGVcbiAgLy8gdGhpbiBhbmQgaGFpciBzcGFjZXMgKFUrMjAwOSwgVSsyMDBBLCB3aGljaCBJbnRsIHB1dHMgYXJvdW5kIGEgZGF0ZVxuICAvLyByYW5nZSdzIGRhc2g6ICdTZXAgMSDigJMgMzAsIDIwMjYnKSwgdGhlIG1pbnVzIHNpZ24gKFUrMjIxMiwgc29tZSBsb2NhbGVzJ1xuICAvLyBuZWdhdGl2ZSBzaWduKSBvciBhIHJhbmsgY2hhbmdlJ3MgdHJpYW5nbGVzOiBlYWNoIHdvdWxkIHByaW50IGFzIHN0cmF5XG4gIC8vIGdseXBocy4gVGhlIG5hcnJvdyBzcGFjZSBiZWNvbWVzIGEgbm8tYnJlYWsgc3BhY2UsIHNvIGEgbnVtYmVyIHN0aWxsIG5ldmVyXG4gIC8vIHdyYXBzIGFjcm9zcyBhIGxpbmU7IHRoZSB0aGluIGFuZCBoYWlyIHNwYWNlcyBhIHBsYWluIHNwYWNlOyB0aGUgbWludXNcbiAgLy8gc2lnbiBhIGh5cGhlbjsgYW5kIGEgcmFuaydzIHJpc2UgYSBwbHVzIHNpZ24gYW5kIGl0cyBmYWxsIGEgaHlwaGVuXG4gIC8vICgn4payIDInIHJlYWRzICcrMicpLlxuICBwcml2YXRlIF9wZGZUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC9cXHUyMDJGL2csICdcXHUwMEEwJylcbiAgICAgIC5yZXBsYWNlKC9bXFx1MjAwOVxcdTIwMEFdL2csICcgJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyMjEyL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9cXHUyNUIyXFxzPy9nLCAnKycpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCQ1xccz8vZywgJy0nKTtcbiAgfVxuXG4gIC8vIEEgbGF5ZXIncyB2YWx1ZXMgd2l0aCBlYWNoIG51bWJlciBhcyBqc1BERiBjYW4gZHJhdyBpdCAoX3BkZlRleHQpLCBzbyBhXG4gIC8vIHZhbHVlIGdyb3VwZWQgd2l0aCBuYXJyb3cgc3BhY2VzIHJlYWRzLCBhbmQgd3JhcHMsIGxpa2UgYW55IG90aGVyIG51bWJlci5cbiAgcHJpdmF0ZSBfcGRmVmFsdWVzKHZhbHVlczogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPik6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModmFsdWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgdmFsdWUudGV4dCA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLnZhbHVlLCB0ZXh0OiB0aGlzLl9wZGZUZXh0KHZhbHVlLnRleHQpIH0sXG4gICAgXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2x1ZyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpIHx8ICdyZXBvcnQnO1xuICB9XG59XG4iXX0=