@appius-fr/apx 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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) */
195
-
196
- .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;
200
- width: 100%;
201
- }
202
-
203
- /* Table with no tfoot: thead + tbody only */
204
- .apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
205
- grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px));
206
- }
207
-
208
- /* Table with no thead: tbody + tfoot only */
209
- .apx-scrollable-table.apx-scrollable-table--no-thead {
210
- grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;
211
- }
212
-
213
- /* Table with neither thead nor tfoot: tbody only */
214
- .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));
216
- }
217
-
218
- .apx-scrollable-table > thead,
219
- .apx-scrollable-table > tbody,
220
- .apx-scrollable-table > tfoot {
221
- display: grid;
222
- grid-template-columns: subgrid;
223
- grid-column: 1 / -1;
224
- grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
225
- min-height: 0;
226
- }
227
-
228
- .apx-scrollable-table > thead {
229
- grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
230
- }
231
-
232
- .apx-scrollable-table > tbody {
233
- grid-template-rows: repeat(var(--apx-scrollable-tbody-rows, 1), auto);
234
- 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
- }
238
-
239
- .apx-scrollable-table > tfoot {
240
- grid-template-rows: repeat(var(--apx-scrollable-tfoot-rows, 1), auto);
241
- }
242
-
243
- .apx-scrollable-table > thead > tr,
244
- .apx-scrollable-table > tbody > tr,
245
- .apx-scrollable-table > tfoot > tr {
246
- display: contents;
247
- }
248
-
249
- .apx-scrollable-table th,
250
- .apx-scrollable-table td {
251
- /* Grid placement set by JS (grid-row, grid-column) for colspan/rowspan */
252
- min-width: 0;
253
- }
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":""}]);
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. */
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 */
200
+ .apx-scrollable-table {
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;
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);
210
+ }
211
+
212
+ /* Table with no tfoot: thead + tbody only */
213
+ .apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
214
+ grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
215
+ }
216
+
217
+ /* Table with no thead: tbody + tfoot only */
218
+ .apx-scrollable-table.apx-scrollable-table--no-thead {
219
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;
220
+ }
221
+
222
+ /* Table with neither thead nor tfoot: tbody only */
223
+ .apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
224
+ grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));
225
+ }
226
+
227
+ /* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */
228
+ .apx-scrollable-table > thead,
229
+ .apx-scrollable-table > tbody,
230
+ .apx-scrollable-table > tfoot {
231
+ display: grid !important;
232
+ grid-template-columns: subgrid;
233
+ grid-column: 1 / -1;
234
+ min-height: 0;
235
+ }
236
+
237
+ .apx-scrollable-table > thead {
238
+ grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));
239
+ }
240
+
241
+ .apx-scrollable-table > tbody {
242
+ grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));
243
+ overflow: auto;
244
+ }
245
+
246
+ .apx-scrollable-table > tfoot {
247
+ grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));
248
+ }
249
+
250
+ .apx-scrollable-table > thead > tr,
251
+ .apx-scrollable-table > tbody > tr,
252
+ .apx-scrollable-table > tfoot > tr {
253
+ display: contents !important;
254
+ }
255
+
256
+ .apx-scrollable-table th,
257
+ .apx-scrollable-table td {
258
+ min-width: 0;
259
+ box-sizing: border-box;
260
+ }
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)\n Use !important so page styles (e.g. display: table) do not override the grid layout. */\n\n/* --apx-scrollable-template-columns: set by JS (measured widths + gutter); fallback = equal columns + gutter */\n/* --apx-scrollable-gutter-width: space for vertical scrollbar so it does not overlap the last column (set to 0 to allow overlap) */\n/* --apx-scrollable-body-height: when class apx-scrollable-table--body-height is set, tbody row uses fixed height instead of max-height */\n.apx-scrollable-table {\n display: grid !important;\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)));\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\n width: 100%;\n table-layout: unset !important;\n}\n\n.apx-scrollable-table--body-height {\n --apx-scrollable-body-row-size: var(--apx-scrollable-body-max-height, 200px);\n}\n\n/* Table with no tfoot: thead + tbody only */\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\n grid-template-rows: auto var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\n}\n\n/* Table with no thead: tbody + tfoot only */\n.apx-scrollable-table.apx-scrollable-table--no-thead {\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px))) auto;\n}\n\n/* Table with neither thead nor tfoot: tbody only */\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\n grid-template-rows: var(--apx-scrollable-body-row-size, fit-content(var(--apx-scrollable-body-max-height, 200px)));\n}\n\n/* --apx-scrollable-*-template-rows: set by JS (measured heights) or override in CSS / via options */\n.apx-scrollable-table > thead,\n.apx-scrollable-table > tbody,\n.apx-scrollable-table > tfoot {\n display: grid !important;\n grid-template-columns: subgrid;\n grid-column: 1 / -1;\n min-height: 0;\n}\n\n.apx-scrollable-table > thead {\n grid-template-rows: var(--apx-scrollable-thead-template-rows, repeat(var(--apx-scrollable-thead-rows, 1), auto));\n}\n\n.apx-scrollable-table > tbody {\n grid-template-rows: var(--apx-scrollable-tbody-template-rows, repeat(var(--apx-scrollable-tbody-rows, 1), auto));\n overflow: auto;\n}\n\n.apx-scrollable-table > tfoot {\n grid-template-rows: var(--apx-scrollable-tfoot-template-rows, repeat(var(--apx-scrollable-tfoot-rows, 1), auto));\n}\n\n.apx-scrollable-table > thead > tr,\n.apx-scrollable-table > tbody > tr,\n.apx-scrollable-table > tfoot > tr {\n display: contents !important;\n}\n\n.apx-scrollable-table th,\n.apx-scrollable-table td {\n min-width: 0;\n box-sizing: border-box;\n}\n"],"sourceRoot":""}]);
255
262
  // Exports
256
263
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
257
264
 
@@ -1245,35 +1252,6 @@ module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%
1245
1252
 
1246
1253
  module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
1247
1254
 
1248
- /***/ }),
1249
-
1250
- /***/ "./modules/common.mjs":
1251
- /*!****************************!*\
1252
- !*** ./modules/common.mjs ***!
1253
- \****************************/
1254
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
1255
-
1256
- __webpack_require__.r(__webpack_exports__);
1257
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1258
- /* harmony export */ loadCss: () => (/* binding */ loadCss)
1259
- /* harmony export */ });
1260
- // Function to load the CSS from a given URL
1261
- function loadCss(url) {
1262
- return fetch(url)
1263
- .then(response => response.text())
1264
- .then(css => {
1265
- const styleSheet = document.createElement("style");
1266
- styleSheet.type = "text/css";
1267
- styleSheet.textContent = css; // Use textContent instead of innerText
1268
- document.head.appendChild(styleSheet);
1269
- })
1270
- .catch(error => {
1271
- console.error("Failed to load CSS:", error);
1272
- });
1273
- }
1274
-
1275
-
1276
-
1277
1255
  /***/ }),
1278
1256
 
1279
1257
  /***/ "./modules/dialog/dialog.mjs":
@@ -1775,204 +1753,601 @@ __webpack_require__.r(__webpack_exports__);
1775
1753
  /* harmony export */ "default": () => (/* binding */ augmentWithScrollableTable)
1776
1754
  /* harmony export */ });
1777
1755
  /* harmony import */ var _css_scrollableTable_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/scrollableTable.css */ "./modules/scrollableTable/css/scrollableTable.css");
