el-text-editor 0.0.86 → 0.0.87
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/README.md +24 -24
- package/esm2020/lib/el-text-editor.component.mjs +222 -68
- package/esm2020/lib/el-text-editor.module.mjs +1 -1
- package/esm2020/lib/el-text-editor.service.mjs +1 -1
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/el-text-editor.mjs +221 -68
- package/fesm2015/el-text-editor.mjs.map +1 -1
- package/fesm2020/el-text-editor.mjs +221 -67
- package/fesm2020/el-text-editor.mjs.map +1 -1
- package/lib/el-text-editor.component.d.ts +2 -0
- package/package.json +1 -1
@@ -808,20 +808,20 @@ export class ElTextEditorComponent {
|
|
808
808
|
document.execCommand('fontName', false, this.selectedFont);
|
809
809
|
}
|
810
810
|
insertCodeBlock() {
|
811
|
-
const code = `
|
812
|
-
<pre style="font-size: 12px;
|
813
|
-
color: white;
|
814
|
-
background-color: black;
|
815
|
-
overflow-x: auto;
|
816
|
-
margin-bottom: 5px;
|
817
|
-
margin-top: 5px;
|
818
|
-
padding: 5px 10px;">
|
819
|
-
<code style="display: block;
|
820
|
-
white-space: pre-wrap;
|
821
|
-
height: auto;
|
822
|
-
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
|
823
|
-
font-size: 14px;" class="language-html">Insert code here...</code>
|
824
|
-
</pre>
|
811
|
+
const code = `
|
812
|
+
<pre style="font-size: 12px;
|
813
|
+
color: white;
|
814
|
+
background-color: black;
|
815
|
+
overflow-x: auto;
|
816
|
+
margin-bottom: 5px;
|
817
|
+
margin-top: 5px;
|
818
|
+
padding: 5px 10px;">
|
819
|
+
<code style="display: block;
|
820
|
+
white-space: pre-wrap;
|
821
|
+
height: auto;
|
822
|
+
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
|
823
|
+
font-size: 14px;" class="language-html">Insert code here...</code>
|
824
|
+
</pre>
|
825
825
|
`;
|
826
826
|
document.execCommand('insertHTML', false, code);
|
827
827
|
}
|
@@ -942,26 +942,109 @@ export class ElTextEditorComponent {
|
|
942
942
|
selection.addRange(range);
|
943
943
|
}
|
944
944
|
}
|
945
|
+
// addTable() {
|
946
|
+
// const tableWidth = 825; // Table width in pixels
|
947
|
+
// const cols = 3; // Number of columns
|
948
|
+
// const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell
|
949
|
+
// let table = `<br /><table style="width: ${tableWidth}px;">`;
|
950
|
+
// for (let i = 0; i < 3; i++) { // Number of rows
|
951
|
+
// table += `<tr style="border-bottom: ${this.themeModeClrVerticalLineForTable()}">`; // Add border-bottom to the row
|
952
|
+
// for (let j = 0; j < cols; j++) {
|
953
|
+
// table += `<td style="word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;"> </td>`;
|
954
|
+
// }
|
955
|
+
// table += '</tr>';
|
956
|
+
// }
|
957
|
+
// table += '</table><br/>';
|
958
|
+
// const editor = document.getElementById('editor');
|
959
|
+
// if (editor) {
|
960
|
+
// editor.focus();
|
961
|
+
// document.execCommand('insertHTML', false, table);
|
962
|
+
// }
|
963
|
+
// this.tableAdded = true;
|
964
|
+
// this.checkTableSelection();
|
965
|
+
// }
|
945
966
|
addTable() {
|
946
|
-
const tableWidth = 825;
|
947
|
-
const cols = 3;
|
948
|
-
const cellMinWidth = tableWidth / cols;
|
949
|
-
let table = `<br /><table style="width: ${tableWidth}px;">`;
|
950
|
-
|
951
|
-
|
967
|
+
const tableWidth = 825;
|
968
|
+
const cols = 3;
|
969
|
+
const cellMinWidth = tableWidth / cols;
|
970
|
+
let table = `<br /><table id="customTable" style="width: ${tableWidth}px; border-collapse: collapse;">`;
|
971
|
+
table += `<tbody>`;
|
972
|
+
table += `<tr id="tableHeaderRow" style="border-bottom: ${this.themeModeClrVerticalLineForTable()};" (click)="checkTableSelection()">`;
|
973
|
+
for (let j = 0; j < cols; j++) {
|
974
|
+
table += `<td class="header-cell"
|
975
|
+
style="border-top: 2px solid black;
|
976
|
+
font-weight: bold;
|
977
|
+
text-align: start;
|
978
|
+
word-wrap: break-word;
|
979
|
+
word-break: break-all;
|
980
|
+
white-space: normal;
|
981
|
+
min-width: ${cellMinWidth}px;
|
982
|
+
background-color: inherit !important;
|
983
|
+
// pointer-events: none !important;
|
984
|
+
display: table-cell !important;
|
985
|
+
position: static !important;
|
986
|
+
height:28px;"></td>`;
|
987
|
+
}
|
988
|
+
table += `</tr>`;
|
989
|
+
for (let i = 0; i < 3; i++) {
|
990
|
+
table += `<tr style="border-bottom: ${this.themeModeClrVerticalLineForTable()}">`;
|
952
991
|
for (let j = 0; j < cols; j++) {
|
953
|
-
table += `<td style="word-wrap: break-word;
|
992
|
+
table += `<td style="word-wrap: break-word;
|
993
|
+
word-break: break-all;
|
994
|
+
white-space: normal;
|
995
|
+
min-width: ${cellMinWidth}px;
|
996
|
+
display: table-cell !important;
|
997
|
+
position: static !important;"> </td>`;
|
954
998
|
}
|
955
|
-
table +=
|
999
|
+
table += "</tr>";
|
956
1000
|
}
|
957
|
-
table +=
|
958
|
-
const editor = document.getElementById(
|
1001
|
+
table += `</tbody></table><br/>`;
|
1002
|
+
const editor = document.getElementById("editor");
|
959
1003
|
if (editor) {
|
960
1004
|
editor.focus();
|
961
|
-
document.execCommand(
|
1005
|
+
document.execCommand("insertHTML", false, table);
|
962
1006
|
}
|
963
1007
|
this.tableAdded = true;
|
964
1008
|
this.checkTableSelection();
|
1009
|
+
// Add styles to prevent table structure breaking
|
1010
|
+
const style = document.createElement("style");
|
1011
|
+
style.innerHTML = `
|
1012
|
+
#customTable {
|
1013
|
+
table-layout: fixed !important;
|
1014
|
+
border-collapse: collapse !important;
|
1015
|
+
}
|
1016
|
+
#customTable tr {
|
1017
|
+
display: table-row !important;
|
1018
|
+
}
|
1019
|
+
#customTable td {
|
1020
|
+
display: table-cell !important;
|
1021
|
+
position: static !important;
|
1022
|
+
}
|
1023
|
+
#customTable .header-cell {
|
1024
|
+
position: static !important;
|
1025
|
+
}
|
1026
|
+
#customTable .header-cell > span {
|
1027
|
+
display: inline !important;
|
1028
|
+
position: static !important;
|
1029
|
+
}
|
1030
|
+
#customTable .header-cell:hover {
|
1031
|
+
cursor: default !important;
|
1032
|
+
}
|
1033
|
+
`;
|
1034
|
+
document.head.appendChild(style);
|
1035
|
+
}
|
1036
|
+
// Function to change the first row (thead) background color
|
1037
|
+
setTheadBgColor(event) {
|
1038
|
+
const selectedColor = event.target.value;
|
1039
|
+
if (this.selectedTable) {
|
1040
|
+
const headerRow = this.selectedTable.querySelector("tr");
|
1041
|
+
if (headerRow) {
|
1042
|
+
const headerCells = headerRow.querySelectorAll(".header-cell");
|
1043
|
+
headerCells.forEach((cell) => {
|
1044
|
+
cell.style.backgroundColor = selectedColor;
|
1045
|
+
});
|
1046
|
+
}
|
1047
|
+
}
|
965
1048
|
}
|
966
1049
|
checkTableSelection(event) {
|
967
1050
|
let target = event?.target;
|
@@ -1221,39 +1304,110 @@ export class ElTextEditorComponent {
|
|
1221
1304
|
// }
|
1222
1305
|
// }
|
1223
1306
|
// }
|
1307
|
+
// setTextColor(event: any) {
|
1308
|
+
// if (this.savedSelection) {
|
1309
|
+
// const color = event.target.value;
|
1310
|
+
// this.selectedTextColor = color;
|
1311
|
+
// // Restore the saved selection
|
1312
|
+
// const selection = window.getSelection();
|
1313
|
+
// if (selection && selection.rangeCount > 0) {
|
1314
|
+
// const range = this.savedSelection;
|
1315
|
+
// selection.removeAllRanges();
|
1316
|
+
// selection.addRange(range);
|
1317
|
+
// // Get selected elements
|
1318
|
+
// const selectedContent = range.cloneContents();
|
1319
|
+
// const elements = Array.from(selectedContent.querySelectorAll("*")) as HTMLElement[]; // ✅ Explicitly cast to HTMLElement[]
|
1320
|
+
// // Apply color to each element without modifying structure
|
1321
|
+
// elements.forEach((el) => {
|
1322
|
+
// el.style.color = color;
|
1323
|
+
// });
|
1324
|
+
// // Apply color to the top-level text nodes (without wrapping them)
|
1325
|
+
// Array.from(selectedContent.childNodes).forEach((node) => {
|
1326
|
+
// if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== "") {
|
1327
|
+
// const parent = range.commonAncestorContainer.parentElement;
|
1328
|
+
// if (parent) {
|
1329
|
+
// parent.style.color = color;
|
1330
|
+
// }
|
1331
|
+
// }
|
1332
|
+
// });
|
1333
|
+
// // Replace selected content
|
1334
|
+
// range.deleteContents();
|
1335
|
+
// range.insertNode(selectedContent);
|
1336
|
+
// // Clear saved selection
|
1337
|
+
// this.savedSelection = null;
|
1338
|
+
// }
|
1339
|
+
// }
|
1340
|
+
// }
|
1224
1341
|
setTextColor(event) {
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1342
|
+
console.log("Clicked setTextColor");
|
1343
|
+
if (!this.savedSelection) {
|
1344
|
+
console.warn("No saved selection available!");
|
1345
|
+
return;
|
1346
|
+
}
|
1347
|
+
const color = event.target.value;
|
1348
|
+
this.selectedTextColor = color;
|
1349
|
+
const selection = window.getSelection();
|
1350
|
+
if (!selection || selection.rangeCount === 0) {
|
1351
|
+
console.error("No valid selection found!");
|
1352
|
+
return;
|
1353
|
+
}
|
1354
|
+
selection.removeAllRanges();
|
1355
|
+
selection.addRange(this.savedSelection);
|
1356
|
+
const range = this.savedSelection;
|
1357
|
+
const getTableCell = (node) => {
|
1358
|
+
let currentNode = node;
|
1359
|
+
if (currentNode && currentNode.nodeType === Node.TEXT_NODE) {
|
1360
|
+
currentNode = currentNode.parentNode;
|
1361
|
+
}
|
1362
|
+
while (currentNode && currentNode instanceof HTMLElement) {
|
1363
|
+
if (currentNode.tagName === "TD" || currentNode.tagName === "TH") {
|
1364
|
+
return currentNode;
|
1365
|
+
}
|
1366
|
+
currentNode = currentNode.parentElement;
|
1367
|
+
}
|
1368
|
+
return null;
|
1369
|
+
};
|
1370
|
+
const tableCell = getTableCell(range.commonAncestorContainer) ||
|
1371
|
+
getTableCell(range.startContainer) ||
|
1372
|
+
getTableCell(range.endContainer);
|
1373
|
+
if (tableCell) {
|
1374
|
+
console.log(`Processing ${tableCell.tagName} element`);
|
1375
|
+
const selectedText = selection.toString();
|
1376
|
+
if (selectedText) {
|
1377
|
+
console.log(`Selected text in ${tableCell.tagName}:`, selectedText);
|
1378
|
+
const textNodes = [];
|
1379
|
+
const walker = document.createTreeWalker(tableCell, NodeFilter.SHOW_TEXT, null);
|
1380
|
+
let node;
|
1381
|
+
while ((node = walker.nextNode())) {
|
1382
|
+
textNodes.push(node);
|
1383
|
+
}
|
1384
|
+
for (const textNode of textNodes) {
|
1385
|
+
const text = textNode.textContent || "";
|
1386
|
+
const index = text.indexOf(selectedText);
|
1387
|
+
if (index !== -1) {
|
1388
|
+
console.log(`Found selected text in ${tableCell.tagName} text node`);
|
1389
|
+
const span = document.createElement("span");
|
1390
|
+
span.style.color = color;
|
1391
|
+
span.textContent = selectedText;
|
1392
|
+
const beforeText = text.slice(0, index);
|
1393
|
+
const afterText = text.slice(index + selectedText.length);
|
1394
|
+
const fragment = document.createDocumentFragment();
|
1395
|
+
if (beforeText)
|
1396
|
+
fragment.appendChild(document.createTextNode(beforeText));
|
1397
|
+
fragment.appendChild(span);
|
1398
|
+
if (afterText)
|
1399
|
+
fragment.appendChild(document.createTextNode(afterText));
|
1400
|
+
textNode.replaceWith(fragment);
|
1401
|
+
break; // Apply only once per selection
|
1248
1402
|
}
|
1249
|
-
}
|
1250
|
-
// Replace selected content
|
1251
|
-
range.deleteContents();
|
1252
|
-
range.insertNode(selectedContent);
|
1253
|
-
// Clear saved selection
|
1254
|
-
this.savedSelection = null;
|
1403
|
+
}
|
1255
1404
|
}
|
1256
1405
|
}
|
1406
|
+
else {
|
1407
|
+
console.log("No TH or TD element found in selection");
|
1408
|
+
return;
|
1409
|
+
}
|
1410
|
+
this.savedSelection = null;
|
1257
1411
|
}
|
1258
1412
|
setBackgroundColor(event) {
|
1259
1413
|
if (this.savedSelection) {
|
@@ -1511,23 +1665,23 @@ export class ElTextEditorComponent {
|
|
1511
1665
|
const columnCount = rows[0]?.split('\t').length || 1; // Get the number of columns from the first row
|
1512
1666
|
const columnWidth = 100 / columnCount; // Calculate column width
|
1513
1667
|
const tableRows = rows.map((row, index) => {
|
1514
|
-
const cells = row.split('\t').map(cell => `
|
1515
|
-
<td class="px-1 py-1 text-truncate"
|
1516
|
-
style="max-width: ${columnWidth}%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
|
1517
|
-
${cell}
|
1668
|
+
const cells = row.split('\t').map(cell => `
|
1669
|
+
<td class="px-1 py-1 text-truncate"
|
1670
|
+
style="max-width: ${columnWidth}%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
|
1671
|
+
${cell}
|
1518
1672
|
</td>`).join('');
|
1519
1673
|
// Add a border-top for all rows except the first and border-bottom for the last row
|
1520
1674
|
const borderTop = index === 0 ? '' : `border-top: ${this.themeModeTableBorderTop()};`;
|
1521
1675
|
const borderBottom = index === rows.length - 1 ? `border-bottom: ${this.themeModeTableBorderTop()};` : '';
|
1522
|
-
return `
|
1523
|
-
<tr
|
1524
|
-
style="${borderTop} ${borderBottom} width: 100% !important;">
|
1525
|
-
${cells}
|
1676
|
+
return `
|
1677
|
+
<tr
|
1678
|
+
style="${borderTop} ${borderBottom} width: 100% !important;">
|
1679
|
+
${cells}
|
1526
1680
|
</tr>`;
|
1527
1681
|
}).join('');
|
1528
|
-
return `
|
1529
|
-
<table style="table-layout: fixed; width: 100%;">
|
1530
|
-
${tableRows}
|
1682
|
+
return `
|
1683
|
+
<table style="table-layout: fixed; width: 100%;">
|
1684
|
+
${tableRows}
|
1531
1685
|
</table>`;
|
1532
1686
|
}
|
1533
1687
|
insertHtmlAtCaret(html) {
|
@@ -1670,14 +1824,14 @@ ElTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
1670
1824
|
provide: NG_VALUE_ACCESSOR,
|
1671
1825
|
useExisting: forwardRef(() => ElTextEditorComponent),
|
1672
1826
|
multi: true
|
1673
|
-
}], viewQueries: [{ propertyName: "TextEditor", first: true, predicate: ["textEditor"], descendants: true }, { propertyName: "fullscreen", first: true, predicate: ["fullscreen"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"], directives: [{ type: i3.NgxFullscreenDirective, selector: "[ngxFullscreen]", inputs: ["ngxFullscreen"], outputs: ["transition", "errors"], exportAs: ["ngxFullscreen"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i5.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i5.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "titlecase": i4.TitleCasePipe } });
|
1827
|
+
}], viewQueries: [{ propertyName: "TextEditor", first: true, predicate: ["textEditor"], descendants: true }, { propertyName: "fullscreen", first: true, predicate: ["fullscreen"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"], directives: [{ type: i3.NgxFullscreenDirective, selector: "[ngxFullscreen]", inputs: ["ngxFullscreen"], outputs: ["transition", "errors"], exportAs: ["ngxFullscreen"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i5.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i5.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "titlecase": i4.TitleCasePipe } });
|
1674
1828
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ElTextEditorComponent, decorators: [{
|
1675
1829
|
type: Component,
|
1676
1830
|
args: [{ selector: 'text-editor', providers: [{
|
1677
1831
|
provide: NG_VALUE_ACCESSOR,
|
1678
1832
|
useExisting: forwardRef(() => ElTextEditorComponent),
|
1679
1833
|
multi: true
|
1680
|
-
}], template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"] }]
|
1834
|
+
}], template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"] }]
|
1681
1835
|
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i0.Renderer2 }, { type: i2.DomSanitizer }]; }, propDecorators: { editorText: [{
|
1682
1836
|
type: Input
|
1683
1837
|
}], editorFrom: [{
|
@@ -1727,4 +1881,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
1727
1881
|
type: ViewChild,
|
1728
1882
|
args: ['fullscreen']
|
1729
1883
|
}] } });
|
1730
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWwtdGV4dC1lZGl0b3Ivc3JjL2xpYi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lbC10ZXh0LWVkaXRvci9zcmMvbGliL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBcUMsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU10Rix5R0FBeUc7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBYyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7QUFhakQsTUFBTSxPQUFPLHFCQUFxQjtJQXFGaEMsWUFDVSxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsUUFBbUIsRUFDbkIsU0FBdUI7UUFIdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXZGeEIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQVN4QixnQkFBVyxHQUFnQyxPQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBWSxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDMUQsMEJBQXFCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUMsQ0FBQyxxQkFBcUI7UUFDakcscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNwQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2pDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6QyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBUzVCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUVoQixVQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxjQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxpQkFBWSxHQUFHLE9BQU8sQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixrQkFBYSxHQUE0QixJQUFJLENBQUM7UUFDOUMseUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQzVCLGlCQUFZLEdBQWdDLElBQUksQ0FBQztRQUVqRCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFckMsd0JBQW1CLEdBQVcsUUFBUSxDQUFBO1FBRXRDLGtCQUFhLEdBQTRCLElBQUksQ0FBQztRQUM5QyxpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUMxQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFDM0IseUJBQW9CLEdBQWlFLElBQUksQ0FBQztRQUUxRixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBQ3pCLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixpQkFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBR2xCLGFBQVEsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDekIsY0FBUyxHQUFRLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMxQixVQUFLLEdBQVEsTUFBTSxDQUFDO1FBR3BCLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFFeEMsZ0JBQVcsR0FBbUQsSUFBSSxDQUFDO1FBRW5FLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFDckIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUF1R2hDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFZaEIsdUJBQWtCLEdBQUcsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7Z0JBQy9CLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMvQjtRQUNILENBQUMsQ0FBQztRQTZtQ0YscUNBQXFDO1FBQ3JDLDJEQUEyRDtRQUMzRCx3QkFBd0I7UUFDeEIsNEJBQTRCO1FBQzVCLE1BQU07UUFDTixJQUFJO1FBRUosNkJBQTZCO1FBQzdCLHNEQUFzRDtRQUN0RCxrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLHdDQUF3QztRQUN4QyxzQ0FBc0M7UUFDdEMsdURBQXVEO1FBQ3ZELE1BQU07UUFDTixJQUFJO1FBRUosbUNBQW1DO1FBQ25DLHNEQUFzRDtRQUN0RCxrQkFBa0I7UUFDbEIsc0JBQXNCO1FBQ3RCLHdDQUF3QztRQUN4QyxvQ0FBb0M7UUFDcEMseURBQXlEO1FBQ3pELE1BQU07UUFDTixJQUFJO1FBRUksbUJBQWMsR0FBaUIsSUFBSSxDQUFDO1FBenZDMUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBR3JCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QzthQUFNO1lBQ0wsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyxpQkFBaUIsQ0FBQTtTQUN6QjthQUFNO1lBQ0wsT0FBTyxpQkFBaUIsQ0FBQTtTQUN6QjtJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QzthQUFNO1lBQ0wsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyxvQkFBb0IsQ0FBQTtTQUM1QjthQUFNO1lBQ0wsT0FBTyxvQkFBb0IsQ0FBQTtTQUM1QjtJQUNILENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTywyQkFBMkIsQ0FBQTtTQUNuQzthQUFNO1lBQ0wsT0FBTywyQkFBMkIsQ0FBQTtTQUNuQztJQUNILENBQUM7SUFDRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7U0FFckM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7U0FDbEQ7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDcEI7SUFDSCxDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDL0IsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLCtDQUErQztRQUMvQyw2Q0FBNkM7UUFDN0MsMEJBQTBCO1FBQzFCLGtFQUFrRTtRQUNsRSxvQkFBb0I7UUFDcEIsdURBQXVEO1FBQ3ZELFFBQVE7UUFDUixzREFBc0Q7UUFDdEQsTUFBTTtRQUNOLEtBQUs7SUFDUCxDQUFDO0lBRUEsV0FBVztRQUNWLDZEQUE2RDtRQUM3RCxRQUFRLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUlDLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFBO1NBQ3ZCO0lBQ0gsQ0FBQztJQVVILDJCQUEyQjtJQUMzQixrQ0FBa0M7SUFDbEMsOEJBQThCO0lBQzlCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsNERBQTREO0lBQzVELGFBQWE7SUFDYiw2QkFBNkI7SUFDN0IsTUFBTTtJQUVOLElBQUk7SUFFSixVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVILHdDQUF3QztJQUN4QyxzREFBc0Q7SUFDdEQsa0JBQWtCO0lBQ2xCLG9EQUFvRDtJQUNwRCxvREFBb0Q7SUFDcEQsd0NBQXdDO0lBQ3hDLDJEQUEyRDtJQUMzRCxzREFBc0Q7SUFFdEQsNERBQTREO0lBQzVELHlFQUF5RTtJQUN6RSx1REFBdUQ7SUFDdkQscURBQXFEO0lBQ3JELG1EQUFtRDtJQUNuRCxzREFBc0Q7SUFDdEQsd0ZBQXdGO0lBQ3hGLHVEQUF1RDtJQUN2RCxZQUFZO0lBQ1osZ0ZBQWdGO0lBQ2hGLGdDQUFnQztJQUNoQyxxQ0FBcUM7SUFDckMsWUFBWTtJQUVaLDJEQUEyRDtJQUMzRCwwQ0FBMEM7SUFDMUMsMkNBQTJDO0lBRTNDLDZEQUE2RDtJQUM3RCw4Q0FBOEM7SUFDOUMsb0NBQW9DO0lBQ3BDLHFDQUFxQztJQUNyQyw0REFBNEQ7SUFDNUQsd0NBQXdDO0lBQ3hDLGlEQUFpRDtJQUNqRCxrREFBa0Q7SUFDbEQsNENBQTRDO0lBQzVDLDBDQUEwQztJQUMxQywyQ0FBMkM7SUFFM0Msb0RBQW9EO0lBQ3BELGlDQUFpQztJQUNqQyw4QkFBOEI7SUFDOUIsY0FBYztJQUVkLHlDQUF5QztJQUN6QyxpQkFBaUI7SUFDakIscUNBQXFDO0lBQ3JDLHlDQUF5QztJQUN6QyxVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDSixJQUFJO0lBQ0osWUFBWTtRQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUMvQixDQUFDO0lBQ0QsZ0JBQWdCO0lBQ2hCLHFEQUFxRDtJQUNyRCwwQkFBMEI7SUFDMUIsK0NBQStDO0lBQy9DLHFDQUFxQztJQUNyQyxNQUFNO0lBQ04sSUFBSTtJQUVKLFNBQVM7UUFDUCxJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzlDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMzQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFHSCx1Q0FBdUM7SUFDdkMsc0RBQXNEO0lBQ3RELGtFQUFrRTtJQUNsRSw2Q0FBNkM7SUFDN0MsaURBQWlEO0lBQ2pELG1EQUFtRDtJQUVuRCxnQ0FBZ0M7SUFDaEMsb0JBQW9CO0lBQ3BCLG9EQUFvRDtJQUNwRCxvREFBb0Q7SUFDcEQsd0NBQXdDO0lBQ3hDLDJEQUEyRDtJQUMzRCxzREFBc0Q7SUFDdEQsNERBQTREO0lBQzVELHlFQUF5RTtJQUN6RSx1REFBdUQ7SUFDdkQscURBQXFEO0lBQ3JELG1EQUFtRDtJQUNuRCx3REFBd0Q7SUFDeEQsd0ZBQXdGO0lBQ3hGLHVEQUF1RDtJQUN2RCxZQUFZO0lBRVosZ0ZBQWdGO0lBQ2hGLGdDQUFnQztJQUNoQyxxQ0FBcUM7SUFDckMsWUFBWTtJQUVaLDJEQUEyRDtJQUMzRCw4Q0FBOEM7SUFDOUMsNkRBQTZEO0lBQzdELDhDQUE4QztJQUM5QyxvQ0FBb0M7SUFDcEMscUNBQXFDO0lBQ3JDLDREQUE0RDtJQUM1RCx3Q0FBd0M7SUFDeEMsa0RBQWtEO0lBQ2xELG1EQUFtRDtJQUNuRCwwQ0FBMEM7SUFDMUMsMkNBQTJDO0lBQzNDLDRDQUE0QztJQUU1QyxvREFBb0Q7SUFDcEQsaUNBQWlDO0lBQ2pDLDhCQUE4QjtJQUM5QixjQUFjO0lBRWQseUNBQXlDO0lBRXpDLGlCQUFpQjtJQUNqQixxQ0FBcUM7SUFDckMseUNBQXlDO0lBQ3pDLDJFQUEyRTtJQUMzRSxzREFBc0Q7SUFDdEQsVUFBVTtJQUNWLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNKLElBQUk7SUFDSSx3QkFBd0I7UUFDaEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyw2QkFBNkI7UUFDN0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLElBQUksU0FBUyxJQUFJLE9BQU8sRUFBRTtZQUN4QixJQUFJLE1BQU0sRUFBRTtnQkFDVixNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO29CQUMzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO3dCQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQTBCLENBQUM7d0JBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7d0JBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3pDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0NBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7Z0NBQzNCLE1BQU07NkJBQ1A7eUJBQ0Y7d0JBQ0MsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7d0JBQ2pELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsRUFBRTs0QkFDM0QsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7NEJBQ3hDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzs0QkFDdEMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDOzRCQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDM0UsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQzNDO3dCQUVELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDckUsSUFBSSxjQUFjLEVBQUU7NEJBQ2xCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt5QkFDekI7d0JBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7d0JBQ2xDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsOEJBQThCLENBQUM7d0JBQ2xELE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzt3QkFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO3dCQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7d0JBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLHVCQUF1QixDQUFDO3dCQUNqRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7d0JBQ3ZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQzt3QkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO3dCQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7d0JBRWpDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTs0QkFDckMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDOzRCQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ25CLENBQUMsQ0FBQyxDQUFDO3dCQUVILFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3FCQUMxQjtnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCwwREFBMEQ7Z0JBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO29CQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDOUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO3dCQUN2QyxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ2hELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLG9EQUFvRDs0QkFDckUsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMseUJBQXlCO3lCQUM5QztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxnQ0FBZ0M7Z0JBQ2hDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzthQUM5RDtTQUNGO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFHQyx1Q0FBdUM7SUFDdkMsb0RBQW9EO0lBQ3BELGdCQUFnQjtJQUNoQixrREFBa0Q7SUFDbEQsa0RBQWtEO0lBQ2xELHNDQUFzQztJQUN0Qyx5REFBeUQ7SUFDekQsb0RBQW9EO0lBRXBELCtDQUErQztJQUMvQywyREFBMkQ7SUFDM0Qsa0RBQWtEO0lBQ2xELGtEQUFrRDtJQUNsRCx3Q0FBd0M7SUFDeEMsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixVQUFVO0lBRVYsNkNBQTZDO0lBQzdDLCtCQUErQjtJQUMvQixVQUFVO0lBQ1YsZUFBZTtJQUNmLG1DQUFtQztJQUNuQyx1Q0FBdUM7SUFDdkMsUUFBUTtJQUNSLFFBQVE7SUFDUixJQUFJO0lBQ0osSUFBSTtJQUVJLDBCQUEwQjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztnQkFDM0MsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtvQkFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUEwQixDQUFDO29CQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO29CQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN0QyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFOzRCQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDOzRCQUMzQixNQUFNO3lCQUNQO3FCQUNGO2lCQUNGO3FCQUFNO29CQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2lCQUMzQjtnQkFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFxQixDQUFDO29CQUNqRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3JDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTs0QkFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs0QkFDM0IsTUFBTTt5QkFDUDtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztpQkFDM0I7Z0JBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtvQkFDbkYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQzFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTs0QkFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs0QkFDM0IsTUFBTTt5QkFDUDtxQkFDRjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDRCxDQUFDO0lBRUgsZUFBZSxDQUFDLE1BQWMsRUFBRSxLQUFhO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakQsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFHO2dCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7SUFDSCxDQUFDO0lBSVMsVUFBVTtRQUNoQiwwQ0FBMEM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyx5Q0FBeUM7SUFDM0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFBO1lBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBZTtRQUM5QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksT0FBTyxFQUFFO2dCQUNqQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7Z0JBQzdCLG1CQUFtQjtnQkFDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQzNCO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztnQkFDNUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsc0RBQXNEO0lBQ3RELHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsaUNBQWlDO0lBQ2pDLHFHQUFxRztJQUNyRyw0REFBNEQ7SUFDNUQsaURBQWlEO0lBQ2pELHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0Isa0RBQWtEO0lBQ2xELFlBQVk7SUFDWixZQUFZO0lBQ1osUUFBUTtJQUNSLGFBQWE7SUFDYixpQ0FBaUM7SUFDakMsTUFBTTtJQUNOLElBQUk7SUFFTiwyQkFBMkI7SUFDM0IsZ0JBQWdCO0lBQ2hCLHNEQUFzRDtJQUN0RCxvQkFBb0I7SUFDcEIsd0RBQXdEO0lBRXhELHFDQUFxQztJQUVyQywrREFBK0Q7SUFDL0QsNENBQTRDO0lBRTVDLGlFQUFpRTtJQUNqRSxxQ0FBcUM7SUFFckMsK0NBQStDO0lBQy9DLGlEQUFpRDtJQUNqRCxzREFBc0Q7SUFDdEQsZ0RBQWdEO0lBQ2hELFlBQVk7SUFDWixZQUFZO0lBQ1osUUFBUTtJQUNSLGFBQWE7SUFDYixpQ0FBaUM7SUFDakMsTUFBTTtJQUNOLElBQUk7SUFFSiwyQ0FBMkM7SUFDM0Msb0RBQW9EO0lBQ3BELGtCQUFrQjtJQUNsQiwrQ0FBK0M7SUFDL0MsbUdBQW1HO0lBQ25HLDBEQUEwRDtJQUMxRCxNQUFNO0lBQ04sSUFBSTtJQUVKLHVEQUF1RDtJQUN2RCxrREFBa0Q7SUFDbEQsK0NBQStDO0lBQy9DLDRDQUE0QztJQUM1QyxRQUFRO0lBRVIsdUZBQXVGO0lBQ3ZGLElBQUk7SUFFSixtRUFBbUU7SUFDM0Qsa0JBQWtCLENBQUMsTUFBbUI7UUFDNUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN2QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBR3RDLGdHQUFnRztZQUNoRywwREFBMEQ7WUFDMUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7U0FDdEU7SUFDRCxDQUFDO0lBRUQsbURBQW1EO0lBQzdDLGFBQWEsQ0FBQyxPQUFlO1FBQ25DLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV4QyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtZQUN6Qyx5Q0FBeUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV0QyxzRUFBc0U7WUFDdEUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUU1QixnRUFBZ0U7WUFDaEUsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFO2dCQUN6QixRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMxQztZQUVELDRDQUE0QztZQUM1QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEM7WUFDcEUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUzQiw0Q0FBNEM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUVyQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvQixLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0I7WUFDRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDNUI7WUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUE7U0FDOUI7SUFDSCxDQUFDO0lBR0QsbURBQW1EO0lBQ25ELGtEQUFrRDtJQUNsRCwrQ0FBK0M7SUFDL0MsNENBQTRDO0lBRTVDLDhCQUE4QjtJQUM5QiwwQ0FBMEM7SUFDMUMsc0RBQXNEO0lBQ3RELHNDQUFzQztJQUN0QyxvQ0FBb0M7SUFFcEMsUUFBUTtJQUNSLE1BQU07SUFLSixTQUFTLENBQUMsSUFBUztRQUNuQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTVCLHNEQUFzRDtnQkFDdEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVuQyx3REFBd0Q7Z0JBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLHVDQUF1QztnQkFDdkMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7b0JBQ3BDLElBQUksTUFBTSxFQUFFLEVBQUcsNEJBQTRCO3dCQUN6QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ2pDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBR08sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksTUFBTSxFQUFFO1lBQ1Ysd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUEwQixDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLE1BQW1CO1FBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQ3pDLGtEQUFrRDtZQUNsRCwrQkFBK0I7WUFDL0Isd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFtQjtRQUN4QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXJDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNwQixLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtZQUM3QyxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFDN0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsZ0JBQWdCO0lBQ2hCLHNEQUFzRDtJQUN0RCxvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLGlDQUFpQztJQUVqQyxpREFBaUQ7SUFDakQscUdBQXFHO0lBQ3JHLDREQUE0RDtJQUU1RCxxREFBcUQ7SUFDckQsOENBQThDO0lBQzlDLGlEQUFpRDtJQUVqRCxnQ0FBZ0M7SUFDaEMsOERBQThEO0lBQzlELDRDQUE0QztJQUM1Qyx3REFBd0Q7SUFDeEQsd0NBQXdDO0lBQ3hDLHNDQUFzQztJQUN0QyxVQUFVO0lBRVYsaURBQWlEO0lBQ2pELHdCQUF3QjtJQUN4QixrREFBa0Q7SUFFbEQsOEVBQThFO0lBQzlFLGtEQUFrRDtJQUNsRCxxREFBcUQ7SUFFckQsb0NBQW9DO0lBQ3BDLGdEQUFnRDtJQUNoRCw0REFBNEQ7SUFDNUQsNENBQTRDO0lBQzVDLDBDQUEwQztJQUMxQyxjQUFjO0lBQ2QsWUFBWTtJQUNaLFlBQVk7SUFDWixRQUFRO0lBQ1IsYUFBYTtJQUNiLGlDQUFpQztJQUNqQyxNQUFNO0lBQ04sSUFBSTtJQUVGLE1BQU0sQ0FBQyxPQUFlLEVBQUUsS0FBVztRQUNqQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxPQUFPLEtBQUssV0FBVyxFQUFFO2dCQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ2pELFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzthQUM5QztpQkFBTSxJQUFJLE9BQU8sS0FBSyxhQUFhLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDckQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUFBLENBQUM7YUFDakQ7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7b0JBQ3BELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3hEO2FBQ0Y7U0FDRjtRQUNBLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QseURBQXlEO1NBQzFEO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVk7UUFDNUIsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLElBQUk7Z0JBQ1AsT0FBTyxXQUFXLENBQUM7Z0JBQ25CLE1BQU07WUFDUixLQUFLLEdBQUc7Z0JBQ04sT0FBTyxRQUFRLENBQUM7Z0JBQ2hCLE1BQU07WUFDUjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztnQkFDaEIsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLElBQUksR0FBRzs7Ozs7Ozs7Ozs7Ozs7S0FjWixDQUFDO1FBQ0YsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCwrQkFBK0I7SUFDL0Isa0RBQWtEO0lBQ2xELG9EQUFvRDtJQUNwRCxrQkFBa0I7SUFDbEIsOERBQThEO0lBQzlELHNEQUFzRDtJQUN0RCwyQ0FBMkM7SUFDM0MsbURBQW1EO0lBQ25ELHlFQUF5RTtJQUN6RSxVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBQ0osY0FBYyxDQUFDLEtBQVU7UUFDdkIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTNDLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQ25ELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxFQUFFO1lBQ1AsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQXFCLENBQUM7WUFDM0UsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3BCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsdUNBQXVDO0lBQ3ZDLG9DQUFvQztJQUNwQyxpQ0FBaUM7SUFDakMsbUNBQW1DO0lBQ25DLDZCQUE2QjtJQUM3QixvRUFBb0U7SUFDcEUsb0VBQW9FO0lBQ3BFLDhDQUE4QztJQUM5Qyw4REFBOEQ7SUFDOUQsV0FBVztJQUNYLFNBQVM7SUFDVCxrQ0FBa0M7SUFDbEMsTUFBTTtJQUNOLElBQUk7SUFFSixpQkFBaUIsQ0FBQyxLQUFVO1FBQzVCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFFbkYsSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFO1lBQ3pCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyx5QkFBeUI7WUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUVoQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBRTFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO29CQUNoQixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO29CQUUzQixzRUFBc0U7b0JBQ3RFLE1BQU0sT0FBTyxHQUNYLFFBQVEsR0FBRyxXQUFXO3dCQUNwQixDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyx3QkFBd0IsR0FBRyxxQkFBcUI7d0JBQ3RFLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixRQUFRLHFCQUFxQixDQUFDO29CQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO29CQUN6QixtQ0FBbUM7b0JBQ25DLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBRUYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFJQyxlQUFlO0lBQ2YscURBQXFEO0lBQ3JELHlDQUF5QztJQUN6QyxxRkFBcUY7SUFFckYsaUVBQWlFO0lBQ2pFLG9EQUFvRDtJQUNwRCx3QkFBd0I7SUFDeEIsdUNBQXVDO0lBQ3ZDLDhJQUE4STtJQUM5SSxRQUFRO0lBQ1Isd0JBQXdCO0lBQ3hCLE1BQU07SUFDTixpQ0FBaUM7SUFDakMsMkRBQTJEO0lBQzNELHdEQUF3RDtJQUN4RCxrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLHdEQUF3RDtJQUN4RCxNQUFNO0lBQ04sNEJBQTRCO0lBQzVCLGdDQUFnQztJQUNoQyxJQUFJO0lBR0osWUFBWSxDQUFDLEtBQVU7UUFDckIsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRTtZQUN2QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxnQ0FBZ0M7WUFDeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFFckQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsMENBQTBDO1lBQzFGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyx3Q0FBd0M7WUFFeEYsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsMkJBQTJCO1lBQ25ELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7WUFDMUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztZQUNwRSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDUixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7UUFDaEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyx3Q0FBd0M7UUFFaEYsSUFBSSxLQUFLLEdBQUcsOEJBQThCLFVBQVUsT0FBTyxDQUFDO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxpQkFBaUI7WUFDN0MsS0FBSyxJQUFJLDZCQUE2QixJQUFJLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsK0JBQStCO1lBQ2xILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLEtBQUssSUFBSSw0RkFBNEYsWUFBWSxrQkFBa0IsQ0FBQzthQUNySTtZQUNELEtBQUssSUFBSSxPQUFPLENBQUM7U0FDbEI7UUFDRCxLQUFLLElBQUksZUFBZSxDQUFDO1FBRXpCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBS0MsbUJBQW1CLENBQUMsS0FBa0I7UUFDcEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQXFCLENBQUM7UUFDMUMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQXFCLENBQUM7U0FDbEU7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO1FBRUQsMkJBQTJCO0lBQzdCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxrREFBa0Q7UUFDbEQsZ0JBQWdCO1FBQ2hCLHdGQUF3RjtRQUN4RixxQ0FBcUM7UUFDckMscUlBQXFJO1FBQ3JJLGFBQWE7UUFDYiw4REFBOEQ7UUFDOUQseUJBQXlCO1FBQ3pCLHlDQUF5QztRQUN6QyxRQUFRO1FBQ1IsTUFBTTtRQUNOLElBQUk7SUFDTixDQUFDO0lBRUQsT0FBTztRQUNMLGtEQUFrRDtRQUNsRCw2Q0FBNkM7UUFDN0MsMkJBQTJCO1FBQzNCLHVDQUF1QztRQUN2QyxJQUFJO0lBQ04sQ0FBQztJQUVELGtDQUFrQztJQUNsQywyQkFBMkI7SUFDM0IsSUFBSTtJQUVKLE1BQU07UUFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsYUFBYTtJQUNiLDhCQUE4QjtJQUM5QixnREFBZ0Q7SUFDaEQsMEVBQTBFO0lBQzFFLHNDQUFzQztJQUN0QyxtQ0FBbUM7SUFDbkMsK0NBQStDO0lBQy9DLFFBQVE7SUFDUixNQUFNO0lBQ04sSUFBSTtJQUVKLE1BQU07UUFDTixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUV6Qyw2RUFBNkU7WUFDN0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO2dCQUUxQixpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLGFBQWEsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDthQUN4STtTQUNGO0lBQ0gsQ0FBQztJQUVELGVBQWU7SUFDZiw4QkFBOEI7SUFDOUIsZ0RBQWdEO0lBQ2hELHdHQUF3RztJQUN4RywwRUFBMEU7SUFDMUUsc0NBQXNDO0lBQ3RDLG1DQUFtQztJQUNuQyxRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFHRixnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxNQUFNO0lBQ04sSUFBSTtJQUVOLGtCQUFrQjtJQUNsQiw4QkFBOEI7SUFDOUIsMERBQTBEO0lBQzFELGlDQUFpQztJQUNqQywrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLHdFQUF3RTtJQUN4RSxxQkFBcUI7SUFDckIscUNBQXFDO0lBQ3JDLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLDhDQUE4QztJQUM5QyxNQUFNO0lBQ04sSUFBSTtJQUVGLFNBQVM7UUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsSUFBSSxTQUFTLEVBQUU7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVU7Z0JBQUUsT0FBTztZQUVsQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDMUMsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEQsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFHQyxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGlFQUFpRTtJQUNqRSw4REFBOEQ7SUFDOUQsbUNBQW1DO0lBQ25DLCtDQUErQztJQUMvQyxRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFTixrQkFBa0I7SUFDbEIsOEJBQThCO0lBQzlCLDJGQUEyRjtJQUMzRix5REFBeUQ7SUFDekQsaURBQWlEO0lBRWpELGlFQUFpRTtJQUNqRSw4REFBOEQ7SUFDOUQsbUNBQW1DO0lBQ25DLCtDQUErQztJQUMvQywrQ0FBK0M7SUFDL0MsNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywwQ0FBMEM7SUFDMUMsUUFBUTtJQUVSLHlDQUF5QztJQUN6QyxpRUFBaUU7SUFDakUsNEVBQTRFO0lBQzVFLGdGQUFnRjtJQUNoRixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDSixJQUFJO0lBRUosU0FBUztRQUNULElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtZQUNwRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDO1lBRTFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxRQUFRLElBQUksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsYUFBYSxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRSxDQUFBO2FBQ3RGO1lBRUQsc0NBQXNDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7YUFDekY7U0FDRjtJQUNELENBQUM7SUFNRCxZQUFZO1FBQ1osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFDdkIsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFNBQVMsRUFBRTtvQkFDYixJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUF5QixDQUFDO29CQUMxRixJQUFJLElBQUksRUFBRTt3QkFDUixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQ2xEO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFQyxnQ0FBZ0M7UUFDOUIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QzthQUFNO1lBQ0wsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFFRCxxQ0FBcUM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTyxTQUFTLENBQUE7U0FDakI7YUFBTTtZQUNMLE9BQU8sU0FBUyxDQUFBO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQzdFO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2lCQUM5RTthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQW9CO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsSUFBSSxHQUFHLEVBQUU7WUFDVCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuQjtJQUNILENBQUM7SUErQkgsZUFBZSxDQUFDLE9BQWU7UUFDN0IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQXFCLENBQUM7UUFDMUUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsNkJBQTZCO1lBQzdCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtnQkFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVELDZCQUE2QjtJQUM3QiwrQkFBK0I7SUFDL0Isd0NBQXdDO0lBQ3hDLHNDQUFzQztJQUV0QyxxQ0FBcUM7SUFDckMsK0NBQStDO0lBQy9DLHVCQUF1QjtJQUN2QixxQ0FBcUM7SUFDckMsaURBQWlEO0lBRWpELHdDQUF3QztJQUN4QywyQ0FBMkM7SUFDM0MscURBQXFEO0lBQ3JELGtDQUFrQztJQUNsQyw2Q0FBNkM7SUFFN0MsMERBQTBEO0lBQzFELGdDQUFnQztJQUNoQyxnQ0FBZ0M7SUFFaEMscUNBQXFDO0lBQ3JDLG9DQUFvQztJQUNwQyxRQUFRO0lBQ1IsTUFBTTtJQUNKLElBQUk7SUFDSixZQUFZLENBQUMsS0FBVTtRQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUUvQiw4QkFBOEI7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUNsQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFCLHdCQUF3QjtnQkFDeEIsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBa0IsQ0FBQyxDQUFDLHFDQUFxQztnQkFFMUgsMERBQTBEO2dCQUMxRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7b0JBQ3RCLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsa0VBQWtFO2dCQUNsRSxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7d0JBQ3ZFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUM7d0JBQzNELElBQUksTUFBTSxFQUFFOzRCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt5QkFDNUI7cUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsMkJBQTJCO2dCQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRWxDLHdCQUF3QjtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDNUI7U0FDRjtJQUNILENBQUM7SUFFQyxrQkFBa0IsQ0FBQyxLQUFVO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUU3Qiw4QkFBOEI7WUFDOUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksU0FBUyxFQUFFO2dCQUNiLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRXhDLDBDQUEwQztnQkFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFcEMsaURBQWlEO2dCQUNqRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXZCLDRCQUE0QjtnQkFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDNUI7U0FDRjtJQUNELENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsbUNBQW1DO0lBQ25DLElBQUk7SUFFRyxRQUFRLENBQUMsS0FBVSxFQUFFLE9BQVk7UUFDdEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtRQUM5QixRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsNkRBQTZEO0lBQy9ELENBQUM7SUFHRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUE7UUFDUixRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQzVCLEtBQUssaUJBQWlCO2dCQUNwQixJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDcEcsTUFBTSxjQUFjLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzVELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN0RCx5QkFBeUI7Z0JBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDckIsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUNyQixJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzVMLHdCQUF3QjtnQkFDeEIsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRWxELGNBQWMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQzlELGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDUjtnQkFDRSxJQUFJLENBQUE7Z0JBQ0osa0RBQWtEO2dCQUNsRCxtREFBbUQ7Z0JBQ25ELCtDQUErQztnQkFDL0MsMkNBQTJDO2dCQUMzQyxNQUFNO1NBQ1Q7UUFDRCwrQ0FBK0M7UUFDL0Msb0ZBQW9GO1FBQ3BGLG1DQUFtQztRQUNuQyxtRkFBbUY7UUFDbkYsMERBQTBEO1FBQzFELEtBQUs7SUFFUCxDQUFDO0lBRUQsVUFBVSxDQUFFLElBQVM7UUFDbkIsaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixpRUFBaUU7UUFDakUscUdBQXFHO1FBQ3JHLE1BQU07UUFDTixnREFBZ0Q7UUFDaEQsOENBQThDO1FBQzlDLGlFQUFpRTtRQUNqRSxvQkFBb0I7UUFDcEIsMkRBQTJEO1FBQzNELHlEQUF5RDtRQUN6RCxRQUFRO1FBQ1IsTUFBTTtJQUNSLENBQUM7SUFFRCxlQUFlLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsNkRBQTZEO2dCQUU3RCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUV0QztTQUNGO0lBQ0QsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUMsSUFBSSxFQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUE7SUFDL0YsQ0FBQztJQUVELDJDQUEyQztJQUMzQyx5Q0FBeUM7SUFDekMsK0NBQStDO0lBQy9DLG1EQUFtRDtJQUNuRCwrQ0FBK0M7SUFDL0MsZ0NBQWdDO0lBQ2hDLHNEQUFzRDtJQUN0RCwrREFBK0Q7SUFDL0QsaUZBQWlGO0lBQ2pGLG1DQUFtQztJQUNuQyxpQkFBaUI7SUFDakIsb0NBQW9DO0lBQ3BDLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFTCxZQUFZLENBQUMsS0FBa0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO29CQUNwQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDM0MsTUFBTSxPQUFPLEdBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7b0JBQ3BELE1BQU0sT0FBTyxHQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO29CQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNoRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDekI7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7aUJBQzFCO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDMUI7U0FDRjtJQUNILENBQUM7SUFHRCxtQ0FBbUM7SUFDbkMsOEJBQThCO0lBQzlCLGlEQUFpRDtJQUNqRCwyQkFBMkI7SUFDM0IsZ0VBQWdFO0lBQ2hFLDRDQUE0QztJQUM1Qyw0REFBNEQ7SUFDNUQsd0NBQXdDO0lBQ3hDLGlCQUFpQjtJQUNqQiw4Q0FBOEM7SUFDOUMsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBRUosbUNBQW1DO0lBQ25DLDRCQUE0QjtJQUM1QiwrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5Q0FBeUM7SUFDekMsK0NBQStDO0lBQy9DLGtEQUFrRDtJQUNsRCw2Q0FBNkM7SUFDN0Msc0JBQXNCO0lBQ3RCLDZDQUE2QztJQUM3QywwQ0FBMEM7SUFDMUMsNkdBQTZHO0lBQzdHLCtDQUErQztJQUMvQyxlQUFlO0lBQ2Ysd0NBQXdDO0lBQ3hDLG1EQUFtRDtJQUNuRCxZQUFZO0lBQ1osVUFBVTtJQUNWLFFBQVE7SUFFUixtQ0FBbUM7SUFDbkMsOERBQThEO0lBQzlELDBDQUEwQztJQUMxQywwREFBMEQ7SUFDMUQsc0NBQXNDO0lBQ3RDLGVBQWU7SUFDZiw0Q0FBNEM7SUFDNUMsUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBRUosT0FBTyxDQUFDLEtBQXFCO1FBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQzFDLElBQUksYUFBYSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDbEMscUJBQXFCO29CQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzlCLElBQUksSUFBSSxFQUFFO3dCQUNSLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTs0QkFDekIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sa0RBQWtELENBQUM7NEJBQy9GLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbEMsQ0FBQyxDQUFDO3dCQUNGLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzNCLE9BQU87cUJBQ1I7aUJBQ0Y7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtvQkFDcEMsb0JBQW9CO29CQUNwQix1REFBdUQ7b0JBQ3ZELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7d0JBQ3hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztxQkFDNUQ7b0JBQ0Qsb0NBQW9DO29CQUNwQyxPQUFPO2lCQUNSO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7b0JBQ3JDLDBCQUEwQjtvQkFDMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRTt3QkFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzt3QkFDMUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUM5Qjt5QkFBTTt3QkFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUM3RDtvQkFDRCx5REFBeUQ7b0JBQ3pELHFDQUFxQztvQkFDckMsT0FBTztpQkFDUjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLG1EQUFtRCxDQUFDO1lBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsdUJBQXVCLENBQUMsSUFBWTtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtJQUNyRSxDQUFDO0lBS0QsV0FBVyxDQUFDLElBQVk7UUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLG9FQUFvRTtJQUNwRSx3Q0FBd0M7SUFDeEMsaUdBQWlHO0lBQ2pHLHlJQUF5STtJQUN6SSxpQkFBaUI7SUFDakIsMENBQTBDO0lBQzFDLElBQUk7SUFFSixrQkFBa0IsQ0FBQyxJQUFZO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLCtDQUErQztRQUNyRyxNQUFNLFdBQVcsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMseUJBQXlCO1FBRWhFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Z0NBRWhCLFdBQVc7WUFDL0IsSUFBSTtjQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbkIsb0ZBQW9GO1lBQ3BGLE1BQU0sU0FBUyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDO1lBQ3RGLE1BQU0sWUFBWSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUUxRyxPQUFPOzttQkFFTSxTQUFTLElBQUksWUFBWTtZQUNoQyxLQUFLO2NBQ0gsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVaLE9BQU87O1VBRUQsU0FBUztlQUNKLENBQUM7SUFDZCxDQUFDO0lBSUQsaUJBQWlCLENBQUMsSUFBWTtRQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsSUFBSSxJQUFJLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QjtZQUNELEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUMvRCxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDckIsT0FBTywrQkFBK0IsQ0FBQTtTQUN2QzthQUFNO1lBQ0wsT0FBTyw4QkFBOEIsQ0FBQTtTQUN0QztJQUNILENBQUM7SUFHTSxjQUFjO1FBQ25CLElBQUksSUFBSSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7YUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNwQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUM3QjthQUFNLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2hDO2FBQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsWUFBWSxFQUFFLE1BQU07WUFDcEIsWUFBWSxFQUFFLE1BQU07U0FDckIsQ0FBQTtJQUNILENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRTtZQUMzQixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRztnQkFDWCxZQUFZLEVBQUUsT0FBTztnQkFDckIsWUFBWSxFQUFFLE9BQU87YUFDdEIsQ0FBQTtTQUNGO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzdCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEQsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2FBQ3JCO1lBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3pEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBWSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVksQ0FBQzthQUN0QztTQUNGO0lBQ0gsQ0FBQztJQUVILGdEQUFnRDtJQUNoRCwrREFBK0Q7SUFDL0QsZ0RBQWdEO0lBRWhELG9EQUFvRDtJQUNwRCxrREFBa0Q7SUFDbEQsNkRBQTZEO0lBQzdELHlDQUF5QztJQUV6Qyx1RUFBdUU7SUFDdkUsbURBQW1EO0lBQ25ELHlCQUF5QjtJQUN6Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0lBQ3hCLFVBQVU7SUFDVixRQUFRO0lBQ04sSUFBSTtJQUVKLG1CQUFtQixDQUFDLElBQVk7UUFDaEMsMERBQTBEO1FBQzFELE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDO1FBRTNDLCtDQUErQztRQUMvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDekMsc0RBQXNEO1lBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWxDLCtCQUErQjtZQUMvQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtZQUN0RixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1lBQ2hHLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtZQUVwRCxtQ0FBbUM7WUFDbkMsT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztrSEE3MkRZLHFCQUFxQjtzR0FBckIscUJBQXFCLG1yQkFObkIsQ0FBQztZQUNaLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztZQUNwRCxLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsb1BDbkJKLDZ3bENBcWVNOzJGRGhkTyxxQkFBcUI7a0JBVmpDLFNBQVM7K0JBQ0UsYUFBYSxhQUdWLENBQUM7NEJBQ1osT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUM7NktBSU8sVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVFLEtBQUs7c0JBQWIsS0FBSztnQkFHbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG4vLyBpbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOZ3hGdWxsc2NyZWVuRGlyZWN0aXZlIH0gZnJvbSAnQHVsdGltYXRlL25neC1mdWxsc2NyZWVuJztcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XG4vLyBpbXBvcnQgeyBJbWFnZUVkaXRvck1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kYWxzL2ltYWdlLWVkaXRvci1tb2RhbC9pbWFnZS1lZGl0b3ItbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IGNvbXByZXNzLCBkZWNvbXByZXNzIH0gZnJvbSAnbHotc3RyaW5nJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZXh0LWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVsVGV4dEVkaXRvckNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbiAgfV1cbn0pXG5leHBvcnQgY2xhc3MgRWxUZXh0RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZWRpdG9yVGV4dDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGVkaXRvckZyb206IGFueTtcbiAgQElucHV0KCkgZWRpdG9yQWN0aW9uOiBhbnk7XG4gIEBJbnB1dCgpIFVzZXJSb2xlOiBhbnk7XG4gIEBJbnB1dCgpIHN0eWxlOiBhbnk7XG4gIEBJbnB1dCgpIGRpc2FibGVUb29sYmFyOiBhbnk7XG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyOiBhbnk7XG4gIEBJbnB1dCgpIHJlcG9ydElkOiBhbnk7XG4gIEBJbnB1dCgpIGJhY2tncm91bmRJbWFnZTogYW55O1xuICBASW5wdXQoKSB0b29sYmFyTW9kZTogJ2ZpeGVkJyB8ICdidWJibGUnIHwgJ25vbmUnID0gJ2ZpeGVkJztcbiAgQElucHV0KCkgY29udGVudEVkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTsgLy8gSW5wdXQgZm9yIGluaXRpYWwgdmFsdWVcbiAgQE91dHB1dCgpIGNvbnRlbnRFZGl0YWJsZUNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpOyAvLyBPdXRwdXQgZm9yIGNoYW5nZXNcbiAgQE91dHB1dCgpIGVkaXRvclRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGVkaXRvckFjdGlvblJlc3BvbnNlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBlZGl0b3JUZXh0Q2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGltYWdlRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgaW1hZ2VFZGl0MiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcGxhY2VIb2xkZXJSZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGlzT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbmV3SW1hZ2VBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gIFxuICBAVmlld0NoaWxkKCd0ZXh0RWRpdG9yJykgVGV4dEVkaXRvciE6ICBFbGVtZW50UmVmPEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdmdWxsc2NyZWVuJykgZnVsbHNjcmVlbiE6IE5neEZ1bGxzY3JlZW5EaXJlY3RpdmVcbiAgICBcbiAgc2FuaXRpemVkQ29udGVudCE6IFNhZmVIdG1sO1xuXG5cbiAgc2hvd1Rvb2xiYXIgPSBmYWxzZTtcbiAgdG9vbGJhclRvcCA9IDA7XG4gIHRvb2xiYXJMZWZ0ID0gMDtcblxuICBmb250cyA9IFsnQXJpYWwnLCAnQ291cmllciBOZXcnLCAnR2VvcmdpYScsICdUaW1lcyBOZXcgUm9tYW4nLCAnVmVyZGFuYSddO1xuICBmb250U2l6ZXMgPSBbMTAsIDEyLCAxNCwgMTYsIDE4LCAyMCwgMjQsIDI4LCAzMiwgMzZdO1xuICBzZWxlY3RlZEZvbnQgPSAnQXJpYWwnO1xuICBzZWxlY3RlZEZvbnRTaXplID0gMTQ7XG4gIGlzVGFibGVTZWxlY3RlZCA9IGZhbHNlO1xuICB0YWJsZUFkZGVkID0gZmFsc2U7XG4gIHNlbGVjdGVkVGFibGU6IEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgaXNQbGFjZWhvbGRlclZpc2libGUgPSB0cnVlO1xuICBzZWxlY3RlZENlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIFxuICBpc0JvbGRBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNJdGFsaWNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNVbmRlcmxpbmVBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTdHJpa2V0aHJvdWdoQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3Vic2NyaXB0QWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU3VwZXJzY3JpcHRBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzZWxlY3RlZEZvcm1hdEJsb2NrOiBzdHJpbmcgPSAnbm9ybWFsJ1xuXG4gIHNlbGVjdGVkSW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgaW1hZ2VFZGl0VXJsOiBzdHJpbmcgPSAnJztcbiAgaW1hZ2VQb3NpdGlvblggPSAwO1xuICBpbWFnZVBvc2l0aW9uWSA9IDA7XG4gIGltYWdlUmVzaXplU3RhcnRYID0gMDtcbiAgaW1hZ2VSZXNpemVTdGFydFkgPSAwO1xuICBpbWFnZVJlc2l6ZVN0YXJ0V2lkdGggPSAwO1xuICBpbWFnZVJlc2l6ZVN0YXJ0SGVpZ2h0ID0gMDtcbiAgaW1hZ2VSZXNpemVEaXJlY3Rpb246ICd0b3BMZWZ0JyB8ICd0b3BSaWdodCcgfCAnYm90dG9tTGVmdCcgfCAnYm90dG9tUmlnaHQnIHwgbnVsbCA9IG51bGw7XG5cbiAgdW5kb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xuICByZWRvU3RhY2s6IHN0cmluZ1tdID0gW107XG4gIGhpc3Rvcnk6IHN0cmluZ1tdID0gW107XG4gIGhpc3RvcnlJbmRleCA9IC0xO1xuICAvLyBlZGl0b3JUZXh0MSA9IGBgO1xuICBzZWxlY3RlZFRleHRDb2xvcjogYW55O1xuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG4gIGNvbG9yOiBhbnkgPSAnI2RkZCc7XG4gIGNvbG9yRm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcbiAgYmFja2dyb3VuZENvbG9yOiBhbnk7XG4gIHNlbGVjdGVkSXRlbUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBwYXJzZWRUYWJsZTogeyBoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogc3RyaW5nW11bXSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRDYXJldFBvc2l0aW9uOiBhbnk7XG4gIHVzZXJSb2xlOiBhbnlbXSA9IFtdO1xuICBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICkge1xuICAgIHRoaXMuZ2V0VXNlclJvbGVzKClcblxuICAgIFxuICB9XG5cbiAgdGhlbWVNb2RlKCkge1xuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xuICAgICAgcmV0dXJuICcycHggc29saWQgIzQwM0Y0QSAhaW1wb3J0YW50J1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjRDBEMEQwICFpbXBvcnRhbnQnXG4gICAgfVxuICB9XG5cbiAgdGhlbWVNb2RlQ2xyKCkge1xuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xuICAgICAgcmV0dXJuICcjZmZmICFpbXBvcnRhbnQnXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnIzAwMCAhaW1wb3J0YW50J1xuICAgIH1cbiAgfVxuXG4gIHRoZW1lTW9kZUNsclZlcnRpY2FsTGluZSgpIHtcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICNGRkZGRkYgIWltcG9ydGFudCdcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcycHggc29saWQgI0QwRDBEMCAhaW1wb3J0YW50J1xuICAgIH1cbiAgfVxuXG4gIHRoZW1lTW9kZUJnQ2xyKCkge1xuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xuICAgICAgcmV0dXJuICcjMjgyODI4ICFpbXBvcnRhbnQnXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnI0YzRjNGMyAhaW1wb3J0YW50J1xuICAgIH1cbiAgfVxuXG4gIHRoZW1lTW9kZUJvcmRlclRvcCgpIHtcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICMwMDAgIWltcG9ydGFudCdcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcycHggc29saWQgI2ZmZiAhaW1wb3J0YW50J1xuICAgIH1cbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3BsYWNlSG9sZGVyJ10pIHtcbiAgICAgIHRoaXMuaW5zZXJ0QXRDYXJldCh0aGlzLnBsYWNlSG9sZGVyKVxuXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3JlcG9ydElkJ10pIHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3JlcG9ydElkJywgdGhpcy5yZXBvcnRJZClcbiAgICB9IFxuXG4gICAgaWYgKGNoYW5nZXNbJ1VzZXJSb2xlJ10pIHsgXG4gICAgICB0aGlzLmdldFVzZXJSb2xlcygpXG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmluaXRFZGl0b3IoKTtcbiAgICB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcbiAgICB0aGlzLnNldHVwSGlzdG9yeSgpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRfRnVuYyh0aGlzLmVkaXRvclRleHQpXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uY2hhbmdlJywgKCkgPT4ge1xuICAgICAgdGhpcy5jaGVja0FjdGl2ZVN0YXRlcygpO1xuICAgICAgdGhpcy5jaGVja0Zvcm1hdEJsb2NrKCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKTtcbiAgICB0aGlzLmFkZENsaWNrTGlzdGVuZXJUb0VsZW1lbnRzKCk7XG4gICAgLy8gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAvLyAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHBhcmFtc1snZGF0YSddKTtcbiAgICAvLyAgIGlmIChkYXRhLmVkaXRlZElNRykge1xuICAgIC8vICAgICBjb25zdCBpbWdVcmwgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcpO1xuICAgIC8vICAgICBpZiAoaW1nVXJsKSB7XG4gICAgLy8gICAgICAgdGhpcy5yZXBsYWNlSW1hZ2VTcmMoaW1nVXJsLCBkYXRhLmluZGV4LmluZGV4KVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJyk7XG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgfVxuXG4gICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKTtcbiAgfVxuXG4gIElzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgdG9nZ2xlRnVsbHNjcmVlbjEoKSB7XG4gICAgICB0aGlzLklzT3BlbiA9ICF0aGlzLklzT3BlbjtcbiAgICAgIHRoaXMuaXNPcGVuLmVtaXQodGhpcy5Jc09wZW4pXG4gICAgICBpZiAodGhpcy5Jc09wZW4pIHsgXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlbi5lbnRlcih0aGlzLlRleHRFZGl0b3IubmF0aXZlRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZ1bGxzY3JlZW4uZXhpdCgpXG4gICAgICB9XG4gICAgfVxuICBcbiAgcHJpdmF0ZSBvbkZ1bGxzY3JlZW5DaGFuZ2UgPSAoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCkge1xuICAgICAgLy8gV2hlbiBmdWxsc2NyZWVuIG1vZGUgaXMgZXhpdGVkXG4gICAgICB0aGlzLklzT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5pc09wZW4uZW1pdCh0aGlzLklzT3Blbik7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gZW50ZXJGdWxsc2NyZWVuVmlkZW8oKSB7XG4gIC8vICAgY29uc29sZS5sb2coJ2V2ZW50OicsIGV2ZW50KTtcbiAgLy8gICBjb25zdCBmdWxsc2NyZWVuID0gZXZlbnQ7XG4gIC8vICAgdGhpcy5pc09wZW4gPSBldmVudDtcbiAgLy8gICBpZiAoZnVsbHNjcmVlbikge1xuICAvLyAgICAgdGhpcy5mdWxsc2NyZWVuLmVudGVyKHRoaXMuVGV4dEVkaXRvci5uYXRpdmVFbGVtZW50KTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5mdWxsc2NyZWVuLmV4aXQoKVxuICAvLyAgIH1cbiAgICBcbiAgLy8gfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvclRleHQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuaW5pdEVkaXRvcigpO1xuICAgICAgdGhpcy5pbml0X0Z1bmModGhpcy5lZGl0b3JUZXh0KTtcbiAgICB9XG4gIH1cbiAgXG4vLyAgcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbi8vICAgaWYgKGVkaXRvcikge1xuLy8gICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuLy8gICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xuXG4vLyAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50RWxlbWVudDtcbi8vICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcbi8vICAgICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbi8vICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2ltYWdlLWNvbnRhaW5lcic7XG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbi8vICAgICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuLy8gICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLnNlbGVjdGVkSW1hZ2UpO1xuLy8gICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGNvbnN0IGV4aXN0aW5nQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xuLy8gICAgICAgICBpZiAoZXhpc3RpbmdCdXR0b24pIHtcbi8vICAgICAgICAgICBleGlzdGluZ0J1dHRvbi5yZW1vdmUoKTtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuLy8gICAgICAgICAvLyBidXR0b24udGV4dENvbnRlbnQgPSAnRWRpdCc7XG4vLyAgICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSAnRWRpdCBJbWFnZSc7XG5cbi8vICAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9ICdpbWFnZS1lZGl0LWJ1dHRvbiBidG4gYnRuLXNtJztcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRvcCA9ICc1MCUnO1xuLy8gICAgICAgICBidXR0b24uc3R5bGUubGVmdCA9ICc1MCUnO1xuLy8gICAgICAgICBidXR0b24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSc7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS56SW5kZXggPSAnMTAwMCc7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkICNmZmYnO1xuLy8gICAgICAgICAvLyBidXR0b24uc3R5bGUucGFkZGluZyA9ICcxMHB4Jztcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gJyMzMTNhNDYnO1xuLy8gICAgICAgICBidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuXG4vLyAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4vLyAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbi8vICAgICAgICAgICB0aGlzLmVkaXRJbWFnZSgpO1xuLy8gICAgICAgICB9KTtcblxuLy8gICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbi8vICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBudWxsO1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG4gIC8vIH1cbiAgZ2V0VXNlclJvbGVzKCkge1xuICAgIHRoaXMudXNlclJvbGUgPSB0aGlzLlVzZXJSb2xlXG4gIH1cbiAgLy8gcm9sZUNoZWNrKCkge1xuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy51c2VyUm9sZS5sZW5ndGg7ICsraSkge1xuICAvLyAgICAgY29uc3Qgcm9sZU5hbWUgPSBbXVxuICAvLyAgICAgICByb2xlTmFtZS5wdXNoKHRoaXMudXNlclJvbGVbaV0/Lm5hbWUpO1xuICAvLyAgICAgcmV0dXJuIHRoaXMudXNlclJvbGVbaV0/Lm5hbWU7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcm9sZUNoZWNrKCkge1xuICAgIGxldCB1c2VyUm9sZU5hbWU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGhpcy51c2VyUm9sZS5sZW5ndGg7ICsraSkge1xuICAgICAgdXNlclJvbGVOYW1lLnB1c2godGhpcy51c2VyUm9sZVtpXT8ubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUm9sZU5hbWU7XG4gIH1cblxuXG4vLyBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0ltYWdlcygpIHtcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuLy8gICBjb25zdCByb2xlcyA9IHRoaXMucm9sZUNoZWNrKCk7IC8vIEdldCB1c2VyIHJvbGVzIGR5bmFtaWNhbGx5XG4vLyAgIGNvbnN0IGlzQWRtaW4gPSByb2xlcy5pbmNsdWRlcygnQWRtaW4nKTtcbi8vICAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcbi8vICAgY29uc3QgaXNBcHByb3ZlciA9IHJvbGVzLmluY2x1ZGVzKCdBcHByb3ZlcicpO1xuICBcbi8vICAgaWYgKGlzQ3JlYXRvciB8fCBpc0FkbWluKSB7XG4vLyAgICAgaWYgKGVkaXRvcikge1xuLy8gICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuLy8gICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xuLy8gICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudEVsZW1lbnQ7XG4vLyAgICAgICAgIGlmICghY29udGFpbmVyIHx8IGNvbnRhaW5lci5jbGFzc05hbWUgIT09ICdpbWFnZS1jb250YWluZXInKSB7XG4vLyAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4vLyAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdpbWFnZS1jb250YWluZXInO1xuLy8gICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIFxuLy8gICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLnNlbGVjdGVkSW1hZ2UpO1xuLy8gICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgY29uc3QgZXhpc3RpbmdCdXR0b24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLmltYWdlLWVkaXQtYnV0dG9uJyk7XG4vLyAgICAgICAgIGlmIChleGlzdGluZ0J1dHRvbikge1xuLy8gICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4vLyAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCAgPSAnRWRpdCBJbWFnZSc7XG4vLyAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS50b3AgPSAnNTAlJztcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknO1xuLy8gICAgICAgICBidXR0b24uc3R5bGUuekluZGV4ID0gJzEwMDAnO1xuLy8gICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnOyBcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlciA9ICcycHggc29saWQgI2ZmZic7IFxuLy8gICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSAnIzMxM2E0Nic7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuXG4vLyAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4vLyAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbi8vICAgICAgICAgICB0aGlzLmVkaXRJbWFnZSgpO1xuLy8gICAgICAgICB9KTtcblxuLy8gICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuLy8gICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XG4vLyAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcbi8vICAgICAgICAgYnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiBidXR0b24ucmVtb3ZlKCkpO1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG4vLyAgIH1cbiAgLy8gfVxuICBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0ltYWdlcygpIHtcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICBjb25zdCByb2xlcyA9IHRoaXMucm9sZUNoZWNrKCk7IC8vIEdldCB1c2VyIHJvbGVzIGR5bmFtaWNhbGx5XG4gIGNvbnN0IGlzQWRtaW4gPSByb2xlcy5pbmNsdWRlcygnQWRtaW4nKTtcbiAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcblxuICBpZiAoaXNDcmVhdG9yIHx8IGlzQWRtaW4pIHtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xuICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG4gICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGltYWdlc1tpXSA9PT0gdGhpcy5zZWxlY3RlZEltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50RWxlbWVudDtcbiAgICAgICAgICBpZiAoIWNvbnRhaW5lciB8fCBjb250YWluZXIuY2xhc3NOYW1lICE9PSAnaW1hZ2UtY29udGFpbmVyJykge1xuICAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2ltYWdlLWNvbnRhaW5lcic7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLnNlbGVjdGVkSW1hZ2UpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0ZWRJbWFnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdCdXR0b24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLmltYWdlLWVkaXQtYnV0dG9uJyk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nQnV0dG9uKSB7XG4gICAgICAgICAgICBleGlzdGluZ0J1dHRvbi5yZW1vdmUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICBidXR0b24udGV4dENvbnRlbnQgPSAnRWRpdCBJbWFnZSc7XG4gICAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9ICdpbWFnZS1lZGl0LWJ1dHRvbiBidG4gYnRuLXNtJztcbiAgICAgICAgICBidXR0b24uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgIGJ1dHRvbi5zdHlsZS50b3AgPSAnNTAlJztcbiAgICAgICAgICBidXR0b24uc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgICAgICAgIGJ1dHRvbi5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKC01MCUsIC01MCUpJztcbiAgICAgICAgICBidXR0b24uc3R5bGUuekluZGV4ID0gJzEwMDAnO1xuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XG4gICAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlciA9ICcycHggc29saWQgI2ZmZic7XG4gICAgICAgICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gJyMzMTNhNDYnO1xuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG5cbiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdEltYWdlKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUVkaXRCdXR0b25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBNb25pdG9yIGVkaXRvciBjb250ZW50IGNoYW5nZXMgdG8gaGFuZGxlIGltYWdlIGRlbGV0aW9uXG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IGVkaXRvci5xdWVyeVNlbGVjdG9yQWxsKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcbiAgICAgICAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBidXR0b24ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICBpZiAoY29udGFpbmVyICYmICFjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5yZW1vdmUoKTsgLy8gUmVtb3ZlIHRoZSBidXR0b24gaWYgdGhlIGFzc29jaWF0ZWQgaW1hZ2UgaXMgZ29uZVxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOyAvLyBDbGVhbiB1cCB0aGUgY29udGFpbmVyXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBPYnNlcnZlIGNoYW5nZXMgaW4gdGhlIGVkaXRvclxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG5wcml2YXRlIHJlbW92ZUVkaXRCdXR0b25zKCkge1xuICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmltYWdlLWVkaXQtYnV0dG9uJyk7XG4gIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiBidXR0b24ucmVtb3ZlKCkpO1xuICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xuICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcbn1cblxuXG4gIC8vIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xuICAvLyBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIC8vIGlmIChlZGl0b3IpIHtcbiAgLy8gICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgLy8gICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgLy8gICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lNRycpIHtcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gIC8vICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcblxuICAvLyAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpbWFnZVxuICAvLyAgICAgICBjb25zdCBpbWFnZXMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xuICAvLyAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XG4gIC8vICAgICAgICAgICBicmVhaztcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgICBpZiAodGhpcy50b29sYmFyTW9kZSA9PT0gJ2J1YmJsZScpIHtcbiAgLy8gICAgICAgICB0aGlzLm9uVGV4dFNlbGVjdCgpO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gfVxuICAvLyB9XG4gIFxuICBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0VsZW1lbnRzKCkge1xuICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIGlmIChlZGl0b3IpIHtcbiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lNRycpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaW1hZ2VzW2ldID09PSB0aGlzLnNlbGVjdGVkSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnVEQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEgnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhcmdldC5jbG9zZXN0KCd0YWJsZScpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5zZWxlY3RlZFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhcmdldC50YWdOYW1lKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChjZWxsc1tpXSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnUCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTUEFOJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ0RJVicpIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBocyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YXJnZXQudGFnTmFtZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChwYXJhZ3JhcGhzW2ldID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgfVxuXG5yZXBsYWNlSW1hZ2VTcmMobmV3U3JjOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICBcbiAgaWYgKGVkaXRvcikge1xuICAgIGVkaXRvci5mb2N1cygpXG4gICAgY29uc3QgaW1hZ2VzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdJTUcnKTtcbiAgICBpZiAoaW5kZXggPj0gMCApIHtcbiAgICAgIGltYWdlc1tpbmRleF0uc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpO1xuICAgIH0gXG4gIH1cbn1cblxuXG5cbiAgcHJpdmF0ZSBpbml0RWRpdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgZWRpdG9yIGNvbnRlbnQgYW5kIGxpc3RlbmVyc1xuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcblxuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLmVkaXRvclRleHQ7XG4gICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZShlZGl0b3IuaW5uZXJIVE1MKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSB0aGUgZGlzYWJsZWQgc3RhdGUgaWYgbmVjZXNzYXJ5XG4gIH1cblxuICBvbk1vZGVsQ2hhbmdlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IFZBTFVFID0gdmFsdWVcbiAgICAgIHRoaXMuZWRpdG9yVGV4dCA9IFZBTFVFO1xuICAgICAgdGhpcy5vbkNoYW5nZShWQUxVRSk7XG4gICAgICB0aGlzLmVkaXRvclRleHRDaGFuZ2UuZW1pdChWQUxVRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlJbWFnZVN0eWxlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIGNvbnN0IGltYWdlcyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgICBpbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgaWYgKGltZy5zdHlsZS5tYXhXaWR0aCA+PSAnNzAwcHgnKSB7XG4gICAgICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICc3MDBweCc7XG4gICAgICAgIC8vIGltZy53aWR0aCA9IDMwMDtcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIC8vIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcbiAgLy8gICBpZiAoaHRtbCkge1xuICAvLyAgICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgLy8gICAgIGlmIChlZGl0b3IpIHsgXG4gIC8vICAgICAgIGVkaXRvci5mb2N1cygpXG4gIC8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSBodG1sO1xuICAvLyAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xuICAvLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5zYW5pdGl6ZWRDb250ZW50IGFzIHN0cmluZztcbiAgLy8gICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAvLyAgICAgICAgIGlmIChlZGl0b3IpIHtcbiAgLy8gICAgICAgICAgIGVkaXRvci5mb2N1cygpXG4gIC8vICAgICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9KTtcbiAgLy8gICAgIH1cbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcbiAgLy8gICB9XG4gIC8vIH1cbiAgXG4vLyAgIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcbi8vICAgaWYgKGh0bWwpIHtcbi8vICAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuLy8gICAgIGlmIChlZGl0b3IpIHtcbi8vICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XG4gICAgICBcbi8vICAgICAgIHRoaXMuc2V0RWRpdG9yQ29udGVudChodG1sKTtcblxuLy8gICAgICAgLy8gU2V0IHVwIGEgTXV0YXRpb25PYnNlcnZlciB0byBoYW5kbGUgY29udGVudCBjaGFuZ2VzXG4vLyAgICAgICB0aGlzLnNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3IpO1xuXG4vLyAgICAgICAvLyBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kIGFmdGVyIGluaXRpYWwgY29udGVudCBzZXR1cFxuLy8gICAgICAgdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xuXG4vLyAgICAgICAvLyBUcmFjayBjYXJldCBwb3NpdGlvbiBvbiBtb3VzZSBjbGlja1xuLy8gICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuLy8gICAgICAgICBpZiAoZWRpdG9yKSB7ICAvLyBFbnN1cmUgZWRpdG9yIGlzIG5vdCBudWxsXG4vLyAgICAgICAgICAgLy8gdGhpcy50cmFja0NhcmV0UG9zaXRpb24oZWRpdG9yKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgfSk7XG4vLyAgICAgfVxuLy8gICB9IGVsc2Uge1xuLy8gICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XG4vLyAgIH1cbi8vIH1cblxuLy8gcHJpdmF0ZSBzZXRFZGl0b3JDb250ZW50KGh0bWw6IHN0cmluZykge1xuLy8gICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuLy8gICBpZiAoZWRpdG9yKSB7XG4vLyAgICAgLy8gU2FuaXRpemUgYW5kIGFwcGx5IHN0eWxlcyB0byB0aGUgSFRNTFxuLy8gICAgIHRoaXMuc2FuaXRpemVkQ29udGVudCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuYXBwbHlJbWFnZVN0eWxlcyhodG1sKSk7XG4vLyAgICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XG4vLyAgIH1cbi8vIH1cblxuLy8gcHJpdmF0ZSBzZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xuLy8gICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbi8vICAgICAvLyBVcGRhdGUgbW9kZWwgd2l0aCB0aGUgY3VycmVudCBjb250ZW50XG4vLyAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xuLy8gICB9KTtcblxuLy8gICBvYnNlcnZlci5vYnNlcnZlKGVkaXRvciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4vLyB9XG5cbi8vIFRoaXMgZnVuY3Rpb24gdHJhY2tzIHRoZSBjYXJldCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbW91c2UgY2xpY2tcbnByaXZhdGUgdHJhY2tDYXJldFBvc2l0aW9uKGVkaXRvcjogSFRNTEVsZW1lbnQpIHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgY29uc3Qgc3RhcnROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcblxuXG4gICAgLy8gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBpbnNlcnQgY29udGVudCBvciBwZXJmb3JtIGFjdGlvbnMgYmFzZWQgb24gdGhlIGNhcmV0IHBvc2l0aW9uXG4gICAgLy8gRXhhbXBsZTogU2F2ZSB0aGUgY3VycmVudCBjYXJldCBwb3NpdGlvbiBmb3IgZnV0dXJlIHVzZVxuICAgIHRoaXMuY3VycmVudENhcmV0UG9zaXRpb24gPSB7IG5vZGU6IHN0YXJ0Tm9kZSwgb2Zmc2V0OiBzdGFydE9mZnNldCB9O1xuICB9XG4gIH1cbiAgXG4gIC8vIE1ldGhvZCB0byBnZXQgY2FyZXQgcG9zaXRpb24gYW5kIGluc2VydCBuZXcgZGF0YVxucHJpdmF0ZSBpbnNlcnRBdENhcmV0KG5ld0RhdGE6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIFxuICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgIC8vIEdldCB0aGUgY3VycmVudCByYW5nZSAoY2FyZXQgcG9zaXRpb24pXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgIC8vIENyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50IHRvIGluc2VydCAoYWxsb3dzIGhhbmRsaW5nIEhUTUwgc3RyaW5ncylcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGVtcERpdi5pbm5lckhUTUwgPSBuZXdEYXRhO1xuXG4gICAgLy8gQXBwZW5kIHRoZSBuZXcgZGF0YSB0byB0aGUgZnJhZ21lbnQgKHN1cHBvcnRzIEhUTUwgaW5zZXJ0aW9uKVxuICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHRlbXBEaXYuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHRoZSBmcmFnbWVudCBhdCB0aGUgY2FyZXQgcG9zaXRpb25cbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIGNvbnRlbnQgaWYgYXBwbGljYWJsZVxuICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpO1xuXG4gICAgLy8gTW92ZSB0aGUgY2FyZXQgYWZ0ZXIgdGhlIGluc2VydGVkIGNvbnRlbnRcbiAgICBjb25zdCBsYXN0Q2hpbGQgPSBmcmFnbWVudC5sYXN0Q2hpbGQ7XG5cbiAgICBpZiAobGFzdENoaWxkKSB7XG4gICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGxhc3RDaGlsZCk7XG4gICAgICByYW5nZS5zZXRFbmRBZnRlcihsYXN0Q2hpbGQpO1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLm1vdmVDYXJldFRvRW5kKGVkaXRvcilcbiAgICB9XG4gICAgXG4gICAgdGhpcy5wbGFjZUhvbGRlclJlbW92ZS5lbWl0KClcbiAgfVxufVxuXG5cbi8vICAgLy8gTW92ZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBlZGl0b3IgY29udGVudFxuLy8gICBwcml2YXRlIG1vdmVDYXJldFRvRW5kKGVkaXRvcjogSFRNTEVsZW1lbnQpIHtcbi8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4vLyAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIFxuLy8gICAgIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XG4vLyAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcbi8vICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gQ29sbGFwc2UgdG8gdGhlIGVuZFxuLy8gICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcbi8vICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgXG4vLyAgICAgfVxuLy8gICB9XG4gIFxuICBcblxuXG4gIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcbiAgaWYgKGh0bWwpIHtcbiAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XG4gICAgICB0aGlzLnNldEVkaXRvckNvbnRlbnQoaHRtbCk7XG5cbiAgICAgIC8vIFNldCB1cCBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gaGFuZGxlIGNvbnRlbnQgY2hhbmdlc1xuICAgICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yKTtcbiAgICAgIFxuICAgICAgLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBhZnRlciBpbml0aWFsIGNvbnRlbnQgc2V0dXBcbiAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKTtcbiAgICAgIC8vICBUcmFjayBjYXJldCBwb3NpdGlvbiBvbiBtb3VzZSBjbGlja1xuICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBpZiAoZWRpdG9yKSB7ICAvLyBFbnN1cmUgZWRpdG9yIGlzIG5vdCBudWxsXG4gICAgICAgICAgdGhpcy50cmFja0NhcmV0UG9zaXRpb24oZWRpdG9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XG4gIH1cbn1cblxuXG5wcml2YXRlIHNldEVkaXRvckNvbnRlbnQoaHRtbDogc3RyaW5nKSB7XG4gIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIGlmIChlZGl0b3IpIHtcbiAgICAvLyBTYW5pdGl6ZSBhbmQgYXBwbHkgc3R5bGVzIHRvIHRoZSBIVE1MXG4gICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcbiAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5zYW5pdGl6ZWRDb250ZW50IGFzIHN0cmluZztcbiAgfVxufVxuXG5wcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIC8vIE1vdmUgdGhlIGNhcmV0IHRvIHRoZSBlbmQgYWZ0ZXIgY29udGVudCBjaGFuZ2VzXG4gICAgLy8gdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xuICAgIC8vIFVwZGF0ZSBtb2RlbCB3aXRoIHRoZSBjdXJyZW50IGNvbnRlbnRcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XG4gIH0pO1xuXG4gIG9ic2VydmVyLm9ic2VydmUoZWRpdG9yLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbn1cblxucHJpdmF0ZSBtb3ZlQ2FyZXRUb0VuZChlZGl0b3I6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICBcbiAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcbiAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBlbmRcbiAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59XG5cbi8vICAgaW5pdF9GdW5jKGh0bWw6IGFueSkge1xuLy8gICBpZiAoaHRtbCkge1xuLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4vLyAgICAgaWYgKGVkaXRvcikge1xuLy8gICAgICAgZWRpdG9yLmZvY3VzKCk7XG4vLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gaHRtbDtcblxuLy8gICAgICAgLy8gU2FuaXRpemUgdGhlIGNvbnRlbnQgYW5kIGFwcGx5IHN0eWxlc1xuLy8gICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcbi8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLnNhbml0aXplZENvbnRlbnQgYXMgc3RyaW5nO1xuXG4vLyAgICAgICAvLyBQbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudFxuLy8gICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuLy8gICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgXG4vLyAgICAgICBpZiAoZWRpdG9yLmxhc3RDaGlsZCkge1xuLy8gICAgICAgICAvLyBTZXQgdGhlIHJhbmdlIGF0IHRoZSBlbmQgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnRcbi8vICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcik7XG4vLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gY29sbGFwc2UgdG8gdGhlIGVuZFxuLy8gICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xuLy8gICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuLy8gICAgICAgICBpZiAoZWRpdG9yKSB7XG4vLyAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xuXG4vLyAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBjYXJldCByZW1haW5zIGF0IHRoZSBlbmQgYWZ0ZXIgbmV3IGNvbnRlbnQgaXMgYWRkZWRcbi8vICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4vLyAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIFxuLy8gICAgICAgICAgIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XG4vLyAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcbi8vICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gY29sbGFwc2UgdG8gdGhlIGVuZFxuLy8gICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcbi8vICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgfSk7XG4vLyAgICAgfVxuLy8gICB9IGVsc2Uge1xuLy8gICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XG4vLyAgIH1cbi8vIH1cblxuICBmb3JtYXQoY29tbWFuZDogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICAgIGlmIChjb21tYW5kID09PSAnc3Vic2NyaXB0Jykge1xuICAgICAgICB0aGlzLmlzU3Vic2NyaXB0QWN0aXZlID0gIXRoaXMuaXNTdWJzY3JpcHRBY3RpdmU7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdzdWJzY3JpcHQnLCBmYWxzZSwgJycpO1xuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09PSAnc3VwZXJzY3JpcHQnKSB7XG4gICAgICAgIHRoaXMuaXNTdXBlcnNjcmlwdEFjdGl2ZSA9ICF0aGlzLmlzU3VwZXJzY3JpcHRBY3RpdmU7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdzdXBlcnNjcmlwdCcsIGZhbHNlLCAnJyk7O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHZhbHVlID8/ICcnKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgdGFnID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bPD5dL2csICcnKVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXRCbG9jayA9IHRoaXMuZm9ybWF0QmxvY2tEZWNvZGUodGFnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAgdGhpcy5jaGVja0FjdGl2ZVN0YXRlcygpO1xuICAgICB0aGlzLmNoZWNrRm9ybWF0QmxvY2soKTtcbiAgfVxuXG4gIGNoZWNrQWN0aXZlU3RhdGVzKCkge1xuICAgIHRoaXMuaXNCb2xkQWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKTtcbiAgICB0aGlzLmlzSXRhbGljQWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xuICAgIHRoaXMuaXNVbmRlcmxpbmVBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJyk7XG4gICAgdGhpcy5pc1N0cmlrZXRocm91Z2hBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtldGhyb3VnaCcpO1xuICAgIHRoaXMuaXNTdWJzY3JpcHRBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3Vic2NyaXB0Jyk7XG4gICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0Jyk7XG4gIH1cblxuICBjaGVja0Zvcm1hdEJsb2NrKCkge1xuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBjb25zdCBmb3JtYXRCbG9jayA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpO1xuICAgICAgdGhpcy5zZWxlY3RlZEZvcm1hdEJsb2NrID0gdGhpcy5mb3JtYXRCbG9ja0RlY29kZShmb3JtYXRCbG9jayk7XG4gICAgICAvLyBZb3UgY2FuIGZ1cnRoZXIgaGFuZGxlIHRoZSBmb3JtYXRCbG9jayB2YWx1ZSBhcyBuZWVkZWRcbiAgICB9XG4gIH1cblxuICBmb3JtYXRCbG9ja0RlY29kZShkYXRhOiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAoZGF0YSkge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaDInOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaDMnOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaDQnOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaDUnOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncCc6XG4gICAgICAgIHJldHVybiAnbm9ybWFsJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ25vcm1hbCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZUZvbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gZXZlbnQ7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvbnROYW1lJywgZmFsc2UsIHRoaXMuc2VsZWN0ZWRGb250KTtcbiAgfVxuXG4gIGluc2VydENvZGVCbG9jaygpIHtcbiAgICBjb25zdCBjb2RlID0gYFxuICAgICAgPHByZSBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xuICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1wiPlxuICAgICAgICA8Y29kZSBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XCIgY2xhc3M9XCJsYW5ndWFnZS1odG1sXCI+SW5zZXJ0IGNvZGUgaGVyZS4uLjwvY29kZT5cbiAgICAgIDwvcHJlPlxuICAgIGA7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgY29kZSk7XG4gIH1cblxuICAvLyBjaGFuZ2VGb250U2l6ZShldmVudDogYW55KSB7XG4gIC8vICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvbnRTaXplJywgZmFsc2UsICc3Jyk7XG4gIC8vICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgLy8gICBpZiAoZWRpdG9yKSB7XG4gIC8vICAgICBsZXQgZm9udEVsZW1lbnRzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb250Jyk7XG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvbnRFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgICBpZiAoZm9udEVsZW1lbnRzW2ldLnNpemUgPT0gXCI3XCIpIHtcbiAgLy8gICAgICAgICBmb250RWxlbWVudHNbaV0ucmVtb3ZlQXR0cmlidXRlKFwic2l6ZVwiKTtcbiAgLy8gICAgICAgICBmb250RWxlbWVudHNbaV0uc3R5bGUuZm9udFNpemUgPSB0aGlzLnNlbGVjdGVkRm9udFNpemUgKyAncHgnO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG4gIGNoYW5nZUZvbnRTaXplKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgXG4gICAgaWYgKHNlbGVjdGVkVGV4dCAmJiBzZWxlY3RlZFRleHQucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3RlZFRleHQuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IHRoaXMuc2VsZWN0ZWRGb250U2l6ZSArICdweCc7XG4gICAgICAgIHJhbmdlLnN1cnJvdW5kQ29udGVudHMoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgYWRkTGluaygpIHtcbiAgICBsZXQgdXJsID0gcHJvbXB0KFwiRW50ZXIgdGhlIGxpbmsgaGVyZTogXCIsIFwiaHR0cDovL1wiKTtcbiAgICBpZiAodXJsKSB7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNyZWF0ZUxpbmtcIiwgZmFsc2UsIHVybCk7XG4gICAgfVxuICB9XG5cbiAgaW5zZXJ0c0ltYWdlKCkge1xuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICAgIGxldCBpbWFnZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlSW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGltYWdlSW5wdXQpIHtcbiAgICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGhhbmRsZUltYWdlVXBsb2FkKGV2ZW50OiBhbnkpIHtcbiAgLy8gICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAvLyAgIGlmIChmaWxlKSB7XG4gIC8vICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAvLyAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gIC8vICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XG4gIC8vICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gIC8vICAgICAgICAgLy8gQ3JlYXRlIHRoZSBIVE1MIHN0cmluZyB3aXRoIHRoZSBleGFjdCB3aWR0aCBhbmQgaGVpZ2h0XG4gIC8vICAgICAgICAgY29uc3QgaW1nSFRNTCA9IGA8aW1nIHNyYz1cIiR7aW1nLnNyY31cIiB3aWR0aD1cIiR7Nzk0fVwiID5gO1xuICAvLyAgICAgICAgIC8vIEluc2VydCB0aGUgaW1hZ2UgaW50byB0aGUgZWRpdG9yXG4gIC8vICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgaW1nSFRNTCk7XG4gIC8vICAgICAgIH07XG4gIC8vICAgICB9O1xuICAvLyAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgaGFuZGxlSW1hZ2VVcGxvYWQoZXZlbnQ6IGFueSkge1xuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICBjb25zdCBlZGl0b3JFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpOyAvLyBSZWZlcmVuY2UgdG8gdGhlIGVkaXRvclxuXG4gIGlmIChmaWxlICYmIGVkaXRvckVsZW1lbnQpIHtcbiAgICBjb25zdCBlZGl0b3JXaWR0aCA9IGVkaXRvckVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIEdldCB0aGUgZWRpdG9yJ3Mgd2lkdGhcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgaW1nLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaW1nV2lkdGggPSBpbWcud2lkdGg7XG5cbiAgICAgICAgLy8gSWYgdGhlIGltYWdlIHdpZHRoIGV4Y2VlZHMgdGhlIGVkaXRvcidzIHdpZHRoLCBmaXQgaXQgdG8gdGhlIGVkaXRvclxuICAgICAgICBjb25zdCBpbWdIVE1MID1cbiAgICAgICAgICBpbWdXaWR0aCA+IGVkaXRvcldpZHRoXG4gICAgICAgICAgICA/IGA8aW1nIHNyYz1cIiR7aW1nLnNyY31cIiBzdHlsZT1cIiBtYXgtd2lkdGg6ICR7NzAwfXB4OyBoZWlnaHQ6IGF1dG87XCI+YFxuICAgICAgICAgICAgOiBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgc3R5bGU9XCJ3aWR0aDogJHtpbWdXaWR0aH1weDsgaGVpZ2h0OiBhdXRvO1wiPmA7XG4gICAgICAgIHRoaXMubmV3SW1hZ2VBZGRlZC5lbWl0KClcbiAgICAgICAgLy8gSW5zZXJ0IHRoZSBpbWFnZSBpbnRvIHRoZSBlZGl0b3JcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgaW1nSFRNTCk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxufVxuXG5cblxuICAvLyBhZGRUYWJsZSgpIHtcbiAgLy8gICBjb25zdCB0YWJsZVdpZHRoID0gODI1OyAvLyBUYWJsZSB3aWR0aCBpbiBwaXhlbHNcbiAgLy8gICBjb25zdCBjb2xzID0gMzsgLy8gTnVtYmVyIG9mIGNvbHVtbnNcbiAgLy8gICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sczsgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggZm9yIGVhY2ggY2VsbFxuXG4gIC8vICAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7XCI+YDtcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykgeyAvLyBOdW1iZXIgb2Ygcm93c1xuICAvLyAgICAgdGFibGUgKz0gJzx0ciA+JztcbiAgLy8gICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XG4gIC8vICAgICAgIHRhYmxlICs9IGA8dGQgc3R5bGU9XCIgd29yZC13cmFwOiBicmVhay13b3JkOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHdoaXRlLXNwYWNlOiBub3JtYWw7IG1pbi13aWR0aDogJHtjZWxsTWluV2lkdGh9cHg7XCI+Jm5ic3A7PC90ZD5gO1xuICAvLyAgICAgfVxuICAvLyAgICAgdGFibGUgKz0gJzwvdHI+JztcbiAgLy8gICB9XG4gIC8vICAgICB0YWJsZSArPSAnPC90YWJsZT48YnIvID4nO1xuICAvLyAgICAgLy8gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xuICAvLyAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICAvLyAgIGlmIChlZGl0b3IpIHtcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xuICAvLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLnRhYmxlQWRkZWQgPSB0cnVlO1xuICAvLyAgIHRoaXMuY2hlY2tUYWJsZVNlbGVjdGlvbigpO1xuICAvLyB9XG5cblxuICBoYW5kbGVUYWJLZXkoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIFN0b3AgZGVmYXVsdCB0YWJiaW5nIGJlaGF2aW9yXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgY29uc3QgdGFiTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpOyAvLyBDcmVhdGUgYSBzcGFuIGVsZW1lbnQgZm9yIHRoZSB0YWIgc3BhY2VcbiAgICAgIHRhYk5vZGUuaW5uZXJIVE1MID0gXCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIjsgLy8gRm91ciBub24tYnJlYWtpbmcgc3BhY2VzIHRvIG1pbWljIHRhYlxuICAgICAgXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIHRleHRcbiAgICAgIHJhbmdlLmluc2VydE5vZGUodGFiTm9kZSk7IC8vIEluc2VydCB0aGUgdGFiIHNwYWNlIGFzIHNwYW5cbiAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGFiTm9kZSk7IC8vIE1vdmUgY3Vyc29yIGFmdGVyIHRoZSBpbnNlcnRlZCBzcGFuXG4gICAgICByYW5nZS5zZXRFbmRBZnRlcih0YWJOb2RlKTtcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG4gIFxuICBhZGRUYWJsZSgpIHtcbiAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTsgLy8gVGFibGUgd2lkdGggaW4gcGl4ZWxzXG4gIGNvbnN0IGNvbHMgPSAzOyAvLyBOdW1iZXIgb2YgY29sdW1uc1xuICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sczsgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggZm9yIGVhY2ggY2VsbFxuXG4gIGxldCB0YWJsZSA9IGA8YnIgLz48dGFibGUgc3R5bGU9XCJ3aWR0aDogJHt0YWJsZVdpZHRofXB4O1wiPmA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7IC8vIE51bWJlciBvZiByb3dzXG4gICAgdGFibGUgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfVwiPmA7IC8vIEFkZCBib3JkZXItYm90dG9tIHRvIHRoZSByb3dcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIndvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4O1wiPiZuYnNwOzwvdGQ+YDtcbiAgICB9XG4gICAgdGFibGUgKz0gJzwvdHI+JztcbiAgfVxuICB0YWJsZSArPSAnPC90YWJsZT48YnIvPic7XG5cbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICBpZiAoZWRpdG9yKSB7XG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xuICB9XG5cbiAgdGhpcy50YWJsZUFkZGVkID0gdHJ1ZTtcbiAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XG59XG5cblxuXG5cbiAgY2hlY2tUYWJsZVNlbGVjdGlvbihldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGFyZ2V0ICYmICh0YXJnZXQudGFnTmFtZSA9PT0gJ1REJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RIJykpIHtcbiAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhcmdldC5jbG9zZXN0KCd0YWJsZScpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNUYWJsZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcbiAgfVxuXG4gIGNoZWNrUGxhY2Vob2xkZXIoKSB7XG4gICAgLy8gbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcbiAgICAvLyBpZiAoZWRpdG9yKSB7XG4gICAgLy8gICB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlID0gZWRpdG9yLmlubmVySFRNTCA9PT0gJycgfHwgZWRpdG9yLmlubmVySFRNTCA9PT0gJzxicj4nO1xuICAgIC8vICAgaWYgKHRoaXMuaXNQbGFjZWhvbGRlclZpc2libGUpIHtcbiAgICAvLyAgICAgLy8gZWRpdG9yLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cInBsYWNlaG9sZGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6ICMwMDAwMDBcIj5JbnNlcnQgdGV4dCBoZXJlIC4uLjwvc3Bhbj4nO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgbGV0IHBsYWNlaG9sZGVyID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5wbGFjZWhvbGRlcicpO1xuICAgIC8vICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAvLyAgICAgICBlZGl0b3IucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG5cbiAgb25Gb2N1cygpIHtcbiAgICAvLyBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICAgIC8vIGlmIChlZGl0b3IgJiYgdGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSkge1xuICAgIC8vICAgZWRpdG9yLmlubmVySFRNTCA9ICcnO1xuICAgIC8vICAgdGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSA9IGZhbHNlO1xuICAgIC8vIH1cbiAgfVxuXG4gIC8vIGNvbG9yQ2hhbmdlKG5ld0NvbG9yOiBzdHJpbmcpIHtcbiAgLy8gICB0aGlzLmNvbG9yID0gbmV3Q29sb3I7XG4gIC8vIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XG4gIH1cblxuICAvLyBhZGRSb3coKSB7XG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xuICAvLyAgICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgLy8gICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbChpKTtcbiAgLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcbiAgLy8gICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIGJsYWNrJztcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBhZGRSb3coKSB7XG4gIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcbiAgICBsZXQgcm93ID0gdGhpcy5zZWxlY3RlZFRhYmxlLmluc2VydFJvdygpO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBjb2x1bW5zIG9mIHRoZSBmaXJzdCByb3cgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKGkpO1xuICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcblxuICAgICAgLy8gQXBwbHkgYm90dG9tIGJvcmRlciBleHBsaWNpdGx5XG4gICAgICBjZWxsLnN0eWxlLmJvcmRlckJvdHRvbSA9IGAycHggc29saWQgJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUNvbG9yRm9yVGFibGUoKX1gOyAvLyBZb3UgY2FuIHJlcGxhY2UgJ2JsYWNrJyB3aXRoIHlvdXIgdGhlbWUgY29sb3JcbiAgICB9XG4gIH1cbn1cblxuLy8gICBhZGRSb3coKSB7XG4vLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcbi8vICAgICBsZXQgcm93ID0gdGhpcy5zZWxlY3RlZFRhYmxlLmluc2VydFJvdygpO1xuLy8gICAgIHJvdy5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7IC8vIEFkZCBib3R0b20gYm9yZGVyIHRvIHRoZSByb3dcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKGkpO1xuLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7Jztcbi8vICAgICB9XG4vLyAgIH1cbi8vIH1cblxuXG4gIC8vIGRlbGV0ZVJvdygpIHtcbiAgLy8gICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XG4gIC8vICAgICB0aGlzLnNlbGVjdGVkVGFibGUuZGVsZXRlUm93KC0xKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuLy8gICBkZWxldGVSb3coKSB7XG4vLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcbi8vICAgICBsZXQgcm93SW5kZXggPSB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGggLSAxOyBcbi8vICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuLy8gICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbi8vICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbi8vICAgICAgICAgbGV0IHJvdyA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCd0cicpO1xuLy8gICAgICAgICBpZiAocm93KSB7XG4vLyAgICAgICAgICAgcm93SW5kZXggPSByb3cucm93SW5kZXg7XG4vLyAgICAgICAgIH1cbi8vICAgICAgIH1cbi8vICAgICB9XG4vLyAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7XG4vLyAgIH1cbi8vIH1cblxuICBkZWxldGVSb3coKSB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcbiAgICBjb25zdCByb3cgPSBzZWxlY3RlZE5vZGUucGFyZW50RWxlbWVudD8uY2xvc2VzdCgndHInKTtcblxuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gcm93LmNsb3Nlc3QoJ3RhYmxlJyk7XG4gICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuICAvLyBhZGRDb2x1bW4oKSB7XG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgICBsZXQgY2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmluc2VydENlbGwoLTEpO1xuICAvLyAgICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xuICAvLyAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4vLyAgIGFkZENvbHVtbigpIHtcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xuLy8gICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoICsgMTsgLy8gTmV3IGNvbHVtbiBjb3VudFxuLy8gICAgIGNvbnN0IHRhYmxlV2lkdGggPSB0aGlzLnNlbGVjdGVkVGFibGUub2Zmc2V0V2lkdGg7XG4vLyAgICAgY29uc3QgbWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sdW1uQ291bnQ7XG5cbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICBsZXQgY2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmluc2VydENlbGwoLTEpO1xuLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7Jztcbi8vICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XG4vLyAgICAgICBjZWxsLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xuLy8gICAgICAgY2VsbC5zdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJztcbi8vICAgICAgIGNlbGwuc3R5bGUud29yZEJyZWFrID0gJ2JyZWFrLWFsbCc7XG4vLyAgICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcbi8vICAgICB9XG5cbi8vICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgY2VsbHMnIG1pbldpZHRoXG4vLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxsc1tqXS5zdHlsZS5taW5XaWR0aCA9IGAke21pbldpZHRofXB4YDtcbi8vICAgICAgIH1cbi8vICAgICB9XG4vLyAgIH1cbiAgLy8gfVxuICBcbiAgYWRkQ29sdW1uKCkge1xuICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XG4gICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGggKyAxOyAvLyBOZXcgY29sdW1uIGNvdW50XG4gICAgY29uc3QgdGFibGVXaWR0aCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBtaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2x1bW5Db3VudDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uaW5zZXJ0Q2VsbCgtMSk7XG4gICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xuICAgICAgY2VsbC5zdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJztcbiAgICAgIGNlbGwuc3R5bGUud29yZEJyZWFrID0gJ2JyZWFrLWFsbCc7XG4gICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcbiAgICAgIGNlbGwuc3R5bGUubWluV2lkdGggPSBgJHttaW5XaWR0aH1weGA7XG4gICAgICBjZWxsLnN0eWxlLmJvcmRlckJvdHRvbSA9IGAycHggc29saWQgJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUNvbG9yRm9yVGFibGUoKX1gXG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGV4aXN0aW5nIHJvd3MnIGJvdHRvbSBib3JkZXJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7XG4gICAgfVxuICB9XG4gIH1cbiAgXG5cblxuXG5cbiAgZGVsZXRlQ29sdW1uKCkge1xuICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBjZWxsID0gc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3RkLCB0aCcpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgIGxldCBjZWxsSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNlbGxJbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbiAgdGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKSB7XG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjNDE0MTQxICFpbXBvcnRhbnQnXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICM1RjVGNUYgIWltcG9ydGFudCdcbiAgICB9XG4gIH1cblxuICB0aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVDb2xvckZvclRhYmxlKCkge1xuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xuICAgICAgcmV0dXJuICcjNDE0MTQxJ1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyM1RjVGNUYnXG4gICAgfVxuICB9XG5cbiAgYWRqdXN0VGFibGVXaWR0aChldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnN0eWxlLndpZHRoID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBhZGp1c3RDZWxsV2lkdGgoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLndpZHRoID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkanVzdENlbGxIZWlnaHQoZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLmhlaWdodCA9IGV2ZW50LnRhcmdldC52YWx1ZSArICdweCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENhcmV0VG9FbmQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgaWYgKHNlbCkge1xuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBvcGVuQ29sb3JQaWNrZXIoaW5wdXRJZDogc3RyaW5nKSB7XG4gIC8vICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XG4gIC8vICAgaWYgKGlucHV0RWxlbWVudCkge1xuICAvLyAgICAgaW5wdXRFbGVtZW50LmNsaWNrKCk7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIC8vICAgaWYgKGVkaXRvcikge1xuICAvLyAgICAgZWRpdG9yLmZvY3VzKCk7XG4gIC8vICAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcbiAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb3JlQ29sb3InLCBmYWxzZSwgY29sb3IpO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIHNldEJhY2tncm91bmRDb2xvcihldmVudDogYW55KSB7XG4gIC8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICAvLyAgIGlmIChlZGl0b3IpIHtcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xuICAvLyAgICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XG4gIC8vICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAvLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2hpbGl0ZUNvbG9yJywgZmFsc2UsIGNvbG9yKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBwcml2YXRlIHNhdmVkU2VsZWN0aW9uOiBSYW5nZSB8IG51bGwgPSBudWxsO1xuXG5vcGVuQ29sb3JQaWNrZXIoaW5wdXRJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGlmIChpbnB1dEVsZW1lbnQpIHtcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIH1cbiAgICBpbnB1dEVsZW1lbnQuY2xpY2soKTtcbiAgfVxufVxuXG4vLyBzZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xuLy8gICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xuLy8gICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuLy8gICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcblxuLy8gICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlbGVjdGlvblxuLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbi8vICAgICBpZiAoc2VsZWN0aW9uKSB7XG4vLyAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4vLyAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5zYXZlZFNlbGVjdGlvbik7XG5cbi8vICAgICAgIC8vIEFwcGx5IHRoZSBjb2xvciB1c2luZyBhIHNwYW5cbi8vICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcbi8vICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4vLyAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XG4vLyAgICAgICBzcGFuLnRleHRDb250ZW50ID0gcmFuZ2UudG9TdHJpbmcoKTtcblxuLy8gICAgICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGV4dCB3aXRoIHRoZSBzdHlsZWQgc3BhblxuLy8gICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbi8vICAgICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7XG5cbi8vICAgICAgIC8vIENsZWFyIHRoZSBzYXZlZCBzZWxlY3Rpb25cbi8vICAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBudWxsO1xuLy8gICAgIH1cbi8vICAgfVxuICAvLyB9XG4gIHNldFRleHRDb2xvcihldmVudDogYW55KSB7XG4gIGlmICh0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XG4gICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xuXG4gICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAvLyBHZXQgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHJhbmdlLmNsb25lQ29udGVudHMoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShzZWxlY3RlZENvbnRlbnQucXVlcnlTZWxlY3RvckFsbChcIipcIikpIGFzIEhUTUxFbGVtZW50W107IC8vIOKchSBFeHBsaWNpdGx5IGNhc3QgdG8gSFRNTEVsZW1lbnRbXVxuXG4gICAgICAvLyBBcHBseSBjb2xvciB0byBlYWNoIGVsZW1lbnQgd2l0aG91dCBtb2RpZnlpbmcgc3RydWN0dXJlXG4gICAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBlbC5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFwcGx5IGNvbG9yIHRvIHRoZSB0b3AtbGV2ZWwgdGV4dCBub2RlcyAod2l0aG91dCB3cmFwcGluZyB0aGVtKVxuICAgICAgQXJyYXkuZnJvbShzZWxlY3RlZENvbnRlbnQuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgbm9kZS50ZXh0Q29udGVudD8udHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcbiAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQuc3R5bGUuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZXBsYWNlIHNlbGVjdGVkIGNvbnRlbnRcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICByYW5nZS5pbnNlcnROb2RlKHNlbGVjdGVkQ29udGVudCk7XG5cbiAgICAgIC8vIENsZWFyIHNhdmVkIHNlbGVjdGlvblxuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbiAgc2V0QmFja2dyb3VuZENvbG9yKGV2ZW50OiBhbnkpIHtcbiAgaWYgKHRoaXMuc2F2ZWRTZWxlY3Rpb24pIHtcbiAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuXG4gICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcblxuICAgICAgLy8gQXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgdXNpbmcgYSBzcGFuXG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICAgIHNwYW4udGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xuXG4gICAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3RlZCB0ZXh0IHdpdGggdGhlIHN0eWxlZCBzcGFuXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIHNhdmVkIHNlbGVjdGlvblxuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG4gIH1cbiAgXG4gIC8vIGNvbG9yQ2hhbmdlZChldmVudDogYW55KSB7XG4gIC8vICAgdGhpcy5jb2xvciA9IGV2ZW50LmNvbG9yLmhleDsgXG4gIC8vIH1cblxuICBwdWJsaWMgbG9nRXZlbnQoZXZlbnQ6IGFueSwgdHJpZ2dlcjogYW55KSB7XG4gICAgY29uc3QgY29sb3IgPSBldmVudDtcbiAgICB0aGlzLnNldFRleHRDb2xvcihjb2xvcilcbiAgICB0aGlzLnNlbGVjdGVkVGV4dENvbG9yID0gZXZlbnRcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9yZUNvbG9yJywgZmFsc2UsIGV2ZW50KTtcbiAgICAvLyB0aGlzLmxvZ3MudW5zaGlmdChbdGhpcy5sb2dzLmxlbmd0aCArIDEsIHRyaWdnZXIsIGV2ZW50XSk7XG4gIH1cbiAgXG5cbiAgZWRpdEltYWdlKCkge1xuICAgIGxldCBkYXRhIFxuICAgIHN3aXRjaCAodGhpcy5lZGl0b3JGcm9tLm5hbWUpIHtcbiAgICAgIGNhc2UgJ3NlY3Rpb24tY29udGVudCc6XG4gICAgICAgIGRhdGEgPSB7IGVkaXRJTUc6IHRydWUsIGZyb206ICdodG1sRWRpdG9yJywgaW5kZXg6IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgsIGlkOiB0aGlzLmVkaXRvckZyb20uaWQgfTtcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGE6IHN0cmluZyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJywgY29tcHJlc3NlZERhdGEpO1xuICAgICAgICBjb25zdCBjb21wcmVzc2VkRGF0YTIgPSBjb21wcmVzcyhKU09OLnN0cmluZ2lmeSh0aGlzLnNhbml0aXplZENvbnRlbnQpKTtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGV4dEVkaXRvcicsIGNvbXByZXNzZWREYXRhMik7XG4gICAgICAgIC8vIGFsZXJ0KCdnbyB0byBlZGl0b3IhJylcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSU1HRWRpdG9yKGRhdGEpO1xuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjcmVhdGUtZG9jdW1lbnQnOlxuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcbiAgICAgICAgZGF0YSA9IHsgZWRpdElNRzogdHJ1ZSwgZnJvbTogJ2NyZWF0ZURvY3VtZW50JywgaW5kZXg6IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgsIGlkOiB0aGlzLmVkaXRvckZyb20uaWQsIHNlY3Rpb246IHRoaXMuZWRpdG9yRnJvbS5zZWN0aW9uLCByZXBvcnRTZWN0aW9uSWQ6IHRoaXMuZWRpdG9yRnJvbS5yZXBvcnRTZWN0aW9uSWQgfTtcbiAgICAgICAgLy8gdGhpcy5vcGVuRGlhbG9nKGRhdGEpXG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhMyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhNCA9IGNvbXByZXNzKHRoaXMuZWRpdG9yVGV4dCk7XG5cbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJywgY29tcHJlc3NlZERhdGEzKTtcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGV4dEVkaXRvcjInLCBjb21wcmVzc2VkRGF0YTQpO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbnVsbFxuICAgICAgICAvLyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcpO1xuICAgICAgICAvLyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcDInKTtcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndGVtcGxhdGVFZGl0b3InKTtcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndGV4dEVkaXRvcicpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gaWYgKHRoaXMuZWRpdG9yRnJvbSA9PT0gJ3NlY3Rpb24tY29udGVudCcpIHtcbiAgICAvLyAgIGNvbnN0IGRhdGEgPSB7ZWRpdElNRzogdHJ1ZSwgZnJvbTogJ2h0bWxFZGl0b3InLCBpbmRleDogdGhpcy5zZWxlY3RlZEl0ZW1JbmRleH1cbiAgICAvLyAgIHRoaXMubmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhKVxuICAgIC8vICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmltYWdlRWRpdFVybCkpXG4gICAgLy8gICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0ZXh0RWRpdG9yJywgdGhpcy5lZGl0b3JUZXh0KVxuICAgIC8vIH0gXG4gICAgXG4gIH1cblxuICBvcGVuRGlhbG9nKCBpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBsZXQgZGF0YTogYW55O1xuICAgIC8vICAgZGF0YSA9IGl0ZW1cbiAgICAvLyBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEltYWdlRWRpdG9yTW9kYWxDb21wb25lbnQse1xuICAgIC8vICAgbWluV2lkdGg6ICcxMDAlJywgbWluSGVpZ2h0OiAnMTAwdmgnLCBwYW5lbENsYXNzOiAndGhlbWUtMkIyOTM2JyAsZGlzYWJsZUNsb3NlOiB0cnVlLCBkYXRhOiBkYXRhXG4gICAgLy8gfSk7XG4gICAgLy8gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZygncmVzdWx0ID09PT4gaW1nID0gJywgcmVzdWx0KVxuICAgIC8vICAgY29uc3QgaW1nVXJsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJyk7XG4gICAgLy8gICAgIGlmIChpbWdVcmwpIHtcbiAgICAvLyAgICAgICB0aGlzLnJlcGxhY2VJbWFnZVNyYyhpbWdVcmwsICByZXN1bHQuaW5kZXguaW5kZXgpO1xuICAgIC8vICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSk7XG4gIH1cblxuICByZXBsYWNlSW1hZ2VTUkMobmV3U3JjOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0aGlzLmVkaXRvclRleHQsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBpbWdUYWdzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcblxuICBpZiAoaW1nVGFncyAmJiBpbWdUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGltZ1RhZ3MubGVuZ3RoKSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIGltZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gICAgICBcbiAgICAgIGltZ1RhZ3NbaW5kZXhdLnNldEF0dHJpYnV0ZSgnc3JjJywgbmV3U3JjKTtcbiAgICAgIHRoaXMuZWRpdG9yVGV4dCA9IGRvYy5ib2R5LmlubmVySFRNTDtcbiAgICBcbiAgICB9IFxuICB9IFxuICB9XG5cbiAgbmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbi9pbWFnZS1lZGl0b3InXSwgeyBxdWVyeVBhcmFtczoge2RhdGEgOiBKU09OLnN0cmluZ2lmeShkYXRhKX0gfSlcbiAgfVxuXG4gIC8vICBvblRleHRTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgLy8gICBpZiAodGhpcy50b29sYmFyTW9kZSA9PT0gJ2J1YmJsZScpIHtcbiAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgLy8gICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gIC8vICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gIC8vICAgICAgIGlmICghcmFuZ2UuY29sbGFwc2VkKSB7XG4gIC8vICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAvLyAgICAgICAgIHRoaXMudG9vbGJhclRvcCA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcbiAgLy8gICAgICAgICB0aGlzLnRvb2xiYXJMZWZ0ID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpIC0gNTA7XG4gIC8vICAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiBvblRleHRTZWxlY3QoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIGlmICghcmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsWSA9ICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICBjb25zdCBzY3JvbGxYID0gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLnRvb2xiYXJUb3AgPSByZWN0LnRvcCArIHNjcm9sbFkgLSA3NTtcbiAgICAgICAgdGhpcy50b29sYmFyTGVmdCA9IHJlY3QubGVmdCArIHNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpIC0gMzI1O1xuICAgICAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4vLyAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbi8vICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcbi8vICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xuLy8gICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuLy8gICAgICAgaWYgKHRoaXMuaXNUYWJsZURhdGEocGFzdGVkVGV4dCkpIHtcbi8vICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKHBhc3RlZFRleHQpO1xuLy8gICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xuLy8gICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwYXN0ZWRUZXh0KTtcbi8vICAgICAgIH1cbi8vICAgICB9XG4vLyAgIH1cblxuICAvLyBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gIC8vICAgaWYgKGNsaXBib2FyZERhdGEpIHtcbiAgLy8gICAgIC8vIEhhbmRsZSBpbWFnZSBkYXRhXG4gIC8vICAgICBjb25zdCBpdGVtcyA9IGNsaXBib2FyZERhdGEuaXRlbXM7XG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICAgIGlmIChpdGVtc1tpXS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gIC8vICAgICAgICAgY29uc3QgZmlsZSA9IGl0ZW1zW2ldLmdldEFzRmlsZSgpO1xuICAvLyAgICAgICAgIGlmIChmaWxlKSB7XG4gIC8vICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAvLyAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW1nSHRtbCA9IGA8aW1nIHNyYz1cIiR7ZS50YXJnZXQucmVzdWx0fVwiIGFsdD1cIlBhc3RlZCBJbWFnZVwiIHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1wiLz5gO1xuICAvLyAgICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGltZ0h0bWwpO1xuICAvLyAgICAgICAgICAgfTtcbiAgLy8gICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAvLyAgICAgICAgICAgcmV0dXJuOyAvLyBFeGl0IGlmIGFuIGltYWdlIGlzIGhhbmRsZWRcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gSGFuZGxlIHRleHQgb3IgdGFibGUgZGF0YVxuICAvLyAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuICAvLyAgICAgaWYgKHRoaXMuaXNUYWJsZURhdGEocGFzdGVkVGV4dCkpIHtcbiAgLy8gICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKHBhc3RlZFRleHQpO1xuICAvLyAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwYXN0ZWRUZXh0KTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGNsaXBib2FyZERhdGEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpcGJvYXJkRGF0YS5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gY2xpcGJvYXJkRGF0YS5pdGVtc1tpXTtcblxuICAgICAgICBpZiAoaXRlbS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZS9cIikpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2UgcGFzdGVcbiAgICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGltZ0h0bWwgPSBgPGltZyBzcmM9XCIke2UudGFyZ2V0LnJlc3VsdH1cIiBhbHQ9XCJQYXN0ZWQgSW1hZ2VcIiBzdHlsZT1cIm1heC13aWR0aDogMTAwJTtcIiAvPmA7XG4gICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaW1nSHRtbCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0L2h0bWxcIikge1xuICAgICAgICAgIC8vIEhhbmRsZSBIVE1MIHBhc3RlXG4gICAgICAgICAgLy8gY29uc3QgaHRtbERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZURhdGEoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbERhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwidGV4dC9wbGFpblwiKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIHBsYWluIHRleHQgcGFzdGVcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlRGF0YShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKSk7XG4gICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc3QgcGxhaW5UZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgICAvLyB0aGlzLmluc2VydEh0bWxBdENhcmV0KHBsYWluVGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNFeGNlbERhdGEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGh0bWwuaW5jbHVkZXMoJ3htbG5zOm89XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2VcIicpIHx8IFxuICAgICAgICAgIGh0bWwuaW5jbHVkZXMoJ3htbG5zOng9XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbFwiJyk7XG4gIH1cblxuICBjb252ZXJ0RXhjZWxIdG1sVG9UYWJsZShodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCB0YWJsZSA9IGRvYy5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xuICAgIHJldHVybiB0YWJsZSA/IHRhYmxlLm91dGVySFRNTCA6ICcnOyAvLyBFeHRyYWN0IG9ubHkgdGhlIHRhYmxlIHBhcnRcbiAgfVxuXG5cblxuXG4gIGlzVGFibGVEYXRhKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd3MgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICByZXR1cm4gcm93cy5sZW5ndGggPiAxICYmIHJvd3NbMF0uc3BsaXQoJ1xcdCcpLmxlbmd0aCA+IDE7XG4gIH1cblxuICAvLyBjb252ZXJ0VGV4dFRvVGFibGUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKHJvdyA9PiByb3cudHJpbSgpICE9PSAnJyk7XG4gIC8vICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAocm93ID0+IHtcbiAgLy8gICAgIGNvbnN0IGNlbGxzID0gcm93LnNwbGl0KCdcXHQnKS5tYXAoY2VsbCA9PiBgPHRkIGNsYXNzPVwicHgtMSBweS0xXCIgPiR7Y2VsbH08L3RkPmApLmpvaW4oJycpO1xuICAvLyAgICAgcmV0dXJuIGA8dHIgY2xhc3M9XCJ0YWJsZS1ib3JkZXItdG9wXCIgc3R5bGU9XCJib3JkZXItdG9wOiAke3RoaXMudGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKX07IHdpZHRoOiAxMDAlICFpbXBvcnRhbnRcIj4ke2NlbGxzfTwvdHI+YDtcbiAgLy8gICB9KS5qb2luKCcnKTtcbiAgLy8gICByZXR1cm4gYDx0YWJsZT4ke3RhYmxlUm93c308L3RhYmxlPmA7XG4gIC8vIH1cblxuICBjb252ZXJ0VGV4dFRvVGFibGUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKHJvdyA9PiByb3cudHJpbSgpICE9PSAnJyk7XG4gICAgY29uc3QgY29sdW1uQ291bnQgPSByb3dzWzBdPy5zcGxpdCgnXFx0JykubGVuZ3RoIHx8IDE7IC8vIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSB0aGUgZmlyc3Qgcm93XG4gICAgY29uc3QgY29sdW1uV2lkdGggPSAxMDAgLyBjb2x1bW5Db3VudDsgLy8gQ2FsY3VsYXRlIGNvbHVtbiB3aWR0aFxuXG4gICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAoKHJvdywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNlbGxzID0gcm93LnNwbGl0KCdcXHQnKS5tYXAoY2VsbCA9PiBgXG4gICAgICAgIDx0ZCBjbGFzcz1cInB4LTEgcHktMSB0ZXh0LXRydW5jYXRlXCIgXG4gICAgICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogJHtjb2x1bW5XaWR0aH0lOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAke2NlbGx9XG4gICAgICAgIDwvdGQ+YCkuam9pbignJyk7XG5cbiAgICAgIC8vIEFkZCBhIGJvcmRlci10b3AgZm9yIGFsbCByb3dzIGV4Y2VwdCB0aGUgZmlyc3QgYW5kIGJvcmRlci1ib3R0b20gZm9yIHRoZSBsYXN0IHJvd1xuICAgICAgY29uc3QgYm9yZGVyVG9wID0gaW5kZXggPT09IDAgPyAnJyA6IGBib3JkZXItdG9wOiAke3RoaXMudGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKX07YDtcbiAgICAgIGNvbnN0IGJvcmRlckJvdHRvbSA9IGluZGV4ID09PSByb3dzLmxlbmd0aCAtIDEgPyBgYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9O2AgOiAnJztcblxuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPHRyIFxuICAgICAgICAgIHN0eWxlPVwiJHtib3JkZXJUb3B9ICR7Ym9yZGVyQm90dG9tfSB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1wiPlxuICAgICAgICAgICR7Y2VsbHN9XG4gICAgICAgIDwvdHI+YDtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIHJldHVybiBgXG4gICAgICA8dGFibGUgc3R5bGU9XCJ0YWJsZS1sYXlvdXQ6IGZpeGVkOyB3aWR0aDogMTAwJTtcIj4gXG4gICAgICAgICR7dGFibGVSb3dzfVxuICAgICAgPC90YWJsZT5gO1xuICB9XG5cblxuXG4gIGluc2VydEh0bWxBdENhcmV0KGh0bWw6IHN0cmluZykge1xuICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xuICAgIGlmIChyYW5nZSkge1xuICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBsZXQgbm9kZTtcbiAgICAgIHdoaWxlICgobm9kZSA9IHRlbXBEaXYuZmlyc3RDaGlsZCkpIHtcbiAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH1cbiAgICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZyk7XG4gICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgdGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKSB7XG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XG4gICAgICByZXR1cm4gJzFweCBzb2xpZCAjRDBEMEQwOyAhaW1wb3J0YW50J1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJzFweCBzb2xpZCAjNDE0MTQxICFpbXBvcnRhbnQnXG4gICAgfVxuICB9XG5cbiBcbiAgcHVibGljIG9wZW5GdWxsc2NyZWVuKCkge1xuICAgIHZhciBlbGVtOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRleHRFZGl0b3JcIik7XG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xuICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICBlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgJ21pbi1oZWlnaHQnOiAnOTB2aCcsXG4gICAgICAnbWF4LWhlaWdodCc6ICc5MHZoJyxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xvc2VGdWxsc2NyZWVuKCkge1xuICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gZmFsc2U7XG4gICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICAnbWluLWhlaWdodCc6ICc0MDBweCcsXG4gICAgICAgICdtYXgtaGVpZ2h0JzogJzQwMHB4JyxcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIGNsZWFyVGV4dEVkaXRvcigpIHtcbiAgICB0aGlzLmVkaXRvclRleHRDbGVhci5lbWl0KClcbiAgfVxuXG4gIHNldHVwSGlzdG9yeSgpIHtcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIFxuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHRoaXMub25JbnB1dCgpKTtcbiAgICB9XG4gIH1cblxuICBvbklucHV0KCkge1xuICAgIHRoaXMuc2F2ZVN0YXRlKCk7XG4gIH1cblxuICBzYXZlU3RhdGUoKSB7XG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICBcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBjb25zdCBlZGl0b3JDb250ZW50ID0gZWRpdG9yLmlubmVySFRNTDtcbiAgICAgIGlmICh0aGlzLmhpc3RvcnlJbmRleCA9PT0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9yQ29udGVudCk7XG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXggKyAxKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9yQ29udGVudCk7XG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xuICAgIH1cbiAgfVxuICB1bmRvKCkge1xuICAgIGlmICh0aGlzLmhpc3RvcnlJbmRleCA+IDApIHtcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2godGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeUluZGV4XSk7XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleC0tO1xuICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xuICBcbiAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeUluZGV4XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWRvKCkge1xuICAgIGlmICh0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZWRvQ29udGVudCA9IHRoaXMucmVkb1N0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocmVkb0NvbnRlbnQhKTtcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4Kys7XG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XG4gIFxuICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSByZWRvQ29udGVudCE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbi8vICAgZm9ybWF0VGV4dFdpdGhEYXRlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuLy8gICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gZGV0ZWN0IFlZWVktTU0tREQgZm9ybWF0dGVkIGRhdGVzXG4vLyAgIGNvbnN0IGRhdGVSZWdleCA9IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVxcYi9nO1xuXG4vLyAgIC8vIFJlcGxhY2UgZm91bmQgZGF0ZXMgd2l0aCBhIGZvcm1hdHRlZCB2ZXJzaW9uXG4vLyAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZGF0ZVJlZ2V4LCAoZGF0ZVN0cikgPT4ge1xuLy8gICAgIC8vIENvbnZlcnQgdGhlIGRldGVjdGVkIGRhdGUgc3RyaW5nIGludG8gYSBEYXRlIG9iamVjdFxuLy8gICAgIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZShkYXRlU3RyKTtcbiAgICBcbi8vICAgICAvLyBGb3JtYXQgdGhlIGRhdGUgdG8gJ01vbnRoIERheSwgWWVhcicgKGUuZy4sIE9jdG9iZXIgMTAsIDIwMjQpXG4vLyAgICAgcmV0dXJuIGRhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbi8vICAgICAgIHllYXI6ICdudW1lcmljJyxcbi8vICAgICAgIG1vbnRoOiAnbG9uZycsXG4vLyAgICAgICBkYXk6ICdudW1lcmljJyxcbi8vICAgICB9KTtcbi8vICAgfSk7XG4gIC8vIH1cbiAgXG4gIGZvcm1hdFRleHRXaXRoRGF0ZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGRldGVjdCBZWVlZLU1NLUREIGZvcm1hdHRlZCBkYXRlc1xuICBjb25zdCBkYXRlUmVnZXggPSAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1cXGIvZztcblxuICAvLyBSZXBsYWNlIGZvdW5kIGRhdGVzIHdpdGggYSBmb3JtYXR0ZWQgdmVyc2lvblxuICByZXR1cm4gdGV4dC5yZXBsYWNlKGRhdGVSZWdleCwgKGRhdGVTdHIpID0+IHtcbiAgICAvLyBDb252ZXJ0IHRoZSBkZXRlY3RlZCBkYXRlIHN0cmluZyBpbnRvIGEgRGF0ZSBvYmplY3RcbiAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZVN0cik7XG5cbiAgICAvLyBFeHRyYWN0IGRheSwgbW9udGgsIGFuZCB5ZWFyXG4gICAgY29uc3QgZGF5ID0gZGF0ZU9iai5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBFbnN1cmUgZGF5IGlzIHR3byBkaWdpdHNcbiAgICBjb25zdCBtb250aCA9IGRhdGVPYmoudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JyB9KTsgLy8gR2V0IGFiYnJldmlhdGVkIG1vbnRoIG5hbWVcbiAgICBjb25zdCB5ZWFyID0gZGF0ZU9iai5nZXRGdWxsWWVhcigpOyAvLyBHZXQgZnVsbCB5ZWFyXG5cbiAgICAvLyBGb3JtYXQgdGhlIGRhdGUgYXMgJ2RkL21tbS95eXl5J1xuICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICB9KTtcbn1cblxuXG59IiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lciBlbHMtdGV4dC1lZGl0b3IgcHgtMFwiIGlkPVwidGV4dEVkaXRvclwiICNmdWxsc2NyZWVuPVwibmd4RnVsbHNjcmVlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dEVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neEZ1bGxzY3JlZW4+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdmaXhlZCdcIiBjbGFzcz1cImJ0bi10b29sYmFyIGVscy1idG4tdG9vbGJhciBwLTIgcHktMiBtYi0wXCIgcm9sZT1cInRvb2xiYXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAncG9pbnRlci1ldmVudHMnOiBkaXNhYmxlVG9vbGJhciA/ICdub25lJyA6ICdhdXRvJyxcclxuICAgICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnLFxyXG4gICAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnXHJcbn1cIlxyXG5hcmlhLWxhYmVsPVwiVG9vbGJhciB3aXRoIGJ1dHRvbiBncm91cHNcIlxyXG5zdHlsZT1cImJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcIlxyXG4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy1mb3JtLXNlbGVjdCBib3JkZXIgZWxzLXRvb2xiYXItZHJvcGRvd24tYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZSB0ZXh0LXN0YXJ0XCIgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwiJzVweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZEZvcm1hdEJsb2NrIHwgdGl0bGVjYXNlfX08L3NwYW4+IDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkZvbnQgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJlbHMtZm9ybS1zZWxlY3QgXCIgc3R5bGU9XCIgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OyBjb2xvcjogI2ZmZjtib3JkZXI6IDJweCBzb2xpZCAjN0Q2RDZEICFpbXBvcnRhbnQ7XCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiIChjaGFuZ2UpPVwiY2hhbmdlRm9udCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzPVwiZWxzLWZvcm0tb3B0aW9uXCIgKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLWZvcm0tc2VsZWN0IGJvcmRlciBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlIHRleHQtc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIFtzdHlsZS5ib3JkZXJdPVwidGhlbWVNb2RlKClcIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDg1cHg7IGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDtcIiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkRm9udCB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgZm9udCBvZiBmb250c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VGb250KGZvbnQpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInB5LTBcIiAgc3R5bGU9XCJoZWlnaHQ6IGZpdC1jb250ZW50O1wiIFtzdHlsZS5jb2xvcl09XCJ0aGVtZU1vZGVDbHIoKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbWUtMiBtci0yIFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnYm9sZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1ib2xkXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0l0YWxpY0FjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNVbmRlcmxpbmVBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC11bmRlcmxpbmVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdHJpa2V0aHJvdWdoLXZhcmlhbnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cInRleHRDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVGV4dENvbG9yXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW3N0eWxlLmNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ2JnQ29sb3JQaWNrZXInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1saW5lIG1zLTIgYm9yZGVyXCIgW3N0eWxlLmJvcmRlci1sZWZ0XT1cInRoZW1lTW9kZUNsclZlcnRpY2FsTGluZSgpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LW51bWJlcmVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cInFsLWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiAgYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJvcGRvd25CYXNpYzFcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBuZ2JEcm9wZG93blRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1sZWZ0IFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDNweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUxlZnQnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1jZW50ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gdGV4dC1kYXJrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlSaWdodCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1yaWdodFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUZ1bGwnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWxpbmUgbXMtMiBib3JkZXJcIiBbc3R5bGUuYm9yZGVyLWxlZnRdPVwidGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKClcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdWJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3VwZXJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkTGluaygpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWxpbmstdmFyaWFudFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktaW1hZ2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImltYWdlSW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJoYW5kbGVJbWFnZVVwbG9hZCgkZXZlbnQpXCIgYWNjZXB0PVwiaW1hZ2UvKlwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRUYWJsZSgpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29sdW1uKClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtY29sdW1uLXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW4oKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwidW5kbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXVuZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwicmVkbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXJlZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyVGV4dEVkaXRvcigpXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiB3aWR0aDogZml0LWNvbnRlbnQgIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktY2xvc2UtY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZUZ1bGxzY3JlZW4xKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSXNPcGVuOyBlbHNlIGZ1bGxzY3JlZW5JY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mdWxsc2NyZWVuLWV4aXRcIj48L2k+IDwhLS0gQ29sbGFwc2UgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Z1bGxzY3JlZW5JY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZnVsbHNjcmVlblwiPjwvaT4gPCEtLSBFeHBhbmQgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdidWJibGUnXCIgY2xhc3M9XCJidWJibGUtdG9vbGJhciBib3JkZXIgcC0yXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xiYXJUb3AsICdsZWZ0LnB4JzogdG9vbGJhckxlZnQsICdkaXNwbGF5Jzogc2hvd1Rvb2xiYXIgPyAnYmxvY2snIDogJ25vbmUnfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJGb250IE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImVscy1mb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYm9sZFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzSXRhbGljQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2l0YWxpYycpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzVW5kZXJsaW5lQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXVuZGVybGluZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3RyaWtldGhyb3VnaC12YXJpYW50XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Jsb2NrcXVvdGUnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtcXVvdGUtY2xvc2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImluc2VydENvZGVCbG9jaygpXCI+PGkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1jb2RlLXRhZ3NcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtbGlzdC1udW1iZXJlZFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkNvbG9yIEZvcm1hdHRpbmdcIj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGFycm93LW5vbmUgdGV4dC1zZWNvbmRhcnlcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItZmlsbFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDMwMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sb3Itc2tldGNoIGNvbG9yPVwiI2ZmZlwiIChvbkNoYW5nZUNvbXBsZXRlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+PC9jb2xvci1za2V0Y2g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiIG5neC1jb2xvcnMtdHJpZ2dlciBbKG5nTW9kZWwpXT1cImNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsb2dFdmVudCgkZXZlbnQsICduZ01vZGVsQ2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibG9nRXZlbnQoJGV2ZW50LCAnY2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJsb2dFdmVudCgkZXZlbnQsICdpbnB1dCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwie2NvbG9yOiBjb2xvcn1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1jb2xvcnMgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiID48L25neC1jb2xvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgaWQ9XCJ0ZXh0Q29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGV4dENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRUZXh0Q29sb3JcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQmFja2dyb3VuZCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbc3R5bGUuY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHN0eWxlPVwid2lkdGg6IDBweCAhaW1wb3J0YW50O1wiIGlkPVwiYmdDb2xvclBpY2tlclwiIFtjcFByZXNldENvbG9yc109XCJbJyNmZmYnLCAnIzAwMCcsICcjMjg4OWU5JywgJyNlOTIwZTknLCAnI2ZmZjUwMCcsICdyZ2IoMjM2LDY0LDY0KSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJjb2xvclwiIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIiAvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cImJnQ29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJIZWFkZXIgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiaGVhZGVyRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGgxPicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+IEhlYWRpbmcgMTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItMlwiPjwvaT4gSGVhZGluZyAyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoMz4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci0zXCI+PC9pPiBIZWFkaW5nIDM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGg0PicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTRcIj48L2k+IEhlYWRpbmcgNDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItNVwiPjwvaT4gSGVhZGluZyA1PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoNj4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci02XCI+PC9pPiBIZWFkaW5nIDY8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlXCIgaWQ9XCJoZWFkZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogODVweDtcIj57e3NlbGVjdGVkRm9ybWF0QmxvY2sgfCB0aXRsZWNhc2V9fTwvc3Bhbj4gPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWNoZXZyb24tZG93biB0ZXh0LWRhcmtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImhlYWRlckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1YnNjcmlwdEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdWJzY3JpcHQnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1cGVyc2NyaXB0QWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3VwZXJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdCBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCIgc3R5bGU9XCJ3aWR0aDogM3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tY2VudGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWFsaWduLXJpZ2h0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdyZW1vdmVGb3JtYXQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jbGVhclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRMaW5rKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1saW5rLXZhcmlhbnRcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1pbWFnZVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJpbWFnZUlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChjaGFuZ2UpPVwiaGFuZGxlSW1hZ2VVcGxvYWQoJGV2ZW50KVwiIGFjY2VwdD1cImltYWdlLypcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkVGFibGUoKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkUm93KClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1wbHVzLWFmdGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cImNvbG9yXCI+PC9pPlxyXG4gICAgICAgIDxuZ3gtY29sb3JzIFsobmdNb2RlbCldPVwiY29sb3JcIiAoY2hhbmdlKT1cImNvbG9yQ2hhbmdlZCgkZXZlbnQpXCI+PC9uZ3gtY29sb3JzPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgbmdiRHJvcGRvd24gYXJpYS1sYWJlbD1cIlRhYmxlIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIG5nYkRyb3Bkb3duVG9nZ2xlICAoY2xpY2spPVwiYWRkVGFibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51ICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkIHx8IHRhYmxlQWRkZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+IEFkZCBSb3dcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJkZWxldGVSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXJlbW92ZVwiPjwvaT4gRGVsZXRlIFJvd1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcGx1cy1hZnRlclwiPjwvaT4gQWRkIENvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPiBEZWxldGUgQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGFibGVXaWR0aFwiPlRhYmxlIFdpZHRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRhYmxlV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0VGFibGVXaWR0aCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VsbFdpZHRoXCI+Q2VsbCBXaWR0aDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJjZWxsV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0Q2VsbFdpZHRoKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjZWxsSGVpZ2h0XCI+Q2VsbCBIZWlnaHQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VsbEhlaWdodFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGNoYW5nZSk9XCJhZGp1c3RDZWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgaWQ9XCJlZGl0b3JcIiBjbGFzcz1cInAtMyBjdXN0b20tc2Nyb2xsYmFyIG5vbi1mb2N1c1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMjBweCAhaW1wb3J0YW50O1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInRoZW1lTW9kZUJnQ2xyKClcIiBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgJ2ZvbnQtc2l6ZSc6IHNlbGVjdGVkRm9udFNpemUgKyAncHgnfVwiIFtzdHlsZV09XCJzdHlsZVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzg1dmggIWltcG9ydGFudCcgOiAgJzQwNXB4ICFpbXBvcnRhbnQnXCJcclxuICAgICAgICAoaW5wdXQpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJJbnNlcnQgdGV4dCBoZXJlIC4uLlwiIHJlYWRvbmx5IChtb3VzZXVwKT1cIm9uVGV4dFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplZENvbnRlbnRcIiAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgICAgICAoY2xpY2spPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigkZXZlbnQpXCI+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8IS0tIDxkaXYgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgXCIgW3N0eWxlLmJhY2tncm91bmRdPVwidGhlbWVNb2RlQmdDbHIoKVwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlci10b3BdPVwidGhlbWVNb2RlQm9yZGVyVG9wKClcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnZm9udC1mYW1pbHknOiBzZWxlY3RlZEZvbnQsICdmb250LXNpemUnOiBzZWxlY3RlZEZvbnRTaXplICsgJ3B4JyxcclxuICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnXHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzkzdmgnIDogJzQwNXB4J1wiIChpbnB1dCk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkluc2VydCB0ZXh0IGhlcmUgLi4uXCJcclxuICAgICAgICByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIj5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDxkaXYgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImNvbnRlbnRFZGl0YWJsZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBvdmVyZmxvdzogYXV0bztcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogc2VsZWN0ZWRGb250U2l6ZSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IElzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDonMjBweCcsXHJcbiAgICAgICAgICAgICAgICAnbWluLWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCcsXHJcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCdcclxuICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIiByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgKGlucHV0KT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIiAoa2V5ZG93bi5UYWIpPVwiaGFuZGxlVGFiS2V5KCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDx0YWJsZSAqbmdJZj1cInBhcnNlZFRhYmxlXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGhlYWRlciBvZiBwYXJzZWRUYWJsZS5oZWFkZXJzXCI+e3sgaGVhZGVyIH19PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFyc2VkVGFibGUucm93c1wiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvd1wiPnt7IGNlbGwgfX08L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG5cclxuPC9kaXY+Il19
|
1884
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWwtdGV4dC1lZGl0b3Ivc3JjL2xpYi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lbC10ZXh0LWVkaXRvci9zcmMvbGliL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBcUMsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU10Rix5R0FBeUc7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBYyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7QUFhakQsTUFBTSxPQUFPLHFCQUFxQjtJQXNGaEMsWUFDVSxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsUUFBbUIsRUFDbkIsU0FBdUI7UUFIdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXhGeEIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQVN4QixnQkFBVyxHQUFnQyxPQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBWSxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDMUQsMEJBQXFCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUMsQ0FBQyxxQkFBcUI7UUFDakcscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG4vLyBpbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ3hGdWxsc2NyZWVuRGlyZWN0aXZlIH0gZnJvbSAnQHVsdGltYXRlL25neC1mdWxsc2NyZWVuJztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuLy8gaW1wb3J0IHsgSW1hZ2VFZGl0b3JNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFscy9pbWFnZS1lZGl0b3ItbW9kYWwvaW1hZ2UtZWRpdG9yLW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGNvbXByZXNzLCBkZWNvbXByZXNzIH0gZnJvbSAnbHotc3RyaW5nJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RleHQtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVsVGV4dEVkaXRvckNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFbFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgZWRpdG9yVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgZWRpdG9yRnJvbTogYW55O1xyXG4gIEBJbnB1dCgpIGVkaXRvckFjdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIFVzZXJSb2xlOiBhbnk7XHJcbiAgQElucHV0KCkgc3R5bGU6IGFueTtcclxuICBASW5wdXQoKSBkaXNhYmxlVG9vbGJhcjogYW55O1xyXG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyOiBhbnk7XHJcbiAgQElucHV0KCkgcmVwb3J0SWQ6IGFueTtcclxuICBASW5wdXQoKSBiYWNrZ3JvdW5kSW1hZ2U6IGFueTtcclxuICBASW5wdXQoKSB0b29sYmFyTW9kZTogJ2ZpeGVkJyB8ICdidWJibGUnIHwgJ25vbmUnID0gJ2ZpeGVkJztcclxuICBASW5wdXQoKSBjb250ZW50RWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBJbnB1dCBmb3IgaW5pdGlhbCB2YWx1ZVxyXG4gIEBPdXRwdXQoKSBjb250ZW50RWRpdGFibGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsgLy8gT3V0cHV0IGZvciBjaGFuZ2VzXHJcbiAgQE91dHB1dCgpIGVkaXRvclRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgZWRpdG9yQWN0aW9uUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZWRpdG9yVGV4dENsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGltYWdlRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbWFnZUVkaXQyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHBsYWNlSG9sZGVyUmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGlzT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBuZXdJbWFnZUFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgXHJcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBcclxuICBAVmlld0NoaWxkKCd0ZXh0RWRpdG9yJykgVGV4dEVkaXRvciE6ICBFbGVtZW50UmVmPEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2Z1bGxzY3JlZW4nKSBmdWxsc2NyZWVuITogTmd4RnVsbHNjcmVlbkRpcmVjdGl2ZVxyXG4gICAgXHJcbiAgc2FuaXRpemVkQ29udGVudCE6IFNhZmVIdG1sO1xyXG5cclxuXHJcbiAgc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICB0b29sYmFyVG9wID0gMDtcclxuICB0b29sYmFyTGVmdCA9IDA7XHJcblxyXG4gIGZvbnRzID0gWydBcmlhbCcsICdDb3VyaWVyIE5ldycsICdHZW9yZ2lhJywgJ1RpbWVzIE5ldyBSb21hbicsICdWZXJkYW5hJ107XHJcbiAgZm9udFNpemVzID0gWzEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDI0LCAyOCwgMzIsIDM2XTtcclxuICBzZWxlY3RlZEZvbnQgPSAnQXJpYWwnO1xyXG4gIHNlbGVjdGVkRm9udFNpemUgPSAxNDtcclxuICBpc1RhYmxlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICB0YWJsZUFkZGVkID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRUYWJsZTogSFRNTFRhYmxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGlzUGxhY2Vob2xkZXJWaXNpYmxlID0gdHJ1ZTtcclxuICBzZWxlY3RlZENlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcbiAgaXNCb2xkQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNJdGFsaWNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1VuZGVybGluZUFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3RyaWtldGhyb3VnaEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3Vic2NyaXB0QWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTdXBlcnNjcmlwdEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZWxlY3RlZEZvcm1hdEJsb2NrOiBzdHJpbmcgPSAnbm9ybWFsJ1xyXG5cclxuICBzZWxlY3RlZEltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgaW1hZ2VFZGl0VXJsOiBzdHJpbmcgPSAnJztcclxuICBpbWFnZVBvc2l0aW9uWCA9IDA7XHJcbiAgaW1hZ2VQb3NpdGlvblkgPSAwO1xyXG4gIGltYWdlUmVzaXplU3RhcnRYID0gMDtcclxuICBpbWFnZVJlc2l6ZVN0YXJ0WSA9IDA7XHJcbiAgaW1hZ2VSZXNpemVTdGFydFdpZHRoID0gMDtcclxuICBpbWFnZVJlc2l6ZVN0YXJ0SGVpZ2h0ID0gMDtcclxuICBpbWFnZVJlc2l6ZURpcmVjdGlvbjogJ3RvcExlZnQnIHwgJ3RvcFJpZ2h0JyB8ICdib3R0b21MZWZ0JyB8ICdib3R0b21SaWdodCcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgdW5kb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHJlZG9TdGFjazogc3RyaW5nW10gPSBbXTtcclxuICBoaXN0b3J5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGhpc3RvcnlJbmRleCA9IC0xO1xyXG4gIC8vIGVkaXRvclRleHQxID0gYGA7XHJcbiAgc2VsZWN0ZWRUZXh0Q29sb3I6IGFueTtcclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XHJcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcclxuICBjb2xvcjogYW55ID0gJyNkZGQnO1xyXG4gIGNvbG9yRm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcclxuICBiYWNrZ3JvdW5kQ29sb3I6IGFueTtcclxuICBzZWxlY3RlZEl0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHBhcnNlZFRhYmxlOiB7IGhlYWRlcnM6IHN0cmluZ1tdLCByb3dzOiBzdHJpbmdbXVtdIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudENhcmV0UG9zaXRpb246IGFueTtcclxuICB1c2VyUm9sZTogYW55W10gPSBbXTtcclxuICBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRIZWFkQmdDb2xvcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmdldFVzZXJSb2xlcygpXHJcblxyXG4gICAgXHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGUoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjNDAzRjRBICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjRDBEMEQwICFpbXBvcnRhbnQnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGVDbHIoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJyNmZmYgIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnIzAwMCAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI0ZGRkZGRiAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI0QwRDBEMCAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQmdDbHIoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJyMyODI4MjggIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnI0YzRjNGMyAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQm9yZGVyVG9wKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgIzAwMCAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI2ZmZiAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1sncGxhY2VIb2xkZXInXSkge1xyXG4gICAgICB0aGlzLmluc2VydEF0Q2FyZXQodGhpcy5wbGFjZUhvbGRlcilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlcG9ydElkJ10pIHtcclxuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncmVwb3J0SWQnLCB0aGlzLnJlcG9ydElkKVxyXG4gICAgfSBcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snVXNlclJvbGUnXSkgeyBcclxuICAgICAgdGhpcy5nZXRVc2VyUm9sZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmluaXRFZGl0b3IoKTtcclxuICAgIHRoaXMuY2hlY2tQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5zZXR1cEhpc3RvcnkoKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdF9GdW5jKHRoaXMuZWRpdG9yVGV4dClcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbmNoYW5nZScsICgpID0+IHtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZVN0YXRlcygpO1xyXG4gICAgICB0aGlzLmNoZWNrRm9ybWF0QmxvY2soKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKTtcclxuICAgIHRoaXMuYWRkQ2xpY2tMaXN0ZW5lclRvRWxlbWVudHMoKTtcclxuICAgIC8vIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHBhcmFtc1snZGF0YSddKTtcclxuICAgIC8vICAgaWYgKGRhdGEuZWRpdGVkSU1HKSB7XHJcbiAgICAvLyAgICAgY29uc3QgaW1nVXJsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnKTtcclxuICAgIC8vICAgICBpZiAoaW1nVXJsKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLnJlcGxhY2VJbWFnZVNyYyhpbWdVcmwsIGRhdGEuaW5kZXguaW5kZXgpXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJyk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pXHJcbiAgfVxyXG5cclxuICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5vbkZ1bGxzY3JlZW5DaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgSXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgdG9nZ2xlRnVsbHNjcmVlbjEoKSB7XHJcbiAgICAgIHRoaXMuSXNPcGVuID0gIXRoaXMuSXNPcGVuO1xyXG4gICAgICB0aGlzLmlzT3Blbi5lbWl0KHRoaXMuSXNPcGVuKVxyXG4gICAgICBpZiAodGhpcy5Jc09wZW4pIHsgXHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuLmVudGVyKHRoaXMuVGV4dEVkaXRvci5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW4uZXhpdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICBwcml2YXRlIG9uRnVsbHNjcmVlbkNoYW5nZSA9ICgpID0+IHtcclxuICAgIGlmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcclxuICAgICAgLy8gV2hlbiBmdWxsc2NyZWVuIG1vZGUgaXMgZXhpdGVkXHJcbiAgICAgIHRoaXMuSXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNPcGVuLmVtaXQodGhpcy5Jc09wZW4pO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgXHJcbiAgLy8gZW50ZXJGdWxsc2NyZWVuVmlkZW8oKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnZXZlbnQ6JywgZXZlbnQpO1xyXG4gIC8vICAgY29uc3QgZnVsbHNjcmVlbiA9IGV2ZW50O1xyXG4gIC8vICAgdGhpcy5pc09wZW4gPSBldmVudDtcclxuICAvLyAgIGlmIChmdWxsc2NyZWVuKSB7XHJcbiAgLy8gICAgIHRoaXMuZnVsbHNjcmVlbi5lbnRlcih0aGlzLlRleHRFZGl0b3IubmF0aXZlRWxlbWVudCk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmZ1bGxzY3JlZW4uZXhpdCgpXHJcbiAgLy8gICB9XHJcbiAgICBcclxuICAvLyB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5lZGl0b3JUZXh0ID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuaW5pdEVkaXRvcigpO1xyXG4gICAgICB0aGlzLmluaXRfRnVuYyh0aGlzLmVkaXRvclRleHQpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuLy8gIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xyXG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4vLyAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG5cclxuLy8gICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudEVsZW1lbnQ7XHJcbi8vICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdpbWFnZS1jb250YWluZXInO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbi8vICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgdGhpcy5zZWxlY3RlZEltYWdlKTtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBjb25zdCBleGlzdGluZ0J1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuLy8gICAgICAgICBpZiAoZXhpc3RpbmdCdXR0b24pIHtcclxuLy8gICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbi8vICAgICAgICAgLy8gYnV0dG9uLnRleHRDb250ZW50ID0gJ0VkaXQnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSAnRWRpdCBJbWFnZSc7XHJcblxyXG4vLyAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkICNmZmYnO1xyXG4vLyAgICAgICAgIC8vIGJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gJzEwcHgnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMzEzYTQ2JztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG5cclxuLy8gICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4vLyAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuLy8gICAgICAgICAgIHRoaXMuZWRpdEltYWdlKCk7XHJcbi8vICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b24pO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyAgIH1cclxuICAvLyB9XHJcbiAgZ2V0VXNlclJvbGVzKCkge1xyXG4gICAgdGhpcy51c2VyUm9sZSA9IHRoaXMuVXNlclJvbGVcclxuICB9XHJcbiAgLy8gcm9sZUNoZWNrKCkge1xyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnVzZXJSb2xlLmxlbmd0aDsgKytpKSB7XHJcbiAgLy8gICAgIGNvbnN0IHJvbGVOYW1lID0gW11cclxuICAvLyAgICAgICByb2xlTmFtZS5wdXNoKHRoaXMudXNlclJvbGVbaV0/Lm5hbWUpO1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy51c2VyUm9sZVtpXT8ubmFtZTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHJvbGVDaGVjaygpIHtcclxuICAgIGxldCB1c2VyUm9sZU5hbWU6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLnVzZXJSb2xlLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHVzZXJSb2xlTmFtZS5wdXNoKHRoaXMudXNlclJvbGVbaV0/Lm5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZXJSb2xlTmFtZTtcclxuICB9XHJcblxyXG5cclxuLy8gcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4vLyAgIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlQ2hlY2soKTsgLy8gR2V0IHVzZXIgcm9sZXMgZHluYW1pY2FsbHlcclxuLy8gICBjb25zdCBpc0FkbWluID0gcm9sZXMuaW5jbHVkZXMoJ0FkbWluJyk7XHJcbi8vICAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcclxuLy8gICBjb25zdCBpc0FwcHJvdmVyID0gcm9sZXMuaW5jbHVkZXMoJ0FwcHJvdmVyJyk7XHJcbiAgXHJcbi8vICAgaWYgKGlzQ3JlYXRvciB8fCBpc0FkbWluKSB7XHJcbi8vICAgICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4vLyAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG4vLyAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50RWxlbWVudDtcclxuLy8gICAgICAgICBpZiAoIWNvbnRhaW5lciB8fCBjb250YWluZXIuY2xhc3NOYW1lICE9PSAnaW1hZ2UtY29udGFpbmVyJykge1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2ltYWdlLWNvbnRhaW5lcic7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIFxyXG4vLyAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShjb250YWluZXIsIHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3RlZEltYWdlKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGNvbnN0IGV4aXN0aW5nQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4vLyAgICAgICAgIGlmIChleGlzdGluZ0J1dHRvbikge1xyXG4vLyAgICAgICAgICAgZXhpc3RpbmdCdXR0b24ucmVtb3ZlKCk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuLy8gICAgICAgICBidXR0b24udGV4dENvbnRlbnQgID0gJ0VkaXQgSW1hZ2UnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnOyBcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCAjZmZmJzsgXHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gJyMzMTNhNDYnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcblxyXG4vLyAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbi8vICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4vLyAgICAgICAgICAgdGhpcy5lZGl0SW1hZ2UoKTtcclxuLy8gICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblxyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbi8vICAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4vLyAgICAgICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4gYnV0dG9uLnJlbW92ZSgpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSk7XHJcbi8vICAgfVxyXG4vLyAgIH1cclxuICAvLyB9XHJcbiAgcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlQ2hlY2soKTsgLy8gR2V0IHVzZXIgcm9sZXMgZHluYW1pY2FsbHlcclxuICBjb25zdCBpc0FkbWluID0gcm9sZXMuaW5jbHVkZXMoJ0FkbWluJyk7XHJcbiAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcclxuXHJcbiAgaWYgKGlzQ3JlYXRvciB8fCBpc0FkbWluKSB7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcclxuICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcbiAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnaW1hZ2UtY29udGFpbmVyJztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShjb250YWluZXIsIHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0VkaXQgSW1hZ2UnO1xyXG4gICAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9ICdpbWFnZS1lZGl0LWJ1dHRvbiBidG4gYnRuLXNtJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUubGVmdCA9ICc1MCUnO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCAjZmZmJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMzEzYTQ2JztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcclxuXHJcbiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRJbWFnZSgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRWRpdEJ1dHRvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gTW9uaXRvciBlZGl0b3IgY29udGVudCBjaGFuZ2VzIHRvIGhhbmRsZSBpbWFnZSBkZWxldGlvblxyXG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgICBjb25zdCBidXR0b25zID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBidXR0b24ucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGlmIChjb250YWluZXIgJiYgIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbWcnKSkge1xyXG4gICAgICAgICAgICBidXR0b24ucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgYnV0dG9uIGlmIHRoZSBhc3NvY2lhdGVkIGltYWdlIGlzIGdvbmVcclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOyAvLyBDbGVhbiB1cCB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gT2JzZXJ2ZSBjaGFuZ2VzIGluIHRoZSBlZGl0b3JcclxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSByZW1vdmVFZGl0QnV0dG9ucygpIHtcclxuICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmltYWdlLWVkaXQtYnV0dG9uJyk7XHJcbiAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IGJ1dHRvbi5yZW1vdmUoKSk7XHJcbiAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcclxufVxyXG5cclxuXHJcbiAgLy8gcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbiAgLy8gY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vIGlmIChlZGl0b3IpIHtcclxuICAvLyAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgLy8gICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lNRycpIHtcclxuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAvLyAgICAgICB0aGlzLmltYWdlRWRpdFVybCA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5zcmM7XHJcblxyXG4gIC8vICAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGltYWdlXHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgaWYgKGltYWdlc1tpXSA9PT0gdGhpcy5zZWxlY3RlZEltYWdlKSB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpO1xyXG4gIC8vICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gIC8vICAgICAgICAgdGhpcy5vblRleHRTZWxlY3QoKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gIC8vIH1cclxuICBcclxuICBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0VsZW1lbnRzKCkge1xyXG4gIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnVEQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEgnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGFyZ2V0LmNsb3Nlc3QoJ3RhYmxlJykgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YXJnZXQudGFnTmFtZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGNlbGxzW2ldID09PSB0YXJnZXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdQJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NQQU4nIHx8IHRhcmdldC50YWdOYW1lID09PSAnRElWJykge1xyXG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFyZ2V0LnRhZ05hbWUpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHBhcmFncmFwaHNbaV0gPT09IHRhcmdldCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgfVxyXG5cclxucmVwbGFjZUltYWdlU3JjKG5ld1NyYzogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gIGlmIChlZGl0b3IpIHtcclxuICAgIGVkaXRvci5mb2N1cygpXHJcbiAgICBjb25zdCBpbWFnZXMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0lNRycpO1xyXG4gICAgaWYgKGluZGV4ID49IDAgKSB7XHJcbiAgICAgIGltYWdlc1tpbmRleF0uc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpO1xyXG4gICAgfSBcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIGluaXRFZGl0b3IoKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIGVkaXRvciBjb250ZW50IGFuZCBsaXN0ZW5lcnNcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLmVkaXRvclRleHQ7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGRpc2FibGVkIHN0YXRlIGlmIG5lY2Vzc2FyeVxyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgVkFMVUUgPSB2YWx1ZVxyXG4gICAgICB0aGlzLmVkaXRvclRleHQgPSBWQUxVRTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShWQUxVRSk7XHJcbiAgICAgIHRoaXMuZWRpdG9yVGV4dENoYW5nZS5lbWl0KFZBTFVFKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseUltYWdlU3R5bGVzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGRpdi5pbm5lckhUTUwgPSBjb250ZW50O1xyXG4gICAgY29uc3QgaW1hZ2VzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xyXG4gICAgaW1hZ2VzLmZvckVhY2goaW1nID0+IHtcclxuICAgICAgaWYgKGltZy5zdHlsZS5tYXhXaWR0aCA+PSAnNzAwcHgnKSB7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzcwMHB4JztcclxuICAgICAgICAvLyBpbWcud2lkdGggPSAzMDA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcclxuICB9XHJcblxyXG4gIC8vIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcclxuICAvLyAgIGlmIChodG1sKSB7XHJcbiAgLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICAgIGlmIChlZGl0b3IpIHsgXHJcbiAgLy8gICAgICAgZWRpdG9yLmZvY3VzKClcclxuICAvLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gaHRtbDtcclxuICAvLyAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4gIC8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLnNhbml0aXplZENvbnRlbnQgYXMgc3RyaW5nO1xyXG4gIC8vICAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgICAgICAgZWRpdG9yLmZvY3VzKClcclxuICAvLyAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBcclxuLy8gICBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbi8vICAgaWYgKGh0bWwpIHtcclxuLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbi8vICAgICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XHJcbiAgICAgIFxyXG4vLyAgICAgICB0aGlzLnNldEVkaXRvckNvbnRlbnQoaHRtbCk7XHJcblxyXG4vLyAgICAgICAvLyBTZXQgdXAgYSBNdXRhdGlvbk9ic2VydmVyIHRvIGhhbmRsZSBjb250ZW50IGNoYW5nZXNcclxuLy8gICAgICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yKTtcclxuXHJcbi8vICAgICAgIC8vIE1vdmUgdGhlIGNhcmV0IHRvIHRoZSBlbmQgYWZ0ZXIgaW5pdGlhbCBjb250ZW50IHNldHVwXHJcbi8vICAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKTtcclxuXHJcbi8vICAgICAgIC8vIFRyYWNrIGNhcmV0IHBvc2l0aW9uIG9uIG1vdXNlIGNsaWNrXHJcbi8vICAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuLy8gICAgICAgICBpZiAoZWRpdG9yKSB7ICAvLyBFbnN1cmUgZWRpdG9yIGlzIG5vdCBudWxsXHJcbi8vICAgICAgICAgICAvLyB0aGlzLnRyYWNrQ2FyZXRQb3NpdGlvbihlZGl0b3IpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBwcml2YXRlIHNldEVkaXRvckNvbnRlbnQoaHRtbDogc3RyaW5nKSB7XHJcbi8vICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICAvLyBTYW5pdGl6ZSBhbmQgYXBwbHkgc3R5bGVzIHRvIHRoZSBIVE1MXHJcbi8vICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4vLyAgICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBwcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbi8vICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbi8vICAgICAvLyBVcGRhdGUgbW9kZWwgd2l0aCB0aGUgY3VycmVudCBjb250ZW50XHJcbi8vICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XHJcbi8vICAgfSk7XHJcblxyXG4vLyAgIG9ic2VydmVyLm9ic2VydmUoZWRpdG9yLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcclxuLy8gfVxyXG5cclxuLy8gVGhpcyBmdW5jdGlvbiB0cmFja3MgdGhlIGNhcmV0IHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBtb3VzZSBjbGlja1xyXG5wcml2YXRlIHRyYWNrQ2FyZXRQb3NpdGlvbihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3Qgc3RhcnROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG5cclxuXHJcbiAgICAvLyBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGluc2VydCBjb250ZW50IG9yIHBlcmZvcm0gYWN0aW9ucyBiYXNlZCBvbiB0aGUgY2FyZXQgcG9zaXRpb25cclxuICAgIC8vIEV4YW1wbGU6IFNhdmUgdGhlIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24gZm9yIGZ1dHVyZSB1c2VcclxuICAgIHRoaXMuY3VycmVudENhcmV0UG9zaXRpb24gPSB7IG5vZGU6IHN0YXJ0Tm9kZSwgb2Zmc2V0OiBzdGFydE9mZnNldCB9O1xyXG4gIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gTWV0aG9kIHRvIGdldCBjYXJldCBwb3NpdGlvbiBhbmQgaW5zZXJ0IG5ldyBkYXRhXHJcbnByaXZhdGUgaW5zZXJ0QXRDYXJldChuZXdEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgXHJcbiAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCByYW5nZSAoY2FyZXQgcG9zaXRpb24pXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50IHRvIGluc2VydCAoYWxsb3dzIGhhbmRsaW5nIEhUTUwgc3RyaW5ncylcclxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGVtcERpdi5pbm5lckhUTUwgPSBuZXdEYXRhO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgbmV3IGRhdGEgdG8gdGhlIGZyYWdtZW50IChzdXBwb3J0cyBIVE1MIGluc2VydGlvbilcclxuICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbnNlcnQgdGhlIGZyYWdtZW50IGF0IHRoZSBjYXJldCBwb3NpdGlvblxyXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsgLy8gUmVtb3ZlIGFueSBzZWxlY3RlZCBjb250ZW50IGlmIGFwcGxpY2FibGVcclxuICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpO1xyXG5cclxuICAgIC8vIE1vdmUgdGhlIGNhcmV0IGFmdGVyIHRoZSBpbnNlcnRlZCBjb250ZW50XHJcbiAgICBjb25zdCBsYXN0Q2hpbGQgPSBmcmFnbWVudC5sYXN0Q2hpbGQ7XHJcblxyXG4gICAgaWYgKGxhc3RDaGlsZCkge1xyXG4gICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGxhc3RDaGlsZCk7XHJcbiAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGxhc3RDaGlsZCk7XHJcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnBsYWNlSG9sZGVyUmVtb3ZlLmVtaXQoKVxyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vICAgLy8gTW92ZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBlZGl0b3IgY29udGVudFxyXG4vLyAgIHByaXZhdGUgbW92ZUNhcmV0VG9FbmQoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4vLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgXHJcbi8vICAgICBpZiAoZWRpdG9yLmxhc3RDaGlsZCkge1xyXG4vLyAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuLy8gICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBDb2xsYXBzZSB0byB0aGUgZW5kXHJcbi8vICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbi8vICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICBcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbiAgXHJcbiAgXHJcblxyXG5cclxuICBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbiAgaWYgKGh0bWwpIHtcclxuICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XHJcbiAgICAgIHRoaXMuc2V0RWRpdG9yQ29udGVudChodG1sKTtcclxuXHJcbiAgICAgIC8vIFNldCB1cCBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gaGFuZGxlIGNvbnRlbnQgY2hhbmdlc1xyXG4gICAgICB0aGlzLnNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBhZnRlciBpbml0aWFsIGNvbnRlbnQgc2V0dXBcclxuICAgICAgdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xyXG4gICAgICAvLyAgVHJhY2sgY2FyZXQgcG9zaXRpb24gb24gbW91c2UgY2xpY2tcclxuICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgIGlmIChlZGl0b3IpIHsgIC8vIEVuc3VyZSBlZGl0b3IgaXMgbm90IG51bGxcclxuICAgICAgICAgIHRoaXMudHJhY2tDYXJldFBvc2l0aW9uKGVkaXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcblxyXG5wcml2YXRlIHNldEVkaXRvckNvbnRlbnQoaHRtbDogc3RyaW5nKSB7XHJcbiAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICAvLyBTYW5pdGl6ZSBhbmQgYXBwbHkgc3R5bGVzIHRvIHRoZSBIVE1MXHJcbiAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAvLyBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kIGFmdGVyIGNvbnRlbnQgY2hhbmdlc1xyXG4gICAgLy8gdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xyXG4gICAgLy8gVXBkYXRlIG1vZGVsIHdpdGggdGhlIGN1cnJlbnQgY29udGVudFxyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4gIH0pO1xyXG5cclxuICBvYnNlcnZlci5vYnNlcnZlKGVkaXRvciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XHJcbn1cclxuXHJcbnByaXZhdGUgbW92ZUNhcmV0VG9FbmQoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgXHJcbiAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBDb2xsYXBzZSB0byB0aGUgZW5kXHJcbiAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAgIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcclxuLy8gICBpZiAoaHRtbCkge1xyXG4vLyAgICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbi8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSBodG1sO1xyXG5cclxuLy8gICAgICAgLy8gU2FuaXRpemUgdGhlIGNvbnRlbnQgYW5kIGFwcGx5IHN0eWxlc1xyXG4vLyAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4vLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5zYW5pdGl6ZWRDb250ZW50IGFzIHN0cmluZztcclxuXHJcbi8vICAgICAgIC8vIFBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50XHJcbi8vICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuLy8gICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBcclxuLy8gICAgICAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcclxuLy8gICAgICAgICAvLyBTZXQgdGhlIHJhbmdlIGF0IHRoZSBlbmQgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnRcclxuLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuLy8gICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7IC8vIGNvbGxhcHNlIHRvIHRoZSBlbmRcclxuLy8gICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbi8vICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG5cclxuLy8gICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY2FyZXQgcmVtYWlucyBhdCB0aGUgZW5kIGFmdGVyIG5ldyBjb250ZW50IGlzIGFkZGVkXHJcbi8vICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbi8vICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICBcclxuLy8gICAgICAgICAgIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XHJcbi8vICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpO1xyXG4vLyAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7IC8vIGNvbGxhcHNlIHRvIHRoZSBlbmRcclxuLy8gICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbiAgZm9ybWF0KGNvbW1hbmQ6IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgIGlmIChjb21tYW5kID09PSAnc3Vic2NyaXB0Jykge1xyXG4gICAgICAgIHRoaXMuaXNTdWJzY3JpcHRBY3RpdmUgPSAhdGhpcy5pc1N1YnNjcmlwdEFjdGl2ZTtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3Vic2NyaXB0JywgZmFsc2UsICcnKTtcclxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09PSAnc3VwZXJzY3JpcHQnKSB7XHJcbiAgICAgICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gIXRoaXMuaXNTdXBlcnNjcmlwdEFjdGl2ZTtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3VwZXJzY3JpcHQnLCBmYWxzZSwgJycpOztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdmFsdWUgPz8gJycpO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgdGFnID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bPD5dL2csICcnKVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZvcm1hdEJsb2NrID0gdGhpcy5mb3JtYXRCbG9ja0RlY29kZSh0YWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgIHRoaXMuY2hlY2tBY3RpdmVTdGF0ZXMoKTtcclxuICAgICB0aGlzLmNoZWNrRm9ybWF0QmxvY2soKTtcclxuICB9XHJcblxyXG4gIGNoZWNrQWN0aXZlU3RhdGVzKCkge1xyXG4gICAgdGhpcy5pc0JvbGRBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpO1xyXG4gICAgdGhpcy5pc0l0YWxpY0FjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdpdGFsaWMnKTtcclxuICAgIHRoaXMuaXNVbmRlcmxpbmVBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJyk7XHJcbiAgICB0aGlzLmlzU3RyaWtldGhyb3VnaEFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdHJpa2V0aHJvdWdoJyk7XHJcbiAgICB0aGlzLmlzU3Vic2NyaXB0QWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpO1xyXG4gICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0Jyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0Zvcm1hdEJsb2NrKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBjb25zdCBmb3JtYXRCbG9jayA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRm9ybWF0QmxvY2sgPSB0aGlzLmZvcm1hdEJsb2NrRGVjb2RlKGZvcm1hdEJsb2NrKTtcclxuICAgICAgLy8gWW91IGNhbiBmdXJ0aGVyIGhhbmRsZSB0aGUgZm9ybWF0QmxvY2sgdmFsdWUgYXMgbmVlZGVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRCbG9ja0RlY29kZShkYXRhOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgc3dpdGNoIChkYXRhKSB7XHJcbiAgICAgIGNhc2UgJ2gxJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2gyJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2gzJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g0JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g1JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g2JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3AnOlxyXG4gICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VGb250KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gZXZlbnQ7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9udE5hbWUnLCBmYWxzZSwgdGhpcy5zZWxlY3RlZEZvbnQpO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0Q29kZUJsb2NrKCkge1xyXG4gICAgY29uc3QgY29kZSA9IGBcclxuICAgICAgPHByZSBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICAgICAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcclxuICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcclxuICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xyXG4gICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1wiPlxyXG4gICAgICAgIDxjb2RlIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogTWVubG8sIE1vbmFjbywgQ29uc29sYXMsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1wiIGNsYXNzPVwibGFuZ3VhZ2UtaHRtbFwiPkluc2VydCBjb2RlIGhlcmUuLi48L2NvZGU+XHJcbiAgICAgIDwvcHJlPlxyXG4gICAgYDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hhbmdlRm9udFNpemUoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvbnRTaXplJywgZmFsc2UsICc3Jyk7XHJcbiAgLy8gICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vICAgaWYgKGVkaXRvcikge1xyXG4gIC8vICAgICBsZXQgZm9udEVsZW1lbnRzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb250Jyk7XHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgaWYgKGZvbnRFbGVtZW50c1tpXS5zaXplID09IFwiN1wiKSB7XHJcbiAgLy8gICAgICAgICBmb250RWxlbWVudHNbaV0ucmVtb3ZlQXR0cmlidXRlKFwic2l6ZVwiKTtcclxuICAvLyAgICAgICAgIGZvbnRFbGVtZW50c1tpXS5zdHlsZS5mb250U2l6ZSA9IHRoaXMuc2VsZWN0ZWRGb250U2l6ZSArICdweCc7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIGNoYW5nZUZvbnRTaXplKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIFxyXG4gICAgaWYgKHNlbGVjdGVkVGV4dCAmJiBzZWxlY3RlZFRleHQucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGVkVGV4dC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IHRoaXMuc2VsZWN0ZWRGb250U2l6ZSArICdweCc7XHJcbiAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhzcGFuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExpbmsoKSB7XHJcbiAgICBsZXQgdXJsID0gcHJvbXB0KFwiRW50ZXIgdGhlIGxpbmsgaGVyZTogXCIsIFwiaHR0cDovL1wiKTtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjcmVhdGVMaW5rXCIsIGZhbHNlLCB1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0c0ltYWdlKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgbGV0IGltYWdlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2VJbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGlmIChpbWFnZUlucHV0KSB7XHJcbiAgICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBoYW5kbGVJbWFnZVVwbG9hZChldmVudDogYW55KSB7XHJcbiAgLy8gICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIC8vICAgaWYgKGZpbGUpIHtcclxuICAvLyAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAvLyAgICAgICBpbWcuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG4gIC8vICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAvLyBDcmVhdGUgdGhlIEhUTUwgc3RyaW5nIHdpdGggdGhlIGV4YWN0IHdpZHRoIGFuZCBoZWlnaHRcclxuICAvLyAgICAgICAgIGNvbnN0IGltZ0hUTUwgPSBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgd2lkdGg9XCIkezc5NH1cIiA+YDtcclxuICAvLyAgICAgICAgIC8vIEluc2VydCB0aGUgaW1hZ2UgaW50byB0aGUgZWRpdG9yXHJcbiAgLy8gICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBpbWdIVE1MKTtcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICB9O1xyXG4gIC8vICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGhhbmRsZUltYWdlVXBsb2FkKGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIGNvbnN0IGVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7IC8vIFJlZmVyZW5jZSB0byB0aGUgZWRpdG9yXHJcblxyXG4gIGlmIChmaWxlICYmIGVkaXRvckVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yRWxlbWVudC5vZmZzZXRXaWR0aDsgLy8gR2V0IHRoZSBlZGl0b3IncyB3aWR0aFxyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1nV2lkdGggPSBpbWcud2lkdGg7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBpbWFnZSB3aWR0aCBleGNlZWRzIHRoZSBlZGl0b3IncyB3aWR0aCwgZml0IGl0IHRvIHRoZSBlZGl0b3JcclxuICAgICAgICBjb25zdCBpbWdIVE1MID1cclxuICAgICAgICAgIGltZ1dpZHRoID4gZWRpdG9yV2lkdGhcclxuICAgICAgICAgICAgPyBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgc3R5bGU9XCIgbWF4LXdpZHRoOiAkezcwMH1weDsgaGVpZ2h0OiBhdXRvO1wiPmBcclxuICAgICAgICAgICAgOiBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgc3R5bGU9XCJ3aWR0aDogJHtpbWdXaWR0aH1weDsgaGVpZ2h0OiBhdXRvO1wiPmA7XHJcbiAgICAgICAgdGhpcy5uZXdJbWFnZUFkZGVkLmVtaXQoKVxyXG4gICAgICAgIC8vIEluc2VydCB0aGUgaW1hZ2UgaW50byB0aGUgZWRpdG9yXHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgaW1nSFRNTCk7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4gIC8vIGFkZFRhYmxlKCkge1xyXG4gIC8vICAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTsgLy8gVGFibGUgd2lkdGggaW4gcGl4ZWxzXHJcbiAgLy8gICBjb25zdCBjb2xzID0gMzsgLy8gTnVtYmVyIG9mIGNvbHVtbnNcclxuICAvLyAgIGNvbnN0IGNlbGxNaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2xzOyAvLyBDYWxjdWxhdGUgbWluaW11bSB3aWR0aCBmb3IgZWFjaCBjZWxsXHJcblxyXG4gIC8vICAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7XCI+YDtcclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7IC8vIE51bWJlciBvZiByb3dzXHJcbiAgLy8gICAgIHRhYmxlICs9ICc8dHIgPic7XHJcbiAgLy8gICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbiAgLy8gICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIiB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDtcIj4mbmJzcDs8L3RkPmA7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGFibGUgKz0gJzwvdHI+JztcclxuICAvLyAgIH1cclxuICAvLyAgICAgdGFibGUgKz0gJzwvdGFibGU+PGJyLyA+JztcclxuICAvLyAgICAgLy8gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xyXG4gIC8vICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIC8vICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0YWJsZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLnRhYmxlQWRkZWQgPSB0cnVlO1xyXG4gIC8vICAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgaGFuZGxlVGFiS2V5KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gU3RvcCBkZWZhdWx0IHRhYmJpbmcgYmVoYXZpb3JcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgY29uc3QgdGFiTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpOyAvLyBDcmVhdGUgYSBzcGFuIGVsZW1lbnQgZm9yIHRoZSB0YWIgc3BhY2VcclxuICAgICAgdGFiTm9kZS5pbm5lckhUTUwgPSBcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wiOyAvLyBGb3VyIG5vbi1icmVha2luZyBzcGFjZXMgdG8gbWltaWMgdGFiXHJcbiAgICAgIFxyXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIHRleHRcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0YWJOb2RlKTsgLy8gSW5zZXJ0IHRoZSB0YWIgc3BhY2UgYXMgc3BhblxyXG4gICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRhYk5vZGUpOyAvLyBNb3ZlIGN1cnNvciBhZnRlciB0aGUgaW5zZXJ0ZWQgc3BhblxyXG4gICAgICByYW5nZS5zZXRFbmRBZnRlcih0YWJOb2RlKTtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuLy8gICBhZGRUYWJsZSgpIHtcclxuLy8gICBjb25zdCB0YWJsZVdpZHRoID0gODI1OyAvLyBUYWJsZSB3aWR0aCBpbiBwaXhlbHNcclxuLy8gICBjb25zdCBjb2xzID0gMzsgLy8gTnVtYmVyIG9mIGNvbHVtbnNcclxuLy8gICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sczsgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggZm9yIGVhY2ggY2VsbFxyXG5cclxuLy8gICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIHN0eWxlPVwid2lkdGg6ICR7dGFibGVXaWR0aH1weDtcIj5gO1xyXG4vLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7IC8vIE51bWJlciBvZiByb3dzXHJcbi8vICAgICB0YWJsZSArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9XCI+YDsgLy8gQWRkIGJvcmRlci1ib3R0b20gdG8gdGhlIHJvd1xyXG4vLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcclxuLy8gICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIndvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4O1wiPiZuYnNwOzwvdGQ+YDtcclxuLy8gICAgIH1cclxuLy8gICAgIHRhYmxlICs9ICc8L3RyPic7XHJcbi8vICAgfVxyXG4vLyAgIHRhYmxlICs9ICc8L3RhYmxlPjxici8+JztcclxuXHJcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4vLyAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4vLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xyXG4vLyAgIH1cclxuXHJcbi8vICAgdGhpcy50YWJsZUFkZGVkID0gdHJ1ZTtcclxuLy8gICB0aGlzLmNoZWNrVGFibGVTZWxlY3Rpb24oKTtcclxuLy8gfVxyXG5hZGRUYWJsZSgpIHtcclxuICBjb25zdCB0YWJsZVdpZHRoID0gODI1O1xyXG4gIGNvbnN0IGNvbHMgPSAzO1xyXG4gIGNvbnN0IGNlbGxNaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2xzO1xyXG5cclxuICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIGlkPVwiY3VzdG9tVGFibGVcIiBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XCI+YDtcclxuXHJcbiAgdGFibGUgKz0gYDx0Ym9keT5gO1xyXG4gIHRhYmxlICs9IGA8dHIgaWQ9XCJ0YWJsZUhlYWRlclJvd1wiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9O1wiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKClcIj5gO1xyXG4gIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbiAgICB0YWJsZSArPSBgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbGxcIiBcclxuICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsgXHJcbiAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyBcclxuICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOyBcclxuICAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG5oZWlnaHQ6MjhweDtcIj48L3RkPmA7XHJcbiAgfVxyXG4gIHRhYmxlICs9IGA8L3RyPmA7XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbiAgICB0YWJsZSArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9XCI+YDtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbiAgICAgIHRhYmxlICs9IGA8dGQgc3R5bGU9XCJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XCI+Jm5ic3A7PC90ZD5gO1xyXG4gICAgfVxyXG4gICAgdGFibGUgKz0gXCI8L3RyPlwiO1xyXG4gIH1cclxuICB0YWJsZSArPSBgPC90Ym9keT48L3RhYmxlPjxici8+YDtcclxuXHJcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZGl0b3JcIik7XHJcbiAgaWYgKGVkaXRvcikge1xyXG4gICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydEhUTUxcIiwgZmFsc2UsIHRhYmxlKTtcclxuICB9XHJcblxyXG4gIHRoaXMudGFibGVBZGRlZCA9IHRydWU7XHJcbiAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XHJcblxyXG4gIC8vIEFkZCBzdHlsZXMgdG8gcHJldmVudCB0YWJsZSBzdHJ1Y3R1cmUgYnJlYWtpbmdcclxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcclxuICBzdHlsZS5pbm5lckhUTUwgPSBgXHJcbiAgI2N1c3RvbVRhYmxlIHtcclxuICAgIHRhYmxlLWxheW91dDogZml4ZWQgIWltcG9ydGFudDtcclxuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDtcclxuICB9XHJcbiAgI2N1c3RvbVRhYmxlIHRyIHtcclxuICAgIGRpc3BsYXk6IHRhYmxlLXJvdyAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAjY3VzdG9tVGFibGUgdGQge1xyXG4gICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xyXG4gICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAjY3VzdG9tVGFibGUgLmhlYWRlci1jZWxsIHtcclxuICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuICB9XHJcbiAgI2N1c3RvbVRhYmxlIC5oZWFkZXItY2VsbCA+IHNwYW4ge1xyXG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XHJcbiAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gICNjdXN0b21UYWJsZSAuaGVhZGVyLWNlbGw6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5gO1xyXG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG59XHJcbi8vIEZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlyc3Qgcm93ICh0aGVhZCkgYmFja2dyb3VuZCBjb2xvclxyXG5zZXRUaGVhZEJnQ29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnN0IHNlbGVjdGVkQ29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcblxyXG4gIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5xdWVyeVNlbGVjdG9yKFwidHJcIikgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgaWYgKGhlYWRlclJvdykge1xyXG4gICAgICBjb25zdCBoZWFkZXJDZWxscyA9IGhlYWRlclJvdy5xdWVyeVNlbGVjdG9yQWxsKFwiLmhlYWRlci1jZWxsXCIpO1xyXG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKChjZWxsOiBFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgKGNlbGwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHNlbGVjdGVkQ29sb3I7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4gIGNoZWNrVGFibGVTZWxlY3Rpb24oZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICh0YXJnZXQgJiYgKHRhcmdldC50YWdOYW1lID09PSAnVEQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEgnKSkge1xyXG4gICAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhcmdldC5jbG9zZXN0KCd0YWJsZScpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcclxuICB9XHJcblxyXG4gIGNoZWNrUGxhY2Vob2xkZXIoKSB7XHJcbiAgICAvLyBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgLy8gaWYgKGVkaXRvcikge1xyXG4gICAgLy8gICB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlID0gZWRpdG9yLmlubmVySFRNTCA9PT0gJycgfHwgZWRpdG9yLmlubmVySFRNTCA9PT0gJzxicj4nO1xyXG4gICAgLy8gICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSkge1xyXG4gICAgLy8gICAgIC8vIGVkaXRvci5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlclwiIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiAjMDAwMDAwXCI+SW5zZXJ0IHRleHQgaGVyZSAuLi48L3NwYW4+JztcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICBsZXQgcGxhY2Vob2xkZXIgPSBlZGl0b3IucXVlcnlTZWxlY3RvcignLnBsYWNlaG9sZGVyJyk7XHJcbiAgICAvLyAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XHJcbiAgICAvLyAgICAgICBlZGl0b3IucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb25Gb2N1cygpIHtcclxuICAgIC8vIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICAvLyBpZiAoZWRpdG9yICYmIHRoaXMuaXNQbGFjZWhvbGRlclZpc2libGUpIHtcclxuICAgIC8vICAgZWRpdG9yLmlubmVySFRNTCA9ICcnO1xyXG4gICAgLy8gICB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBjb2xvckNoYW5nZShuZXdDb2xvcjogc3RyaW5nKSB7XHJcbiAgLy8gICB0aGlzLmNvbG9yID0gbmV3Q29sb3I7XHJcbiAgLy8gfVxyXG5cclxuICBvbkJsdXIoKSB7XHJcbiAgICB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIGFkZFJvdygpIHtcclxuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGxldCBjZWxsID0gcm93Lmluc2VydENlbGwoaSk7XHJcbiAgLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuICAvLyAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBhZGRSb3coKSB7XHJcbiAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGNvbHVtbnMgb2YgdGhlIGZpcnN0IHJvdyB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjZWxsc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKGkpO1xyXG4gICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG5cclxuICAgICAgLy8gQXBwbHkgYm90dG9tIGJvcmRlciBleHBsaWNpdGx5XHJcbiAgICAgIGNlbGwuc3R5bGUuYm9yZGVyQm90dG9tID0gYDJweCBzb2xpZCAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lQ29sb3JGb3JUYWJsZSgpfWA7IC8vIFlvdSBjYW4gcmVwbGFjZSAnYmxhY2snIHdpdGggeW91ciB0aGVtZSBjb2xvclxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gICBhZGRSb3coKSB7XHJcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4vLyAgICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuLy8gICAgIHJvdy5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7IC8vIEFkZCBib3R0b20gYm9yZGVyIHRvIHRoZSByb3dcclxuLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuLy8gICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbChpKTtcclxuLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vIH1cclxuXHJcblxyXG4gIC8vIGRlbGV0ZVJvdygpIHtcclxuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLmRlbGV0ZVJvdygtMSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuLy8gICBkZWxldGVSb3coKSB7XHJcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4vLyAgICAgbGV0IHJvd0luZGV4ID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgXHJcbi8vICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4vLyAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbi8vICAgICAgICAgbGV0IHJvdyA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCd0cicpO1xyXG4vLyAgICAgICAgIGlmIChyb3cpIHtcclxuLy8gICAgICAgICAgIHJvd0luZGV4ID0gcm93LnJvd0luZGV4O1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4gIGRlbGV0ZVJvdygpIHtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IHNlbGVjdGVkTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgY29uc3Qgcm93ID0gc2VsZWN0ZWROb2RlLnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3RyJyk7XHJcblxyXG4gICAgaWYgKHJvdykge1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHJvdy5jbG9zZXN0KCd0YWJsZScpO1xyXG4gICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICB0YWJsZS5kZWxldGVSb3cocm93LnJvd0luZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcbiAgLy8gYWRkQ29sdW1uKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IGNlbGwgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5pbnNlcnRDZWxsKC0xKTtcclxuICAvLyAgICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG4gIC8vICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4vLyAgIGFkZENvbHVtbigpIHtcclxuLy8gICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbi8vICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aCArIDE7IC8vIE5ldyBjb2x1bW4gY291bnRcclxuLy8gICAgIGNvbnN0IHRhYmxlV2lkdGggPSB0aGlzLnNlbGVjdGVkVGFibGUub2Zmc2V0V2lkdGg7XHJcbi8vICAgICBjb25zdCBtaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2x1bW5Db3VudDtcclxuXHJcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbi8vICAgICAgIGxldCBjZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uaW5zZXJ0Q2VsbCgtMSk7XHJcbi8vICAgICAgIGNlbGwuaW5uZXJIVE1MID0gJyZuYnNwOyc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUubWluV2lkdGggPSBgJHttaW5XaWR0aH1weGA7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud29yZFdyYXAgPSAnYnJlYWstd29yZCc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud29yZEJyZWFrID0gJ2JyZWFrLWFsbCc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjZWxscycgbWluV2lkdGhcclxuLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuLy8gICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4gIC8vIH1cclxuICBcclxuICBhZGRDb2x1bW4oKSB7XHJcbiAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGggKyAxOyAvLyBOZXcgY29sdW1uIGNvdW50XHJcbiAgICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5zZWxlY3RlZFRhYmxlLm9mZnNldFdpZHRoO1xyXG4gICAgY29uc3QgbWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sdW1uQ291bnQ7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmluc2VydENlbGwoLTEpO1xyXG4gICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG4gICAgICBjZWxsLnN0eWxlLndvcmRXcmFwID0gJ2JyZWFrLXdvcmQnO1xyXG4gICAgICBjZWxsLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnO1xyXG4gICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcclxuICAgICAgY2VsbC5zdHlsZS5taW5XaWR0aCA9IGAke21pbldpZHRofXB4YDtcclxuICAgICAgY2VsbC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMnB4IHNvbGlkICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVDb2xvckZvclRhYmxlKCl9YFxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBleGlzdGluZyByb3dzJyBib3R0b20gYm9yZGVyXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLnN0eWxlLmJvcmRlckJvdHRvbSA9IHRoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgfVxyXG4gIFxyXG5cclxuXHJcblxyXG5cclxuICBkZWxldGVDb2x1bW4oKSB7XHJcbiAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGxldCBjZWxsID0gc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3RkLCB0aCcpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICBsZXQgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmRlbGV0ZUNlbGwoY2VsbEluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiAgdGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjNDE0MTQxICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjNUY1RjVGICFpbXBvcnRhbnQnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVDb2xvckZvclRhYmxlKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcjNDE0MTQxJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcjNUY1RjVGJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRqdXN0VGFibGVXaWR0aChldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5zdHlsZS53aWR0aCA9IGV2ZW50LnRhcmdldC52YWx1ZSArICdweCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGp1c3RDZWxsV2lkdGgoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHNbal0uc3R5bGUud2lkdGggPSBldmVudC50YXJnZXQudmFsdWUgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRqdXN0Q2VsbEhlaWdodChldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxsc1tqXS5zdHlsZS5oZWlnaHQgPSBldmVudC50YXJnZXQudmFsdWUgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDYXJldFRvRW5kKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWwpIHtcclxuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG9wZW5Db2xvclBpY2tlcihpbnB1dElkOiBzdHJpbmcpIHtcclxuICAvLyAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpO1xyXG4gIC8vICAgaWYgKGlucHV0RWxlbWVudCkge1xyXG4gIC8vICAgICBpbnB1dEVsZW1lbnQuY2xpY2soKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHNldFRleHRDb2xvcihldmVudDogYW55KSB7XHJcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIC8vICAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xyXG4gIC8vICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9yZUNvbG9yJywgZmFsc2UsIGNvbG9yKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHNldEJhY2tncm91bmRDb2xvcihldmVudDogYW55KSB7XHJcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIC8vICAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAvLyAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcclxuICAvLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2hpbGl0ZUNvbG9yJywgZmFsc2UsIGNvbG9yKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZWRTZWxlY3Rpb246IFJhbmdlIHwgbnVsbCA9IG51bGw7XHJcblxyXG5vcGVuQ29sb3JQaWNrZXIoaW5wdXRJZDogc3RyaW5nKSB7XHJcbiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgfVxyXG4gICAgaW5wdXRFbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBzZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xyXG4vLyAgIGlmICh0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XHJcbi8vICAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcclxuXHJcbi8vICAgICAvLyBSZXN0b3JlIHRoZSBzYXZlZCBzZWxlY3Rpb25cclxuLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuLy8gICAgIGlmIChzZWxlY3Rpb24pIHtcclxuLy8gICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5zYXZlZFNlbGVjdGlvbik7XHJcblxyXG4vLyAgICAgICAvLyBBcHBseSB0aGUgY29sb3IgdXNpbmcgYSBzcGFuXHJcbi8vICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcclxuLy8gICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuLy8gICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9IGNvbG9yO1xyXG4vLyAgICAgICBzcGFuLnRleHRDb250ZW50ID0gcmFuZ2UudG9TdHJpbmcoKTtcclxuXHJcbi8vICAgICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGVkIHRleHQgd2l0aCB0aGUgc3R5bGVkIHNwYW5cclxuLy8gICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuLy8gICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuXHJcbi8vICAgICAgIC8vIENsZWFyIHRoZSBzYXZlZCBzZWxlY3Rpb25cclxuLy8gICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4gIC8vIH1cclxuLy8gICBzZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xyXG4vLyAgIGlmICh0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XHJcbi8vICAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcclxuXHJcbi8vICAgICAvLyBSZXN0b3JlIHRoZSBzYXZlZCBzZWxlY3Rpb25cclxuLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuLy8gICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbi8vICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcclxuLy8gICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG5cclxuLy8gICAgICAgLy8gR2V0IHNlbGVjdGVkIGVsZW1lbnRzXHJcbi8vICAgICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHJhbmdlLmNsb25lQ29udGVudHMoKTtcclxuLy8gICAgICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKHNlbGVjdGVkQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8g4pyFIEV4cGxpY2l0bHkgY2FzdCB0byBIVE1MRWxlbWVudFtdXHJcblxyXG4vLyAgICAgICAvLyBBcHBseSBjb2xvciB0byBlYWNoIGVsZW1lbnQgd2l0aG91dCBtb2RpZnlpbmcgc3RydWN0dXJlXHJcbi8vICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbi8vICAgICAgICAgZWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuLy8gICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAvLyBBcHBseSBjb2xvciB0byB0aGUgdG9wLWxldmVsIHRleHQgbm9kZXMgKHdpdGhvdXQgd3JhcHBpbmcgdGhlbSlcclxuLy8gICAgICAgQXJyYXkuZnJvbShzZWxlY3RlZENvbnRlbnQuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4vLyAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBub2RlLnRleHRDb250ZW50Py50cmltKCkgIT09IFwiXCIpIHtcclxuLy8gICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XHJcbi8vICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbi8vICAgICAgICAgICAgIHBhcmVudC5zdHlsZS5jb2xvciA9IGNvbG9yO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAvLyBSZXBsYWNlIHNlbGVjdGVkIGNvbnRlbnRcclxuLy8gICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuLy8gICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzZWxlY3RlZENvbnRlbnQpO1xyXG5cclxuLy8gICAgICAgLy8gQ2xlYXIgc2F2ZWQgc2VsZWN0aW9uXHJcbi8vICAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBudWxsO1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICBjb25zb2xlLmxvZyhcIkNsaWNrZWQgc2V0VGV4dENvbG9yXCIpO1xyXG4gIGlmICghdGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4gICAgY29uc29sZS53YXJuKFwiTm8gc2F2ZWQgc2VsZWN0aW9uIGF2YWlsYWJsZSFcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICB0aGlzLnNlbGVjdGVkVGV4dENvbG9yID0gY29sb3I7XHJcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG4gICAgY29uc29sZS5lcnJvcihcIk5vIHZhbGlkIHNlbGVjdGlvbiBmb3VuZCFcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRTZWxlY3Rpb24pO1xyXG4gIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcclxuXHJcbiAgY29uc3QgZ2V0VGFibGVDZWxsID0gKG5vZGU6IE5vZGUgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICBpZiAoY3VycmVudE5vZGUgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoY3VycmVudE5vZGUgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICBpZiAoY3VycmVudE5vZGUudGFnTmFtZSA9PT0gXCJURFwiIHx8IGN1cnJlbnROb2RlLnRhZ05hbWUgPT09IFwiVEhcIikge1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9O1xyXG5cclxuICBjb25zdCB0YWJsZUNlbGwgPVxyXG4gICAgZ2V0VGFibGVDZWxsKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSB8fFxyXG4gICAgZ2V0VGFibGVDZWxsKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB8fFxyXG4gICAgZ2V0VGFibGVDZWxsKHJhbmdlLmVuZENvbnRhaW5lcik7XHJcblxyXG4gIGlmICh0YWJsZUNlbGwpIHtcclxuICAgIGNvbnNvbGUubG9nKGBQcm9jZXNzaW5nICR7dGFibGVDZWxsLnRhZ05hbWV9IGVsZW1lbnRgKTtcclxuICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFNlbGVjdGVkIHRleHQgaW4gJHt0YWJsZUNlbGwudGFnTmFtZX06YCwgc2VsZWN0ZWRUZXh0KTtcclxuICAgICAgY29uc3QgdGV4dE5vZGVzOiBUZXh0W10gPSBbXTtcclxuICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihcclxuICAgICAgICB0YWJsZUNlbGwsXHJcbiAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXHJcbiAgICAgICAgbnVsbFxyXG4gICAgICApO1xyXG4gICAgICBsZXQgbm9kZTogVGV4dCB8IG51bGw7XHJcblxyXG4gICAgICB3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSBhcyBUZXh0IHwgbnVsbCkpIHtcclxuICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiB0ZXh0Tm9kZXMpIHtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWxlY3RlZFRleHQpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgYEZvdW5kIHNlbGVjdGVkIHRleHQgaW4gJHt0YWJsZUNlbGwudGFnTmFtZX0gdGV4dCBub2RlYFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgICAgIGNvbnN0IGJlZm9yZVRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KTtcclxuICAgICAgICAgIGNvbnN0IGFmdGVyVGV4dCA9IHRleHQuc2xpY2UoaW5kZXggKyBzZWxlY3RlZFRleHQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuICAgICAgICAgIGlmIChiZWZvcmVUZXh0KVxyXG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiZWZvcmVUZXh0KSk7XHJcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICAgIGlmIChhZnRlclRleHQpXHJcbiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFmdGVyVGV4dCkpO1xyXG5cclxuICAgICAgICAgIHRleHROb2RlLnJlcGxhY2VXaXRoKGZyYWdtZW50KTtcclxuICAgICAgICAgIGJyZWFrOyAvLyBBcHBseSBvbmx5IG9uY2UgcGVyIHNlbGVjdGlvblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIk5vIFRIIG9yIFREIGVsZW1lbnQgZm91bmQgaW4gc2VsZWN0aW9uXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XHJcbn1cclxuXHJcbiAgc2V0QmFja2dyb3VuZENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4gICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG5cclxuICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcclxuXHJcbiAgICAgIC8vIEFwcGx5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzaW5nIGEgc3BhblxyXG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XHJcbiAgICAgIHNwYW4udGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGV4dCB3aXRoIHRoZSBzdHlsZWQgc3BhblxyXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICByYW5nZS5pbnNlcnROb2RlKHNwYW4pO1xyXG5cclxuICAgICAgLy8gQ2xlYXIgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4gICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8vIGNvbG9yQ2hhbmdlZChldmVudDogYW55KSB7XHJcbiAgLy8gICB0aGlzLmNvbG9yID0gZXZlbnQuY29sb3IuaGV4OyBcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBsb2dFdmVudChldmVudDogYW55LCB0cmlnZ2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQ7XHJcbiAgICB0aGlzLnNldFRleHRDb2xvcihjb2xvcilcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBldmVudFxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBldmVudCk7XHJcbiAgICAvLyB0aGlzLmxvZ3MudW5zaGlmdChbdGhpcy5sb2dzLmxlbmd0aCArIDEsIHRyaWdnZXIsIGV2ZW50XSk7XHJcbiAgfVxyXG4gIFxyXG5cclxuICBlZGl0SW1hZ2UoKSB7XHJcbiAgICBsZXQgZGF0YSBcclxuICAgIHN3aXRjaCAodGhpcy5lZGl0b3JGcm9tLm5hbWUpIHtcclxuICAgICAgY2FzZSAnc2VjdGlvbi1jb250ZW50JzpcclxuICAgICAgICBkYXRhID0geyBlZGl0SU1HOiB0cnVlLCBmcm9tOiAnaHRtbEVkaXRvcicsIGluZGV4OiB0aGlzLnNlbGVjdGVkSXRlbUluZGV4LCBpZDogdGhpcy5lZGl0b3JGcm9tLmlkIH07XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGE6IHN0cmluZyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnLCBjb21wcmVzc2VkRGF0YSk7XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGEyID0gY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkodGhpcy5zYW5pdGl6ZWRDb250ZW50KSk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGV4dEVkaXRvcicsIGNvbXByZXNzZWREYXRhMik7XHJcbiAgICAgICAgLy8gYWxlcnQoJ2dvIHRvIGVkaXRvciEnKVxyXG4gICAgICAgIHRoaXMubmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhKTtcclxuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3JlYXRlLWRvY3VtZW50JzpcclxuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcclxuICAgICAgICBkYXRhID0geyBlZGl0SU1HOiB0cnVlLCBmcm9tOiAnY3JlYXRlRG9jdW1lbnQnLCBpbmRleDogdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCwgaWQ6IHRoaXMuZWRpdG9yRnJvbS5pZCwgc2VjdGlvbjogdGhpcy5lZGl0b3JGcm9tLnNlY3Rpb24sIHJlcG9ydFNlY3Rpb25JZDogdGhpcy5lZGl0b3JGcm9tLnJlcG9ydFNlY3Rpb25JZCB9O1xyXG4gICAgICAgIC8vIHRoaXMub3BlbkRpYWxvZyhkYXRhKVxyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhMyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGE0ID0gY29tcHJlc3ModGhpcy5lZGl0b3JUZXh0KTtcclxuXHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJywgY29tcHJlc3NlZERhdGEzKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0ZXh0RWRpdG9yMicsIGNvbXByZXNzZWREYXRhNCk7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSU1HRWRpdG9yKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIG51bGxcclxuICAgICAgICAvLyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcpO1xyXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xyXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RlbXBsYXRlRWRpdG9yJyk7XHJcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndGV4dEVkaXRvcicpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKHRoaXMuZWRpdG9yRnJvbSA9PT0gJ3NlY3Rpb24tY29udGVudCcpIHtcclxuICAgIC8vICAgY29uc3QgZGF0YSA9IHtlZGl0SU1HOiB0cnVlLCBmcm9tOiAnaHRtbEVkaXRvcicsIGluZGV4OiB0aGlzLnNlbGVjdGVkSXRlbUluZGV4fVxyXG4gICAgLy8gICB0aGlzLm5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YSlcclxuICAgIC8vICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmltYWdlRWRpdFVybCkpXHJcbiAgICAvLyAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3RleHRFZGl0b3InLCB0aGlzLmVkaXRvclRleHQpXHJcbiAgICAvLyB9IFxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBvcGVuRGlhbG9nKCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIGxldCBkYXRhOiBhbnk7XHJcbiAgICAvLyAgIGRhdGEgPSBpdGVtXHJcbiAgICAvLyBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEltYWdlRWRpdG9yTW9kYWxDb21wb25lbnQse1xyXG4gICAgLy8gICBtaW5XaWR0aDogJzEwMCUnLCBtaW5IZWlnaHQ6ICcxMDB2aCcsIHBhbmVsQ2xhc3M6ICd0aGVtZS0yQjI5MzYnICxkaXNhYmxlQ2xvc2U6IHRydWUsIGRhdGE6IGRhdGFcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdyZXN1bHQgPT09PiBpbWcgPSAnLCByZXN1bHQpXHJcbiAgICAvLyAgIGNvbnN0IGltZ1VybCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xyXG4gICAgLy8gICAgIGlmIChpbWdVcmwpIHtcclxuICAgIC8vICAgICAgIHRoaXMucmVwbGFjZUltYWdlU3JjKGltZ1VybCwgIHJlc3VsdC5pbmRleC5pbmRleCk7XHJcbiAgICAvLyAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcDInKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VJbWFnZVNSQyhuZXdTcmM6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0aGlzLmVkaXRvclRleHQsICd0ZXh0L2h0bWwnKTtcclxuICAgIGNvbnN0IGltZ1RhZ3MgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xyXG5cclxuICBpZiAoaW1nVGFncyAmJiBpbWdUYWdzLmxlbmd0aCA+IDApIHtcclxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaW1nVGFncy5sZW5ndGgpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSBzcmMgYXR0cmlidXRlIG9mIHRoZSBpbWcgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxyXG4gICAgICBcclxuICAgICAgaW1nVGFnc1tpbmRleF0uc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpO1xyXG4gICAgICB0aGlzLmVkaXRvclRleHQgPSBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgICBcclxuICAgIH0gXHJcbiAgfSBcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbi9pbWFnZS1lZGl0b3InXSwgeyBxdWVyeVBhcmFtczoge2RhdGEgOiBKU09OLnN0cmluZ2lmeShkYXRhKX0gfSlcclxuICB9XHJcblxyXG4gIC8vICBvblRleHRTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgLy8gICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAvLyAgICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCkge1xyXG4gIC8vICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gIC8vICAgICAgICAgdGhpcy50b29sYmFyVG9wID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gIC8vICAgICAgICAgdGhpcy50b29sYmFyTGVmdCA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgKHJlY3Qud2lkdGggLyAyKSAtIDUwO1xyXG4gIC8vICAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gb25UZXh0U2VsZWN0KGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsWSA9ICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbFggPSAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XHJcbiAgICAgICAgdGhpcy50b29sYmFyVG9wID0gcmVjdC50b3AgKyBzY3JvbGxZIC0gNzU7XHJcbiAgICAgICAgdGhpcy50b29sYmFyTGVmdCA9IHJlY3QubGVmdCArIHNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpIC0gMzI1O1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbi8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbi8vICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4vLyAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XHJcbi8vICAgICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKHBhc3RlZFRleHQpKSB7XHJcbi8vICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKHBhc3RlZFRleHQpO1xyXG4vLyAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbCk7XHJcbi8vICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwYXN0ZWRUZXh0KTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuXHJcbiAgLy8gb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgLy8gICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAvLyAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgLy8gICAgIC8vIEhhbmRsZSBpbWFnZSBkYXRhXHJcbiAgLy8gICAgIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRGF0YS5pdGVtcztcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGlmIChpdGVtc1tpXS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBmaWxlID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7XHJcbiAgLy8gICAgICAgICBpZiAoZmlsZSkge1xyXG4gIC8vICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIC8vICAgICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltZ0h0bWwgPSBgPGltZyBzcmM9XCIke2UudGFyZ2V0LnJlc3VsdH1cIiBhbHQ9XCJQYXN0ZWQgSW1hZ2VcIiBzdHlsZT1cIm1heC13aWR0aDogMTAwJTtcIi8+YDtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGltZ0h0bWwpO1xyXG4gIC8vICAgICAgICAgICB9O1xyXG4gIC8vICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgICAgICAgICAgcmV0dXJuOyAvLyBFeGl0IGlmIGFuIGltYWdlIGlzIGhhbmRsZWRcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIC8vIEhhbmRsZSB0ZXh0IG9yIHRhYmxlIGRhdGFcclxuICAvLyAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gIC8vICAgICBpZiAodGhpcy5pc1RhYmxlRGF0YShwYXN0ZWRUZXh0KSkge1xyXG4gIC8vICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShwYXN0ZWRUZXh0KTtcclxuICAvLyAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQocGFzdGVkVGV4dCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaXBib2FyZERhdGEuaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gY2xpcGJvYXJkRGF0YS5pdGVtc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2UgcGFzdGVcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBpbWdIdG1sID0gYDxpbWcgc3JjPVwiJHtlLnRhcmdldC5yZXN1bHR9XCIgYWx0PVwiUGFzdGVkIEltYWdlXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDEwMCU7XCIgLz5gO1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaW1nSHRtbCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwidGV4dC9odG1sXCIpIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBIVE1MIHBhc3RlXHJcbiAgICAgICAgICAvLyBjb25zdCBodG1sRGF0YSA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9odG1sJykpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChodG1sKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWxEYXRhKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBwbGFpbiB0ZXh0IHBhc3RlXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlRGF0YShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpKTtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChodG1sKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY29uc3QgcGxhaW5UZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcclxuICAgICAgICAgIC8vIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQocGxhaW5UZXh0KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRXhjZWxEYXRhKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGh0bWwuaW5jbHVkZXMoJ3htbG5zOm89XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2VcIicpIHx8IFxyXG4gICAgICAgICAgaHRtbC5pbmNsdWRlcygneG1sbnM6eD1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmV4Y2VsXCInKTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRFeGNlbEh0bWxUb1RhYmxlKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XHJcbiAgICByZXR1cm4gdGFibGUgPyB0YWJsZS5vdXRlckhUTUwgOiAnJzsgLy8gRXh0cmFjdCBvbmx5IHRoZSB0YWJsZSBwYXJ0XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBpc1RhYmxlRGF0YSh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcclxuICAgIHJldHVybiByb3dzLmxlbmd0aCA+IDEgJiYgcm93c1swXS5zcGxpdCgnXFx0JykubGVuZ3RoID4gMTtcclxuICB9XHJcblxyXG4gIC8vIGNvbnZlcnRUZXh0VG9UYWJsZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vICAgY29uc3Qgcm93cyA9IHRleHQuc3BsaXQoJ1xcbicpLmZpbHRlcihyb3cgPT4gcm93LnRyaW0oKSAhPT0gJycpO1xyXG4gIC8vICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAocm93ID0+IHtcclxuICAvLyAgICAgY29uc3QgY2VsbHMgPSByb3cuc3BsaXQoJ1xcdCcpLm1hcChjZWxsID0+IGA8dGQgY2xhc3M9XCJweC0xIHB5LTFcIiA+JHtjZWxsfTwvdGQ+YCkuam9pbignJyk7XHJcbiAgLy8gICAgIHJldHVybiBgPHRyIGNsYXNzPVwidGFibGUtYm9yZGVyLXRvcFwiIHN0eWxlPVwiYm9yZGVyLXRvcDogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50XCI+JHtjZWxsc308L3RyPmA7XHJcbiAgLy8gICB9KS5qb2luKCcnKTtcclxuICAvLyAgIHJldHVybiBgPHRhYmxlPiR7dGFibGVSb3dzfTwvdGFibGU+YDtcclxuICAvLyB9XHJcblxyXG4gIGNvbnZlcnRUZXh0VG9UYWJsZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgcm93cyA9IHRleHQuc3BsaXQoJ1xcbicpLmZpbHRlcihyb3cgPT4gcm93LnRyaW0oKSAhPT0gJycpO1xyXG4gICAgY29uc3QgY29sdW1uQ291bnQgPSByb3dzWzBdPy5zcGxpdCgnXFx0JykubGVuZ3RoIHx8IDE7IC8vIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSB0aGUgZmlyc3Qgcm93XHJcbiAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEwMCAvIGNvbHVtbkNvdW50OyAvLyBDYWxjdWxhdGUgY29sdW1uIHdpZHRoXHJcblxyXG4gICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAoKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgY2VsbHMgPSByb3cuc3BsaXQoJ1xcdCcpLm1hcChjZWxsID0+IGBcclxuICAgICAgICA8dGQgY2xhc3M9XCJweC0xIHB5LTEgdGV4dC10cnVuY2F0ZVwiIFxyXG4gICAgICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogJHtjb2x1bW5XaWR0aH0lOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cclxuICAgICAgICAgICR7Y2VsbH1cclxuICAgICAgICA8L3RkPmApLmpvaW4oJycpO1xyXG5cclxuICAgICAgLy8gQWRkIGEgYm9yZGVyLXRvcCBmb3IgYWxsIHJvd3MgZXhjZXB0IHRoZSBmaXJzdCBhbmQgYm9yZGVyLWJvdHRvbSBmb3IgdGhlIGxhc3Qgcm93XHJcbiAgICAgIGNvbnN0IGJvcmRlclRvcCA9IGluZGV4ID09PSAwID8gJycgOiBgYm9yZGVyLXRvcDogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9O2A7XHJcbiAgICAgIGNvbnN0IGJvcmRlckJvdHRvbSA9IGluZGV4ID09PSByb3dzLmxlbmd0aCAtIDEgPyBgYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9O2AgOiAnJztcclxuXHJcbiAgICAgIHJldHVybiBgXHJcbiAgICAgICAgPHRyIFxyXG4gICAgICAgICAgc3R5bGU9XCIke2JvcmRlclRvcH0gJHtib3JkZXJCb3R0b219IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAke2NlbGxzfVxyXG4gICAgICAgIDwvdHI+YDtcclxuICAgIH0pLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDx0YWJsZSBzdHlsZT1cInRhYmxlLWxheW91dDogZml4ZWQ7IHdpZHRoOiAxMDAlO1wiPiBcclxuICAgICAgICAke3RhYmxlUm93c31cclxuICAgICAgPC90YWJsZT5gO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBpbnNlcnRIdG1sQXRDYXJldChodG1sOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKHJhbmdlKSB7XHJcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgICBsZXQgbm9kZTtcclxuICAgICAgd2hpbGUgKChub2RlID0gdGVtcERpdi5maXJzdENoaWxkKSkge1xyXG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShmcmFnKTtcclxuICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJzFweCBzb2xpZCAjRDBEMEQwOyAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcxcHggc29saWQgIzQxNDE0MSAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiBcclxuICBwdWJsaWMgb3BlbkZ1bGxzY3JlZW4oKSB7XHJcbiAgICB2YXIgZWxlbTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0ZXh0RWRpdG9yXCIpO1xyXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG4gICAgaWYgKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcclxuICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3R5bGUgPSB7XHJcbiAgICAgICdtaW4taGVpZ2h0JzogJzkwdmgnLFxyXG4gICAgICAnbWF4LWhlaWdodCc6ICc5MHZoJyxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZUZ1bGxzY3JlZW4oKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdHlsZSA9IHtcclxuICAgICAgICAnbWluLWhlaWdodCc6ICc0MDBweCcsXHJcbiAgICAgICAgJ21heC1oZWlnaHQnOiAnNDAwcHgnLFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNsZWFyVGV4dEVkaXRvcigpIHtcclxuICAgIHRoaXMuZWRpdG9yVGV4dENsZWFyLmVtaXQoKVxyXG4gIH1cclxuXHJcbiAgc2V0dXBIaXN0b3J5KCkge1xyXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHRoaXMub25JbnB1dCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uSW5wdXQoKSB7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBjb25zdCBlZGl0b3JDb250ZW50ID0gZWRpdG9yLmlubmVySFRNTDtcclxuICAgICAgaWYgKHRoaXMuaGlzdG9yeUluZGV4ID09PSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4ICsgMSk7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9yQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xyXG4gICAgfVxyXG4gIH1cclxuICB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMuaGlzdG9yeUluZGV4ID4gMCkge1xyXG4gICAgICB0aGlzLnJlZG9TdGFjay5wdXNoKHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF0pO1xyXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleC0tO1xyXG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5SW5kZXhdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgcmVkb0NvbnRlbnQgPSB0aGlzLnJlZG9TdGFjay5wb3AoKTtcclxuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocmVkb0NvbnRlbnQhKTtcclxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgrKztcclxuICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gcmVkb0NvbnRlbnQhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8gICBmb3JtYXRUZXh0V2l0aERhdGVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbi8vICAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGRldGVjdCBZWVlZLU1NLUREIGZvcm1hdHRlZCBkYXRlc1xyXG4vLyAgIGNvbnN0IGRhdGVSZWdleCA9IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVxcYi9nO1xyXG5cclxuLy8gICAvLyBSZXBsYWNlIGZvdW5kIGRhdGVzIHdpdGggYSBmb3JtYXR0ZWQgdmVyc2lvblxyXG4vLyAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZGF0ZVJlZ2V4LCAoZGF0ZVN0cikgPT4ge1xyXG4vLyAgICAgLy8gQ29udmVydCB0aGUgZGV0ZWN0ZWQgZGF0ZSBzdHJpbmcgaW50byBhIERhdGUgb2JqZWN0XHJcbi8vICAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZVN0cik7XHJcbiAgICBcclxuLy8gICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSB0byAnTW9udGggRGF5LCBZZWFyJyAoZS5nLiwgT2N0b2JlciAxMCwgMjAyNClcclxuLy8gICAgIHJldHVybiBkYXRlT2JqLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7XHJcbi8vICAgICAgIHllYXI6ICdudW1lcmljJyxcclxuLy8gICAgICAgbW9udGg6ICdsb25nJyxcclxuLy8gICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbi8vICAgICB9KTtcclxuLy8gICB9KTtcclxuICAvLyB9XHJcbiAgXHJcbiAgZm9ybWF0VGV4dFdpdGhEYXRlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgWVlZWS1NTS1ERCBmb3JtYXR0ZWQgZGF0ZXNcclxuICBjb25zdCBkYXRlUmVnZXggPSAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1cXGIvZztcclxuXHJcbiAgLy8gUmVwbGFjZSBmb3VuZCBkYXRlcyB3aXRoIGEgZm9ybWF0dGVkIHZlcnNpb25cclxuICByZXR1cm4gdGV4dC5yZXBsYWNlKGRhdGVSZWdleCwgKGRhdGVTdHIpID0+IHtcclxuICAgIC8vIENvbnZlcnQgdGhlIGRldGVjdGVkIGRhdGUgc3RyaW5nIGludG8gYSBEYXRlIG9iamVjdFxyXG4gICAgY29uc3QgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGVTdHIpO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgZGF5LCBtb250aCwgYW5kIHllYXJcclxuICAgIGNvbnN0IGRheSA9IGRhdGVPYmouZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsgLy8gRW5zdXJlIGRheSBpcyB0d28gZGlnaXRzXHJcbiAgICBjb25zdCBtb250aCA9IGRhdGVPYmoudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JyB9KTsgLy8gR2V0IGFiYnJldmlhdGVkIG1vbnRoIG5hbWVcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlT2JqLmdldEZ1bGxZZWFyKCk7IC8vIEdldCBmdWxsIHllYXJcclxuXHJcbiAgICAvLyBGb3JtYXQgdGhlIGRhdGUgYXMgJ2RkL21tbS95eXl5J1xyXG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG59IiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lciBlbHMtdGV4dC1lZGl0b3IgcHgtMFwiIGlkPVwidGV4dEVkaXRvclwiICNmdWxsc2NyZWVuPVwibmd4RnVsbHNjcmVlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dEVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neEZ1bGxzY3JlZW4+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdmaXhlZCdcIiBjbGFzcz1cImJ0bi10b29sYmFyIGVscy1idG4tdG9vbGJhciBwLTIgcHktMiBtYi0wXCIgcm9sZT1cInRvb2xiYXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAncG9pbnRlci1ldmVudHMnOiBkaXNhYmxlVG9vbGJhciA/ICdub25lJyA6ICdhdXRvJyxcclxuICAgICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnLFxyXG4gICAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnXHJcbn1cIlxyXG5hcmlhLWxhYmVsPVwiVG9vbGJhciB3aXRoIGJ1dHRvbiBncm91cHNcIlxyXG5zdHlsZT1cImJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcIlxyXG4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy1mb3JtLXNlbGVjdCBib3JkZXIgZWxzLXRvb2xiYXItZHJvcGRvd24tYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZSB0ZXh0LXN0YXJ0XCIgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwiJzVweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZEZvcm1hdEJsb2NrIHwgdGl0bGVjYXNlfX08L3NwYW4+IDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkZvbnQgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJlbHMtZm9ybS1zZWxlY3QgXCIgc3R5bGU9XCIgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OyBjb2xvcjogI2ZmZjtib3JkZXI6IDJweCBzb2xpZCAjN0Q2RDZEICFpbXBvcnRhbnQ7XCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiIChjaGFuZ2UpPVwiY2hhbmdlRm9udCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzPVwiZWxzLWZvcm0tb3B0aW9uXCIgKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLWZvcm0tc2VsZWN0IGJvcmRlciBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlIHRleHQtc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIFtzdHlsZS5ib3JkZXJdPVwidGhlbWVNb2RlKClcIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDg1cHg7IGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDtcIiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkRm9udCB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgZm9udCBvZiBmb250c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VGb250KGZvbnQpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInB5LTBcIiAgc3R5bGU9XCJoZWlnaHQ6IGZpdC1jb250ZW50O1wiIFtzdHlsZS5jb2xvcl09XCJ0aGVtZU1vZGVDbHIoKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbWUtMiBtci0yIFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnYm9sZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1ib2xkXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0l0YWxpY0FjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNVbmRlcmxpbmVBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC11bmRlcmxpbmVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdHJpa2V0aHJvdWdoLXZhcmlhbnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cInRleHRDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVGV4dENvbG9yXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW3N0eWxlLmNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ2JnQ29sb3JQaWNrZXInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1saW5lIG1zLTIgYm9yZGVyXCIgW3N0eWxlLmJvcmRlci1sZWZ0XT1cInRoZW1lTW9kZUNsclZlcnRpY2FsTGluZSgpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LW51bWJlcmVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cInFsLWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiAgYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJvcGRvd25CYXNpYzFcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBuZ2JEcm9wZG93blRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1sZWZ0IFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDNweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUxlZnQnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1jZW50ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gdGV4dC1kYXJrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlSaWdodCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1yaWdodFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUZ1bGwnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWxpbmUgbXMtMiBib3JkZXJcIiBbc3R5bGUuYm9yZGVyLWxlZnRdPVwidGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKClcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdWJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3VwZXJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkTGluaygpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWxpbmstdmFyaWFudFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktaW1hZ2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImltYWdlSW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJoYW5kbGVJbWFnZVVwbG9hZCgkZXZlbnQpXCIgYWNjZXB0PVwiaW1hZ2UvKlwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRUYWJsZSgpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29sdW1uKClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtY29sdW1uLXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW4oKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBcclxuICAgICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidEhlYWRCZ0NvbG9yXCIgXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCd0SGVhZGJnQ29sb3JQaWNrZXInKVwiIFxyXG4gICAgICAgID4gXHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtZWRpdFwiPjwvaT4gXHJcbiAgICAgICAgPC9idXR0b24+IFxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgIHR5cGU9XCJjb2xvclwiIFxyXG4gICAgICAgICAgaWQ9XCJ0SGVhZGJnQ29sb3JQaWNrZXJcIiBcclxuICAgICAgICAgIHN0eWxlPVwiIFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7IFxyXG4gICAgICAgICAgICB0b3A6IDEwMCU7IFxyXG4gICAgICAgICAgICBsZWZ0OiAwOyBcclxuICAgICAgICAgICAgei1pbmRleDogMTAwOyBcclxuICAgICAgICAgICAgb3BhY2l0eTogMDsgXHJcbiAgICAgICAgICBcIiBcclxuICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGhlYWRCZ0NvbG9yKCRldmVudClcIiBcclxuICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwidW5kbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXVuZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwicmVkbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXJlZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyVGV4dEVkaXRvcigpXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiB3aWR0aDogZml0LWNvbnRlbnQgIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktY2xvc2UtY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZUZ1bGxzY3JlZW4xKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSXNPcGVuOyBlbHNlIGZ1bGxzY3JlZW5JY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mdWxsc2NyZWVuLWV4aXRcIj48L2k+IDwhLS0gQ29sbGFwc2UgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Z1bGxzY3JlZW5JY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZnVsbHNjcmVlblwiPjwvaT4gPCEtLSBFeHBhbmQgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdidWJibGUnXCIgY2xhc3M9XCJidWJibGUtdG9vbGJhciBib3JkZXIgcC0yXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xiYXJUb3AsICdsZWZ0LnB4JzogdG9vbGJhckxlZnQsICdkaXNwbGF5Jzogc2hvd1Rvb2xiYXIgPyAnYmxvY2snIDogJ25vbmUnfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJGb250IE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImVscy1mb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYm9sZFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzSXRhbGljQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2l0YWxpYycpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzVW5kZXJsaW5lQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXVuZGVybGluZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3RyaWtldGhyb3VnaC12YXJpYW50XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Jsb2NrcXVvdGUnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtcXVvdGUtY2xvc2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImluc2VydENvZGVCbG9jaygpXCI+PGkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1jb2RlLXRhZ3NcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtbGlzdC1udW1iZXJlZFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkNvbG9yIEZvcm1hdHRpbmdcIj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGFycm93LW5vbmUgdGV4dC1zZWNvbmRhcnlcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItZmlsbFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDMwMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sb3Itc2tldGNoIGNvbG9yPVwiI2ZmZlwiIChvbkNoYW5nZUNvbXBsZXRlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+PC9jb2xvci1za2V0Y2g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiIG5neC1jb2xvcnMtdHJpZ2dlciBbKG5nTW9kZWwpXT1cImNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsb2dFdmVudCgkZXZlbnQsICduZ01vZGVsQ2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibG9nRXZlbnQoJGV2ZW50LCAnY2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJsb2dFdmVudCgkZXZlbnQsICdpbnB1dCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwie2NvbG9yOiBjb2xvcn1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1jb2xvcnMgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiID48L25neC1jb2xvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgaWQ9XCJ0ZXh0Q29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGV4dENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRUZXh0Q29sb3JcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQmFja2dyb3VuZCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbc3R5bGUuY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHN0eWxlPVwid2lkdGg6IDBweCAhaW1wb3J0YW50O1wiIGlkPVwiYmdDb2xvclBpY2tlclwiIFtjcFByZXNldENvbG9yc109XCJbJyNmZmYnLCAnIzAwMCcsICcjMjg4OWU5JywgJyNlOTIwZTknLCAnI2ZmZjUwMCcsICdyZ2IoMjM2LDY0LDY0KSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJjb2xvclwiIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIiAvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cImJnQ29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJIZWFkZXIgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiaGVhZGVyRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGgxPicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+IEhlYWRpbmcgMTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItMlwiPjwvaT4gSGVhZGluZyAyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoMz4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci0zXCI+PC9pPiBIZWFkaW5nIDM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGg0PicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTRcIj48L2k+IEhlYWRpbmcgNDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItNVwiPjwvaT4gSGVhZGluZyA1PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoNj4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci02XCI+PC9pPiBIZWFkaW5nIDY8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlXCIgaWQ9XCJoZWFkZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogODVweDtcIj57e3NlbGVjdGVkRm9ybWF0QmxvY2sgfCB0aXRsZWNhc2V9fTwvc3Bhbj4gPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWNoZXZyb24tZG93biB0ZXh0LWRhcmtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImhlYWRlckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1YnNjcmlwdEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdWJzY3JpcHQnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1cGVyc2NyaXB0QWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3VwZXJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdCBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCIgc3R5bGU9XCJ3aWR0aDogM3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tY2VudGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWFsaWduLXJpZ2h0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdyZW1vdmVGb3JtYXQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jbGVhclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRMaW5rKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1saW5rLXZhcmlhbnRcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1pbWFnZVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJpbWFnZUlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChjaGFuZ2UpPVwiaGFuZGxlSW1hZ2VVcGxvYWQoJGV2ZW50KVwiIGFjY2VwdD1cImltYWdlLypcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkVGFibGUoKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkUm93KClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1wbHVzLWFmdGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cImNvbG9yXCI+PC9pPlxyXG4gICAgICAgIDxuZ3gtY29sb3JzIFsobmdNb2RlbCldPVwiY29sb3JcIiAoY2hhbmdlKT1cImNvbG9yQ2hhbmdlZCgkZXZlbnQpXCI+PC9uZ3gtY29sb3JzPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgbmdiRHJvcGRvd24gYXJpYS1sYWJlbD1cIlRhYmxlIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIG5nYkRyb3Bkb3duVG9nZ2xlICAoY2xpY2spPVwiYWRkVGFibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51ICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkIHx8IHRhYmxlQWRkZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+IEFkZCBSb3dcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJkZWxldGVSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXJlbW92ZVwiPjwvaT4gRGVsZXRlIFJvd1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcGx1cy1hZnRlclwiPjwvaT4gQWRkIENvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPiBEZWxldGUgQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGFibGVXaWR0aFwiPlRhYmxlIFdpZHRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRhYmxlV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0VGFibGVXaWR0aCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VsbFdpZHRoXCI+Q2VsbCBXaWR0aDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJjZWxsV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0Q2VsbFdpZHRoKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjZWxsSGVpZ2h0XCI+Q2VsbCBIZWlnaHQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VsbEhlaWdodFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGNoYW5nZSk9XCJhZGp1c3RDZWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgaWQ9XCJlZGl0b3JcIiBjbGFzcz1cInAtMyBjdXN0b20tc2Nyb2xsYmFyIG5vbi1mb2N1c1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMjBweCAhaW1wb3J0YW50O1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInRoZW1lTW9kZUJnQ2xyKClcIiBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgJ2ZvbnQtc2l6ZSc6IHNlbGVjdGVkRm9udFNpemUgKyAncHgnfVwiIFtzdHlsZV09XCJzdHlsZVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzg1dmggIWltcG9ydGFudCcgOiAgJzQwNXB4ICFpbXBvcnRhbnQnXCJcclxuICAgICAgICAoaW5wdXQpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJJbnNlcnQgdGV4dCBoZXJlIC4uLlwiIHJlYWRvbmx5IChtb3VzZXVwKT1cIm9uVGV4dFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplZENvbnRlbnRcIiAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgICAgICAoY2xpY2spPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigkZXZlbnQpXCI+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8IS0tIDxkaXYgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgXCIgW3N0eWxlLmJhY2tncm91bmRdPVwidGhlbWVNb2RlQmdDbHIoKVwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlci10b3BdPVwidGhlbWVNb2RlQm9yZGVyVG9wKClcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnZm9udC1mYW1pbHknOiBzZWxlY3RlZEZvbnQsICdmb250LXNpemUnOiBzZWxlY3RlZEZvbnRTaXplICsgJ3B4JyxcclxuICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnXHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzkzdmgnIDogJzQwNXB4J1wiIChpbnB1dCk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkluc2VydCB0ZXh0IGhlcmUgLi4uXCJcclxuICAgICAgICByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIj5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDxkaXYgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImNvbnRlbnRFZGl0YWJsZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBvdmVyZmxvdzogYXV0bztcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogc2VsZWN0ZWRGb250U2l6ZSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IElzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDonMjBweCcsXHJcbiAgICAgICAgICAgICAgICAnbWluLWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCcsXHJcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCdcclxuICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIiByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgKGlucHV0KT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIiAoa2V5ZG93bi5UYWIpPVwiaGFuZGxlVGFiS2V5KCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDx0YWJsZSAqbmdJZj1cInBhcnNlZFRhYmxlXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGhlYWRlciBvZiBwYXJzZWRUYWJsZS5oZWFkZXJzXCI+e3sgaGVhZGVyIH19PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFyc2VkVGFibGUucm93c1wiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvd1wiPnt7IGNlbGwgfX08L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG5cclxuPC9kaXY+Il19
|