@appius-fr/apx 2.7.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/APX.dev.mjs CHANGED
@@ -191,67 +191,74 @@ __webpack_require__.r(__webpack_exports__);
191
191
 
192
192
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
193
193
  // Module
194
- ___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid) */
194
+ ___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)
195
+ Use !important so page styles (e.g. display: table) do not override the grid layout. */
195
196
 
197
+ /* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */
198
+ /* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */
199
+ /* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */
196
200
  .apx-scrollable-table {
197
- display: grid;
198
- grid-template-columns: repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr));
199
- grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;
201
+ display: grid !important;
202
+ grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));
203
+ grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
200
204
  width: 100%;
205
+ table-layout: unset !important;
206
+ }
207
+
208
+ .apx-scrollable-table--body-height {
209
+ --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);
201
210
  }
202
211
 
203
212
  /* Table with no tfoot: thead + tbody only */
204
213
  .apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
205
- grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px));
214
+ grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
206
215
  }
207
216
 
208
217
  /* Table with no thead: tbody + tfoot only */
209
218
  .apx-scrollable-table.apx-scrollable-table--no-thead {
210
- grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;
219
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
211
220
  }
212
221
 
213
222
  /* Table with neither thead nor tfoot: tbody only */
214
223
  .apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
215
- grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px));
224
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
216
225
  }
217
226
 
227
+ /* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */
218
228
  .apx-scrollable-table > thead,
219
229
  .apx-scrollable-table > tbody,
220
230
  .apx-scrollable-table > tfoot {
221
- display: grid;
231
+ display: grid !important;
222
232
  grid-template-columns: subgrid;
223
233
  grid-column: 1 / -1;
224
- grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
225
234
  min-height: 0;
226
235
  }
227
236
 
228
237
  .apx-scrollable-table > thead {
229
- grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
238
+ grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));
230
239
  }
231
240
 
232
241
  .apx-scrollable-table > tbody {
233
- grid-template-rows: repeat(var(--apx-scrollable-tbody-rows, 1), auto);
242
+ grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));
234
243
  overflow: auto;
235
- /* Reserve space for the vertical scrollbar so it doesn't shrink content width and trigger a horizontal scrollbar */
236
- scrollbar-gutter: stable;
237
244
  }
238
245
 
239
246
  .apx-scrollable-table > tfoot {
240
- grid-template-rows: repeat(var(--apx-scrollable-tfoot-rows, 1), auto);
247
+ grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));
241
248
  }
242
249
 
243
250
  .apx-scrollable-table > thead > tr,
244
251
  .apx-scrollable-table > tbody > tr,
245
252
  .apx-scrollable-table > tfoot > tr {
246
- display: contents;
253
+ display: contents !important;
247
254
  }
248
255
 
249
256
  .apx-scrollable-table th,
250
257
  .apx-scrollable-table td {
251
- /* Grid placement set by JS (grid-row, grid-column) for colspan/rowspan */
252
258
  min-width: 0;
259
+ box-sizing: border-box;
253
260
  }
254
- `, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA,2GAA2G;;AAE3G;IACI,aAAa;IACb,4EAA4E;IAC5E,uFAAuF;IACvF,WAAW;AACf;;AAEA,4CAA4C;AAC5C;IACI,kFAAkF;AACtF;;AAEA,4CAA4C;AAC5C;IACI,kFAAkF;AACtF;;AAEA,mDAAmD;AACnD;IACI,6EAA6E;AACjF;;AAEA;;;IAGI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,qEAAqE;IACrE,aAAa;AACjB;;AAEA;IACI,qEAAqE;AACzE;;AAEA;IACI,qEAAqE;IACrE,cAAc;IACd,mHAAmH;IACnH,wBAAwB;AAC5B;;AAEA;IACI,qEAAqE;AACzE;;AAEA;;;IAGI,iBAAiB;AACrB;;AAEA;;IAEI,yEAAyE;IACzE,YAAY;AAChB","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid) */\r\n\r\n.apx-scrollable-table {\r\n display: grid;\r\n grid-template-columns: repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr));\r\n grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;\r\n width: 100%;\r\n}\r\n\r\n/* Table with no tfoot: thead + tbody only */\r\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px));\r\n}\r\n\r\n/* Table with no thead: tbody + tfoot only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead {\r\n grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;\r\n}\r\n\r\n/* Table with neither thead nor tfoot: tbody only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px));\r\n}\r\n\r\n.apx-scrollable-table > thead,\r\n.apx-scrollable-table > tbody,\r\n.apx-scrollable-table > tfoot {\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-column: 1 / -1;\r\n grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);\r\n min-height: 0;\r\n}\r\n\r\n.apx-scrollable-table > thead {\r\n grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);\r\n}\r\n\r\n.apx-scrollable-table > tbody {\r\n grid-template-rows: repeat(var(--apx-scrollable-tbody-rows, 1), auto);\r\n overflow: auto;\r\n /* Reserve space for the vertical scrollbar so it doesn't shrink content width and trigger a horizontal scrollbar */\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.apx-scrollable-table > tfoot {\r\n grid-template-rows: repeat(var(--apx-scrollable-tfoot-rows, 1), auto);\r\n}\r\n\r\n.apx-scrollable-table > thead > tr,\r\n.apx-scrollable-table > tbody > tr,\r\n.apx-scrollable-table > tfoot > tr {\r\n display: contents;\r\n}\r\n\r\n.apx-scrollable-table th,\r\n.apx-scrollable-table td {\r\n /* Grid placement set by JS (grid-row, grid-column) for colspan/rowspan */\r\n min-width: 0;\r\n}\r\n"],"sourceRoot":""}]);
261
+ `, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA;yFACyF;;AAEzF,+GAA+G;AAC/G,mIAAmI;AACnI,yIAAyI;AACzI;IACI,wBAAwB;IACxB,+MAA+M;IAC/M,4HAA4H;IAC5H,WAAW;IACX,8BAA8B;AAClC;;AAEA;IACI,4EAA4E;AAChF;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,4CAA4C;AAC5C;IACI,uHAAuH;AAC3H;;AAEA,mDAAmD;AACnD;IACI,kHAAkH;AACtH;;AAEA,oGAAoG;AACpG;;;IAGI,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,aAAa;AACjB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;IACI,gHAAgH;IAChH,cAAc;AAClB;;AAEA;IACI,gHAAgH;AACpH;;AAEA;;;IAGI,4BAA4B;AAChC;;AAEA;;IAEI,YAAY;IACZ,sBAAsB;AAC1B","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid)\r\n Use !important so page styles (e.g. display: table) do not override the grid layout. */\r\n\r\n/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */\r\n/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */\r\n/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */\r\n.apx-scrollable-table {\r\n display: grid !important;\r\n grid-template-columns: var(--apx-scrollable-template-columns, repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr)) minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px)));\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n width: 100%;\r\n table-layout: unset !important;\r\n}\r\n\r\n.apx-scrollable-table--body-height {\r\n --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);\r\n}\r\n\r\n/* Table with no tfoot: thead + tbody only */\r\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* Table with no thead: tbody + tfoot only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\r\n}\r\n\r\n/* Table with neither thead nor tfoot: tbody only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\r\n}\r\n\r\n/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */\r\n.apx-scrollable-table > thead,\r\n.apx-scrollable-table > tbody,\r\n.apx-scrollable-table > tfoot {\r\n display: grid !important;\r\n grid-template-columns: subgrid;\r\n grid-column: 1 / -1;\r\n min-height: 0;\r\n}\r\n\r\n.apx-scrollable-table > thead {\r\n grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > tbody {\r\n grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));\r\n overflow: auto;\r\n}\r\n\r\n.apx-scrollable-table > tfoot {\r\n grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));\r\n}\r\n\r\n.apx-scrollable-table > thead > tr,\r\n.apx-scrollable-table > tbody > tr,\r\n.apx-scrollable-table > tfoot > tr {\r\n display: contents !important;\r\n}\r\n\r\n.apx-scrollable-table th,\r\n.apx-scrollable-table td {\r\n min-width: 0;\r\n box-sizing: border-box;\r\n}\r\n"],"sourceRoot":""}]);
255
262
  // Exports
256
263
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
257
264
 
@@ -1782,32 +1789,112 @@ const CLASS_TABLE = 'apx-scrollable-table';
1782
1789
 
1783
1790
  const DEFAULT_MAX_HEIGHT = '200px';
1784
1791
 
1792
+ const THROTTLE_MS = 16;
1793
+
1794
+ /** @type {Set<HTMLTableElement>} */
1795
+ const dynamicTables = new Set();
1796
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1797
+ const scrollSourceToTables = new Map();
1798
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1799
+ const resizeSourceToTables = new Map();
1800
+ /** @type {boolean} */
1801
+ let resizeWindowAttached = false;
1802
+ /** @type {ResizeObserver|null} */
1803
+ let resizeObserver = null;
1804
+ /** @type {number} */
1805
+ let throttleLast = 0;
1806
+ /** @type {number|null} */
1807
+ let throttleRaf = null;
1808
+
1785
1809
  /**
1786
- * Get number of columns from the first row that has cells (sum of colspan).
1787
- * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1810
+ * Sum of colspans for one row (direct th/td children of tr).
1811
+ * @param {HTMLTableRowElement} tr
1788
1812
  * @returns {number}
1789
1813
  */
1790
- function getColumnCountFromSection(section) {
1791
- const firstRow = section?.querySelector(':scope > tr');
1792
- if (!firstRow) return 0;
1814
+ function getRowColumnCount(tr) {
1793
1815
  let cols = 0;
1794
- firstRow.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1816
+ tr.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1795
1817
  cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
1796
1818
  });
1797
1819
  return cols;
1798
1820
  }
1799
1821
 
1800
1822
  /**
1801
- * Get total column count for the table (from thead or tbody first row).
1823
+ * Get maximum column count in a section (max sum of colspans across all rows).
1824
+ * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1825
+ * @returns {number}
1826
+ */
1827
+ function getColumnCountFromSection(section) {
1828
+ if (!section) return 0;
1829
+ const rows = section.querySelectorAll(':scope > tr');
1830
+ let maxCols = 0;
1831
+ rows.forEach((tr) => {
1832
+ const sum = getRowColumnCount(tr);
1833
+ if (sum > maxCols) maxCols = sum;
1834
+ });
1835
+ return maxCols;
1836
+ }
1837
+
1838
+ /**
1839
+ * Get total column count for the table (max across thead, tbody, tfoot).
1802
1840
  * @param {HTMLTableElement} table
1803
1841
  * @returns {number}
1804
1842
  */
1805
1843
  function getTableColumnCount(table) {
1806
1844
  const thead = table.querySelector('thead');
1807
1845
  const tbody = table.querySelector('tbody');
1808
- const countFromThead = thead ? getColumnCountFromSection(thead) : 0;
1809
- const countFromTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1810
- return countFromThead || countFromTbody || 1;
1846
+ const tfoot = table.querySelector('tfoot');
1847
+ const countThead = thead ? getColumnCountFromSection(thead) : 0;
1848
+ const countTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1849
+ const countTfoot = tfoot ? getColumnCountFromSection(tfoot) : 0;
1850
+ return Math.max(countThead, countTbody, countTfoot, 1);
1851
+ }
1852
+
1853
+ /**
1854
+ * Measure current column widths from the table in its natural layout (before applying scrollable class).
1855
+ * Prefers a row where each cell has colspan 1 so we get one width per column; otherwise splits cell widths by colspan.
1856
+ * @param {HTMLTableElement} table - table not yet with scrollable class
1857
+ * @param {number} numCols
1858
+ * @returns {number[]} pixel widths per column
1859
+ */
1860
+ function measureColumnWidths(table, numCols) {
1861
+ const thead = table.querySelector('thead');
1862
+ const tbody = table.querySelector('tbody');
1863
+ const sections = [thead, tbody].filter(Boolean);
1864
+ /** @type {HTMLTableRowElement|null} */
1865
+ let bestRow = null;
1866
+ for (const section of sections) {
1867
+ const rows = section.querySelectorAll(':scope > tr');
1868
+ for (const tr of rows) {
1869
+ const cells = tr.querySelectorAll(':scope > th, :scope > td');
1870
+ if (getRowColumnCount(tr) !== numCols) continue;
1871
+ const allSingle = Array.from(cells).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1);
1872
+ if (allSingle && cells.length === numCols) {
1873
+ bestRow = tr;
1874
+ break;
1875
+ }
1876
+ if (!bestRow) bestRow = tr;
1877
+ }
1878
+ if (bestRow && Array.from(bestRow.querySelectorAll(':scope > th, :scope > td')).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1))
1879
+ break;
1880
+ }
1881
+ if (!bestRow) return [];
1882
+
1883
+ const widths = new Array(numCols).fill(0);
1884
+ const cells = bestRow.querySelectorAll(':scope > th, :scope > td');
1885
+ let col = 0;
1886
+ for (const cell of cells) {
1887
+ const span = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols - col);
1888
+ if (span <= 0) break;
1889
+ const w = cell.getBoundingClientRect().width;
1890
+ const perCol = w / span;
1891
+ for (let i = 0; i < span; i++) widths[col + i] = perCol;
1892
+ col += span;
1893
+ }
1894
+ if (col === 0) return [];
1895
+ const fallback = widths.some((w) => w > 0) ? Math.max(80, ...widths.filter((w) => w > 0)) / 2 : 80;
1896
+ for (let i = 0; i < numCols; i++) if (widths[i] <= 0) widths[i] = fallback;
1897
+ return widths.slice(0, numCols);
1811
1898
  }
1812
1899
 
1813
1900
  /**
@@ -1885,22 +1972,254 @@ function clearPlacements(table) {
1885
1972
  }
1886
1973
 
1887
1974
  /**
1888
- * Normalize maxHeight option to a CSS length string.
1975
+ * Normalize height/maxHeight option to a CSS length string.
1889
1976
  * @param {number|string} value
1890
1977
  * @returns {string}
1891
1978
  */
1892
- function normalizeMaxHeight(value) {
1979
+ function normalizeHeight(value) {
1893
1980
  if (value == null) return DEFAULT_MAX_HEIGHT;
1894
1981
  if (typeof value === 'number') return `${value}px`;
1895
1982
  return String(value);
1896
1983
  }
1897
1984
 
1985
+ /**
1986
+ * Resolve current body height from options: either bodyHeightDynamic.get(table) or static height/maxHeight.
1987
+ * @param {Object} options - scrollableTable options (may include bodyHeightDynamic, height, maxHeight)
1988
+ * @param {HTMLTableElement} table
1989
+ * @returns {{ bodySize: string, useFixedHeight: boolean }}
1990
+ */
1991
+ function resolveBodyHeight(options, table) {
1992
+ const dyn = options.bodyHeightDynamic;
1993
+ if (dyn && typeof dyn.get === 'function') {
1994
+ const value = dyn.get(table);
1995
+ const bodySize = normalizeHeight(value);
1996
+ const useFixedHeight = dyn.useAs === 'height';
1997
+ return { bodySize, useFixedHeight };
1998
+ }
1999
+ const useFixedHeight = options.height != null;
2000
+ const raw = useFixedHeight ? options.height : options.maxHeight;
2001
+ const bodySize = normalizeHeight(raw);
2002
+ return { bodySize, useFixedHeight };
2003
+ }
2004
+
2005
+ /**
2006
+ * Update only the tbody height CSS variable and class (used on scroll/resize for dynamic height).
2007
+ * @param {HTMLTableElement} table
2008
+ * @param {Object} options - full scrollableTable options (with ref.options when called from throttle)
2009
+ */
2010
+ function updateTableBodyHeight(table, options) {
2011
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2012
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2013
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
2014
+ }
2015
+
2016
+ /**
2017
+ * Run lazy cleanup then updateTableBodyHeight for all tables still in dynamicTables. (Called by throttled entry point or RAF.)
2018
+ */
2019
+ function flushDynamicHeightUpdate() {
2020
+ const toRemove = [];
2021
+ dynamicTables.forEach((table) => {
2022
+ if (!table.isConnected) toRemove.push(table);
2023
+ });
2024
+ toRemove.forEach((table) => removeTableFromDynamicSources(table));
2025
+ dynamicTables.forEach((table) => {
2026
+ const ref = table[DATA_KEY];
2027
+ if (ref?.options) updateTableBodyHeight(table, ref.options);
2028
+ });
2029
+ }
2030
+
2031
+ /**
2032
+ * Throttled entry: run flushDynamicHeightUpdate now or schedule with RAF.
2033
+ */
2034
+ function runDynamicHeightUpdate() {
2035
+ const now = Date.now();
2036
+ if (now - throttleLast < THROTTLE_MS) {
2037
+ if (!throttleRaf) {
2038
+ throttleRaf = requestAnimationFrame(() => {
2039
+ throttleRaf = null;
2040
+ throttleLast = Date.now();
2041
+ flushDynamicHeightUpdate();
2042
+ });
2043
+ }
2044
+ return;
2045
+ }
2046
+ throttleLast = now;
2047
+ flushDynamicHeightUpdate();
2048
+ }
2049
+
2050
+ /**
2051
+ * Resolve updateOn into scroll targets (Element[]) and resize: { window: boolean, elements: Element[] }.
2052
+ * @param {Object} options - options.bodyHeightDynamic.updateOn
2053
+ * @returns {{ scrollTargets: Element[], resizeWindow: boolean, resizeElements: Element[] }}
2054
+ */
2055
+ function resolveUpdateOn(options) {
2056
+ const u = options?.bodyHeightDynamic?.updateOn;
2057
+ const scrollOn = u?.scrollOn;
2058
+ const resizeOn = u?.resizeOn;
2059
+ const scrollTargets = [];
2060
+ if (scrollOn != null && Array.isArray(scrollOn) && scrollOn.length > 0) {
2061
+ scrollOn.forEach((x) => {
2062
+ if (x === 'document') scrollTargets.push(document.documentElement);
2063
+ else if (x && typeof x.addEventListener === 'function') scrollTargets.push(x);
2064
+ });
2065
+ } else if (u?.scroll === true) {
2066
+ scrollTargets.push(document.documentElement);
2067
+ scrollTargets.push(typeof window !== 'undefined' ? window : document.documentElement);
2068
+ }
2069
+ let resizeWindow = false;
2070
+ const resizeElements = [];
2071
+ if (resizeOn != null && Array.isArray(resizeOn) && resizeOn.length > 0) {
2072
+ resizeOn.forEach((x) => {
2073
+ if (x === 'window') resizeWindow = true;
2074
+ else if (x && typeof x.addEventListener === 'function') resizeElements.push(x);
2075
+ });
2076
+ } else if (u?.resize !== false) {
2077
+ resizeWindow = true;
2078
+ resizeElements.push(document.documentElement);
2079
+ }
2080
+ return { scrollTargets, resizeWindow, resizeElements };
2081
+ }
2082
+
2083
+ /**
2084
+ * Remove table from dynamicTables and from all scroll/resize Maps; detach listeners if Set becomes empty.
2085
+ * @param {HTMLTableElement} table
2086
+ */
2087
+ function removeTableFromDynamicSources(table) {
2088
+ dynamicTables.delete(table);
2089
+ scrollSourceToTables.forEach((set, el) => {
2090
+ set.delete(table);
2091
+ if (set.size === 0) {
2092
+ scrollSourceToTables.delete(el);
2093
+ el.removeEventListener('scroll', onScrollThrottled);
2094
+ }
2095
+ });
2096
+ resizeSourceToTables.forEach((set, el) => {
2097
+ set.delete(table);
2098
+ if (set.size === 0) {
2099
+ resizeSourceToTables.delete(el);
2100
+ if (resizeObserver) resizeObserver.unobserve(el);
2101
+ }
2102
+ });
2103
+ if (resizeWindowAttached && dynamicTables.size === 0) {
2104
+ window.removeEventListener('resize', onResizeThrottled);
2105
+ resizeWindowAttached = false;
2106
+ }
2107
+ }
2108
+
2109
+ function onScrollThrottled() {
2110
+ runDynamicHeightUpdate();
2111
+ }
2112
+
2113
+ function onResizeThrottled() {
2114
+ runDynamicHeightUpdate();
2115
+ }
2116
+
2117
+ /**
2118
+ * Register a table with bodyHeightDynamic: add to Set and attach scroll/resize listeners per updateOn.
2119
+ * @param {HTMLTableElement} table
2120
+ * @param {Object} options - full options (ref.options)
2121
+ */
2122
+ function registerDynamicTable(table, options) {
2123
+ const { scrollTargets, resizeWindow, resizeElements } = resolveUpdateOn(options);
2124
+ dynamicTables.add(table);
2125
+ scrollTargets.forEach((el) => {
2126
+ let set = scrollSourceToTables.get(el);
2127
+ if (!set) {
2128
+ set = new Set();
2129
+ scrollSourceToTables.set(el, set);
2130
+ el.addEventListener('scroll', onScrollThrottled, { passive: true });
2131
+ }
2132
+ set.add(table);
2133
+ });
2134
+ if (resizeWindow) {
2135
+ if (!resizeWindowAttached) {
2136
+ resizeWindowAttached = true;
2137
+ window.addEventListener('resize', onResizeThrottled, { passive: true });
2138
+ }
2139
+ }
2140
+ resizeElements.forEach((el) => {
2141
+ let set = resizeSourceToTables.get(el);
2142
+ if (!set) {
2143
+ set = new Set();
2144
+ resizeSourceToTables.set(el, set);
2145
+ if (!resizeObserver) resizeObserver = new ResizeObserver(onResizeThrottled);
2146
+ resizeObserver.observe(el);
2147
+ }
2148
+ set.add(table);
2149
+ });
2150
+ }
2151
+
2152
+ /**
2153
+ * Build grid-template-columns from measured widths and optional overrides per column.
2154
+ * @param {number} numCols
2155
+ * @param {number[]} columnWidths
2156
+ * @param {Object<number, string>|(string|null)[]} columnOverrides - map column index → CSS value (e.g. '2fr'), or array; null/empty = use measured
2157
+ * @returns {string}
2158
+ */
2159
+ function buildTemplateColumns(numCols, columnWidths, columnOverrides) {
2160
+ if (!columnWidths || columnWidths.length !== numCols) return '';
2161
+ const get = (i) =>
2162
+ Array.isArray(columnOverrides) ? columnOverrides[i] : columnOverrides[i];
2163
+ const parts = [];
2164
+ for (let i = 0; i < numCols; i++) {
2165
+ const ov = get(i);
2166
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2167
+ parts.push(ov.trim());
2168
+ } else {
2169
+ parts.push(`${Math.round(columnWidths[i])}fr`);
2170
+ }
2171
+ }
2172
+ return parts.join(' ');
2173
+ }
2174
+
2175
+ /**
2176
+ * Build grid-template-rows from measured heights and optional overrides per row.
2177
+ * @param {number} numRows
2178
+ * @param {number[]} rowHeights
2179
+ * @param {Object<number, string>|(string|null)[]} rowOverrides - map row index → CSS value (e.g. '48px', '2fr'), or array; null/empty = use measured
2180
+ * @returns {string}
2181
+ */
2182
+ function buildTemplateRows(numRows, rowHeights, rowOverrides) {
2183
+ if (!rowHeights || rowHeights.length < numRows) return '';
2184
+ const get = (i) =>
2185
+ Array.isArray(rowOverrides) ? rowOverrides[i] : rowOverrides?.[i];
2186
+ const parts = [];
2187
+ for (let i = 0; i < numRows; i++) {
2188
+ const ov = get(i);
2189
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2190
+ parts.push(ov.trim());
2191
+ } else {
2192
+ parts.push(`${Math.round(rowHeights[i] ?? 0)}px`);
2193
+ }
2194
+ }
2195
+ return parts.join(' ');
2196
+ }
2197
+
2198
+ /**
2199
+ * Measure each tr height in a section (table must not yet have scrollable class).
2200
+ * @param {HTMLTableSectionElement|null} section
2201
+ * @returns {number[]}
2202
+ */
2203
+ function measureRowHeights(section) {
2204
+ if (!section) return [];
2205
+ const rows = section.querySelectorAll(':scope > tr');
2206
+ return Array.from(rows).map((tr) => tr.getBoundingClientRect().height);
2207
+ }
2208
+
1898
2209
  /**
1899
2210
  * Apply scrollable table layout to a single table.
1900
2211
  * @param {HTMLTableElement} table
1901
- * @param {{ maxHeight?: number|string }} options
2212
+ * @param {Object} options - scrollableTable options
2213
+ * @param {number|string} [options.maxHeight] - Max height of tbody (default '200px'). Ignored when height or bodyHeightDynamic is set.
2214
+ * @param {number|string} [options.height] - Fixed height of tbody. Ignored when bodyHeightDynamic is set.
2215
+ * @param {{ get: (function(HTMLTableElement): number|string), useAs: 'height'|'maxHeight', updateOn?: { scroll?: boolean, resize?: boolean, scrollOn?: ('document'|Element)[], resizeOn?: ('window'|Element)[] } }} [options.bodyHeightDynamic] - When set, body size is computed by get(table) and re-applied when scroll/resize sources fire. updateOn: scrollOn/resizeOn list elements (sentinels 'document'/'window'); or use scroll (default false) / resize (default true) booleans.
2216
+ * @param {string} [options.gridTemplateColumns]
2217
+ * @param {{ thead?: string, tbody?: string, tfoot?: string }} [options.gridTemplateRows]
2218
+ * @param {{ thead?: Object<number, string>|(string|null)[], tbody?: Object<number, string>|(string|null)[], tfoot?: Object<number, string>|(string|null)[] }} [options.rowOverrides]
2219
+ * @param {Object<number, string>|(string|null)[]} [options.columnOverrides]
2220
+ * @param {{ columnWidths?: number[], rowHeights?: { thead?: number[], tbody?: number[], tfoot?: number[] } } | undefined} ref - existing ref when refreshing
1902
2221
  */