1778
-
1779
-
1780
- const DATA_KEY = '_apxScrollableTable';
1781
- const CLASS_TABLE = 'apx-scrollable-table';
1782
-
1783
- const DEFAULT_MAX_HEIGHT = '200px';
1784
-
1785
- /**
1786
- * Get number of columns from the first row that has cells (sum of colspan).
1787
- * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1788
- * @returns {number}
1789
- */
1790
- function getColumnCountFromSection(section) {
1791
- const firstRow = section?.querySelector(':scope > tr');
1792
- if (!firstRow) return 0;
1793
- let cols = 0;
1794
- firstRow.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1795
- cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
1796
- });
1797
- return cols;
1798
- }
1799
-
1800
- /**
1801
- * Get total column count for the table (from thead or tbody first row).
1802
- * @param {HTMLTableElement} table
1803
- * @returns {number}
1804
- */
1805
- function getTableColumnCount(table) {
1806
- const thead = table.querySelector('thead');
1807
- const tbody = table.querySelector('tbody');
1808
- const countFromThead = thead ? getColumnCountFromSection(thead) : 0;
1809
- const countFromTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1810
- return countFromThead || countFromTbody || 1;
1811
- }
1812
-
1813
- /**
1814
- * Count direct tr children in a section.
1815
- * @param {HTMLTableSectionElement} section
1816
- * @returns {number}
1817
- */
1818
- function getRowCount(section) {
1819
- if (!section) return 0;
1820
- return section.querySelectorAll(':scope > tr').length;
1821
- }
1822
-
1823
- /**
1824
- * Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
1825
- * Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
1826
- * @param {HTMLTableSectionElement} section
1827
- * @param {number} numRows
1828
- * @param {number} numCols
1829
- * @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
1830
- */
1831
- function computeCellPlacements(section, numRows, numCols) {
1832
- if (!section || numRows === 0 || numCols === 0) return [];
1833
- const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
1834
- const placements = [];
1835
- const rows = section.querySelectorAll(':scope > tr');
1836
-
1837
- for (let r = 0; r < rows.length; r++) {
1838
- const tr = rows[r];
1839
- const cells = tr.querySelectorAll(':scope > th, :scope > td');
1840
- for (const cell of cells) {
1841
- const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
1842
- const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
1843
- let col = 0;
1844
- while (col < numCols) {
1845
- let free = true;
1846
- for (let rr = r; rr < r + rowspan && free; rr++) {
1847
- for (let cc = col; cc < col + colspan && free; cc++) {
1848
- if (occupied[rr]?.[cc]) free = false;
1849
- }
1850
- }
1851
- if (free) break;
1852
- col++;
1853
- }
1854
- if (col + colspan > numCols) continue;
1855
- for (let rr = r; rr < r + rowspan; rr++) {
1856
- for (let cc = col; cc < col + colspan; cc++) {
1857
- if (occupied[rr]) occupied[rr][cc] = true;
1858
- }
1859
- }
1860
- placements.push({ cell, row: r, col, colspan, rowspan });
1861
- }
1862
- }
1863
- return placements;
1864
- }
1865
-
1866
- /**
1867
- * Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
1868
- */
1869
- function applyPlacements(placements) {
1870
- placements.forEach(({ cell, row, col, colspan, rowspan }) => {
1871
- cell.style.gridRow = `${row + 1} / span ${rowspan}`;
1872
- cell.style.gridColumn = `${col + 1} / span ${colspan}`;
1873
- });
1874
- }
1875
-
1876
- /**
1877
- * Clear grid placement styles from all th/td in a table (for refresh).
1878
- * @param {HTMLTableElement} table
1879
- */
1880
- function clearPlacements(table) {
1881
- table.querySelectorAll('th, td').forEach((cell) => {
1882
- cell.style.gridRow = '';
1883
- cell.style.gridColumn = '';
1884
- });
1885
- }
1886
-
1887
- /**
1888
- * Normalize maxHeight option to a CSS length string.
1889
- * @param {number|string} value
1890
- * @returns {string}
1891
- */
1892
- function normalizeMaxHeight(value) {
1893
- if (value == null) return DEFAULT_MAX_HEIGHT;
1894
- if (typeof value === 'number') return `${value}px`;
1895
- return String(value);
1896
- }
1897
-
1898
- /**
1899
- * Apply scrollable table layout to a single table.
1900
- * @param {HTMLTableElement} table
1901
- * @param {{ maxHeight?: number|string }} options
1902
- */
1903
- function applyScrollableTable(table, options) {
1904
- const thead = table.querySelector('thead');
1905
- const tbody = table.querySelector('tbody');
1906
- const tfoot = table.querySelector('tfoot');
1907
-
1908
- const numCols = getTableColumnCount(table);
1909
- if (numCols === 0) return;
1910
-
1911
- const theadRows = getRowCount(thead);
1912
- const tbodyRows = getRowCount(tbody);
1913
- const tfootRows = getRowCount(tfoot);
1914
-
1915
- table.style.setProperty('--apx-scrollable-cols', String(numCols));
1916
- table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
1917
- table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
1918
- table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
1919
- table.style.setProperty('--apx-scrollable-body-max-height', normalizeMaxHeight(options.maxHeight));
1920
-
1921
- table.classList.add(CLASS_TABLE);
1922
- table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
1923
- table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
1924
-
1925
- clearPlacements(table);
1926
-
1927
- 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) }
1931
- ];
1932
- sections.forEach(({ section, rows }) => {
1933
- if (!section) return;
1934
- const placements = computeCellPlacements(section, rows, numCols);
1935
- applyPlacements(placements);
1936
- });
1937
- }
1938
-
1939
- /**
1940
- * Augments the APX object with scrollableTable(options | 'refresh').
1941
- * Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
1942
- *
1943
- * @param {Object} apx - The APX object to augment.
1944
- * @example
1945
- * APX('table.data-grid').scrollableTable({ maxHeight: 300 });
1946
- * APX('table.data-grid').scrollableTable('refresh');
1947
- */
1948
- function augmentWithScrollableTable(apx) {
1949
- apx.scrollableTable = function (optionsOrAction) {
1950
- const isRefresh = optionsOrAction === 'refresh';
1951
- const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
1952
-
1953
- apx.elements.forEach((element) => {
1954
- if (element.tagName !== 'TABLE') return;
1955
- const table = /** @type {HTMLTableElement} */ (element);
1956
-
1957
- const ref = table[DATA_KEY];
1958
- if (ref) {
1959
- if (isRefresh) {
1960
- applyScrollableTable(table, ref.options);
1961
- } else if (options && Object.keys(options).length > 0) {
1962
- ref.options = { ...ref.options, ...options };
1963
- applyScrollableTable(table, ref.options);
1964
- }
1965
- return;
1966
- }
1967
- if (isRefresh) return;
1968
-
1969
- applyScrollableTable(table, options);
1970
- table[DATA_KEY] = { options: { ...options } };
1971
- });
1972
-
1973
- return apx;
1974
- };
1975
- }
1756
+ /* harmony import */ var _tools_getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/getScrollbarSize.mjs */ "./modules/tools/getScrollbarSize.mjs");
1757
+
1758
+
1759
+
1760
+ const DATA_KEY = '_apxScrollableTable';
1761
+ const CLASS_TABLE = 'apx-scrollable-table';
1762
+
1763
+ const DEFAULT_MAX_HEIGHT = '200px';
1764
+ const DEFAULT_GUTTER_PX = 17;
1765
+
1766
+ const THROTTLE_MS = 16;
1767
+
1768
+ /** @type {Set<HTMLTableElement>} */
1769
+ const dynamicTables = new Set();
1770
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1771
+ const scrollSourceToTables = new Map();
1772
+ /** @type {Map<Element, Set<HTMLTableElement>>} */
1773
+ const resizeSourceToTables = new Map();
1774
+ /** @type {boolean} */
1775
+ let resizeWindowAttached = false;
1776
+ /** @type {ResizeObserver|null} */
1777
+ let resizeObserver = null;
1778
+ /** @type {number} */
1779
+ let throttleLast = 0;
1780
+ /** @type {number|null} */
1781
+ let throttleRaf = null;
1782
+
1783
+ /**
1784
+ * Sum of colspans for one row (direct th/td children of tr).
1785
+ * @param {HTMLTableRowElement} tr
1786
+ * @returns {number}
1787
+ */
1788
+ function getRowColumnCount(tr) {
1789
+ let cols = 0;
1790
+ tr.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
1791
+ cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
1792
+ });
1793
+ return cols;
1794
+ }
1795
+
1796
+ /**
1797
+ * Get maximum column count in a section (max sum of colspans across all rows).
1798
+ * @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
1799
+ * @returns {number}
1800
+ */
1801
+ function getColumnCountFromSection(section) {
1802
+ if (!section) return 0;
1803
+ const rows = section.querySelectorAll(':scope > tr');
1804
+ let maxCols = 0;
1805
+ rows.forEach((tr) => {
1806
+ const sum = getRowColumnCount(tr);
1807
+ if (sum > maxCols) maxCols = sum;
1808
+ });
1809
+ return maxCols;
1810
+ }
1811
+
1812
+ /**
1813
+ * Get total column count for the table (max across thead, tbody, tfoot).
1814
+ * @param {HTMLTableElement} table
1815
+ * @returns {number}
1816
+ */
1817
+ function getTableColumnCount(table) {
1818
+ const thead = table.querySelector('thead');
1819
+ const tbody = table.querySelector('tbody');
1820
+ const tfoot = table.querySelector('tfoot');
1821
+ const countThead = thead ? getColumnCountFromSection(thead) : 0;
1822
+ const countTbody = tbody ? getColumnCountFromSection(tbody) : 0;
1823
+ const countTfoot = tfoot ? getColumnCountFromSection(tfoot) : 0;
1824
+ return Math.max(countThead, countTbody, countTfoot, 1);
1825
+ }
1826
+
1827
+ /**
1828
+ * Measure current column widths from the table in its natural layout (before applying scrollable class).
1829
+ * Prefers a row where each cell has colspan 1 so we get one width per column; otherwise splits cell widths by colspan.
1830
+ * @param {HTMLTableElement} table - table not yet with scrollable class
1831
+ * @param {number} numCols
1832
+ * @returns {number[]} pixel widths per column
1833
+ */
1834
+ function measureColumnWidths(table, numCols) {
1835
+ const thead = table.querySelector('thead');
1836
+ const tbody = table.querySelector('tbody');
1837
+ const sections = [thead, tbody].filter(Boolean);
1838
+ /** @type {HTMLTableRowElement|null} */
1839
+ let bestRow = null;
1840
+ for (const section of sections) {
1841
+ const rows = section.querySelectorAll(':scope > tr');
1842
+ for (const tr of rows) {
1843
+ const cells = tr.querySelectorAll(':scope > th, :scope > td');
1844
+ if (getRowColumnCount(tr) !== numCols) continue;
1845
+ const allSingle = Array.from(cells).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1);
1846
+ if (allSingle && cells.length === numCols) {
1847
+ bestRow = tr;
1848
+ break;
1849
+ }
1850
+ if (!bestRow) bestRow = tr;
1851
+ }
1852
+ if (bestRow && Array.from(bestRow.querySelectorAll(':scope > th, :scope > td')).every((c) => (parseInt(c.getAttribute('colspan'), 10) || 1) === 1))
1853
+ break;
1854
+ }
1855
+ if (!bestRow) return [];
1856
+
1857
+ const widths = new Array(numCols).fill(0);
1858
+ const cells = bestRow.querySelectorAll(':scope > th, :scope > td');
1859
+ let col = 0;
1860
+ for (const cell of cells) {
1861
+ const span = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols - col);
1862
+ if (span <= 0) break;
1863
+ const w = cell.getBoundingClientRect().width;
1864
+ const perCol = w / span;
1865
+ for (let i = 0; i < span; i++) widths[col + i] = perCol;
1866
+ col += span;
1867
+ }
1868
+ if (col === 0) return [];
1869
+ const fallback = widths.some((w) => w > 0) ? Math.max(80, ...widths.filter((w) => w > 0)) / 2 : 80;
1870
+ for (let i = 0; i < numCols; i++) if (widths[i] <= 0) widths[i] = fallback;
1871
+ return widths.slice(0, numCols);
1872
+ }
1873
+
1874
+ /**
1875
+ * Count direct tr children in a section.
1876
+ * @param {HTMLTableSectionElement} section
1877
+ * @returns {number}
1878
+ */
1879
+ function getRowCount(section) {
1880
+ if (!section) return 0;
1881
+ return section.querySelectorAll(':scope > tr').length;
1882
+ }
1883
+
1884
+ /**
1885
+ * Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
1886
+ * Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
1887
+ * @param {HTMLTableSectionElement} section
1888
+ * @param {number} numRows
1889
+ * @param {number} numCols
1890
+ * @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
1891
+ */
1892
+ function computeCellPlacements(section, numRows, numCols) {
1893
+ if (!section || numRows === 0 || numCols === 0) return [];
1894
+ const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
1895
+ const placements = [];
1896
+ const rows = section.querySelectorAll(':scope > tr');
1897
+
1898
+ for (let r = 0; r < rows.length; r++) {
1899
+ const tr = rows[r];
1900
+ const cells = tr.querySelectorAll(':scope > th, :scope > td');
1901
+ for (const cell of cells) {
1902
+ const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
1903
+ const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
1904
+ let col = 0;
1905
+ while (col < numCols) {
1906
+ let free = true;
1907
+ for (let rr = r; rr < r + rowspan && free; rr++) {
1908
+ for (let cc = col; cc < col + colspan && free; cc++) {
1909
+ if (occupied[rr]?.[cc]) free = false;
1910
+ }
1911
+ }
1912
+ if (free) break;
1913
+ col++;
1914
+ }
1915
+ if (col + colspan > numCols) continue;
1916
+ for (let rr = r; rr < r + rowspan; rr++) {
1917
+ for (let cc = col; cc < col + colspan; cc++) {
1918
+ if (occupied[rr]) occupied[rr][cc] = true;
1919
+ }
1920
+ }
1921
+ placements.push({ cell, row: r, col, colspan, rowspan });
1922
+ }
1923
+ }
1924
+ return placements;
1925
+ }
1926
+
1927
+ /**
1928
+ * Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
1929
+ */
1930
+ function applyPlacements(placements) {
1931
+ placements.forEach(({ cell, row, col, colspan, rowspan }) => {
1932
+ cell.style.gridRow = `${row + 1} / span ${rowspan}`;
1933
+ cell.style.gridColumn = `${col + 1} / span ${colspan}`;
1934
+ });
1935
+ }
1936
+
1937
+ /**
1938
+ * Clear grid placement styles from all th/td in a table (for refresh).
1939
+ * @param {HTMLTableElement} table
1940
+ */
1941
+ function clearPlacements(table) {
1942
+ table.querySelectorAll('th, td').forEach((cell) => {
1943
+ cell.style.gridRow = '';
1944
+ cell.style.gridColumn = '';
1945
+ });
1946
+ }
1947
+
1948
+ /**
1949
+ * Normalize height/maxHeight option to a CSS length string.
1950
+ * @param {number|string} value
1951
+ * @returns {string}
1952
+ */
1953
+ function normalizeHeight(value) {
1954
+ if (value == null) return DEFAULT_MAX_HEIGHT;
1955
+ if (typeof value === 'number') return `${value}px`;
1956
+ return String(value);
1957
+ }
1958
+
1959
+ /**
1960
+ * Resolve current body height from options: either bodyHeightDynamic.get(table) or static height/maxHeight.
1961
+ * @param {Object} options - scrollableTable options (may include bodyHeightDynamic, height, maxHeight)
1962
+ * @param {HTMLTableElement} table
1963
+ * @returns {{ bodySize: string, useFixedHeight: boolean }}
1964
+ */
1965
+ function resolveBodyHeight(options, table) {
1966
+ const dyn = options.bodyHeightDynamic;
1967
+ if (dyn && typeof dyn.get === 'function') {
1968
+ const value = dyn.get(table);
1969
+ const bodySize = normalizeHeight(value);
1970
+ const useFixedHeight = dyn.useAs === 'height';
1971
+ return { bodySize, useFixedHeight };
1972
+ }
1973
+ const useFixedHeight = options.height != null;
1974
+ const raw = useFixedHeight ? options.height : options.maxHeight;
1975
+ const bodySize = normalizeHeight(raw);
1976
+ return { bodySize, useFixedHeight };
1977
+ }
1978
+
1979
+ /**
1980
+ * Update only the tbody height CSS variable and class (used on scroll/resize for dynamic height).
1981
+ * @param {HTMLTableElement} table
1982
+ * @param {Object} options - full scrollableTable options (with ref.options when called from throttle)
1983
+ */
1984
+ function updateTableBodyHeight(table, options) {
1985
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
1986
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
1987
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
1988
+ }
1989
+
1990
+ /**
1991
+ * Run lazy cleanup then updateTableBodyHeight for all tables still in dynamicTables. (Called by throttled entry point or RAF.)
1992
+ */
1993
+ function flushDynamicHeightUpdate() {
1994
+ const toRemove = [];
1995
+ dynamicTables.forEach((table) => {
1996
+ if (!table.isConnected) toRemove.push(table);
1997
+ });
1998
+ toRemove.forEach((table) => removeTableFromDynamicSources(table));
1999
+ dynamicTables.forEach((table) => {
2000
+ const ref = table[DATA_KEY];
2001
+ if (ref?.options) updateTableBodyHeight(table, ref.options);
2002
+ });
2003
+ }
2004
+
2005
+ /**
2006
+ * Throttled entry: run flushDynamicHeightUpdate now or schedule with RAF.
2007
+ */
2008
+ function runDynamicHeightUpdate() {
2009
+ const now = Date.now();
2010
+ if (now - throttleLast < THROTTLE_MS) {
2011
+ if (!throttleRaf) {
2012
+ throttleRaf = requestAnimationFrame(() => {
2013
+ throttleRaf = null;
2014
+ throttleLast = Date.now();
2015
+ flushDynamicHeightUpdate();
2016
+ });
2017
+ }
2018
+ return;
2019
+ }
2020
+ throttleLast = now;
2021
+ flushDynamicHeightUpdate();
2022
+ }
2023
+
2024
+ /**
2025
+ * Resolve updateOn into scroll targets (Element[]) and resize: { window: boolean, elements: Element[] }.
2026
+ * @param {Object} options - options.bodyHeightDynamic.updateOn
2027
+ * @returns {{ scrollTargets: Element[], resizeWindow: boolean, resizeElements: Element[] }}
2028
+ */
2029
+ function resolveUpdateOn(options) {
2030
+ const u = options?.bodyHeightDynamic?.updateOn;
2031
+ const scrollOn = u?.scrollOn;
2032
+ const resizeOn = u?.resizeOn;
2033
+ const scrollTargets = [];
2034
+ if (scrollOn != null && Array.isArray(scrollOn) && scrollOn.length > 0) {
2035
+ scrollOn.forEach((x) => {
2036
+ if (x === 'document') scrollTargets.push(document.documentElement);
2037
+ else if (x && typeof x.addEventListener === 'function') scrollTargets.push(x);
2038
+ });
2039
+ } else if (u?.scroll === true) {
2040
+ scrollTargets.push(document.documentElement);
2041
+ scrollTargets.push(typeof window !== 'undefined' ? window : document.documentElement);
2042
+ }
2043
+ let resizeWindow = false;
2044
+ const resizeElements = [];
2045
+ if (resizeOn != null && Array.isArray(resizeOn) && resizeOn.length > 0) {
2046
+ resizeOn.forEach((x) => {
2047
+ if (x === 'window') resizeWindow = true;
2048
+ else if (x && typeof x.addEventListener === 'function') resizeElements.push(x);
2049
+ });
2050
+ } else if (u?.resize !== false) {
2051
+ resizeWindow = true;
2052
+ resizeElements.push(document.documentElement);
2053
+ }
2054
+ return { scrollTargets, resizeWindow, resizeElements };
2055
+ }
2056
+
2057
+ /**
2058
+ * Remove table from dynamicTables and from all scroll/resize Maps; detach listeners if Set becomes empty.
2059
+ * @param {HTMLTableElement} table
2060
+ */
2061
+ function removeTableFromDynamicSources(table) {
2062
+ dynamicTables.delete(table);
2063
+ scrollSourceToTables.forEach((set, el) => {
2064
+ set.delete(table);
2065
+ if (set.size === 0) {
2066
+ scrollSourceToTables.delete(el);
2067
+ el.removeEventListener('scroll', onScrollThrottled);
2068
+ }
2069
+ });
2070
+ resizeSourceToTables.forEach((set, el) => {
2071
+ set.delete(table);
2072
+ if (set.size === 0) {
2073
+ resizeSourceToTables.delete(el);
2074
+ if (resizeObserver) resizeObserver.unobserve(el);
2075
+ }
2076
+ });
2077
+ if (resizeWindowAttached && dynamicTables.size === 0) {
2078
+ window.removeEventListener('resize', onResizeThrottled);
2079
+ resizeWindowAttached = false;
2080
+ }
2081
+ }
2082
+
2083
+ function onScrollThrottled() {
2084
+ runDynamicHeightUpdate();
2085
+ }
2086
+
2087
+ function onResizeThrottled() {
2088
+ runDynamicHeightUpdate();
2089
+ }
2090
+
2091
+ /**
2092
+ * Register a table with bodyHeightDynamic: add to Set and attach scroll/resize listeners per updateOn.
2093
+ * @param {HTMLTableElement} table
2094
+ * @param {Object} options - full options (ref.options)
2095
+ */
2096
+ function registerDynamicTable(table, options) {
2097
+ const { scrollTargets, resizeWindow, resizeElements } = resolveUpdateOn(options);
2098
+ dynamicTables.add(table);
2099
+ scrollTargets.forEach((el) => {
2100
+ let set = scrollSourceToTables.get(el);
2101
+ if (!set) {
2102
+ set = new Set();
2103
+ scrollSourceToTables.set(el, set);
2104
+ el.addEventListener('scroll', onScrollThrottled, { passive: true });
2105
+ }
2106
+ set.add(table);
2107
+ });
2108
+ if (resizeWindow) {
2109
+ if (!resizeWindowAttached) {
2110
+ resizeWindowAttached = true;
2111
+ window.addEventListener('resize', onResizeThrottled, { passive: true });
2112
+ }
2113
+ }
2114
+ resizeElements.forEach((el) => {
2115
+ let set = resizeSourceToTables.get(el);
2116
+ if (!set) {
2117
+ set = new Set();
2118
+ resizeSourceToTables.set(el, set);
2119
+ if (!resizeObserver) resizeObserver = new ResizeObserver(onResizeThrottled);
2120
+ resizeObserver.observe(el);
2121
+ }
2122
+ set.add(table);
2123
+ });
2124
+ }
2125
+
2126
+ /**
2127
+ * Build grid-template-columns from measured widths and optional overrides per column.
2128
+ * @param {number} numCols
2129
+ * @param {number[]} columnWidths
2130
+ * @param {Object<number, string>|(string|null)[]} columnOverrides - map column index → CSS value (e.g. '2fr'), or array; null/empty = use measured
2131
+ * @param {string} [unit='fr'] - CSS unit for measured widths ('fr' or 'px')
2132
+ * @returns {string}
2133
+ */
2134
+ function buildTemplateColumns(numCols, columnWidths, columnOverrides, unit = 'fr') {
2135
+ if (!columnWidths || columnWidths.length !== numCols) return '';
2136
+ const get = (i) =>
2137
+ Array.isArray(columnOverrides) ? columnOverrides[i] : columnOverrides[i];
2138
+ const parts = [];
2139
+ for (let i = 0; i < numCols; i++) {
2140
+ const ov = get(i);
2141
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2142
+ parts.push(ov.trim());
2143
+ } else {
2144
+ parts.push(`${Math.round(columnWidths[i])}${unit}`);
2145
+ }
2146
+ }
2147
+ return parts.join(' ');
2148
+ }
2149
+
2150
+ /**
2151
+ * Build grid-template-rows from measured heights and optional overrides per row.
2152
+ * @param {number} numRows
2153
+ * @param {number[]} rowHeights
2154
+ * @param {Object<number, string>|(string|null)[]} rowOverrides - map row index → CSS value (e.g. '48px', '2fr'), or array; null/empty = use measured
2155
+ * @param {string} [unit='px'] - CSS unit for measured heights ('px' or 'fr')
2156
+ * @returns {string}
2157
+ */
2158
+ function buildTemplateRows(numRows, rowHeights, rowOverrides, unit = 'px') {
2159
+ if (!rowHeights || rowHeights.length < numRows) return '';
2160
+ const get = (i) =>
2161
+ Array.isArray(rowOverrides) ? rowOverrides[i] : rowOverrides?.[i];
2162
+ const parts = [];
2163
+ for (let i = 0; i < numRows; i++) {
2164
+ const ov = get(i);
2165
+ if (ov != null && typeof ov === 'string' && ov.trim() !== '') {
2166
+ parts.push(ov.trim());
2167
+ } else {
2168
+ parts.push(`${Math.round(rowHeights[i] ?? 0)}${unit}`);
2169
+ }
2170
+ }
2171
+ return parts.join(' ');
2172
+ }
2173
+
2174
+ /**
2175
+ * Measure each tr height in a section (table must not yet have scrollable class).
2176
+ * @param {HTMLTableSectionElement|null} section
2177
+ * @returns {number[]}
2178
+ */
2179
+ function measureRowHeights(section) {
2180
+ if (!section) return [];
2181
+ const rows = section.querySelectorAll(':scope > tr');
2182
+ return Array.from(rows).map((tr) => tr.getBoundingClientRect().height);
2183
+ }
2184
+
2185
+ /**
2186
+ * Apply scrollable table layout to a single table.
2187
+ * @param {HTMLTableElement} table
2188
+ * @param {Object} options - scrollableTable options
2189
+ * @param {number|string} [options.maxHeight] - Max height of tbody (default '200px'). Ignored when height or bodyHeightDynamic is set.
2190
+ * @param {number|string} [options.height] - Fixed height of tbody. Ignored when bodyHeightDynamic is set.
2191
+ * @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.
2192
+ * @param {string} [options.gridTemplateColumns]
2193
+ * @param {{ thead?: string, tbody?: string, tfoot?: string }} [options.gridTemplateRows]
2194
+ * @param {{ thead?: Object<number, string>|(string|null)[], tbody?: Object<number, string>|(string|null)[], tfoot?: Object<number, string>|(string|null)[] }} [options.rowOverrides]
2195
+ * @param {Object<number, string>|(string|null)[]} [options.columnOverrides]
2196
+ * @param {{ cols?: string, rows?: string }} [options.defaultSizingUnit] - CSS unit for measured widths/heights. cols defaults to 'fr', rows defaults to 'px'.
2197
+ * @param {{ columnWidths?: number[], rowHeights?: { thead?: number[], tbody?: number[], tfoot?: number[] } } | undefined} ref - existing ref when refreshing
2198
+ */
2199
+ function applyScrollableTable(table, options, ref) {
2200
+ const thead = table.querySelector('thead');
2201
+ const tbody = table.querySelector('tbody');
2202
+ const tfoot = table.querySelector('tfoot');
2203
+
2204
+ const numCols = getTableColumnCount(table);
2205
+ if (numCols === 0) return;
2206
+
2207
+ const alreadyScrollable = table.classList.contains(CLASS_TABLE);
2208
+ const customTemplate = typeof options.gridTemplateColumns === 'string' && options.gridTemplateColumns.trim().length > 0;
2209
+ const columnWidths = customTemplate
2210
+ ? null
2211
+ : (ref?.columnWidths ?? (alreadyScrollable ? null : measureColumnWidths(table, numCols)));
2212
+
2213
+ const theadRows = getRowCount(thead);
2214
+ const tbodyRows = getRowCount(tbody);
2215
+ const tfootRows = getRowCount(tfoot);
2216
+
2217
+ const rowHeights =
2218
+ ref?.rowHeights ??
2219
+ (alreadyScrollable
2220
+ ? null
2221
+ : {
2222
+ thead: measureRowHeights(thead),
2223
+ tbody: measureRowHeights(tbody),
2224
+ tfoot: measureRowHeights(tfoot)
2225
+ });
2226
+
2227
+ table.style.setProperty('--apx-scrollable-cols', String(numCols));
2228
+ table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
2229
+ table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
2230
+ table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
2231
+ const { bodySize, useFixedHeight } = resolveBodyHeight(options, table);
2232
+ table.style.setProperty('--apx-scrollable-body-max-height', bodySize);
2233
+ table.classList.toggle('apx-scrollable-table--body-height', useFixedHeight);
2234
+
2235
+ table.classList.add(CLASS_TABLE);
2236
+ table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
2237
+ table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
2238
+
2239
+ // Force reflow so the grid layout is established before setting measured template-columns.
2240
+ // Without this, the browser batches class + template into one pass and the tbody overflows horizontally.
2241
+ table.offsetHeight; // eslint-disable-line no-unused-expressions
2242
+
2243
+ const colUnit = options.defaultSizingUnit?.cols || 'fr';
2244
+ const rowUnit = options.defaultSizingUnit?.rows || 'px';
2245
+
2246
+ let gutterFallbackPx = DEFAULT_GUTTER_PX;
2247
+ try {
2248
+ const measured = (0,_tools_getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_1__.getScrollbarSize)('vertical');
2249
+ if (typeof measured === 'number' && Number.isFinite(measured) && measured >= 0) {
2250
+ gutterFallbackPx = measured;
2251
+ }
2252
+ } catch (_) {
2253
+ /* use DEFAULT_GUTTER_PX */
2254
+ }
2255
+ const gutterSuffix = ` minmax(var(--apx-scrollable-gutter-width, ${gutterFallbackPx}px), var(--apx-scrollable-gutter-width, ${gutterFallbackPx}px))`;
2256
+ if (customTemplate) {
2257
+ table.style.setProperty('--apx-scrollable-template-columns', options.gridTemplateColumns.trim() + gutterSuffix);
2258
+ } else if (columnWidths && columnWidths.length === numCols) {
2259
+ const template =
2260
+ options.columnOverrides != null
2261
+ ? buildTemplateColumns(numCols, columnWidths, options.columnOverrides, colUnit)
2262
+ : columnWidths.map((w) => `${Math.round(w)}${colUnit}`).join(' ');
2263
+ table.style.setProperty('--apx-scrollable-template-columns', template + gutterSuffix);
2264
+ } else {
2265
+ table.style.removeProperty('--apx-scrollable-template-columns');
2266
+ }
2267
+
2268
+ clearPlacements(table);
2269
+
2270
+ const sections = [
2271
+ { section: thead, rows: Math.max(1, theadRows), heights: rowHeights?.thead, key: 'thead' },
2272
+ { section: tbody, rows: Math.max(1, tbodyRows), heights: rowHeights?.tbody, key: 'tbody' },
2273
+ { section: tfoot, rows: Math.max(1, tfootRows), heights: rowHeights?.tfoot, key: 'tfoot' }
2274
+ ];
2275
+ const customRows = options.gridTemplateRows && typeof options.gridTemplateRows === 'object' ? options.gridTemplateRows : null;
2276
+ const rowOverrides = options.rowOverrides && typeof options.rowOverrides === 'object' ? options.rowOverrides : null;
2277
+ sections.forEach(({ section, rows, heights, key }) => {
2278
+ if (!section) return;
2279
+ const varName = `--apx-scrollable-${key}-template-rows`;
2280
+ const custom = customRows?.[key];
2281
+ const overrides = rowOverrides?.[key];
2282
+ if (typeof custom === 'string' && custom.trim().length > 0) {
2283
+ section.style.setProperty(varName, custom.trim());
2284
+ } else if (heights && heights.length >= rows) {
2285
+ const template =
2286
+ overrides != null
2287
+ ? buildTemplateRows(rows, heights.slice(0, rows), overrides, rowUnit)
2288
+ : heights
2289
+ .slice(0, rows)
2290
+ .map((h) => `${Math.round(h)}${rowUnit}`)
2291
+ .join(' ');
2292
+ section.style.setProperty(varName, template);
2293
+ } else {
2294
+ section.style.removeProperty(varName);
2295
+ }
2296
+ const placements = computeCellPlacements(section, rows, numCols);
2297
+ applyPlacements(placements);
2298
+ });
2299
+
2300
+ return { columnWidths, rowHeights };
2301
+ }
2302
+
2303
+ /**
2304
+ * Augments the APX object with scrollableTable(options | 'refresh').
2305
+ * Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
2306
+ *
2307
+ * @param {Object} apx - The APX object to augment.
2308
+ * @example
2309
+ * APX('table.data-grid').scrollableTable({ maxHeight: 300 });
2310
+ * APX('table.data-grid').scrollableTable('refresh');
2311
+ */
2312
+ function augmentWithScrollableTable(apx) {
2313
+ apx.scrollableTable = function (optionsOrAction) {
2314
+ const isRefresh = optionsOrAction === 'refresh';
2315
+ const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
2316
+
2317
+ apx.elements.forEach((element) => {
2318
+ if (element.tagName !== 'TABLE') return;
2319
+ const table = /** @type {HTMLTableElement} */ (element);
2320
+
2321
+ const ref = table[DATA_KEY];
2322
+ if (ref) {
2323
+ if (isRefresh) {
2324
+ applyScrollableTable(table, ref.options, ref);
2325
+ } else if (options && Object.keys(options).length > 0) {
2326
+ ref.options = { ...ref.options, ...options };
2327
+ const result = applyScrollableTable(table, ref.options, ref);
2328
+ if (result?.columnWidths) ref.columnWidths = result.columnWidths;
2329
+ if (result?.rowHeights) ref.rowHeights = result.rowHeights;
2330
+ }
2331
+ const currentOptions = ref.options;
2332
+ if (currentOptions?.bodyHeightDynamic) registerDynamicTable(table, currentOptions);
2333
+ else removeTableFromDynamicSources(table);
2334
+ return;
2335
+ }
2336
+ if (isRefresh) return;
2337
+
2338
+ console.log('[APX scrollableTable] create', table);
2339
+ const result = applyScrollableTable(table, options, undefined);
2340
+ table[DATA_KEY] = {
2341
+ options: { ...options },
2342
+ columnWidths: result?.columnWidths || undefined,
2343
+ rowHeights: result?.rowHeights || undefined
2344
+ };
2345
+ if (options?.bodyHeightDynamic) registerDynamicTable(table, options);
2346
+ });
2347
+
2348
+ return apx;
2349
+ };
2350
+ }
1976
2351
 
1977
2352
 
1978
2353
  /***/ }),
@@ -3202,24 +3577,34 @@ Object.assign(toast, {
3202
3577
  __webpack_require__.r(__webpack_exports__);
3203
3578
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3204
3579
  /* harmony export */ augmentWithPack: () => (/* reexport safe */ _form_packer_augment_apx_mjs__WEBPACK_IMPORTED_MODULE_0__["default"]),
3580
+ /* harmony export */ getScrollbarSize: () => (/* reexport safe */ _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__.getScrollbarSize),
3581
+ /* harmony export */ loadCss: () => (/* reexport safe */ _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__.loadCss),
3205
3582
  /* harmony export */ packFormToJSON: () => (/* reexport safe */ _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON),
3206
3583
  /* harmony export */ tools: () => (/* binding */ tools)
3207
3584
  /* harmony export */ });
3208
3585
  /* harmony import */ var _form_packer_augment_apx_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./form-packer/augment-apx.mjs */ "./modules/tools/form-packer/augment-apx.mjs");
3209
3586
  /* harmony import */ var _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./form-packer/packToJson.mjs */ "./modules/tools/form-packer/packToJson.mjs");
3587
+ /* harmony import */ var _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getScrollbarSize.mjs */ "./modules/tools/getScrollbarSize.mjs");
3588
+ /* harmony import */ var _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./loadCss.mjs */ "./modules/tools/loadCss.mjs");
3210
3589
  // Import des fonctions et modules des sous-modules
3211
3590
 
3212
3591
 
3213
3592
 
3593
+
3594
+
3214
3595
  // Export de la fonction d'augmentation
3215
3596
 
3216
3597
 
3217
3598
  // Export des fonctions utilitaires
3218
3599
 
3219
3600
 
3601
+
3602
+
3220
3603
  // Export d'un objet tools pour faciliter l'utilisation
3221
3604
  const tools = {
3222
- packFormToJSON: _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON
3605
+ packFormToJSON: _form_packer_packToJson_mjs__WEBPACK_IMPORTED_MODULE_1__.packFormToJSON,
3606
+ getScrollbarSize: _getScrollbarSize_mjs__WEBPACK_IMPORTED_MODULE_2__.getScrollbarSize,
3607
+ loadCss: _loadCss_mjs__WEBPACK_IMPORTED_MODULE_3__.loadCss
3223
3608
  };
3224
3609
 
3225
3610
 
@@ -3877,6 +4262,104 @@ const isPlainObject = (obj) => {
3877
4262
  };
3878
4263
 
3879
4264
 
4265
+ /***/ }),
4266
+
4267
+ /***/ "./modules/tools/getScrollbarSize.mjs":
4268
+ /*!********************************************!*\
4269
+ !*** ./modules/tools/getScrollbarSize.mjs ***!
4270
+ \********************************************/
4271
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
4272
+
4273
+ __webpack_require__.r(__webpack_exports__);
4274
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4275
+ /* harmony export */ getScrollbarSize: () => (/* binding */ getScrollbarSize)
4276
+ /* harmony export */ });
4277
+ function getScrollbarSize(orientation = "vertical") {
4278
+ if (!getScrollbarSize._cache) {
4279
+ const outer = document.createElement("div");
4280
+ Object.assign(outer.style, {
4281
+ position: "absolute",
4282
+ top: "-9999px",
4283
+ left: "-9999px",
4284
+ width: "100px",
4285
+ height: "100px",
4286
+ overflow: "scroll",
4287
+ });
4288
+
4289
+ document.body.appendChild(outer);
4290
+
4291
+ getScrollbarSize._cache = {
4292
+ vertical: outer.offsetWidth - outer.clientWidth,
4293
+ horizontal: outer.offsetHeight - outer.clientHeight,
4294
+ };
4295
+
4296
+ outer.remove();
4297
+ }
4298
+
4299
+ return getScrollbarSize._cache[orientation] ?? 0;
4300
+ }
4301
+
4302
+
4303
+ /***/ }),
4304
+
4305
+ /***/ "./modules/tools/loadCss.mjs":
4306
+ /*!***********************************!*\
4307
+ !*** ./modules/tools/loadCss.mjs ***!
4308
+ \***********************************/
4309
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
4310
+
4311
+ __webpack_require__.r(__webpack_exports__);
4312
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4313
+ /* harmony export */ loadCss: () => (/* binding */ loadCss)
4314
+ /* harmony export */ });
4315
+ const loadCssCache = new Map();
4316
+
4317
+ /**
4318
+ * Loads CSS from a URL and injects it into the document.
4319
+ * Idempotent: same URL returns the same Promise; duplicate loads are avoided.
4320
+ * @param {string} url - URL of the CSS file to load
4321
+ * @param {{ id?: string, media?: string, before?: Node }} [options] - Optional: id and media for the style element, before for insertion point
4322
+ * @returns {Promise<HTMLStyleElement>} Resolves with the injected style element; rejects on fetch failure or non-ok response
4323
+ */
4324
+ function loadCss(url, options = {}) {
4325
+ const cached = loadCssCache.get(url);
4326
+ if (cached) {
4327
+ return cached;
4328
+ }
4329
+
4330
+ const promise = fetch(url)
4331
+ .then((response) => {
4332
+ if (!response.ok) {
4333
+ throw new Error(`Failed to load CSS: ${response.status} ${response.statusText}`);
4334
+ }
4335
+ return response.text();
4336
+ })
4337
+ .then((css) => {
4338
+ const styleSheet = document.createElement("style");
4339
+ if (options.id) styleSheet.id = options.id;
4340
+ if (options.media) styleSheet.media = options.media;
4341
+ styleSheet.textContent = css;
4342
+
4343
+ const insertBefore = options.before;
4344
+ if (insertBefore && insertBefore.parentNode) {
4345
+ insertBefore.parentNode.insertBefore(styleSheet, insertBefore);
4346
+ } else {
4347
+ document.head.appendChild(styleSheet);
4348
+ }
4349
+
4350
+ return styleSheet;
4351
+ })
4352
+ .catch((error) => {
4353
+ loadCssCache.delete(url);
4354
+ console.error("Failed to load CSS:", error);
4355
+ throw error;
4356
+ });
4357
+
4358
+ loadCssCache.set(url, promise);
4359
+ return promise;
4360
+ }
4361
+
4362
+
3880
4363
  /***/ }),
3881
4364
 
3882
4365
  /***/ "./modules/tristate/tristate.mjs":