1903
- function applyScrollableTable(table, options) {
2222
+ function applyScrollableTable(table, options, ref) {
1904
2223
  const thead = table.querySelector('thead');
1905
2224
  const tbody = table.querySelector('tbody');
1906
2225
  const tfoot = table.querySelector('tfoot');
@@ -1908,32 +2227,88 @@ function applyScrollableTable(table, options) {
1908
2227
  const numCols = getTableColumnCount(table);
1909
2228
  if (numCols === 0) return;
1910
2229
 
2230
+ const alreadyScrollable = table.classList.contains(CLASS_TABLE);
2231
+ const customTemplate = typeof options.gridTemplateColumns === 'string' && options.gridTemplateColumns.trim().length > 0;
2232
+ const columnWidths = customTemplate
2233
+ ? null
2234
+ : (ref?.columnWidths ?? (alreadyScrollable ? null : measureColumnWidths(table, numCols)));
2235
+
1911
2236
  const theadRows = getRowCount(thead);
1912
2237
  const tbodyRows = getRowCount(tbody);
1913
2238
  const tfootRows = getRowCount(tfoot);
1914
2239
 
2240
+ const rowHeights =
2241
+ ref?.rowHeights ??
2242
+ (alreadyScrollable
2243
+ ? null
2244
+ : {
2245
+ thead: measureRowHeights(thead),
2246
+ tbody: measureRowHeights(tbody),
2247
+ tfoot: measureRowHeights(tfoot)
2248
+ });
2249
+
1915
2250
  table.style.setProperty('--apx-scrollable-cols', String(numCols));
1916
2251
  table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
1917
2252
  table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
1918
2253
  table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
1919
- table.style.setProperty('--apx-scrollable-body-max-height', normalizeMaxHeight(options.maxHeight));
2254
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2255
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2256
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
1920
2257
 
1921
2258
  table.classList.add(CLASS_TABLE);
1922
2259
  table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
1923
2260
  table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
1924
2261
 
2262
+ // Force reflow so the grid layout is established before setting measured template-columns.
2263
+ // Without this, the browser batches class + template into one pass and the tbody overflows horizontally.
2264
+ table.offsetHeight; // eslint-disable-line no-unused-expressions
2265
+
2266
+ const gutterSuffix = ' minmax(var(--apx-scrollable-gutter-width, 17px), var(--apx-scrollable-gutter-width, 17px))';
2267
+ if (customTemplate) {
2268
+ table.style.setProperty('--apx-scrollable-template-columns', options.gridTemplateColumns.trim() + gutterSuffix);
2269
+ } else if (columnWidths && columnWidths.length === numCols) {
2270
+ const template =
2271
+ options.columnOverrides != null
2272
+ ? buildTemplateColumns(numCols, columnWidths, options.columnOverrides)
2273
+ : columnWidths.map((w) => `${Math.round(w)}fr`).join(' ');
2274
+ table.style.setProperty('--apx-scrollable-template-columns', template + gutterSuffix);
2275
+ } else {
2276
+ table.style.removeProperty('--apx-scrollable-template-columns');
2277
+ }
2278
+
1925
2279
  clearPlacements(table);
1926
2280
 
1927
2281
  const sections = [
1928
- { section: thead, rows: Math.max(1, theadRows) },
1929
- { section: tbody, rows: Math.max(1, tbodyRows) },
1930
- { section: tfoot, rows: Math.max(1, tfootRows) }
2282
+ { section: thead, rows: Math.max(1, theadRows), heights: rowHeights?.thead, key: 'thead' },
2283
+ { section: tbody, rows: Math.max(1, tbodyRows), heights: rowHeights?.tbody, key: 'tbody' },
2284
+ { section: tfoot, rows: Math.max(1, tfootRows), heights: rowHeights?.tfoot, key: 'tfoot' }
1931
2285
  ];
1932
- sections.forEach(({ section, rows }) => {
2286
+ const customRows = options.gridTemplateRows && typeof options.gridTemplateRows === 'object' ? options.gridTemplateRows : null;
2287
+ const rowOverrides = options.rowOverrides && typeof options.rowOverrides === 'object' ? options.rowOverrides : null;
2288
+ sections.forEach(({ section, rows, heights, key }) => {
1933
2289
  if (!section) return;
2290
+ const varName = `--apx-scrollable-${key}-template-rows`;
2291
+ const custom = customRows?.[key];
2292
+ const overrides = rowOverrides?.[key];
2293
+ if (typeof custom === 'string' && custom.trim().length > 0) {
2294
+ section.style.setProperty(varName, custom.trim());
2295
+ } else if (heights && heights.length >= rows) {
2296
+ const template =
2297
+ overrides != null
2298
+ ? buildTemplateRows(rows, heights.slice(0, rows), overrides)
2299
+ : heights
2300
+ .slice(0, rows)
2301
+ .map((h) => `${Math.round(h)}px`)
2302
+ .join(' ');
2303
+ section.style.setProperty(varName, template);
2304
+ } else {
2305
+ section.style.removeProperty(varName);
2306
+ }
1934
2307
  const placements = computeCellPlacements(section, rows, numCols);
1935
2308
  applyPlacements(placements);
1936
2309
  });
2310
+
2311
+ return { columnWidths, rowHeights };
1937
2312
  }
1938
2313
 
1939
2314
  /**
@@ -1957,17 +2332,28 @@ function augmentWithScrollableTable(apx) {
1957
2332
  const ref = table[DATA_KEY];
1958
2333
  if (ref) {
1959
2334
  if (isRefresh) {
1960
- applyScrollableTable(table, ref.options);
2335
+ applyScrollableTable(table, ref.options, ref);
1961
2336
  } else if (options && Object.keys(options).length > 0) {
1962
2337
  ref.options = { ...ref.options, ...options };
1963
- applyScrollableTable(table, ref.options);
2338
+ const result = applyScrollableTable(table, ref.options, ref);
2339
+ if (result?.columnWidths) ref.columnWidths = result.columnWidths;
2340
+ if (result?.rowHeights) ref.rowHeights = result.rowHeights;
1964
2341
  }
2342
+ const currentOptions = ref.options;
2343
+ if (currentOptions?.bodyHeightDynamic) registerDynamicTable(table, currentOptions);
2344
+ else removeTableFromDynamicSources(table);
1965
2345
  return;
1966
2346
  }
1967
2347
  if (isRefresh) return;
1968
2348
 
1969
- applyScrollableTable(table, options);
1970
- table[DATA_KEY] = { options: { ...options } };
2349
+ console.log('[APX scrollableTable] create', table);
2350
+ const result = applyScrollableTable(table, options, undefined);
2351
+ table[DATA_KEY] = {
2352
+ options: { ...options },
2353
+ columnWidths: result?.columnWidths || undefined,
2354
+ rowHeights: result?.rowHeights || undefined
2355
+ };
2356
+ if (options?.bodyHeightDynamic) registerDynamicTable(table, options);
1971
2357
  });
1972
2358
 
1973
2359
  return apx;
@@ -4434,4 +4820,4 @@ APX.is_numeric = (n) => {
4434
4820
  var __webpack_exports__default = __webpack_exports__["default"];
4435
4821
  export { __webpack_exports__default as default };
4436
4822
 
4437
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDZDQUE2QztBQUM3Qyw4Q0FBOEM7QUFDOUMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3Qyx5REFBeUQ7QUFDekQsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdFQUFnRSxpQ0FBaUM7QUFDakc7QUFDQTtBQUNBLG1FQUFtRSwyQ0FBMkM7QUFDOUc7QUFDQTtBQUNBLDREQUE0RCxpQ0FBaUM7QUFDN0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O1NDcFNBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTs7U0FFQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTs7Ozs7VUN6QkE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBLGlDQUFpQyxXQUFXO1VBQzVDO1VBQ0E7Ozs7O1VDUEE7VUFDQTtVQUNBO1VBQ0E7VUFDQSx5Q0FBeUMsd0NBQXdDO1VBQ2pGO1VBQ0E7VUFDQTs7Ozs7VUNQQTs7Ozs7VUNBQTtVQUNBO1VBQ0E7VUFDQSx1REFBdUQsaUJBQWlCO1VBQ3hFO1VBQ0EsZ0RBQWdELGFBQWE7VUFDN0Q7Ozs7O1VDTkE7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOzs7OztVQ3JCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQTREO0FBQ007QUFDcUI7QUFDdEM7QUFDSDtBQUNDO0FBQ3NCOztBQUVyRTtBQUNBO0FBQ0EsV0FBVywrRUFBK0U7QUFDMUYsYUFBYSxRQUFRO0FBQ3JCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksc0VBQWlCO0FBQ3JCLElBQUksMEVBQW1CO0FBQ3ZCLElBQUksd0ZBQTBCO0FBQzlCLElBQUksMkVBQWU7QUFDbkI7QUFDQTs7QUFFQSxjQUFjLHdEQUFPO0FBQ3JCLGFBQWEsa0VBQU07QUFDbkIsWUFBWSxnRUFBSztBQUNqQixZQUFZLDZEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxHQUFHLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9zY3JvbGxhYmxlVGFibGUvY3NzL3Njcm9sbGFibGVUYWJsZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvaHRtbC9kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzP2E1NjciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcz85MmZkIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzPzhhNDgiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3M/YTA5NCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9jb21tb24ubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9zY3JvbGxhYmxlVGFibGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2V4cG9ydHMubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9mb3JtLXBhY2tlci9hdWdtZW50LWFweC5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL3BhY2tUb0pzb24ubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90cmlzdGF0ZS90cmlzdGF0ZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9BUFgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiBEaWFsb2cgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZyB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAwMjtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xyXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgICBwYWRkaW5nOiA0MHB4O1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgd2lkdGg6IGF1dG87XHJcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xyXG4gICAgbWF4LXdpZHRoOiA4MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG59XHJcblxyXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xyXG4gICAgbWFyZ2luLXRvcDowO1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZyB7XHJcbiAgICBjb2xvcjogI2FhYTtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xyXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcclxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xyXG4gICAgY29sb3I6ICMzMzM7XHJcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXTpmb2N1cyB7XHJcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XHJcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XHJcbiAgICBjb2xvcjogI0VDRjBGMTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xyXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGdhcDogMTBweDtcclxuICAgIG1hcmdpbi10b3A6MWVtO1xyXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cclxufVxyXG5cclxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHdpZHRoOiA0MHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcclxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XHJcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XHJcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG59XHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XHJcbiAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cclxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMXB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL2RpYWxvZy9jc3MvZGlhbG9nLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQkFBbUI7QUFDbkI7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztJQUNkLG9DQUFvQztJQUNwQywwQ0FBMEM7QUFDOUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLDJDQUEyQztJQUMzQyxnREFBZ0Q7QUFDcEQ7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixtQkFBbUI7QUFDdkI7O0FBRUE7O0lBRUksV0FBVztJQUNYLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBLHlCQUF5QjtBQUN6Qjs7OztJQUlJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZ0RBQWdEO0lBQ2hELGVBQWU7SUFDZixzQkFBc0I7SUFDdEIsNkJBQTZCO0FBQ2pDOztBQUVBOzs7O0lBSUkscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixhQUFhO0FBQ2pCOztBQUVBLHlCQUF5QjtBQUN6QjtJQUNJLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLHdDQUF3QztBQUM1Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IseUNBQXlDO0FBQzdDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFNBQVM7SUFDVCxjQUFjO0lBQ2QsNEJBQTRCO0FBQ2hDOztBQUVBLHNCQUFzQjtBQUN0QjtJQUNJLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsV0FBVztJQUNYLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsNkJBQTZCO0lBQzdCLGtCQUFrQjtJQUNsQiw2Q0FBNkM7QUFDakQ7O0FBRUE7SUFDSSxLQUFLLHVCQUF1QixFQUFFO0lBQzlCLE9BQU8seUJBQXlCLEVBQUU7QUFDdEM7QUFDQTtJQUNJLFlBQVk7SUFDWiw4QkFBOEI7SUFDOUIsb0NBQW9DLEVBQUUscUJBQXFCO0lBQzNELDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0NBQW9DLEVBQUUsdUJBQXVCO0lBQzdELDBCQUEwQjtBQUM5Qjs7QUFFQSxzQ0FBc0M7QUFDdEM7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxvQ0FBb0M7SUFDcEMsd0JBQXdCO0FBQzVCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIERpYWxvZyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2cge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICAgIHotaW5kZXg6IDEwMDI7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcXHJcXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcXHJcXG4gICAgcGFkZGluZzogNDBweDtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWluLXdpZHRoOiAzMDBweDtcXHJcXG4gICAgbWF4LXdpZHRoOiA4MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxufVxcclxcblxcclxcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XFxyXFxuICAgIG1hcmdpbi10b3A6MDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2cge1xcclxcbiAgICBjb2xvcjogI2FhYTtcXHJcXG4gICAgZmxvYXQ6IHJpZ2h0O1xcclxcbiAgICBmb250LXNpemU6IDI0cHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xcclxcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXSB7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl06Zm9jdXMge1xcclxcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xcclxcbiAgICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICBjb2xvcjogI0VDRjBGMTtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGdhcDogMTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDoxZW07XFxyXFxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxufVxcclxcblxcclxcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgaGVpZ2h0OiAxMDBweDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgd2lkdGg6IDQwcHg7XFxyXFxuICAgIGhlaWdodDogNDBweDtcXHJcXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcXHJcXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XFxyXFxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cXHJcXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cXHJcXG59XFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcXHJcXG4gICAgb3BhY2l0eTogMC41O1xcclxcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xcclxcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHRvcDogNTAlO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIEFQWCBTY3JvbGxhYmxlIFRhYmxlOiBzY3JvbGxhYmxlIHRib2R5IHdpdGggZml4ZWQgdGhlYWQvdGZvb3QgYW5kIGFsaWduZWQgY29sdW1ucyAoQ1NTIEdyaWQgKyBzdWJncmlkKSAqL1xyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcclxuICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi8qIFRhYmxlIHdpdGggbm8gdGZvb3Q6IHRoZWFkICsgdGJvZHkgb25seSAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSBhdXRvO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5laXRoZXIgdGhlYWQgbm9yIHRmb290OiB0Ym9keSBvbmx5ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQ6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5LFxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBzdWJncmlkO1xyXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcclxuICAgIG1pbi1oZWlnaHQ6IDA7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktcm93cywgMSksIGF1dG8pO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIHNvIGl0IGRvZXNuJ3Qgc2hyaW5rIGNvbnRlbnQgd2lkdGggYW5kIHRyaWdnZXIgYSBob3Jpem9udGFsIHNjcm9sbGJhciAqL1xyXG4gICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzLCAxKSwgYXV0byk7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5ID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0aCxcclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRkIHtcclxuICAgIC8qIEdyaWQgcGxhY2VtZW50IHNldCBieSBKUyAoZ3JpZC1yb3csIGdyaWQtY29sdW1uKSBmb3IgY29sc3Bhbi9yb3dzcGFuICovXHJcbiAgICBtaW4td2lkdGg6IDA7XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSwyR0FBMkc7O0FBRTNHO0lBQ0ksYUFBYTtJQUNiLDRFQUE0RTtJQUM1RSx1RkFBdUY7SUFDdkYsV0FBVztBQUNmOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLGtGQUFrRjtBQUN0Rjs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSxrRkFBa0Y7QUFDdEY7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksNkVBQTZFO0FBQ2pGOztBQUVBOzs7SUFHSSxhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLG1CQUFtQjtJQUNuQixxRUFBcUU7SUFDckUsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHFFQUFxRTtBQUN6RTs7QUFFQTtJQUNJLHFFQUFxRTtJQUNyRSxjQUFjO0lBQ2QsbUhBQW1IO0lBQ25ILHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLHFFQUFxRTtBQUN6RTs7QUFFQTs7O0lBR0ksaUJBQWlCO0FBQ3JCOztBQUVBOztJQUVJLHlFQUF5RTtJQUN6RSxZQUFZO0FBQ2hCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIEFQWCBTY3JvbGxhYmxlIFRhYmxlOiBzY3JvbGxhYmxlIHRib2R5IHdpdGggZml4ZWQgdGhlYWQvdGZvb3QgYW5kIGFsaWduZWQgY29sdW1ucyAoQ1NTIEdyaWQgKyBzdWJncmlkKSAqL1xcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB7XFxyXFxuICAgIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLWNvbHMsIDMpLCBtaW5tYXgoMCwgMWZyKSk7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkgYXV0bztcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbm8gdGZvb3Q6IHRoZWFkICsgdGJvZHkgb25seSAqL1xcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcXHJcXG59XFxyXFxuXFxyXFxuLyogVGFibGUgd2l0aCBubyB0aGVhZDogdGJvZHkgKyB0Zm9vdCBvbmx5ICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcclxcbiAgICBkaXNwbGF5OiBncmlkO1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHN1YmdyaWQ7XFxyXFxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcXHJcXG4gICAgbWluLWhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0byk7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5IHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktcm93cywgMSksIGF1dG8pO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2Vzbid0IHNocmluayBjb250ZW50IHdpZHRoIGFuZCB0cmlnZ2VyIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKi9cXHJcXG4gICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQgPiB0cixcXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSA+IHRyLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xcclxcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxyXFxuICAgIC8qIEdyaWQgcGxhY2VtZW50IHNldCBieSBKUyAoZ3JpZC1yb3csIGdyaWQtY29sdW1uKSBmb3IgY29sc3Bhbi9yb3dzcGFuICovXFxyXFxuICAgIG1pbi13aWR0aDogMDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XHJcblxyXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcclxuY29uc3QgQ0xBU1NfVEFCTEUgPSAnYXB4LXNjcm9sbGFibGUtdGFibGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcclxuXHJcbi8qKlxyXG4gKiBHZXQgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGNlbGxzIChzdW0gb2YgY29sc3BhbikuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb24gLSB0aGVhZCwgdGJvZHksIG9yIHRmb290XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHNlY3Rpb24pIHtcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gc2VjdGlvbj8ucXVlcnlTZWxlY3RvcignOnNjb3BlID4gdHInKTtcclxuICAgIGlmICghZmlyc3RSb3cpIHJldHVybiAwO1xyXG4gICAgbGV0IGNvbHMgPSAwO1xyXG4gICAgZmlyc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xyXG4gICAgICAgIGNvbHMgKz0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDE7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2xzO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRvdGFsIGNvbHVtbiBjb3VudCBmb3IgdGhlIHRhYmxlIChmcm9tIHRoZWFkIG9yIHRib2R5IGZpcnN0IHJvdykuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IGNvdW50RnJvbVRoZWFkID0gdGhlYWQgPyBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHRoZWFkKSA6IDA7XHJcbiAgICBjb25zdCBjb3VudEZyb21UYm9keSA9IHRib2R5ID8gZ2V0Q29sdW1uQ291bnRGcm9tU2VjdGlvbih0Ym9keSkgOiAwO1xyXG4gICAgcmV0dXJuIGNvdW50RnJvbVRoZWFkIHx8IGNvdW50RnJvbVRib2R5IHx8IDE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3VudCBkaXJlY3QgdHIgY2hpbGRyZW4gaW4gYSBzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRSb3dDb3VudChzZWN0aW9uKSB7XHJcbiAgICBpZiAoIXNlY3Rpb24pIHJldHVybiAwO1xyXG4gICAgcmV0dXJuIHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKS5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIDJEIGdyaWQgb2Ygb2NjdXBpZWQgc2xvdHMgZm9yIGEgc2VjdGlvbiAoZm9yIHJvd3NwYW4vY29sc3BhbiBwbGFjZW1lbnQpLlxyXG4gKiBQbGFjZSBlYWNoIGNlbGwgaW4gRE9NIG9yZGVyOyByZXR1cm4gYSBsaXN0IG9mIHsgY2VsbCwgcm93LCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfS5cclxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQ29sc1xyXG4gKiBAcmV0dXJucyB7eyBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyLCBjb2xzcGFuOiBudW1iZXIsIHJvd3NwYW46IG51bWJlciB9W119XHJcbiAqL1xyXG5mdW5jdGlvbiBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgbnVtUm93cywgbnVtQ29scykge1xyXG4gICAgaWYgKCFzZWN0aW9uIHx8IG51bVJvd3MgPT09IDAgfHwgbnVtQ29scyA9PT0gMCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgb2NjdXBpZWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Sb3dzIH0sICgpID0+IEFycmF5KG51bUNvbHMpLmZpbGwoZmFsc2UpKTtcclxuICAgIGNvbnN0IHBsYWNlbWVudHMgPSBbXTtcclxuICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XHJcblxyXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgY29uc3QgdHIgPSByb3dzW3JdO1xyXG4gICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHNwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSwgbnVtQ29scyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd3NwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpLCAxMCkgfHwgMSwgbnVtUm93cyAtIHIpO1xyXG4gICAgICAgICAgICBsZXQgY29sID0gMDtcclxuICAgICAgICAgICAgd2hpbGUgKGNvbCA8IG51bUNvbHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBmcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJyID0gcjsgcnIgPCByICsgcm93c3BhbiAmJiBmcmVlOyBycisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2MgPSBjb2w7IGNjIDwgY29sICsgY29sc3BhbiAmJiBmcmVlOyBjYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY2N1cGllZFtycl0/LltjY10pIGZyZWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJlZSkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjb2wrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sICsgY29sc3BhbiA+IG51bUNvbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW47IHJyKyspIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNjID0gY29sOyBjYyA8IGNvbCArIGNvbHNwYW47IGNjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdKSBvY2N1cGllZFtycl1bY2NdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwbGFjZW1lbnRzLnB1c2goeyBjZWxsLCByb3c6IHIsIGNvbCwgY29sc3Bhbiwgcm93c3BhbiB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGxhY2VtZW50cztcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IGdyaWQgcGxhY2VtZW50IHN0eWxlcyB0byBhIGxpc3Qgb2YgcGxhY2VtZW50cyAoMS1iYXNlZCBsaW5lIG51bWJlcnMgZm9yIENTUyBHcmlkKS5cclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKSB7XHJcbiAgICBwbGFjZW1lbnRzLmZvckVhY2goKHsgY2VsbCwgcm93LCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfSkgPT4ge1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZFJvdyA9IGAke3JvdyArIDF9IC8gc3BhbiAke3Jvd3NwYW59YDtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSBgJHtjb2wgKyAxfSAvIHNwYW4gJHtjb2xzcGFufWA7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsZWFyIGdyaWQgcGxhY2VtZW50IHN0eWxlcyBmcm9tIGFsbCB0aC90ZCBpbiBhIHRhYmxlIChmb3IgcmVmcmVzaCkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICovXHJcbmZ1bmN0aW9uIGNsZWFyUGxhY2VtZW50cyh0YWJsZSkge1xyXG4gICAgdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgsIHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZFJvdyA9ICcnO1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZENvbHVtbiA9ICcnO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgbWF4SGVpZ2h0IG9wdGlvbiB0byBhIENTUyBsZW5ndGggc3RyaW5nLlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemVNYXhIZWlnaHQodmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gREVGQVVMVF9NQVhfSEVJR0hUO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHNjcm9sbGFibGUgdGFibGUgbGF5b3V0IHRvIGEgc2luZ2xlIHRhYmxlLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7eyBtYXhIZWlnaHQ/OiBudW1iZXJ8c3RyaW5nIH19IG9wdGlvbnNcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICBjb25zdCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcbiAgICBjb25zdCB0Zm9vdCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rmb290Jyk7XHJcblxyXG4gICAgY29uc3QgbnVtQ29scyA9IGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpO1xyXG4gICAgaWYgKG51bUNvbHMgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0aGVhZFJvd3MgPSBnZXRSb3dDb3VudCh0aGVhZCk7XHJcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XHJcbiAgICBjb25zdCB0Zm9vdFJvd3MgPSBnZXRSb3dDb3VudCh0Zm9vdCk7XHJcblxyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtY29scycsIFN0cmluZyhudW1Db2xzKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRoZWFkUm93cykpKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MnLCBTdHJpbmcoTWF0aC5tYXgoMSwgdGJvZHlSb3dzKSkpO1xyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGZvb3Qtcm93cycsIFN0cmluZyhNYXRoLm1heCgxLCB0Zm9vdFJvd3MpKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQnLCBub3JtYWxpemVNYXhIZWlnaHQob3B0aW9ucy5tYXhIZWlnaHQpKTtcclxuXHJcbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QnLCAhISh0Zm9vdCAmJiB0Zm9vdFJvd3MgPiAwKSk7XHJcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQnLCAhKHRoZWFkICYmIHRoZWFkUm93cyA+IDApKTtcclxuXHJcbiAgICBjbGVhclBsYWNlbWVudHModGFibGUpO1xyXG5cclxuICAgIGNvbnN0IHNlY3Rpb25zID0gW1xyXG4gICAgICAgIHsgc2VjdGlvbjogdGhlYWQsIHJvd3M6IE1hdGgubWF4KDEsIHRoZWFkUm93cykgfSxcclxuICAgICAgICB7IHNlY3Rpb246IHRib2R5LCByb3dzOiBNYXRoLm1heCgxLCB0Ym9keVJvd3MpIH0sXHJcbiAgICAgICAgeyBzZWN0aW9uOiB0Zm9vdCwgcm93czogTWF0aC5tYXgoMSwgdGZvb3RSb3dzKSB9XHJcbiAgICBdO1xyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoeyBzZWN0aW9uLCByb3dzIH0pID0+IHtcclxuICAgICAgICBpZiAoIXNlY3Rpb24pIHJldHVybjtcclxuICAgICAgICBjb25zdCBwbGFjZW1lbnRzID0gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIHJvd3MsIG51bUNvbHMpO1xyXG4gICAgICAgIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQXVnbWVudHMgdGhlIEFQWCBvYmplY3Qgd2l0aCBzY3JvbGxhYmxlVGFibGUob3B0aW9ucyB8ICdyZWZyZXNoJykuXHJcbiAqIE1ha2VzIHRoZSB0Ym9keSBvZiBhIHRhYmxlIHNjcm9sbGFibGUgd2hpbGUga2VlcGluZyB0aGVhZC90Zm9vdCBmaXhlZCBhbmQgY29sdW1ucyBhbGlnbmVkIChDU1MgR3JpZCArIHN1YmdyaWQpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIEFQWCBvYmplY3QgdG8gYXVnbWVudC5cclxuICogQGV4YW1wbGVcclxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoeyBtYXhIZWlnaHQ6IDMwMCB9KTtcclxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoJ3JlZnJlc2gnKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCkge1xyXG4gICAgYXB4LnNjcm9sbGFibGVUYWJsZSA9IGZ1bmN0aW9uIChvcHRpb25zT3JBY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBpc1JlZnJlc2ggPSBvcHRpb25zT3JBY3Rpb24gPT09ICdyZWZyZXNoJztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNSZWZyZXNoID8gbnVsbCA6IChvcHRpb25zT3JBY3Rpb24gJiYgdHlwZW9mIG9wdGlvbnNPckFjdGlvbiA9PT0gJ29iamVjdCcgPyBvcHRpb25zT3JBY3Rpb24gOiB7fSk7XHJcblxyXG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgIT09ICdUQUJMRScpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSAvKiogQHR5cGUge0hUTUxUYWJsZUVsZW1lbnR9ICovIChlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcclxuICAgICAgICAgICAgaWYgKHJlZikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZi5vcHRpb25zID0geyAuLi5yZWYub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0YWJsZVtEQVRBX0tFWV0gPSB7IG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9IH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBhcHg7XHJcbiAgICB9O1xyXG59XHJcbiIsIi8vIE1pbmltYWwsIGZyYW1ld29yay1hZ25vc3RpYyBUb2FzdE1hbmFnZXIgZm9yIEFQWFxyXG4vLyBFU00tZmlyc3QsIG5vIHNpZGUgZWZmZWN0cyBvbiBpbXBvcnQuIERPTSBvbmx5IHdoZW4gdXNlZC5cclxuaW1wb3J0ICcuL2Nzcy90b2FzdC5jc3MnO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc2l0aW9uT2JqZWN0XHJcbiAqIEBwcm9wZXJ0eSB7J3N0aWNreSd8J3JlbGF0aXZlJ3wnYW5jaG9yZWQnfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt4XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ldXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IFtlbGVtZW50XVxyXG4gKiBAcHJvcGVydHkgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdhYm92ZSd8J2JlbG93J3wnYmVmb3JlJ3wnYWZ0ZXInfSBbcGxhY2VtZW50XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlTmF0aXZlQ1NTXVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7c3RyaW5nfFBvc2l0aW9uT2JqZWN0fSBQb3NpdGlvblxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdENvbmZpZ1xyXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBbcG9zaXRpb25dXHJcbiAqIEBwcm9wZXJ0eSB7J3VwJ3wnZG93bid8J2F1dG8nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gZm9yIHN0YWNraW5nIHRvYXN0cy4gJ2F1dG8nIGRldGVybWluZXMgYmFzZWQgb24gcG9zaXRpb24uIERlZmF1bHQ6ICdhdXRvJ1xyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFRvYXN0c11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWZhdWx0RHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt6SW5kZXhdXHJcbiAqIEBwcm9wZXJ0eSB7J3BvbGl0ZSd8J2Fzc2VydGl2ZSd8J29mZid9IFthcmlhTGl2ZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlZHVwZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250YWluZXJDbGFzc11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fSBbcHJvZ3Jlc3NdIERlZmF1bHQ6IGZhbHNlLiBTaG93IHByb2dyZXNzIGJhciB3aGVuIHRydWUgb3IgeyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJyB9LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nLCBwYXVzZUJ1dHRvbjogYm9vbGVhbn19IFByb2dyZXNzT3B0XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0T3B0aW9uc1xyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xOb2RlfSBtZXNzYWdlXHJcbiAqIEBwcm9wZXJ0eSB7J2luZm8nfCdzdWNjZXNzJ3wnd2FybmluZyd8J2Rhbmdlcid9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2R1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc21pc3NpYmxlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCBldjogTW91c2VFdmVudCkgPT4gdm9pZH0gW29uQ2xpY2tdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIHJlYXNvbjogJ3RpbWVvdXQnfCdjbG9zZSd8J2FwaSd8J292ZXJmbG93JykgPT4gdm9pZH0gW29uQ2xvc2VdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xhc3NOYW1lXVxyXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBbcG9zaXRpb25dXHJcbiAqIEBwcm9wZXJ0eSB7J3VwJ3wnZG93bid8J2F1dG8nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gZm9yIHN0YWNraW5nIHRvYXN0cy4gJ2F1dG8nIGRldGVybWluZXMgYmFzZWQgb24gcG9zaXRpb24uIERlZmF1bHQ6ICdhdXRvJ1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nLCBwYXVzZUJ1dHRvbj86IGJvb2xlYW59fSBbcHJvZ3Jlc3NdIFNob3cgcHJvZ3Jlc3MgYmFyOiB0cnVlID0gdG9wLCBvciB7IGVuYWJsZSwgcG9zaXRpb24sIHBhdXNlQnV0dG9uIH0gKHBhdXNlQnV0dG9uIGRlZmF1bHQgZmFsc2UpLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdFJlZlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRcclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZWxcclxuICogQHByb3BlcnR5IHsocmVhc29uPzogJ2FwaSd8J2Nsb3NlJykgPT4gdm9pZH0gY2xvc2VcclxuICogQHByb3BlcnR5IHsocGFydGlhbDogUGFydGlhbDxUb2FzdE9wdGlvbnM+KSA9PiB2b2lkfSB1cGRhdGVcclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSB3aGVuQ2xvc2VkXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiAoKSA9PiB2b2lkfSBvblxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZH0gb2ZmXHJcbiAqL1xyXG5cclxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcclxuXHJcbi8vIFNoYXJlZCBjb250YWluZXIgY2FjaGU6IE1hcDxwb3NpdGlvbiwgSFRNTEVsZW1lbnQ+XHJcbi8vIENvbnRhaW5lcnMgYXJlIHNoYXJlZCBiZXR3ZWVuIG1hbmFnZXJzIHdpdGggdGhlIHNhbWUgcG9zaXRpb25cclxuY29uc3QgX2NvbnRhaW5lckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLy8gR2FyYmFnZSBjb2xsZWN0aW9uOiBjbGVhbnVwIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzIGFmdGVyIGEgZGVsYXlcclxuY29uc3QgR0NfREVMQVlfTVMgPSAyMDAwMDsgLy8gMjAgc2Vjb25kc1xyXG5sZXQgX2djVGltZW91dElkID0gbnVsbDtcclxuXHJcbi8vIFdyYXBwZXIgZm9yIGFsbCB0b2FzdCBjb250YWluZXJzIChrZWVwcyBET00gY2xlYW4pXHJcbmxldCBfdG9hc3RXcmFwcGVyID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBHZXQgb3IgY3JlYXRlIHRoZSB0b2FzdCBjb250YWluZXJzIHdyYXBwZXJcclxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRUb2FzdFdyYXBwZXIoKSB7XHJcbiAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICBcclxuICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQVBYLXRvYXN0LXdyYXBwZXInKTtcclxuICAgICAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LXdyYXBwZXInKTtcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUud2lkdGggPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUuekluZGV4ID0gJzEwMDAwJzsgLy8gQmVsb3cgY29udGFpbmVycyBidXQgYWJvdmUgbW9zdCBjb250ZW50XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoX3RvYXN0V3JhcHBlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gX3RvYXN0V3JhcHBlcjtcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XHJcbiAgICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodCcsXHJcbiAgICBtYXhUb2FzdHM6IDUsXHJcbiAgICBkZWZhdWx0RHVyYXRpb25NczogNTAwMCxcclxuICAgIHpJbmRleDogMTEwMDAsXHJcbiAgICBhcmlhTGl2ZTogJ3BvbGl0ZScsXHJcbiAgICBnYXA6IDgsXHJcbiAgICBkZWR1cGU6IGZhbHNlLFxyXG4gICAgY29udGFpbmVyQ2xhc3M6ICcnLFxyXG4gICAgb2Zmc2V0OiAwLFxyXG4gICAgcHJvZ3Jlc3M6IGZhbHNlXHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGVsZW1lbnQgd2l0aCBjbGFzc2VzXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVFbCh0YWcsIGNsYXNzTmFtZXMpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gICAgaWYgKGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBjbGFzc05hbWVzLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goYyA9PiBlbC5jbGFzc0xpc3QuYWRkKGMpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbDtcclxufVxyXG5cclxuLyoqIE1pbmltYWwgbGluZS1iYXNlZCBwYXVzZSAodHdvIGJhcnMpIC8gcmVzdW1lICh0cmlhbmdsZSByaWdodCkgaWNvbiBTVkcuIFVzZXMgY3VycmVudENvbG9yLiAqL1xyXG5mdW5jdGlvbiBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyhwYXVzZWQpIHtcclxuICAgIGlmIChwYXVzZWQpIHtcclxuICAgICAgICByZXR1cm4gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48cGF0aCBkPVwiTTggNkw4IDE4TDE3IDEyWlwiLz48L3N2Zz5gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGxpbmUgeDE9XCI5XCIgeTE9XCI2XCIgeDI9XCI5XCIgeTI9XCIxOFwiLz48bGluZSB4MT1cIjE1XCIgeTE9XCI2XCIgeDI9XCIxNVwiIHkyPVwiMThcIi8+PC9zdmc+YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbmQgaW5zZXJ0IHByb2dyZXNzIGJsb2NrICh0cmFjayArIGJhciwgb3B0aW9uYWwgcGF1c2UgYnV0dG9uKSBpbnRvIHRvYXN0LiBCdXR0b24gaXMgZml4ZWQgYXQgbGVmdCB2aWEgdHJhY2sgbGF5b3V0LlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NPcHR9IHByb2dyZXNzT3B0XHJcbiAqIEByZXR1cm5zIHt7IHdyYXA6IEhUTUxFbGVtZW50LCBiYXI6IEhUTUxFbGVtZW50LCBwYXVzZUJ0bjogSFRNTEVsZW1lbnR8bnVsbCB9fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBwcm9ncmVzc09wdCkge1xyXG4gICAgY29uc3QgcG9zID0gcHJvZ3Jlc3NPcHQucG9zaXRpb247XHJcbiAgICBjb25zdCBzaG93UGF1c2VCdXR0b24gPSBwcm9ncmVzc09wdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZTtcclxuICAgIGNvbnN0IHdyYXAgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdF9fcHJvZ3Jlc3MgQVBYLXRvYXN0X19wcm9ncmVzcy0tJHtwb3N9YCk7XHJcbiAgICBjb25zdCB0cmFjayA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy10cmFjaycpO1xyXG4gICAgY29uc3QgYmFyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLWJhcicpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgncm9sZScsICdwcm9ncmVzc2JhcicpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1pbicsICcwJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgJzEwMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUZW1wcyByZXN0YW50Jyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgJzEwMCcpO1xyXG4gICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgdHJhY2suYXBwZW5kQ2hpbGQoYmFyKTtcclxuICAgIHdyYXAuYXBwZW5kQ2hpbGQodHJhY2spO1xyXG4gICAgbGV0IHBhdXNlQnRuID0gbnVsbDtcclxuICAgIGlmIChzaG93UGF1c2VCdXR0b24pIHtcclxuICAgICAgICBwYXVzZUJ0biA9IGNyZWF0ZUVsKCdidXR0b24nLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLnR5cGUgPSAnYnV0dG9uJztcclxuICAgICAgICBwYXVzZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnUGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcoZmFsc2UpOyAvLyBydW5uaW5nID0gc2hvdyBwYXVzZSBpY29uXHJcbiAgICAgICAgd3JhcC5pbnNlcnRCZWZvcmUocGF1c2VCdG4sIHRyYWNrKTtcclxuICAgIH1cclxuICAgIGlmIChwb3MgPT09ICd0b3AnKSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY29udGVudEVsKTtcclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0b2FzdEVsLmluc2VydEJlZm9yZSh3cmFwLCBjbG9zZUJ0bik7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIH1cclxuICAgIGlmIChzaG93UGF1c2VCdXR0b24pIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgIHJldHVybiB7IHdyYXAsIGJhciwgcGF1c2VCdG4gfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZSBwcm9ncmVzcyBibG9jayBwb3NpdGlvbiAoY2xhc3NlcyArIERPTSBvcmRlcilcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwcm9ncmVzc1dyYXBcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gY2xvc2VCdG5cclxuICogQHBhcmFtIHsndG9wJ3wnYm90dG9tJ30gcG9zXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVByb2dyZXNzUG9zaXRpb24odG9hc3RFbCwgcHJvZ3Jlc3NXcmFwLCBjb250ZW50RWwsIGNsb3NlQnRuLCBwb3MpIHtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJywgJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKHBvcyA9PT0gJ3RvcCcgPyAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJyA6ICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHByb2dyZXNzV3JhcC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy0tYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0X19wcm9ncmVzcy0tJHtwb3N9YCk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBwb3MgPT09ICd0b3AnID8gY29udGVudEVsIDogY2xvc2VCdG47XHJcbiAgICBpZiAocHJvZ3Jlc3NXcmFwLm5leHRFbGVtZW50U2libGluZyAhPT0gdGFyZ2V0KSB0b2FzdEVsLmluc2VydEJlZm9yZShwcm9ncmVzc1dyYXAsIHRhcmdldCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXNvbHZlIHByb2dyZXNzIG9wdGlvbiBmcm9tIHBlci1jYWxsIG9wdGlvbiBhbmQgY29uZmlnIGRlZmF1bHRcclxuICogQHBhcmFtIHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ318dW5kZWZpbmVkfSBvcHRpb25cclxuICogQHBhcmFtIHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ318dW5kZWZpbmVkfSBjb25maWdEZWZhdWx0XHJcbiAqIEByZXR1cm5zIHtQcm9ncmVzc09wdH1cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVQcm9ncmVzcyhvcHRpb24sIGNvbmZpZ0RlZmF1bHQpIHtcclxuICAgIGNvbnN0IGZyb21Db25maWcgPSBjb25maWdEZWZhdWx0ID09PSB0cnVlXHJcbiAgICAgICAgPyB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfVxyXG4gICAgICAgIDogKGNvbmZpZ0RlZmF1bHQgJiYgdHlwZW9mIGNvbmZpZ0RlZmF1bHQgPT09ICdvYmplY3QnXHJcbiAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgZW5hYmxlOiAhIWNvbmZpZ0RlZmF1bHQuZW5hYmxlLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGNvbmZpZ0RlZmF1bHQucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgICAgIHBhdXNlQnV0dG9uOiBjb25maWdEZWZhdWx0LnBhdXNlQnV0dG9uID09PSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgOiB7IGVuYWJsZTogZmFsc2UsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH0pO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbiA9PT0gbnVsbCkgcmV0dXJuIGZyb21Db25maWc7XHJcbiAgICBpZiAob3B0aW9uID09PSB0cnVlKSByZXR1cm4geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH07XHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlbmFibGU6ICEhb3B0aW9uLmVuYWJsZSxcclxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbi5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnYm90dG9tJyA6ICd0b3AnLFxyXG4gICAgICAgICAgICBwYXVzZUJ1dHRvbjogb3B0aW9uLnBhdXNlQnV0dG9uID09PSB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGVuYWJsZTogZmFsc2UsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIHRvIENTUyB2YWx1ZXNcclxuICogQHBhcmFtIHtzdHJpbmd9IHBsYWNlbWVudFxyXG4gKiBAcmV0dXJucyB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd9XHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemVQbGFjZW1lbnQocGxhY2VtZW50KSB7XHJcbiAgICBjb25zdCBzeW5vbnltcyA9IHtcclxuICAgICAgICAnYWJvdmUnOiAndG9wJyxcclxuICAgICAgICAnYmVsb3cnOiAnYm90dG9tJyxcclxuICAgICAgICAnYmVmb3JlJzogJ2xlZnQnLFxyXG4gICAgICAgICdhZnRlcic6ICdyaWdodCdcclxuICAgIH07XHJcbiAgICByZXR1cm4gc3lub255bXNbcGxhY2VtZW50XSB8fCBwbGFjZW1lbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgZmxvdyBkaXJlY3Rpb24gYmFzZWQgb24gcG9zaXRpb25cclxuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICogQHJldHVybnMgeyd1cCd8J2Rvd24nfVxyXG4gKi9cclxuZnVuY3Rpb24gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zOiB0b3AgPSB1cCwgYm90dG9tID0gZG93blxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHJldHVybiAndXAnO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmNsdWRlcygnYm90dG9tJykpIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgIC8vIFN0aWNreTogZGV0ZXJtaW5lIGJhc2VkIG9uIHkgY29vcmRpbmF0ZVxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IHN0YXJ0cyB3aXRoICctJyBvciBpcyBhIHNtYWxsIHZhbHVlLCBsaWtlbHkgdG9wICh1cClcclxuICAgICAgICAgICAgICAgIC8vIElmIHkgaXMgYSBsYXJnZSB2YWx1ZSBvciBwZXJjZW50YWdlLCBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgPSBmcm9tIGJvdHRvbSwgc28gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQocG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB5IDwgNTAlIG9mIHZpZXdwb3J0IGhlaWdodCwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGxpa2VseSBib3R0b20gKGRvd24pXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuaW5jbHVkZXMoJyUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNTAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcHggdmFsdWVzLCBhc3N1bWUgPCA0MDBweCBpcyB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCA0MDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcgJiYgcG9zaXRpb24ucGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwbGFjZW1lbnQgZGV0ZXJtaW5lcyBmbG93XHJcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJyB8fCBwbGFjZW1lbnQgPT09ICdhYm92ZScpIHJldHVybiAndXAnO1xyXG4gICAgICAgICAgICBpZiAocGxhY2VtZW50ID09PSAnYm90dG9tJyB8fCBwbGFjZW1lbnQgPT09ICdiZWxvdycpIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgIC8vIEZvciBsZWZ0L3JpZ2h0LCBkZWZhdWx0IHRvIGRvd25cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgLy8gUmVsYXRpdmU6IGRldGVybWluZSBiYXNlZCBvbiB5IG9mZnNldFxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgeSA9IGFib3ZlIGVsZW1lbnQgPSBmbG93IHVwXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUG9zaXRpdmUgeSA9IGJlbG93IGVsZW1lbnQgPSBmbG93IGRvd25cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG59XHJcblxyXG4vKipcclxuICogR2FyYmFnZSBjb2xsZWN0aW9uOiByZW1vdmUgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICovXHJcbmZ1bmN0aW9uIGNsZWFudXBFbXB0eUNvbnRhaW5lcnMoKSB7XHJcbiAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCBjb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkFQWC10b2FzdC1jb250YWluZXI6bm90KFtkYXRhLWFweC10b2FzdC1tYW5hZ2VkPVwidHJ1ZVwiXSknKTtcclxuICAgIGNvbnRhaW5lcnMuZm9yRWFjaChjb250YWluZXIgPT4ge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbnRhaW5lciBpcyBlbXB0eSAobm8gdG9hc3RzKVxyXG4gICAgICAgIGlmIChjb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuZGVsZXRlKHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIENsZWFuIHVwIHdyYXBwZXIgaWYgaXQncyBlbXB0eSAoYWxsIGNvbnRhaW5lcnMgcmVtb3ZlZClcclxuICAgIGlmIChfdG9hc3RXcmFwcGVyICYmIF90b2FzdFdyYXBwZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlci5yZW1vdmUoKTtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgX2djVGltZW91dElkID0gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNjaGVkdWxlIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICovXHJcbmZ1bmN0aW9uIHNjaGVkdWxlR2FyYmFnZUNvbGxlY3Rpb24oKSB7XHJcbiAgICBpZiAoX2djVGltZW91dElkKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9nY1RpbWVvdXRJZCk7XHJcbiAgICB9XHJcbiAgICBfZ2NUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGNsZWFudXBFbXB0eUNvbnRhaW5lcnMsIEdDX0RFTEFZX01TKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcclxuICogQHJldHVybnMge0hUTUxFbGVtZW50W119XHJcbiAqL1xyXG5mdW5jdGlvbiBmaW5kU2Nyb2xsYWJsZVBhcmVudHMoZWxlbWVudCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsYWJsZXMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgXHJcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY3VycmVudCk7XHJcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBzdHlsZS5vdmVyZmxvdyArIHN0eWxlLm92ZXJmbG93WSArIHN0eWxlLm92ZXJmbG93WDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAob3ZlcmZsb3cuaW5jbHVkZXMoJ3Njcm9sbCcpIHx8IG92ZXJmbG93LmluY2x1ZGVzKCdhdXRvJykpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZXMucHVzaChjdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHNjcm9sbGFibGVzO1xyXG59XHJcblxyXG4vKipcclxuICogSGFzaCBhbiBlbGVtZW50IHRvIGNyZWF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBoYXNoRWxlbWVudChlbCkge1xyXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgc3RyID0gYCR7ZWwudGFnTmFtZX1fJHtyZWN0LmxlZnR9XyR7cmVjdC50b3B9XyR7cmVjdC53aWR0aH1fJHtyZWN0LmhlaWdodH1gO1xyXG4gICAgbGV0IGhhc2ggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hhcjtcclxuICAgICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpLnRvU3RyaW5nKDM2KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNlcmlhbGl6ZSBwb3NpdGlvbiBvcHRpb25zIGludG8gYSB1bmlxdWUga2V5XHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gYHM6JHtwb3NpdGlvbn1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVHlwZSAoZGVmYXVsdDogc3RpY2t5IGlmIHgveSBwcm92aWRlZClcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBpZiAodHlwZSkgcGFydHMucHVzaChgdDoke3R5cGV9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29vcmRpbmF0ZXNcclxuICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGB4OiR7cG9zaXRpb24ueH1gKTtcclxuICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGB5OiR7cG9zaXRpb24ueX1gKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQ6IHVzZSBlbGVtZW50IElEIG9yIGhhc2hcclxuICAgICAgICBpZiAocG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SWQgPSBwb3NpdGlvbi5lbGVtZW50LmlkIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmVsZW1lbnQuZGF0YXNldD8uYXB4VG9hc3RBbmNob3JJZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlbF8ke2hhc2hFbGVtZW50KHBvc2l0aW9uLmVsZW1lbnQpfWA7XHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYGVsOiR7ZWxlbWVudElkfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24ucGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgZm9yIHNlcmlhbGl6YXRpb24gKHVzZSBDU1MgdmFsdWVzKVxyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYHA6JHtub3JtYWxpemVkfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24uZ2FwICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYGc6JHtwb3NpdGlvbi5nYXB9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnVzZU5hdGl2ZUNTUykgcGFydHMucHVzaChgbmF0aXZlOnRydWVgKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYG86JHtwYXJ0cy5qb2luKCd8Jyl9YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuICdzOmJvdHRvbS1yaWdodCc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUb2FzdE1hbmFnZXIgY2xhc3NcclxuICovXHJcbmNsYXNzIFRvYXN0TWFuYWdlciB7XHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IGNvbmZpZyAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdENvbmZpZ30gKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLihjb25maWcgfHwge30pIH07XHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudHxudWxsfSAqL1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFRvYXN0UmVmPn0gKi9cclxuICAgICAgICB0aGlzLmlkVG9SZWYgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdFJlZltdfSAqL1xyXG4gICAgICAgIHRoaXMub3BlbiA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+fSBjb25maWcgKi9cclxuICAgIGNvbmZpZ3VyZShjb25maWcpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIC4uLihjb25maWcgfHwge30pIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB0aGlzLmFwcGx5Q29udGFpbmVyQ29uZmlnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J3BvbGl0ZSd8J2Fzc2VydGl2ZSd8J29mZid9IG1vZGUgKi9cclxuICAgIHNldEFyaWFMaXZlKG1vZGUpIHsgdGhpcy5jb25maWd1cmUoeyBhcmlhTGl2ZTogbW9kZSB9KTsgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7VG9hc3RSZWZbXX0gKi9cclxuICAgIGdldE9wZW5Ub2FzdHMoKSB7IHJldHVybiB0aGlzLm9wZW4uc2xpY2UoKTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1RvYXN0T3B0aW9uc30gb3B0cyAqL1xyXG4gICAgc2hvdyhvcHRzKSB7XHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8obnVsbCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyhvcHRzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlZHVwZSAmJiBvcHRpb25zLmlkICYmIHRoaXMuaWRUb1JlZi5oYXMob3B0aW9ucy5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVmID0gdGhpcy5pZFRvUmVmLmdldChvcHRpb25zLmlkKTtcclxuICAgICAgICAgICAgcmVmLnVwZGF0ZShvcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSBwb3NpdGlvbiBhbmQgZmxvdyBmb3IgdGhpcyB0b2FzdCAob3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb25maWcpXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uIHx8IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSBvcHRpb25zLmZsb3cgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZmxvdyA6ICh0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nKTtcclxuICAgICAgICBjb25zdCBmaW5hbEZsb3cgPSBmbG93ID09PSAnYXV0bycgPyBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKSA6IGZsb3c7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRW5zdXJlIGRlZmF1bHQgY29udGFpbmVyIGlzIHNldCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXHJcbiAgICAgICAgdGhpcy5lbnN1cmVDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG9hc3RFbCA9IGNyZWF0ZUVsKCdkaXYnLCBgQVBYLXRvYXN0IEFQWC10b2FzdC0tJHtvcHRpb25zLnR5cGV9YCk7XHJcbiAgICAgICAgdG9hc3RFbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc3RhdHVzJyk7XHJcbiAgICAgICAgLy8gUHJpb3JpdHk6IG9wdGlvbnMuaWQgPiBjb25maWcuaWQgPiBhdXRvLWdlbmVyYXRlZFxyXG4gICAgICAgIGNvbnN0IHRvYXN0SWQgPSBvcHRpb25zLmlkIHx8IGB0XyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gO1xyXG4gICAgICAgIHRvYXN0RWwuZGF0YXNldC50b2FzdElkID0gdG9hc3RJZDtcclxuICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NOYW1lICs9IGAgJHtvcHRpb25zLmNsYXNzTmFtZX1gO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50RWwgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fY29udGVudCcpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBvcHRpb25zLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG9wdGlvbnMubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY29udGVudEVsKTtcclxuXHJcbiAgICAgICAgbGV0IGNsb3NlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5kaXNtaXNzaWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY2xvc2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fY2xvc2UnKTtcclxuICAgICAgICAgICAgY2xvc2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnR5cGUgPSAnYnV0dG9uJztcclxuICAgICAgICAgICAgdG9hc3RFbC5hcHBlbmRDaGlsZChjbG9zZUJ0bik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHJvZ3Jlc3NXcmFwID0gbnVsbDtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NCYXJFbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzUGF1c2VCdG4gPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnByb2dyZXNzLmVuYWJsZSAmJiBvcHRpb25zLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG9wdGlvbnMucHJvZ3Jlc3MpO1xyXG4gICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgIHByb2dyZXNzQmFyRWwgPSBjcmVhdGVkLmJhcjtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NQYXVzZUJ0biA9IGNyZWF0ZWQucGF1c2VCdG47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIGxldCBwb3NpdGlvblVwZGF0ZUZuID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25DbGVhbnVwID0gbnVsbDtcclxuICAgICAgICBsZXQgb3JpZ2luYWxFbGVtZW50U3R5bGUgPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwb3NpdGlvbiAmJiB0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnVzZU5hdGl2ZUNTUyAmJiAodHlwZSA9PT0gJ3JlbGF0aXZlJyB8fCB0eXBlID09PSAnYW5jaG9yZWQnKSAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1c2VOYXRpdmVDU1M6IHRydWUgLSBjcmVhdGUgY29udGFpbmVyIGluIHRhcmdldCBlbGVtZW50IHVzaW5nIG5hdGl2ZSBDU1NcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsID0gcG9zaXRpb24uZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRWxlbWVudFN0eWxlID0gdGFyZ2V0RWwuc3R5bGUucG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3Igc3RhY2tpbmcgdG9hc3RzIChyZXVzZSBpZiBleGlzdHMpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIGxldCBuYXRpdmVDb250YWluZXIgPSB0YXJnZXRFbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC1jb250YWluZXIgQVBYLXRvYXN0LWNvbnRhaW5lci1uYXRpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbmluZyB0byBjb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogdXNlIHgveSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBwb3NpdGlvbi54LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBvc2l0aW9uIG91dHNpZGUgdGhlIGVsZW1lbnQgdXNpbmcgMTAwJSAoZWxlbWVudCBzaXplKSArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2FwID0gcG9zaXRpb24uZ2FwIHx8ICcxZW0nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5yaWdodCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWwuYXBwZW5kQ2hpbGQobmF0aXZlQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZsb3cgZGlyZWN0aW9uIGlmIGNvbnRhaW5lciBleGlzdHNcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmF0aXZlQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVsICYmIHRhcmdldEVsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSBvcmlnaW5hbEVsZW1lbnRTdHlsZSB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG5hdGl2ZSBjb250YWluZXIgaWYgZW1wdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUNvbnRhaW5lciAmJiBuYXRpdmVDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IG5hdGl2ZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuZGVsZXRlKHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBnZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbnRhaW5lci5zdHlsZSwgc3R5bGVzKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIEZvciByZWxhdGl2ZS9hbmNob3JlZCwgbGlzdGVuIHRvIHNjcm9sbC9yZXNpemVcclxuICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PT0gJ3JlbGF0aXZlJyB8fCB0eXBlID09PSAnYW5jaG9yZWQnKSAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVNcyA9IDE2OyAvLyB+NjBmcHNcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvdHRsZWRVcGRhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgdGhyb3R0bGVNcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZklkKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGVQYXJlbnRzID0gZmluZFNjcm9sbGFibGVQYXJlbnRzKHBvc2l0aW9uLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBzY3JvbGwgb24gd2luZG93IGFuZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhdGNoIGZvciBlbGVtZW50IHJlbW92YWxcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbi5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5jbG9zZSgnYXBpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXBkYXRlRm4gPSB1cGRhdGVDb250YWluZXJQb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZVBhcmVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb24gLSBnZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmaW5hbEZsb3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBlbmQgdG9hc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbnRhaW5lclxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW50ZXIgYW5pbWF0aW9uXHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWVudGVyJyk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWVudGVyLWFjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBFdmVudCBoYW5kbGluZyBhbmQgdGltZXJzXHJcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IG9wdGlvbnMuZHVyYXRpb25NcztcclxuICAgICAgICBsZXQgdGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHN0YXJ0VHMgPSBudWxsO1xyXG4gICAgICAgIGxldCB1c2VyUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0geyBjbGljazogbmV3IFNldCgpLCBjbG9zZTogbmV3IFNldCgpIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nIHx8IHJlbWFpbmluZyA8PSAwKSByZXR1cm47IC8vIHN0aWNreVxyXG4gICAgICAgICAgICBzdGFydFRzID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHJlZi5jbG9zZSgndGltZW91dCcpLCByZW1haW5pbmcpO1xyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXJFbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGljayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXJJZCA9PSBudWxsIHx8IHN0YXJ0VHMgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIHJlbWFpbmluZyAtIGVsYXBzZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGN0ID0gZHVyYXRpb25NcyA+IDAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIChyZW1haW5pbmdNcyAvIGR1cmF0aW9uTXMpICogMTAwKSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCBTdHJpbmcoTWF0aC5yb3VuZChwY3QpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBwYXVzZVRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGltZXJJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xyXG4gICAgICAgICAgICAgICAgdGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsKSByZW1haW5pbmcgLT0gKERhdGUubm93KCkgLSBzdGFydFRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1JhZklkKTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIgPSAoYnRuKSA9PiB7XHJcbiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB1c2VyUGF1c2VkID0gIXVzZXJQYXVzZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlclBhdXNlZCkgcGF1c2VUaW1lcigpOyBlbHNlIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdXNlclBhdXNlZCA/ICdSZXByZW5kcmUnIDogJ1BhdXNlJztcclxuICAgICAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCd0aXRsZScsIGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyh1c2VyUGF1c2VkKTsgLy8gcGF1c2VkID0gcmVzdW1lICh0cmlhbmdsZSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdFJlZn0gKi9cclxuICAgICAgICBjb25zdCByZWYgPSB7XHJcbiAgICAgICAgICAgIGlkOiB0b2FzdElkLFxyXG4gICAgICAgICAgICBlbDogdG9hc3RFbCxcclxuICAgICAgICAgICAgY2xvc2U6IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGNsZWFudXAocmVhc29uIHx8ICdhcGknKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdXBkYXRlOiAocGFydGlhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKHsgLi4ub3B0aW9ucywgLi4ucGFydGlhbCB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb250ZW50XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lcmdlZC5tZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG1lcmdlZC5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQobWVyZ2VkLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHR5cGUgY2xhc3NcclxuICAgICAgICAgICAgICAgIFsnaW5mbycsJ3N1Y2Nlc3MnLCd3YXJuaW5nJywnZGFuZ2VyJ10uZm9yRWFjaCh0ID0+IHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZShgQVBYLXRvYXN0LS0ke3R9YCkpO1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtLSR7bWVyZ2VkLnR5cGV9YCk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2xhc3Nlc1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lICE9PSBtZXJnZWQuY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoLi4ubWVyZ2VkLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJvZ3Jlc3MgdmlzaWJpbGl0eS9wb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyA9IG1lcmdlZC5wcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1lcmdlZC5wcm9ncmVzcy5lbmFibGUgfHwgbWVyZ2VkLmR1cmF0aW9uTXMgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVByb2dyZXNzUG9zaXRpb24odG9hc3RFbCwgcHJvZ3Jlc3NXcmFwLCBjb250ZW50RWwsIGNsb3NlQnRuLCBtZXJnZWQucHJvZ3Jlc3MucG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLnByb2dyZXNzLmVuYWJsZSAmJiBtZXJnZWQuZHVyYXRpb25NcyA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBtZXJnZWQucHJvZ3Jlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcCA9IGNyZWF0ZWQud3JhcDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NQYXVzZUJ0biA9IGNyZWF0ZWQucGF1c2VCdG47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzUGF1c2VCdG4pIGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyKHByb2dyZXNzUGF1c2VCdG4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzV3JhcCAmJiBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIG1lcmdlZC5wcm9ncmVzcy5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGR1cmF0aW9uIGxvZ2ljXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uTXMgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgJzEwMCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3aGVuQ2xvc2VkOiAoKSA9PiBjbG9zZWRQcm9taXNlLFxyXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5hZGQoaGFuZGxlcik7IHJldHVybiAoKSA9PiByZWYub2ZmKGV2ZW50LCBoYW5kbGVyKTsgfSxcclxuICAgICAgICAgICAgb2ZmOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmRlbGV0ZShoYW5kbGVyKTsgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IG5vdGlmeSA9IChldmVudCwgYXJnKSA9PiBoYW5kbGVyc1tldmVudF0uZm9yRWFjaChmbiA9PiB7IHRyeSB7IGZuKGFyZyk7IH0gY2F0Y2ggKF8pIHt9IH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjbG9zZWRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIG5vdGlmeSgnY2xvc2UnLCByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcHRpb25zLm9uQ2xvc2UocmVmLCByZWFzb24pOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRvYXN0RWwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1JhZklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1JhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgcG9zaXRpb24gbGlzdGVuZXJzIGFuZCByZXN0b3JlIHN0eWxlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uQ2xlYW51cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIElmIG92ZXJmbG93LCByZW1vdmUgaW1tZWRpYXRlbHkgdG8gZW5mb3JjZSBoYXJkIGNhcFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PT0gJ292ZXJmbG93Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdEVsLnBhcmVudEVsZW1lbnQpIHRvYXN0RWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm9wZW4uaW5kZXhPZihyZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy5vcGVuLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRUb1JlZi5kZWxldGUodG9hc3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYW5pbWF0ZSBvdXRcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWV4aXQtYWN0aXZlJykpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUVsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVtb3ZlRWwpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gYXR0YWNoIGNsb3NlIGJlaGF2aW9yXHJcbiAgICAgICAgICAgIHJlZi5jbG9zZSA9IChyZWFzb24pID0+IGNsZWFudXAocmVhc29uIHx8ICdhcGknKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2xpY2sgaGFuZGxpbmdcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnY2xpY2snLCBldik7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkgeyBvcHRpb25zLm9uQ2xpY2socmVmLCBldik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhvdmVyIHBhdXNlXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgcGF1c2VUaW1lcik7XHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4geyBpZiAoIXVzZXJQYXVzZWQpIHN0YXJ0VGltZXIoKTsgfSk7XHJcblxyXG4gICAgICAgIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHsgZXYuc3RvcFByb3BhZ2F0aW9uKCk7IHJlZi5jbG9zZSgnY2xvc2UnKTsgfSk7XHJcbiAgICAgICAgaWYgKHByb2dyZXNzUGF1c2VCdG4pIGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyKHByb2dyZXNzUGF1c2VCdG4pO1xyXG5cclxuICAgICAgICAvLyBUcmFja1xyXG4gICAgICAgIHRoaXMub3Blbi5wdXNoKHJlZik7XHJcbiAgICAgICAgdGhpcy5pZFRvUmVmLnNldCh0b2FzdElkLCByZWYpO1xyXG5cclxuICAgICAgICAvLyBPdmVyZmxvdyBwb2xpY3lcclxuICAgICAgICBpZiAodGhpcy5vcGVuLmxlbmd0aCA+IHRoaXMuY29uZmlnLm1heFRvYXN0cykge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLm9wZW5bMF07XHJcbiAgICAgICAgICAgIG9sZGVzdC5jbG9zZSgnb3ZlcmZsb3cnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICByZXR1cm4gcmVmO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVuaWVuY2UgaGVscGVyc1xyXG4gICAgICovXHJcbiAgICBpbmZvKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdpbmZvJyB9KTsgfVxyXG4gICAgc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnc3VjY2VzcycgfSk7IH1cclxuICAgIHdhcm5pbmcobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3dhcm5pbmcnIH0pOyB9XHJcbiAgICBkYW5nZXIobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2RhbmdlcicgfSk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHsnYXBpJ3wnb3ZlcmZsb3cnfSBbcmVhc29uXSAqL1xyXG4gICAgY2xvc2VBbGwocmVhc29uKSB7XHJcbiAgICAgICAgLy8gY29weSB0byBhdm9pZCBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uXHJcbiAgICAgICAgY29uc3QgYWxsID0gdGhpcy5vcGVuLnNsaWNlKCk7XHJcbiAgICAgICAgYWxsLmZvckVhY2gociA9PiByLmNsb3NlKHJlYXNvbiB8fCAnYXBpJykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1RvYXN0T3B0aW9uc30gb3B0cyAqL1xyXG4gICAgbm9ybWFsaXplT3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgY29uc3QgbyA9IHsgLi4ub3B0cyB9O1xyXG4gICAgICAgIGlmICghby50eXBlKSBvLnR5cGUgPSAnaW5mbyc7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmRpc21pc3NpYmxlICE9PSAnYm9vbGVhbicpIG8uZGlzbWlzc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kdXJhdGlvbk1zICE9PSAnbnVtYmVyJykgby5kdXJhdGlvbk1zID0gdGhpcy5jb25maWcuZGVmYXVsdER1cmF0aW9uTXM7XHJcbiAgICAgICAgLy8gVXNlIGlkIGZyb20gb3B0aW9ucyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBpZCBmcm9tIGNvbmZpZywgb3RoZXJ3aXNlIHVuZGVmaW5lZCAod2lsbCBiZSBhdXRvLWdlbmVyYXRlZClcclxuICAgICAgICBpZiAoIW8uaWQgJiYgdGhpcy5jb25maWcuaWQpIG8uaWQgPSB0aGlzLmNvbmZpZy5pZDtcclxuICAgICAgICBvLnByb2dyZXNzID0gcmVzb2x2ZVByb2dyZXNzKG9wdHMucHJvZ3Jlc3MsIHRoaXMuY29uZmlnLnByb2dyZXNzKTtcclxuICAgICAgICByZXR1cm4gbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgb3IgY3JlYXRlIGEgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHsndXAnfCdkb3duJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIChhbHJlYWR5IGRldGVybWluZWQsIG5vdCAnYXV0bycpXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYW5hZ2VkXSBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIG1hbmFnZWQgYnkgYSBtYW5hZ2VyIChkZWZhdWx0OiBmYWxzZSlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgbWFuYWdlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZsb3cgc2hvdWxkIGFscmVhZHkgYmUgZGV0ZXJtaW5lZCAoJ3VwJyBvciAnZG93bicpLCBidXQgZmFsbGJhY2sgdG8gYXV0byBpZiBuZWVkZWRcclxuICAgICAgICBjb25zdCBmaW5hbEZsb3cgPSBmbG93ICYmIGZsb3cgIT09ICdhdXRvJyA/IGZsb3cgOiBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAxLiBDaGVjayBtZW1vcnkgY2FjaGVcclxuICAgICAgICBsZXQgYyA9IF9jb250YWluZXJDYWNoZS5nZXQocG9zaXRpb25LZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDIuIElmIG5vdCBpbiBjYWNoZSwgc2VhcmNoIGluIERPTSBieSBkYXRhIGF0dHJpYnV0ZVxyXG4gICAgICAgIGlmICghYyAmJiBpc0Jyb3dzZXIpIHtcclxuICAgICAgICAgICAgYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFweC10b2FzdC1wb3NpdGlvbj1cIiR7cG9zaXRpb25LZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAzLiBJZiBzdGlsbCBub3QgZm91bmQsIGNyZWF0ZSBuZXcgY29udGFpbmVyXHJcbiAgICAgICAgaWYgKCFjKSB7XHJcbiAgICAgICAgICAgIGMgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC1jb250YWluZXInKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJywgcG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gTWFyayBhcyBtYW5hZ2VkIGlmIGNyZWF0ZWQgYnkgYSBtYW5hZ2VyXHJcbiAgICAgICAgICAgIGlmIChtYW5hZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIERldGVybWluZSBwb3NpdGlvbiBjbGFzcyAoZm9yIENTUylcclxuICAgICAgICAgICAgY29uc3QgcG9zQ2xhc3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnIFxyXG4gICAgICAgICAgICAgICAgPyBwb3NpdGlvbiBcclxuICAgICAgICAgICAgICAgIDogKHBvc2l0aW9uLnR5cGUgfHwgJ2JvdHRvbS1yaWdodCcpO1xyXG4gICAgICAgICAgICBjLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC1jb250YWluZXItLSR7cG9zQ2xhc3N9YCk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICAgICAgYy5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICAgICAgYy5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwbHkgZmxvdyBkaXJlY3Rpb25cclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb24gc3R5bGVzIGlmIG9iamVjdCBwb3NpdGlvblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjKTtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYy5zdHlsZSwgc3R5bGVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHdyYXBwZXIgZm9yIGNsZWFuIERPTSBvcmdhbml6YXRpb25cclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGdldFRvYXN0V3JhcHBlcigpO1xyXG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXBkYXRlIGZsb3cgZGlyZWN0aW9uIGlmIGNvbnRhaW5lciBleGlzdHMgKG1heSBiZSBzaGFyZWQpXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIElmIGNvbnRhaW5lciBleGlzdHMgYW5kIGlzIG5vdyBtYW5hZ2VkLCBtYXJrIGl0XHJcbiAgICAgICAgICAgIGlmIChtYW5hZ2VkICYmICFjLmhhc0F0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGM7XHJcbiAgICB9XHJcblxyXG4gICAgZW5zdXJlQ29udGFpbmVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciB8fCAhaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gdGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJztcclxuICAgICAgICAvLyBDb250YWluZXJzIGNyZWF0ZWQgYnkgZW5zdXJlQ29udGFpbmVyIGFyZSBtYW5hZ2VkXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCB0cnVlKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29udGFpbmVyQ29uZmlnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlDb250YWluZXJDb25maWcoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgcG9zID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyA/IHBvc2l0aW9uIDogKHBvc2l0aW9uLnR5cGUgfHwgJ2JvdHRvbS1yaWdodCcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlcyAodGhlc2UgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIgbWFuYWdlcnMgc2hhcmluZyB0aGUgY29udGFpbmVyKVxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBVcGRhdGUgcG9zaXRpb24gY2xhc3MgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zQ2xhc3NlcyA9IFsnYm90dG9tLXJpZ2h0JywnYm90dG9tLWxlZnQnLCd0b3AtcmlnaHQnLCd0b3AtbGVmdCddLm1hcChwID0+IGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3B9YCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoLi4ucG9zQ2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC1jb250YWluZXItLSR7cG9zfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBjb250YWluZXIgY2xhc3MgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvbnRhaW5lckNsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvbnRhaW5lckNsYXNzLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goY2xzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoY2xzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IG9mZnNldCAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcub2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBgJHt0aGlzLmNvbmZpZy5vZmZzZXR9cHhgO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygnYm90dG9tJykpIHRoaXMuY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBvZmZzZXQgaWYgbm90IHNwZWNpZmllZFxyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygnYm90dG9tJykpIHRoaXMuY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBGb3Igb2JqZWN0IHBvc2l0aW9ucywgZW5zdXJlIGNvbnRhaW5lciBoYXMgcG9zaXRpb246IGZpeGVkXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIGEgY29udGFpbmVyIGJhc2VkIG9uIHBvc2l0aW9uIGNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lckVsXHJcbiAgICAgKiBAcmV0dXJucyB7e2xlZnQ/OiBzdHJpbmcsIHRvcD86IHN0cmluZywgcmlnaHQ/OiBzdHJpbmcsIGJvdHRvbT86IHN0cmluZ319XHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjb250YWluZXJFbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbnMgYXJlIGhhbmRsZWQgYnkgY29udGFpbmVyIENTU1xyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdGlja3knIHx8ICghdHlwZSAmJiAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55KSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0aWNreTogZml4ZWQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBwb3NpdGlvbi54LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGVsZW1lbnQgd2l0aCB4L3kgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgZml4ZWQgcG9zaXRpb25pbmcsIHNvIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGlzIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgeC95IG9mZnNldHMgKGNhbiBiZSBweCwgZW0sIGV0Yy4pXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU9mZnNldCA9ICh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBlbSB0byBweCAoYXBwcm94aW1hdGU6IDFlbSA9IDE2cHgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBwYXJzZU9mZnNldChwb3NpdGlvbi54IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRZID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueSB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYCR7cmVjdC5sZWZ0ICsgb2Zmc2V0WH1weGAsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBgJHtyZWN0LnRvcCArIG9mZnNldFl9cHhgXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGVsZW1lbnQgd2l0aCBwbGFjZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwID0gcG9zaXRpb24uZ2FwIHx8ICcxZW0nO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSBnYXAgKGNhbiBiZSBweCwgZW0sIGV0Yy4pXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZUdhcCA9ICh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7IC8vIEFwcHJveGltYXRlOiAxZW0gPSAxNnB4XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXBQeCA9IHBhcnNlR2FwKGdhcCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyAoYWJvdmUvYmVsb3cvYmVmb3JlL2FmdGVyKSB0byBDU1MgdmFsdWVzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBhYm92ZSBlbGVtZW50OiBib3R0b20gb2YgdG9hc3QgPSB0b3Agb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3R0b20gPSB2aWV3cG9ydCBoZWlnaHQgLSAoZWxlbWVudCB0b3AgLSBnYXApID0gdmlld3BvcnQgaGVpZ2h0IC0gZWxlbWVudCB0b3AgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IGAke3dpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGJlbG93IGVsZW1lbnQ6IHRvcCBvZiB0b2FzdCA9IGJvdHRvbSBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LmJvdHRvbSArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIGxlZnQ6IHJpZ2h0IG9mIHRvYXN0ID0gbGVmdCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IGAke3dpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5sZWZ0ICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC50b3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSByaWdodDogbGVmdCBvZiB0b2FzdCA9IHJpZ2h0IG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LnJpZ2h0ICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC50b3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IGNvbmZpZ1xyXG4gKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlVG9hc3RNYW5hZ2VyKGNvbmZpZykge1xyXG4gICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoY29uZmlnKTtcclxufVxyXG5cclxuLy8gSGlnaC1sZXZlbCBBUFgudG9hc3QgQVBJIChkZWZhdWx0ICYgbmFtZWQgbWFuYWdlcnMpXHJcbmxldCBfZGVmYXVsdE1hbmFnZXIgPSBudWxsO1xyXG5jb25zdCBfZ2V0RGVmYXVsdCA9ICgpID0+IHtcclxuICAgIGlmICghX2RlZmF1bHRNYW5hZ2VyKSBfZGVmYXVsdE1hbmFnZXIgPSBjcmVhdGVUb2FzdE1hbmFnZXIoKTtcclxuICAgIHJldHVybiBfZGVmYXVsdE1hbmFnZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogVG9hc3QgQVBJIHN1cmZhY2UgdG8gYmUgYXR0YWNoZWQgYXMgQVBYLnRvYXN0LlxyXG4gKiBDYWxsYWJsZSBmb3JtIHByb3hpZXMgdG8gZGVmYXVsdE1hbmFnZXIuc2hvdyhvcHRzKTogQVBYLnRvYXN0KHsuLi59KVxyXG4gKi9cclxuZnVuY3Rpb24gdG9hc3Qob3B0cykge1xyXG4gICAgcmV0dXJuIF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKTtcclxufVxyXG5cclxuT2JqZWN0LmFzc2lnbih0b2FzdCwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBtYW5hZ2VyLiBJZiBmaXJzdCBhcmcgaXMgc3RyaW5nLCByZWdpc3RlciBhcyBuYW1lZCB1bmRlciB0b2FzdC5jdXN0b21bbmFtZV1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFBhcnRpYWw8VG9hc3RDb25maWc+fSBuYW1lT3JDb25maWdcclxuICAgICAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBtYXliZUNvbmZpZ1xyXG4gICAgICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiAobmFtZU9yQ29uZmlnLCBtYXliZUNvbmZpZykgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZU9yQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZU9yQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihtYXliZUNvbmZpZyB8fCB7fSkgfSk7XHJcbiAgICAgICAgICAgIGlmICghdG9hc3QuY3VzdG9tKSB0b2FzdC5jdXN0b20gPSB7fTtcclxuICAgICAgICAgICAgdG9hc3QuY3VzdG9tW25hbWVdID0gbWFuYWdlcjtcclxuICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG5hbWVPckNvbmZpZyB8fCB7fSkgfSk7XHJcbiAgICB9LFxyXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBUb2FzdE1hbmFnZXI+fSAqL1xyXG4gICAgY3VzdG9tOiB7fSxcclxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAqL1xyXG4gICAgdXNlOiAobmFtZSkgPT4gKHRvYXN0LmN1c3RvbSAmJiB0b2FzdC5jdXN0b21bbmFtZV0pIHx8IG51bGwsXHJcbiAgICBNYW5hZ2VyOiBUb2FzdE1hbmFnZXIsXHJcbiAgICBzaG93OiAob3B0cykgPT4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpLFxyXG4gICAgaW5mbzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuaW5mbyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHN1Y2Nlc3M6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnN1Y2Nlc3MobWVzc2FnZSwgb3B0cyksXHJcbiAgICB3YXJuaW5nOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS53YXJuaW5nKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgZGFuZ2VyOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5kYW5nZXIobWVzc2FnZSwgb3B0cyksXHJcbiAgICBjb25maWd1cmU6IChjb25maWcpID0+IF9nZXREZWZhdWx0KCkuY29uZmlndXJlKGNvbmZpZyksXHJcbiAgICBzZXRBcmlhTGl2ZTogKG1vZGUpID0+IF9nZXREZWZhdWx0KCkuc2V0QXJpYUxpdmUobW9kZSksXHJcbiAgICBjbG9zZUFsbDogKHJlYXNvbikgPT4gX2dldERlZmF1bHQoKS5jbG9zZUFsbChyZWFzb24pLFxyXG4gICAgZ2V0T3BlblRvYXN0czogKCkgPT4gX2dldERlZmF1bHQoKS5nZXRPcGVuVG9hc3RzKClcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB0b2FzdDtcclxuZXhwb3J0IHsgVG9hc3RNYW5hZ2VyLCBjcmVhdGVUb2FzdE1hbmFnZXIsIHRvYXN0IH07XHJcbiIsIi8vIEltcG9ydCBkZXMgZm9uY3Rpb25zIGV0IG1vZHVsZXMgZGVzIHNvdXMtbW9kdWxlc1xyXG5pbXBvcnQgYXVnbWVudFdpdGhQYWNrIGZyb20gJy4vZm9ybS1wYWNrZXIvYXVnbWVudC1hcHgubWpzJztcclxuaW1wb3J0IHsgcGFja0Zvcm1Ub0pTT04gfSBmcm9tICcuL2Zvcm0tcGFja2VyL3BhY2tUb0pzb24ubWpzJztcclxuXHJcbi8vIEV4cG9ydCBkZSBsYSBmb25jdGlvbiBkJ2F1Z21lbnRhdGlvblxyXG5leHBvcnQgeyBhdWdtZW50V2l0aFBhY2sgfTtcclxuXHJcbi8vIEV4cG9ydCBkZXMgZm9uY3Rpb25zIHV0aWxpdGFpcmVzXHJcbmV4cG9ydCB7IHBhY2tGb3JtVG9KU09OIH07XHJcblxyXG4vLyBFeHBvcnQgZCd1biBvYmpldCB0b29scyBwb3VyIGZhY2lsaXRlciBsJ3V0aWxpc2F0aW9uXHJcbmV4cG9ydCBjb25zdCB0b29scyA9IHtcclxuICAgIHBhY2tGb3JtVG9KU09OOiBwYWNrRm9ybVRvSlNPTlxyXG59O1xyXG5cclxuXHJcbiIsImltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vKipcclxuICogQWpvdXRlIGxhIG3DqXRob2RlIHBhY2soKSBhdXggb2JqZXRzIEFQWCBwb3VyIGNvbnZlcnRpciBsZXMgZm9ybXVsYWlyZXMgZW4gSlNPTlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gTCdvYmpldCBBUFggw6AgYXVnbWVudGVyXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgQVBYIGF1Z21lbnTDqVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgbGUgcHJlbWllciBmb3JtdWxhaXJlIHPDqWxlY3Rpb25uw6kgZW4gb2JqZXQgSlNPTlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFzc8OpZXMgw6AgcGFja0Zvcm1Ub0pTT04gKGV4LiB7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSlcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2kgYXVjdW4gZm9ybXVsYWlyZSBuJ2VzdCB0cm91dsOpIG91IHNpIGxlIHByZW1pZXIgw6lsw6ltZW50IG4nZXN0IHBhcyB1biBmb3JtdWxhaXJlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgZGF0YSA9IEFQWCgnZm9ybS5teWZvcm1jbGFzcycpLnBhY2soKTtcclxuICAgICAqIGNvbnN0IGRhdGFMZWdhY3kgPSBBUFgoJ2Zvcm0nKS5wYWNrKHsgbnVtZXJpY0tleXNBbHdheXNBcnJheTogdHJ1ZSB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4LnBhY2sgPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3QoKTtcclxuICAgICAgICBpZiAoIWZpcnN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlbWVudC50YWdOYW1lICE9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IGlzIG5vdCBhIGZvcm0nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhY2tGb3JtVG9KU09OKGZpcnN0RWxlbWVudCwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59XHJcblxyXG5cclxuIiwiLyoqXHJcbiAqIENvbnZlcnRpdCB1biBmb3JtdWxhaXJlIEhUTUwgZW4gb2JqZXQgSlNPTlxyXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybSAtIExlIGZvcm11bGFpcmUgw6AgY29udmVydGlyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIGRlIGNvbnZlcnNpb25cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5udW1lcmljS2V5c0Fsd2F5c0FycmF5PWZhbHNlXSAtIFNpIHRydWUsIHRvdXRlIGNsw6kgbnVtw6lyaXF1ZSBlc3QgdHJhaXTDqWUgY29tbWUgaW5kZXggZGUgdGFibGVhdSAoY29tcG9ydGVtZW50IGQnYXZhbnQgMi42LjIpLiBTaW5vbiwgaGV1cmlzdGlxdWUgOiB0YWJsZWF1IHNldWxlbWVudCBzaSBpbmRpY2VzIGRlbnNlcyAwLDEsMizigKYsbi5cclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICogQHRocm93cyB7VHlwZUVycm9yfSBTaSBmb3JtIG4nZXN0IHBhcyB1biBIVE1MRm9ybUVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBwYWNrRm9ybVRvSlNPTiA9IChmb3JtLCBvcHRpb25zID0ge30pID0+IHtcclxuICAgIC8vIFZhbGlkYXRpb24gZGUgbCdlbnRyw6llXHJcbiAgICBpZiAoIWZvcm0gfHwgIShmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhY2tGb3JtVG9KU09OIGV4cGVjdHMgYW4gSFRNTEZvcm1FbGVtZW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpY0tleXNBbHdheXNBcnJheSA9IG9wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheSA9PT0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcclxuICAgIGNvbnN0IGpzb25EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWl0IHVuZSByZXByw6lzZW50YXRpb24gc3RyaW5nIGR1IGNoZW1pbiBwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBMZXMgcGFydGllcyBkdSBjaGVtaW5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IExlIGNoZW1pbiBmb3JtYXTDqVxyXG4gICAgICovXHJcbiAgICBjb25zdCBidWlsZFBhdGhTdHJpbmcgPSAocGFydHMpID0+IHtcclxuICAgICAgICByZXR1cm4gcGFydHMucmVkdWNlKChwYXRoLCBwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9WyR7cGFydC5pbmRleH1dYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgfSwgJycpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMSA6IEFOQUxZU0UgRVQgRMOJVEVDVElPTiBERVMgQ09ORkxJVFNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJ1Y3R1cmUgcG91ciBzdG9ja2VyIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW5cclxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFBhdGhVc2FnZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ZpbmFsIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzSW50ZXJtZWRpYXRlIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzQXJyYXlTdWZmaXggLSBMZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW10gKGNyw6llIGRlcyB2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIHF1aSB1dGlsaXNlIGNlIGNoZW1pblxyXG4gICAgICovXHJcbiAgICBcclxuICAgIGNvbnN0IHBhdGhVc2FnZSA9IG5ldyBNYXAoKTsgLy8gTWFwPHBhdGhTdHJpbmcsIFBhdGhVc2FnZT5cclxuICAgIGNvbnN0IGtleUFuYWx5c2lzID0gbmV3IE1hcCgpOyAvLyBNYXA8YmFzZVBhdGgsIHtoYXNOdW1lcmljOiBib29sZWFuLCBoYXNTdHJpbmc6IGJvb2xlYW59PlxyXG4gICAgY29uc3QgbnVtZXJpY0luZGljZXNCeVBhdGggPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBTZXQ8bnVtYmVyPj4g4oCUIGluZGljZXMgdW5kZXIgZWFjaCBwYXJlbnQgcGF0aFxyXG4gICAgY29uc3QgYWxsRW50cmllcyA9IFtdO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVucmVnaXN0cmUgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pbiBkYW5zIHBhdGhVc2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gTGUgY2hlbWluIMOgIGVucmVnaXN0cmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmluYWwgLSBTaSBjJ2VzdCB1bmUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0FycmF5U3VmZml4IC0gU2kgbGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlY29yZFBhdGhVc2FnZSA9IChjdXJyZW50UGF0aCwgaXNGaW5hbCwgaXNBcnJheVN1ZmZpeCwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNhZ2UgPSBwYXRoVXNhZ2UuZ2V0KGN1cnJlbnRQYXRoKSA/PyB7XHJcbiAgICAgICAgICAgIGlzRmluYWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0ludGVybWVkaWF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGhhc0FycmF5U3VmZml4OiBmYWxzZSxcclxuICAgICAgICAgICAga2V5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXBhdGhVc2FnZS5oYXMoY3VycmVudFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHBhdGhVc2FnZS5zZXQoY3VycmVudFBhdGgsIHVzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzRmluYWwpIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNGaW5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA9IGtleTtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXlTdWZmaXgpIHtcclxuICAgICAgICAgICAgICAgIHVzYWdlLmhhc0FycmF5U3VmZml4ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzSW50ZXJtZWRpYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID8/PSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gUHJlbWnDqHJlIHBhc3NlIDogYW5hbHlzZXIgdG91dGVzIGxlcyBjbMOpcyBldCBlbnJlZ2lzdHJlciBsZXMgY2hlbWluc1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGFsbEVudHJpZXMucHVzaCh7IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbnN0cnVpcmUgdG91cyBsZXMgY2hlbWlucyBpbnRlcm3DqWRpYWlyZXMgZXQgbGUgY2hlbWluIGZpbmFsXHJcbiAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gJyc7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXlTdWZmaXggPSBwYXJ0LnR5cGUgPT09ICdhcnJheSc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDb25zdHJ1aXJlIGxlIGNoZW1pbiBqdXNxdSfDoCBjZSBuaXZlYXVcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBjdXJyZW50UGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXQgPSBudW1lcmljSW5kaWNlc0J5UGF0aC5nZXQocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldCA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5kaWNlc0J5UGF0aC5zZXQocGFyZW50UGF0aCwgc2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldC5hZGQocGFydC5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRW5yZWdpc3RyZXIgbCd1dGlsaXNhdGlvbiBkdSBjaGVtaW5cclxuICAgICAgICAgICAgcmVjb3JkUGF0aFVzYWdlKGN1cnJlbnRQYXRoLCBpc0xhc3QsIGlzQXJyYXlTdWZmaXggJiYgaXNMYXN0LCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBbmFseXNlciBjaGFxdWUgbml2ZWF1IGRlIGxhIGhpw6lyYXJjaGllIHBvdXIgZMOpdGVjdGVyIGxlcyBjb25mbGl0cyAoaW5kaWNlcyBudW3DqXJpcXVlcyB2cyBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBwYXJ0c1tpICsgMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBbmFseXNlciBzZXVsZW1lbnQgbGVzIGNsw6lzIChwYXMgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMpXHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnQubmFtZTsgLy8gTGUgbm9tIGRlIGxhIHByZW1pw6hyZSBjbMOpIGRhbnMgbGUgY2hlbWluXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKSA/PyB7IGhhc051bWVyaWM6IGZhbHNlLCBoYXNTdHJpbmc6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleUFuYWx5c2lzLmhhcyhiYXNlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlBbmFseXNpcy5zZXQoYmFzZVBhdGgsIGFuYWx5c2lzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5oYXNOdW1lcmljID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdrZXknIHx8IG5leHRQYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzU3RyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRMOpdGVjdGUgZXQgbMOodmUgdW5lIGV4Y2VwdGlvbiBwb3VyIHRvdXMgbGVzIGNvbmZsaXRzIGRlIGNoZW1pbnNcclxuICAgICAqIFxyXG4gICAgICogUHJpbmNpcGUgc2ltcGxlIDogcG91ciBjaGFxdWUgY2hlbWluIGZpbmFsICh2YWxldXIgcHJpbWl0aXZlKSwgdsOpcmlmaWVyIHNpIHVuIGNoZW1pblxyXG4gICAgICogaW50ZXJtw6lkaWFpcmUgY29tbWVuY2UgcGFyIGNlIGNoZW1pbiBzdWl2aSBkZSAnWycuIFNpIGMnZXN0IGxlIGNhcywgYydlc3QgdW4gY29uZmxpdC5cclxuICAgICAqIFxyXG4gICAgICogQ2V0dGUgYXBwcm9jaGUgdW5pZmnDqWUgY291dnJlIHRvdXMgbGVzIGNhcyA6XHJcbiAgICAgKiAtIGl0ZW1zW10gKGZpbmFsKSB2cyBpdGVtc1swXVtuYW1lXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGFycmF5WzNdIChmaW5hbCkgdnMgYXJyYXlbM11bbmVzdGVkXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGRhdGFba2V5XSAoZmluYWwpIHZzIGRhdGFba2V5XVtzdWJdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZGV0ZWN0UGF0aENvbmZsaWN0cyA9ICgpID0+IHtcclxuICAgICAgICAvLyAxLiBDb2xsZWN0ZXIgdG91cyBsZXMgY2hlbWlucyBmaW5hdXggKHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUGF0aEtleXMgPSBuZXcgTWFwKCk7IC8vIFBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzRmluYWwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aHMuYWRkKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgZmluYWxQYXRoS2V5cy5zZXQocGF0aCwgdXNhZ2Uua2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBQb3VyIGNoYXF1ZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmUsIHbDqXJpZmllciBzJ2lsIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWxcclxuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB1c2FnZV0gb2YgcGF0aFVzYWdlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodXNhZ2UuaXNJbnRlcm1lZGlhdGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmluYWxQYXRoIG9mIGZpbmFsUGF0aHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWw6lyaWZpZXIgc2kgY2UgY2hlbWluIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWwgc3VpdmkgZGUgJ1snXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhlbXBsZTogZmluYWxQYXRoID0gXCJhcnJheVszXVwiLCBwYXRoID0gXCJhcnJheVszXVtuZXN0ZWRdXCIg4oaSIGNvbmZsaXRcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke2ZpbmFsUGF0aH1bYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBhdGggY29uZmxpY3Q6IFwiJHtmaW5hbFBhdGh9XCIgaXMgdXNlZCBhcyBhIGZpbmFsIHZhbHVlIChpbiBmaWVsZCBcIiR7ZmluYWxQYXRoS2V5cy5nZXQoZmluYWxQYXRoKX1cIiksIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJ1dCBcIiR7cGF0aH1cIiB0cmllcyB0byB1c2UgaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHBhdGggKGluIGZpZWxkIFwiJHt1c2FnZS5rZXl9XCIpLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGNyZWF0ZXMgaW5jb21wYXRpYmxlIGRhdGEgc3RydWN0dXJlcy4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgXCIke2ZpbmFsUGF0aH1cIiBhcyBhIHByaW1pdGl2ZSB2YWx1ZSBhbmQgdGhlbiBhY2Nlc3MgaXQgYXMgYW4gb2JqZWN0LmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBFeMOpY3V0ZXIgbGEgZMOpdGVjdGlvbiBkZXMgY29uZmxpdHNcclxuICAgIGRldGVjdFBhdGhDb25mbGljdHMoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFbDqXJpZmllIHNpIHVuIGNoZW1pbiBkZSBiYXNlIGEgdW4gY29uZmxpdCAoaW5kaWNlcyBudW3DqXJpcXVlcyBFVCBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2Ugw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaGFzQ29uZmxpY3QgPSAoYmFzZVBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWJhc2VQYXRoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBrZXlBbmFseXNpcy5nZXQoYmFzZVBhdGgpO1xyXG4gICAgICAgIHJldHVybiBhbmFseXNpcz8uaGFzTnVtZXJpYyAmJiBhbmFseXNpcz8uaGFzU3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgaW5kaWNlcyBhcmUgZXhhY3RseSAwLCAxLCAyLCAuLi4sIG4gKGRlbnNlLCBzZXF1ZW50aWFsIGZyb20gMCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRpY2VzIC0gU29ydGVkIGFycmF5IG9mIGluZGljZXNcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCBpc0RlbnNlU2VxdWVudGlhbCA9IChpbmRpY2VzKSA9PiB7XHJcbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmluZGljZXNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvcnRlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoc29ydGVkW2pdICE9PSBqKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgbnVtZXJpYyBrZXlzIHVuZGVyIHRoaXMgcGF0aCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcnJheSBpbmRpY2VzLlxyXG4gICAgICogV2l0aCBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiBhbHdheXMgdHJ1ZSB3aGVuIHBhdGggaGFzIG51bWVyaWMgY2hpbGRyZW4uXHJcbiAgICAgKiBPdGhlcndpc2U6IHRydWUgb25seSB3aGVuIGluZGljZXMgYXJlIGRlbnNlIDAuLm4uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50UGF0aCAtIFBhdGggdG8gdGhlIGNvbnRhaW5lciB0aGF0IGhhcyBudW1lcmljIGNoaWxkcmVuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgdXNlQXJyYXlGb3JOdW1lcmljUGF0aCA9IChwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobnVtZXJpY0tleXNBbHdheXNBcnJheSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVuc2VTZXF1ZW50aWFsKFsuLi5zZXRdKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gdGFibGVhdSBlbiBvYmpldCBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcyBjb21tZSBwcm9wcmnDqXTDqXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciAtIExlIHRhYmxlYXUgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgYXJyYXlUb09iamVjdCA9IChhcnIpID0+IHtcclxuICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAvLyBDb3BpZXIgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICBvYmpbaWR4XSA9IGFycltpZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb3BpZXIgbGVzIHByb3ByacOpdMOpcyBub24tbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhcnIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biBvYmpldCBlbiB0YWJsZWF1IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTCdvYmpldCDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgdGFibGVhdSByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9iamVjdFRvQXJyYXkgPSAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iajtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyW251bUtleV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gb2JqZXQsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VPYmplY3QgLSBGb3JjZXIgbGEgY29udmVyc2lvbiBlbiBvYmpldCBtw6ptZSBzJ2lsIG4neSBhIHBhcyBkZSBjb25mbGl0XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIG9iamV0IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVPYmplY3QgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCwgZm9yY2VPYmplY3QgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJyYXlUb09iamVjdChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gdGFibGVhdSwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIHRhYmxlYXUgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZUFycmF5ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQpID0+IHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IGFycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAyIDogVFJBSVRFTUVOVCBERVMgVkFMRVVSU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgdmFsZXVyIGZpbmFsZSAoZGVybmnDqHJlIHBhcnRpZSBkdSBjaGVtaW4pXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBMYSB2YWxldXIgw6AgYXNzaWduZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBDaGVtaW4gZHUgY29udGVuZXVyIGFjdHVlbCAocG91ciBoZXVyaXN0aXF1ZSBudW1lcmljKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzRmluYWxWYWx1ZSA9IChjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAvLyBUYWJsZWF1IGV4cGxpY2l0ZSBhdmVjIFtdXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSBbXTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZUFycmF5ID0gdXNlQXJyYXlGb3JOdW1lcmljUGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgaWYgKHVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDbMOpIHNpbXBsZSBmaW5hbGVcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHBhcnRpZSBpbnRlcm3DqWRpYWlyZSAoY3LDqWUgbGEgc3RydWN0dXJlKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBuZXh0UGFydCAtIExhIHBhcnRpZSBzdWl2YW50ZSAocGV1dCDDqnRyZSBudWxsKVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIFRvdXRlcyBsZXMgcGFydGllcyBkdSBjaGVtaW4gKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSBMJ2luZGV4IGRlIGxhIHBhcnRpZSBhY3R1ZWxsZSAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIChwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1cilcclxuICAgICAqIEByZXR1cm5zIHsqfSBMZSBub3V2ZWF1IGNvbnRlbmV1ciBhcHLDqHMgdHJhaXRlbWVudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydCA9IChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCkgJiYgIWhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghdXNlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2zDqSBub3JtYWxlIDogY3LDqWVyIG9iamV0IG91IHRhYmxlYXUgc2Vsb24gbGEgcGFydGllIHN1aXZhbnRlXHJcbiAgICAgICAgY29uc3QgbmV4dElzTnVtZXJpYyA9IG5leHRQYXJ0Py50eXBlID09PSAnbnVtZXJpYyc7XHJcbiAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZsaXQgOiB0b3Vqb3VycyB1dGlsaXNlciB1biBvYmpldFxyXG4gICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPz89IHt9O1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbcGFydC5uYW1lXSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBQYXMgZGUgY29uZmxpdCwgY3LDqWVyIHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IG5leHRJc051bWVyaWMgPyBbXSA6IHt9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dElzTnVtZXJpYyAmJiAhQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLy8gT24gYSBiZXNvaW4gZCd1biB0YWJsZWF1IG1haXMgYydlc3QgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29uc3QgaGFzU3RyaW5nS2V5cyA9IE9iamVjdC5rZXlzKGNvbnRhaW5lcltwYXJ0Lm5hbWVdKS5zb21lKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghaGFzU3RyaW5nS2V5cykge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIW5leHRJc051bWVyaWMgJiYgIWlzUGxhaW5PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gb2JqZXQgbWFpcyBjJ2VzdCB1biB0YWJsZWF1XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUydhc3N1cmVyIHF1ZSBjb250YWluZXJbcGFydC5uYW1lXSBlc3QgYmllbiB1biBvYmpldCBhcHLDqHMgdG91dGVzIGxlcyBjb252ZXJzaW9uc1xyXG4gICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyW3BhcnQubmFtZV07XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBUcmFpdGVyIHRvdXRlcyBsZXMgZW50csOpZXNcclxuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwga2V5IH0gb2YgYWxsRW50cmllcykge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbeyBjb250YWluZXI6IGpzb25EYXRhLCBrZXk6IG51bGwgfV07XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGpzb25EYXRhO1xyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGFydHNbMF0/LnR5cGUgPT09ICdrZXknID8gcGFydHNbMF0ubmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBpICsgMSA8IHBhcnRzLmxlbmd0aCA/IHBhcnRzW2kgKyAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0xhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbmFsVmFsdWUoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJ0aWUgaW50ZXJtw6lkaWFpcmUgOiBjcsOpZXIgbGEgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KTtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaCh7IGNvbnRhaW5lciwga2V5OiBwYXJ0LnR5cGUgPT09ICdudW1lcmljJyA/IHBhcnQuaW5kZXggOiBwYXJ0Lm5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuZXdDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGpzb25EYXRhO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIHVuZSBjbMOpIGRlIGZvcm11bGFpcmUgcG91ciBleHRyYWlyZSBsZXMgcGFydGllcyAobm9tLCBpbmRpY2VzLCBldGMuKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSDDoCBwYXJzZXIgKGV4OiBcInVzZXJbZW1haWxdXCIsIFwidGFnc1tdXCIsIFwiaXRlbXNbMF1bbmFtZV1cIilcclxuICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgaW5kZXg/OiBudW1iZXJ9Pn0gVGFibGVhdSBkZXMgcGFydGllcyBwYXJzw6llc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgcGFyc2VLZXkgPSAoa2V5KSA9PiB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGxlbiA9IGtleS5sZW5ndGg7XHJcblxyXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICBjb25zdCBjaGFyID0ga2V5W2ldO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjaGFyID09PSAnWycpIHtcclxuICAgICAgICAgICAgLy8gU2F1dmVnYXJkZXIgbGEgcGFydGllIHByw6ljw6lkZW50ZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBUcm91dmVyIGxhIGZpbiBkdSBjcm9jaGV0XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgbGV0IGJyYWNrZXRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGtleVtpXSAhPT0gJ10nKSB7XHJcbiAgICAgICAgICAgICAgICBicmFja2V0Q29udGVudCArPSBrZXlbaV07XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChicmFja2V0Q29udGVudCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIC8vIFtdIHZpZGUgPSB0YWJsZWF1XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcnQudHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFtdIGF1IGTDqWJ1dCwgY3LDqWVyIHVuZSBwYXJ0aWUgc3DDqWNpYWxlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6ICcnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudSBkYW5zIGxlcyBjcm9jaGV0c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoYnJhY2tldENvbnRlbnQsIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUluZGV4KSAmJiBicmFja2V0Q29udGVudCA9PT0gU3RyaW5nKG51bUluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IFN0cmluZyhudW1JbmRleCksIHR5cGU6ICdudW1lcmljJywgaW5kZXg6IG51bUluZGV4IH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb20gZGUgcHJvcHJpw6l0w6lcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogYnJhY2tldENvbnRlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkrKzsgLy8gUGFzc2VyIGxlICddJ1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWpvdXRlciBsYSBkZXJuacOocmUgcGFydGllIHNpIGVsbGUgZXhpc3RlXHJcbiAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFbDqXJpZmllIHNpIHVuZSB2YWxldXIgZXN0IHVuIG9iamV0IHNpbXBsZSAocGFzIHVuIHRhYmxlYXUsIHBhcyBudWxsKVxyXG4gKiBAcGFyYW0geyp9IG9iaiAtIExhIHZhbGV1ciDDoCB2w6lyaWZpZXJcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKG9iaikgPT4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xyXG59O1xyXG4iLCJpbXBvcnQgJy4vY3NzL3RyaXN0YXRlLmNzcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyaS1zdGF0ZSBjaGVja2JveCBmb3IgZWFjaCBjaGVja2JveCBlbGVtZW50IGluIHRoZSBhcHguZWxlbWVudHMgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gYXB4IC0gQW4gYXJyYXkgb2YgSFRNTEVsZW1lbnRzIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFQWCgpXG4gKiBAZXhhbXBsZVxuICogLy8gQ2FsbCB0aGUgdHJpc3RhdGUgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgY2hlY2tib3ggZWxlbWVudHNcbiAqIGFweC50cmlzdGF0ZSgpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XG4gICAgYXB4LnRyaXN0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSl7XG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF0gPSBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2hlY2tib3guX2FweFRyaXN0YXRlID0geyBkb206IHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCB9O1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIob3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW5BcHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q2hpbGRyZW4oYXB4LCBjaGlsZHJlbkFweCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuLyoqXG4gKiBMaW5rIHBhcmVudCB0cmlzdGF0ZShzKSB0byBjaGlsZCBjaGVja2JveGVzLiBXaGVuIGV4YWN0bHkgb25lIHBhcmVudDogdGhhdCBwYXJlbnQgZ2V0c1xuICogaW5kZXRlcm1pbmF0ZS1kYXNoIGF1dG9tYXRpY2FsbHkgYW5kIHNob3dzIGRhc2ggd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQ7IGNsaWNrIHBhcmVudCB0byBhcHBseSBpdHMgc3RhdGUgdG8gYWxsIGNoaWxkcmVuLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHBhcmVudCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZHJlbkFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIGNoaWxkIGNoZWNrYm94KGVzKVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHVzZWQgZm9yIHRoZSBwYXJlbnQgKGFuZCBhcHBsaWVkIHRvIGNoaWxkcmVuIHdoZW4gaW5pdGlhbGl6aW5nIHRoZW0pXG4gKi9cbmZ1bmN0aW9uIHNldENoaWxkcmVuKHBhcmVudEFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gcGFyZW50QXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdBUFggdHJpc3RhdGUgc2V0Q2hpbGRyZW46IG9ubHkgdGhlIGZpcnN0IHBhcmVudCBpcyBsaW5rZWQgdG8gYWxsIGNoaWxkcmVuLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRDaGVja2JveCA9IHBhcmVudHNbMF07XG4gICAgY29uc3QgcGFyZW50UmVmID0gcGFyZW50Q2hlY2tib3guX2FweFRyaXN0YXRlO1xuICAgIGlmICghcGFyZW50UmVmKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJlbnREb20gPSBwYXJlbnRSZWYuZG9tO1xuICAgIGNvbnN0IHBhcmVudEhpZGRlbklucHV0ID0gcGFyZW50UmVmLmhpZGRlbklucHV0O1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgaW5kZXRlcm1pbmF0ZSAoZGFzaCkgb24gcGFyZW50IHdoZW4gaXQgaGFzIGNoaWxkcmVuOiBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKC0tbWl4ZWQpXG4gICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2FweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnLCAnYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2gnKTtcblxuICAgIGNvbnN0IGNoaWxkQ2hlY2tib3hlcyA9IGNoaWxkcmVuQXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGNvbnN0IGNoaWxkUmVmcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gc3luY1BhcmVudEZyb21DaGlsZHJlbigpIHtcbiAgICAgICAgaWYgKGNoaWxkUmVmcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gY2hpbGRSZWZzLm1hcCgocmVmKSA9PiBnZXRUcmlzdGF0ZVN0YXRlKHJlZi5kb20pKTtcbiAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2NoZWNrZWQnKTtcbiAgICAgICAgY29uc3QgYWxsQ3Jvc3NlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2Nyb3NzZWQnKTtcbiAgICAgICAgY29uc3QgYWxsVW5jaGVja2VkID0gc3RhdGVzLmV2ZXJ5KChzKSA9PiBzID09PSAndW5jaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IG1peGVkID0gIWFsbENoZWNrZWQgJiYgIWFsbENyb3NzZWQgJiYgIWFsbFVuY2hlY2tlZDtcblxuICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgICAgICBpZiAobWl4ZWQpIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG4gICAgICAgIGVsc2UgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2FweC10cmlzdGF0ZS0tbWl4ZWQnKTtcblxuICAgICAgICBpZiAoYWxsQ2hlY2tlZCkge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbENyb3NzZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5UGFyZW50VG9DaGlsZHJlbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50U3RhdGUgPSBnZXRUcmlzdGF0ZVN0YXRlKHBhcmVudERvbSk7XG4gICAgICAgIGNoaWxkUmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFRyaXN0YXRlU3RhdGUocmVmLmNoZWNrYm94LCByZWYuZG9tLCByZWYuaGlkZGVuSW5wdXQsIHBhcmVudFN0YXRlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIGFmdGVyKGNoZWNrYm94LCBkb20sIGhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICAgICAgY2hpbGRSZWZzLnB1c2goeyBjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFuZ2U6IHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW5cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjaGlsZHJlbkFweC50cmlzdGF0ZShjaGlsZE9wdGlvbnMpO1xuXG4gICAgc3luY1BhcmVudEZyb21DaGlsZHJlbigpO1xuICAgIHBhcmVudERvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoYXBwbHlQYXJlbnRUb0NoaWxkcmVuLCAwKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRyaXN0YXRlU3RhdGUoZG9tKSB7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkgcmV0dXJuICdjaGVja2VkJztcbiAgICBpZiAoZG9tLmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpKSByZXR1cm4gJ2Nyb3NzZWQnO1xuICAgIHJldHVybiAndW5jaGVja2VkJztcbn1cblxuZnVuY3Rpb24gc2V0VHJpc3RhdGVTdGF0ZShjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCwgc3RhdGUpIHtcbiAgICBkb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKHN0YXRlKTtcbiAgICBjb25zdCBuYW1lID0gY2hlY2tib3guZGF0YXNldC5uYW1lIHx8IGNoZWNrYm94LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJykgfHwgY2hlY2tib3gubmFtZSB8fCAnJztcbiAgICBpZiAoc3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICBpZiAobmFtZSkgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUoY3VzdG9tQ2hlY2tib3gsIGFjdHVhbENoZWNrYm94LCBoaWRkZW5JbnB1dCkge1xuICAgIGNvbnN0IHdhc0NoZWNrZWQgPSBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKTtcbiAgICBjb25zdCB3YXNDcm9zc2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJyk7XG4gICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmICh3YXNDaGVja2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfSBlbHNlIGlmICh3YXNDcm9zc2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgYWN0dWFsQ2hlY2tib3guZGF0YXNldC5uYW1lKTsgLy8gUmVzdG9yZSB0aGUgbmFtZSBmb3IgcG9zdGluZ1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBcbiAgICAvL2dldCB0aGUgY2hlY2tib3ggbWFyZ2lucyBpbmNsdWRpbmcgYnJvd3NlciBkZWZhdWx0XG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XG4gICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdiBhbmQgc2V0IGl0cyBpbml0aWFsIHN0YXRlXG4gICAgY29uc3QgdHJpc3RhdGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcbiAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpemUud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdyA9IG9wdGlvbnMuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS53aWR0aCBtdXN0IGJlIGEgbnVtYmVyIChweCkgb3IgYSBzdHJpbmcgKENTUyBsZW5ndGgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUud2lkdGggPSB0eXBlb2YgdyA9PT0gJ251bWJlcicgPyB3ICsgJ3B4JyA6IFN0cmluZyh3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gb3B0aW9ucy5zaXplLmhlaWdodDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS5oZWlnaHQgbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLmhlaWdodCA9IHR5cGVvZiBoID09PSAnbnVtYmVyJyA/IGggKyAncHgnIDogU3RyaW5nKGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuY2xhc3NlcykgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCguLi5jb21wdXRlQ2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpKTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ29sb3JzKG9wdGlvbnMpO1xuICAgIGlmIChjb2xvcnMudGljayAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcicsIFN0cmluZyhjb2xvcnMudGljaykpO1xuICAgIGlmIChjb2xvcnMuY2hlY2tlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY2hlY2tlZCkpO1xuICAgIGlmIChjb2xvcnMuY3Jvc3NlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY3Jvc3NlZCkpO1xuXG4gICAgdHJpc3RhdGVEb20uc3R5bGUubWFyZ2luID0gY2hlY2tib3hTdHlsZS5tYXJnaW47XG5cbiAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgaGlkZGVuIGlucHV0IGZpZWxkXG4gICAgY29uc3QgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcbiAgICBoaWRkZW5JbnB1dC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuZGF0YXNldC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIFN0b3JlIHRoZSBuYW1lIGluIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGxhdGVyIHVzZVxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXG5cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUpIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIGVsc2V7XG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhpZGRlbiBpbnB1dCBiYXNlZCBvbiB0aGUgY2hlY2tib3gncyBzdGF0ZVxuICAgICAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlkZGVuSW5wdXQubmFtZSA9ICcnOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9oYW5kbGUgYWNjZXNzaWJpbGl0eSwgc2V0IHRoZSB0YWJpbmRleCB0byB0aGUgc2FtZSBhcyB0aGUgY2hlY2tib3hcbiAgICB0cmlzdGF0ZURvbS50YWJJbmRleCA9IGNoZWNrYm94RWxlbWVudC50YWJJbmRleDtcblxuICAgIC8vIEluc2VydCB0aGUgaGlkZGVuIGlucHV0IGluc2lkZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdlxuICAgIHRyaXN0YXRlRG9tLmFwcGVuZENoaWxkKGhpZGRlbklucHV0KTtcblxuICAgIC8vIEluc2VydCBpdCBuZXh0IHRvIHRoZSBhY3R1YWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZSk7XG4gICAgfSk7XG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XG5cbiAgICByZXR1cm4gW2NoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XTtcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCkge1xuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdGF0ZSBjbGFzcyBpcyBzZXQgKHVuY2hlY2tlZEFwcGVhcmFuY2UgbW9kaWZpZXJzIG11c3Qgbm90IGFmZmVjdCBjaGVja2VkL2Nyb3NzZWQpXG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAndW5jaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlQ2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xuICAgIGlmKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvL3JlcGxhY2UgbXVsdGlwbGUgd2hpdGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xuICAgICAgICBpZihjbGFzc2VzLmluZGV4T2YoJyAnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcsJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcbiAgICB9XG4gICAgZWxzZSBpZihBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZENsYXNzZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2xvcnMob3B0aW9ucykge1xuICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbG9ycyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aWNrOiBjLnRpY2sgIT0gbnVsbCA/IGMudGljayA6IG9wdGlvbnMudGlja0NvbG9yLFxuICAgICAgICBjaGVja2VkOiBjLmNoZWNrZWQgIT0gbnVsbCA/IGMuY2hlY2tlZCA6IG9wdGlvbnMuY2hlY2tlZENvbG9yLFxuICAgICAgICBjcm9zc2VkOiBjLmNyb3NzZWQgIT0gbnVsbCA/IGMuY3Jvc3NlZCA6IG9wdGlvbnMuY3Jvc3NlZENvbG9yXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBldmVudCkge1xuICAgIC8vaWYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlIGlzIHNldCwgY2FsbCBpdFxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZShjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgfVxuXG4gICAgaWYoIW9wdGlvbnMuYnViYmxlRXZlbnRzKSByZXR1cm47XG5cbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCB7IGtleTogJyAnLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbmtleXVwKGNoZWNrYm94RWxlbWVudCwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgZXZlbnQpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcbiAgICB9XG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IGF1Z21lbnRXaXRoTGlzdGVuIGZyb20gJy4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhUcmlzdGF0ZSBmcm9tICcuL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzJztcbmltcG9ydCBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZSBmcm9tICcuL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMnO1xuaW1wb3J0IGRpYWxvZyBmcm9tICcuL21vZHVsZXMvZGlhbG9nL2RpYWxvZy5tanMnO1xuaW1wb3J0IHRvYXN0IGZyb20gJy4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMnO1xuaW1wb3J0IHsgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy9jb21tb24ubWpzJztcbmltcG9ydCB7IGF1Z21lbnRXaXRoUGFjaywgdG9vbHMgfSBmcm9tICcuL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQVBYIG9iamVjdCB0aGF0IHdyYXBzIG9uZSBvciBtb3JlIEhUTUwgZWxlbWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbnxBcnJheTxIVE1MRWxlbWVudD58alF1ZXJ5fEZ1bmN0aW9ufSBpbnB1dCAtIFRoZSBpbnB1dCB0byBjcmVhdGUgdGhlIEFQWCBvYmplY3QgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBBUFggb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBpbnB1dCB0eXBlIGlzIGludmFsaWQuXG4gKiBAZXhhbXBsZVxuICogLy8gWFBhdGhcbiAqIGNvbnN0IGFweDEgPSBBUFgoJy8vZGl2W0BjbGFzcz1cImV4YW1wbGVcIl0nKTtcbiAqXG4gKiAvLyBDU1Mgc2VsZWN0b3JcbiAqIGNvbnN0IGFweDIgPSBBUFgoJy5leGFtcGxlJyk7XG4gKlxuICogLy8gU2luZ2xlIGVsZW1lbnRcbiAqIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4MyA9IEFQWChlbGVtZW50KTtcbiAqXG4gKiAvLyBOb2RlTGlzdCBvciBIVE1MQ29sbGVjdGlvblxuICogY29uc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4NCA9IEFQWChub2RlTGlzdCk7XG4gKlxuICogLy8gQXJyYXkgb2YgZWxlbWVudHNcbiAqIGNvbnN0IGVsZW1lbnRzID0gW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMScpLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZTInKV07XG4gKiBjb25zdCBhcHg1ID0gQVBYKGVsZW1lbnRzKTtcbiAqXG4gKiAvLyBqUXVlcnkgb2JqZWN0XG4gKiBjb25zdCAkZXhhbXBsZSA9ICQoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg2ID0gQVBYKCRleGFtcGxlKTtcbiAqXG4gKiAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdFxuICogY29uc3QgYXB4NyA9IEFQWCgoKSA9PiBBUFgoJy5leGFtcGxlJykpO1xuICovXG5jb25zdCBBUFggPSBmdW5jdGlvbiAoaW5wdXQsIGNvbnRleHQgPSBkb2N1bWVudCkge1xuICAgIGxldCBlbGVtZW50cztcblxuICAgIC8vIFZhbGlkYXRlIGNvbnRleHRcbiAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBUFguaXNBUFhPYmplY3QoY29udGV4dCkpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQuZmlyc3QoKTtcbiAgICB9IGVsc2UgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGNvbnRleHQgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRleHQgZm9yIEFQWCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0LnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgICAgLy8gWFBhdGggd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQuZXZhbHVhdGUoaW5wdXQsIGNvbnRleHQsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcbiAgICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICAgIGxldCBub2RlID0gZWxlbWVudHMuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gZWxlbWVudHMuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5vZGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBDU1Mgc2VsZWN0b3Igd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gU2luZ2xlIGVsZW1lbnQgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LmNvbnRhaW5zKGlucHV0KSA/IFtpbnB1dF0gOiBbXTtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgaW5wdXQgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbikge1xuICAgICAgICAvLyBOb2RlTGlzdCBvciBIVE1MQ29sbGVjdGlvbiB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5ldmVyeShlbCA9PiBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAvLyBBcnJheSBvZiBlbGVtZW50cyB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGlucHV0LmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgalF1ZXJ5ICE9ICd1bmRlZmluZWQnICYmIGlucHV0IGluc3RhbmNlb2YgalF1ZXJ5KSB7XG4gICAgICAgIC8vIGpRdWVyeSBvYmplY3Qgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0LmdldCgpKS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0IHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFQWChpbnB1dCgpLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgdHlwZSBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgdmFyIGFweCA9IHtcbiAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLFxuICAgICAgICBfaXNBUFhPYmplY3Q6IHRydWVcbiAgICB9O1xuICAgIGFweC5sZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgYXB4LmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5lbGVtZW50cy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBhcHguZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW2luZGV4XTtcbiAgICB9O1xuICAgIGFweC5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBhcHguZmlyc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcbiAgICB9O1xuICAgIGF1Z21lbnRXaXRoTGlzdGVuKGFweCk7XG4gICAgYXVnbWVudFdpdGhUcmlzdGF0ZShhcHgpO1xuICAgIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCk7XG4gICAgYXVnbWVudFdpdGhQYWNrKGFweCk7XG4gICAgcmV0dXJuIGFweDtcbn07XG5cbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcbkFQWC5kaWFsb2cgPSBkaWFsb2c7XG5BUFgudG9hc3QgPSB0b2FzdDtcbkFQWC50b29scyA9IHRvb2xzO1xuQVBYLmlzQVBYT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9pc0FQWE9iamVjdCA9PT0gdHJ1ZTtcbn1cbkFQWC5pc19udW1lcmljID0gKG4pID0+IHtcbiAgICByZXR1cm4gIWlzTmFOKG4gLSBwYXJzZUZsb2F0KG4pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQVBYOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
4823
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxzRUFBaUI7QUFDckIsSUFBSSwwRUFBbUI7QUFDdkIsSUFBSSx3RkFBMEI7QUFDOUIsSUFBSSwyRUFBZTtBQUNuQjtBQUNBOztBQUVBLGNBQWMsd0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzPzkyZmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9qc29ucCBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL0FQWC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIERpYWxvZyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAxMDAyO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHRvcDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XHJcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICAgIHBhZGRpbmc6IDQwcHg7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogYXV0bztcclxuICAgIG1pbi13aWR0aDogMzAwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDgwJTtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbn1cclxuXHJcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XHJcbiAgICBtYXJnaW4tdG9wOjA7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nIHtcclxuICAgIGNvbG9yOiAjYWFhO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgZm9udC1zaXplOiAyNHB4O1xyXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XHJcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cclxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XHJcbn1cclxuXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxyXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XHJcbiAgICBjb2xvcjogIzMzMztcclxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGVcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJdOmZvY3VzIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcclxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcclxuICAgIGNvbG9yOiAjRUNGMEYxO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XHJcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZ2FwOiAxMHB4O1xyXG4gICAgbWFyZ2luLXRvcDoxZW07XHJcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xyXG59XHJcblxyXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xyXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcclxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cclxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XHJcbn1cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcclxuICAgIG9wYWNpdHk6IDAuNTtcclxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xyXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cclxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XHJcbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLE9BQU87SUFDUCxNQUFNO0lBQ04sV0FBVztJQUNYLFlBQVk7SUFDWixjQUFjO0lBQ2Qsb0NBQW9DO0lBQ3BDLDBDQUEwQztBQUM5Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsMkNBQTJDO0lBQzNDLGdEQUFnRDtBQUNwRDs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtBQUN2Qjs7QUFFQTs7SUFFSSxXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLGVBQWU7QUFDbkI7O0FBRUEseUJBQXlCO0FBQ3pCOzs7O0lBSUksV0FBVztJQUNYLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixnREFBZ0Q7SUFDaEQsZUFBZTtJQUNmLHNCQUFzQjtJQUN0Qiw2QkFBNkI7QUFDakM7O0FBRUE7Ozs7SUFJSSxxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGFBQWE7QUFDakI7O0FBRUEseUJBQXlCO0FBQ3pCO0lBQ0ksa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsd0NBQXdDO0FBQzVDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5Q0FBeUM7QUFDN0M7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCw0QkFBNEI7QUFDaEM7O0FBRUEsc0JBQXNCO0FBQ3RCO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxXQUFXO0lBQ1gsWUFBWTtJQUNaLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLDZDQUE2QztBQUNqRDs7QUFFQTtJQUNJLEtBQUssdUJBQXVCLEVBQUU7SUFDOUIsT0FBTyx5QkFBeUIsRUFBRTtBQUN0QztBQUNBO0lBQ0ksWUFBWTtJQUNaLDhCQUE4QjtJQUM5QixvQ0FBb0MsRUFBRSxxQkFBcUI7SUFDM0QsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQ0FBb0MsRUFBRSx1QkFBdUI7SUFDN0QsMEJBQTBCO0FBQzlCOztBQUVBLHNDQUFzQztBQUN0QztJQUNJLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLG9DQUFvQztJQUNwQyx3QkFBd0I7QUFDNUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogRGlhbG9nIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZyB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgei1pbmRleDogMTAwMjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMDAlO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcclxcbiAgICAvKiBEaW1tZWQgYmFja2dyb3VuZCBmb3IgZm9jdXMgb24gZGlhbG9nICovXFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xcclxcbiAgICBwYWRkaW5nOiA0MHB4O1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xcclxcbiAgICBtYXgtd2lkdGg6IDgwJTtcXHJcXG4gICAgbWFyZ2luOiBhdXRvO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuaDIuQVBYLWRpYWxvZy10aXRsZXtcXHJcXG4gICAgbWFyZ2luLXRvcDowO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZyB7XFxyXFxuICAgIGNvbG9yOiAjYWFhO1xcclxcbiAgICBmbG9hdDogcmlnaHQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogMjRweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XFxyXFxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcXHJcXG4uQVBYLWNsb3NlLWRpYWxvZzpmb2N1cyB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBJbnB1dCBmaWVsZHMgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXTpmb2N1cyB7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXFxyXFxuICAgIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIGNvbG9yOiAjRUNGMEYxO1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZ2FwOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOjFlbTtcXHJcXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgICBoZWlnaHQ6IDEwMHB4O1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICB3aWR0aDogNDBweDtcXHJcXG4gICAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgICBib3JkZXI6IDRweCBzb2xpZCAjZjNmM2YzO1xcclxcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgICBhbmltYXRpb246IEFQWC1kaWFsb2ctc3BpbiAxcyBsaW5lYXIgaW5maW5pdGU7XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgQVBYLWRpYWxvZy1zcGluIHtcXHJcXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxcclxcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxcclxcbn1cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xcclxcbiAgICBvcGFjaXR5OiAwLjU7XFxyXFxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXFxyXFxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTtcXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBZGQgYSBzdWJ0bGUgc3RyaWtldGhyb3VnaCBlZmZlY3QgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiA1MCU7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogQVBYIFNjcm9sbGFibGUgVGFibGU6IHNjcm9sbGFibGUgdGJvZHkgd2l0aCBmaXhlZCB0aGVhZC90Zm9vdCBhbmQgYWxpZ25lZCBjb2x1bW5zIChDU1MgR3JpZCArIHN1YmdyaWQpXHJcbiAgIFVzZSAhaW1wb3J0YW50IHNvIHBhZ2Ugc3R5bGVzIChlLmcuIGRpc3BsYXk6IHRhYmxlKSBkbyBub3Qgb3ZlcnJpZGUgdGhlIGdyaWQgbGF5b3V0LiAqL1xyXG5cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zOiBzZXQgYnkgSlMgKG1lYXN1cmVkIHdpZHRocyArIGd1dHRlcik7IGZhbGxiYWNrID0gZXF1YWwgY29sdW1ucyArIGd1dHRlciAqL1xyXG4vKiAtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aDogc3BhY2UgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSBsYXN0IGNvbHVtbiAoc2V0IHRvIDAgdG8gYWxsb3cgb3ZlcmxhcCkgKi9cclxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB7XHJcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gdmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1yb3ctc2l6ZSwgZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpKSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xyXG4gICAgLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KTtcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBubyB0Zm9vdDogdGhlYWQgKyB0Ym9keSBvbmx5ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSkgYXV0bztcclxufVxyXG5cclxuLyogVGFibGUgd2l0aCBuZWl0aGVyIHRoZWFkIG5vciB0Zm9vdDogdGJvZHkgb25seSAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xyXG59XHJcblxyXG4vKiAtLWFweC1zY3JvbGxhYmxlLSotdGVtcGxhdGUtcm93czogc2V0IGJ5IEpTIChtZWFzdXJlZCBoZWlnaHRzKSBvciBvdmVycmlkZSBpbiBDU1MgLyB2aWEgb3B0aW9ucyAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCxcclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcclxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XHJcbiAgICBtaW4taGVpZ2h0OiAwO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzLCAxKSwgYXV0bykpO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5ID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xyXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgdGQge1xyXG4gICAgbWluLXdpZHRoOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO3lGQUN5Rjs7QUFFekYsK0dBQStHO0FBQy9HLG1JQUFtSTtBQUNuSSx5SUFBeUk7QUFDekk7SUFDSSx3QkFBd0I7SUFDeEIsK01BQStNO0lBQy9NLDRIQUE0SDtJQUM1SCxXQUFXO0lBQ1gsOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksNEVBQTRFO0FBQ2hGOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLHVIQUF1SDtBQUMzSDs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSx1SEFBdUg7QUFDM0g7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksa0hBQWtIO0FBQ3RIOztBQUVBLG9HQUFvRztBQUNwRzs7O0lBR0ksd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdIQUFnSDtBQUNwSDs7QUFFQTtJQUNJLGdIQUFnSDtJQUNoSCxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0hBQWdIO0FBQ3BIOztBQUVBOzs7SUFHSSw0QkFBNEI7QUFDaEM7O0FBRUE7O0lBRUksWUFBWTtJQUNaLHNCQUFzQjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcXHJcXG4gICBVc2UgIWltcG9ydGFudCBzbyBwYWdlIHN0eWxlcyAoZS5nLiBkaXNwbGF5OiB0YWJsZSkgZG8gbm90IG92ZXJyaWRlIHRoZSBncmlkIGxheW91dC4gKi9cXHJcXG5cXHJcXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGg6IHNwYWNlIGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgc28gaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgbGFzdCBjb2x1bW4gKHNldCB0byAwIHRvIGFsbG93IG92ZXJsYXApICovXFxyXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcXHJcXG4gICAgZGlzcGxheTogZ3JpZCAhaW1wb3J0YW50O1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xcclxcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XFxyXFxufVxcclxcblxcclxcbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcclxcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcXHJcXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcXHJcXG4gICAgbWluLWhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCA+IHRyIHtcXHJcXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxyXFxuICAgIG1pbi13aWR0aDogMDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XHJcblxyXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcclxuY29uc3QgQ0xBU1NfVEFCTEUgPSAnYXB4LXNjcm9sbGFibGUtdGFibGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcclxuXHJcbmNvbnN0IFRIUk9UVExFX01TID0gMTY7XHJcblxyXG4vKiogQHR5cGUge1NldDxIVE1MVGFibGVFbGVtZW50Pn0gKi9cclxuY29uc3QgZHluYW1pY1RhYmxlcyA9IG5ldyBTZXQoKTtcclxuLyoqIEB0eXBlIHtNYXA8RWxlbWVudCwgU2V0PEhUTUxUYWJsZUVsZW1lbnQ+Pn0gKi9cclxuY29uc3Qgc2Nyb2xsU291cmNlVG9UYWJsZXMgPSBuZXcgTWFwKCk7XHJcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXHJcbmNvbnN0IHJlc2l6ZVNvdXJjZVRvVGFibGVzID0gbmV3IE1hcCgpO1xyXG4vKiogQHR5cGUge2Jvb2xlYW59ICovXHJcbmxldCByZXNpemVXaW5kb3dBdHRhY2hlZCA9IGZhbHNlO1xyXG4vKiogQHR5cGUge1Jlc2l6ZU9ic2VydmVyfG51bGx9ICovXHJcbmxldCByZXNpemVPYnNlcnZlciA9IG51bGw7XHJcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xyXG5sZXQgdGhyb3R0bGVMYXN0ID0gMDtcclxuLyoqIEB0eXBlIHtudW1iZXJ8bnVsbH0gKi9cclxubGV0IHRocm90dGxlUmFmID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBTdW0gb2YgY29sc3BhbnMgZm9yIG9uZSByb3cgKGRpcmVjdCB0aC90ZCBjaGlsZHJlbiBvZiB0cikuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlUm93RWxlbWVudH0gdHJcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFJvd0NvbHVtbkNvdW50KHRyKSB7XHJcbiAgICBsZXQgY29scyA9IDA7XHJcbiAgICB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcbiAgICAgICAgY29scyArPSBwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgbWF4aW11bSBjb2x1bW4gY291bnQgaW4gYSBzZWN0aW9uIChtYXggc3VtIG9mIGNvbHNwYW5zIGFjcm9zcyBhbGwgcm93cykuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb24gLSB0aGVhZCwgdGJvZHksIG9yIHRmb290XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHNlY3Rpb24pIHtcclxuICAgIGlmICghc2VjdGlvbikgcmV0dXJuIDA7XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgbGV0IG1heENvbHMgPSAwO1xyXG4gICAgcm93cy5mb3JFYWNoKCh0cikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1bSA9IGdldFJvd0NvbHVtbkNvdW50KHRyKTtcclxuICAgICAgICBpZiAoc3VtID4gbWF4Q29scykgbWF4Q29scyA9IHN1bTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1heENvbHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdG90YWwgY29sdW1uIGNvdW50IGZvciB0aGUgdGFibGUgKG1heCBhY3Jvc3MgdGhlYWQsIHRib2R5LCB0Zm9vdCkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuICAgIGNvbnN0IGNvdW50VGhlYWQgPSB0aGVhZCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGhlYWQpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGJvZHkgPSB0Ym9keSA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGJvZHkpIDogMDtcclxuICAgIGNvbnN0IGNvdW50VGZvb3QgPSB0Zm9vdCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGZvb3QpIDogMDtcclxuICAgIHJldHVybiBNYXRoLm1heChjb3VudFRoZWFkLCBjb3VudFRib2R5LCBjb3VudFRmb290LCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE1lYXN1cmUgY3VycmVudCBjb2x1bW4gd2lkdGhzIGZyb20gdGhlIHRhYmxlIGluIGl0cyBuYXR1cmFsIGxheW91dCAoYmVmb3JlIGFwcGx5aW5nIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBQcmVmZXJzIGEgcm93IHdoZXJlIGVhY2ggY2VsbCBoYXMgY29sc3BhbiAxIHNvIHdlIGdldCBvbmUgd2lkdGggcGVyIGNvbHVtbjsgb3RoZXJ3aXNlIHNwbGl0cyBjZWxsIHdpZHRocyBieSBjb2xzcGFuLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlIC0gdGFibGUgbm90IHlldCB3aXRoIHNjcm9sbGFibGUgY2xhc3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge251bWJlcltdfSBwaXhlbCB3aWR0aHMgcGVyIGNvbHVtblxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykge1xyXG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbdGhlYWQsIHRib2R5XS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR8bnVsbH0gKi9cclxuICAgIGxldCBiZXN0Um93ID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCB0ciBvZiByb3dzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICAgICAgICAgIGlmIChnZXRSb3dDb2x1bW5Db3VudCh0cikgIT09IG51bUNvbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxTaW5nbGUgPSBBcnJheS5mcm9tKGNlbGxzKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSk7XHJcbiAgICAgICAgICAgIGlmIChhbGxTaW5nbGUgJiYgY2VsbHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBiZXN0Um93ID0gdHI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWJlc3RSb3cpIGJlc3RSb3cgPSB0cjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJlc3RSb3cgJiYgQXJyYXkuZnJvbShiZXN0Um93LnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpKS5ldmVyeSgoYykgPT4gKHBhcnNlSW50KGMuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxKSA9PT0gMSkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgaWYgKCFiZXN0Um93KSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3Qgd2lkdGhzID0gbmV3IEFycmF5KG51bUNvbHMpLmZpbGwoMCk7XHJcbiAgICBjb25zdCBjZWxscyA9IGJlc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICBsZXQgY29sID0gMDtcclxuICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSwgbnVtQ29scyAtIGNvbCk7XHJcbiAgICAgICAgaWYgKHNwYW4gPD0gMCkgYnJlYWs7XHJcbiAgICAgICAgY29uc3QgdyA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICAgICAgY29uc3QgcGVyQ29sID0gdyAvIHNwYW47XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFuOyBpKyspIHdpZHRoc1tjb2wgKyBpXSA9IHBlckNvbDtcclxuICAgICAgICBjb2wgKz0gc3BhbjtcclxuICAgIH1cclxuICAgIGlmIChjb2wgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGZhbGxiYWNrID0gd2lkdGhzLnNvbWUoKHcpID0+IHcgPiAwKSA/IE1hdGgubWF4KDgwLCAuLi53aWR0aHMuZmlsdGVyKCh3KSA9PiB3ID4gMCkpIC8gMiA6IDgwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIGlmICh3aWR0aHNbaV0gPD0gMCkgd2lkdGhzW2ldID0gZmFsbGJhY2s7XHJcbiAgICByZXR1cm4gd2lkdGhzLnNsaWNlKDAsIG51bUNvbHMpO1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnQgZGlyZWN0IHRyIGNoaWxkcmVuIGluIGEgc2VjdGlvbi5cclxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvblxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Um93Q291bnQoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gMDtcclxuICAgIHJldHVybiBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJykubGVuZ3RoO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgYSAyRCBncmlkIG9mIG9jY3VwaWVkIHNsb3RzIGZvciBhIHNlY3Rpb24gKGZvciByb3dzcGFuL2NvbHNwYW4gcGxhY2VtZW50KS5cclxuICogUGxhY2UgZWFjaCBjZWxsIGluIERPTSBvcmRlcjsgcmV0dXJuIGEgbGlzdCBvZiB7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0uXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IG51bVJvd3NcclxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcclxuICogQHJldHVybnMge3sgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgY29sc3BhbjogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIgfVtdfVxyXG4gKi9cclxuZnVuY3Rpb24gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIG51bVJvd3MsIG51bUNvbHMpIHtcclxuICAgIGlmICghc2VjdGlvbiB8fCBudW1Sb3dzID09PSAwIHx8IG51bUNvbHMgPT09IDApIHJldHVybiBbXTtcclxuICAgIGNvbnN0IG9jY3VwaWVkID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtUm93cyB9LCAoKSA9PiBBcnJheShudW1Db2xzKS5maWxsKGZhbHNlKSk7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG5cclxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgIGNvbnN0IHRyID0gcm93c1tyXTtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRoLCA6c2NvcGUgPiB0ZCcpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xyXG4gICAgICAgICAgICBjb25zdCBjb2xzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDEsIG51bUNvbHMpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dzcGFuID0gTWF0aC5taW4ocGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSwgMTApIHx8IDEsIG51bVJvd3MgLSByKTtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb2wgPCBudW1Db2xzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnJlZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW4gJiYgZnJlZTsgcnIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNjID0gY29sOyBjYyA8IGNvbCArIGNvbHNwYW4gJiYgZnJlZTsgY2MrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdPy5bY2NdKSBmcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZyZWUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY29sKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNvbCArIGNvbHNwYW4gPiBudW1Db2xzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcnIgPSByOyByciA8IHIgKyByb3dzcGFuOyBycisrKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYyA9IGNvbDsgY2MgPCBjb2wgKyBjb2xzcGFuOyBjYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9jY3VwaWVkW3JyXSkgb2NjdXBpZWRbcnJdW2NjXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGxhY2VtZW50cy5wdXNoKHsgY2VsbCwgcm93OiByLCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBsYWNlbWVudHM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBseSBncmlkIHBsYWNlbWVudCBzdHlsZXMgdG8gYSBsaXN0IG9mIHBsYWNlbWVudHMgKDEtYmFzZWQgbGluZSBudW1iZXJzIGZvciBDU1MgR3JpZCkuXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVBsYWNlbWVudHMocGxhY2VtZW50cykge1xyXG4gICAgcGxhY2VtZW50cy5mb3JFYWNoKCh7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0pID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSBgJHtyb3cgKyAxfSAvIHNwYW4gJHtyb3dzcGFufWA7XHJcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkQ29sdW1uID0gYCR7Y29sICsgMX0gLyBzcGFuICR7Y29sc3Bhbn1gO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGVhciBncmlkIHBsYWNlbWVudCBzdHlsZXMgZnJvbSBhbGwgdGgvdGQgaW4gYSB0YWJsZSAoZm9yIHJlZnJlc2gpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhclBsYWNlbWVudHModGFibGUpIHtcclxuICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLCB0ZCcpLmZvckVhY2goKGNlbGwpID0+IHtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSAnJztcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSAnJztcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIGhlaWdodC9tYXhIZWlnaHQgb3B0aW9uIHRvIGEgQ1NTIGxlbmd0aCBzdHJpbmcuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWVcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSkge1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBERUZBVUxUX01BWF9IRUlHSFQ7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBjdXJyZW50IGJvZHkgaGVpZ2h0IGZyb20gb3B0aW9uczogZWl0aGVyIGJvZHlIZWlnaHREeW5hbWljLmdldCh0YWJsZSkgb3Igc3RhdGljIGhlaWdodC9tYXhIZWlnaHQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKG1heSBpbmNsdWRlIGJvZHlIZWlnaHREeW5hbWljLCBoZWlnaHQsIG1heEhlaWdodClcclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcmV0dXJucyB7eyBib2R5U2l6ZTogc3RyaW5nLCB1c2VGaXhlZEhlaWdodDogYm9vbGVhbiB9fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZUJvZHlIZWlnaHQob3B0aW9ucywgdGFibGUpIHtcclxuICAgIGNvbnN0IGR5biA9IG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWM7XHJcbiAgICBpZiAoZHluICYmIHR5cGVvZiBkeW4uZ2V0ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkeW4uZ2V0KHRhYmxlKTtcclxuICAgICAgICBjb25zdCBib2R5U2l6ZSA9IG5vcm1hbGl6ZUhlaWdodCh2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBkeW4udXNlQXMgPT09ICdoZWlnaHQnO1xyXG4gICAgICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBvcHRpb25zLmhlaWdodCAhPSBudWxsO1xyXG4gICAgY29uc3QgcmF3ID0gdXNlRml4ZWRIZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IG9wdGlvbnMubWF4SGVpZ2h0O1xyXG4gICAgY29uc3QgYm9keVNpemUgPSBub3JtYWxpemVIZWlnaHQocmF3KTtcclxuICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIG9ubHkgdGhlIHRib2R5IGhlaWdodCBDU1MgdmFyaWFibGUgYW5kIGNsYXNzICh1c2VkIG9uIHNjcm9sbC9yZXNpemUgZm9yIGR5bmFtaWMgaGVpZ2h0KS5cclxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKHdpdGggcmVmLm9wdGlvbnMgd2hlbiBjYWxsZWQgZnJvbSB0aHJvdHRsZSlcclxuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVRhYmxlQm9keUhlaWdodCh0YWJsZSwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJ1biBsYXp5IGNsZWFudXAgdGhlbiB1cGRhdGVUYWJsZUJvZHlIZWlnaHQgZm9yIGFsbCB0YWJsZXMgc3RpbGwgaW4gZHluYW1pY1RhYmxlcy4gKENhbGxlZCBieSB0aHJvdHRsZWQgZW50cnkgcG9pbnQgb3IgUkFGLilcclxuICovXHJcbmZ1bmN0aW9uIGZsdXNoRHluYW1pY0hlaWdodFVwZGF0ZSgpIHtcclxuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICBkeW5hbWljVGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0YWJsZS5pc0Nvbm5lY3RlZCkgdG9SZW1vdmUucHVzaCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIHRvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSkpO1xyXG4gICAgZHluYW1pY1RhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcclxuICAgICAgICBpZiAocmVmPy5vcHRpb25zKSB1cGRhdGVUYWJsZUJvZHlIZWlnaHQodGFibGUsIHJlZi5vcHRpb25zKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogVGhyb3R0bGVkIGVudHJ5OiBydW4gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlIG5vdyBvciBzY2hlZHVsZSB3aXRoIFJBRi5cclxuICovXHJcbmZ1bmN0aW9uIHJ1bkR5bmFtaWNIZWlnaHRVcGRhdGUoKSB7XHJcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgaWYgKG5vdyAtIHRocm90dGxlTGFzdCA8IFRIUk9UVExFX01TKSB7XHJcbiAgICAgICAgaWYgKCF0aHJvdHRsZVJhZikge1xyXG4gICAgICAgICAgICB0aHJvdHRsZVJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZVJhZiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aHJvdHRsZUxhc3QgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aHJvdHRsZUxhc3QgPSBub3c7XHJcbiAgICBmbHVzaER5bmFtaWNIZWlnaHRVcGRhdGUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgdXBkYXRlT24gaW50byBzY3JvbGwgdGFyZ2V0cyAoRWxlbWVudFtdKSBhbmQgcmVzaXplOiB7IHdpbmRvdzogYm9vbGVhbiwgZWxlbWVudHM6IEVsZW1lbnRbXSB9LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMuYm9keUhlaWdodER5bmFtaWMudXBkYXRlT25cclxuICogQHJldHVybnMge3sgc2Nyb2xsVGFyZ2V0czogRWxlbWVudFtdLCByZXNpemVXaW5kb3c6IGJvb2xlYW4sIHJlc2l6ZUVsZW1lbnRzOiBFbGVtZW50W10gfX1cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVVcGRhdGVPbihvcHRpb25zKSB7XHJcbiAgICBjb25zdCB1ID0gb3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWM/LnVwZGF0ZU9uO1xyXG4gICAgY29uc3Qgc2Nyb2xsT24gPSB1Py5zY3JvbGxPbjtcclxuICAgIGNvbnN0IHJlc2l6ZU9uID0gdT8ucmVzaXplT247XHJcbiAgICBjb25zdCBzY3JvbGxUYXJnZXRzID0gW107XHJcbiAgICBpZiAoc2Nyb2xsT24gIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHNjcm9sbE9uKSAmJiBzY3JvbGxPbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2Nyb2xsT24uZm9yRWFjaCgoeCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2RvY3VtZW50Jykgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHggJiYgdHlwZW9mIHguYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgc2Nyb2xsVGFyZ2V0cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5zY3JvbGwgPT09IHRydWUpIHtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2goZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcclxuICAgICAgICBzY3JvbGxUYXJnZXRzLnB1c2godHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc2l6ZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzaXplRWxlbWVudHMgPSBbXTtcclxuICAgIGlmIChyZXNpemVPbiAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzaXplT24pICYmIHJlc2l6ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXNpemVPbi5mb3JFYWNoKCh4KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh4ID09PSAnd2luZG93JykgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXNpemVFbGVtZW50cy5wdXNoKHgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh1Py5yZXNpemUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICByZXNpemVFbGVtZW50cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGFibGUgZnJvbSBkeW5hbWljVGFibGVzIGFuZCBmcm9tIGFsbCBzY3JvbGwvcmVzaXplIE1hcHM7IGRldGFjaCBsaXN0ZW5lcnMgaWYgU2V0IGJlY29tZXMgZW1wdHkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICovXHJcbmZ1bmN0aW9uIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKSB7XHJcbiAgICBkeW5hbWljVGFibGVzLmRlbGV0ZSh0YWJsZSk7XHJcbiAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XHJcbiAgICAgICAgc2V0LmRlbGV0ZSh0YWJsZSk7XHJcbiAgICAgICAgaWYgKHNldC5zaXplID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XHJcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsVGhyb3R0bGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLmZvckVhY2goKHNldCwgZWwpID0+IHtcclxuICAgICAgICBzZXQuZGVsZXRlKHRhYmxlKTtcclxuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgcmVzaXplU291cmNlVG9UYWJsZXMuZGVsZXRlKGVsKTtcclxuICAgICAgICAgICAgaWYgKHJlc2l6ZU9ic2VydmVyKSByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHJlc2l6ZVdpbmRvd0F0dGFjaGVkICYmIGR5bmFtaWNUYWJsZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZVRocm90dGxlZCk7XHJcbiAgICAgICAgcmVzaXplV2luZG93QXR0YWNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25TY3JvbGxUaHJvdHRsZWQoKSB7XHJcbiAgICBydW5EeW5hbWljSGVpZ2h0VXBkYXRlKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9uUmVzaXplVGhyb3R0bGVkKCkge1xyXG4gICAgcnVuRHluYW1pY0hlaWdodFVwZGF0ZSgpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVnaXN0ZXIgYSB0YWJsZSB3aXRoIGJvZHlIZWlnaHREeW5hbWljOiBhZGQgdG8gU2V0IGFuZCBhdHRhY2ggc2Nyb2xsL3Jlc2l6ZSBsaXN0ZW5lcnMgcGVyIHVwZGF0ZU9uLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZnVsbCBvcHRpb25zIChyZWYub3B0aW9ucylcclxuICovXHJcbmZ1bmN0aW9uIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB7IHNjcm9sbFRhcmdldHMsIHJlc2l6ZVdpbmRvdywgcmVzaXplRWxlbWVudHMgfSA9IHJlc29sdmVVcGRhdGVPbihvcHRpb25zKTtcclxuICAgIGR5bmFtaWNUYWJsZXMuYWRkKHRhYmxlKTtcclxuICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gc2Nyb2xsU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGxUaHJvdHRsZWQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChyZXNpemVXaW5kb3cpIHtcclxuICAgICAgICBpZiAoIXJlc2l6ZVdpbmRvd0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgIHJlc2l6ZVdpbmRvd0F0dGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplVGhyb3R0bGVkLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVzaXplRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBsZXQgc2V0ID0gcmVzaXplU291cmNlVG9UYWJsZXMuZ2V0KGVsKTtcclxuICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLnNldChlbCwgc2V0KTtcclxuICAgICAgICAgICAgaWYgKCFyZXNpemVPYnNlcnZlcikgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemVUaHJvdHRsZWQpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0LmFkZCh0YWJsZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIGdyaWQtdGVtcGxhdGUtY29sdW1ucyBmcm9tIG1lYXN1cmVkIHdpZHRocyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciBjb2x1bW4uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Db2xzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IGNvbHVtbldpZHRoc1xyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBjb2x1bW5PdmVycmlkZXMgLSBtYXAgY29sdW1uIGluZGV4IOKGkiBDU1MgdmFsdWUgKGUuZy4gJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZUNvbHVtbnMobnVtQ29scywgY29sdW1uV2lkdGhzLCBjb2x1bW5PdmVycmlkZXMpIHtcclxuICAgIGlmICghY29sdW1uV2lkdGhzIHx8IGNvbHVtbldpZHRocy5sZW5ndGggIT09IG51bUNvbHMpIHJldHVybiAnJztcclxuICAgIGNvbnN0IGdldCA9IChpKSA9PlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29sdW1uT3ZlcnJpZGVzKSA/IGNvbHVtbk92ZXJyaWRlc1tpXSA6IGNvbHVtbk92ZXJyaWRlc1tpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKGNvbHVtbldpZHRoc1tpXSl9ZnJgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgZ3JpZC10ZW1wbGF0ZS1yb3dzIGZyb20gbWVhc3VyZWQgaGVpZ2h0cyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciByb3cuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1Sb3dzXHJcbiAqIEBwYXJhbSB7bnVtYmVyW119IHJvd0hlaWdodHNcclxuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gcm93T3ZlcnJpZGVzIC0gbWFwIHJvdyBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICc0OHB4JywgJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZVJvd3MobnVtUm93cywgcm93SGVpZ2h0cywgcm93T3ZlcnJpZGVzKSB7XHJcbiAgICBpZiAoIXJvd0hlaWdodHMgfHwgcm93SGVpZ2h0cy5sZW5ndGggPCBudW1Sb3dzKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCBnZXQgPSAoaSkgPT5cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJvd092ZXJyaWRlcykgPyByb3dPdmVycmlkZXNbaV0gOiByb3dPdmVycmlkZXM/LltpXTtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJvd3M7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IG92ID0gZ2V0KGkpO1xyXG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKG92LnRyaW0oKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKHJvd0hlaWdodHNbaV0gPz8gMCl9cHhgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG59XHJcblxyXG4vKipcclxuICogTWVhc3VyZSBlYWNoIHRyIGhlaWdodCBpbiBhIHNlY3Rpb24gKHRhYmxlIG11c3Qgbm90IHlldCBoYXZlIHNjcm9sbGFibGUgY2xhc3MpLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fG51bGx9IHNlY3Rpb25cclxuICogQHJldHVybnMge251bWJlcltdfVxyXG4gKi9cclxuZnVuY3Rpb24gbWVhc3VyZVJvd0hlaWdodHMoc2VjdGlvbikge1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gW107XHJcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm93cykubWFwKCh0cikgPT4gdHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHNjcm9sbGFibGUgdGFibGUgbGF5b3V0IHRvIGEgc2luZ2xlIHRhYmxlLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnNcclxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBbb3B0aW9ucy5tYXhIZWlnaHRdIC0gTWF4IGhlaWdodCBvZiB0Ym9keSAoZGVmYXVsdCAnMjAwcHgnKS4gSWdub3JlZCB3aGVuIGhlaWdodCBvciBib2R5SGVpZ2h0RHluYW1pYyBpcyBzZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaGVpZ2h0XSAtIEZpeGVkIGhlaWdodCBvZiB0Ym9keS4gSWdub3JlZCB3aGVuIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cclxuICogQHBhcmFtIHt7IGdldDogKGZ1bmN0aW9uKEhUTUxUYWJsZUVsZW1lbnQpOiBudW1iZXJ8c3RyaW5nKSwgdXNlQXM6ICdoZWlnaHQnfCdtYXhIZWlnaHQnLCB1cGRhdGVPbj86IHsgc2Nyb2xsPzogYm9vbGVhbiwgcmVzaXplPzogYm9vbGVhbiwgc2Nyb2xsT24/OiAoJ2RvY3VtZW50J3xFbGVtZW50KVtdLCByZXNpemVPbj86ICgnd2luZG93J3xFbGVtZW50KVtdIH0gfX0gW29wdGlvbnMuYm9keUhlaWdodER5bmFtaWNdIC0gV2hlbiBzZXQsIGJvZHkgc2l6ZSBpcyBjb21wdXRlZCBieSBnZXQodGFibGUpIGFuZCByZS1hcHBsaWVkIHdoZW4gc2Nyb2xsL3Jlc2l6ZSBzb3VyY2VzIGZpcmUuIHVwZGF0ZU9uOiBzY3JvbGxPbi9yZXNpemVPbiBsaXN0IGVsZW1lbnRzIChzZW50aW5lbHMgJ2RvY3VtZW50Jy8nd2luZG93Jyk7IG9yIHVzZSBzY3JvbGwgKGRlZmF1bHQgZmFsc2UpIC8gcmVzaXplIChkZWZhdWx0IHRydWUpIGJvb2xlYW5zLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1uc11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogc3RyaW5nLCB0Ym9keT86IHN0cmluZywgdGZvb3Q/OiBzdHJpbmcgfX0gW29wdGlvbnMuZ3JpZFRlbXBsYXRlUm93c11cclxuICogQHBhcmFtIHt7IHRoZWFkPzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRib2R5PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10sIHRmb290PzogT2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW10gfX0gW29wdGlvbnMucm93T3ZlcnJpZGVzXVxyXG4gKiBAcGFyYW0ge09iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdfSBbb3B0aW9ucy5jb2x1bW5PdmVycmlkZXNdXHJcbiAqIEBwYXJhbSB7eyBjb2x1bW5XaWR0aHM/OiBudW1iZXJbXSwgcm93SGVpZ2h0cz86IHsgdGhlYWQ/OiBudW1iZXJbXSwgdGJvZHk/OiBudW1iZXJbXSwgdGZvb3Q/OiBudW1iZXJbXSB9IH0gfCB1bmRlZmluZWR9IHJlZiAtIGV4aXN0aW5nIHJlZiB3aGVuIHJlZnJlc2hpbmdcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCByZWYpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcclxuXHJcbiAgICBjb25zdCBudW1Db2xzID0gZ2V0VGFibGVDb2x1bW5Db3VudCh0YWJsZSk7XHJcbiAgICBpZiAobnVtQ29scyA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFscmVhZHlTY3JvbGxhYmxlID0gdGFibGUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX1RBQkxFKTtcclxuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdHlwZW9mIG9wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKS5sZW5ndGggPiAwO1xyXG4gICAgY29uc3QgY29sdW1uV2lkdGhzID0gY3VzdG9tVGVtcGxhdGVcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IChyZWY/LmNvbHVtbldpZHRocyA/PyAoYWxyZWFkeVNjcm9sbGFibGUgPyBudWxsIDogbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykpKTtcclxuXHJcbiAgICBjb25zdCB0aGVhZFJvd3MgPSBnZXRSb3dDb3VudCh0aGVhZCk7XHJcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XHJcbiAgICBjb25zdCB0Zm9vdFJvd3MgPSBnZXRSb3dDb3VudCh0Zm9vdCk7XHJcblxyXG4gICAgY29uc3Qgcm93SGVpZ2h0cyA9XHJcbiAgICAgICAgcmVmPy5yb3dIZWlnaHRzID8/XHJcbiAgICAgICAgKGFscmVhZHlTY3JvbGxhYmxlXHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IHtcclxuICAgICAgICAgICAgICAgICAgdGhlYWQ6IG1lYXN1cmVSb3dIZWlnaHRzKHRoZWFkKSxcclxuICAgICAgICAgICAgICAgICAgdGJvZHk6IG1lYXN1cmVSb3dIZWlnaHRzKHRib2R5KSxcclxuICAgICAgICAgICAgICAgICAgdGZvb3Q6IG1lYXN1cmVSb3dIZWlnaHRzKHRmb290KVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWNvbHMnLCBTdHJpbmcobnVtQ29scykpO1xyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGhlYWQtcm93cycsIFN0cmluZyhNYXRoLm1heCgxLCB0aGVhZFJvd3MpKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRib2R5Um93cykpKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MnLCBTdHJpbmcoTWF0aC5tYXgoMSwgdGZvb3RSb3dzKSkpO1xyXG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1ib2R5LWhlaWdodCcsIHVzZUZpeGVkSGVpZ2h0KTtcclxuXHJcbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QnLCAhISh0Zm9vdCAmJiB0Zm9vdFJvd3MgPiAwKSk7XHJcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQnLCAhKHRoZWFkICYmIHRoZWFkUm93cyA+IDApKTtcclxuXHJcbiAgICAvLyBGb3JjZSByZWZsb3cgc28gdGhlIGdyaWQgbGF5b3V0IGlzIGVzdGFibGlzaGVkIGJlZm9yZSBzZXR0aW5nIG1lYXN1cmVkIHRlbXBsYXRlLWNvbHVtbnMuXHJcbiAgICAvLyBXaXRob3V0IHRoaXMsIHRoZSBicm93c2VyIGJhdGNoZXMgY2xhc3MgKyB0ZW1wbGF0ZSBpbnRvIG9uZSBwYXNzIGFuZCB0aGUgdGJvZHkgb3ZlcmZsb3dzIGhvcml6b250YWxseS5cclxuICAgIHRhYmxlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcclxuXHJcbiAgICBjb25zdCBndXR0ZXJTdWZmaXggPSAnIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSc7XHJcbiAgICBpZiAoY3VzdG9tVGVtcGxhdGUpIHtcclxuICAgICAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zJywgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKSArIGd1dHRlclN1ZmZpeCk7XHJcbiAgICB9IGVsc2UgaWYgKGNvbHVtbldpZHRocyAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID09PSBudW1Db2xzKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPVxyXG4gICAgICAgICAgICBvcHRpb25zLmNvbHVtbk92ZXJyaWRlcyAhPSBudWxsXHJcbiAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgb3B0aW9ucy5jb2x1bW5PdmVycmlkZXMpXHJcbiAgICAgICAgICAgICAgICA6IGNvbHVtbldpZHRocy5tYXAoKHcpID0+IGAke01hdGgucm91bmQodyl9ZnJgKS5qb2luKCcgJyk7XHJcbiAgICAgICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycsIHRlbXBsYXRlICsgZ3V0dGVyU3VmZml4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFibGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUGxhY2VtZW50cyh0YWJsZSk7XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBbXHJcbiAgICAgICAgeyBzZWN0aW9uOiB0aGVhZCwgcm93czogTWF0aC5tYXgoMSwgdGhlYWRSb3dzKSwgaGVpZ2h0czogcm93SGVpZ2h0cz8udGhlYWQsIGtleTogJ3RoZWFkJyB9LFxyXG4gICAgICAgIHsgc2VjdGlvbjogdGJvZHksIHJvd3M6IE1hdGgubWF4KDEsIHRib2R5Um93cyksIGhlaWdodHM6IHJvd0hlaWdodHM/LnRib2R5LCBrZXk6ICd0Ym9keScgfSxcclxuICAgICAgICB7IHNlY3Rpb246IHRmb290LCByb3dzOiBNYXRoLm1heCgxLCB0Zm9vdFJvd3MpLCBoZWlnaHRzOiByb3dIZWlnaHRzPy50Zm9vdCwga2V5OiAndGZvb3QnIH1cclxuICAgIF07XHJcbiAgICBjb25zdCBjdXN0b21Sb3dzID0gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzICYmIHR5cGVvZiBvcHRpb25zLmdyaWRUZW1wbGF0ZVJvd3MgPT09ICdvYmplY3QnID8gb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzIDogbnVsbDtcclxuICAgIGNvbnN0IHJvd092ZXJyaWRlcyA9IG9wdGlvbnMucm93T3ZlcnJpZGVzICYmIHR5cGVvZiBvcHRpb25zLnJvd092ZXJyaWRlcyA9PT0gJ29iamVjdCcgPyBvcHRpb25zLnJvd092ZXJyaWRlcyA6IG51bGw7XHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKCh7IHNlY3Rpb24sIHJvd3MsIGhlaWdodHMsIGtleSB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCFzZWN0aW9uKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdmFyTmFtZSA9IGAtLWFweC1zY3JvbGxhYmxlLSR7a2V5fS10ZW1wbGF0ZS1yb3dzYDtcclxuICAgICAgICBjb25zdCBjdXN0b20gPSBjdXN0b21Sb3dzPy5ba2V5XTtcclxuICAgICAgICBjb25zdCBvdmVycmlkZXMgPSByb3dPdmVycmlkZXM/LltrZXldO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tID09PSAnc3RyaW5nJyAmJiBjdXN0b20udHJpbSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCBjdXN0b20udHJpbSgpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGhlaWdodHMgJiYgaGVpZ2h0cy5sZW5ndGggPj0gcm93cykge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9XHJcbiAgICAgICAgICAgICAgICBvdmVycmlkZXMgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgID8gYnVpbGRUZW1wbGF0ZVJvd3Mocm93cywgaGVpZ2h0cy5zbGljZSgwLCByb3dzKSwgb3ZlcnJpZGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIDogaGVpZ2h0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCByb3dzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGgpID0+IGAke01hdGgucm91bmQoaCl9cHhgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlY3Rpb24uc3R5bGUucmVtb3ZlUHJvcGVydHkodmFyTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgcm93cywgbnVtQ29scyk7XHJcbiAgICAgICAgYXBwbHlQbGFjZW1lbnRzKHBsYWNlbWVudHMpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgY29sdW1uV2lkdGhzLCByb3dIZWlnaHRzIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBdWdtZW50cyB0aGUgQVBYIG9iamVjdCB3aXRoIHNjcm9sbGFibGVUYWJsZShvcHRpb25zIHwgJ3JlZnJlc2gnKS5cclxuICogTWFrZXMgdGhlIHRib2R5IG9mIGEgdGFibGUgc2Nyb2xsYWJsZSB3aGlsZSBrZWVwaW5nIHRoZWFkL3Rmb290IGZpeGVkIGFuZCBjb2x1bW5zIGFsaWduZWQgKENTUyBHcmlkICsgc3ViZ3JpZCkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcHggLSBUaGUgQVBYIG9iamVjdCB0byBhdWdtZW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSh7IG1heEhlaWdodDogMzAwIH0pO1xyXG4gKiBBUFgoJ3RhYmxlLmRhdGEtZ3JpZCcpLnNjcm9sbGFibGVUYWJsZSgncmVmcmVzaCcpO1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUoYXB4KSB7XHJcbiAgICBhcHguc2Nyb2xsYWJsZVRhYmxlID0gZnVuY3Rpb24gKG9wdGlvbnNPckFjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaCA9IG9wdGlvbnNPckFjdGlvbiA9PT0gJ3JlZnJlc2gnO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpc1JlZnJlc2ggPyBudWxsIDogKG9wdGlvbnNPckFjdGlvbiAmJiB0eXBlb2Ygb3B0aW9uc09yQWN0aW9uID09PSAnb2JqZWN0JyA/IG9wdGlvbnNPckFjdGlvbiA6IHt9KTtcclxuXHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gJ1RBQkxFJykgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IC8qKiBAdHlwZSB7SFRNTFRhYmxlRWxlbWVudH0gKi8gKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVmID0gdGFibGVbREFUQV9LRVldO1xyXG4gICAgICAgICAgICBpZiAocmVmKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIHJlZi5vcHRpb25zLCByZWYpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZWYub3B0aW9ucyA9IHsgLi4ucmVmLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhcHBseVNjcm9sbGFibGVUYWJsZSh0YWJsZSwgcmVmLm9wdGlvbnMsIHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uY29sdW1uV2lkdGhzKSByZWYuY29sdW1uV2lkdGhzID0gcmVzdWx0LmNvbHVtbldpZHRocztcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5yb3dIZWlnaHRzKSByZWYucm93SGVpZ2h0cyA9IHJlc3VsdC5yb3dIZWlnaHRzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE9wdGlvbnMgPSByZWYub3B0aW9ucztcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBjdXJyZW50T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHJlbW92ZVRhYmxlRnJvbUR5bmFtaWNTb3VyY2VzKHRhYmxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0FQWCBzY3JvbGxhYmxlVGFibGVdIGNyZWF0ZScsIHRhYmxlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIG9wdGlvbnMsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIHRhYmxlW0RBVEFfS0VZXSA9IHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9LFxyXG4gICAgICAgICAgICAgICAgY29sdW1uV2lkdGhzOiByZXN1bHQ/LmNvbHVtbldpZHRocyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICByb3dIZWlnaHRzOiByZXN1bHQ/LnJvd0hlaWdodHMgfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5ib2R5SGVpZ2h0RHluYW1pYykgcmVnaXN0ZXJEeW5hbWljVGFibGUodGFibGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYXB4O1xyXG4gICAgfTtcclxufVxyXG4iLCIvLyBNaW5pbWFsLCBmcmFtZXdvcmstYWdub3N0aWMgVG9hc3RNYW5hZ2VyIGZvciBBUFhcclxuLy8gRVNNLWZpcnN0LCBubyBzaWRlIGVmZmVjdHMgb24gaW1wb3J0LiBET00gb25seSB3aGVuIHVzZWQuXHJcbmltcG9ydCAnLi9jc3MvdG9hc3QuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3NpdGlvbk9iamVjdFxyXG4gKiBAcHJvcGVydHkgeydzdGlja3knfCdyZWxhdGl2ZSd8J2FuY2hvcmVkJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt5XVxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBbZWxlbWVudF1cclxuICogQHByb3BlcnR5IHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnYWJvdmUnfCdiZWxvdyd8J2JlZm9yZSd8J2FmdGVyJ30gW3BsYWNlbWVudF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZU5hdGl2ZUNTU11cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3N0cmluZ3xQb3NpdGlvbk9iamVjdH0gUG9zaXRpb25cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RDb25maWdcclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhUb2FzdHNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVmYXVsdER1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbekluZGV4XVxyXG4gKiBAcHJvcGVydHkgeydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBbYXJpYUxpdmVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWR1cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29udGFpbmVyQ2xhc3NdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfX0gW3Byb2dyZXNzXSBEZWZhdWx0OiBmYWxzZS4gU2hvdyBwcm9ncmVzcyBiYXIgd2hlbiB0cnVlIG9yIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScgfS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3tlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b246IGJvb2xlYW59fSBQcm9ncmVzc09wdFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdE9wdGlvbnNcclxuICogQHByb3BlcnR5IHtzdHJpbmd8Tm9kZX0gbWVzc2FnZVxyXG4gKiBAcHJvcGVydHkgeydpbmZvJ3wnc3VjY2Vzcyd8J3dhcm5pbmcnfCdkYW5nZXInfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzaWJsZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWR9IFtvbkNsaWNrXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCByZWFzb246ICd0aW1lb3V0J3wnY2xvc2UnfCdhcGknfCdvdmVyZmxvdycpID0+IHZvaWR9IFtvbkNsb3NlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b24/OiBib29sZWFufX0gW3Byb2dyZXNzXSBTaG93IHByb2dyZXNzIGJhcjogdHJ1ZSA9IHRvcCwgb3IgeyBlbmFibGUsIHBvc2l0aW9uLCBwYXVzZUJ1dHRvbiB9IChwYXVzZUJ1dHRvbiBkZWZhdWx0IGZhbHNlKS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RSZWZcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86ICdhcGknfCdjbG9zZScpID0+IHZvaWR9IGNsb3NlXHJcbiAqIEBwcm9wZXJ0eSB7KHBhcnRpYWw6IFBhcnRpYWw8VG9hc3RPcHRpb25zPikgPT4gdm9pZH0gdXBkYXRlXHJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2hlbkNsb3NlZFxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gKCkgPT4gdm9pZH0gb25cclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWR9IG9mZlxyXG4gKi9cclxuXHJcbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XHJcblxyXG4vLyBTaGFyZWQgY29udGFpbmVyIGNhY2hlOiBNYXA8cG9zaXRpb24sIEhUTUxFbGVtZW50PlxyXG4vLyBDb250YWluZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBtYW5hZ2VycyB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uXHJcbmNvbnN0IF9jb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEdhcmJhZ2UgY29sbGVjdGlvbjogY2xlYW51cCBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVycyBhZnRlciBhIGRlbGF5XHJcbmNvbnN0IEdDX0RFTEFZX01TID0gMjAwMDA7IC8vIDIwIHNlY29uZHNcclxubGV0IF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcblxyXG4vLyBXcmFwcGVyIGZvciBhbGwgdG9hc3QgY29udGFpbmVycyAoa2VlcHMgRE9NIGNsZWFuKVxyXG5sZXQgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogR2V0IG9yIGNyZWF0ZSB0aGUgdG9hc3QgY29udGFpbmVycyB3cmFwcGVyXHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VG9hc3RXcmFwcGVyKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLndpZHRoID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnpJbmRleCA9ICcxMDAwMCc7IC8vIEJlbG93IGNvbnRhaW5lcnMgYnV0IGFib3ZlIG1vc3QgY29udGVudFxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF90b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIF90b2FzdFdyYXBwZXI7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xyXG4gICAgcG9zaXRpb246ICdib3R0b20tcmlnaHQnLFxyXG4gICAgbWF4VG9hc3RzOiA1LFxyXG4gICAgZGVmYXVsdER1cmF0aW9uTXM6IDUwMDAsXHJcbiAgICB6SW5kZXg6IDExMDAwLFxyXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxyXG4gICAgZ2FwOiA4LFxyXG4gICAgZGVkdXBlOiBmYWxzZSxcclxuICAgIGNvbnRhaW5lckNsYXNzOiAnJyxcclxuICAgIG9mZnNldDogMCxcclxuICAgIHByb2dyZXNzOiBmYWxzZVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBlbGVtZW50IHdpdGggY2xhc3Nlc1xyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlRWwodGFnLCBjbGFzc05hbWVzKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcclxuICAgIGlmIChjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgY2xhc3NOYW1lcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGMgPT4gZWwuY2xhc3NMaXN0LmFkZChjKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWw7XHJcbn1cclxuXHJcbi8qKiBNaW5pbWFsIGxpbmUtYmFzZWQgcGF1c2UgKHR3byBiYXJzKSAvIHJlc3VtZSAodHJpYW5nbGUgcmlnaHQpIGljb24gU1ZHLiBVc2VzIGN1cnJlbnRDb2xvci4gKi9cclxuZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcocGF1c2VkKSB7XHJcbiAgICBpZiAocGF1c2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk04IDZMOCAxOEwxNyAxMlpcIi8+PC9zdmc+YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxsaW5lIHgxPVwiOVwiIHkxPVwiNlwiIHgyPVwiOVwiIHkyPVwiMThcIi8+PGxpbmUgeDE9XCIxNVwiIHkxPVwiNlwiIHgyPVwiMTVcIiB5Mj1cIjE4XCIvPjwvc3ZnPmA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW5kIGluc2VydCBwcm9ncmVzcyBibG9jayAodHJhY2sgKyBiYXIsIG9wdGlvbmFsIHBhdXNlIGJ1dHRvbikgaW50byB0b2FzdC4gQnV0dG9uIGlzIGZpeGVkIGF0IGxlZnQgdmlhIHRyYWNrIGxheW91dC5cclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0ge1Byb2dyZXNzT3B0fSBwcm9ncmVzc09wdFxyXG4gKiBAcmV0dXJucyB7eyB3cmFwOiBIVE1MRWxlbWVudCwgYmFyOiBIVE1MRWxlbWVudCwgcGF1c2VCdG46IEhUTUxFbGVtZW50fG51bGwgfX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgcHJvZ3Jlc3NPcHQpIHtcclxuICAgIGNvbnN0IHBvcyA9IHByb2dyZXNzT3B0LnBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2hvd1BhdXNlQnV0dG9uID0gcHJvZ3Jlc3NPcHQucGF1c2VCdXR0b24gPT09IHRydWU7XHJcbiAgICBjb25zdCB3cmFwID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3RfX3Byb2dyZXNzIEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdHJhY2sgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2snKTtcclxuICAgIGNvbnN0IGJhciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1iYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJvZ3Jlc3NiYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCAnMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsICcxMDAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVGVtcHMgcmVzdGFudCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgIGJhci5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7XHJcbiAgICB3cmFwLmFwcGVuZENoaWxkKHRyYWNrKTtcclxuICAgIGxldCBwYXVzZUJ0biA9IG51bGw7XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB7XHJcbiAgICAgICAgcGF1c2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCd0aXRsZScsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKGZhbHNlKTsgLy8gcnVubmluZyA9IHNob3cgcGF1c2UgaWNvblxyXG4gICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKHBhdXNlQnRuLCB0cmFjayk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zID09PSAndG9wJykge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNvbnRlbnRFbCk7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY2xvc2VCdG4pO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICByZXR1cm4geyB3cmFwLCBiYXIsIHBhdXNlQnRuIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgcHJvZ3Jlc3MgYmxvY2sgcG9zaXRpb24gKGNsYXNzZXMgKyBET00gb3JkZXIpXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcHJvZ3Jlc3NXcmFwXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7J3RvcCd8J2JvdHRvbSd9IHBvc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgcG9zKSB7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcsICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChwb3MgPT09ICd0b3AnID8gJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcgOiAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0X19wcm9ncmVzcy0tdG9wJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcG9zID09PSAndG9wJyA/IGNvbnRlbnRFbCA6IGNsb3NlQnRuO1xyXG4gICAgaWYgKHByb2dyZXNzV3JhcC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IHRhcmdldCkgdG9hc3RFbC5pbnNlcnRCZWZvcmUocHJvZ3Jlc3NXcmFwLCB0YXJnZXQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBwcm9ncmVzcyBvcHRpb24gZnJvbSBwZXItY2FsbCBvcHRpb24gYW5kIGNvbmZpZyBkZWZhdWx0XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gb3B0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gY29uZmlnRGVmYXVsdFxyXG4gKiBAcmV0dXJucyB7UHJvZ3Jlc3NPcHR9XHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvZ3Jlc3Mob3B0aW9uLCBjb25maWdEZWZhdWx0KSB7XHJcbiAgICBjb25zdCBmcm9tQ29uZmlnID0gY29uZmlnRGVmYXVsdCA9PT0gdHJ1ZVxyXG4gICAgICAgID8geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH1cclxuICAgICAgICA6IChjb25maWdEZWZhdWx0ICYmIHR5cGVvZiBjb25maWdEZWZhdWx0ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZTogISFjb25maWdEZWZhdWx0LmVuYWJsZSxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBjb25maWdEZWZhdWx0LnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICBwYXVzZUJ1dHRvbjogY29uZmlnRGVmYXVsdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogeyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9KTtcclxuICAgIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRpb24gPT09IG51bGwpIHJldHVybiBmcm9tQ29uZmlnO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZW5hYmxlOiAhIW9wdGlvbi5lbmFibGUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb24ucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgcGF1c2VCdXR0b246IG9wdGlvbi5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyB0byBDU1MgdmFsdWVzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZW1lbnRcclxuICogQHJldHVybnMgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGxhY2VtZW50KHBsYWNlbWVudCkge1xyXG4gICAgY29uc3Qgc3lub255bXMgPSB7XHJcbiAgICAgICAgJ2Fib3ZlJzogJ3RvcCcsXHJcbiAgICAgICAgJ2JlbG93JzogJ2JvdHRvbScsXHJcbiAgICAgICAgJ2JlZm9yZSc6ICdsZWZ0JyxcclxuICAgICAgICAnYWZ0ZXInOiAncmlnaHQnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bm9ueW1zW3BsYWNlbWVudF0gfHwgcGxhY2VtZW50O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGZsb3cgZGlyZWN0aW9uIGJhc2VkIG9uIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHsndXAnfCdkb3duJ31cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZUZsb3cocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uczogdG9wID0gdXAsIGJvdHRvbSA9IGRvd25cclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpKSByZXR1cm4gJ3VwJztcclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAvLyBTdGlja3k6IGRldGVybWluZSBiYXNlZCBvbiB5IGNvb3JkaW5hdGVcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBzdGFydHMgd2l0aCAnLScgb3IgaXMgYSBzbWFsbCB2YWx1ZSwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IGlzIGEgbGFyZ2UgdmFsdWUgb3IgcGVyY2VudGFnZSwgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlID0gZnJvbSBib3R0b20sIHNvIGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgeSA8IDUwJSBvZiB2aWV3cG9ydCBoZWlnaHQsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDUwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHB4IHZhbHVlcywgYXNzdW1lIDwgNDAwcHggaXMgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNDAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBBbmNob3JlZDogcGxhY2VtZW50IGRldGVybWluZXMgZmxvd1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYWJvdmUnKSByZXR1cm4gJ3VwJztcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnYmVsb3cnKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAvLyBGb3IgbGVmdC9yaWdodCwgZGVmYXVsdCB0byBkb3duXHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBkZXRlcm1pbmUgYmFzZWQgb24geSBvZmZzZXRcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHkgPSBhYm92ZSBlbGVtZW50ID0gZmxvdyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aXZlIHkgPSBiZWxvdyBlbGVtZW50ID0gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxufVxyXG5cclxuLyoqXHJcbiAqIEdhcmJhZ2UgY29sbGVjdGlvbjogcmVtb3ZlIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwRW1wdHlDb250YWluZXJzKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5BUFgtdG9hc3QtY29udGFpbmVyOm5vdChbZGF0YS1hcHgtdG9hc3QtbWFuYWdlZD1cInRydWVcIl0pJyk7XHJcbiAgICBjb250YWluZXJzLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgZW1wdHkgKG5vIHRvYXN0cylcclxuICAgICAgICBpZiAoY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB1cCB3cmFwcGVyIGlmIGl0J3MgZW1wdHkgKGFsbCBjb250YWluZXJzIHJlbW92ZWQpXHJcbiAgICBpZiAoX3RvYXN0V3JhcHBlciAmJiBfdG9hc3RXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCkge1xyXG4gICAgaWYgKF9nY1RpbWVvdXRJZCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChfZ2NUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgX2djVGltZW91dElkID0gc2V0VGltZW91dChjbGVhbnVwRW1wdHlDb250YWluZXJzLCBHQ19ERUxBWV9NUyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnRzKGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHNjcm9sbGFibGVzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kgKyBzdHlsZS5vdmVyZmxvd1g7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG92ZXJmbG93LmluY2x1ZGVzKCdzY3JvbGwnKSB8fCBvdmVyZmxvdy5pbmNsdWRlcygnYXV0bycpKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzY3JvbGxhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhc2ggYW4gZWxlbWVudCB0byBjcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllclxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzaEVsZW1lbnQoZWwpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHN0ciA9IGAke2VsLnRhZ05hbWV9XyR7cmVjdC5sZWZ0fV8ke3JlY3QudG9wfV8ke3JlY3Qud2lkdGh9XyR7cmVjdC5oZWlnaHR9YDtcclxuICAgIGxldCBoYXNoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemUgcG9zaXRpb24gb3B0aW9ucyBpbnRvIGEgdW5pcXVlIGtleVxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBzOiR7cG9zaXRpb259YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFR5cGUgKGRlZmF1bHQ6IHN0aWNreSBpZiB4L3kgcHJvdmlkZWQpXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKHR5cGUpIHBhcnRzLnB1c2goYHQ6JHt0eXBlfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvb3JkaW5hdGVzXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeDoke3Bvc2l0aW9uLnh9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeToke3Bvc2l0aW9uLnl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkOiB1c2UgZWxlbWVudCBJRCBvciBoYXNoXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkID0gcG9zaXRpb24uZWxlbWVudC5pZCB8fCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5lbGVtZW50LmRhdGFzZXQ/LmFweFRvYXN0QW5jaG9ySWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxfJHtoYXNoRWxlbWVudChwb3NpdGlvbi5lbGVtZW50KX1gO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbDoke2VsZW1lbnRJZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IGZvciBzZXJpYWxpemF0aW9uICh1c2UgQ1NTIHZhbHVlcylcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBwOiR7bm9ybWFsaXplZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmdhcCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGBnOiR7cG9zaXRpb24uZ2FwfWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MpIHBhcnRzLnB1c2goYG5hdGl2ZTp0cnVlYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGBvOiR7cGFydHMuam9pbignfCcpfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnczpib3R0b20tcmlnaHQnO1xyXG59XHJcblxyXG4vKipcclxuICogVG9hc3RNYW5hZ2VyIGNsYXNzXHJcbiAqL1xyXG5jbGFzcyBUb2FzdE1hbmFnZXIge1xyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWcgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RDb25maWd9ICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUb2FzdFJlZj59ICovXHJcbiAgICAgICAgdGhpcy5pZFRvUmVmID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZbXX0gKi9cclxuICAgICAgICB0aGlzLm9wZW4gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gY29uZmlnICovXHJcbiAgICBjb25maWd1cmUoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBtb2RlICovXHJcbiAgICBzZXRBcmlhTGl2ZShtb2RlKSB7IHRoaXMuY29uZmlndXJlKHsgYXJpYUxpdmU6IG1vZGUgfSk7IH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge1RvYXN0UmVmW119ICovXHJcbiAgICBnZXRPcGVuVG9hc3RzKCkgeyByZXR1cm4gdGhpcy5vcGVuLnNsaWNlKCk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIHNob3cob3B0cykge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKG51bGwpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMob3B0cyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWR1cGUgJiYgb3B0aW9ucy5pZCAmJiB0aGlzLmlkVG9SZWYuaGFzKG9wdGlvbnMuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRUb1JlZi5nZXQob3B0aW9ucy5pZCk7XHJcbiAgICAgICAgICAgIHJlZi51cGRhdGUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gYW5kIGZsb3cgZm9yIHRoaXMgdG9hc3QgKG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gb3B0aW9ucy5mbG93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZsb3cgOiAodGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJyk7XHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyA9PT0gJ2F1dG8nID8gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikgOiBmbG93O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVuc3VyZSBkZWZhdWx0IGNvbnRhaW5lciBpcyBzZXQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICAgIHRoaXMuZW5zdXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvYXN0RWwgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdCBBUFgtdG9hc3QtLSR7b3B0aW9ucy50eXBlfWApO1xyXG4gICAgICAgIHRvYXN0RWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gICAgICAgIC8vIFByaW9yaXR5OiBvcHRpb25zLmlkID4gY29uZmlnLmlkID4gYXV0by1nZW5lcmF0ZWRcclxuICAgICAgICBjb25zdCB0b2FzdElkID0gb3B0aW9ucy5pZCB8fCBgdF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcclxuICAgICAgICB0b2FzdEVsLmRhdGFzZXQudG9hc3RJZCA9IHRvYXN0SWQ7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTmFtZSArPSBgICR7b3B0aW9ucy5jbGFzc05hbWV9YDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX2NvbnRlbnQnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChvcHRpb25zLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNvbnRlbnRFbCk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzbWlzc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb2dyZXNzV3JhcCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzQmFyRWwgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1BhdXNlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5wcm9ncmVzcy5lbmFibGUgJiYgb3B0aW9ucy5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBvcHRpb25zLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25VcGRhdGVGbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsRWxlbWVudFN0eWxlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24gJiYgdHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MgJiYgKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlTmF0aXZlQ1NTOiB0cnVlIC0gY3JlYXRlIGNvbnRhaW5lciBpbiB0YXJnZXQgZWxlbWVudCB1c2luZyBuYXRpdmUgQ1NTXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IHBvc2l0aW9uLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHN0YWNraW5nIHRvYXN0cyAocmV1c2UgaWYgZXhpc3RzKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmF0aXZlQ29udGFpbmVyID0gdGFyZ2V0RWwucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmF0aXZlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyIEFQWC10b2FzdC1jb250YWluZXItbmF0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgdG8gY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHVzZSB4L3kgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYW5jaG9yZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiBvdXRzaWRlIHRoZSBlbGVtZW50IHVzaW5nIDEwMCUgKGVsZW1lbnQgc2l6ZSkgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLmFwcGVuZENoaWxkKG5hdGl2ZUNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5hdGl2ZUNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbCAmJiB0YXJnZXRFbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxFbGVtZW50U3R5bGUgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuYXRpdmUgY29udGFpbmVyIGlmIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVDb250YWluZXIgJiYgbmF0aXZlQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBuYXRpdmVDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250YWluZXIuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQsIGxpc3RlbiB0byBzY3JvbGwvcmVzaXplXHJcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlTXMgPSAxNjsgLy8gfjYwZnBzXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVkVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IHRocm90dGxlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUGFyZW50cyA9IGZpbmRTY3JvbGxhYmxlUGFyZW50cyhwb3NpdGlvbi5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIHdpbmRvdyBhbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZWxlbWVudCByZW1vdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xvc2UoJ2FwaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZUZuID0gdXBkYXRlQ29udGFpbmVyUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uIC0gZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRvYXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb250YWluZXJcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFuaW1hdGlvblxyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlcicpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnQgaGFuZGxpbmcgYW5kIHRpbWVyc1xyXG4gICAgICAgIGxldCByZW1haW5pbmcgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFydFRzID0gbnVsbDtcclxuICAgICAgICBsZXQgdXNlclBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgY2xpY2s6IG5ldyBTZXQoKSwgY2xvc2U6IG5ldyBTZXQoKSB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZyB8fCByZW1haW5pbmcgPD0gMCkgcmV0dXJuOyAvLyBzdGlja3lcclxuICAgICAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiByZWYuY2xvc2UoJ3RpbWVvdXQnKSwgcmVtYWluaW5nKTtcclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVySWQgPT0gbnVsbCB8fCBzdGFydFRzID09IG51bGwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCByZW1haW5pbmcgLSBlbGFwc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjdCA9IGR1cmF0aW9uTXMgPiAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCAocmVtYWluaW5nTXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gYCR7cGN0fSVgO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgU3RyaW5nKE1hdGgucm91bmQocGN0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpbWVySWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcclxuICAgICAgICAgICAgICAgIHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VHMgIT0gbnVsbCkgcmVtYWluaW5nIC09IChEYXRlLm5vdygpIC0gc3RhcnRUcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyID0gKGJ0bikgPT4ge1xyXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdXNlclBhdXNlZCA9ICF1c2VyUGF1c2VkO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQYXVzZWQpIHBhdXNlVGltZXIoKTsgZWxzZSBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHVzZXJQYXVzZWQgPyAnUmVwcmVuZHJlJyA6ICdQYXVzZSc7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcodXNlclBhdXNlZCk7IC8vIHBhdXNlZCA9IHJlc3VtZSAodHJpYW5nbGUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZ9ICovXHJcbiAgICAgICAgY29uc3QgcmVmID0ge1xyXG4gICAgICAgICAgICBpZDogdG9hc3RJZCxcclxuICAgICAgICAgICAgZWw6IHRvYXN0RWwsXHJcbiAgICAgICAgICAgIGNsb3NlOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZTogKHBhcnRpYWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyh7IC4uLm9wdGlvbnMsIC4uLnBhcnRpYWwgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWQubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBtZXJnZWQubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG1lcmdlZC5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0eXBlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBbJ2luZm8nLCdzdWNjZXNzJywnd2FybmluZycsJ2RhbmdlciddLmZvckVhY2godCA9PiB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoYEFQWC10b2FzdC0tJHt0fWApKTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LS0ke21lcmdlZC50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsYXNzZXNcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSAhPT0gbWVyZ2VkLmNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKC4uLm1lcmdlZC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIHZpc2liaWxpdHkvcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MgPSBtZXJnZWQucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlIHx8IG1lcmdlZC5kdXJhdGlvbk1zIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5wcm9ncmVzcy5lbmFibGUgJiYgbWVyZ2VkLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXAgJiYgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBtZXJnZWQucHJvZ3Jlc3MucGF1c2VCdXR0b24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkdXJhdGlvbiBsb2dpY1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbk1zID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgd2hlbkNsb3NlZDogKCkgPT4gY2xvc2VkUHJvbWlzZSxcclxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uYWRkKGhhbmRsZXIpOyByZXR1cm4gKCkgPT4gcmVmLm9mZihldmVudCwgaGFuZGxlcik7IH0sXHJcbiAgICAgICAgICAgIG9mZjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5kZWxldGUoaGFuZGxlcik7IH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBub3RpZnkgPSAoZXZlbnQsIGFyZykgPT4gaGFuZGxlcnNbZXZlbnRdLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihhcmcpOyB9IGNhdGNoIChfKSB7fSB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvc2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2ggPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBub3RpZnkoJ2Nsb3NlJywgcmVhc29uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsb3NlKHJlZiwgcmVhc29uKTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2FzdEVsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHBvc2l0aW9uIGxpc3RlbmVycyBhbmQgcmVzdG9yZSBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbkNsZWFudXApIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVyZmxvdywgcmVtb3ZlIGltbWVkaWF0ZWx5IHRvIGVuZm9yY2UgaGFyZCBjYXBcclxuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT09ICdvdmVyZmxvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFuaW1hdGUgb3V0XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdCcpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVFbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGF0dGFjaCBjbG9zZSBiZWhhdmlvclxyXG4gICAgICAgICAgICByZWYuY2xvc2UgPSAocmVhc29uKSA9PiBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsaWNrIGhhbmRsaW5nXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICBub3RpZnkoJ2NsaWNrJywgZXYpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsaWNrKHJlZiwgZXYpOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIb3ZlciBwYXVzZVxyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBhdXNlVGltZXIpO1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaWYgKCF1c2VyUGF1c2VkKSBzdGFydFRpbWVyKCk7IH0pO1xyXG5cclxuICAgICAgICBpZiAoY2xvc2VCdG4pIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7IGV2LnN0b3BQcm9wYWdhdGlvbigpOyByZWYuY2xvc2UoJ2Nsb3NlJyk7IH0pO1xyXG4gICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuXHJcbiAgICAgICAgLy8gVHJhY2tcclxuICAgICAgICB0aGlzLm9wZW4ucHVzaChyZWYpO1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZi5zZXQodG9hc3RJZCwgcmVmKTtcclxuXHJcbiAgICAgICAgLy8gT3ZlcmZsb3cgcG9saWN5XHJcbiAgICAgICAgaWYgKHRoaXMub3Blbi5sZW5ndGggPiB0aGlzLmNvbmZpZy5tYXhUb2FzdHMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5vcGVuWzBdO1xyXG4gICAgICAgICAgICBvbGRlc3QuY2xvc2UoJ292ZXJmbG93Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIGhlbHBlcnNcclxuICAgICAqL1xyXG4gICAgaW5mbyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnaW5mbycgfSk7IH1cclxuICAgIHN1Y2Nlc3MobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3N1Y2Nlc3MnIH0pOyB9XHJcbiAgICB3YXJuaW5nKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICd3YXJuaW5nJyB9KTsgfVxyXG4gICAgZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdkYW5nZXInIH0pOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J2FwaSd8J292ZXJmbG93J30gW3JlYXNvbl0gKi9cclxuICAgIGNsb3NlQWxsKHJlYXNvbikge1xyXG4gICAgICAgIC8vIGNvcHkgdG8gYXZvaWQgbXV0YXRpb24gZHVyaW5nIGl0ZXJhdGlvblxyXG4gICAgICAgIGNvbnN0IGFsbCA9IHRoaXMub3Blbi5zbGljZSgpO1xyXG4gICAgICAgIGFsbC5mb3JFYWNoKHIgPT4gci5jbG9zZShyZWFzb24gfHwgJ2FwaScpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIG5vcm1hbGl6ZU9wdGlvbnMob3B0cykge1xyXG4gICAgICAgIGNvbnN0IG8gPSB7IC4uLm9wdHMgfTtcclxuICAgICAgICBpZiAoIW8udHlwZSkgby50eXBlID0gJ2luZm8nO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kaXNtaXNzaWJsZSAhPT0gJ2Jvb2xlYW4nKSBvLmRpc21pc3NpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIG8uZHVyYXRpb25NcyAhPT0gJ251bWJlcicpIG8uZHVyYXRpb25NcyA9IHRoaXMuY29uZmlnLmRlZmF1bHREdXJhdGlvbk1zO1xyXG4gICAgICAgIC8vIFVzZSBpZCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgaWQgZnJvbSBjb25maWcsIG90aGVyd2lzZSB1bmRlZmluZWQgKHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQpXHJcbiAgICAgICAgaWYgKCFvLmlkICYmIHRoaXMuY29uZmlnLmlkKSBvLmlkID0gdGhpcy5jb25maWcuaWQ7XHJcbiAgICAgICAgby5wcm9ncmVzcyA9IHJlc29sdmVQcm9ncmVzcyhvcHRzLnByb2dyZXNzLCB0aGlzLmNvbmZpZy5wcm9ncmVzcyk7XHJcbiAgICAgICAgcmV0dXJuIG87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIG9yIGNyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7J3VwJ3wnZG93bid9IFtmbG93XSBGbG93IGRpcmVjdGlvbiAoYWxyZWFkeSBkZXRlcm1pbmVkLCBub3QgJ2F1dG8nKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbWFuYWdlZF0gV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBtYW5hZ2VkIGJ5IGEgbWFuYWdlciAoZGVmYXVsdDogZmFsc2UpXHJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIG1hbmFnZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGbG93IHNob3VsZCBhbHJlYWR5IGJlIGRldGVybWluZWQgKCd1cCcgb3IgJ2Rvd24nKSwgYnV0IGZhbGxiYWNrIHRvIGF1dG8gaWYgbmVlZGVkXHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyAmJiBmbG93ICE9PSAnYXV0bycgPyBmbG93IDogZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMS4gQ2hlY2sgbWVtb3J5IGNhY2hlXHJcbiAgICAgICAgbGV0IGMgPSBfY29udGFpbmVyQ2FjaGUuZ2V0KHBvc2l0aW9uS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBJZiBub3QgaW4gY2FjaGUsIHNlYXJjaCBpbiBET00gYnkgZGF0YSBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWMgJiYgaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIGMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMy4gSWYgc3RpbGwgbm90IGZvdW5kLCBjcmVhdGUgbmV3IGNvbnRhaW5lclxyXG4gICAgICAgIGlmICghYykge1xyXG4gICAgICAgICAgICBjID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1hcmsgYXMgbWFuYWdlZCBpZiBjcmVhdGVkIGJ5IGEgbWFuYWdlclxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gY2xhc3MgKGZvciBDU1MpXHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8gcG9zaXRpb24gXHJcbiAgICAgICAgICAgICAgICA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICAgICAgYy5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc0NsYXNzfWApO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IGZsb3cgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uIHN0eWxlcyBpZiBvYmplY3QgcG9zaXRpb25cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGMuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgYyk7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB3cmFwcGVyIGZvciBjbGVhbiBET00gb3JnYW5pemF0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRUb2FzdFdyYXBwZXIoKTtcclxuICAgICAgICAgICAgaWYgKHdyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzIChtYXkgYmUgc2hhcmVkKVxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBJZiBjb250YWluZXIgZXhpc3RzIGFuZCBpcyBub3cgbWFuYWdlZCwgbWFyayBpdFxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCAmJiAhYy5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZUNvbnRhaW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgfHwgIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0byc7XHJcbiAgICAgICAgLy8gQ29udGFpbmVycyBjcmVhdGVkIGJ5IGVuc3VyZUNvbnRhaW5lciBhcmUgbWFuYWdlZFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5Q29udGFpbmVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbiA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBzdHlsZXMgKHRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG1hbmFnZXJzIHNoYXJpbmcgdGhlIGNvbnRhaW5lcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIGNsYXNzIChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzZXMgPSBbJ2JvdHRvbS1yaWdodCcsJ2JvdHRvbS1sZWZ0JywndG9wLXJpZ2h0JywndG9wLWxlZnQnXS5tYXAocCA9PiBgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwfWApO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnBvc0NsYXNzZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgY29udGFpbmVyIGNsYXNzIGlmIHNwZWNpZmllZFxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGNscyA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBvZmZzZXQgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYCR7dGhpcy5jb25maWcub2Zmc2V0fXB4YDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgb2Zmc2V0IGlmIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gRm9yIG9iamVjdCBwb3NpdGlvbnMsIGVuc3VyZSBjb250YWluZXIgaGFzIHBvc2l0aW9uOiBmaXhlZFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciBhIGNvbnRhaW5lciBiYXNlZCBvbiBwb3NpdGlvbiBjb25maWdcclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxyXG4gICAgICogQHJldHVybnMge3tsZWZ0Pzogc3RyaW5nLCB0b3A/OiBzdHJpbmcsIHJpZ2h0Pzogc3RyaW5nLCBib3R0b20/OiBzdHJpbmd9fVxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyRWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNvbnRhaW5lciBDU1NcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGlja3k6IGZpeGVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggeC95IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGZpeGVkIHBvc2l0aW9uaW5nLCBzbyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBpcyByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHgveSBvZmZzZXRzIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VPZmZzZXQgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZW0gdG8gcHggKGFwcHJveGltYXRlOiAxZW0gPSAxNnB4KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueCB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnkgfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGAke3JlY3QubGVmdCArIG9mZnNldFh9cHhgLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogYCR7cmVjdC50b3AgKyBvZmZzZXRZfXB4YFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggcGxhY2VtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgZ2FwIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VHYXAgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2OyAvLyBBcHByb3hpbWF0ZTogMWVtID0gMTZweFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwUHggPSBwYXJzZUdhcChnYXApO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgKGFib3ZlL2JlbG93L2JlZm9yZS9hZnRlcikgdG8gQ1NTIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYWJvdmUgZWxlbWVudDogYm90dG9tIG9mIHRvYXN0ID0gdG9wIG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tID0gdmlld3BvcnQgaGVpZ2h0IC0gKGVsZW1lbnQgdG9wIC0gZ2FwKSA9IHZpZXdwb3J0IGhlaWdodCAtIGVsZW1lbnQgdG9wICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBiZWxvdyBlbGVtZW50OiB0b3Agb2YgdG9hc3QgPSBib3R0b20gb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC5ib3R0b20gKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSBsZWZ0OiByaWdodCBvZiB0b2FzdCA9IGxlZnQgb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgcmlnaHQ6IGxlZnQgb2YgdG9hc3QgPSByaWdodCBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWdcclxuICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvYXN0TWFuYWdlcihjb25maWcpIHtcclxuICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKGNvbmZpZyk7XHJcbn1cclxuXHJcbi8vIEhpZ2gtbGV2ZWwgQVBYLnRvYXN0IEFQSSAoZGVmYXVsdCAmIG5hbWVkIG1hbmFnZXJzKVxyXG5sZXQgX2RlZmF1bHRNYW5hZ2VyID0gbnVsbDtcclxuY29uc3QgX2dldERlZmF1bHQgPSAoKSA9PiB7XHJcbiAgICBpZiAoIV9kZWZhdWx0TWFuYWdlcikgX2RlZmF1bHRNYW5hZ2VyID0gY3JlYXRlVG9hc3RNYW5hZ2VyKCk7XHJcbiAgICByZXR1cm4gX2RlZmF1bHRNYW5hZ2VyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRvYXN0IEFQSSBzdXJmYWNlIHRvIGJlIGF0dGFjaGVkIGFzIEFQWC50b2FzdC5cclxuICogQ2FsbGFibGUgZm9ybSBwcm94aWVzIHRvIGRlZmF1bHRNYW5hZ2VyLnNob3cob3B0cyk6IEFQWC50b2FzdCh7Li4ufSlcclxuICovXHJcbmZ1bmN0aW9uIHRvYXN0KG9wdHMpIHtcclxuICAgIHJldHVybiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyk7XHJcbn1cclxuXHJcbk9iamVjdC5hc3NpZ24odG9hc3QsIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbWFuYWdlci4gSWYgZmlyc3QgYXJnIGlzIHN0cmluZywgcmVnaXN0ZXIgYXMgbmFtZWQgdW5kZXIgdG9hc3QuY3VzdG9tW25hbWVdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gbmFtZU9yQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gbWF5YmVDb25maWdcclxuICAgICAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogKG5hbWVPckNvbmZpZywgbWF5YmVDb25maWcpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG5hbWVPckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVPckNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obWF5YmVDb25maWcgfHwge30pIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRvYXN0LmN1c3RvbSkgdG9hc3QuY3VzdG9tID0ge307XHJcbiAgICAgICAgICAgIHRvYXN0LmN1c3RvbVtuYW1lXSA9IG1hbmFnZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihuYW1lT3JDb25maWcgfHwge30pIH0pO1xyXG4gICAgfSxcclxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgVG9hc3RNYW5hZ2VyPn0gKi9cclxuICAgIGN1c3RvbToge30sXHJcbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cclxuICAgIHVzZTogKG5hbWUpID0+ICh0b2FzdC5jdXN0b20gJiYgdG9hc3QuY3VzdG9tW25hbWVdKSB8fCBudWxsLFxyXG4gICAgTWFuYWdlcjogVG9hc3RNYW5hZ2VyLFxyXG4gICAgc2hvdzogKG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKSxcclxuICAgIGluZm86IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmluZm8obWVzc2FnZSwgb3B0cyksXHJcbiAgICBzdWNjZXNzOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5zdWNjZXNzKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgd2FybmluZzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkud2FybmluZyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIGRhbmdlcjogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgY29uZmlndXJlOiAoY29uZmlnKSA9PiBfZ2V0RGVmYXVsdCgpLmNvbmZpZ3VyZShjb25maWcpLFxyXG4gICAgc2V0QXJpYUxpdmU6IChtb2RlKSA9PiBfZ2V0RGVmYXVsdCgpLnNldEFyaWFMaXZlKG1vZGUpLFxyXG4gICAgY2xvc2VBbGw6IChyZWFzb24pID0+IF9nZXREZWZhdWx0KCkuY2xvc2VBbGwocmVhc29uKSxcclxuICAgIGdldE9wZW5Ub2FzdHM6ICgpID0+IF9nZXREZWZhdWx0KCkuZ2V0T3BlblRvYXN0cygpXHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdG9hc3Q7XHJcbmV4cG9ydCB7IFRvYXN0TWFuYWdlciwgY3JlYXRlVG9hc3RNYW5hZ2VyLCB0b2FzdCB9O1xyXG4iLCIvLyBJbXBvcnQgZGVzIGZvbmN0aW9ucyBldCBtb2R1bGVzIGRlcyBzb3VzLW1vZHVsZXNcclxuaW1wb3J0IGF1Z21lbnRXaXRoUGFjayBmcm9tICcuL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyc7XHJcbmltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9mb3JtLXBhY2tlci9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vLyBFeHBvcnQgZGUgbGEgZm9uY3Rpb24gZCdhdWdtZW50YXRpb25cclxuZXhwb3J0IHsgYXVnbWVudFdpdGhQYWNrIH07XHJcblxyXG4vLyBFeHBvcnQgZGVzIGZvbmN0aW9ucyB1dGlsaXRhaXJlc1xyXG5leHBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT05cclxufTtcclxuXHJcblxyXG4iLCJpbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vcGFja1RvSnNvbi5tanMnO1xyXG5cclxuLyoqXHJcbiAqIEFqb3V0ZSBsYSBtw6l0aG9kZSBwYWNrKCkgYXV4IG9iamV0cyBBUFggcG91ciBjb252ZXJ0aXIgbGVzIGZvcm11bGFpcmVzIGVuIEpTT05cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIEwnb2JqZXQgQVBYIMOgIGF1Z21lbnRlclxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEFQWCBhdWdtZW50w6lcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IGxlIHByZW1pZXIgZm9ybXVsYWlyZSBzw6lsZWN0aW9ubsOpIGVuIG9iamV0IEpTT05cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHBhc3PDqWVzIMOgIHBhY2tGb3JtVG9KU09OIChleC4geyBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiB0cnVlIH0pXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEpTT04gcsOpc3VsdGFudFxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNpIGF1Y3VuIGZvcm11bGFpcmUgbidlc3QgdHJvdXbDqSBvdSBzaSBsZSBwcmVtaWVyIMOpbMOpbWVudCBuJ2VzdCBwYXMgdW4gZm9ybXVsYWlyZVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnN0IGRhdGEgPSBBUFgoJ2Zvcm0ubXlmb3JtY2xhc3MnKS5wYWNrKCk7XHJcbiAgICAgKiBjb25zdCBkYXRhTGVnYWN5ID0gQVBYKCdmb3JtJykucGFjayh7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSk7XHJcbiAgICAgKi9cclxuICAgIGFweC5wYWNrID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0aGlzLmZpcnN0KCk7XHJcbiAgICAgICAgaWYgKCFmaXJzdEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJzdEVsZW1lbnQudGFnTmFtZSAhPT0gJ0ZPUk0nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCBpcyBub3QgYSBmb3JtJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWNrRm9ybVRvSlNPTihmaXJzdEVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGFweDtcclxufVxyXG5cclxuXHJcbiIsIi8qKlxyXG4gKiBDb252ZXJ0aXQgdW4gZm9ybXVsYWlyZSBIVE1MIGVuIG9iamV0IEpTT05cclxuICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm0gLSBMZSBmb3JtdWxhaXJlIMOgIGNvbnZlcnRpclxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBkZSBjb252ZXJzaW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheT1mYWxzZV0gLSBTaSB0cnVlLCB0b3V0ZSBjbMOpIG51bcOpcmlxdWUgZXN0IHRyYWl0w6llIGNvbW1lIGluZGV4IGRlIHRhYmxlYXUgKGNvbXBvcnRlbWVudCBkJ2F2YW50IDIuNi4yKS4gU2lub24sIGhldXJpc3RpcXVlIDogdGFibGVhdSBzZXVsZW1lbnQgc2kgaW5kaWNlcyBkZW5zZXMgMCwxLDIs4oCmLG4uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gU2kgZm9ybSBuJ2VzdCBwYXMgdW4gSFRNTEZvcm1FbGVtZW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFja0Zvcm1Ub0pTT04gPSAoZm9ybSwgb3B0aW9ucyA9IHt9KSA9PiB7XHJcbiAgICAvLyBWYWxpZGF0aW9uIGRlIGwnZW50csOpZVxyXG4gICAgaWYgKCFmb3JtIHx8ICEoZm9ybSBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYWNrRm9ybVRvSlNPTiBleHBlY3RzIGFuIEhUTUxGb3JtRWxlbWVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPSBvcHRpb25zLm51bWVyaWNLZXlzQWx3YXlzQXJyYXkgPT09IHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XHJcbiAgICBjb25zdCBqc29uRGF0YSA9IHt9O1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVpdCB1bmUgcmVwcsOpc2VudGF0aW9uIHN0cmluZyBkdSBjaGVtaW4gcG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXJcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRzIC0gTGVzIHBhcnRpZXMgZHUgY2hlbWluXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBMZSBjaGVtaW4gZm9ybWF0w6lcclxuICAgICAqL1xyXG4gICAgY29uc3QgYnVpbGRQYXRoU3RyaW5nID0gKHBhcnRzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnRzLnJlZHVjZSgocGF0aCwgcGFydCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofVske3BhcnQubmFtZX1dYCA6IHBhcnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtwYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9W11gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgICAgIH0sICcnKTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIFBIQVNFIDEgOiBBTkFMWVNFIEVUIETDiVRFQ1RJT04gREVTIENPTkZMSVRTXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3RydWN0dXJlIHBvdXIgc3RvY2tlciBsJ3V0aWxpc2F0aW9uIGQndW4gY2hlbWluXHJcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBQYXRoVXNhZ2VcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaW5hbCAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ludGVybWVkaWF0ZSAtIExlIGNoZW1pbiBlc3QgdXRpbGlzw6kgY29tbWUgY2hlbWluIGludGVybcOpZGlhaXJlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc0FycmF5U3VmZml4IC0gTGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdIChjcsOpZSBkZXMgdmFsZXVycyBwcmltaXRpdmVzKVxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSBxdWkgdXRpbGlzZSBjZSBjaGVtaW5cclxuICAgICAqL1xyXG4gICAgXHJcbiAgICBjb25zdCBwYXRoVXNhZ2UgPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBQYXRoVXNhZ2U+XHJcbiAgICBjb25zdCBrZXlBbmFseXNpcyA9IG5ldyBNYXAoKTsgLy8gTWFwPGJhc2VQYXRoLCB7aGFzTnVtZXJpYzogYm9vbGVhbiwgaGFzU3RyaW5nOiBib29sZWFufT5cclxuICAgIGNvbnN0IG51bWVyaWNJbmRpY2VzQnlQYXRoID0gbmV3IE1hcCgpOyAvLyBNYXA8cGF0aFN0cmluZywgU2V0PG51bWJlcj4+IOKAlCBpbmRpY2VzIHVuZGVyIGVhY2ggcGFyZW50IHBhdGhcclxuICAgIGNvbnN0IGFsbEVudHJpZXMgPSBbXTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnJlZ2lzdHJlIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW4gZGFucyBwYXRoVXNhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIExlIGNoZW1pbiDDoCBlbnJlZ2lzdHJlclxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0ZpbmFsIC0gU2kgYydlc3QgdW5lIHZhbGV1ciBmaW5hbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBcnJheVN1ZmZpeCAtIFNpIGxlIGNoZW1pbiBzZSB0ZXJtaW5lIHBhciBbXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZVxyXG4gICAgICovXHJcbiAgICBjb25zdCByZWNvcmRQYXRoVXNhZ2UgPSAoY3VycmVudFBhdGgsIGlzRmluYWwsIGlzQXJyYXlTdWZmaXgsIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzYWdlID0gcGF0aFVzYWdlLmdldChjdXJyZW50UGF0aCkgPz8ge1xyXG4gICAgICAgICAgICBpc0ZpbmFsOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNJbnRlcm1lZGlhdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBoYXNBcnJheVN1ZmZpeDogZmFsc2UsXHJcbiAgICAgICAgICAgIGtleVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXRoVXNhZ2UuaGFzKGN1cnJlbnRQYXRoKSkge1xyXG4gICAgICAgICAgICBwYXRoVXNhZ2Uuc2V0KGN1cnJlbnRQYXRoLCB1c2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzRmluYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICB1c2FnZS5rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5U3VmZml4KSB7XHJcbiAgICAgICAgICAgICAgICB1c2FnZS5oYXNBcnJheVN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1c2FnZS5pc0ludGVybWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA/Pz0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8vIFByZW1pw6hyZSBwYXNzZSA6IGFuYWx5c2VyIHRvdXRlcyBsZXMgY2zDqXMgZXQgZW5yZWdpc3RyZXIgbGVzIGNoZW1pbnNcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGZvcm1EYXRhLmVudHJpZXMoKSkge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuICAgICAgICBcclxuICAgICAgICBhbGxFbnRyaWVzLnB1c2goeyBrZXksIHZhbHVlIH0pO1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb25zdHJ1aXJlIHRvdXMgbGVzIGNoZW1pbnMgaW50ZXJtw6lkaWFpcmVzIGV0IGxlIGNoZW1pbiBmaW5hbFxyXG4gICAgICAgIGxldCBjdXJyZW50UGF0aCA9ICcnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBjb25zdCBpc0FycmF5U3VmZml4ID0gcGFydC50eXBlID09PSAnYXJyYXknO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ29uc3RydWlyZSBsZSBjaGVtaW4ganVzcXUnw6AgY2Ugbml2ZWF1XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gY3VycmVudFBhdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJpY0luZGljZXNCeVBhdGguc2V0KHBhcmVudFBhdGgsIHNldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZXQuYWRkKHBhcnQuaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEVucmVnaXN0cmVyIGwndXRpbGlzYXRpb24gZHUgY2hlbWluXHJcbiAgICAgICAgICAgIHJlY29yZFBhdGhVc2FnZShjdXJyZW50UGF0aCwgaXNMYXN0LCBpc0FycmF5U3VmZml4ICYmIGlzTGFzdCwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQW5hbHlzZXIgY2hhcXVlIG5pdmVhdSBkZSBsYSBoacOpcmFyY2hpZSBwb3VyIGTDqXRlY3RlciBsZXMgY29uZmxpdHMgKGluZGljZXMgbnVtw6lyaXF1ZXMgdnMgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gcGFydHNbaSArIDFdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQW5hbHlzZXIgc2V1bGVtZW50IGxlcyBjbMOpcyAocGFzIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzKVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXJ0Lm5hbWU7IC8vIExlIG5vbSBkZSBsYSBwcmVtacOocmUgY2zDqSBkYW5zIGxlIGNoZW1pblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmFseXNpcyA9IGtleUFuYWx5c2lzLmdldChiYXNlUGF0aCkgPz8geyBoYXNOdW1lcmljOiBmYWxzZSwgaGFzU3RyaW5nOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlBbmFseXNpcy5oYXMoYmFzZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5QW5hbHlzaXMuc2V0KGJhc2VQYXRoLCBhbmFseXNpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzTnVtZXJpYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0UGFydC50eXBlID09PSAna2V5JyB8fCBuZXh0UGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzLmhhc1N0cmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIETDqXRlY3RlIGV0IGzDqHZlIHVuZSBleGNlcHRpb24gcG91ciB0b3VzIGxlcyBjb25mbGl0cyBkZSBjaGVtaW5zXHJcbiAgICAgKiBcclxuICAgICAqIFByaW5jaXBlIHNpbXBsZSA6IHBvdXIgY2hhcXVlIGNoZW1pbiBmaW5hbCAodmFsZXVyIHByaW1pdGl2ZSksIHbDqXJpZmllciBzaSB1biBjaGVtaW5cclxuICAgICAqIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciBjZSBjaGVtaW4gc3VpdmkgZGUgJ1snLiBTaSBjJ2VzdCBsZSBjYXMsIGMnZXN0IHVuIGNvbmZsaXQuXHJcbiAgICAgKiBcclxuICAgICAqIENldHRlIGFwcHJvY2hlIHVuaWZpw6llIGNvdXZyZSB0b3VzIGxlcyBjYXMgOlxyXG4gICAgICogLSBpdGVtc1tdIChmaW5hbCkgdnMgaXRlbXNbMF1bbmFtZV0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBhcnJheVszXSAoZmluYWwpIHZzIGFycmF5WzNdW25lc3RlZF0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBkYXRhW2tleV0gKGZpbmFsKSB2cyBkYXRhW2tleV1bc3ViXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGRldGVjdFBhdGhDb25mbGljdHMgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gQ29sbGVjdGVyIHRvdXMgbGVzIGNoZW1pbnMgZmluYXV4ICh2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgICAgY29uc3QgZmluYWxQYXRocyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhLZXlzID0gbmV3IE1hcCgpOyAvLyBQb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHVzYWdlXSBvZiBwYXRoVXNhZ2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2FnZS5pc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBhdGhzLmFkZChwYXRoKTtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aEtleXMuc2V0KHBhdGgsIHVzYWdlLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gUG91ciBjaGFxdWUgY2hlbWluIGludGVybcOpZGlhaXJlLCB2w6lyaWZpZXIgcydpbCBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzSW50ZXJtZWRpYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbmFsUGF0aCBvZiBmaW5hbFBhdGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVsOpcmlmaWVyIHNpIGNlIGNoZW1pbiBpbnRlcm3DqWRpYWlyZSBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsIHN1aXZpIGRlICdbJ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4ZW1wbGU6IGZpbmFsUGF0aCA9IFwiYXJyYXlbM11cIiwgcGF0aCA9IFwiYXJyYXlbM11bbmVzdGVkXVwiIOKGkiBjb25mbGl0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtmaW5hbFBhdGh9W2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYXRoIGNvbmZsaWN0OiBcIiR7ZmluYWxQYXRofVwiIGlzIHVzZWQgYXMgYSBmaW5hbCB2YWx1ZSAoaW4gZmllbGQgXCIke2ZpbmFsUGF0aEtleXMuZ2V0KGZpbmFsUGF0aCl9XCIpLCBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBidXQgXCIke3BhdGh9XCIgdHJpZXMgdG8gdXNlIGl0IGFzIGFuIGludGVybWVkaWF0ZSBwYXRoIChpbiBmaWVsZCBcIiR7dXNhZ2Uua2V5fVwiKS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBjcmVhdGVzIGluY29tcGF0aWJsZSBkYXRhIHN0cnVjdHVyZXMuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW5ub3QgdXNlIFwiJHtmaW5hbFBhdGh9XCIgYXMgYSBwcmltaXRpdmUgdmFsdWUgYW5kIHRoZW4gYWNjZXNzIGl0IGFzIGFuIG9iamVjdC5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gRXjDqWN1dGVyIGxhIGTDqXRlY3Rpb24gZGVzIGNvbmZsaXRzXHJcbiAgICBkZXRlY3RQYXRoQ29uZmxpY3RzKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWw6lyaWZpZSBzaSB1biBjaGVtaW4gZGUgYmFzZSBhIHVuIGNvbmZsaXQgKGluZGljZXMgbnVtw6lyaXF1ZXMgRVQgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIMOgIHbDqXJpZmllclxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gKGJhc2VQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFiYXNlUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKTtcclxuICAgICAgICByZXR1cm4gYW5hbHlzaXM/Lmhhc051bWVyaWMgJiYgYW5hbHlzaXM/Lmhhc1N0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIGluZGljZXMgYXJlIGV4YWN0bHkgMCwgMSwgMiwgLi4uLCBuIChkZW5zZSwgc2VxdWVudGlhbCBmcm9tIDApLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kaWNlcyAtIFNvcnRlZCBhcnJheSBvZiBpbmRpY2VzXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaXNEZW5zZVNlcXVlbnRpYWwgPSAoaW5kaWNlcykgPT4ge1xyXG4gICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5pbmRpY2VzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzb3J0ZWQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKHNvcnRlZFtqXSAhPT0gaikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIG51bWVyaWMga2V5cyB1bmRlciB0aGlzIHBhdGggc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXJyYXkgaW5kaWNlcy5cclxuICAgICAqIFdpdGggbnVtZXJpY0tleXNBbHdheXNBcnJheTogYWx3YXlzIHRydWUgd2hlbiBwYXRoIGhhcyBudW1lcmljIGNoaWxkcmVuLlxyXG4gICAgICogT3RoZXJ3aXNlOiB0cnVlIG9ubHkgd2hlbiBpbmRpY2VzIGFyZSBkZW5zZSAwLi5uLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBQYXRoIHRvIHRoZSBjb250YWluZXIgdGhhdCBoYXMgbnVtZXJpYyBjaGlsZHJlblxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGggPSAocGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG51bWVyaWNJbmRpY2VzQnlQYXRoLmdldChwYXJlbnRQYXRoKTtcclxuICAgICAgICBpZiAoIXNldCB8fCBzZXQuc2l6ZSA9PT0gMCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKG51bWVyaWNLZXlzQWx3YXlzQXJyYXkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBpc0RlbnNlU2VxdWVudGlhbChbLi4uc2V0XSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IHVuIHRhYmxlYXUgZW4gb2JqZXQgZW4gcHLDqXNlcnZhbnQgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMgY29tbWUgcHJvcHJpw6l0w6lzXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnIgLSBMZSB0YWJsZWF1IMOgIGNvbnZlcnRpclxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGFycmF5VG9PYmplY3QgPSAoYXJyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYXJyLmxlbmd0aDsgaWR4KyspIHtcclxuICAgICAgICAgICAgb2JqW2lkeF0gPSBhcnJbaWR4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29waWVyIGxlcyBwcm9wcmnDqXTDqXMgbm9uLW51bcOpcmlxdWVzXHJcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYXJyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSkpIHtcclxuICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gb2JqZXQgZW4gdGFibGVhdSBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlc1xyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIEwnb2JqZXQgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IExlIHRhYmxlYXUgcsOpc3VsdGFudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBvYmplY3RUb0FycmF5ID0gKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmo7XHJcbiAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1LZXkgPSBOdW1iZXIucGFyc2VJbnQoaywgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycltudW1LZXldID0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIG9iamV0LCBlbiBjb252ZXJ0aXNzYW50IHNpIG7DqWNlc3NhaXJlXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciDDoCB2w6lyaWZpZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGtleSAtIExhIGNsw6kgZGFucyBsZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlT2JqZWN0IC0gRm9yY2VyIGxhIGNvbnZlcnNpb24gZW4gb2JqZXQgbcOqbWUgcydpbCBuJ3kgYSBwYXMgZGUgY29uZmxpdFxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiBvYmpldCBzaSBuw6ljZXNzYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZW5zdXJlT2JqZWN0ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQsIGZvcmNlT2JqZWN0ID0gZmFsc2UpID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0ge307XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzc3VyZSBxdSd1biBjb250ZW5ldXIgZXN0IHVuIHRhYmxlYXUsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgY29udGVuZXVyIChjb252ZXJ0aSBlbiB0YWJsZWF1IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVBcnJheSA9IChjb250YWluZXIsIGtleSwgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyID0gb2JqZWN0VG9BcnJheShjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBhcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcclxuICAgIH07XHJcblxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMiA6IFRSQUlURU1FTlQgREVTIFZBTEVVUlNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHZhbGV1ciBmaW5hbGUgKGRlcm5pw6hyZSBwYXJ0aWUgZHUgY2hlbWluKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIC0gTGEgdmFsZXVyIMOgIGFzc2lnbmVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2UgcG91ciBsYSBkw6l0ZWN0aW9uIGRlIGNvbmZsaXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRQYXRoIC0gQ2hlbWluIGR1IGNvbnRlbmV1ciBhY3R1ZWwgKHBvdXIgaGV1cmlzdGlxdWUgbnVtZXJpYylcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ZpbmFsVmFsdWUgPSAoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgLy8gVGFibGVhdSBleHBsaWNpdGUgYXZlYyBbXVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA/Pz0gW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0ucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ2zDqSBzaW1wbGUgZmluYWxlXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBbY29udGFpbmVyW3BhcnQubmFtZV0sIHZhbHVlXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVHJhaXRlIHVuZSBwYXJ0aWUgaW50ZXJtw6lkaWFpcmUgKGNyw6llIGxhIHN0cnVjdHVyZSlcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIGFjdHVlbFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcnQgLSBMYSBwYXJ0aWUgw6AgdHJhaXRlclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gbmV4dFBhcnQgLSBMYSBwYXJ0aWUgc3VpdmFudGUgKHBldXQgw6p0cmUgbnVsbClcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBUb3V0ZXMgbGVzIHBhcnRpZXMgZHUgY2hlbWluIChwb3VyIGNvbnN0cnVpcmUgbGUgY2hlbWluIGNvbXBsZXQgZGFucyBsZXMgZXJyZXVycylcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIC0gTCdpbmRleCBkZSBsYSBwYXJ0aWUgYWN0dWVsbGUgKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgZHUgZm9ybXVsYWlyZSAocG91ciBsZXMgbWVzc2FnZXMgZCdlcnJldXIpXHJcbiAgICAgKiBAcmV0dXJucyB7Kn0gTGUgbm91dmVhdSBjb250ZW5ldXIgYXByw6hzIHRyYWl0ZW1lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQgPSAoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICBjb25zdCB7IGluZGV4IH0gPSBwYXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlQXJyYXkgPSB1c2VBcnJheUZvck51bWVyaWNQYXRoKHBhcmVudFBhdGgpICYmICFoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoIXVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZUFycmF5KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmxlbmd0aCA8PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID8/PSB7fTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyW2luZGV4XSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW2luZGV4XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbaW5kZXhdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbaW5kZXhdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltpbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENsw6kgbm9ybWFsZSA6IGNyw6llciBvYmpldCBvdSB0YWJsZWF1IHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgIGNvbnN0IG5leHRJc051bWVyaWMgPSBuZXh0UGFydD8udHlwZSA9PT0gJ251bWVyaWMnO1xyXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb25mbGljdCkge1xyXG4gICAgICAgICAgICAvLyBDb25mbGl0IDogdG91am91cnMgdXRpbGlzZXIgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSB7fTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gUGFzIGRlIGNvbmZsaXQsIGNyw6llciBzZWxvbiBsYSBwYXJ0aWUgc3VpdmFudGVcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBuZXh0SXNOdW1lcmljID8gW10gOiB7fTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJc051bWVyaWMgJiYgIUFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gdGFibGVhdSBtYWlzIGMnZXN0IHVuIG9iamV0XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0cmluZ0tleXMgPSBPYmplY3Qua2V5cyhjb250YWluZXJbcGFydC5uYW1lXSkuc29tZShrID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWhhc1N0cmluZ0tleXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gb2JqZWN0VG9BcnJheShjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0SXNOdW1lcmljICYmICFpc1BsYWluT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvLyBPbiBhIGJlc29pbiBkJ3VuIG9iamV0IG1haXMgYydlc3QgdW4gdGFibGVhdVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFMnYXNzdXJlciBxdWUgY29udGFpbmVyW3BhcnQubmFtZV0gZXN0IGJpZW4gdW4gb2JqZXQgYXByw6hzIHRvdXRlcyBsZXMgY29udmVyc2lvbnNcclxuICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltwYXJ0Lm5hbWVdO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gVHJhaXRlciB0b3V0ZXMgbGVzIGVudHLDqWVzXHJcbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIGtleSB9IG9mIGFsbEVudHJpZXMpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwYXRoID0gW3sgY29udGFpbmVyOiBqc29uRGF0YSwga2V5OiBudWxsIH1dO1xyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBqc29uRGF0YTtcclxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnRzWzBdPy50eXBlID09PSAna2V5JyA/IHBhcnRzWzBdLm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gaSArIDEgPCBwYXJ0cy5sZW5ndGggPyBwYXJ0c1tpICsgMV0gOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhcnRzLnNsaWNlKDAsIGkpKTtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaW5hbFZhbHVlKGNvbnRhaW5lciwgcGFydCwgdmFsdWUsIHBhcmVudCwgYmFzZVBhdGgsIHBhcmVudFBhdGgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUGFydGllIGludGVybcOpZGlhaXJlIDogY3LDqWVyIGxhIHN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gcHJvY2Vzc0ludGVybWVkaWF0ZVBhcnQoY29udGFpbmVyLCBwYXJ0LCBuZXh0UGFydCwgcGFyZW50LCBiYXNlUGF0aCwgcGFydHMsIGksIGtleSk7XHJcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goeyBjb250YWluZXIsIGtleTogcGFydC50eXBlID09PSAnbnVtZXJpYycgPyBwYXJ0LmluZGV4IDogcGFydC5uYW1lIH0pO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmV3Q29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBqc29uRGF0YTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSB1bmUgY2zDqSBkZSBmb3JtdWxhaXJlIHBvdXIgZXh0cmFpcmUgbGVzIHBhcnRpZXMgKG5vbSwgaW5kaWNlcywgZXRjLilcclxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIExhIGNsw6kgw6AgcGFyc2VyIChleDogXCJ1c2VyW2VtYWlsXVwiLCBcInRhZ3NbXVwiLCBcIml0ZW1zWzBdW25hbWVdXCIpXHJcbiAqIEByZXR1cm5zIHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyfT59IFRhYmxlYXUgZGVzIHBhcnRpZXMgcGFyc8OpZXNcclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IHBhcnNlS2V5ID0gKGtleSkgPT4ge1xyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50ID0gJyc7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBsZW4gPSBrZXkubGVuZ3RoO1xyXG5cclxuICAgIHdoaWxlIChpIDwgbGVuKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IGtleVtpXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoY2hhciA9PT0gJ1snKSB7XHJcbiAgICAgICAgICAgIC8vIFNhdXZlZ2FyZGVyIGxhIHBhcnRpZSBwcsOpY8OpZGVudGUgc2kgZWxsZSBleGlzdGVcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVHJvdXZlciBsYSBmaW4gZHUgY3JvY2hldFxyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGxldCBicmFja2V0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBrZXlbaV0gIT09ICddJykge1xyXG4gICAgICAgICAgICAgICAgYnJhY2tldENvbnRlbnQgKz0ga2V5W2ldO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYnJhY2tldENvbnRlbnQgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBbXSB2aWRlID0gdGFibGVhdVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXN0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXJ0LnR5cGUgPSAnYXJyYXknO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBbXSBhdSBkw6lidXQsIGNyw6llciB1bmUgcGFydGllIHNww6ljaWFsZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiAnJywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnRlbnUgZGFucyBsZXMgY3JvY2hldHNcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGJyYWNrZXRDb250ZW50LCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1JbmRleCkgJiYgYnJhY2tldENvbnRlbnQgPT09IFN0cmluZyhudW1JbmRleCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2UgbnVtw6lyaXF1ZVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBTdHJpbmcobnVtSW5kZXgpLCB0eXBlOiAnbnVtZXJpYycsIGluZGV4OiBudW1JbmRleCB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9tIGRlIHByb3ByacOpdMOpXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGJyYWNrZXRDb250ZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpKys7IC8vIFBhc3NlciBsZSAnXSdcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjdXJyZW50ICs9IGNoYXI7XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFqb3V0ZXIgbGEgZGVybmnDqHJlIHBhcnRpZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogY3VycmVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBwYXJ0cztcclxufTtcclxuXHJcbi8qKlxyXG4gKiBWw6lyaWZpZSBzaSB1bmUgdmFsZXVyIGVzdCB1biBvYmpldCBzaW1wbGUgKHBhcyB1biB0YWJsZWF1LCBwYXMgbnVsbClcclxuICogQHBhcmFtIHsqfSBvYmogLSBMYSB2YWxldXIgw6AgdsOpcmlmaWVyXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgaXNQbGFpbk9iamVjdCA9IChvYmopID0+IHtcclxuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcclxufTtcclxuIiwiaW1wb3J0ICcuL2Nzcy90cmlzdGF0ZS5jc3MnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmktc3RhdGUgY2hlY2tib3ggZm9yIGVhY2ggY2hlY2tib3ggZWxlbWVudCBpbiB0aGUgYXB4LmVsZW1lbnRzIGFycmF5LlxuICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGFweCAtIEFuIGFycmF5IG9mIEhUTUxFbGVtZW50cyB3aGljaCBpcyByZXR1cm5lZCBieSBBUFgoKVxuICogQGV4YW1wbGVcbiAqIC8vIENhbGwgdGhlIHRyaXN0YXRlIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGNoZWNrYm94IGVsZW1lbnRzXG4gKiBhcHgudHJpc3RhdGUoKTtcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xuICAgIGFweC50cmlzdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pe1xuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdID0gY3JlYXRlVHJpU3RhdGVDaGVja2JveChlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENoZWNrYm94Ll9hcHhUcmlzdGF0ZSA9IHsgZG9tOiB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jYWxsYmFja3MgJiYgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyKG9yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldENoaWxkcmVuKGNoaWxkcmVuQXB4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldENoaWxkcmVuKGFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5cbi8qKlxuICogTGluayBwYXJlbnQgdHJpc3RhdGUocykgdG8gY2hpbGQgY2hlY2tib3hlcy4gV2hlbiBleGFjdGx5IG9uZSBwYXJlbnQ6IHRoYXQgcGFyZW50IGdldHNcbiAqIGluZGV0ZXJtaW5hdGUtZGFzaCBhdXRvbWF0aWNhbGx5IGFuZCBzaG93cyBkYXNoIHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkOyBjbGljayBwYXJlbnQgdG8gYXBwbHkgaXRzIHN0YXRlIHRvIGFsbCBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRBcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBwYXJlbnQgY2hlY2tib3goZXMpXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW5BcHggLSBBUFggaW5zdGFuY2Ugd2hvc2UgZWxlbWVudHMgYXJlIHRoZSBjaGlsZCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucyB1c2VkIGZvciB0aGUgcGFyZW50IChhbmQgYXBwbGllZCB0byBjaGlsZHJlbiB3aGVuIGluaXRpYWxpemluZyB0aGVtKVxuICovXG5mdW5jdGlvbiBzZXRDaGlsZHJlbihwYXJlbnRBcHgsIGNoaWxkcmVuQXB4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IHBhcmVudEFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAocGFyZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQVBYIHRyaXN0YXRlIHNldENoaWxkcmVuOiBvbmx5IHRoZSBmaXJzdCBwYXJlbnQgaXMgbGlua2VkIHRvIGFsbCBjaGlsZHJlbi4nKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q2hlY2tib3ggPSBwYXJlbnRzWzBdO1xuICAgIGNvbnN0IHBhcmVudFJlZiA9IHBhcmVudENoZWNrYm94Ll9hcHhUcmlzdGF0ZTtcbiAgICBpZiAoIXBhcmVudFJlZikgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyZW50RG9tID0gcGFyZW50UmVmLmRvbTtcbiAgICBjb25zdCBwYXJlbnRIaWRkZW5JbnB1dCA9IHBhcmVudFJlZi5oaWRkZW5JbnB1dDtcblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIGluZGV0ZXJtaW5hdGUgKGRhc2gpIG9uIHBhcmVudCB3aGVuIGl0IGhhcyBjaGlsZHJlbjogZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICgtLW1peGVkKVxuICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLXVuY2hlY2tlZC1pbmRldGVybWluYXRlJywgJ2FweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoJyk7XG5cbiAgICBjb25zdCBjaGlsZENoZWNrYm94ZXMgPSBjaGlsZHJlbkFweC5hbGwoKS5maWx0ZXIoKGVsKSA9PiBlbC50eXBlID09PSAnY2hlY2tib3gnKTtcbiAgICBjb25zdCBjaGlsZFJlZnMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKSB7XG4gICAgICAgIGlmIChjaGlsZFJlZnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHN0YXRlcyA9IGNoaWxkUmVmcy5tYXAoKHJlZikgPT4gZ2V0VHJpc3RhdGVTdGF0ZShyZWYuZG9tKSk7XG4gICAgICAgIGNvbnN0IGFsbENoZWNrZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbENyb3NzZWQgPSBzdGF0ZXMuZXZlcnkoKHMpID0+IHMgPT09ICdjcm9zc2VkJyk7XG4gICAgICAgIGNvbnN0IGFsbFVuY2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ3VuY2hlY2tlZCcpO1xuICAgICAgICBjb25zdCBtaXhlZCA9ICFhbGxDaGVja2VkICYmICFhbGxDcm9zc2VkICYmICFhbGxVbmNoZWNrZWQ7XG5cbiAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICAgICAgaWYgKG1peGVkKSBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlLS1taXhlZCcpO1xuICAgICAgICBlbHNlIHBhcmVudERvbS5jbGFzc0xpc3QucmVtb3ZlKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG5cbiAgICAgICAgaWYgKGFsbENoZWNrZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIGlmIChhbGxDcm9zc2VkKSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICAgICAgcGFyZW50SGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseVBhcmVudFRvQ2hpbGRyZW4oKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFN0YXRlID0gZ2V0VHJpc3RhdGVTdGF0ZShwYXJlbnREb20pO1xuICAgICAgICBjaGlsZFJlZnMuZm9yRWFjaCgocmVmKSA9PiBzZXRUcmlzdGF0ZVN0YXRlKHJlZi5jaGVja2JveCwgcmVmLmRvbSwgcmVmLmhpZGRlbklucHV0LCBwYXJlbnRTdGF0ZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgICBhZnRlcihjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCkge1xuICAgICAgICAgICAgICAgIGNoaWxkUmVmcy5wdXNoKHsgY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbmdlOiBzeW5jUGFyZW50RnJvbUNoaWxkcmVuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY2hpbGRyZW5BcHgudHJpc3RhdGUoY2hpbGRPcHRpb25zKTtcblxuICAgIHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW4oKTtcbiAgICBwYXJlbnREb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KGFwcGx5UGFyZW50VG9DaGlsZHJlbiwgMCkpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmlzdGF0ZVN0YXRlKGRvbSkge1xuICAgIGlmIChkb20uY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJykpIHJldHVybiAnY2hlY2tlZCc7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2Nyb3NzZWQnKSkgcmV0dXJuICdjcm9zc2VkJztcbiAgICByZXR1cm4gJ3VuY2hlY2tlZCc7XG59XG5cbmZ1bmN0aW9uIHNldFRyaXN0YXRlU3RhdGUoY2hlY2tib3gsIGRvbSwgaGlkZGVuSW5wdXQsIHN0YXRlKSB7XG4gICAgZG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZChzdGF0ZSk7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94LmRhdGFzZXQubmFtZSB8fCBjaGVja2JveC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpIHx8IGNoZWNrYm94Lm5hbWUgfHwgJyc7XG4gICAgaWYgKHN0YXRlID09PSAnY2hlY2tlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGlmIChuYW1lKSBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKGN1c3RvbUNoZWNrYm94LCBhY3R1YWxDaGVja2JveCwgaGlkZGVuSW5wdXQpIHtcbiAgICBjb25zdCB3YXNDaGVja2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJyk7XG4gICAgY29uc3Qgd2FzQ3Jvc3NlZCA9IGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpO1xuICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAod2FzQ2hlY2tlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH0gZWxzZSBpZiAod2FzQ3Jvc3NlZCkge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgICAgICBhY3R1YWxDaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgICAgIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGFjdHVhbENoZWNrYm94LmRhdGFzZXQubmFtZSk7IC8vIFJlc3RvcmUgdGhlIG5hbWUgZm9yIHBvc3RpbmdcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBvcHRpb25zKSB7XG4gICAgXG4gICAgLy9nZXQgdGhlIGNoZWNrYm94IG1hcmdpbnMgaW5jbHVkaW5nIGJyb3dzZXIgZGVmYXVsdFxuICAgIGNvbnN0IGNoZWNrYm94U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGVja2JveEVsZW1lbnQpO1xuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXYgYW5kIHNldCBpdHMgaW5pdGlhbCBzdGF0ZVxuICAgIGNvbnN0IHRyaXN0YXRlRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlJyk7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zaXplLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBvcHRpb25zLnNpemUud2lkdGg7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHcgIT09ICdudW1iZXInICYmIHR5cGVvZiB3ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUud2lkdGggbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLndpZHRoID0gdHlwZW9mIHcgPT09ICdudW1iZXInID8gdyArICdweCcgOiBTdHJpbmcodyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS5oZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgaCA9IG9wdGlvbnMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGggIT09ICdudW1iZXInICYmIHR5cGVvZiBoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyaXN0YXRlIHNpemUuaGVpZ2h0IG11c3QgYmUgYSBudW1iZXIgKHB4KSBvciBhIHN0cmluZyAoQ1NTIGxlbmd0aCkuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlzdGF0ZURvbS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgaCA9PT0gJ251bWJlcicgPyBoICsgJ3B4JyA6IFN0cmluZyhoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZihvcHRpb25zLmNsYXNzZXMpIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoLi4uY29tcHV0ZUNsYXNzZXMob3B0aW9ucy5jbGFzc2VzKSk7XG4gICAgY29uc3QgY29sb3JzID0gcmVzb2x2ZUNvbG9ycyhvcHRpb25zKTtcbiAgICBpZiAoY29sb3JzLnRpY2sgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3InLCBTdHJpbmcoY29sb3JzLnRpY2spKTtcbiAgICBpZiAoY29sb3JzLmNoZWNrZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNoZWNrZWQpKTtcbiAgICBpZiAoY29sb3JzLmNyb3NzZWQgIT0gbnVsbCkgdHJpc3RhdGVEb20uc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3InLCBTdHJpbmcoY29sb3JzLmNyb3NzZWQpKTtcblxuICAgIHRyaXN0YXRlRG9tLnN0eWxlLm1hcmdpbiA9IGNoZWNrYm94U3R5bGUubWFyZ2luO1xuXG4gICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGhpZGRlbiBpbnB1dCBmaWVsZFxuICAgIGNvbnN0IGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBoaWRkZW5JbnB1dC50eXBlID0gJ2hpZGRlbic7XG4gICAgaGlkZGVuSW5wdXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBDb3B5IHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LmRhdGFzZXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBTdG9yZSB0aGUgbmFtZSBpbiBhIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciB1c2VcbiAgICBjaGVja2JveEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveCB0byBhdm9pZCBkb3VibGUgcG9zdGluZ1xuXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlKSBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICBlbHNle1xuICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBoaWRkZW4gaW5wdXQgYmFzZWQgb24gdGhlIGNoZWNrYm94J3Mgc3RhdGVcbiAgICAgICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0Lm5hbWUgPSAnJzsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vaGFuZGxlIGFjY2Vzc2liaWxpdHksIHNldCB0aGUgdGFiaW5kZXggdG8gdGhlIHNhbWUgYXMgdGhlIGNoZWNrYm94XG4gICAgdHJpc3RhdGVEb20udGFiSW5kZXggPSBjaGVja2JveEVsZW1lbnQudGFiSW5kZXg7XG5cbiAgICAvLyBJbnNlcnQgdGhlIGhpZGRlbiBpbnB1dCBpbnNpZGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXZcbiAgICB0cmlzdGF0ZURvbS5hcHBlbmRDaGlsZChoaWRkZW5JbnB1dCk7XG5cbiAgICAvLyBJbnNlcnQgaXQgbmV4dCB0byB0aGUgYWN0dWFsIGNoZWNrYm94XG4gICAgY2hlY2tib3hFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQubmV4dFNpYmxpbmcpO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudCwgaGlkZGVuSW5wdXQpO1xuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGUpO1xuICAgIH0pO1xuICAgIHRyaXN0YXRlRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25rZXl1cC5iaW5kKG51bGwsIGNoZWNrYm94RWxlbWVudCkpO1xuXG4gICAgcmV0dXJuIFtjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF07XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpIHtcbiAgICAvLyBFbnN1cmUgb25seSBvbmUgc3RhdGUgY2xhc3MgaXMgc2V0ICh1bmNoZWNrZWRBcHBlYXJhbmNlIG1vZGlmaWVycyBtdXN0IG5vdCBhZmZlY3QgY2hlY2tlZC9jcm9zc2VkKVxuICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcsICdjaGVja2VkJywgJ2Nyb3NzZWQnKTtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ3VuY2hlY2tlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNsYXNzZXMoY2xhc3Nlcykge1xuICAgIGxldCBjb21wdXRlZENsYXNzZXMgPSBbXTtcbiAgICBpZih0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy9yZXBsYWNlIG11bHRpcGxlIHdoaXRlIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcbiAgICAgICAgaWYoY2xhc3Nlcy5pbmRleE9mKCcgJykgPiAtMSlcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICAgICAgZWxzZSBpZihjbGFzc2VzLmluZGV4T2YoJywnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnLCcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBbY2xhc3Nlc107XG4gICAgfVxuICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xuICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzO1xuICAgIH1cbiAgICByZXR1cm4gY29tcHV0ZWRDbGFzc2VzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29sb3JzKG9wdGlvbnMpIHtcbiAgICBjb25zdCBjID0gb3B0aW9ucy5jb2xvcnMgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGljazogYy50aWNrICE9IG51bGwgPyBjLnRpY2sgOiBvcHRpb25zLnRpY2tDb2xvcixcbiAgICAgICAgY2hlY2tlZDogYy5jaGVja2VkICE9IG51bGwgPyBjLmNoZWNrZWQgOiBvcHRpb25zLmNoZWNrZWRDb2xvcixcbiAgICAgICAgY3Jvc3NlZDogYy5jcm9zc2VkICE9IG51bGwgPyBjLmNyb3NzZWQgOiBvcHRpb25zLmNyb3NzZWRDb2xvclxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZXZlbnQpIHtcbiAgICAvL2lmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSBpcyBzZXQsIGNhbGwgaXRcbiAgICBpZihvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UoY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIH1cblxuICAgIGlmKCFvcHRpb25zLmJ1YmJsZUV2ZW50cykgcmV0dXJuO1xuXG4gICAgaWYoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbiAgICBlbHNlIGlmKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgeyBrZXk6ICcgJywgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2NoYW5nZScpIHtcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb25rZXl1cChjaGVja2JveEVsZW1lbnQsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChjaGVja2JveEVsZW1lbnQsIGV2ZW50KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsaWNrKCk7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBhdWdtZW50V2l0aExpc3RlbiBmcm9tICcuL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMnO1xuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUgZnJvbSAnLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9zY3JvbGxhYmxlVGFibGUubWpzJztcbmltcG9ydCBkaWFsb2cgZnJvbSAnLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzJztcbmltcG9ydCB0b2FzdCBmcm9tICcuL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzJztcbmltcG9ydCB7IGxvYWRDc3MgfSBmcm9tICcuL21vZHVsZXMvY29tbW9uLm1qcyc7XG5pbXBvcnQgeyBhdWdtZW50V2l0aFBhY2ssIHRvb2xzIH0gZnJvbSAnLi9tb2R1bGVzL3Rvb2xzL2V4cG9ydHMubWpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQWCBvYmplY3QgdGhhdCB3cmFwcyBvbmUgb3IgbW9yZSBIVE1MIGVsZW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R8SFRNTENvbGxlY3Rpb258QXJyYXk8SFRNTEVsZW1lbnQ+fGpRdWVyeXxGdW5jdGlvbn0gaW5wdXQgLSBUaGUgaW5wdXQgdG8gY3JlYXRlIHRoZSBBUFggb2JqZWN0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgQVBYIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgdHlwZSBpcyBpbnZhbGlkLlxuICogQGV4YW1wbGVcbiAqIC8vIFhQYXRoXG4gKiBjb25zdCBhcHgxID0gQVBYKCcvL2RpdltAY2xhc3M9XCJleGFtcGxlXCJdJyk7XG4gKlxuICogLy8gQ1NTIHNlbGVjdG9yXG4gKiBjb25zdCBhcHgyID0gQVBYKCcuZXhhbXBsZScpO1xuICpcbiAqIC8vIFNpbmdsZSBlbGVtZW50XG4gKiBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDMgPSBBUFgoZWxlbWVudCk7XG4gKlxuICogLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cbiAqIGNvbnN0IG5vZGVMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDQgPSBBUFgobm9kZUxpc3QpO1xuICpcbiAqIC8vIEFycmF5IG9mIGVsZW1lbnRzXG4gKiBjb25zdCBlbGVtZW50cyA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZTEnKSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUyJyldO1xuICogY29uc3QgYXB4NSA9IEFQWChlbGVtZW50cyk7XG4gKlxuICogLy8galF1ZXJ5IG9iamVjdFxuICogY29uc3QgJGV4YW1wbGUgPSAkKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4NiA9IEFQWCgkZXhhbXBsZSk7XG4gKlxuICogLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3RcbiAqIGNvbnN0IGFweDcgPSBBUFgoKCkgPT4gQVBYKCcuZXhhbXBsZScpKTtcbiAqL1xuY29uc3QgQVBYID0gZnVuY3Rpb24gKGlucHV0LCBjb250ZXh0ID0gZG9jdW1lbnQpIHtcbiAgICBsZXQgZWxlbWVudHM7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb250ZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQVBYLmlzQVBYT2JqZWN0KGNvbnRleHQpKSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmZpcnN0KCk7XG4gICAgfSBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjb250ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250ZXh0IGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgIC8vIFhQYXRoIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGRvY3VtZW50LmV2YWx1YXRlKGlucHV0LCBjb250ZXh0LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBsZXQgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnRzLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMgPSBub2RlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ1NTIHNlbGVjdG9yIHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChpbnB1dCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmdsZSBlbGVtZW50IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5jb250YWlucyhpbnB1dCkgPyBbaW5wdXRdIDogW107XG4gICAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGlucHV0IGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb24pIHtcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0KS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgaW5wdXQuZXZlcnkoZWwgPT4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgLy8gQXJyYXkgb2YgZWxlbWVudHMgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBpbnB1dC5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGpRdWVyeSAhPSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIGpRdWVyeSkge1xuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0IHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dC5nZXQoKSkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBUFgoaW5wdXQoKSwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHR5cGUgZm9yIEFQWCcpO1xuICAgIH1cblxuICAgIHZhciBhcHggPSB7XG4gICAgICAgIGVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICAgICAgX2lzQVBYT2JqZWN0OiB0cnVlXG4gICAgfTtcbiAgICBhcHgubGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuICAgIGFweC5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuZWxlbWVudHMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIEFycmF5LmZyb20odGhpcy5lbGVtZW50cykuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07XG4gICAgfTtcbiAgICBhcHguYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gdGhpcy5lbGVtZW50cztcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgYXB4LmZpcnN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoMCk7XG4gICAgfTtcbiAgICBhdWdtZW50V2l0aExpc3RlbihhcHgpO1xuICAgIGF1Z21lbnRXaXRoVHJpc3RhdGUoYXB4KTtcbiAgICBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZShhcHgpO1xuICAgIGF1Z21lbnRXaXRoUGFjayhhcHgpO1xuICAgIHJldHVybiBhcHg7XG59O1xuXG5BUFgubG9hZENzcyA9IGxvYWRDc3M7XG5BUFguZGlhbG9nID0gZGlhbG9nO1xuQVBYLnRvYXN0ID0gdG9hc3Q7XG5BUFgudG9vbHMgPSB0b29scztcbkFQWC5pc0FQWE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gb2JqICYmIG9iai5faXNBUFhPYmplY3QgPT09IHRydWU7XG59XG5BUFguaXNfbnVtZXJpYyA9IChuKSA9PiB7XG4gICAgcmV0dXJuICFpc05hTihuIC0gcGFyc2VGbG9hdChuKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFQWDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=