@@ -4303,9 +4786,7 @@ __webpack_require__.r(__webpack_exports__);
4303
4786
  /* harmony import */ var _modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/scrollableTable/scrollableTable.mjs */ "./modules/scrollableTable/scrollableTable.mjs");
4304
4787
  /* harmony import */ var _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/dialog/dialog.mjs */ "./modules/dialog/dialog.mjs");
4305
4788
  /* harmony import */ var _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/toast/toast.mjs */ "./modules/toast/toast.mjs");
4306
- /* harmony import */ var _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/common.mjs */ "./modules/common.mjs");
4307
- /* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
4308
-
4789
+ /* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
4309
4790
 
4310
4791
 
4311
4792
 
@@ -4413,14 +4894,14 @@ const APX = function (input, context = document) {
4413
4894
  (0,_modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(apx);
4414
4895
  (0,_modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(apx);
4415
4896
  (0,_modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(apx);
4416
- (0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.augmentWithPack)(apx);
4897
+ (0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.augmentWithPack)(apx);
4417
4898
  return apx;
4418
4899
  };
4419
4900
 
4420
- APX.loadCss = _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
4901
+ APX.loadCss = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
4421
4902
  APX.dialog = _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__["default"];
4422
4903
  APX.toast = _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__["default"];
4423
- APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.tools;
4904
+ APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_5__.tools;
4424
4905
  APX.isAPXObject = function (obj) {
4425
4906
  return obj && obj._isAPXObject === true;
4426
4907
  }
@@ -4434,4 +4915,4 @@ APX.is_numeric = (n) => {
4434
4915
  var __webpack_exports__default = __webpack_exports__["default"];
4435
4916
  export { __webpack_exports__default as default };
4436
4917
 
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==
4918
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtBQUNBOztBQUVBLGNBQWMsK0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvY3NzL3RvYXN0LmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzPzkyZmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2dldFNjcm9sbGJhclNpemUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9sb2FkQ3NzLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vQVBYLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogRGlhbG9nIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2cge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDEwMDI7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcclxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gICAgcGFkZGluZzogNDBweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxuICAgIG1heC13aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxufVxyXG5cclxuaDIuQVBYLWRpYWxvZy10aXRsZXtcclxuICAgIG1hcmdpbi10b3A6MDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2cge1xyXG4gICAgY29sb3I6ICNhYWE7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcclxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcclxuICAgIGNvbG9yOiAjMzMzO1xyXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl06Zm9jdXMge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgY29sb3I6ICNFQ0YwRjE7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcclxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBnYXA6IDEwcHg7XHJcbiAgICBtYXJnaW4tdG9wOjFlbTtcclxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXHJcbn1cclxuXHJcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XHJcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xyXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxyXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cclxufVxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xyXG4gICAgb3BhY2l0eTogMC41O1xyXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsbUJBQW1CO0FBQ25CO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMENBQTBDO0FBQzlDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQiwyQ0FBMkM7SUFDM0MsZ0RBQWdEO0FBQ3BEOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0FBQ3ZCOztBQUVBOztJQUVJLFdBQVc7SUFDWCxnQ0FBZ0M7SUFDaEMsZUFBZTtBQUNuQjs7QUFFQSx5QkFBeUI7QUFDekI7Ozs7SUFJSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGdEQUFnRDtJQUNoRCxlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLDZCQUE2QjtBQUNqQzs7QUFFQTs7OztJQUlJLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsYUFBYTtBQUNqQjs7QUFFQSx5QkFBeUI7QUFDekI7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix3Q0FBd0M7QUFDNUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLGFBQWE7SUFDYixTQUFTO0lBQ1QsY0FBYztJQUNkLDRCQUE0QjtBQUNoQzs7QUFFQSxzQkFBc0I7QUFDdEI7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsNkNBQTZDO0FBQ2pEOztBQUVBO0lBQ0ksS0FBSyx1QkFBdUIsRUFBRTtJQUM5QixPQUFPLHlCQUF5QixFQUFFO0FBQ3RDO0FBQ0E7SUFDSSxZQUFZO0lBQ1osOEJBQThCO0lBQzlCLG9DQUFvQyxFQUFFLHFCQUFxQjtJQUMzRCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9DQUFvQyxFQUFFLHVCQUF1QjtJQUM3RCwwQkFBMEI7QUFDOUI7O0FBRUEsc0NBQXNDO0FBQ3RDO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsb0NBQW9DO0lBQ3BDLHdCQUF3QjtBQUM1QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBEaWFsb2cgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICB6LWluZGV4OiAxMDAyO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XFxyXFxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XFxyXFxuICAgIHBhZGRpbmc6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIG1pbi13aWR0aDogMzAwcHg7XFxyXFxuICAgIG1heC13aWR0aDogODAlO1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xcclxcbiAgICBtYXJnaW4tdG9wOjA7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nIHtcXHJcXG4gICAgY29sb3I6ICNhYWE7XFxyXFxuICAgIGZsb2F0OiByaWdodDtcXHJcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcXHJcXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXFxyXFxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcXHJcXG4gICAgY29sb3I6ICMzMzM7XFxyXFxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl0ge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cXHJcXG4gICAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgY29sb3I6ICNFQ0YwRjE7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBnYXA6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6MWVtO1xcclxcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGhlaWdodDogMTAwcHg7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XFxyXFxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xcclxcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XFxyXFxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XFxyXFxufVxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XFxyXFxuICAgIG9wYWNpdHk6IDAuNTtcXHJcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cXHJcXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcbiAgIFVzZSAhaW1wb3J0YW50IHNvIHBhZ2Ugc3R5bGVzIChlLmcuIGRpc3BsYXk6IHRhYmxlKSBkbyBub3Qgb3ZlcnJpZGUgdGhlIGdyaWQgbGF5b3V0LiAqL1xuXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXG4vKiAtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aDogc3BhY2UgZm9yIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSBsYXN0IGNvbHVtbiAoc2V0IHRvIDAgdG8gYWxsb3cgb3ZlcmxhcCkgKi9cbi8qIC0tYXB4LXNjcm9sbGFibGUtYm9keS1oZWlnaHQ6IHdoZW4gY2xhc3MgYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0IGlzIHNldCwgdGJvZHkgcm93IHVzZXMgZml4ZWQgaGVpZ2h0IGluc3RlYWQgb2YgbWF4LWhlaWdodCAqL1xuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS10ZW1wbGF0ZS1jb2x1bW5zLCByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtY29scywgMyksIG1pbm1heCgwLCAxZnIpKSBtaW5tYXgodmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAxN3B4KSwgdmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAxN3B4KSkpO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdGFibGUtbGF5b3V0OiB1bnNldCAhaW1wb3J0YW50O1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0IHtcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xufVxuXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gdmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1yb3ctc2l6ZSwgZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpKTtcbn1cblxuLyogVGFibGUgd2l0aCBubyB0aGVhZDogdGJvZHkgKyB0Zm9vdCBvbmx5ICovXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSkgYXV0bztcbn1cblxuLyogVGFibGUgd2l0aCBuZWl0aGVyIHRoZWFkIG5vciB0Zm9vdDogdGJvZHkgb25seSAqL1xuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZDpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XG59XG5cbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5LFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xuICAgIGRpc3BsYXk6IGdyaWQgIWltcG9ydGFudDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHN1YmdyaWQ7XG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcbiAgICBtaW4taGVpZ2h0OiAwO1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC10ZW1wbGF0ZS1yb3dzLCByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGhlYWQtcm93cywgMSksIGF1dG8pKTtcbn1cblxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkge1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290IHtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzLCAxKSwgYXV0bykpO1xufVxuXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0aGVhZCA+IHRyLFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xuICAgIGRpc3BsYXk6IGNvbnRlbnRzICFpbXBvcnRhbnQ7XG59XG5cbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0aCxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XG4gICAgbWluLXdpZHRoOiAwO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL2Nzcy9zY3JvbGxhYmxlVGFibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO3lGQUN5Rjs7QUFFekYsK0dBQStHO0FBQy9HLG1JQUFtSTtBQUNuSSx5SUFBeUk7QUFDekk7SUFDSSx3QkFBd0I7SUFDeEIsK01BQStNO0lBQy9NLDRIQUE0SDtJQUM1SCxXQUFXO0lBQ1gsOEJBQThCO0FBQ2xDOztBQUVBO0lBQ0ksNEVBQTRFO0FBQ2hGOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLHVIQUF1SDtBQUMzSDs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSx1SEFBdUg7QUFDM0g7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksa0hBQWtIO0FBQ3RIOztBQUVBLG9HQUFvRztBQUNwRzs7O0lBR0ksd0JBQXdCO0lBQ3hCLDhCQUE4QjtJQUM5QixtQkFBbUI7SUFDbkIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdIQUFnSDtBQUNwSDs7QUFFQTtJQUNJLGdIQUFnSDtJQUNoSCxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0hBQWdIO0FBQ3BIOztBQUVBOzs7SUFHSSw0QkFBNEI7QUFDaEM7O0FBRUE7O0lBRUksWUFBWTtJQUNaLHNCQUFzQjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBBUFggU2Nyb2xsYWJsZSBUYWJsZTogc2Nyb2xsYWJsZSB0Ym9keSB3aXRoIGZpeGVkIHRoZWFkL3Rmb290IGFuZCBhbGlnbmVkIGNvbHVtbnMgKENTUyBHcmlkICsgc3ViZ3JpZClcXG4gICBVc2UgIWltcG9ydGFudCBzbyBwYWdlIHN0eWxlcyAoZS5nLiBkaXNwbGF5OiB0YWJsZSkgZG8gbm90IG92ZXJyaWRlIHRoZSBncmlkIGxheW91dC4gKi9cXG5cXG4vKiAtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnM6IHNldCBieSBKUyAobWVhc3VyZWQgd2lkdGhzICsgZ3V0dGVyKTsgZmFsbGJhY2sgPSBlcXVhbCBjb2x1bW5zICsgZ3V0dGVyICovXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGg6IHNwYWNlIGZvciB2ZXJ0aWNhbCBzY3JvbGxiYXIgc28gaXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgbGFzdCBjb2x1bW4gKHNldCB0byAwIHRvIGFsbG93IG92ZXJsYXApICovXFxuLyogLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LWhlaWdodDogd2hlbiBjbGFzcyBhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQgaXMgc2V0LCB0Ym9keSByb3cgdXNlcyBmaXhlZCBoZWlnaHQgaW5zdGVhZCBvZiBtYXgtaGVpZ2h0ICovXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcXG4gICAgZGlzcGxheTogZ3JpZCAhaW1wb3J0YW50O1xcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpIG1pbm1heCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpLCB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ndXR0ZXItd2lkdGgsIDE3cHgpKSk7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB0YWJsZS1sYXlvdXQ6IHVuc2V0ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQge1xcbiAgICAtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemU6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpO1xcbn1cXG5cXG4vKiBUYWJsZSB3aXRoIG5vIHRmb290OiB0aGVhZCArIHRib2R5IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpO1xcbn1cXG5cXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkIHtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiB2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LXJvdy1zaXplLCBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkpIGF1dG87XFxufVxcblxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktcm93LXNpemUsIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSk7XFxufVxcblxcbi8qIC0tYXB4LXNjcm9sbGFibGUtKi10ZW1wbGF0ZS1yb3dzOiBzZXQgYnkgSlMgKG1lYXN1cmVkIGhlaWdodHMpIG9yIG92ZXJyaWRlIGluIENTUyAvIHZpYSBvcHRpb25zICovXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcbiAgICBkaXNwbGF5OiBncmlkICFpbXBvcnRhbnQ7XFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogc3ViZ3JpZDtcXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcXG4gICAgbWluLWhlaWdodDogMDtcXG59XFxuXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXRlbXBsYXRlLXJvd3MsIHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0bykpO1xcbn1cXG5cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MsIDEpLCBhdXRvKSk7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogdmFyKC0tYXB4LXNjcm9sbGFibGUtdGZvb3QtdGVtcGxhdGUtcm93cywgcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKSk7XFxufVxcblxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkgPiB0cixcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCA+IHRyIHtcXG4gICAgZGlzcGxheTogY29udGVudHMgIWltcG9ydGFudDtcXG59XFxuXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxuICAgIG1pbi13aWR0aDogMDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtC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MEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XG5pbXBvcnQgeyBnZXRTY3JvbGxiYXJTaXplIH0gZnJvbSAnLi4vdG9vbHMvZ2V0U2Nyb2xsYmFyU2l6ZS5tanMnO1xuXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcbmNvbnN0IENMQVNTX1RBQkxFID0gJ2FweC1zY3JvbGxhYmxlLXRhYmxlJztcblxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcbmNvbnN0IERFRkFVTFRfR1VUVEVSX1BYID0gMTc7XG5cbmNvbnN0IFRIUk9UVExFX01TID0gMTY7XG5cbi8qKiBAdHlwZSB7U2V0PEhUTUxUYWJsZUVsZW1lbnQ+fSAqL1xuY29uc3QgZHluYW1pY1RhYmxlcyA9IG5ldyBTZXQoKTtcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXG5jb25zdCBzY3JvbGxTb3VyY2VUb1RhYmxlcyA9IG5ldyBNYXAoKTtcbi8qKiBAdHlwZSB7TWFwPEVsZW1lbnQsIFNldDxIVE1MVGFibGVFbGVtZW50Pj59ICovXG5jb25zdCByZXNpemVTb3VyY2VUb1RhYmxlcyA9IG5ldyBNYXAoKTtcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCByZXNpemVXaW5kb3dBdHRhY2hlZCA9IGZhbHNlO1xuLyoqIEB0eXBlIHtSZXNpemVPYnNlcnZlcnxudWxsfSAqL1xubGV0IHJlc2l6ZU9ic2VydmVyID0gbnVsbDtcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IHRocm90dGxlTGFzdCA9IDA7XG4vKiogQHR5cGUge251bWJlcnxudWxsfSAqL1xubGV0IHRocm90dGxlUmFmID0gbnVsbDtcblxuLyoqXG4gKiBTdW0gb2YgY29sc3BhbnMgZm9yIG9uZSByb3cgKGRpcmVjdCB0aC90ZCBjaGlsZHJlbiBvZiB0cikuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVJvd0VsZW1lbnR9IHRyXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRSb3dDb2x1bW5Db3VudCh0cikge1xuICAgIGxldCBjb2xzID0gMDtcbiAgICB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKS5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgIGNvbHMgKz0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHM7XG59XG5cbi8qKlxuICogR2V0IG1heGltdW0gY29sdW1uIGNvdW50IGluIGEgc2VjdGlvbiAobWF4IHN1bSBvZiBjb2xzcGFucyBhY3Jvc3MgYWxsIHJvd3MpLlxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvbiAtIHRoZWFkLCB0Ym9keSwgb3IgdGZvb3RcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24oc2VjdGlvbikge1xuICAgIGlmICghc2VjdGlvbikgcmV0dXJuIDA7XG4gICAgY29uc3Qgcm93cyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKTtcbiAgICBsZXQgbWF4Q29scyA9IDA7XG4gICAgcm93cy5mb3JFYWNoKCh0cikgPT4ge1xuICAgICAgICBjb25zdCBzdW0gPSBnZXRSb3dDb2x1bW5Db3VudCh0cik7XG4gICAgICAgIGlmIChzdW0gPiBtYXhDb2xzKSBtYXhDb2xzID0gc3VtO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXhDb2xzO1xufVxuXG4vKipcbiAqIEdldCB0b3RhbCBjb2x1bW4gY291bnQgZm9yIHRoZSB0YWJsZSAobWF4IGFjcm9zcyB0aGVhZCwgdGJvZHksIHRmb290KS5cbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcbiAgICBjb25zdCBjb3VudFRoZWFkID0gdGhlYWQgPyBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHRoZWFkKSA6IDA7XG4gICAgY29uc3QgY291bnRUYm9keSA9IHRib2R5ID8gZ2V0Q29sdW1uQ291bnRGcm9tU2VjdGlvbih0Ym9keSkgOiAwO1xuICAgIGNvbnN0IGNvdW50VGZvb3QgPSB0Zm9vdCA/IGdldENvbHVtbkNvdW50RnJvbVNlY3Rpb24odGZvb3QpIDogMDtcbiAgICByZXR1cm4gTWF0aC5tYXgoY291bnRUaGVhZCwgY291bnRUYm9keSwgY291bnRUZm9vdCwgMSk7XG59XG5cbi8qKlxuICogTWVhc3VyZSBjdXJyZW50IGNvbHVtbiB3aWR0aHMgZnJvbSB0aGUgdGFibGUgaW4gaXRzIG5hdHVyYWwgbGF5b3V0IChiZWZvcmUgYXBwbHlpbmcgc2Nyb2xsYWJsZSBjbGFzcykuXG4gKiBQcmVmZXJzIGEgcm93IHdoZXJlIGVhY2ggY2VsbCBoYXMgY29sc3BhbiAxIHNvIHdlIGdldCBvbmUgd2lkdGggcGVyIGNvbHVtbjsgb3RoZXJ3aXNlIHNwbGl0cyBjZWxsIHdpZHRocyBieSBjb2xzcGFuLlxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZSAtIHRhYmxlIG5vdCB5ZXQgd2l0aCBzY3JvbGxhYmxlIGNsYXNzXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQ29sc1xuICogQHJldHVybnMge251bWJlcltdfSBwaXhlbCB3aWR0aHMgcGVyIGNvbHVtblxuICovXG5mdW5jdGlvbiBtZWFzdXJlQ29sdW1uV2lkdGhzKHRhYmxlLCBudW1Db2xzKSB7XG4gICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcbiAgICBjb25zdCBzZWN0aW9ucyA9IFt0aGVhZCwgdGJvZHldLmZpbHRlcihCb29sZWFuKTtcbiAgICAvKiogQHR5cGUge0hUTUxUYWJsZVJvd0VsZW1lbnR8bnVsbH0gKi9cbiAgICBsZXQgYmVzdFJvdyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XG4gICAgICAgIGZvciAoY29uc3QgdHIgb2Ygcm93cykge1xuICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0ci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKTtcbiAgICAgICAgICAgIGlmIChnZXRSb3dDb2x1bW5Db3VudCh0cikgIT09IG51bUNvbHMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgYWxsU2luZ2xlID0gQXJyYXkuZnJvbShjZWxscykuZXZlcnkoKGMpID0+IChwYXJzZUludChjLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSkgPT09IDEpO1xuICAgICAgICAgICAgaWYgKGFsbFNpbmdsZSAmJiBjZWxscy5sZW5ndGggPT09IG51bUNvbHMpIHtcbiAgICAgICAgICAgICAgICBiZXN0Um93ID0gdHI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJlc3RSb3cpIGJlc3RSb3cgPSB0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdFJvdyAmJiBBcnJheS5mcm9tKGJlc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJykpLmV2ZXJ5KChjKSA9PiAocGFyc2VJbnQoYy5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDEpID09PSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIWJlc3RSb3cpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHdpZHRocyA9IG5ldyBBcnJheShudW1Db2xzKS5maWxsKDApO1xuICAgIGNvbnN0IGNlbGxzID0gYmVzdFJvdy5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0aCwgOnNjb3BlID4gdGQnKTtcbiAgICBsZXQgY29sID0gMDtcbiAgICBmb3IgKGNvbnN0IGNlbGwgb2YgY2VsbHMpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IE1hdGgubWluKHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxLCBudW1Db2xzIC0gY29sKTtcbiAgICAgICAgaWYgKHNwYW4gPD0gMCkgYnJlYWs7XG4gICAgICAgIGNvbnN0IHcgPSBjZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBwZXJDb2wgPSB3IC8gc3BhbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFuOyBpKyspIHdpZHRoc1tjb2wgKyBpXSA9IHBlckNvbDtcbiAgICAgICAgY29sICs9IHNwYW47XG4gICAgfVxuICAgIGlmIChjb2wgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBmYWxsYmFjayA9IHdpZHRocy5zb21lKCh3KSA9PiB3ID4gMCkgPyBNYXRoLm1heCg4MCwgLi4ud2lkdGhzLmZpbHRlcigodykgPT4gdyA+IDApKSAvIDIgOiA4MDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHM7IGkrKykgaWYgKHdpZHRoc1tpXSA8PSAwKSB3aWR0aHNbaV0gPSBmYWxsYmFjaztcbiAgICByZXR1cm4gd2lkdGhzLnNsaWNlKDAsIG51bUNvbHMpO1xufVxuXG4vKipcbiAqIENvdW50IGRpcmVjdCB0ciBjaGlsZHJlbiBpbiBhIHNlY3Rpb24uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRSb3dDb3VudChzZWN0aW9uKSB7XG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gMDtcbiAgICByZXR1cm4gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIDJEIGdyaWQgb2Ygb2NjdXBpZWQgc2xvdHMgZm9yIGEgc2VjdGlvbiAoZm9yIHJvd3NwYW4vY29sc3BhbiBwbGFjZW1lbnQpLlxuICogUGxhY2UgZWFjaCBjZWxsIGluIERPTSBvcmRlcjsgcmV0dXJuIGEgbGlzdCBvZiB7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcbiAqIEByZXR1cm5zIHt7IGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCByb3c6IG51bWJlciwgY29sOiBudW1iZXIsIGNvbHNwYW46IG51bWJlciwgcm93c3BhbjogbnVtYmVyIH1bXX1cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIG51bVJvd3MsIG51bUNvbHMpIHtcbiAgICBpZiAoIXNlY3Rpb24gfHwgbnVtUm93cyA9PT0gMCB8fCBudW1Db2xzID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3Qgb2NjdXBpZWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Sb3dzIH0sICgpID0+IEFycmF5KG51bUNvbHMpLmZpbGwoZmFsc2UpKTtcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gW107XG4gICAgY29uc3Qgcm93cyA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKTtcblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICBjb25zdCB0ciA9IHJvd3Nbcl07XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiBjZWxscykge1xuICAgICAgICAgICAgY29uc3QgY29sc3BhbiA9IE1hdGgubWluKHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdjb2xzcGFuJyksIDEwKSB8fCAxLCBudW1Db2xzKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd3NwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpLCAxMCkgfHwgMSwgbnVtUm93cyAtIHIpO1xuICAgICAgICAgICAgbGV0IGNvbCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY29sIDwgbnVtQ29scykge1xuICAgICAgICAgICAgICAgIGxldCBmcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW4gJiYgZnJlZTsgcnIrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjYyA9IGNvbDsgY2MgPCBjb2wgKyBjb2xzcGFuICYmIGZyZWU7IGNjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY2N1cGllZFtycl0/LltjY10pIGZyZWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJlZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgY29sKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sICsgY29sc3BhbiA+IG51bUNvbHMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgcnIgPSByOyByciA8IHIgKyByb3dzcGFuOyBycisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2MgPSBjb2w7IGNjIDwgY29sICsgY29sc3BhbjsgY2MrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdKSBvY2N1cGllZFtycl1bY2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwbGFjZW1lbnRzLnB1c2goeyBjZWxsLCByb3c6IHIsIGNvbCwgY29sc3Bhbiwgcm93c3BhbiB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGxhY2VtZW50cztcbn1cblxuLyoqXG4gKiBBcHBseSBncmlkIHBsYWNlbWVudCBzdHlsZXMgdG8gYSBsaXN0IG9mIHBsYWNlbWVudHMgKDEtYmFzZWQgbGluZSBudW1iZXJzIGZvciBDU1MgR3JpZCkuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKSB7XG4gICAgcGxhY2VtZW50cy5mb3JFYWNoKCh7IGNlbGwsIHJvdywgY29sLCBjb2xzcGFuLCByb3dzcGFuIH0pID0+IHtcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkUm93ID0gYCR7cm93ICsgMX0gLyBzcGFuICR7cm93c3Bhbn1gO1xuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSBgJHtjb2wgKyAxfSAvIHNwYW4gJHtjb2xzcGFufWA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ2xlYXIgZ3JpZCBwbGFjZW1lbnQgc3R5bGVzIGZyb20gYWxsIHRoL3RkIGluIGEgdGFibGUgKGZvciByZWZyZXNoKS5cbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJQbGFjZW1lbnRzKHRhYmxlKSB7XG4gICAgdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgsIHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICBjZWxsLnN0eWxlLmdyaWRSb3cgPSAnJztcbiAgICAgICAgY2VsbC5zdHlsZS5ncmlkQ29sdW1uID0gJyc7XG4gICAgfSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGhlaWdodC9tYXhIZWlnaHQgb3B0aW9uIHRvIGEgQ1NTIGxlbmd0aCBzdHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVIZWlnaHQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIERFRkFVTFRfTUFYX0hFSUdIVDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIGAke3ZhbHVlfXB4YDtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGN1cnJlbnQgYm9keSBoZWlnaHQgZnJvbSBvcHRpb25zOiBlaXRoZXIgYm9keUhlaWdodER5bmFtaWMuZ2V0KHRhYmxlKSBvciBzdGF0aWMgaGVpZ2h0L21heEhlaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKG1heSBpbmNsdWRlIGJvZHlIZWlnaHREeW5hbWljLCBoZWlnaHQsIG1heEhlaWdodClcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcbiAqIEByZXR1cm5zIHt7IGJvZHlTaXplOiBzdHJpbmcsIHVzZUZpeGVkSGVpZ2h0OiBib29sZWFuIH19XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKSB7XG4gICAgY29uc3QgZHluID0gb3B0aW9ucy5ib2R5SGVpZ2h0RHluYW1pYztcbiAgICBpZiAoZHluICYmIHR5cGVvZiBkeW4uZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZHluLmdldCh0YWJsZSk7XG4gICAgICAgIGNvbnN0IGJvZHlTaXplID0gbm9ybWFsaXplSGVpZ2h0KHZhbHVlKTtcbiAgICAgICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBkeW4udXNlQXMgPT09ICdoZWlnaHQnO1xuICAgICAgICByZXR1cm4geyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfTtcbiAgICB9XG4gICAgY29uc3QgdXNlRml4ZWRIZWlnaHQgPSBvcHRpb25zLmhlaWdodCAhPSBudWxsO1xuICAgIGNvbnN0IHJhdyA9IHVzZUZpeGVkSGVpZ2h0ID8gb3B0aW9ucy5oZWlnaHQgOiBvcHRpb25zLm1heEhlaWdodDtcbiAgICBjb25zdCBib2R5U2l6ZSA9IG5vcm1hbGl6ZUhlaWdodChyYXcpO1xuICAgIHJldHVybiB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBvbmx5IHRoZSB0Ym9keSBoZWlnaHQgQ1NTIHZhcmlhYmxlIGFuZCBjbGFzcyAodXNlZCBvbiBzY3JvbGwvcmVzaXplIGZvciBkeW5hbWljIGhlaWdodCkuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgc2Nyb2xsYWJsZVRhYmxlIG9wdGlvbnMgKHdpdGggcmVmLm9wdGlvbnMgd2hlbiBjYWxsZWQgZnJvbSB0aHJvdHRsZSlcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFibGVCb2R5SGVpZ2h0KHRhYmxlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBib2R5U2l6ZSwgdXNlRml4ZWRIZWlnaHQgfSA9IHJlc29sdmVCb2R5SGVpZ2h0KG9wdGlvbnMsIHRhYmxlKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQnLCBib2R5U2l6ZSk7XG4gICAgdGFibGUuY2xhc3NMaXN0LnRvZ2dsZSgnYXB4LXNjcm9sbGFibGUtdGFibGUtLWJvZHktaGVpZ2h0JywgdXNlRml4ZWRIZWlnaHQpO1xufVxuXG4vKipcbiAqIFJ1biBsYXp5IGNsZWFudXAgdGhlbiB1cGRhdGVUYWJsZUJvZHlIZWlnaHQgZm9yIGFsbCB0YWJsZXMgc3RpbGwgaW4gZHluYW1pY1RhYmxlcy4gKENhbGxlZCBieSB0aHJvdHRsZWQgZW50cnkgcG9pbnQgb3IgUkFGLilcbiAqL1xuZnVuY3Rpb24gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCkge1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgZHluYW1pY1RhYmxlcy5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBpZiAoIXRhYmxlLmlzQ29ubmVjdGVkKSB0b1JlbW92ZS5wdXNoKHRhYmxlKTtcbiAgICB9KTtcbiAgICB0b1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4gcmVtb3ZlVGFibGVGcm9tRHluYW1pY1NvdXJjZXModGFibGUpKTtcbiAgICBkeW5hbWljVGFibGVzLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcbiAgICAgICAgaWYgKHJlZj8ub3B0aW9ucykgdXBkYXRlVGFibGVCb2R5SGVpZ2h0KHRhYmxlLCByZWYub3B0aW9ucyk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhyb3R0bGVkIGVudHJ5OiBydW4gZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlIG5vdyBvciBzY2hlZHVsZSB3aXRoIFJBRi5cbiAqL1xuZnVuY3Rpb24gcnVuRHluYW1pY0hlaWdodFVwZGF0ZSgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aHJvdHRsZUxhc3QgPCBUSFJPVFRMRV9NUykge1xuICAgICAgICBpZiAoIXRocm90dGxlUmFmKSB7XG4gICAgICAgICAgICB0aHJvdHRsZVJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3R0bGVSYWYgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm90dGxlTGFzdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgZmx1c2hEeW5hbWljSGVpZ2h0VXBkYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm90dGxlTGFzdCA9IG5vdztcbiAgICBmbHVzaER5bmFtaWNIZWlnaHRVcGRhdGUoKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHVwZGF0ZU9uIGludG8gc2Nyb2xsIHRhcmdldHMgKEVsZW1lbnRbXSkgYW5kIHJlc2l6ZTogeyB3aW5kb3c6IGJvb2xlYW4sIGVsZW1lbnRzOiBFbGVtZW50W10gfS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucy5ib2R5SGVpZ2h0RHluYW1pYy51cGRhdGVPblxuICogQHJldHVybnMge3sgc2Nyb2xsVGFyZ2V0czogRWxlbWVudFtdLCByZXNpemVXaW5kb3c6IGJvb2xlYW4sIHJlc2l6ZUVsZW1lbnRzOiBFbGVtZW50W10gfX1cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVwZGF0ZU9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCB1ID0gb3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWM/LnVwZGF0ZU9uO1xuICAgIGNvbnN0IHNjcm9sbE9uID0gdT8uc2Nyb2xsT247XG4gICAgY29uc3QgcmVzaXplT24gPSB1Py5yZXNpemVPbjtcbiAgICBjb25zdCBzY3JvbGxUYXJnZXRzID0gW107XG4gICAgaWYgKHNjcm9sbE9uICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShzY3JvbGxPbikgJiYgc2Nyb2xsT24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzY3JvbGxPbi5mb3JFYWNoKCh4KSA9PiB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gJ2RvY3VtZW50Jykgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh4ICYmIHR5cGVvZiB4LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHNjcm9sbFRhcmdldHMucHVzaCh4KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh1Py5zY3JvbGwgPT09IHRydWUpIHtcbiAgICAgICAgc2Nyb2xsVGFyZ2V0cy5wdXNoKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIHNjcm9sbFRhcmdldHMucHVzaCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICAgIGxldCByZXNpemVXaW5kb3cgPSBmYWxzZTtcbiAgICBjb25zdCByZXNpemVFbGVtZW50cyA9IFtdO1xuICAgIGlmIChyZXNpemVPbiAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzaXplT24pICYmIHJlc2l6ZU9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzaXplT24uZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHggPT09ICd3aW5kb3cnKSByZXNpemVXaW5kb3cgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoeCAmJiB0eXBlb2YgeC5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXNpemVFbGVtZW50cy5wdXNoKHgpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHU/LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgcmVzaXplRWxlbWVudHMucHVzaChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4geyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH07XG59XG5cbi8qKlxuICogUmVtb3ZlIHRhYmxlIGZyb20gZHluYW1pY1RhYmxlcyBhbmQgZnJvbSBhbGwgc2Nyb2xsL3Jlc2l6ZSBNYXBzOyBkZXRhY2ggbGlzdGVuZXJzIGlmIFNldCBiZWNvbWVzIGVtcHR5LlxuICogQHBhcmFtIHtIVE1MVGFibGVFbGVtZW50fSB0YWJsZVxuICovXG5mdW5jdGlvbiByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSkge1xuICAgIGR5bmFtaWNUYWJsZXMuZGVsZXRlKHRhYmxlKTtcbiAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XG4gICAgICAgIHNldC5kZWxldGUodGFibGUpO1xuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHNjcm9sbFNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbFRocm90dGxlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXNpemVTb3VyY2VUb1RhYmxlcy5mb3JFYWNoKChzZXQsIGVsKSA9PiB7XG4gICAgICAgIHNldC5kZWxldGUodGFibGUpO1xuICAgICAgICBpZiAoc2V0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc2l6ZVNvdXJjZVRvVGFibGVzLmRlbGV0ZShlbCk7XG4gICAgICAgICAgICBpZiAocmVzaXplT2JzZXJ2ZXIpIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocmVzaXplV2luZG93QXR0YWNoZWQgJiYgZHluYW1pY1RhYmxlcy5zaXplID09PSAwKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblJlc2l6ZVRocm90dGxlZCk7XG4gICAgICAgIHJlc2l6ZVdpbmRvd0F0dGFjaGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvblNjcm9sbFRocm90dGxlZCgpIHtcbiAgICBydW5EeW5hbWljSGVpZ2h0VXBkYXRlKCk7XG59XG5cbmZ1bmN0aW9uIG9uUmVzaXplVGhyb3R0bGVkKCkge1xuICAgIHJ1bkR5bmFtaWNIZWlnaHRVcGRhdGUoKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHRhYmxlIHdpdGggYm9keUhlaWdodER5bmFtaWM6IGFkZCB0byBTZXQgYW5kIGF0dGFjaCBzY3JvbGwvcmVzaXplIGxpc3RlbmVycyBwZXIgdXBkYXRlT24uXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZ1bGwgb3B0aW9ucyAocmVmLm9wdGlvbnMpXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBzY3JvbGxUYXJnZXRzLCByZXNpemVXaW5kb3csIHJlc2l6ZUVsZW1lbnRzIH0gPSByZXNvbHZlVXBkYXRlT24ob3B0aW9ucyk7XG4gICAgZHluYW1pY1RhYmxlcy5hZGQodGFibGUpO1xuICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgbGV0IHNldCA9IHNjcm9sbFNvdXJjZVRvVGFibGVzLmdldChlbCk7XG4gICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBzY3JvbGxTb3VyY2VUb1RhYmxlcy5zZXQoZWwsIHNldCk7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbFRocm90dGxlZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldC5hZGQodGFibGUpO1xuICAgIH0pO1xuICAgIGlmIChyZXNpemVXaW5kb3cpIHtcbiAgICAgICAgaWYgKCFyZXNpemVXaW5kb3dBdHRhY2hlZCkge1xuICAgICAgICAgICAgcmVzaXplV2luZG93QXR0YWNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplVGhyb3R0bGVkLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzaXplRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgbGV0IHNldCA9IHJlc2l6ZVNvdXJjZVRvVGFibGVzLmdldChlbCk7XG4gICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICBzZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICByZXNpemVTb3VyY2VUb1RhYmxlcy5zZXQoZWwsIHNldCk7XG4gICAgICAgICAgICBpZiAoIXJlc2l6ZU9ic2VydmVyKSByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihvblJlc2l6ZVRocm90dGxlZCk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuYWRkKHRhYmxlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCBncmlkLXRlbXBsYXRlLWNvbHVtbnMgZnJvbSBtZWFzdXJlZCB3aWR0aHMgYW5kIG9wdGlvbmFsIG92ZXJyaWRlcyBwZXIgY29sdW1uLlxuICogQHBhcmFtIHtudW1iZXJ9IG51bUNvbHNcbiAqIEBwYXJhbSB7bnVtYmVyW119IGNvbHVtbldpZHRoc1xuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gY29sdW1uT3ZlcnJpZGVzIC0gbWFwIGNvbHVtbiBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICcyZnInKSwgb3IgYXJyYXk7IG51bGwvZW1wdHkgPSB1c2UgbWVhc3VyZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdD0nZnInXSAtIENTUyB1bml0IGZvciBtZWFzdXJlZCB3aWR0aHMgKCdmcicgb3IgJ3B4JylcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgY29sdW1uT3ZlcnJpZGVzLCB1bml0ID0gJ2ZyJykge1xuICAgIGlmICghY29sdW1uV2lkdGhzIHx8IGNvbHVtbldpZHRocy5sZW5ndGggIT09IG51bUNvbHMpIHJldHVybiAnJztcbiAgICBjb25zdCBnZXQgPSAoaSkgPT5cbiAgICAgICAgQXJyYXkuaXNBcnJheShjb2x1bW5PdmVycmlkZXMpID8gY29sdW1uT3ZlcnJpZGVzW2ldIDogY29sdW1uT3ZlcnJpZGVzW2ldO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db2xzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3YgPSBnZXQoaSk7XG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgcGFydHMucHVzaChvdi50cmltKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKGNvbHVtbldpZHRoc1tpXSl9JHt1bml0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogQnVpbGQgZ3JpZC10ZW1wbGF0ZS1yb3dzIGZyb20gbWVhc3VyZWQgaGVpZ2h0cyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzIHBlciByb3cuXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xuICogQHBhcmFtIHtudW1iZXJbXX0gcm93SGVpZ2h0c1xuICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBzdHJpbmc+fChzdHJpbmd8bnVsbClbXX0gcm93T3ZlcnJpZGVzIC0gbWFwIHJvdyBpbmRleCDihpIgQ1NTIHZhbHVlIChlLmcuICc0OHB4JywgJzJmcicpLCBvciBhcnJheTsgbnVsbC9lbXB0eSA9IHVzZSBtZWFzdXJlZFxuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdweCddIC0gQ1NTIHVuaXQgZm9yIG1lYXN1cmVkIGhlaWdodHMgKCdweCcgb3IgJ2ZyJylcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVSb3dzKG51bVJvd3MsIHJvd0hlaWdodHMsIHJvd092ZXJyaWRlcywgdW5pdCA9ICdweCcpIHtcbiAgICBpZiAoIXJvd0hlaWdodHMgfHwgcm93SGVpZ2h0cy5sZW5ndGggPCBudW1Sb3dzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZ2V0ID0gKGkpID0+XG4gICAgICAgIEFycmF5LmlzQXJyYXkocm93T3ZlcnJpZGVzKSA/IHJvd092ZXJyaWRlc1tpXSA6IHJvd092ZXJyaWRlcz8uW2ldO1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb3YgPSBnZXQoaSk7XG4gICAgICAgIGlmIChvdiAhPSBudWxsICYmIHR5cGVvZiBvdiA9PT0gJ3N0cmluZycgJiYgb3YudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgcGFydHMucHVzaChvdi50cmltKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChgJHtNYXRoLnJvdW5kKHJvd0hlaWdodHNbaV0gPz8gMCl9JHt1bml0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogTWVhc3VyZSBlYWNoIHRyIGhlaWdodCBpbiBhIHNlY3Rpb24gKHRhYmxlIG11c3Qgbm90IHlldCBoYXZlIHNjcm9sbGFibGUgY2xhc3MpLlxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudHxudWxsfSBzZWN0aW9uXG4gKiBAcmV0dXJucyB7bnVtYmVyW119XG4gKi9cbmZ1bmN0aW9uIG1lYXN1cmVSb3dIZWlnaHRzKHNlY3Rpb24pIHtcbiAgICBpZiAoIXNlY3Rpb24pIHJldHVybiBbXTtcbiAgICBjb25zdCByb3dzID0gc2VjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiB0cicpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHJvd3MpLm1hcCgodHIpID0+IHRyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG59XG5cbi8qKlxuICogQXBwbHkgc2Nyb2xsYWJsZSB0YWJsZSBsYXlvdXQgdG8gYSBzaW5nbGUgdGFibGUuXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHNjcm9sbGFibGVUYWJsZSBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtvcHRpb25zLm1heEhlaWdodF0gLSBNYXggaGVpZ2h0IG9mIHRib2R5IChkZWZhdWx0ICcyMDBweCcpLiBJZ25vcmVkIHdoZW4gaGVpZ2h0IG9yIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gW29wdGlvbnMuaGVpZ2h0XSAtIEZpeGVkIGhlaWdodCBvZiB0Ym9keS4gSWdub3JlZCB3aGVuIGJvZHlIZWlnaHREeW5hbWljIGlzIHNldC5cbiAqIEBwYXJhbSB7eyBnZXQ6IChmdW5jdGlvbihIVE1MVGFibGVFbGVtZW50KTogbnVtYmVyfHN0cmluZyksIHVzZUFzOiAnaGVpZ2h0J3wnbWF4SGVpZ2h0JywgdXBkYXRlT24/OiB7IHNjcm9sbD86IGJvb2xlYW4sIHJlc2l6ZT86IGJvb2xlYW4sIHNjcm9sbE9uPzogKCdkb2N1bWVudCd8RWxlbWVudClbXSwgcmVzaXplT24/OiAoJ3dpbmRvdyd8RWxlbWVudClbXSB9IH19IFtvcHRpb25zLmJvZHlIZWlnaHREeW5hbWljXSAtIFdoZW4gc2V0LCBib2R5IHNpemUgaXMgY29tcHV0ZWQgYnkgZ2V0KHRhYmxlKSBhbmQgcmUtYXBwbGllZCB3aGVuIHNjcm9sbC9yZXNpemUgc291cmNlcyBmaXJlLiB1cGRhdGVPbjogc2Nyb2xsT24vcmVzaXplT24gbGlzdCBlbGVtZW50cyAoc2VudGluZWxzICdkb2N1bWVudCcvJ3dpbmRvdycpOyBvciB1c2Ugc2Nyb2xsIChkZWZhdWx0IGZhbHNlKSAvIHJlc2l6ZSAoZGVmYXVsdCB0cnVlKSBib29sZWFucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zXVxuICogQHBhcmFtIHt7IHRoZWFkPzogc3RyaW5nLCB0Ym9keT86IHN0cmluZywgdGZvb3Q/OiBzdHJpbmcgfX0gW29wdGlvbnMuZ3JpZFRlbXBsYXRlUm93c11cbiAqIEBwYXJhbSB7eyB0aGVhZD86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdLCB0Ym9keT86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdLCB0Zm9vdD86IE9iamVjdDxudW1iZXIsIHN0cmluZz58KHN0cmluZ3xudWxsKVtdIH19IFtvcHRpb25zLnJvd092ZXJyaWRlc11cbiAqIEBwYXJhbSB7T2JqZWN0PG51bWJlciwgc3RyaW5nPnwoc3RyaW5nfG51bGwpW119IFtvcHRpb25zLmNvbHVtbk92ZXJyaWRlc11cbiAqIEBwYXJhbSB7eyBjb2xzPzogc3RyaW5nLCByb3dzPzogc3RyaW5nIH19IFtvcHRpb25zLmRlZmF1bHRTaXppbmdVbml0XSAtIENTUyB1bml0IGZvciBtZWFzdXJlZCB3aWR0aHMvaGVpZ2h0cy4gY29scyBkZWZhdWx0cyB0byAnZnInLCByb3dzIGRlZmF1bHRzIHRvICdweCcuXG4gKiBAcGFyYW0ge3sgY29sdW1uV2lkdGhzPzogbnVtYmVyW10sIHJvd0hlaWdodHM/OiB7IHRoZWFkPzogbnVtYmVyW10sIHRib2R5PzogbnVtYmVyW10sIHRmb290PzogbnVtYmVyW10gfSB9IHwgdW5kZWZpbmVkfSByZWYgLSBleGlzdGluZyByZWYgd2hlbiByZWZyZXNoaW5nXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCByZWYpIHtcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XG4gICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xuICAgIGNvbnN0IHRmb290ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGZvb3QnKTtcblxuICAgIGNvbnN0IG51bUNvbHMgPSBnZXRUYWJsZUNvbHVtbkNvdW50KHRhYmxlKTtcbiAgICBpZiAobnVtQ29scyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWxyZWFkeVNjcm9sbGFibGUgPSB0YWJsZS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfVEFCTEUpO1xuICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdHlwZW9mIG9wdGlvbnMuZ3JpZFRlbXBsYXRlQ29sdW1ucyA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5ncmlkVGVtcGxhdGVDb2x1bW5zLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGN1c3RvbVRlbXBsYXRlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IChyZWY/LmNvbHVtbldpZHRocyA/PyAoYWxyZWFkeVNjcm9sbGFibGUgPyBudWxsIDogbWVhc3VyZUNvbHVtbldpZHRocyh0YWJsZSwgbnVtQ29scykpKTtcblxuICAgIGNvbnN0IHRoZWFkUm93cyA9IGdldFJvd0NvdW50KHRoZWFkKTtcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XG4gICAgY29uc3QgdGZvb3RSb3dzID0gZ2V0Um93Q291bnQodGZvb3QpO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0cyA9XG4gICAgICAgIHJlZj8ucm93SGVpZ2h0cyA/P1xuICAgICAgICAoYWxyZWFkeVNjcm9sbGFibGVcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICB0aGVhZDogbWVhc3VyZVJvd0hlaWdodHModGhlYWQpLFxuICAgICAgICAgICAgICAgICAgdGJvZHk6IG1lYXN1cmVSb3dIZWlnaHRzKHRib2R5KSxcbiAgICAgICAgICAgICAgICAgIHRmb290OiBtZWFzdXJlUm93SGVpZ2h0cyh0Zm9vdClcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1jb2xzJywgU3RyaW5nKG51bUNvbHMpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRoZWFkUm93cykpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Ym9keS1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRib2R5Um93cykpKTtcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRmb290Um93cykpKTtcbiAgICBjb25zdCB7IGJvZHlTaXplLCB1c2VGaXhlZEhlaWdodCB9ID0gcmVzb2x2ZUJvZHlIZWlnaHQob3B0aW9ucywgdGFibGUpO1xuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCcsIGJvZHlTaXplKTtcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tYm9keS1oZWlnaHQnLCB1c2VGaXhlZEhlaWdodCk7XG5cbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290JywgISEodGZvb3QgJiYgdGZvb3RSb3dzID4gMCkpO1xuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCcsICEodGhlYWQgJiYgdGhlYWRSb3dzID4gMCkpO1xuXG4gICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBncmlkIGxheW91dCBpcyBlc3RhYmxpc2hlZCBiZWZvcmUgc2V0dGluZyBtZWFzdXJlZCB0ZW1wbGF0ZS1jb2x1bW5zLlxuICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIGJyb3dzZXIgYmF0Y2hlcyBjbGFzcyArIHRlbXBsYXRlIGludG8gb25lIHBhc3MgYW5kIHRoZSB0Ym9keSBvdmVyZmxvd3MgaG9yaXpvbnRhbGx5LlxuICAgIHRhYmxlLm9mZnNldEhlaWdodDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblxuICAgIGNvbnN0IGNvbFVuaXQgPSBvcHRpb25zLmRlZmF1bHRTaXppbmdVbml0Py5jb2xzIHx8ICdmcic7XG4gICAgY29uc3Qgcm93VW5pdCA9IG9wdGlvbnMuZGVmYXVsdFNpemluZ1VuaXQ/LnJvd3MgfHwgJ3B4JztcblxuICAgIGxldCBndXR0ZXJGYWxsYmFja1B4ID0gREVGQVVMVF9HVVRURVJfUFg7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZWQgPSBnZXRTY3JvbGxiYXJTaXplKCd2ZXJ0aWNhbCcpO1xuICAgICAgICBpZiAodHlwZW9mIG1lYXN1cmVkID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWVhc3VyZWQpICYmIG1lYXN1cmVkID49IDApIHtcbiAgICAgICAgICAgIGd1dHRlckZhbGxiYWNrUHggPSBtZWFzdXJlZDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLyogdXNlIERFRkFVTFRfR1VUVEVSX1BYICovXG4gICAgfVxuICAgIGNvbnN0IGd1dHRlclN1ZmZpeCA9IGAgbWlubWF4KHZhcigtLWFweC1zY3JvbGxhYmxlLWd1dHRlci13aWR0aCwgJHtndXR0ZXJGYWxsYmFja1B4fXB4KSwgdmFyKC0tYXB4LXNjcm9sbGFibGUtZ3V0dGVyLXdpZHRoLCAke2d1dHRlckZhbGxiYWNrUHh9cHgpKWA7XG4gICAgaWYgKGN1c3RvbVRlbXBsYXRlKSB7XG4gICAgICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMnLCBvcHRpb25zLmdyaWRUZW1wbGF0ZUNvbHVtbnMudHJpbSgpICsgZ3V0dGVyU3VmZml4KTtcbiAgICB9IGVsc2UgaWYgKGNvbHVtbldpZHRocyAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID09PSBudW1Db2xzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID1cbiAgICAgICAgICAgIG9wdGlvbnMuY29sdW1uT3ZlcnJpZGVzICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVDb2x1bW5zKG51bUNvbHMsIGNvbHVtbldpZHRocywgb3B0aW9ucy5jb2x1bW5PdmVycmlkZXMsIGNvbFVuaXQpXG4gICAgICAgICAgICAgICAgOiBjb2x1bW5XaWR0aHMubWFwKCh3KSA9PiBgJHtNYXRoLnJvdW5kKHcpfSR7Y29sVW5pdH1gKS5qb2luKCcgJyk7XG4gICAgICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRlbXBsYXRlLWNvbHVtbnMnLCB0ZW1wbGF0ZSArIGd1dHRlclN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGUuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGVtcGxhdGUtY29sdW1ucycpO1xuICAgIH1cblxuICAgIGNsZWFyUGxhY2VtZW50cyh0YWJsZSk7XG5cbiAgICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICAgICAgeyBzZWN0aW9uOiB0aGVhZCwgcm93czogTWF0aC5tYXgoMSwgdGhlYWRSb3dzKSwgaGVpZ2h0czogcm93SGVpZ2h0cz8udGhlYWQsIGtleTogJ3RoZWFkJyB9LFxuICAgICAgICB7IHNlY3Rpb246IHRib2R5LCByb3dzOiBNYXRoLm1heCgxLCB0Ym9keVJvd3MpLCBoZWlnaHRzOiByb3dIZWlnaHRzPy50Ym9keSwga2V5OiAndGJvZHknIH0sXG4gICAgICAgIHsgc2VjdGlvbjogdGZvb3QsIHJvd3M6IE1hdGgubWF4KDEsIHRmb290Um93cyksIGhlaWdodHM6IHJvd0hlaWdodHM/LnRmb290LCBrZXk6ICd0Zm9vdCcgfVxuICAgIF07XG4gICAgY29uc3QgY3VzdG9tUm93cyA9IG9wdGlvbnMuZ3JpZFRlbXBsYXRlUm93cyAmJiB0eXBlb2Ygb3B0aW9ucy5ncmlkVGVtcGxhdGVSb3dzID09PSAnb2JqZWN0JyA/IG9wdGlvbnMuZ3JpZFRlbXBsYXRlUm93cyA6IG51bGw7XG4gICAgY29uc3Qgcm93T3ZlcnJpZGVzID0gb3B0aW9ucy5yb3dPdmVycmlkZXMgJiYgdHlwZW9mIG9wdGlvbnMucm93T3ZlcnJpZGVzID09PSAnb2JqZWN0JyA/IG9wdGlvbnMucm93T3ZlcnJpZGVzIDogbnVsbDtcbiAgICBzZWN0aW9ucy5mb3JFYWNoKCh7IHNlY3Rpb24sIHJvd3MsIGhlaWdodHMsIGtleSB9KSA9PiB7XG4gICAgICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YXJOYW1lID0gYC0tYXB4LXNjcm9sbGFibGUtJHtrZXl9LXRlbXBsYXRlLXJvd3NgO1xuICAgICAgICBjb25zdCBjdXN0b20gPSBjdXN0b21Sb3dzPy5ba2V5XTtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gcm93T3ZlcnJpZGVzPy5ba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b20gPT09ICdzdHJpbmcnICYmIGN1c3RvbS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCBjdXN0b20udHJpbSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRzICYmIGhlaWdodHMubGVuZ3RoID49IHJvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID1cbiAgICAgICAgICAgICAgICBvdmVycmlkZXMgIT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICA/IGJ1aWxkVGVtcGxhdGVSb3dzKHJvd3MsIGhlaWdodHMuc2xpY2UoMCwgcm93cyksIG92ZXJyaWRlcywgcm93VW5pdClcbiAgICAgICAgICAgICAgICAgICAgOiBoZWlnaHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCByb3dzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChoKSA9PiBgJHtNYXRoLnJvdW5kKGgpfSR7cm93VW5pdH1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgc2VjdGlvbi5zdHlsZS5zZXRQcm9wZXJ0eSh2YXJOYW1lLCB0ZW1wbGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWN0aW9uLnN0eWxlLnJlbW92ZVByb3BlcnR5KHZhck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgcm93cywgbnVtQ29scyk7XG4gICAgICAgIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvbHVtbldpZHRocywgcm93SGVpZ2h0cyB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRoZSBBUFggb2JqZWN0IHdpdGggc2Nyb2xsYWJsZVRhYmxlKG9wdGlvbnMgfCAncmVmcmVzaCcpLlxuICogTWFrZXMgdGhlIHRib2R5IG9mIGEgdGFibGUgc2Nyb2xsYWJsZSB3aGlsZSBrZWVwaW5nIHRoZWFkL3Rmb290IGZpeGVkIGFuZCBjb2x1bW5zIGFsaWduZWQgKENTUyBHcmlkICsgc3ViZ3JpZCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIFRoZSBBUFggb2JqZWN0IHRvIGF1Z21lbnQuXG4gKiBAZXhhbXBsZVxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoeyBtYXhIZWlnaHQ6IDMwMCB9KTtcbiAqIEFQWCgndGFibGUuZGF0YS1ncmlkJykuc2Nyb2xsYWJsZVRhYmxlKCdyZWZyZXNoJyk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCkge1xuICAgIGFweC5zY3JvbGxhYmxlVGFibGUgPSBmdW5jdGlvbiAob3B0aW9uc09yQWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGlzUmVmcmVzaCA9IG9wdGlvbnNPckFjdGlvbiA9PT0gJ3JlZnJlc2gnO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNSZWZyZXNoID8gbnVsbCA6IChvcHRpb25zT3JBY3Rpb24gJiYgdHlwZW9mIG9wdGlvbnNPckFjdGlvbiA9PT0gJ29iamVjdCcgPyBvcHRpb25zT3JBY3Rpb24gOiB7fSk7XG5cbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgIT09ICdUQUJMRScpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gLyoqIEB0eXBlIHtIVE1MVGFibGVFbGVtZW50fSAqLyAoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcbiAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucywgcmVmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWYub3B0aW9ucyA9IHsgLi4ucmVmLm9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIHJlZi5vcHRpb25zLCByZWYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5jb2x1bW5XaWR0aHMpIHJlZi5jb2x1bW5XaWR0aHMgPSByZXN1bHQuY29sdW1uV2lkdGhzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5yb3dIZWlnaHRzKSByZWYucm93SGVpZ2h0cyA9IHJlc3VsdC5yb3dIZWlnaHRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IHJlZi5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBjdXJyZW50T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgZWxzZSByZW1vdmVUYWJsZUZyb21EeW5hbWljU291cmNlcyh0YWJsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0FQWCBzY3JvbGxhYmxlVGFibGVdIGNyZWF0ZScsIHRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFibGVbREFUQV9LRVldID0ge1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9LFxuICAgICAgICAgICAgICAgIGNvbHVtbldpZHRoczogcmVzdWx0Py5jb2x1bW5XaWR0aHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJvd0hlaWdodHM6IHJlc3VsdD8ucm93SGVpZ2h0cyB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uYm9keUhlaWdodER5bmFtaWMpIHJlZ2lzdGVyRHluYW1pY1RhYmxlKHRhYmxlLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFweDtcbiAgICB9O1xufVxuIiwiLy8gTWluaW1hbCwgZnJhbWV3b3JrLWFnbm9zdGljIFRvYXN0TWFuYWdlciBmb3IgQVBYXHJcbi8vIEVTTS1maXJzdCwgbm8gc2lkZSBlZmZlY3RzIG9uIGltcG9ydC4gRE9NIG9ubHkgd2hlbiB1c2VkLlxyXG5pbXBvcnQgJy4vY3NzL3RvYXN0LmNzcyc7XHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25PYmplY3RcclxuICogQHByb3BlcnR5IHsnc3RpY2t5J3wncmVsYXRpdmUnfCdhbmNob3JlZCd9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3hdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeV1cclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gW2VsZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J2Fib3ZlJ3wnYmVsb3cnfCdiZWZvcmUnfCdhZnRlcid9IFtwbGFjZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VOYXRpdmVDU1NdXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtzdHJpbmd8UG9zaXRpb25PYmplY3R9IFBvc2l0aW9uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0Q29uZmlnXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4VG9hc3RzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlZmF1bHREdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pJbmRleF1cclxuICogQHByb3BlcnR5IHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gW2FyaWFMaXZlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRhaW5lckNsYXNzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ319IFtwcm9ncmVzc10gRGVmYXVsdDogZmFsc2UuIFNob3cgcHJvZ3Jlc3MgYmFyIHdoZW4gdHJ1ZSBvciB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nIH0uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHt7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uOiBib29sZWFufX0gUHJvZ3Jlc3NPcHRcclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfE5vZGV9IG1lc3NhZ2VcclxuICogQHByb3BlcnR5IHsnaW5mbyd8J3N1Y2Nlc3MnfCd3YXJuaW5nJ3wnZGFuZ2VyJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc2libGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIGV2OiBNb3VzZUV2ZW50KSA9PiB2b2lkfSBbb25DbGlja11cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgcmVhc29uOiAndGltZW91dCd8J2Nsb3NlJ3wnYXBpJ3wnb3ZlcmZsb3cnKSA9PiB2b2lkfSBbb25DbG9zZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScsIHBhdXNlQnV0dG9uPzogYm9vbGVhbn19IFtwcm9ncmVzc10gU2hvdyBwcm9ncmVzcyBiYXI6IHRydWUgPSB0b3AsIG9yIHsgZW5hYmxlLCBwb3NpdGlvbiwgcGF1c2VCdXR0b24gfSAocGF1c2VCdXR0b24gZGVmYXVsdCBmYWxzZSkuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0UmVmXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiAnYXBpJ3wnY2xvc2UnKSA9PiB2b2lkfSBjbG9zZVxyXG4gKiBAcHJvcGVydHkgeyhwYXJ0aWFsOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pID0+IHZvaWR9IHVwZGF0ZVxyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHdoZW5DbG9zZWRcclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+ICgpID0+IHZvaWR9IG9uXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkfSBvZmZcclxuICovXHJcblxyXG5jb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xyXG5cclxuLy8gU2hhcmVkIGNvbnRhaW5lciBjYWNoZTogTWFwPHBvc2l0aW9uLCBIVE1MRWxlbWVudD5cclxuLy8gQ29udGFpbmVycyBhcmUgc2hhcmVkIGJldHdlZW4gbWFuYWdlcnMgd2l0aCB0aGUgc2FtZSBwb3NpdGlvblxyXG5jb25zdCBfY29udGFpbmVyQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBHYXJiYWdlIGNvbGxlY3Rpb246IGNsZWFudXAgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnMgYWZ0ZXIgYSBkZWxheVxyXG5jb25zdCBHQ19ERUxBWV9NUyA9IDIwMDAwOyAvLyAyMCBzZWNvbmRzXHJcbmxldCBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG5cclxuLy8gV3JhcHBlciBmb3IgYWxsIHRvYXN0IGNvbnRhaW5lcnMgKGtlZXBzIERPTSBjbGVhbilcclxubGV0IF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIEdldCBvciBjcmVhdGUgdGhlIHRvYXN0IGNvbnRhaW5lcnMgd3JhcHBlclxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRvYXN0V3JhcHBlcigpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS53aWR0aCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS56SW5kZXggPSAnMTAwMDAnOyAvLyBCZWxvdyBjb250YWluZXJzIGJ1dCBhYm92ZSBtb3N0IGNvbnRlbnRcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChfdG9hc3RXcmFwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBfdG9hc3RXcmFwcGVyO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0JyxcclxuICAgIG1heFRvYXN0czogNSxcclxuICAgIGRlZmF1bHREdXJhdGlvbk1zOiA1MDAwLFxyXG4gICAgekluZGV4OiAxMTAwMCxcclxuICAgIGFyaWFMaXZlOiAncG9saXRlJyxcclxuICAgIGdhcDogOCxcclxuICAgIGRlZHVwZTogZmFsc2UsXHJcbiAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICBvZmZzZXQ6IDAsXHJcbiAgICBwcm9ncmVzczogZmFsc2VcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGNsYXNzZXNcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUVsKHRhZywgY2xhc3NOYW1lcykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcbiAgICBpZiAoY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGNsYXNzTmFtZXMuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5hZGQoYykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG59XHJcblxyXG4vKiogTWluaW1hbCBsaW5lLWJhc2VkIHBhdXNlICh0d28gYmFycykgLyByZXN1bWUgKHRyaWFuZ2xlIHJpZ2h0KSBpY29uIFNWRy4gVXNlcyBjdXJyZW50Q29sb3IuICovXHJcbmZ1bmN0aW9uIGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHBhdXNlZCkge1xyXG4gICAgaWYgKHBhdXNlZCkge1xyXG4gICAgICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxwYXRoIGQ9XCJNOCA2TDggMThMMTcgMTJaXCIvPjwvc3ZnPmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48bGluZSB4MT1cIjlcIiB5MT1cIjZcIiB4Mj1cIjlcIiB5Mj1cIjE4XCIvPjxsaW5lIHgxPVwiMTVcIiB5MT1cIjZcIiB4Mj1cIjE1XCIgeTI9XCIxOFwiLz48L3N2Zz5gO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuZCBpbnNlcnQgcHJvZ3Jlc3MgYmxvY2sgKHRyYWNrICsgYmFyLCBvcHRpb25hbCBwYXVzZSBidXR0b24pIGludG8gdG9hc3QuIEJ1dHRvbiBpcyBmaXhlZCBhdCBsZWZ0IHZpYSB0cmFjayBsYXlvdXQuXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gY2xvc2VCdG5cclxuICogQHBhcmFtIHtQcm9ncmVzc09wdH0gcHJvZ3Jlc3NPcHRcclxuICogQHJldHVybnMge3sgd3JhcDogSFRNTEVsZW1lbnQsIGJhcjogSFRNTEVsZW1lbnQsIHBhdXNlQnRuOiBIVE1MRWxlbWVudHxudWxsIH19XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHByb2dyZXNzT3B0KSB7XHJcbiAgICBjb25zdCBwb3MgPSBwcm9ncmVzc09wdC5wb3NpdGlvbjtcclxuICAgIGNvbnN0IHNob3dQYXVzZUJ1dHRvbiA9IHByb2dyZXNzT3B0LnBhdXNlQnV0dG9uID09PSB0cnVlO1xyXG4gICAgY29uc3Qgd3JhcCA9IGNyZWF0ZUVsKCdkaXYnLCBgQVBYLXRvYXN0X19wcm9ncmVzcyBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRyYWNrID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXRyYWNrJyk7XHJcbiAgICBjb25zdCBiYXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3Byb2dyZXNzYmFyJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJywgJzAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCAnMTAwJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1RlbXBzIHJlc3RhbnQnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICB0cmFjay5hcHBlbmRDaGlsZChiYXIpO1xyXG4gICAgd3JhcC5hcHBlbmRDaGlsZCh0cmFjayk7XHJcbiAgICBsZXQgcGF1c2VCdG4gPSBudWxsO1xyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikge1xyXG4gICAgICAgIHBhdXNlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnUGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi5pbm5lckhUTUwgPSBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyhmYWxzZSk7IC8vIHJ1bm5pbmcgPSBzaG93IHBhdXNlIGljb25cclxuICAgICAgICB3cmFwLmluc2VydEJlZm9yZShwYXVzZUJ0biwgdHJhY2spO1xyXG4gICAgfVxyXG4gICAgaWYgKHBvcyA9PT0gJ3RvcCcpIHtcclxuICAgICAgICB0b2FzdEVsLmluc2VydEJlZm9yZSh3cmFwLCBjb250ZW50RWwpO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNsb3NlQnRuKTtcclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNob3dQYXVzZUJ1dHRvbikgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgcmV0dXJuIHsgd3JhcCwgYmFyLCBwYXVzZUJ0biB9O1xyXG59XHJcblxyXG4vKipcclxuICogVXBkYXRlIHByb2dyZXNzIGJsb2NrIHBvc2l0aW9uIChjbGFzc2VzICsgRE9NIG9yZGVyKVxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb2dyZXNzV3JhcFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0geyd0b3AnfCdib3R0b20nfSBwb3NcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIHBvcykge1xyXG4gICAgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnLCAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQocG9zID09PSAndG9wJyA/ICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnIDogJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCcsICdBUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20nKTtcclxuICAgIHByb2dyZXNzV3JhcC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3RfX3Byb2dyZXNzLS0ke3Bvc31gKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IHBvcyA9PT0gJ3RvcCcgPyBjb250ZW50RWwgOiBjbG9zZUJ0bjtcclxuICAgIGlmIChwcm9ncmVzc1dyYXAubmV4dEVsZW1lbnRTaWJsaW5nICE9PSB0YXJnZXQpIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHByb2dyZXNzV3JhcCwgdGFyZ2V0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc29sdmUgcHJvZ3Jlc3Mgb3B0aW9uIGZyb20gcGVyLWNhbGwgb3B0aW9uIGFuZCBjb25maWcgZGVmYXVsdFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IG9wdGlvblxyXG4gKiBAcGFyYW0ge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfXx1bmRlZmluZWR9IGNvbmZpZ0RlZmF1bHRcclxuICogQHJldHVybnMge1Byb2dyZXNzT3B0fVxyXG4gKi9cclxuZnVuY3Rpb24gcmVzb2x2ZVByb2dyZXNzKG9wdGlvbiwgY29uZmlnRGVmYXVsdCkge1xyXG4gICAgY29uc3QgZnJvbUNvbmZpZyA9IGNvbmZpZ0RlZmF1bHQgPT09IHRydWVcclxuICAgICAgICA/IHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9XHJcbiAgICAgICAgOiAoY29uZmlnRGVmYXVsdCAmJiB0eXBlb2YgY29uZmlnRGVmYXVsdCA9PT0gJ29iamVjdCdcclxuICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICEhY29uZmlnRGVmYXVsdC5lbmFibGUsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogY29uZmlnRGVmYXVsdC5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnYm90dG9tJyA6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgcGF1c2VCdXR0b246IGNvbmZpZ0RlZmF1bHQucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA6IHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfSk7XHJcbiAgICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQgfHwgb3B0aW9uID09PSBudWxsKSByZXR1cm4gZnJvbUNvbmZpZztcclxuICAgIGlmIChvcHRpb24gPT09IHRydWUpIHJldHVybiB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGVuYWJsZTogISFvcHRpb24uZW5hYmxlLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogb3B0aW9uLnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgIHBhdXNlQnV0dG9uOiBvcHRpb24ucGF1c2VCdXR0b24gPT09IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgZW5hYmxlOiBmYWxzZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgdG8gQ1NTIHZhbHVlc1xyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhY2VtZW50XHJcbiAqIEByZXR1cm5zIHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J31cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcclxuICAgIGNvbnN0IHN5bm9ueW1zID0ge1xyXG4gICAgICAgICdhYm92ZSc6ICd0b3AnLFxyXG4gICAgICAgICdiZWxvdyc6ICdib3R0b20nLFxyXG4gICAgICAgICdiZWZvcmUnOiAnbGVmdCcsXHJcbiAgICAgICAgJ2FmdGVyJzogJ3JpZ2h0J1xyXG4gICAgfTtcclxuICAgIHJldHVybiBzeW5vbnltc1twbGFjZW1lbnRdIHx8IHBsYWNlbWVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBmbG93IGRpcmVjdGlvbiBiYXNlZCBvbiBwb3NpdGlvblxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7J3VwJ3wnZG93bid9XHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbnM6IHRvcCA9IHVwLCBib3R0b20gPSBkb3duXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCd0b3AnKSkgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluY2x1ZGVzKCdib3R0b20nKSkgcmV0dXJuICdkb3duJztcclxuICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdGlja3knIHx8ICghdHlwZSAmJiAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55KSkpIHtcclxuICAgICAgICAgICAgLy8gU3RpY2t5OiBkZXRlcm1pbmUgYmFzZWQgb24geSBjb29yZGluYXRlXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHkgc3RhcnRzIHdpdGggJy0nIG9yIGlzIGEgc21hbGwgdmFsdWUsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBpcyBhIGxhcmdlIHZhbHVlIG9yIHBlcmNlbnRhZ2UsIGxpa2VseSBib3R0b20gKGRvd24pXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSA9IGZyb20gYm90dG9tLCBzbyBmbG93IGRvd25cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHkgPCA1MCUgb2Ygdmlld3BvcnQgaGVpZ2h0LCBsaWtlbHkgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5pbmNsdWRlcygnJScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCA1MCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBweCB2YWx1ZXMsIGFzc3VtZSA8IDQwMHB4IGlzIHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDQwMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBsYWNlbWVudCBkZXRlcm1pbmVzIGZsb3dcclxuICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnIHx8IHBsYWNlbWVudCA9PT0gJ2Fib3ZlJykgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgICAgIGlmIChwbGFjZW1lbnQgPT09ICdib3R0b20nIHx8IHBsYWNlbWVudCA9PT0gJ2JlbG93JykgcmV0dXJuICdkb3duJztcclxuICAgICAgICAgICAgLy8gRm9yIGxlZnQvcmlnaHQsIGRlZmF1bHQgdG8gZG93blxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJykge1xyXG4gICAgICAgICAgICAvLyBSZWxhdGl2ZTogZGV0ZXJtaW5lIGJhc2VkIG9uIHkgb2Zmc2V0XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQocG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSB5ID0gYWJvdmUgZWxlbWVudCA9IGZsb3cgdXBcclxuICAgICAgICAgICAgICAgICAgICAvLyBQb3NpdGl2ZSB5ID0gYmVsb3cgZWxlbWVudCA9IGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHYXJiYWdlIGNvbGxlY3Rpb246IHJlbW92ZSBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gY2xlYW51cEVtcHR5Q29udGFpbmVycygpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQVBYLXRvYXN0LWNvbnRhaW5lcjpub3QoW2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQ9XCJ0cnVlXCJdKScpO1xyXG4gICAgY29udGFpbmVycy5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGlzIGVtcHR5IChubyB0b2FzdHMpXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAocG9zaXRpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gQ2xlYW4gdXAgd3JhcHBlciBpZiBpdCdzIGVtcHR5IChhbGwgY29udGFpbmVycyByZW1vdmVkKVxyXG4gICAgaWYgKF90b2FzdFdyYXBwZXIgJiYgX3RvYXN0V3JhcHBlci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gKi9cclxuZnVuY3Rpb24gc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpIHtcclxuICAgIGlmIChfZ2NUaW1lb3V0SWQpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQoX2djVGltZW91dElkKTtcclxuICAgIH1cclxuICAgIF9nY1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoY2xlYW51cEVtcHR5Q29udGFpbmVycywgR0NfREVMQVlfTVMpO1xyXG59XHJcblxyXG4vKipcclxuICogRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX1cclxuICovXHJcbmZ1bmN0aW9uIGZpbmRTY3JvbGxhYmxlUGFyZW50cyhlbGVtZW50KSB7XHJcbiAgICBjb25zdCBzY3JvbGxhYmxlcyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBcclxuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KTtcclxuICAgICAgICBjb25zdCBvdmVyZmxvdyA9IHN0eWxlLm92ZXJmbG93ICsgc3R5bGUub3ZlcmZsb3dZICsgc3R5bGUub3ZlcmZsb3dYO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChvdmVyZmxvdy5pbmNsdWRlcygnc2Nyb2xsJykgfHwgb3ZlcmZsb3cuaW5jbHVkZXMoJ2F1dG8nKSkge1xyXG4gICAgICAgICAgICBzY3JvbGxhYmxlcy5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gc2Nyb2xsYWJsZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIYXNoIGFuIGVsZW1lbnQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkZW50aWZpZXJcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIGhhc2hFbGVtZW50KGVsKSB7XHJcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBzdHIgPSBgJHtlbC50YWdOYW1lfV8ke3JlY3QubGVmdH1fJHtyZWN0LnRvcH1fJHtyZWN0LndpZHRofV8ke3JlY3QuaGVpZ2h0fWA7XHJcbiAgICBsZXQgaGFzaCA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaGFyO1xyXG4gICAgICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoaGFzaCkudG9TdHJpbmcoMzYpO1xyXG59XHJcblxyXG4vKipcclxuICogU2VyaWFsaXplIHBvc2l0aW9uIG9wdGlvbnMgaW50byBhIHVuaXF1ZSBrZXlcclxuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICogQHJldHVybnMge3N0cmluZ31cclxuICovXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBgczoke3Bvc2l0aW9ufWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUeXBlIChkZWZhdWx0OiBzdGlja3kgaWYgeC95IHByb3ZpZGVkKVxyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgIGlmICh0eXBlKSBwYXJ0cy5wdXNoKGB0OiR7dHlwZX1gKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDb29yZGluYXRlc1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHg6JHtwb3NpdGlvbi54fWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYHk6JHtwb3NpdGlvbi55fWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZvciByZWxhdGl2ZS9hbmNob3JlZDogdXNlIGVsZW1lbnQgSUQgb3IgaGFzaFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IHBvc2l0aW9uLmVsZW1lbnQuaWQgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24uZWxlbWVudC5kYXRhc2V0Py5hcHhUb2FzdEFuY2hvcklkIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGVsXyR7aGFzaEVsZW1lbnQocG9zaXRpb24uZWxlbWVudCl9YDtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgZWw6JHtlbGVtZW50SWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5wbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBsYWNlbWVudCBmb3Igc2VyaWFsaXphdGlvbiAodXNlIENTUyB2YWx1ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgcGFydHMucHVzaChgcDoke25vcm1hbGl6ZWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5nYXAgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgZzoke3Bvc2l0aW9uLmdhcH1gKTtcclxuICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTKSBwYXJ0cy5wdXNoKGBuYXRpdmU6dHJ1ZWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBgbzoke3BhcnRzLmpvaW4oJ3wnKX1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gJ3M6Ym90dG9tLXJpZ2h0JztcclxufVxyXG5cclxuLyoqXHJcbiAqIFRvYXN0TWFuYWdlciBjbGFzc1xyXG4gKi9cclxuY2xhc3MgVG9hc3RNYW5hZ2VyIHtcclxuICAgIC8qKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0Q29uZmlnfSAqL1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fG51bGx9ICovXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVG9hc3RSZWY+fSAqL1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZiA9IG5ldyBNYXAoKTtcclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmW119ICovXHJcbiAgICAgICAgdGhpcy5vcGVuID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz59IGNvbmZpZyAqL1xyXG4gICAgY29uZmlndXJlKGNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgLi4uKGNvbmZpZyB8fCB7fSkgfTtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gbW9kZSAqL1xyXG4gICAgc2V0QXJpYUxpdmUobW9kZSkgeyB0aGlzLmNvbmZpZ3VyZSh7IGFyaWFMaXZlOiBtb2RlIH0pOyB9XHJcblxyXG4gICAgLyoqIEByZXR1cm5zIHtUb2FzdFJlZltdfSAqL1xyXG4gICAgZ2V0T3BlblRvYXN0cygpIHsgcmV0dXJuIHRoaXMub3Blbi5zbGljZSgpOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBzaG93KG9wdHMpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyhudWxsKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKG9wdHMpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVkdXBlICYmIG9wdGlvbnMuaWQgJiYgdGhpcy5pZFRvUmVmLmhhcyhvcHRpb25zLmlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmlkVG9SZWYuZ2V0KG9wdGlvbnMuaWQpO1xyXG4gICAgICAgICAgICByZWYudXBkYXRlKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGFuZCBmbG93IGZvciB0aGlzIHRvYXN0IChvcHRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZylcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24gfHwgdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IG9wdGlvbnMuZmxvdyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mbG93IDogKHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0bycpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgPT09ICdhdXRvJyA/IGRldGVybWluZUZsb3cocG9zaXRpb24pIDogZmxvdztcclxuICAgICAgICBcclxuICAgICAgICAvLyBFbnN1cmUgZGVmYXVsdCBjb250YWluZXIgaXMgc2V0IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcclxuICAgICAgICB0aGlzLmVuc3VyZUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICBjb25zdCB0b2FzdEVsID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3QgQVBYLXRvYXN0LS0ke29wdGlvbnMudHlwZX1gKTtcclxuICAgICAgICB0b2FzdEVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdzdGF0dXMnKTtcclxuICAgICAgICAvLyBQcmlvcml0eTogb3B0aW9ucy5pZCA+IGNvbmZpZy5pZCA+IGF1dG8tZ2VuZXJhdGVkXHJcbiAgICAgICAgY29uc3QgdG9hc3RJZCA9IG9wdGlvbnMuaWQgfHwgYHRfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWA7XHJcbiAgICAgICAgdG9hc3RFbC5kYXRhc2V0LnRvYXN0SWQgPSB0b2FzdElkO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc05hbWUgKz0gYCAke29wdGlvbnMuY2xhc3NOYW1lfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbCA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19jb250ZW50Jyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG9wdGlvbnMubWVzc2FnZTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQob3B0aW9ucy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdG9hc3RFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpO1xyXG5cclxuICAgICAgICBsZXQgY2xvc2VCdG4gPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLmRpc21pc3NpYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjbG9zZUJ0biA9IGNyZWF0ZUVsKCdidXR0b24nLCAnQVBYLXRvYXN0X19jbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UnKTtcclxuICAgICAgICAgICAgY2xvc2VCdG4udHlwZSA9ICdidXR0b24nO1xyXG4gICAgICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNsb3NlQnRuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwcm9ncmVzc1dyYXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc0JhckVsID0gbnVsbDtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NQYXVzZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZ3Jlc3MuZW5hYmxlICYmIG9wdGlvbnMuZHVyYXRpb25NcyA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgb3B0aW9ucy5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIHByb2dyZXNzV3JhcCA9IGNyZWF0ZWQud3JhcDtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHNwZWNpZmljIHBvc2l0aW9uXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uVXBkYXRlRm4gPSBudWxsO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgIGxldCBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uICYmIHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24udXNlTmF0aXZlQ1NTICYmICh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVzZU5hdGl2ZUNTUzogdHJ1ZSAtIGNyZWF0ZSBjb250YWluZXIgaW4gdGFyZ2V0IGVsZW1lbnQgdXNpbmcgbmF0aXZlIENTU1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWwgPSBwb3NpdGlvbi5lbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFbGVtZW50U3R5bGUgPSB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciBzdGFja2luZyB0b2FzdHMgKHJldXNlIGlmIGV4aXN0cylcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5hdGl2ZUNvbnRhaW5lciA9IHRhcmdldEVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFweC10b2FzdC1wb3NpdGlvbj1cIiR7cG9zaXRpb25LZXl9XCJdYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lciBBUFgtdG9hc3QtY29udGFpbmVyLW5hdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJywgcG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uaW5nIHRvIGNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiB1c2UgeC95IGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gb3V0c2lkZSB0aGUgZWxlbWVudCB1c2luZyAxMDAlIChlbGVtZW50IHNpemUpICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hcHBlbmRDaGlsZChuYXRpdmVDb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0c1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuYXRpdmVDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbiA9IG9yaWdpbmFsRWxlbWVudFN0eWxlIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbmF0aXZlIGNvbnRhaW5lciBpZiBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlQ29udGFpbmVyICYmIG5hdGl2ZUNvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gbmF0aXZlQ29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5kZWxldGUocG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIERlZmF1bHQ6IGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmaW5hbEZsb3cpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVDb250YWluZXJQb3NpdGlvbiA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29udGFpbmVyLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkLCBsaXN0ZW4gdG8gc2Nyb2xsL3Jlc2l6ZVxyXG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlID09PSAncmVsYXRpdmUnIHx8IHR5cGUgPT09ICdhbmNob3JlZCcpICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0VXBkYXRlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvdHRsZU1zID0gMTY7IC8vIH42MGZwc1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlZFVwZGF0ZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIGxhc3RVcGRhdGUgPCB0aHJvdHRsZU1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IG5vdztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZVBhcmVudHMgPSBmaW5kU2Nyb2xsYWJsZVBhcmVudHMocG9zaXRpb24uZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiB3aW5kb3cgYW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBzY3JvbGwgb24gYWxsIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZVBhcmVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIGVsZW1lbnQgcmVtb3ZhbFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBvc2l0aW9uLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmNsb3NlKCdhcGknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcGRhdGVGbiA9IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZklkKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbiAtIGdldCBvciBjcmVhdGUgY29udGFpbmVyIGZvciB0aGlzIHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGVuZCB0b2FzdCB0byB0aGUgYXBwcm9wcmlhdGUgY29udGFpbmVyXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFbnRlciBhbmltYXRpb25cclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXInKTtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZW50ZXItYWN0aXZlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEV2ZW50IGhhbmRsaW5nIGFuZCB0aW1lcnNcclxuICAgICAgICBsZXQgcmVtYWluaW5nID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgIGxldCB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICBsZXQgc3RhcnRUcyA9IG51bGw7XHJcbiAgICAgICAgbGV0IHVzZXJQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB7IGNsaWNrOiBuZXcgU2V0KCksIGNsb3NlOiBuZXcgU2V0KCkgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcgfHwgcmVtYWluaW5nIDw9IDApIHJldHVybjsgLy8gc3RpY2t5XHJcbiAgICAgICAgICAgIHN0YXJ0VHMgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB0aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gcmVmLmNsb3NlKCd0aW1lb3V0JyksIHJlbWFpbmluZyk7XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcklkID09IG51bGwgfHwgc3RhcnRUcyA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgcmVtYWluaW5nIC0gZWxhcHNlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IG9wdGlvbnMuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSBkdXJhdGlvbk1zID4gMCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgKHJlbWFpbmluZ01zIC8gZHVyYXRpb25NcykgKiAxMDApKSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIFN0cmluZyhNYXRoLnJvdW5kKHBjdCkpKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHBhdXNlVGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydFRzICE9IG51bGwpIHJlbWFpbmluZyAtPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzc1JhZklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlciA9IChidG4pID0+IHtcclxuICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHVzZXJQYXVzZWQgPSAhdXNlclBhdXNlZDtcclxuICAgICAgICAgICAgICAgIGlmICh1c2VyUGF1c2VkKSBwYXVzZVRpbWVyKCk7IGVsc2Ugc3RhcnRUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB1c2VyUGF1c2VkID8gJ1JlcHJlbmRyZScgOiAnUGF1c2UnO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKHVzZXJQYXVzZWQpOyAvLyBwYXVzZWQgPSByZXN1bWUgKHRyaWFuZ2xlKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogQHR5cGUge1RvYXN0UmVmfSAqL1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHtcclxuICAgICAgICAgICAgaWQ6IHRvYXN0SWQsXHJcbiAgICAgICAgICAgIGVsOiB0b2FzdEVsLFxyXG4gICAgICAgICAgICBjbG9zZTogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB1cGRhdGU6IChwYXJ0aWFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoeyAuLi5vcHRpb25zLCAuLi5wYXJ0aWFsIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvbnRlbnRcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVyZ2VkLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gbWVyZ2VkLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChtZXJnZWQubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdHlwZSBjbGFzc1xyXG4gICAgICAgICAgICAgICAgWydpbmZvJywnc3VjY2VzcycsJ3dhcm5pbmcnLCdkYW5nZXInXS5mb3JFYWNoKHQgPT4gdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKGBBUFgtdG9hc3QtLSR7dH1gKSk7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC0tJHttZXJnZWQudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjbGFzc2VzXHJcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUgIT09IG1lcmdlZC5jbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSguLi5vcHRpb25zLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZC5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCguLi5tZXJnZWQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyB2aXNpYmlsaXR5L3Bvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzID0gbWVyZ2VkLnByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzV3JhcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbWVyZ2VkLnByb2dyZXNzLmVuYWJsZSB8fCBtZXJnZWQuZHVyYXRpb25NcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5UHJvZ3Jlc3NQb3NpdGlvbih0b2FzdEVsLCBwcm9ncmVzc1dyYXAsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcy5wb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlICYmIG1lcmdlZC5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG1lcmdlZC5wcm9ncmVzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwgPSBjcmVhdGVkLmJhcjtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1BhdXNlQnRuID0gY3JlYXRlZC5wYXVzZUJ0bjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwICYmIHByb2dyZXNzV3JhcC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgbWVyZ2VkLnByb2dyZXNzLnBhdXNlQnV0dG9uID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZHVyYXRpb24gbG9naWNcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb25NcyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXJFbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc3R5bGUud2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCAnMTAwJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHdoZW5DbG9zZWQ6ICgpID0+IGNsb3NlZFByb21pc2UsXHJcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmFkZChoYW5kbGVyKTsgcmV0dXJuICgpID0+IHJlZi5vZmYoZXZlbnQsIGhhbmRsZXIpOyB9LFxyXG4gICAgICAgICAgICBvZmY6IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uZGVsZXRlKGhhbmRsZXIpOyB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgbm90aWZ5ID0gKGV2ZW50LCBhcmcpID0+IGhhbmRsZXJzW2V2ZW50XS5mb3JFYWNoKGZuID0+IHsgdHJ5IHsgZm4oYXJnKTsgfSBjYXRjaCAoXykge30gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsb3NlZFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm90aWZ5KCdjbG9zZScsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbG9zZShyZWYsIHJlYXNvbik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdG9hc3RFbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHByb2dyZXNzUmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBwb3NpdGlvbiBsaXN0ZW5lcnMgYW5kIHJlc3RvcmUgc3R5bGVzXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25DbGVhbnVwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmZsb3csIHJlbW92ZSBpbW1lZGlhdGVseSB0byBlbmZvcmNlIGhhcmQgY2FwXHJcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uID09PSAnb3ZlcmZsb3cnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhbmltYXRlIG91dFxyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWV4aXQnKTtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdC1hY3RpdmUnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlRWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVtb3ZlRWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdEVsLnBhcmVudEVsZW1lbnQpIHRvYXN0RWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm9wZW4uaW5kZXhPZihyZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy5vcGVuLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRUb1JlZi5kZWxldGUodG9hc3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB1bm1hbmFnZWQgY29udGFpbmVyc1xyXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlR2FyYmFnZUNvbGxlY3Rpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmaW5pc2gocmVhc29uKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyBhdHRhY2ggY2xvc2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgcmVmLmNsb3NlID0gKHJlYXNvbikgPT4gY2xlYW51cChyZWFzb24gfHwgJ2FwaScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbGljayBoYW5kbGluZ1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgbm90aWZ5KCdjbGljaycsIGV2KTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbGljayhyZWYsIGV2KTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSG92ZXIgcGF1c2VcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBwYXVzZVRpbWVyKTtcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7IGlmICghdXNlclBhdXNlZCkgc3RhcnRUaW1lcigpOyB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNsb3NlQnRuKSBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4geyBldi5zdG9wUHJvcGFnYXRpb24oKTsgcmVmLmNsb3NlKCdjbG9zZScpOyB9KTtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NQYXVzZUJ0bikgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIocHJvZ3Jlc3NQYXVzZUJ0bik7XHJcblxyXG4gICAgICAgIC8vIFRyYWNrXHJcbiAgICAgICAgdGhpcy5vcGVuLnB1c2gocmVmKTtcclxuICAgICAgICB0aGlzLmlkVG9SZWYuc2V0KHRvYXN0SWQsIHJlZik7XHJcblxyXG4gICAgICAgIC8vIE92ZXJmbG93IHBvbGljeVxyXG4gICAgICAgIGlmICh0aGlzLm9wZW4ubGVuZ3RoID4gdGhpcy5jb25maWcubWF4VG9hc3RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMub3BlblswXTtcclxuICAgICAgICAgICAgb2xkZXN0LmNsb3NlKCdvdmVyZmxvdycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgIHJldHVybiByZWY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBoZWxwZXJzXHJcbiAgICAgKi9cclxuICAgIGluZm8obWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2luZm8nIH0pOyB9XHJcbiAgICBzdWNjZXNzKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdzdWNjZXNzJyB9KTsgfVxyXG4gICAgd2FybmluZyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnd2FybmluZycgfSk7IH1cclxuICAgIGRhbmdlcihtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnZGFuZ2VyJyB9KTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydhcGknfCdvdmVyZmxvdyd9IFtyZWFzb25dICovXHJcbiAgICBjbG9zZUFsbChyZWFzb24pIHtcclxuICAgICAgICAvLyBjb3B5IHRvIGF2b2lkIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb25cclxuICAgICAgICBjb25zdCBhbGwgPSB0aGlzLm9wZW4uc2xpY2UoKTtcclxuICAgICAgICBhbGwuZm9yRWFjaChyID0+IHIuY2xvc2UocmVhc29uIHx8ICdhcGknKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBub3JtYWxpemVPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICBjb25zdCBvID0geyAuLi5vcHRzIH07XHJcbiAgICAgICAgaWYgKCFvLnR5cGUpIG8udHlwZSA9ICdpbmZvJztcclxuICAgICAgICBpZiAodHlwZW9mIG8uZGlzbWlzc2libGUgIT09ICdib29sZWFuJykgby5kaXNtaXNzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmR1cmF0aW9uTXMgIT09ICdudW1iZXInKSBvLmR1cmF0aW9uTXMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0RHVyYXRpb25NcztcclxuICAgICAgICAvLyBVc2UgaWQgZnJvbSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGlkIGZyb20gY29uZmlnLCBvdGhlcndpc2UgdW5kZWZpbmVkICh3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkKVxyXG4gICAgICAgIGlmICghby5pZCAmJiB0aGlzLmNvbmZpZy5pZCkgby5pZCA9IHRoaXMuY29uZmlnLmlkO1xyXG4gICAgICAgIG8ucHJvZ3Jlc3MgPSByZXNvbHZlUHJvZ3Jlc3Mob3B0cy5wcm9ncmVzcywgdGhpcy5jb25maWcucHJvZ3Jlc3MpO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCBvciBjcmVhdGUgYSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0geyd1cCd8J2Rvd24nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gKGFscmVhZHkgZGV0ZXJtaW5lZCwgbm90ICdhdXRvJylcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmFnZWRdIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgbWFuYWdlZCBieSBhIG1hbmFnZXIgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCBtYW5hZ2VkID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRmxvdyBzaG91bGQgYWxyZWFkeSBiZSBkZXRlcm1pbmVkICgndXAnIG9yICdkb3duJyksIGJ1dCBmYWxsYmFjayB0byBhdXRvIGlmIG5lZWRlZFxyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgJiYgZmxvdyAhPT0gJ2F1dG8nID8gZmxvdyA6IGRldGVybWluZUZsb3cocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDEuIENoZWNrIG1lbW9yeSBjYWNoZVxyXG4gICAgICAgIGxldCBjID0gX2NvbnRhaW5lckNhY2hlLmdldChwb3NpdGlvbktleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gSWYgbm90IGluIGNhY2hlLCBzZWFyY2ggaW4gRE9NIGJ5IGRhdGEgYXR0cmlidXRlXHJcbiAgICAgICAgaWYgKCFjICYmIGlzQnJvd3Nlcikge1xyXG4gICAgICAgICAgICBjID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDMuIElmIHN0aWxsIG5vdCBmb3VuZCwgY3JlYXRlIG5ldyBjb250YWluZXJcclxuICAgICAgICBpZiAoIWMpIHtcclxuICAgICAgICAgICAgYyA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBNYXJrIGFzIG1hbmFnZWQgaWYgY3JlYXRlZCBieSBhIG1hbmFnZXJcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGNsYXNzIChmb3IgQ1NTKVxyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IHBvc2l0aW9uIFxyXG4gICAgICAgICAgICAgICAgOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgICAgIGMuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3NDbGFzc31gKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBmbG93IGRpcmVjdGlvblxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbiBzdHlsZXMgaWYgb2JqZWN0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGMpO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gd3JhcHBlciBmb3IgY2xlYW4gRE9NIG9yZ2FuaXphdGlvblxyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0VG9hc3RXcmFwcGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0cyAobWF5IGJlIHNoYXJlZClcclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSWYgY29udGFpbmVyIGV4aXN0cyBhbmQgaXMgbm93IG1hbmFnZWQsIG1hcmsgaXRcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQgJiYgIWMuaGFzQXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJykpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYztcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIHx8ICFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nO1xyXG4gICAgICAgIC8vIENvbnRhaW5lcnMgY3JlYXRlZCBieSBlbnN1cmVDb250YWluZXIgYXJlIG1hbmFnZWRcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUNvbnRhaW5lckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBwb3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnID8gcG9zaXRpb24gOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgc3R5bGVzICh0aGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBvdGhlciBtYW5hZ2VycyBzaGFyaW5nIHRoZSBjb250YWluZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbiBjbGFzcyAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzc2VzID0gWydib3R0b20tcmlnaHQnLCdib3R0b20tbGVmdCcsJ3RvcC1yaWdodCcsJ3RvcC1sZWZ0J10ubWFwKHAgPT4gYEFQWC10b2FzdC1jb250YWluZXItLSR7cH1gKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSguLi5wb3NDbGFzc2VzKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IGNvbnRhaW5lciBjbGFzcyBpZiBzcGVjaWZpZWRcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3Muc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgb2Zmc2V0IChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGAke3RoaXMuY29uZmlnLm9mZnNldH1weGA7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IG9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9mZnNldCBpZiBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBvYmplY3QgcG9zaXRpb25zLCBlbnN1cmUgY29udGFpbmVyIGhhcyBwb3NpdGlvbjogZml4ZWRcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSBwb3NpdGlvbiBmb3IgYSBjb250YWluZXIgYmFzZWQgb24gcG9zaXRpb24gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyRWxcclxuICAgICAqIEByZXR1cm5zIHt7bGVmdD86IHN0cmluZywgdG9wPzogc3RyaW5nLCByaWdodD86IHN0cmluZywgYm90dG9tPzogc3RyaW5nfX1cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lckVsKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9ucyBhcmUgaGFuZGxlZCBieSBjb250YWluZXIgQ1NTXHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpY2t5OiBmaXhlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHgveSBvZmZzZXRcclxuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBwb3NpdGlvbmluZywgc28gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB4L3kgb2Zmc2V0cyAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlT2Zmc2V0ID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGVtIHRvIHB4IChhcHByb3hpbWF0ZTogMWVtID0gMTZweClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnggfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBwYXJzZU9mZnNldChwb3NpdGlvbi55IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgJHtyZWN0LmxlZnQgKyBvZmZzZXRYfXB4YCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGAke3JlY3QudG9wICsgb2Zmc2V0WX1weGBcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHBsYWNlbWVudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGdhcCAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlR2FwID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjsgLy8gQXBwcm94aW1hdGU6IDFlbSA9IDE2cHhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcFB4ID0gcGFyc2VHYXAoZ2FwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIChhYm92ZS9iZWxvdy9iZWZvcmUvYWZ0ZXIpIHRvIENTUyB2YWx1ZXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGFib3ZlIGVsZW1lbnQ6IGJvdHRvbSBvZiB0b2FzdCA9IHRvcCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSA9IHZpZXdwb3J0IGhlaWdodCAtIChlbGVtZW50IHRvcCAtIGdhcCkgPSB2aWV3cG9ydCBoZWlnaHQgLSBlbGVtZW50IHRvcCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYmVsb3cgZWxlbWVudDogdG9wIG9mIHRvYXN0ID0gYm90dG9tIG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QuYm90dG9tICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgbGVmdDogcmlnaHQgb2YgdG9hc3QgPSBsZWZ0IG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIHJpZ2h0OiBsZWZ0IG9mIHRvYXN0ID0gcmlnaHQgb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QucmlnaHQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnXHJcbiAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUb2FzdE1hbmFnZXIoY29uZmlnKSB7XHJcbiAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcihjb25maWcpO1xyXG59XHJcblxyXG4vLyBIaWdoLWxldmVsIEFQWC50b2FzdCBBUEkgKGRlZmF1bHQgJiBuYW1lZCBtYW5hZ2VycylcclxubGV0IF9kZWZhdWx0TWFuYWdlciA9IG51bGw7XHJcbmNvbnN0IF9nZXREZWZhdWx0ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFfZGVmYXVsdE1hbmFnZXIpIF9kZWZhdWx0TWFuYWdlciA9IGNyZWF0ZVRvYXN0TWFuYWdlcigpO1xyXG4gICAgcmV0dXJuIF9kZWZhdWx0TWFuYWdlcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUb2FzdCBBUEkgc3VyZmFjZSB0byBiZSBhdHRhY2hlZCBhcyBBUFgudG9hc3QuXHJcbiAqIENhbGxhYmxlIGZvcm0gcHJveGllcyB0byBkZWZhdWx0TWFuYWdlci5zaG93KG9wdHMpOiBBUFgudG9hc3Qoey4uLn0pXHJcbiAqL1xyXG5mdW5jdGlvbiB0b2FzdChvcHRzKSB7XHJcbiAgICByZXR1cm4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpO1xyXG59XHJcblxyXG5PYmplY3QuYXNzaWduKHRvYXN0LCB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG1hbmFnZXIuIElmIGZpcnN0IGFyZyBpcyBzdHJpbmcsIHJlZ2lzdGVyIGFzIG5hbWVkIHVuZGVyIHRvYXN0LmN1c3RvbVtuYW1lXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UGFydGlhbDxUb2FzdENvbmZpZz59IG5hbWVPckNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IG1heWJlQ29uZmlnXHJcbiAgICAgKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IChuYW1lT3JDb25maWcsIG1heWJlQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lT3JDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG1heWJlQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgICAgICAgICAgaWYgKCF0b2FzdC5jdXN0b20pIHRvYXN0LmN1c3RvbSA9IHt9O1xyXG4gICAgICAgICAgICB0b2FzdC5jdXN0b21bbmFtZV0gPSBtYW5hZ2VyO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obmFtZU9yQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgIH0sXHJcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFRvYXN0TWFuYWdlcj59ICovXHJcbiAgICBjdXN0b206IHt9LFxyXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lICovXHJcbiAgICB1c2U6IChuYW1lKSA9PiAodG9hc3QuY3VzdG9tICYmIHRvYXN0LmN1c3RvbVtuYW1lXSkgfHwgbnVsbCxcclxuICAgIE1hbmFnZXI6IFRvYXN0TWFuYWdlcixcclxuICAgIHNob3c6IChvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyksXHJcbiAgICBpbmZvOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5pbmZvKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgc3VjY2VzczogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHdhcm5pbmc6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLndhcm5pbmcobWVzc2FnZSwgb3B0cyksXHJcbiAgICBkYW5nZXI6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmRhbmdlcihtZXNzYWdlLCBvcHRzKSxcclxuICAgIGNvbmZpZ3VyZTogKGNvbmZpZykgPT4gX2dldERlZmF1bHQoKS5jb25maWd1cmUoY29uZmlnKSxcclxuICAgIHNldEFyaWFMaXZlOiAobW9kZSkgPT4gX2dldERlZmF1bHQoKS5zZXRBcmlhTGl2ZShtb2RlKSxcclxuICAgIGNsb3NlQWxsOiAocmVhc29uKSA9PiBfZ2V0RGVmYXVsdCgpLmNsb3NlQWxsKHJlYXNvbiksXHJcbiAgICBnZXRPcGVuVG9hc3RzOiAoKSA9PiBfZ2V0RGVmYXVsdCgpLmdldE9wZW5Ub2FzdHMoKVxyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHRvYXN0O1xyXG5leHBvcnQgeyBUb2FzdE1hbmFnZXIsIGNyZWF0ZVRvYXN0TWFuYWdlciwgdG9hc3QgfTtcclxuIiwiLy8gSW1wb3J0IGRlcyBmb25jdGlvbnMgZXQgbW9kdWxlcyBkZXMgc291cy1tb2R1bGVzXHJcbmltcG9ydCBhdWdtZW50V2l0aFBhY2sgZnJvbSAnLi9mb3JtLXBhY2tlci9hdWdtZW50LWFweC5tanMnO1xyXG5pbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vZm9ybS1wYWNrZXIvcGFja1RvSnNvbi5tanMnO1xyXG5pbXBvcnQgeyBnZXRTY3JvbGxiYXJTaXplIH0gZnJvbSAnLi9nZXRTY3JvbGxiYXJTaXplLm1qcyc7XHJcbmltcG9ydCB7IGxvYWRDc3MgfSBmcm9tICcuL2xvYWRDc3MubWpzJztcclxuXHJcbi8vIEV4cG9ydCBkZSBsYSBmb25jdGlvbiBkJ2F1Z21lbnRhdGlvblxyXG5leHBvcnQgeyBhdWdtZW50V2l0aFBhY2sgfTtcclxuXHJcbi8vIEV4cG9ydCBkZXMgZm9uY3Rpb25zIHV0aWxpdGFpcmVzXHJcbmV4cG9ydCB7IHBhY2tGb3JtVG9KU09OIH07XHJcbmV4cG9ydCB7IGdldFNjcm9sbGJhclNpemUgfTtcclxuZXhwb3J0IHsgbG9hZENzcyB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT04sXHJcbiAgICBnZXRTY3JvbGxiYXJTaXplOiBnZXRTY3JvbGxiYXJTaXplLFxyXG4gICAgbG9hZENzczogbG9hZENzc1xyXG59O1xyXG5cclxuXHJcbiIsImltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vKipcclxuICogQWpvdXRlIGxhIG3DqXRob2RlIHBhY2soKSBhdXggb2JqZXRzIEFQWCBwb3VyIGNvbnZlcnRpciBsZXMgZm9ybXVsYWlyZXMgZW4gSlNPTlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gTCdvYmpldCBBUFggw6AgYXVnbWVudGVyXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgQVBYIGF1Z21lbnTDqVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgbGUgcHJlbWllciBmb3JtdWxhaXJlIHPDqWxlY3Rpb25uw6kgZW4gb2JqZXQgSlNPTlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFzc8OpZXMgw6AgcGFja0Zvcm1Ub0pTT04gKGV4LiB7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSlcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2kgYXVjdW4gZm9ybXVsYWlyZSBuJ2VzdCB0cm91dsOpIG91IHNpIGxlIHByZW1pZXIgw6lsw6ltZW50IG4nZXN0IHBhcyB1biBmb3JtdWxhaXJlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgZGF0YSA9IEFQWCgnZm9ybS5teWZvcm1jbGFzcycpLnBhY2soKTtcclxuICAgICAqIGNvbnN0IGRhdGFMZWdhY3kgPSBBUFgoJ2Zvcm0nKS5wYWNrKHsgbnVtZXJpY0tleXNBbHdheXNBcnJheTogdHJ1ZSB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4LnBhY2sgPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3QoKTtcclxuICAgICAgICBpZiAoIWZpcnN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlbWVudC50YWdOYW1lICE9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IGlzIG5vdCBhIGZvcm0nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhY2tGb3JtVG9KU09OKGZpcnN0RWxlbWVudCwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59XHJcblxyXG5cclxuIiwiLyoqXHJcbiAqIENvbnZlcnRpdCB1biBmb3JtdWxhaXJlIEhUTUwgZW4gb2JqZXQgSlNPTlxyXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybSAtIExlIGZvcm11bGFpcmUgw6AgY29udmVydGlyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIGRlIGNvbnZlcnNpb25cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5udW1lcmljS2V5c0Fsd2F5c0FycmF5PWZhbHNlXSAtIFNpIHRydWUsIHRvdXRlIGNsw6kgbnVtw6lyaXF1ZSBlc3QgdHJhaXTDqWUgY29tbWUgaW5kZXggZGUgdGFibGVhdSAoY29tcG9ydGVtZW50IGQnYXZhbnQgMi42LjIpLiBTaW5vbiwgaGV1cmlzdGlxdWUgOiB0YWJsZWF1IHNldWxlbWVudCBzaSBpbmRpY2VzIGRlbnNlcyAwLDEsMizigKYsbi5cclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICogQHRocm93cyB7VHlwZUVycm9yfSBTaSBmb3JtIG4nZXN0IHBhcyB1biBIVE1MRm9ybUVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBwYWNrRm9ybVRvSlNPTiA9IChmb3JtLCBvcHRpb25zID0ge30pID0+IHtcclxuICAgIC8vIFZhbGlkYXRpb24gZGUgbCdlbnRyw6llXHJcbiAgICBpZiAoIWZvcm0gfHwgIShmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhY2tGb3JtVG9KU09OIGV4cGVjdHMgYW4gSFRNTEZvcm1FbGVtZW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpY0tleXNBbHdheXNBcnJheSA9IG9wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheSA9PT0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcclxuICAgIGNvbnN0IGpzb25EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWl0IHVuZSByZXByw6lzZW50YXRpb24gc3RyaW5nIGR1IGNoZW1pbiBwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBMZXMgcGFydGllcyBkdSBjaGVtaW5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IExlIGNoZW1pbiBmb3JtYXTDqVxyXG4gICAgICovXHJcbiAgICBjb25zdCBidWlsZFBhdGhTdHJpbmcgPSAocGFydHMpID0+IHtcclxuICAgICAgICByZXR1cm4gcGFydHMucmVkdWNlKChwYXRoLCBwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9WyR7cGFydC5pbmRleH1dYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgfSwgJycpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMSA6IEFOQUxZU0UgRVQgRMOJVEVDVElPTiBERVMgQ09ORkxJVFNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJ1Y3R1cmUgcG91ciBzdG9ja2VyIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW5cclxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFBhdGhVc2FnZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ZpbmFsIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzSW50ZXJtZWRpYXRlIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzQXJyYXlTdWZmaXggLSBMZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW10gKGNyw6llIGRlcyB2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIHF1aSB1dGlsaXNlIGNlIGNoZW1pblxyXG4gICAgICovXHJcbiAgICBcclxuICAgIGNvbnN0IHBhdGhVc2FnZSA9IG5ldyBNYXAoKTsgLy8gTWFwPHBhdGhTdHJpbmcsIFBhdGhVc2FnZT5cclxuICAgIGNvbnN0IGtleUFuYWx5c2lzID0gbmV3IE1hcCgpOyAvLyBNYXA8YmFzZVBhdGgsIHtoYXNOdW1lcmljOiBib29sZWFuLCBoYXNTdHJpbmc6IGJvb2xlYW59PlxyXG4gICAgY29uc3QgbnVtZXJpY0luZGljZXNCeVBhdGggPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBTZXQ8bnVtYmVyPj4g4oCUIGluZGljZXMgdW5kZXIgZWFjaCBwYXJlbnQgcGF0aFxyXG4gICAgY29uc3QgYWxsRW50cmllcyA9IFtdO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVucmVnaXN0cmUgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pbiBkYW5zIHBhdGhVc2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gTGUgY2hlbWluIMOgIGVucmVnaXN0cmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmluYWwgLSBTaSBjJ2VzdCB1bmUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0FycmF5U3VmZml4IC0gU2kgbGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlY29yZFBhdGhVc2FnZSA9IChjdXJyZW50UGF0aCwgaXNGaW5hbCwgaXNBcnJheVN1ZmZpeCwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNhZ2UgPSBwYXRoVXNhZ2UuZ2V0KGN1cnJlbnRQYXRoKSA/PyB7XHJcbiAgICAgICAgICAgIGlzRmluYWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0ludGVybWVkaWF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGhhc0FycmF5U3VmZml4OiBmYWxzZSxcclxuICAgICAgICAgICAga2V5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXBhdGhVc2FnZS5oYXMoY3VycmVudFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHBhdGhVc2FnZS5zZXQoY3VycmVudFBhdGgsIHVzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzRmluYWwpIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNGaW5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA9IGtleTtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXlTdWZmaXgpIHtcclxuICAgICAgICAgICAgICAgIHVzYWdlLmhhc0FycmF5U3VmZml4ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzSW50ZXJtZWRpYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID8/PSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gUHJlbWnDqHJlIHBhc3NlIDogYW5hbHlzZXIgdG91dGVzIGxlcyBjbMOpcyBldCBlbnJlZ2lzdHJlciBsZXMgY2hlbWluc1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGFsbEVudHJpZXMucHVzaCh7IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbnN0cnVpcmUgdG91cyBsZXMgY2hlbWlucyBpbnRlcm3DqWRpYWlyZXMgZXQgbGUgY2hlbWluIGZpbmFsXHJcbiAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gJyc7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXlTdWZmaXggPSBwYXJ0LnR5cGUgPT09ICdhcnJheSc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDb25zdHJ1aXJlIGxlIGNoZW1pbiBqdXNxdSfDoCBjZSBuaXZlYXVcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBjdXJyZW50UGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXQgPSBudW1lcmljSW5kaWNlc0J5UGF0aC5nZXQocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldCA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5kaWNlc0J5UGF0aC5zZXQocGFyZW50UGF0aCwgc2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldC5hZGQocGFydC5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRW5yZWdpc3RyZXIgbCd1dGlsaXNhdGlvbiBkdSBjaGVtaW5cclxuICAgICAgICAgICAgcmVjb3JkUGF0aFVzYWdlKGN1cnJlbnRQYXRoLCBpc0xhc3QsIGlzQXJyYXlTdWZmaXggJiYgaXNMYXN0LCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBbmFseXNlciBjaGFxdWUgbml2ZWF1IGRlIGxhIGhpw6lyYXJjaGllIHBvdXIgZMOpdGVjdGVyIGxlcyBjb25mbGl0cyAoaW5kaWNlcyBudW3DqXJpcXVlcyB2cyBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBwYXJ0c1tpICsgMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBbmFseXNlciBzZXVsZW1lbnQgbGVzIGNsw6lzIChwYXMgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMpXHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnQubmFtZTsgLy8gTGUgbm9tIGRlIGxhIHByZW1pw6hyZSBjbMOpIGRhbnMgbGUgY2hlbWluXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKSA/PyB7IGhhc051bWVyaWM6IGZhbHNlLCBoYXNTdHJpbmc6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleUFuYWx5c2lzLmhhcyhiYXNlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlBbmFseXNpcy5zZXQoYmFzZVBhdGgsIGFuYWx5c2lzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5oYXNOdW1lcmljID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdrZXknIHx8IG5leHRQYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzU3RyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRMOpdGVjdGUgZXQgbMOodmUgdW5lIGV4Y2VwdGlvbiBwb3VyIHRvdXMgbGVzIGNvbmZsaXRzIGRlIGNoZW1pbnNcclxuICAgICAqIFxyXG4gICAgICogUHJpbmNpcGUgc2ltcGxlIDogcG91ciBjaGFxdWUgY2hlbWluIGZpbmFsICh2YWxldXIgcHJpbWl0aXZlKSwgdsOpcmlmaWVyIHNpIHVuIGNoZW1pblxyXG4gICAgICogaW50ZXJtw6lkaWFpcmUgY29tbWVuY2UgcGFyIGNlIGNoZW1pbiBzdWl2aSBkZSAnWycuIFNpIGMnZXN0IGxlIGNhcywgYydlc3QgdW4gY29uZmxpdC5cclxuICAgICAqIFxyXG4gICAgICogQ2V0dGUgYXBwcm9jaGUgdW5pZmnDqWUgY291dnJlIHRvdXMgbGVzIGNhcyA6XHJcbiAgICAgKiAtIGl0ZW1zW10gKGZpbmFsKSB2cyBpdGVtc1swXVtuYW1lXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGFycmF5WzNdIChmaW5hbCkgdnMgYXJyYXlbM11bbmVzdGVkXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGRhdGFba2V5XSAoZmluYWwpIHZzIGRhdGFba2V5XVtzdWJdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZGV0ZWN0UGF0aENvbmZsaWN0cyA9ICgpID0+IHtcclxuICAgICAgICAvLyAxLiBDb2xsZWN0ZXIgdG91cyBsZXMgY2hlbWlucyBmaW5hdXggKHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUGF0aEtleXMgPSBuZXcgTWFwKCk7IC8vIFBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzRmluYWwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aHMuYWRkKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgZmluYWxQYXRoS2V5cy5zZXQocGF0aCwgdXNhZ2Uua2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBQb3VyIGNoYXF1ZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmUsIHbDqXJpZmllciBzJ2lsIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWxcclxuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB1c2FnZV0gb2YgcGF0aFVzYWdlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodXNhZ2UuaXNJbnRlcm1lZGlhdGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmluYWxQYXRoIG9mIGZpbmFsUGF0aHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWw6lyaWZpZXIgc2kgY2UgY2hlbWluIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWwgc3VpdmkgZGUgJ1snXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhlbXBsZTogZmluYWxQYXRoID0gXCJhcnJheVszXVwiLCBwYXRoID0gXCJhcnJheVszXVtuZXN0ZWRdXCIg4oaSIGNvbmZsaXRcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke2ZpbmFsUGF0aH1bYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBhdGggY29uZmxpY3Q6IFwiJHtmaW5hbFBhdGh9XCIgaXMgdXNlZCBhcyBhIGZpbmFsIHZhbHVlIChpbiBmaWVsZCBcIiR7ZmluYWxQYXRoS2V5cy5nZXQoZmluYWxQYXRoKX1cIiksIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJ1dCBcIiR7cGF0aH1cIiB0cmllcyB0byB1c2UgaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHBhdGggKGluIGZpZWxkIFwiJHt1c2FnZS5rZXl9XCIpLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGNyZWF0ZXMgaW5jb21wYXRpYmxlIGRhdGEgc3RydWN0dXJlcy4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgXCIke2ZpbmFsUGF0aH1cIiBhcyBhIHByaW1pdGl2ZSB2YWx1ZSBhbmQgdGhlbiBhY2Nlc3MgaXQgYXMgYW4gb2JqZWN0LmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBFeMOpY3V0ZXIgbGEgZMOpdGVjdGlvbiBkZXMgY29uZmxpdHNcclxuICAgIGRldGVjdFBhdGhDb25mbGljdHMoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFbDqXJpZmllIHNpIHVuIGNoZW1pbiBkZSBiYXNlIGEgdW4gY29uZmxpdCAoaW5kaWNlcyBudW3DqXJpcXVlcyBFVCBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2Ugw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaGFzQ29uZmxpY3QgPSAoYmFzZVBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWJhc2VQYXRoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBrZXlBbmFseXNpcy5nZXQoYmFzZVBhdGgpO1xyXG4gICAgICAgIHJldHVybiBhbmFseXNpcz8uaGFzTnVtZXJpYyAmJiBhbmFseXNpcz8uaGFzU3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgaW5kaWNlcyBhcmUgZXhhY3RseSAwLCAxLCAyLCAuLi4sIG4gKGRlbnNlLCBzZXF1ZW50aWFsIGZyb20gMCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRpY2VzIC0gU29ydGVkIGFycmF5IG9mIGluZGljZXNcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCBpc0RlbnNlU2VxdWVudGlhbCA9IChpbmRpY2VzKSA9PiB7XHJcbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmluZGljZXNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvcnRlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoc29ydGVkW2pdICE9PSBqKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgbnVtZXJpYyBrZXlzIHVuZGVyIHRoaXMgcGF0aCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcnJheSBpbmRpY2VzLlxyXG4gICAgICogV2l0aCBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiBhbHdheXMgdHJ1ZSB3aGVuIHBhdGggaGFzIG51bWVyaWMgY2hpbGRyZW4uXHJcbiAgICAgKiBPdGhlcndpc2U6IHRydWUgb25seSB3aGVuIGluZGljZXMgYXJlIGRlbnNlIDAuLm4uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50UGF0aCAtIFBhdGggdG8gdGhlIGNvbnRhaW5lciB0aGF0IGhhcyBudW1lcmljIGNoaWxkcmVuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgdXNlQXJyYXlGb3JOdW1lcmljUGF0aCA9IChwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobnVtZXJpY0tleXNBbHdheXNBcnJheSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVuc2VTZXF1ZW50aWFsKFsuLi5zZXRdKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gdGFibGVhdSBlbiBvYmpldCBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcyBjb21tZSBwcm9wcmnDqXTDqXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciAtIExlIHRhYmxlYXUgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgYXJyYXlUb09iamVjdCA9IChhcnIpID0+IHtcclxuICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAvLyBDb3BpZXIgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICBvYmpbaWR4XSA9IGFycltpZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb3BpZXIgbGVzIHByb3ByacOpdMOpcyBub24tbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhcnIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biBvYmpldCBlbiB0YWJsZWF1IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTCdvYmpldCDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgdGFibGVhdSByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9iamVjdFRvQXJyYXkgPSAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iajtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyW251bUtleV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gb2JqZXQsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VPYmplY3QgLSBGb3JjZXIgbGEgY29udmVyc2lvbiBlbiBvYmpldCBtw6ptZSBzJ2lsIG4neSBhIHBhcyBkZSBjb25mbGl0XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIG9iamV0IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVPYmplY3QgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCwgZm9yY2VPYmplY3QgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJyYXlUb09iamVjdChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gdGFibGVhdSwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIHRhYmxlYXUgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZUFycmF5ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQpID0+IHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IGFycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAyIDogVFJBSVRFTUVOVCBERVMgVkFMRVVSU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgdmFsZXVyIGZpbmFsZSAoZGVybmnDqHJlIHBhcnRpZSBkdSBjaGVtaW4pXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBMYSB2YWxldXIgw6AgYXNzaWduZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBDaGVtaW4gZHUgY29udGVuZXVyIGFjdHVlbCAocG91ciBoZXVyaXN0aXF1ZSBudW1lcmljKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzRmluYWxWYWx1ZSA9IChjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAvLyBUYWJsZWF1IGV4cGxpY2l0ZSBhdmVjIFtdXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSBbXTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZUFycmF5ID0gdXNlQXJyYXlGb3JOdW1lcmljUGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgaWYgKHVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDbMOpIHNpbXBsZSBmaW5hbGVcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHBhcnRpZSBpbnRlcm3DqWRpYWlyZSAoY3LDqWUgbGEgc3RydWN0dXJlKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBuZXh0UGFydCAtIExhIHBhcnRpZSBzdWl2YW50ZSAocGV1dCDDqnRyZSBudWxsKVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIFRvdXRlcyBsZXMgcGFydGllcyBkdSBjaGVtaW4gKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSBMJ2luZGV4IGRlIGxhIHBhcnRpZSBhY3R1ZWxsZSAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIChwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1cilcclxuICAgICAqIEByZXR1cm5zIHsqfSBMZSBub3V2ZWF1IGNvbnRlbmV1ciBhcHLDqHMgdHJhaXRlbWVudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydCA9IChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCkgJiYgIWhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghdXNlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2zDqSBub3JtYWxlIDogY3LDqWVyIG9iamV0IG91IHRhYmxlYXUgc2Vsb24gbGEgcGFydGllIHN1aXZhbnRlXHJcbiAgICAgICAgY29uc3QgbmV4dElzTnVtZXJpYyA9IG5leHRQYXJ0Py50eXBlID09PSAnbnVtZXJpYyc7XHJcbiAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZsaXQgOiB0b3Vqb3VycyB1dGlsaXNlciB1biBvYmpldFxyXG4gICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPz89IHt9O1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbcGFydC5uYW1lXSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBQYXMgZGUgY29uZmxpdCwgY3LDqWVyIHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IG5leHRJc051bWVyaWMgPyBbXSA6IHt9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dElzTnVtZXJpYyAmJiAhQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLy8gT24gYSBiZXNvaW4gZCd1biB0YWJsZWF1IG1haXMgYydlc3QgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29uc3QgaGFzU3RyaW5nS2V5cyA9IE9iamVjdC5rZXlzKGNvbnRhaW5lcltwYXJ0Lm5hbWVdKS5zb21lKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghaGFzU3RyaW5nS2V5cykge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIW5leHRJc051bWVyaWMgJiYgIWlzUGxhaW5PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gb2JqZXQgbWFpcyBjJ2VzdCB1biB0YWJsZWF1XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUydhc3N1cmVyIHF1ZSBjb250YWluZXJbcGFydC5uYW1lXSBlc3QgYmllbiB1biBvYmpldCBhcHLDqHMgdG91dGVzIGxlcyBjb252ZXJzaW9uc1xyXG4gICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyW3BhcnQubmFtZV07XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBUcmFpdGVyIHRvdXRlcyBsZXMgZW50csOpZXNcclxuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwga2V5IH0gb2YgYWxsRW50cmllcykge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbeyBjb250YWluZXI6IGpzb25EYXRhLCBrZXk6IG51bGwgfV07XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGpzb25EYXRhO1xyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGFydHNbMF0/LnR5cGUgPT09ICdrZXknID8gcGFydHNbMF0ubmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBpICsgMSA8IHBhcnRzLmxlbmd0aCA/IHBhcnRzW2kgKyAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0xhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbmFsVmFsdWUoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJ0aWUgaW50ZXJtw6lkaWFpcmUgOiBjcsOpZXIgbGEgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KTtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaCh7IGNvbnRhaW5lciwga2V5OiBwYXJ0LnR5cGUgPT09ICdudW1lcmljJyA/IHBhcnQuaW5kZXggOiBwYXJ0Lm5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuZXdDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGpzb25EYXRhO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIHVuZSBjbMOpIGRlIGZvcm11bGFpcmUgcG91ciBleHRyYWlyZSBsZXMgcGFydGllcyAobm9tLCBpbmRpY2VzLCBldGMuKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSDDoCBwYXJzZXIgKGV4OiBcInVzZXJbZW1haWxdXCIsIFwidGFnc1tdXCIsIFwiaXRlbXNbMF1bbmFtZV1cIilcclxuICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgaW5kZXg/OiBudW1iZXJ9Pn0gVGFibGVhdSBkZXMgcGFydGllcyBwYXJzw6llc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgcGFyc2VLZXkgPSAoa2V5KSA9PiB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGxlbiA9IGtleS5sZW5ndGg7XHJcblxyXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICBjb25zdCBjaGFyID0ga2V5W2ldO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjaGFyID09PSAnWycpIHtcclxuICAgICAgICAgICAgLy8gU2F1dmVnYXJkZXIgbGEgcGFydGllIHByw6ljw6lkZW50ZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBUcm91dmVyIGxhIGZpbiBkdSBjcm9jaGV0XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgbGV0IGJyYWNrZXRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGtleVtpXSAhPT0gJ10nKSB7XHJcbiAgICAgICAgICAgICAgICBicmFja2V0Q29udGVudCArPSBrZXlbaV07XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChicmFja2V0Q29udGVudCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIC8vIFtdIHZpZGUgPSB0YWJsZWF1XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcnQudHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFtdIGF1IGTDqWJ1dCwgY3LDqWVyIHVuZSBwYXJ0aWUgc3DDqWNpYWxlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6ICcnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudSBkYW5zIGxlcyBjcm9jaGV0c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoYnJhY2tldENvbnRlbnQsIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUluZGV4KSAmJiBicmFja2V0Q29udGVudCA9PT0gU3RyaW5nKG51bUluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IFN0cmluZyhudW1JbmRleCksIHR5cGU6ICdudW1lcmljJywgaW5kZXg6IG51bUluZGV4IH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb20gZGUgcHJvcHJpw6l0w6lcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogYnJhY2tldENvbnRlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkrKzsgLy8gUGFzc2VyIGxlICddJ1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWpvdXRlciBsYSBkZXJuacOocmUgcGFydGllIHNpIGVsbGUgZXhpc3RlXHJcbiAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFbDqXJpZmllIHNpIHVuZSB2YWxldXIgZXN0IHVuIG9iamV0IHNpbXBsZSAocGFzIHVuIHRhYmxlYXUsIHBhcyBudWxsKVxyXG4gKiBAcGFyYW0geyp9IG9iaiAtIExhIHZhbGV1ciDDoCB2w6lyaWZpZXJcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKG9iaikgPT4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xyXG59O1xyXG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyU2l6ZShvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIikge1xyXG4gICAgaWYgKCFnZXRTY3JvbGxiYXJTaXplLl9jYWNoZSkge1xyXG4gICAgICAgIGNvbnN0IG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKG91dGVyLnN0eWxlLCB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXHJcbiAgICAgICAgICAgIHRvcDogXCItOTk5OXB4XCIsXHJcbiAgICAgICAgICAgIGxlZnQ6IFwiLTk5OTlweFwiLFxyXG4gICAgICAgICAgICB3aWR0aDogXCIxMDBweFwiLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IFwiMTAwcHhcIixcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwic2Nyb2xsXCIsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xyXG5cclxuICAgICAgICBnZXRTY3JvbGxiYXJTaXplLl9jYWNoZSA9IHtcclxuICAgICAgICAgICAgdmVydGljYWw6IG91dGVyLm9mZnNldFdpZHRoIC0gb3V0ZXIuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgIGhvcml6b250YWw6IG91dGVyLm9mZnNldEhlaWdodCAtIG91dGVyLmNsaWVudEhlaWdodCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBvdXRlci5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ2V0U2Nyb2xsYmFyU2l6ZS5fY2FjaGVbb3JpZW50YXRpb25dID8/IDA7XHJcbn1cclxuIiwiY29uc3QgbG9hZENzc0NhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLyoqXHJcbiAqIExvYWRzIENTUyBmcm9tIGEgVVJMIGFuZCBpbmplY3RzIGl0IGludG8gdGhlIGRvY3VtZW50LlxyXG4gKiBJZGVtcG90ZW50OiBzYW1lIFVSTCByZXR1cm5zIHRoZSBzYW1lIFByb21pc2U7IGR1cGxpY2F0ZSBsb2FkcyBhcmUgYXZvaWRlZC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFVSTCBvZiB0aGUgQ1NTIGZpbGUgdG8gbG9hZFxyXG4gKiBAcGFyYW0ge3sgaWQ/OiBzdHJpbmcsIG1lZGlhPzogc3RyaW5nLCBiZWZvcmU/OiBOb2RlIH19IFtvcHRpb25zXSAtIE9wdGlvbmFsOiBpZCBhbmQgbWVkaWEgZm9yIHRoZSBzdHlsZSBlbGVtZW50LCBiZWZvcmUgZm9yIGluc2VydGlvbiBwb2ludFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxIVE1MU3R5bGVFbGVtZW50Pn0gUmVzb2x2ZXMgd2l0aCB0aGUgaW5qZWN0ZWQgc3R5bGUgZWxlbWVudDsgcmVqZWN0cyBvbiBmZXRjaCBmYWlsdXJlIG9yIG5vbi1vayByZXNwb25zZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDc3ModXJsLCBvcHRpb25zID0ge30pIHtcclxuICAgIGNvbnN0IGNhY2hlZCA9IGxvYWRDc3NDYWNoZS5nZXQodXJsKTtcclxuICAgIGlmIChjYWNoZWQpIHtcclxuICAgICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByb21pc2UgPSBmZXRjaCh1cmwpXHJcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgQ1NTOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoY3NzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlU2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmlkKSBzdHlsZVNoZWV0LmlkID0gb3B0aW9ucy5pZDtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVkaWEpIHN0eWxlU2hlZXQubWVkaWEgPSBvcHRpb25zLm1lZGlhO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnRleHRDb250ZW50ID0gY3NzO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gb3B0aW9ucy5iZWZvcmU7XHJcbiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgJiYgaW5zZXJ0QmVmb3JlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZVNoZWV0LCBpbnNlcnRCZWZvcmUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlU2hlZXQ7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGxvYWRDc3NDYWNoZS5kZWxldGUodXJsKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBsb2FkIENTUzpcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICBsb2FkQ3NzQ2FjaGUuc2V0KHVybCwgcHJvbWlzZSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxufVxyXG4iLCJpbXBvcnQgJy4vY3NzL3RyaXN0YXRlLmNzcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyaS1zdGF0ZSBjaGVja2JveCBmb3IgZWFjaCBjaGVja2JveCBlbGVtZW50IGluIHRoZSBhcHguZWxlbWVudHMgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gYXB4IC0gQW4gYXJyYXkgb2YgSFRNTEVsZW1lbnRzIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFQWCgpXG4gKiBAZXhhbXBsZVxuICogLy8gQ2FsbCB0aGUgdHJpc3RhdGUgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgY2hlY2tib3ggZWxlbWVudHNcbiAqIGFweC50cmlzdGF0ZSgpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XG4gICAgYXB4LnRyaXN0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSl7XG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF0gPSBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2hlY2tib3guX2FweFRyaXN0YXRlID0geyBkb206IHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCB9O1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIob3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW5BcHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q2hpbGRyZW4oYXB4LCBjaGlsZHJlbkFweCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuLyoqXG4gKiBMaW5rIHBhcmVudCB0cmlzdGF0ZShzKSB0byBjaGlsZCBjaGVja2JveGVzLiBXaGVuIGV4YWN0bHkgb25lIHBhcmVudDogdGhhdCBwYXJlbnQgZ2V0c1xuICogaW5kZXRlcm1pbmF0ZS1kYXNoIGF1dG9tYXRpY2FsbHkgYW5kIHNob3dzIGRhc2ggd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQ7IGNsaWNrIHBhcmVudCB0byBhcHBseSBpdHMgc3RhdGUgdG8gYWxsIGNoaWxkcmVuLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHBhcmVudCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZHJlbkFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIGNoaWxkIGNoZWNrYm94KGVzKVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHVzZWQgZm9yIHRoZSBwYXJlbnQgKGFuZCBhcHBsaWVkIHRvIGNoaWxkcmVuIHdoZW4gaW5pdGlhbGl6aW5nIHRoZW0pXG4gKi9cbmZ1bmN0aW9uIHNldENoaWxkcmVuKHBhcmVudEFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gcGFyZW50QXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdBUFggdHJpc3RhdGUgc2V0Q2hpbGRyZW46IG9ubHkgdGhlIGZpcnN0IHBhcmVudCBpcyBsaW5rZWQgdG8gYWxsIGNoaWxkcmVuLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRDaGVja2JveCA9IHBhcmVudHNbMF07XG4gICAgY29uc3QgcGFyZW50UmVmID0gcGFyZW50Q2hlY2tib3guX2FweFRyaXN0YXRlO1xuICAgIGlmICghcGFyZW50UmVmKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJlbnREb20gPSBwYXJlbnRSZWYuZG9tO1xuICAgIGNvbnN0IHBhcmVudEhpZGRlbklucHV0ID0gcGFyZW50UmVmLmhpZGRlbklucHV0O1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgaW5kZXRlcm1pbmF0ZSAoZGFzaCkgb24gcGFyZW50IHdoZW4gaXQgaGFzIGNoaWxkcmVuOiBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKC0tbWl4ZWQpXG4gICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2FweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnLCAnYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2gnKTtcblxuICAgIGNvbnN0IGNoaWxkQ2hlY2tib3hlcyA9IGNoaWxkcmVuQXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGNvbnN0IGNoaWxkUmVmcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gc3luY1BhcmVudEZyb21DaGlsZHJlbigpIHtcbiAgICAgICAgaWYgKGNoaWxkUmVmcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gY2hpbGRSZWZzLm1hcCgocmVmKSA9PiBnZXRUcmlzdGF0ZVN0YXRlKHJlZi5kb20pKTtcbiAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2NoZWNrZWQnKTtcbiAgICAgICAgY29uc3QgYWxsQ3Jvc3NlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2Nyb3NzZWQnKTtcbiAgICAgICAgY29uc3QgYWxsVW5jaGVja2VkID0gc3RhdGVzLmV2ZXJ5KChzKSA9PiBzID09PSAndW5jaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IG1peGVkID0gIWFsbENoZWNrZWQgJiYgIWFsbENyb3NzZWQgJiYgIWFsbFVuY2hlY2tlZDtcblxuICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgICAgICBpZiAobWl4ZWQpIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG4gICAgICAgIGVsc2UgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2FweC10cmlzdGF0ZS0tbWl4ZWQnKTtcblxuICAgICAgICBpZiAoYWxsQ2hlY2tlZCkge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbENyb3NzZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5UGFyZW50VG9DaGlsZHJlbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50U3RhdGUgPSBnZXRUcmlzdGF0ZVN0YXRlKHBhcmVudERvbSk7XG4gICAgICAgIGNoaWxkUmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFRyaXN0YXRlU3RhdGUocmVmLmNoZWNrYm94LCByZWYuZG9tLCByZWYuaGlkZGVuSW5wdXQsIHBhcmVudFN0YXRlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIGFmdGVyKGNoZWNrYm94LCBkb20sIGhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICAgICAgY2hpbGRSZWZzLnB1c2goeyBjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFuZ2U6IHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW5cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjaGlsZHJlbkFweC50cmlzdGF0ZShjaGlsZE9wdGlvbnMpO1xuXG4gICAgc3luY1BhcmVudEZyb21DaGlsZHJlbigpO1xuICAgIHBhcmVudERvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoYXBwbHlQYXJlbnRUb0NoaWxkcmVuLCAwKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRyaXN0YXRlU3RhdGUoZG9tKSB7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkgcmV0dXJuICdjaGVja2VkJztcbiAgICBpZiAoZG9tLmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpKSByZXR1cm4gJ2Nyb3NzZWQnO1xuICAgIHJldHVybiAndW5jaGVja2VkJztcbn1cblxuZnVuY3Rpb24gc2V0VHJpc3RhdGVTdGF0ZShjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCwgc3RhdGUpIHtcbiAgICBkb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKHN0YXRlKTtcbiAgICBjb25zdCBuYW1lID0gY2hlY2tib3guZGF0YXNldC5uYW1lIHx8IGNoZWNrYm94LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJykgfHwgY2hlY2tib3gubmFtZSB8fCAnJztcbiAgICBpZiAoc3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICBpZiAobmFtZSkgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUoY3VzdG9tQ2hlY2tib3gsIGFjdHVhbENoZWNrYm94LCBoaWRkZW5JbnB1dCkge1xuICAgIGNvbnN0IHdhc0NoZWNrZWQgPSBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKTtcbiAgICBjb25zdCB3YXNDcm9zc2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJyk7XG4gICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmICh3YXNDaGVja2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfSBlbHNlIGlmICh3YXNDcm9zc2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgYWN0dWFsQ2hlY2tib3guZGF0YXNldC5uYW1lKTsgLy8gUmVzdG9yZSB0aGUgbmFtZSBmb3IgcG9zdGluZ1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBcbiAgICAvL2dldCB0aGUgY2hlY2tib3ggbWFyZ2lucyBpbmNsdWRpbmcgYnJvd3NlciBkZWZhdWx0XG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XG4gICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdiBhbmQgc2V0IGl0cyBpbml0aWFsIHN0YXRlXG4gICAgY29uc3QgdHJpc3RhdGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcbiAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpemUud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdyA9IG9wdGlvbnMuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS53aWR0aCBtdXN0IGJlIGEgbnVtYmVyIChweCkgb3IgYSBzdHJpbmcgKENTUyBsZW5ndGgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUud2lkdGggPSB0eXBlb2YgdyA9PT0gJ251bWJlcicgPyB3ICsgJ3B4JyA6IFN0cmluZyh3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gb3B0aW9ucy5zaXplLmhlaWdodDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS5oZWlnaHQgbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLmhlaWdodCA9IHR5cGVvZiBoID09PSAnbnVtYmVyJyA/IGggKyAncHgnIDogU3RyaW5nKGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuY2xhc3NlcykgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCguLi5jb21wdXRlQ2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpKTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ29sb3JzKG9wdGlvbnMpO1xuICAgIGlmIChjb2xvcnMudGljayAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcicsIFN0cmluZyhjb2xvcnMudGljaykpO1xuICAgIGlmIChjb2xvcnMuY2hlY2tlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY2hlY2tlZCkpO1xuICAgIGlmIChjb2xvcnMuY3Jvc3NlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY3Jvc3NlZCkpO1xuXG4gICAgdHJpc3RhdGVEb20uc3R5bGUubWFyZ2luID0gY2hlY2tib3hTdHlsZS5tYXJnaW47XG5cbiAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgaGlkZGVuIGlucHV0IGZpZWxkXG4gICAgY29uc3QgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcbiAgICBoaWRkZW5JbnB1dC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuZGF0YXNldC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIFN0b3JlIHRoZSBuYW1lIGluIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGxhdGVyIHVzZVxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXG5cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUpIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIGVsc2V7XG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhpZGRlbiBpbnB1dCBiYXNlZCBvbiB0aGUgY2hlY2tib3gncyBzdGF0ZVxuICAgICAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlkZGVuSW5wdXQubmFtZSA9ICcnOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9oYW5kbGUgYWNjZXNzaWJpbGl0eSwgc2V0IHRoZSB0YWJpbmRleCB0byB0aGUgc2FtZSBhcyB0aGUgY2hlY2tib3hcbiAgICB0cmlzdGF0ZURvbS50YWJJbmRleCA9IGNoZWNrYm94RWxlbWVudC50YWJJbmRleDtcblxuICAgIC8vIEluc2VydCB0aGUgaGlkZGVuIGlucHV0IGluc2lkZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdlxuICAgIHRyaXN0YXRlRG9tLmFwcGVuZENoaWxkKGhpZGRlbklucHV0KTtcblxuICAgIC8vIEluc2VydCBpdCBuZXh0IHRvIHRoZSBhY3R1YWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZSk7XG4gICAgfSk7XG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XG5cbiAgICByZXR1cm4gW2NoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XTtcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCkge1xuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdGF0ZSBjbGFzcyBpcyBzZXQgKHVuY2hlY2tlZEFwcGVhcmFuY2UgbW9kaWZpZXJzIG11c3Qgbm90IGFmZmVjdCBjaGVja2VkL2Nyb3NzZWQpXG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAndW5jaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlQ2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xuICAgIGlmKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvL3JlcGxhY2UgbXVsdGlwbGUgd2hpdGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xuICAgICAgICBpZihjbGFzc2VzLmluZGV4T2YoJyAnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcsJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcbiAgICB9XG4gICAgZWxzZSBpZihBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZENsYXNzZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2xvcnMob3B0aW9ucykge1xuICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbG9ycyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aWNrOiBjLnRpY2sgIT0gbnVsbCA/IGMudGljayA6IG9wdGlvbnMudGlja0NvbG9yLFxuICAgICAgICBjaGVja2VkOiBjLmNoZWNrZWQgIT0gbnVsbCA/IGMuY2hlY2tlZCA6IG9wdGlvbnMuY2hlY2tlZENvbG9yLFxuICAgICAgICBjcm9zc2VkOiBjLmNyb3NzZWQgIT0gbnVsbCA/IGMuY3Jvc3NlZCA6IG9wdGlvbnMuY3Jvc3NlZENvbG9yXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBldmVudCkge1xuICAgIC8vaWYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlIGlzIHNldCwgY2FsbCBpdFxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZShjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgfVxuXG4gICAgaWYoIW9wdGlvbnMuYnViYmxlRXZlbnRzKSByZXR1cm47XG5cbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCB7IGtleTogJyAnLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbmtleXVwKGNoZWNrYm94RWxlbWVudCwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgZXZlbnQpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcbiAgICB9XG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IGF1Z21lbnRXaXRoTGlzdGVuIGZyb20gJy4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhUcmlzdGF0ZSBmcm9tICcuL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzJztcbmltcG9ydCBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZSBmcm9tICcuL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMnO1xuaW1wb3J0IGRpYWxvZyBmcm9tICcuL21vZHVsZXMvZGlhbG9nL2RpYWxvZy5tanMnO1xuaW1wb3J0IHRvYXN0IGZyb20gJy4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMnO1xuaW1wb3J0IHsgYXVnbWVudFdpdGhQYWNrLCB0b29scywgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy90b29scy9leHBvcnRzLm1qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUFggb2JqZWN0IHRoYXQgd3JhcHMgb25lIG9yIG1vcmUgSFRNTCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fEhUTUxDb2xsZWN0aW9ufEFycmF5PEhUTUxFbGVtZW50PnxqUXVlcnl8RnVuY3Rpb259IGlucHV0IC0gVGhlIGlucHV0IHRvIGNyZWF0ZSB0aGUgQVBYIG9iamVjdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGlucHV0IHR5cGUgaXMgaW52YWxpZC5cbiAqIEBleGFtcGxlXG4gKiAvLyBYUGF0aFxuICogY29uc3QgYXB4MSA9IEFQWCgnLy9kaXZbQGNsYXNzPVwiZXhhbXBsZVwiXScpO1xuICpcbiAqIC8vIENTUyBzZWxlY3RvclxuICogY29uc3QgYXB4MiA9IEFQWCgnLmV4YW1wbGUnKTtcbiAqXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxuICogY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHgzID0gQVBYKGVsZW1lbnQpO1xuICpcbiAqIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBjb25zdCBub2RlTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcbiAqXG4gKiAvLyBBcnJheSBvZiBlbGVtZW50c1xuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcbiAqIGNvbnN0IGFweDUgPSBBUFgoZWxlbWVudHMpO1xuICpcbiAqIC8vIGpRdWVyeSBvYmplY3RcbiAqIGNvbnN0ICRleGFtcGxlID0gJCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDYgPSBBUFgoJGV4YW1wbGUpO1xuICpcbiAqIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0XG4gKiBjb25zdCBhcHg3ID0gQVBYKCgpID0+IEFQWCgnLmV4YW1wbGUnKSk7XG4gKi9cbmNvbnN0IEFQWCA9IGZ1bmN0aW9uIChpbnB1dCwgY29udGV4dCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IGVsZW1lbnRzO1xuXG4gICAgLy8gVmFsaWRhdGUgY29udGV4dFxuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFQWC5pc0FQWE9iamVjdChjb250ZXh0KSkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xuICAgIH0gZWxzZSBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgY29udGV4dCBpbnN0YW5jZW9mIERvY3VtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGV4dCBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5ldmFsdWF0ZShpbnB1dCwgY29udGV4dCwgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzID0gbm9kZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENTUyBzZWxlY3RvciB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQuY29udGFpbnMoaW5wdXQpID8gW2lucHV0XSA6IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dCkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGVsZW1lbnRzIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gaW5wdXQuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgLy8galF1ZXJ5IG9iamVjdCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQuZ2V0KCkpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3Qgd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQVBYKGlucHV0KCksIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0eXBlIGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICB2YXIgYXB4ID0ge1xuICAgICAgICBlbGVtZW50czogZWxlbWVudHMsXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxuICAgIH07XG4gICAgYXB4Lmxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLmVsZW1lbnRzLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgIH07XG4gICAgYXB4LmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KDApO1xuICAgIH07XG4gICAgYXVnbWVudFdpdGhMaXN0ZW4oYXB4KTtcbiAgICBhdWdtZW50V2l0aFRyaXN0YXRlKGFweCk7XG4gICAgYXVnbWVudFdpdGhTY3JvbGxhYmxlVGFibGUoYXB4KTtcbiAgICBhdWdtZW50V2l0aFBhY2soYXB4KTtcbiAgICByZXR1cm4gYXB4O1xufTtcblxuQVBYLmxvYWRDc3MgPSBsb2FkQ3NzO1xuQVBYLmRpYWxvZyA9IGRpYWxvZztcbkFQWC50b2FzdCA9IHRvYXN0O1xuQVBYLnRvb2xzID0gdG9vbHM7XG5BUFguaXNBUFhPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBvYmouX2lzQVBYT2JqZWN0ID09PSB0cnVlO1xufVxuQVBYLmlzX251bWVyaWMgPSAobikgPT4ge1xuICAgIHJldHVybiAhaXNOYU4obiAtIHBhcnNlRmxvYXQobikpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBUFg7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9