You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

599 lines
82 KiB

"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.VXETablePluginExportXLSX = void 0;
var _xeUtils = _interopRequireDefault(require("xe-utils"));
var ExcelJS = _interopRequireWildcard(require("exceljs"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var defaultHeaderBackgroundColor = 'f8f8f9';
var defaultCellFontColor = '606266';
var defaultCellBorderStyle = 'thin';
var defaultCellBorderColor = 'e8eaec';
function getCellLabel(column, cellValue) {
if (cellValue) {
switch (column.cellType) {
case 'string':
return _xeUtils["default"].toString(cellValue);
case 'number':
if (!isNaN(cellValue)) {
return Number(cellValue);
}
break;
default:
if (cellValue.length < 12 && !isNaN(cellValue)) {
return Number(cellValue);
}
break;
}
}
return cellValue;
}
function getFooterData(opts, footerData) {
var footerFilterMethod = opts.footerFilterMethod;
return footerFilterMethod ? footerData.filter(function (items, index) {
return footerFilterMethod({
items: items,
$rowIndex: index
});
}) : footerData;
}
function getFooterCellValue($table, opts, rows, column) {
var cellValue = getCellLabel(column, rows[$table.getVMColumnIndex(column)]);
return cellValue;
}
function getValidColumn(column) {
var childNodes = column.childNodes;
var isColGroup = childNodes && childNodes.length;
if (isColGroup) {
return getValidColumn(childNodes[0]);
}
return column;
}
function setExcelRowHeight(excelRow, height) {
if (height) {
excelRow.height = _xeUtils["default"].floor(height * 0.75, 12);
}
}
function setExcelCellStyle(excelCell, align) {
excelCell.protection = {
locked: false
};
excelCell.alignment = {
vertical: 'middle',
horizontal: align || 'left'
};
}
function getDefaultBorderStyle() {
return {
top: {
style: defaultCellBorderStyle,
color: {
argb: defaultCellBorderColor
}
},
left: {
style: defaultCellBorderStyle,
color: {
argb: defaultCellBorderColor
}
},
bottom: {
style: defaultCellBorderStyle,
color: {
argb: defaultCellBorderColor
}
},
right: {
style: defaultCellBorderStyle,
color: {
argb: defaultCellBorderColor
}
}
};
}
function exportXLSX(params) {
var msgKey = 'xlsx';
var $table = params.$table,
options = params.options,
columns = params.columns,
colgroups = params.colgroups,
datas = params.datas;
var $vxe = $table.$vxe,
rowHeight = $table.rowHeight,
allHeaderAlign = $table.headerAlign,
allAlign = $table.align,
allFooterAlign = $table.footerAlign;
var modal = $vxe.modal,
t = $vxe.t;
var message = options.message,
sheetName = options.sheetName,
isHeader = options.isHeader,
isFooter = options.isFooter,
isMerge = options.isMerge,
isColgroup = options.isColgroup,
original = options.original,
useStyle = options.useStyle,
sheetMethod = options.sheetMethod;
var showMsg = message !== false;
var mergeCells = $table.getMergeCells();
var colList = [];
var footList = [];
var sheetCols = [];
var sheetMerges = [];
var beforeRowCount = 0;
var colHead = {};
columns.forEach(function (column) {
var id = column.id,
property = column.property,
renderWidth = column.renderWidth;
colHead[id] = original ? property : column.getTitle();
sheetCols.push({
key: id,
width: _xeUtils["default"].ceil(renderWidth / 8, 1)
});
}); // 处理表头
if (isHeader) {
// 处理分组
if (isColgroup && !original && colgroups) {
colgroups.forEach(function (cols, rIndex) {
var groupHead = {};
columns.forEach(function (column) {
groupHead[column.id] = null;
});
cols.forEach(function (column) {
var _colSpan = column._colSpan,
_rowSpan = column._rowSpan;
var validColumn = getValidColumn(column);
var columnIndex = columns.indexOf(validColumn);
groupHead[validColumn.id] = original ? validColumn.property : column.getTitle();
if (_colSpan > 1 || _rowSpan > 1) {
sheetMerges.push({
s: {
r: rIndex,
c: columnIndex
},
e: {
r: rIndex + _rowSpan - 1,
c: columnIndex + _colSpan - 1
}
});
}
});
colList.push(groupHead);
});
} else {
colList.push(colHead);
}
beforeRowCount += colList.length;
} // 处理合并
if (isMerge && !original) {
mergeCells.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row,
mergeRowspan = mergeItem.rowspan,
mergeColIndex = mergeItem.col,
mergeColspan = mergeItem.colspan;
sheetMerges.push({
s: {
r: mergeRowIndex + beforeRowCount,
c: mergeColIndex
},
e: {
r: mergeRowIndex + beforeRowCount + mergeRowspan - 1,
c: mergeColIndex + mergeColspan - 1
}
});
});
}
var rowList = datas.map(function (item) {
var rest = {};
columns.forEach(function (column) {
rest[column.id] = getCellLabel(column, item[column.id]);
});
return rest;
});
beforeRowCount += rowList.length; // 处理表尾
if (isFooter) {
var _$table$getTableData = $table.getTableData(),
footerData = _$table$getTableData.footerData;
var footers = getFooterData(options, footerData);
var mergeFooterItems = $table.getMergeFooterItems(); // 处理合并
if (isMerge && !original) {
mergeFooterItems.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row,
mergeRowspan = mergeItem.rowspan,
mergeColIndex = mergeItem.col,
mergeColspan = mergeItem.colspan;
sheetMerges.push({
s: {
r: mergeRowIndex + beforeRowCount,
c: mergeColIndex
},
e: {
r: mergeRowIndex + beforeRowCount + mergeRowspan - 1,
c: mergeColIndex + mergeColspan - 1
}
});
});
}
footers.forEach(function (rows) {
var item = {};
columns.forEach(function (column) {
item[column.id] = getFooterCellValue($table, options, rows, column);
});
footList.push(item);
});
}
var exportMethod = function exportMethod() {
var workbook = new ExcelJS.Workbook();
var sheet = workbook.addWorksheet(sheetName);
workbook.creator = 'vxe-table';
sheet.columns = sheetCols;
if (isHeader) {
sheet.addRows(colList).forEach(function (excelRow) {
if (useStyle) {
setExcelRowHeight(excelRow, rowHeight);
}
excelRow.eachCell(function (excelCell) {
var excelCol = sheet.getColumn(excelCell.col);
var column = $table.getColumnById(excelCol.key);
var headerAlign = column.headerAlign,
align = column.align;
setExcelCellStyle(excelCell, headerAlign || align || allHeaderAlign || allAlign);
if (useStyle) {
Object.assign(excelCell, {
font: {
bold: true,
color: {
argb: defaultCellFontColor
}
},
fill: {
type: 'pattern',
pattern: 'solid',
fgColor: {
argb: defaultHeaderBackgroundColor
}
},
border: getDefaultBorderStyle()
});
}
});
});
}
sheet.addRows(rowList).forEach(function (excelRow) {
if (useStyle) {
setExcelRowHeight(excelRow, rowHeight);
}
excelRow.eachCell(function (excelCell) {
var excelCol = sheet.getColumn(excelCell.col);
var column = $table.getColumnById(excelCol.key);
var align = column.align;
setExcelCellStyle(excelCell, align || allAlign);
if (useStyle) {
Object.assign(excelCell, {
font: {
color: {
argb: defaultCellFontColor
}
},
border: getDefaultBorderStyle()
});
}
});
});
if (isFooter) {
sheet.addRows(footList).forEach(function (excelRow) {
if (useStyle) {
setExcelRowHeight(excelRow, rowHeight);
}
excelRow.eachCell(function (excelCell) {
var excelCol = sheet.getColumn(excelCell.col);
var column = $table.getColumnById(excelCol.key);
var footerAlign = column.footerAlign,
align = column.align;
setExcelCellStyle(excelCell, footerAlign || align || allFooterAlign || allAlign);
if (useStyle) {
Object.assign(excelCell, {
font: {
color: {
argb: defaultCellFontColor
}
},
border: getDefaultBorderStyle()
});
}
});
});
}
if (useStyle && sheetMethod) {
sheetMethod({
options: options,
workbook: workbook,
worksheet: sheet,
columns: columns,
colgroups: colgroups,
datas: datas,
$table: $table
});
}
sheetMerges.forEach(function (_ref) {
var s = _ref.s,
e = _ref.e;
sheet.mergeCells(s.r + 1, s.c + 1, e.r + 1, e.c + 1);
});
workbook.xlsx.writeBuffer().then(function (buffer) {
var blob = new Blob([buffer], {
type: 'application/octet-stream'
}); // 导出 xlsx
downloadFile(params, blob, options);
if (showMsg) {
modal.close(msgKey);
modal.message({
message: t('vxe.table.expSuccess'),
status: 'success'
});
}
});
};
if (showMsg) {
modal.message({
id: msgKey,
message: t('vxe.table.expLoading'),
status: 'loading',
duration: -1
});
setTimeout(exportMethod, 1500);
} else {
exportMethod();
}
}
function downloadFile(params, blob, options) {
var $table = params.$table;
var $vxe = $table.$vxe;
var modal = $vxe.modal,
t = $vxe.t;
var message = options.message,
filename = options.filename,
type = options.type;
var showMsg = message !== false;
if (window.Blob) {
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, "".concat(filename, ".").concat(type));
} else {
var linkElem = document.createElement('a');
linkElem.target = '_blank';
linkElem.download = "".concat(filename, ".").concat(type);
linkElem.href = URL.createObjectURL(blob);
document.body.appendChild(linkElem);
linkElem.click();
document.body.removeChild(linkElem);
}
} else {
if (showMsg) {
modal.alert({
message: t('vxe.error.notExp'),
status: 'error'
});
}
}
}
function checkImportData(tableFields, fields) {
return fields.some(function (field) {
return tableFields.indexOf(field) > -1;
});
}
function importError(params) {
var $table = params.$table,
options = params.options;
var $vxe = $table.$vxe,
_importReject = $table._importReject;
var showMsg = options.message !== false;
var modal = $vxe.modal,
t = $vxe.t;
if (showMsg) {
modal.message({
message: t('vxe.error.impFields'),
status: 'error'
});
}
if (_importReject) {
_importReject({
status: false
});
}
}
function importXLSX(params) {
var $table = params.$table,
columns = params.columns,
options = params.options,
file = params.file;
var $vxe = $table.$vxe,
_importResolve = $table._importResolve;
var modal = $vxe.modal,
t = $vxe.t;
var showMsg = options.message !== false;
var fileReader = new FileReader();
fileReader.onerror = function () {
importError(params);
};
fileReader.onload = function (evnt) {
var tableFields = [];
columns.forEach(function (column) {
var field = column.property;
if (field) {
tableFields.push(field);
}
});
var workbook = new ExcelJS.Workbook();
var readerTarget = evnt.target;
if (readerTarget) {
workbook.xlsx.load(readerTarget.result).then(function (wb) {
var firstSheet = wb.worksheets[0];
if (firstSheet) {
var sheetValues = firstSheet.getSheetValues();
var fieldIndex = _xeUtils["default"].findIndexOf(sheetValues, function (list) {
return list && list.length > 0;
});
var fields = sheetValues[fieldIndex];
var status = checkImportData(tableFields, fields);
if (status) {
var records = sheetValues.slice(fieldIndex).map(function (list) {
var item = {};
list.forEach(function (cellValue, cIndex) {
item[fields[cIndex]] = cellValue;
});
var record = {};
tableFields.forEach(function (field) {
record[field] = _xeUtils["default"].isUndefined(item[field]) ? null : item[field];
});
return record;
});
$table.createData(records).then(function (data) {
var loadRest;
if (options.mode === 'insert') {
loadRest = $table.insertAt(data, -1);
} else {
loadRest = $table.reloadData(data);
}
return loadRest.then(function () {
if (_importResolve) {
_importResolve({
status: true
});
}
});
});
if (showMsg) {
modal.message({
message: t('vxe.table.impSuccess', [records.length]),
status: 'success'
});
}
} else {
importError(params);
}
} else {
importError(params);
}
});
} else {
importError(params);
}
};
fileReader.readAsArrayBuffer(file);
}
function handleImportEvent(params) {
if (params.options.type === 'xlsx') {
importXLSX(params);
return false;
}
}
function handleExportEvent(params) {
if (params.options.type === 'xlsx') {
exportXLSX(params);
return false;
}
}
/**
* 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式
*/
var VXETablePluginExportXLSX = {
install: function install(vxetable) {
var interceptor = vxetable.interceptor;
vxetable.setup({
"export": {
types: {
xlsx: 0
}
}
});
interceptor.mixin({
'event.import': handleImportEvent,
'event.export': handleExportEvent
});
}
};
exports.VXETablePluginExportXLSX = VXETablePluginExportXLSX;
if (typeof window !== 'undefined' && window.VXETable && window.VXETable.use) {
window.VXETable.use(VXETablePluginExportXLSX);
}
var _default = VXETablePluginExportXLSX;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIiwiaW5kZXguanMiXSwibmFtZXMiOlsiZGVmYXVsdEhlYWRlckJhY2tncm91bmRDb2xvciIsImRlZmF1bHRDZWxsRm9udENvbG9yIiwiZGVmYXVsdENlbGxCb3JkZXJTdHlsZSIsImRlZmF1bHRDZWxsQm9yZGVyQ29sb3IiLCJnZXRDZWxsTGFiZWwiLCJjb2x1bW4iLCJjZWxsVmFsdWUiLCJjZWxsVHlwZSIsIlhFVXRpbHMiLCJ0b1N0cmluZyIsImlzTmFOIiwiTnVtYmVyIiwibGVuZ3RoIiwiZ2V0Rm9vdGVyRGF0YSIsIm9wdHMiLCJmb290ZXJEYXRhIiwiZm9vdGVyRmlsdGVyTWV0aG9kIiwiZmlsdGVyIiwiaXRlbXMiLCJpbmRleCIsIiRyb3dJbmRleCIsImdldEZvb3RlckNlbGxWYWx1ZSIsIiR0YWJsZSIsInJvd3MiLCJnZXRWTUNvbHVtbkluZGV4IiwiZ2V0VmFsaWRDb2x1bW4iLCJjaGlsZE5vZGVzIiwiaXNDb2xHcm91cCIsInNldEV4Y2VsUm93SGVpZ2h0IiwiZXhjZWxSb3ciLCJoZWlnaHQiLCJmbG9vciIsInNldEV4Y2VsQ2VsbFN0eWxlIiwiZXhjZWxDZWxsIiwiYWxpZ24iLCJwcm90ZWN0aW9uIiwibG9ja2VkIiwiYWxpZ25tZW50IiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiZ2V0RGVmYXVsdEJvcmRlclN0eWxlIiwidG9wIiwic3R5bGUiLCJjb2xvciIsImFyZ2IiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJleHBvcnRYTFNYIiwicGFyYW1zIiwibXNnS2V5Iiwib3B0aW9ucyIsImNvbHVtbnMiLCJjb2xncm91cHMiLCJkYXRhcyIsIiR2eGUiLCJyb3dIZWlnaHQiLCJhbGxIZWFkZXJBbGlnbiIsImhlYWRlckFsaWduIiwiYWxsQWxpZ24iLCJhbGxGb290ZXJBbGlnbiIsImZvb3RlckFsaWduIiwibW9kYWwiLCJ0IiwibWVzc2FnZSIsInNoZWV0TmFtZSIsImlzSGVhZGVyIiwiaXNGb290ZXIiLCJpc01lcmdlIiwiaXNDb2xncm91cCIsIm9yaWdpbmFsIiwidXNlU3R5bGUiLCJzaGVldE1ldGhvZCIsInNob3dNc2ciLCJtZXJnZUNlbGxzIiwiZ2V0TWVyZ2VDZWxscyIsImNvbExpc3QiLCJmb290TGlzdCIsInNoZWV0Q29scyIsInNoZWV0TWVyZ2VzIiwiYmVmb3JlUm93Q291bnQiLCJjb2xIZWFkIiwiZm9yRWFjaCIsImlkIiwicHJvcGVydHkiLCJyZW5kZXJXaWR0aCIsImdldFRpdGxlIiwicHVzaCIsImtleSIsIndpZHRoIiwiY2VpbCIsImNvbHMiLCJySW5kZXgiLCJncm91cEhlYWQiLCJfY29sU3BhbiIsIl9yb3dTcGFuIiwidmFsaWRDb2x1bW4iLCJjb2x1bW5JbmRleCIsImluZGV4T2YiLCJzIiwiciIsImMiLCJlIiwibWVyZ2VJdGVtIiwibWVyZ2VSb3dJbmRleCIsInJvdyIsIm1lcmdlUm93c3BhbiIsInJvd3NwYW4iLCJtZXJnZUNvbEluZGV4IiwiY29sIiwibWVyZ2VDb2xzcGFuIiwiY29sc3BhbiIsInJvd0xpc3QiLCJtYXAiLCJpdGVtIiwicmVzdCIsImdldFRhYmxlRGF0YSIsImZvb3RlcnMiLCJtZXJnZUZvb3Rlckl0ZW1zIiwiZ2V0TWVyZ2VGb290ZXJJdGVtcyIsImV4cG9ydE1ldGhvZCIsIndvcmtib29rIiwiRXhjZWxKUyIsIldvcmtib29rIiwic2hlZXQiLCJhZGRXb3Jrc2hlZXQiLCJjcmVhdG9yIiwiYWRkUm93cyIsImVhY2hDZWxsIiwiZXhjZWxDb2wiLCJnZXRDb2x1bW4iLCJnZXRDb2x1bW5CeUlkIiwiT2JqZWN0IiwiYXNzaWduIiwiZm9udCIsImJvbGQiLCJmaWxsIiwidHlwZSIsInBhdHRlcm4iLCJmZ0NvbG9yIiwiYm9yZGVyIiwid29ya3NoZWV0IiwieGxzeCIsIndyaXRlQnVmZmVyIiwidGhlbiIsImJ1ZmZlciIsImJsb2IiLCJCbG9iIiwiZG93bmxvYWRGaWxlIiwiY2xvc2UiLCJzdGF0dXMiLCJkdXJhdGlvbiIsInNldFRpbWVvdXQiLCJmaWxlbmFtZSIsIndpbmRvdyIsIm5hdmlnYXRvciIsIm1zU2F2ZUJsb2IiLCJsaW5rRWxlbSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInRhcmdldCIsImRvd25sb2FkIiwiaHJlZiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJhbGVydCIsImNoZWNrSW1wb3J0RGF0YSIsInRhYmxlRmllbGRzIiwiZmllbGRzIiwic29tZSIsImZpZWxkIiwiaW1wb3J0RXJyb3IiLCJfaW1wb3J0UmVqZWN0IiwiaW1wb3J0WExTWCIsImZpbGUiLCJfaW1wb3J0UmVzb2x2ZSIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwib25lcnJvciIsIm9ubG9hZCIsImV2bnQiLCJyZWFkZXJUYXJnZXQiLCJsb2FkIiwicmVzdWx0Iiwid2IiLCJmaXJzdFNoZWV0Iiwid29ya3NoZWV0cyIsInNoZWV0VmFsdWVzIiwiZ2V0U2hlZXRWYWx1ZXMiLCJmaWVsZEluZGV4IiwiZmluZEluZGV4T2YiLCJsaXN0IiwicmVjb3JkcyIsInNsaWNlIiwiY0luZGV4IiwicmVjb3JkIiwiaXNVbmRlZmluZWQiLCJjcmVhdGVEYXRhIiwiZGF0YSIsImxvYWRSZXN0IiwibW9kZSIsImluc2VydEF0IiwicmVsb2FkRGF0YSIsInJlYWRBc0FycmF5QnVmZmVyIiwiaGFuZGxlSW1wb3J0RXZlbnQiLCJoYW5kbGVFeHBvcnRFdmVudCIsIlZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWCIsImluc3RhbGwiLCJ2eGV0YWJsZSIsImludGVyY2VwdG9yIiwic2V0dXAiLCJ0eXBlcyIsIm1peGluIiwiVlhFVGFibGUiLCJ1c2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQVVBOzs7Ozs7OztBQUVBLElBQU1BLDRCQUE0QixHQUFHLFFBQXJDO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsUUFBN0I7QUFDQSxJQUFNQyxzQkFBc0IsR0FBRyxNQUEvQjtBQUNBLElBQU1DLHNCQUFzQixHQUFHLFFBQS9COztBQUVBLFNBQVNDLFlBQVQsQ0FBdUJDLE1BQXZCLEVBQTZDQyxTQUE3QyxFQUEyRDtBQUN6RCxNQUFJQSxTQUFKLEVBQWU7QUFDYixZQUFRRCxNQUFNLENBQUNFLFFBQWY7QUFDRSxXQUFLLFFBQUw7QUFDRSxlQUFPQyxvQkFBUUMsUUFBUixDQUFpQkgsU0FBakIsQ0FBUDs7QUFDRixXQUFLLFFBQUw7QUFDRSxZQUFJLENBQUNJLEtBQUssQ0FBQ0osU0FBRCxDQUFWLEVBQXVCO0FBQ3JCLGlCQUFPSyxNQUFNLENBQUNMLFNBQUQsQ0FBYjtBQUNEOztBQUNEOztBQUNGO0FBQ0UsWUFBSUEsU0FBUyxDQUFDTSxNQUFWLEdBQW1CLEVBQW5CLElBQXlCLENBQUNGLEtBQUssQ0FBQ0osU0FBRCxDQUFuQyxFQUFnRDtBQUM5QyxpQkFBT0ssTUFBTSxDQUFDTCxTQUFELENBQWI7QUFDRDs7QUFDRDtBQVpKO0FBY0Q7O0FBQ0QsU0FBT0EsU0FBUDtBQUNEOztBQUVELFNBQVNPLGFBQVQsQ0FBd0JDLElBQXhCLEVBQWlEQyxVQUFqRCxFQUFvRTtBQUFBLE1BQzFEQyxrQkFEMEQsR0FDbkNGLElBRG1DLENBQzFERSxrQkFEMEQ7QUFFbEUsU0FBT0Esa0JBQWtCLEdBQUdELFVBQVUsQ0FBQ0UsTUFBWCxDQUFrQixVQUFDQyxLQUFELEVBQVFDLEtBQVI7QUFBQSxXQUFrQkgsa0JBQWtCLENBQUM7QUFBRUUsTUFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVNFLE1BQUFBLFNBQVMsRUFBRUQ7QUFBcEIsS0FBRCxDQUFwQztBQUFBLEdBQWxCLENBQUgsR0FBMEZKLFVBQW5IO0FBQ0Q7O0FBRUQsU0FBU00sa0JBQVQsQ0FBNkJDLE1BQTdCLEVBQTRDUixJQUE1QyxFQUFxRVMsSUFBckUsRUFBa0ZsQixNQUFsRixFQUFzRztBQUNwRyxNQUFNQyxTQUFTLEdBQUdGLFlBQVksQ0FBQ0MsTUFBRCxFQUFTa0IsSUFBSSxDQUFDRCxNQUFNLENBQUNFLGdCQUFQLENBQXdCbkIsTUFBeEIsQ0FBRCxDQUFiLENBQTlCO0FBQ0EsU0FBT0MsU0FBUDtBQUNEOztBQVdELFNBQVNtQixjQUFULENBQXlCcEIsTUFBekIsRUFBNkM7QUFBQSxNQUNuQ3FCLFVBRG1DLEdBQ3BCckIsTUFEb0IsQ0FDbkNxQixVQURtQztBQUUzQyxNQUFNQyxVQUFVLEdBQUdELFVBQVUsSUFBSUEsVUFBVSxDQUFDZCxNQUE1Qzs7QUFDQSxNQUFJZSxVQUFKLEVBQWdCO0FBQ2QsV0FBT0YsY0FBYyxDQUFDQyxVQUFVLENBQUMsQ0FBRCxDQUFYLENBQXJCO0FBQ0Q7O0FBQ0QsU0FBT3JCLE1BQVA7QUFDRDs7QUFFRCxTQUFTdUIsaUJBQVQsQ0FBNEJDLFFBQTVCLEVBQW1EQyxNQUFuRCxFQUFpRTtBQUMvRCxNQUFJQSxNQUFKLEVBQVk7QUFDVkQsSUFBQUEsUUFBUSxDQUFDQyxNQUFULEdBQWtCdEIsb0JBQVF1QixLQUFSLENBQWNELE1BQU0sR0FBRyxJQUF2QixFQUE2QixFQUE3QixDQUFsQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBU0UsaUJBQVQsQ0FBNEJDLFNBQTVCLEVBQXFEQyxLQUFyRCxFQUF3RTtBQUN0RUQsRUFBQUEsU0FBUyxDQUFDRSxVQUFWLEdBQXVCO0FBQ3JCQyxJQUFBQSxNQUFNLEVBQUU7QUFEYSxHQUF2QjtBQUdBSCxFQUFBQSxTQUFTLENBQUNJLFNBQVYsR0FBc0I7QUFDcEJDLElBQUFBLFFBQVEsRUFBRSxRQURVO0FBRXBCQyxJQUFBQSxVQUFVLEVBQUVMLEtBQUssSUFBSTtBQUZELEdBQXRCO0FBSUQ7O0FBRUQsU0FBU00scUJBQVQsR0FBOEI7QUFDNUIsU0FBTztBQUNMQyxJQUFBQSxHQUFHLEVBQUU7QUFDSEMsTUFBQUEsS0FBSyxFQUFFeEMsc0JBREo7QUFFSHlDLE1BQUFBLEtBQUssRUFBRTtBQUNMQyxRQUFBQSxJQUFJLEVBQUV6QztBQUREO0FBRkosS0FEQTtBQU9MMEMsSUFBQUEsSUFBSSxFQUFFO0FBQ0pILE1BQUFBLEtBQUssRUFBRXhDLHNCQURIO0FBRUp5QyxNQUFBQSxLQUFLLEVBQUU7QUFDTEMsUUFBQUEsSUFBSSxFQUFFekM7QUFERDtBQUZILEtBUEQ7QUFhTDJDLElBQUFBLE1BQU0sRUFBRTtBQUNOSixNQUFBQSxLQUFLLEVBQUV4QyxzQkFERDtBQUVOeUMsTUFBQUEsS0FBSyxFQUFFO0FBQ0xDLFFBQUFBLElBQUksRUFBRXpDO0FBREQ7QUFGRCxLQWJIO0FBbUJMNEMsSUFBQUEsS0FBSyxFQUFFO0FBQ0xMLE1BQUFBLEtBQUssRUFBRXhDLHNCQURGO0FBRUx5QyxNQUFBQSxLQUFLLEVBQUU7QUFDTEMsUUFBQUEsSUFBSSxFQUFFekM7QUFERDtBQUZGO0FBbkJGLEdBQVA7QUEwQkQ7O0FBRUQsU0FBUzZDLFVBQVQsQ0FBcUJDLE1BQXJCLEVBQW9EO0FBQ2xELE1BQU1DLE1BQU0sR0FBRyxNQUFmO0FBRGtELE1BRTFDNUIsTUFGMEMsR0FFSzJCLE1BRkwsQ0FFMUMzQixNQUYwQztBQUFBLE1BRWxDNkIsT0FGa0MsR0FFS0YsTUFGTCxDQUVsQ0UsT0FGa0M7QUFBQSxNQUV6QkMsT0FGeUIsR0FFS0gsTUFGTCxDQUV6QkcsT0FGeUI7QUFBQSxNQUVoQkMsU0FGZ0IsR0FFS0osTUFGTCxDQUVoQkksU0FGZ0I7QUFBQSxNQUVMQyxLQUZLLEdBRUtMLE1BRkwsQ0FFTEssS0FGSztBQUFBLE1BRzFDQyxJQUgwQyxHQUdxRGpDLE1BSHJELENBRzFDaUMsSUFIMEM7QUFBQSxNQUdwQ0MsU0FIb0MsR0FHcURsQyxNQUhyRCxDQUdwQ2tDLFNBSG9DO0FBQUEsTUFHWkMsY0FIWSxHQUdxRG5DLE1BSHJELENBR3pCb0MsV0FIeUI7QUFBQSxNQUdXQyxRQUhYLEdBR3FEckMsTUFIckQsQ0FHSVksS0FISjtBQUFBLE1BR2tDMEIsY0FIbEMsR0FHcUR0QyxNQUhyRCxDQUdxQnVDLFdBSHJCO0FBQUEsTUFJMUNDLEtBSjBDLEdBSTdCUCxJQUo2QixDQUkxQ08sS0FKMEM7QUFBQSxNQUluQ0MsQ0FKbUMsR0FJN0JSLElBSjZCLENBSW5DUSxDQUptQztBQUFBLE1BSzFDQyxPQUwwQyxHQUt1RGIsT0FMdkQsQ0FLMUNhLE9BTDBDO0FBQUEsTUFLakNDLFNBTGlDLEdBS3VEZCxPQUx2RCxDQUtqQ2MsU0FMaUM7QUFBQSxNQUt0QkMsUUFMc0IsR0FLdURmLE9BTHZELENBS3RCZSxRQUxzQjtBQUFBLE1BS1pDLFFBTFksR0FLdURoQixPQUx2RCxDQUtaZ0IsUUFMWTtBQUFBLE1BS0ZDLE9BTEUsR0FLdURqQixPQUx2RCxDQUtGaUIsT0FMRTtBQUFBLE1BS09DLFVBTFAsR0FLdURsQixPQUx2RCxDQUtPa0IsVUFMUDtBQUFBLE1BS21CQyxRQUxuQixHQUt1RG5CLE9BTHZELENBS21CbUIsUUFMbkI7QUFBQSxNQUs2QkMsUUFMN0IsR0FLdURwQixPQUx2RCxDQUs2Qm9CLFFBTDdCO0FBQUEsTUFLdUNDLFdBTHZDLEdBS3VEckIsT0FMdkQsQ0FLdUNxQixXQUx2QztBQU1sRCxNQUFNQyxPQUFPLEdBQUdULE9BQU8sS0FBSyxLQUE1QjtBQUNBLE1BQU1VLFVBQVUsR0FBR3BELE1BQU0sQ0FBQ3FELGFBQVAsRUFBbkI7QUFDQSxNQUFNQyxPQUFPLEdBQVUsRUFBdkI7QUFDQSxNQUFNQyxRQUFRLEdBQVUsRUFBeEI7QUFDQSxNQUFNQyxTQUFTLEdBQVUsRUFBekI7QUFDQSxNQUFNQyxXQUFXLEdBQW1FLEVBQXBGO0FBQ0EsTUFBSUMsY0FBYyxHQUFHLENBQXJCO0FBQ0EsTUFBTUMsT0FBTyxHQUFRLEVBQXJCO0FBQ0E3QixFQUFBQSxPQUFPLENBQUM4QixPQUFSLENBQWdCLFVBQUM3RSxNQUFELEVBQVc7QUFBQSxRQUNqQjhFLEVBRGlCLEdBQ2E5RSxNQURiLENBQ2pCOEUsRUFEaUI7QUFBQSxRQUNiQyxRQURhLEdBQ2EvRSxNQURiLENBQ2IrRSxRQURhO0FBQUEsUUFDSEMsV0FERyxHQUNhaEYsTUFEYixDQUNIZ0YsV0FERztBQUV6QkosSUFBQUEsT0FBTyxDQUFDRSxFQUFELENBQVAsR0FBY2IsUUFBUSxHQUFHYyxRQUFILEdBQWMvRSxNQUFNLENBQUNpRixRQUFQLEVBQXBDO0FBQ0FSLElBQUFBLFNBQVMsQ0FBQ1MsSUFBVixDQUFlO0FBQ2JDLE1BQUFBLEdBQUcsRUFBRUwsRUFEUTtBQUViTSxNQUFBQSxLQUFLLEVBQUVqRixvQkFBUWtGLElBQVIsQ0FBYUwsV0FBVyxHQUFHLENBQTNCLEVBQThCLENBQTlCO0FBRk0sS0FBZjtBQUlELEdBUEQsRUFka0QsQ0FzQmxEOztBQUNBLE1BQUluQixRQUFKLEVBQWM7QUFDWjtBQUNBLFFBQUlHLFVBQVUsSUFBSSxDQUFDQyxRQUFmLElBQTJCakIsU0FBL0IsRUFBMEM7QUFDeENBLE1BQUFBLFNBQVMsQ0FBQzZCLE9BQVYsQ0FBa0IsVUFBQ1MsSUFBRCxFQUFPQyxNQUFQLEVBQWlCO0FBQ2pDLFlBQUlDLFNBQVMsR0FBUSxFQUFyQjtBQUNBekMsUUFBQUEsT0FBTyxDQUFDOEIsT0FBUixDQUFnQixVQUFDN0UsTUFBRCxFQUFXO0FBQ3pCd0YsVUFBQUEsU0FBUyxDQUFDeEYsTUFBTSxDQUFDOEUsRUFBUixDQUFULEdBQXVCLElBQXZCO0FBQ0QsU0FGRDtBQUdBUSxRQUFBQSxJQUFJLENBQUNULE9BQUwsQ0FBYSxVQUFDN0UsTUFBRCxFQUFXO0FBQUEsY0FDZHlGLFFBRGMsR0FDU3pGLE1BRFQsQ0FDZHlGLFFBRGM7QUFBQSxjQUNKQyxRQURJLEdBQ1MxRixNQURULENBQ0owRixRQURJO0FBRXRCLGNBQU1DLFdBQVcsR0FBR3ZFLGNBQWMsQ0FBQ3BCLE1BQUQsQ0FBbEM7QUFDQSxjQUFNNEYsV0FBVyxHQUFHN0MsT0FBTyxDQUFDOEMsT0FBUixDQUFnQkYsV0FBaEIsQ0FBcEI7QUFDQUgsVUFBQUEsU0FBUyxDQUFDRyxXQUFXLENBQUNiLEVBQWIsQ0FBVCxHQUE0QmIsUUFBUSxHQUFHMEIsV0FBVyxDQUFDWixRQUFmLEdBQTBCL0UsTUFBTSxDQUFDaUYsUUFBUCxFQUE5RDs7QUFDQSxjQUFJUSxRQUFRLEdBQUcsQ0FBWCxJQUFnQkMsUUFBUSxHQUFHLENBQS9CLEVBQWtDO0FBQ2hDaEIsWUFBQUEsV0FBVyxDQUFDUSxJQUFaLENBQWlCO0FBQ2ZZLGNBQUFBLENBQUMsRUFBRTtBQUFFQyxnQkFBQUEsQ0FBQyxFQUFFUixNQUFMO0FBQWFTLGdCQUFBQSxDQUFDLEVBQUVKO0FBQWhCLGVBRFk7QUFFZkssY0FBQUEsQ0FBQyxFQUFFO0FBQUVGLGdCQUFBQSxDQUFDLEVBQUVSLE1BQU0sR0FBR0csUUFBVCxHQUFvQixDQUF6QjtBQUE0Qk0sZ0JBQUFBLENBQUMsRUFBRUosV0FBVyxHQUFHSCxRQUFkLEdBQXlCO0FBQXhEO0FBRlksYUFBakI7QUFJRDtBQUNGLFNBWEQ7QUFZQWxCLFFBQUFBLE9BQU8sQ0FBQ1csSUFBUixDQUFhTSxTQUFiO0FBQ0QsT0FsQkQ7QUFtQkQsS0FwQkQsTUFvQk87QUFDTGpCLE1BQUFBLE9BQU8sQ0FBQ1csSUFBUixDQUFhTixPQUFiO0FBQ0Q7O0FBQ0RELElBQUFBLGNBQWMsSUFBSUosT0FBTyxDQUFDaEUsTUFBMUI7QUFDRCxHQWpEaUQsQ0FrRGxEOzs7QUFDQSxNQUFJd0QsT0FBTyxJQUFJLENBQUNFLFFBQWhCLEVBQTBCO0FBQ3hCSSxJQUFBQSxVQUFVLENBQUNRLE9BQVgsQ0FBbUIsVUFBQXFCLFNBQVMsRUFBRztBQUFBLFVBQ2xCQyxhQURrQixHQUNrRUQsU0FEbEUsQ0FDdkJFLEdBRHVCO0FBQUEsVUFDTUMsWUFETixHQUNrRUgsU0FEbEUsQ0FDSEksT0FERztBQUFBLFVBQ3lCQyxhQUR6QixHQUNrRUwsU0FEbEUsQ0FDb0JNLEdBRHBCO0FBQUEsVUFDaURDLFlBRGpELEdBQ2tFUCxTQURsRSxDQUN3Q1EsT0FEeEM7QUFFN0JoQyxNQUFBQSxXQUFXLENBQUNRLElBQVosQ0FBaUI7QUFDZlksUUFBQUEsQ0FBQyxFQUFFO0FBQUVDLFVBQUFBLENBQUMsRUFBRUksYUFBYSxHQUFHeEIsY0FBckI7QUFBcUNxQixVQUFBQSxDQUFDLEVBQUVPO0FBQXhDLFNBRFk7QUFFZk4sUUFBQUEsQ0FBQyxFQUFFO0FBQUVGLFVBQUFBLENBQUMsRUFBRUksYUFBYSxHQUFHeEIsY0FBaEIsR0FBaUMwQixZQUFqQyxHQUFnRCxDQUFyRDtBQUF3REwsVUFBQUEsQ0FBQyxFQUFFTyxhQUFhLEdBQUdFLFlBQWhCLEdBQStCO0FBQTFGO0FBRlksT0FBakI7QUFJRCxLQU5EO0FBT0Q7O0FBQ0QsTUFBTUUsT0FBTyxHQUFHMUQsS0FBSyxDQUFDMkQsR0FBTixDQUFVLFVBQUFDLElBQUksRUFBRztBQUMvQixRQUFNQyxJQUFJLEdBQVEsRUFBbEI7QUFDQS9ELElBQUFBLE9BQU8sQ0FBQzhCLE9BQVIsQ0FBZ0IsVUFBQzdFLE1BQUQsRUFBVztBQUN6QjhHLE1BQUFBLElBQUksQ0FBQzlHLE1BQU0sQ0FBQzhFLEVBQVIsQ0FBSixHQUFrQi9FLFlBQVksQ0FBQ0MsTUFBRCxFQUFTNkcsSUFBSSxDQUFDN0csTUFBTSxDQUFDOEUsRUFBUixDQUFiLENBQTlCO0FBQ0QsS0FGRDtBQUdBLFdBQU9nQyxJQUFQO0FBQ0QsR0FOZSxDQUFoQjtBQU9BbkMsRUFBQUEsY0FBYyxJQUFJZ0MsT0FBTyxDQUFDcEcsTUFBMUIsQ0FuRWtELENBb0VsRDs7QUFDQSxNQUFJdUQsUUFBSixFQUFjO0FBQUEsK0JBQ1c3QyxNQUFNLENBQUM4RixZQUFQLEVBRFg7QUFBQSxRQUNKckcsVUFESSx3QkFDSkEsVUFESTs7QUFFWixRQUFNc0csT0FBTyxHQUFHeEcsYUFBYSxDQUFDc0MsT0FBRCxFQUFVcEMsVUFBVixDQUE3QjtBQUNBLFFBQU11RyxnQkFBZ0IsR0FBR2hHLE1BQU0sQ0FBQ2lHLG1CQUFQLEVBQXpCLENBSFksQ0FJWjs7QUFDQSxRQUFJbkQsT0FBTyxJQUFJLENBQUNFLFFBQWhCLEVBQTBCO0FBQ3hCZ0QsTUFBQUEsZ0JBQWdCLENBQUNwQyxPQUFqQixDQUF5QixVQUFBcUIsU0FBUyxFQUFHO0FBQUEsWUFDeEJDLGFBRHdCLEdBQzRERCxTQUQ1RCxDQUM3QkUsR0FENkI7QUFBQSxZQUNBQyxZQURBLEdBQzRESCxTQUQ1RCxDQUNUSSxPQURTO0FBQUEsWUFDbUJDLGFBRG5CLEdBQzRETCxTQUQ1RCxDQUNjTSxHQURkO0FBQUEsWUFDMkNDLFlBRDNDLEdBQzREUCxTQUQ1RCxDQUNrQ1EsT0FEbEM7QUFFbkNoQyxRQUFBQSxXQUFXLENBQUNRLElBQVosQ0FBaUI7QUFDZlksVUFBQUEsQ0FBQyxFQUFFO0FBQUVDLFlBQUFBLENBQUMsRUFBRUksYUFBYSxHQUFHeEIsY0FBckI7QUFBcUNxQixZQUFBQSxDQUFDLEVBQUVPO0FBQXhDLFdBRFk7QUFFZk4sVUFBQUEsQ0FBQyxFQUFFO0FBQUVGLFlBQUFBLENBQUMsRUFBRUksYUFBYSxHQUFHeEIsY0FBaEIsR0FBaUMwQixZQUFqQyxHQUFnRCxDQUFyRDtBQUF3REwsWUFBQUEsQ0FBQyxFQUFFTyxhQUFhLEdBQUdFLFlBQWhCLEdBQStCO0FBQTFGO0FBRlksU0FBakI7QUFJRCxPQU5EO0FBT0Q7O0FBQ0RPLElBQUFBLE9BQU8sQ0FBQ25DLE9BQVIsQ0FBZ0IsVUFBQzNELElBQUQsRUFBUztBQUN2QixVQUFNMkYsSUFBSSxHQUFRLEVBQWxCO0FBQ0E5RCxNQUFBQSxPQUFPLENBQUM4QixPQUFSLENBQWdCLFVBQUM3RSxNQUFELEVBQVc7QUFDekI2RyxRQUFBQSxJQUFJLENBQUM3RyxNQUFNLENBQUM4RSxFQUFSLENBQUosR0FBa0I5RCxrQkFBa0IsQ0FBQ0MsTUFBRCxFQUFTNkIsT0FBVCxFQUFrQjVCLElBQWxCLEVBQXdCbEIsTUFBeEIsQ0FBcEM7QUFDRCxPQUZEO0FBR0F3RSxNQUFBQSxRQUFRLENBQUNVLElBQVQsQ0FBYzJCLElBQWQ7QUFDRCxLQU5EO0FBT0Q7O0FBQ0QsTUFBTU0sWUFBWSxHQUFHLFNBQWZBLFlBQWUsR0FBSztBQUN4QixRQUFNQyxRQUFRLEdBQUcsSUFBSUMsT0FBTyxDQUFDQyxRQUFaLEVBQWpCO0FBQ0EsUUFBTUMsS0FBSyxHQUFHSCxRQUFRLENBQUNJLFlBQVQsQ0FBc0I1RCxTQUF0QixDQUFkO0FBQ0F3RCxJQUFBQSxRQUFRLENBQUNLLE9BQVQsR0FBbUIsV0FBbkI7QUFDQUYsSUFBQUEsS0FBSyxDQUFDeEUsT0FBTixHQUFnQjBCLFNBQWhCOztBQUNBLFFBQUlaLFFBQUosRUFBYztBQUNaMEQsTUFBQUEsS0FBSyxDQUFDRyxPQUFOLENBQWNuRCxPQUFkLEVBQXVCTSxPQUF2QixDQUErQixVQUFBckQsUUFBUSxFQUFHO0FBQ3hDLFlBQUkwQyxRQUFKLEVBQWM7QUFDWjNDLFVBQUFBLGlCQUFpQixDQUFDQyxRQUFELEVBQVcyQixTQUFYLENBQWpCO0FBQ0Q7O0FBQ0QzQixRQUFBQSxRQUFRLENBQUNtRyxRQUFULENBQWtCLFVBQUEvRixTQUFTLEVBQUc7QUFDNUIsY0FBTWdHLFFBQVEsR0FBR0wsS0FBSyxDQUFDTSxTQUFOLENBQWdCakcsU0FBUyxDQUFDNEUsR0FBMUIsQ0FBakI7QUFDQSxjQUFNeEcsTUFBTSxHQUFRaUIsTUFBTSxDQUFDNkcsYUFBUCxDQUFxQkYsUUFBUSxDQUFDekMsR0FBOUIsQ0FBcEI7QUFGNEIsY0FHcEI5QixXQUhvQixHQUdHckQsTUFISCxDQUdwQnFELFdBSG9CO0FBQUEsY0FHUHhCLEtBSE8sR0FHRzdCLE1BSEgsQ0FHUDZCLEtBSE87QUFJNUJGLFVBQUFBLGlCQUFpQixDQUFDQyxTQUFELEVBQVl5QixXQUFXLElBQUl4QixLQUFmLElBQXdCdUIsY0FBeEIsSUFBMENFLFFBQXRELENBQWpCOztBQUNBLGNBQUlZLFFBQUosRUFBYztBQUNaNkQsWUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWNwRyxTQUFkLEVBQXlCO0FBQ3ZCcUcsY0FBQUEsSUFBSSxFQUFFO0FBQ0pDLGdCQUFBQSxJQUFJLEVBQUUsSUFERjtBQUVKNUYsZ0JBQUFBLEtBQUssRUFBRTtBQUNMQyxrQkFBQUEsSUFBSSxFQUFFM0M7QUFERDtBQUZILGVBRGlCO0FBT3ZCdUksY0FBQUEsSUFBSSxFQUFFO0FBQ0pDLGdCQUFBQSxJQUFJLEVBQUUsU0FERjtBQUVKQyxnQkFBQUEsT0FBTyxFQUFDLE9BRko7QUFHSkMsZ0JBQUFBLE9BQU8sRUFBRTtBQUNQL0Ysa0JBQUFBLElBQUksRUFBRTVDO0FBREM7QUFITCxlQVBpQjtBQWN2QjRJLGNBQUFBLE1BQU0sRUFBRXBHLHFCQUFxQjtBQWROLGFBQXpCO0FBZ0JEO0FBQ0YsU0F2QkQ7QUF3QkQsT0E1QkQ7QUE2QkQ7O0FBQ0RvRixJQUFBQSxLQUFLLENBQUNHLE9BQU4sQ0FBY2YsT0FBZCxFQUF1QjlCLE9BQXZCLENBQStCLFVBQUFyRCxRQUFRLEVBQUc7QUFDeEMsVUFBSTBDLFFBQUosRUFBYztBQUNaM0MsUUFBQUEsaUJBQWlCLENBQUNDLFFBQUQsRUFBVzJCLFNBQVgsQ0FBakI7QUFDRDs7QUFDRDNCLE1BQUFBLFFBQVEsQ0FBQ21HLFFBQVQsQ0FBa0IsVUFBQS9GLFNBQVMsRUFBRztBQUM1QixZQUFNZ0csUUFBUSxHQUFHTCxLQUFLLENBQUNNLFNBQU4sQ0FBZ0JqRyxTQUFTLENBQUM0RSxHQUExQixDQUFqQjtBQUNBLFlBQU14RyxNQUFNLEdBQVFpQixNQUFNLENBQUM2RyxhQUFQLENBQXFCRixRQUFRLENBQUN6QyxHQUE5QixDQUFwQjtBQUY0QixZQUdwQnRELEtBSG9CLEdBR1Y3QixNQUhVLENBR3BCNkIsS0FIb0I7QUFJNUJGLFFBQUFBLGlCQUFpQixDQUFDQyxTQUFELEVBQVlDLEtBQUssSUFBSXlCLFFBQXJCLENBQWpCOztBQUNBLFlBQUlZLFFBQUosRUFBYztBQUNaNkQsVUFBQUEsTUFBTSxDQUFDQyxNQUFQLENBQWNwRyxTQUFkLEVBQXlCO0FBQ3ZCcUcsWUFBQUEsSUFBSSxFQUFFO0FBQ0ozRixjQUFBQSxLQUFLLEVBQUU7QUFDTEMsZ0JBQUFBLElBQUksRUFBRTNDO0FBREQ7QUFESCxhQURpQjtBQU12QjJJLFlBQUFBLE1BQU0sRUFBRXBHLHFCQUFxQjtBQU5OLFdBQXpCO0FBUUQ7QUFDRixPQWZEO0FBZ0JELEtBcEJEOztBQXFCQSxRQUFJMkIsUUFBSixFQUFjO0FBQ1p5RCxNQUFBQSxLQUFLLENBQUNHLE9BQU4sQ0FBY2xELFFBQWQsRUFBd0JLLE9BQXhCLENBQWdDLFVBQUFyRCxRQUFRLEVBQUc7QUFDekMsWUFBSTBDLFFBQUosRUFBYztBQUNaM0MsVUFBQUEsaUJBQWlCLENBQUNDLFFBQUQsRUFBVzJCLFNBQVgsQ0FBakI7QUFDRDs7QUFDRDNCLFFBQUFBLFFBQVEsQ0FBQ21HLFFBQVQsQ0FBa0IsVUFBQS9GLFNBQVMsRUFBRztBQUM1QixjQUFNZ0csUUFBUSxHQUFHTCxLQUFLLENBQUNNLFNBQU4sQ0FBZ0JqRyxTQUFTLENBQUM0RSxHQUExQixDQUFqQjtBQUNBLGNBQU14RyxNQUFNLEdBQVFpQixNQUFNLENBQUM2RyxhQUFQLENBQXFCRixRQUFRLENBQUN6QyxHQUE5QixDQUFwQjtBQUY0QixjQUdwQjNCLFdBSG9CLEdBR0d4RCxNQUhILENBR3BCd0QsV0FIb0I7QUFBQSxjQUdQM0IsS0FITyxHQUdHN0IsTUFISCxDQUdQNkIsS0FITztBQUk1QkYsVUFBQUEsaUJBQWlCLENBQUNDLFNBQUQsRUFBWTRCLFdBQVcsSUFBSTNCLEtBQWYsSUFBd0IwQixjQUF4QixJQUEwQ0QsUUFBdEQsQ0FBakI7O0FBQ0EsY0FBSVksUUFBSixFQUFjO0FBQ1o2RCxZQUFBQSxNQUFNLENBQUNDLE1BQVAsQ0FBY3BHLFNBQWQsRUFBeUI7QUFDdkJxRyxjQUFBQSxJQUFJLEVBQUU7QUFDSjNGLGdCQUFBQSxLQUFLLEVBQUU7QUFDTEMsa0JBQUFBLElBQUksRUFBRTNDO0FBREQ7QUFESCxlQURpQjtBQU12QjJJLGNBQUFBLE1BQU0sRUFBRXBHLHFCQUFxQjtBQU5OLGFBQXpCO0FBUUQ7QUFDRixTQWZEO0FBZ0JELE9BcEJEO0FBcUJEOztBQUNELFFBQUkrQixRQUFRLElBQUlDLFdBQWhCLEVBQTZCO0FBQzNCQSxNQUFBQSxXQUFXLENBQUM7QUFBRXJCLFFBQUFBLE9BQU8sRUFBUEEsT0FBRjtBQUFXc0UsUUFBQUEsUUFBUSxFQUFSQSxRQUFYO0FBQXFCb0IsUUFBQUEsU0FBUyxFQUFFakIsS0FBaEM7QUFBdUN4RSxRQUFBQSxPQUFPLEVBQVBBLE9BQXZDO0FBQWdEQyxRQUFBQSxTQUFTLEVBQVRBLFNBQWhEO0FBQTJEQyxRQUFBQSxLQUFLLEVBQUxBLEtBQTNEO0FBQWtFaEMsUUFBQUEsTUFBTSxFQUFOQTtBQUFsRSxPQUFELENBQVg7QUFDRDs7QUFDRHlELElBQUFBLFdBQVcsQ0FBQ0csT0FBWixDQUFvQixnQkFBYTtBQUFBLFVBQVZpQixDQUFVLFFBQVZBLENBQVU7QUFBQSxVQUFQRyxDQUFPLFFBQVBBLENBQU87QUFDL0JzQixNQUFBQSxLQUFLLENBQUNsRCxVQUFOLENBQWlCeUIsQ0FBQyxDQUFDQyxDQUFGLEdBQU0sQ0FBdkIsRUFBMEJELENBQUMsQ0FBQ0UsQ0FBRixHQUFNLENBQWhDLEVBQW1DQyxDQUFDLENBQUNGLENBQUYsR0FBTSxDQUF6QyxFQUE0Q0UsQ0FBQyxDQUFDRCxDQUFGLEdBQU0sQ0FBbEQ7QUFDRCxLQUZEO0FBR0FvQixJQUFBQSxRQUFRLENBQUNxQixJQUFULENBQWNDLFdBQWQsR0FBNEJDLElBQTVCLENBQWlDLFVBQUFDLE1BQU0sRUFBSTtBQUN6QyxVQUFJQyxJQUFJLEdBQUcsSUFBSUMsSUFBSixDQUFTLENBQUNGLE1BQUQsQ0FBVCxFQUFtQjtBQUFFUixRQUFBQSxJQUFJLEVBQUU7QUFBUixPQUFuQixDQUFYLENBRHlDLENBRXpDOztBQUNBVyxNQUFBQSxZQUFZLENBQUNuRyxNQUFELEVBQVNpRyxJQUFULEVBQWUvRixPQUFmLENBQVo7O0FBQ0EsVUFBSXNCLE9BQUosRUFBYTtBQUNYWCxRQUFBQSxLQUFLLENBQUN1RixLQUFOLENBQVluRyxNQUFaO0FBQ0FZLFFBQUFBLEtBQUssQ0FBQ0UsT0FBTixDQUFjO0FBQUVBLFVBQUFBLE9BQU8sRUFBRUQsQ0FBQyxDQUFDLHNCQUFELENBQVo7QUFBc0N1RixVQUFBQSxNQUFNLEVBQUU7QUFBOUMsU0FBZDtBQUNEO0FBQ0YsS0FSRDtBQVNELEdBL0ZEOztBQWdHQSxNQUFJN0UsT0FBSixFQUFhO0FBQ1hYLElBQUFBLEtBQUssQ0FBQ0UsT0FBTixDQUFjO0FBQUVtQixNQUFBQSxFQUFFLEVBQUVqQyxNQUFOO0FBQWNjLE1BQUFBLE9BQU8sRUFBRUQsQ0FBQyxDQUFDLHNCQUFELENBQXhCO0FBQWtEdUYsTUFBQUEsTUFBTSxFQUFFLFNBQTFEO0FBQXFFQyxNQUFBQSxRQUFRLEVBQUUsQ0FBQztBQUFoRixLQUFkO0FBQ0FDLElBQUFBLFVBQVUsQ0FBQ2hDLFlBQUQsRUFBZSxJQUFmLENBQVY7QUFDRCxHQUhELE1BR087QUFDTEEsSUFBQUEsWUFBWTtBQUNiO0FBQ0Y7O0FBRUQsU0FBUzRCLFlBQVQsQ0FBdUJuRyxNQUF2QixFQUF3RGlHLElBQXhELEVBQW9FL0YsT0FBcEUsRUFBOEY7QUFBQSxNQUNwRjdCLE1BRG9GLEdBQ3pFMkIsTUFEeUUsQ0FDcEYzQixNQURvRjtBQUFBLE1BRXBGaUMsSUFGb0YsR0FFM0VqQyxNQUYyRSxDQUVwRmlDLElBRm9GO0FBQUEsTUFHcEZPLEtBSG9GLEdBR3ZFUCxJQUh1RSxDQUdwRk8sS0FIb0Y7QUFBQSxNQUc3RUMsQ0FINkUsR0FHdkVSLElBSHVFLENBRzdFUSxDQUg2RTtBQUFBLE1BSXBGQyxPQUpvRixHQUl4RGIsT0FKd0QsQ0FJcEZhLE9BSm9GO0FBQUEsTUFJM0V5RixRQUoyRSxHQUl4RHRHLE9BSndELENBSTNFc0csUUFKMkU7QUFBQSxNQUlqRWhCLElBSmlFLEdBSXhEdEYsT0FKd0QsQ0FJakVzRixJQUppRTtBQUs1RixNQUFNaEUsT0FBTyxHQUFHVCxPQUFPLEtBQUssS0FBNUI7O0FBQ0EsTUFBSTBGLE1BQU0sQ0FBQ1AsSUFBWCxFQUFpQjtBQUNmLFFBQUlRLFNBQVMsQ0FBQ0MsVUFBZCxFQUEwQjtBQUN4QkQsTUFBQUEsU0FBUyxDQUFDQyxVQUFWLENBQXFCVixJQUFyQixZQUE4Qk8sUUFBOUIsY0FBMENoQixJQUExQztBQUNELEtBRkQsTUFFTztBQUNMLFVBQU1vQixRQUFRLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixHQUF2QixDQUFqQjtBQUNBRixNQUFBQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsUUFBbEI7QUFDQUgsTUFBQUEsUUFBUSxDQUFDSSxRQUFULGFBQXVCUixRQUF2QixjQUFtQ2hCLElBQW5DO0FBQ0FvQixNQUFBQSxRQUFRLENBQUNLLElBQVQsR0FBZ0JDLEdBQUcsQ0FBQ0MsZUFBSixDQUFvQmxCLElBQXBCLENBQWhCO0FBQ0FZLE1BQUFBLFFBQVEsQ0FBQ08sSUFBVCxDQUFjQyxXQUFkLENBQTBCVCxRQUExQjtBQUNBQSxNQUFBQSxRQUFRLENBQUNVLEtBQVQ7QUFDQVQsTUFBQUEsUUFBUSxDQUFDTyxJQUFULENBQWNHLFdBQWQsQ0FBMEJYLFFBQTFCO0FBQ0Q7QUFDRixHQVpELE1BWU87QUFDTCxRQUFJcEYsT0FBSixFQUFhO0FBQ1hYLE1BQUFBLEtBQUssQ0FBQzJHLEtBQU4sQ0FBWTtBQUFFekcsUUFBQUEsT0FBTyxFQUFFRCxDQUFDLENBQUMsa0JBQUQsQ0FBWjtBQUFrQ3VGLFFBQUFBLE1BQU0sRUFBRTtBQUExQyxPQUFaO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQVNvQixlQUFULENBQTBCQyxXQUExQixFQUFpREMsTUFBakQsRUFBaUU7QUFDL0QsU0FBT0EsTUFBTSxDQUFDQyxJQUFQLENBQVksVUFBQUMsS0FBSztBQUFBLFdBQUlILFdBQVcsQ0FBQ3pFLE9BQVosQ0FBb0I0RSxLQUFwQixJQUE2QixDQUFDLENBQWxDO0FBQUEsR0FBakIsQ0FBUDtBQUNEOztBQVFELFNBQVNDLFdBQVQsQ0FBc0I5SCxNQUF0QixFQUFxRDtBQUFBLE1BQzNDM0IsTUFEMkMsR0FDdkIyQixNQUR1QixDQUMzQzNCLE1BRDJDO0FBQUEsTUFDbkM2QixPQURtQyxHQUN2QkYsTUFEdUIsQ0FDbkNFLE9BRG1DO0FBQUEsTUFFM0NJLElBRjJDLEdBRW5CakMsTUFGbUIsQ0FFM0NpQyxJQUYyQztBQUFBLE1BRXJDeUgsYUFGcUMsR0FFbkIxSixNQUZtQixDQUVyQzBKLGFBRnFDO0FBR25ELE1BQU12RyxPQUFPLEdBQUd0QixPQUFPLENBQUNhLE9BQVIsS0FBb0IsS0FBcEM7QUFIbUQsTUFJM0NGLEtBSjJDLEdBSTlCUCxJQUo4QixDQUkzQ08sS0FKMkM7QUFBQSxNQUlwQ0MsQ0FKb0MsR0FJOUJSLElBSjhCLENBSXBDUSxDQUpvQzs7QUFLbkQsTUFBSVUsT0FBSixFQUFhO0FBQ1hYLElBQUFBLEtBQUssQ0FBQ0UsT0FBTixDQUFjO0FBQUVBLE1BQUFBLE9BQU8sRUFBRUQsQ0FBQyxDQUFDLHFCQUFELENBQVo7QUFBcUN1RixNQUFBQSxNQUFNLEVBQUU7QUFBN0MsS0FBZDtBQUNEOztBQUNELE1BQUkwQixhQUFKLEVBQW1CO0FBQ2pCQSxJQUFBQSxhQUFhLENBQUM7QUFBRTFCLE1BQUFBLE1BQU0sRUFBRTtBQUFWLEtBQUQsQ0FBYjtBQUNEO0FBQ0Y7O0FBRUQsU0FBUzJCLFVBQVQsQ0FBcUJoSSxNQUFyQixFQUFvRDtBQUFBLE1BQzFDM0IsTUFEMEMsR0FDUDJCLE1BRE8sQ0FDMUMzQixNQUQwQztBQUFBLE1BQ2xDOEIsT0FEa0MsR0FDUEgsTUFETyxDQUNsQ0csT0FEa0M7QUFBQSxNQUN6QkQsT0FEeUIsR0FDUEYsTUFETyxDQUN6QkUsT0FEeUI7QUFBQSxNQUNoQitILElBRGdCLEdBQ1BqSSxNQURPLENBQ2hCaUksSUFEZ0I7QUFBQSxNQUUxQzNILElBRjBDLEdBRWpCakMsTUFGaUIsQ0FFMUNpQyxJQUYwQztBQUFBLE1BRXBDNEgsY0FGb0MsR0FFakI3SixNQUZpQixDQUVwQzZKLGNBRm9DO0FBQUEsTUFHMUNySCxLQUgwQyxHQUc3QlAsSUFINkIsQ0FHMUNPLEtBSDBDO0FBQUEsTUFHbkNDLENBSG1DLEdBRzdCUixJQUg2QixDQUduQ1EsQ0FIbUM7QUFJbEQsTUFBTVUsT0FBTyxHQUFHdEIsT0FBTyxDQUFDYSxPQUFSLEtBQW9CLEtBQXBDO0FBQ0EsTUFBTW9ILFVBQVUsR0FBRyxJQUFJQyxVQUFKLEVBQW5COztBQUNBRCxFQUFBQSxVQUFVLENBQUNFLE9BQVgsR0FBcUIsWUFBSztBQUN4QlAsSUFBQUEsV0FBVyxDQUFDOUgsTUFBRCxDQUFYO0FBQ0QsR0FGRDs7QUFHQW1JLEVBQUFBLFVBQVUsQ0FBQ0csTUFBWCxHQUFvQixVQUFDQyxJQUFELEVBQVM7QUFDM0IsUUFBTWIsV0FBVyxHQUFhLEVBQTlCO0FBQ0F2SCxJQUFBQSxPQUFPLENBQUM4QixPQUFSLENBQWdCLFVBQUM3RSxNQUFELEVBQVc7QUFDekIsVUFBTXlLLEtBQUssR0FBR3pLLE1BQU0sQ0FBQytFLFFBQXJCOztBQUNBLFVBQUkwRixLQUFKLEVBQVc7QUFDVEgsUUFBQUEsV0FBVyxDQUFDcEYsSUFBWixDQUFpQnVGLEtBQWpCO0FBQ0Q7QUFDRixLQUxEO0FBTUEsUUFBTXJELFFBQVEsR0FBRyxJQUFJQyxPQUFPLENBQUNDLFFBQVosRUFBakI7QUFDQSxRQUFNOEQsWUFBWSxHQUFHRCxJQUFJLENBQUN4QixNQUExQjs7QUFDQSxRQUFJeUIsWUFBSixFQUFrQjtBQUNoQmhFLE1BQUFBLFFBQVEsQ0FBQ3FCLElBQVQsQ0FBYzRDLElBQWQsQ0FBbUJELFlBQVksQ0FBQ0UsTUFBaEMsRUFBdUQzQyxJQUF2RCxDQUE0RCxVQUFBNEMsRUFBRSxFQUFHO0FBQy9ELFlBQU1DLFVBQVUsR0FBR0QsRUFBRSxDQUFDRSxVQUFILENBQWMsQ0FBZCxDQUFuQjs7QUFDQSxZQUFJRCxVQUFKLEVBQWdCO0FBQ2QsY0FBTUUsV0FBVyxHQUFHRixVQUFVLENBQUNHLGNBQVgsRUFBcEI7O0FBQ0EsY0FBTUMsVUFBVSxHQUFHekwsb0JBQVEwTCxXQUFSLENBQW9CSCxXQUFwQixFQUFpQyxVQUFDSSxJQUFEO0FBQUEsbUJBQVVBLElBQUksSUFBSUEsSUFBSSxDQUFDdkwsTUFBTCxHQUFjLENBQWhDO0FBQUEsV0FBakMsQ0FBbkI7O0FBQ0EsY0FBTWdLLE1BQU0sR0FBR21CLFdBQVcsQ0FBQ0UsVUFBRCxDQUExQjtBQUNBLGNBQU0zQyxNQUFNLEdBQUdvQixlQUFlLENBQUNDLFdBQUQsRUFBY0MsTUFBZCxDQUE5Qjs7QUFDQSxjQUFJdEIsTUFBSixFQUFZO0FBQ1YsZ0JBQU04QyxPQUFPLEdBQUdMLFdBQVcsQ0FBQ00sS0FBWixDQUFrQkosVUFBbEIsRUFBOEJoRixHQUE5QixDQUFrQyxVQUFBa0YsSUFBSSxFQUFHO0FBQ3ZELGtCQUFNakYsSUFBSSxHQUFRLEVBQWxCO0FBQ0FpRixjQUFBQSxJQUFJLENBQUNqSCxPQUFMLENBQWEsVUFBQzVFLFNBQUQsRUFBWWdNLE1BQVosRUFBc0I7QUFDakNwRixnQkFBQUEsSUFBSSxDQUFDMEQsTUFBTSxDQUFDMEIsTUFBRCxDQUFQLENBQUosR0FBdUJoTSxTQUF2QjtBQUNELGVBRkQ7QUFHQSxrQkFBTWlNLE1BQU0sR0FBUSxFQUFwQjtBQUNBNUIsY0FBQUEsV0FBVyxDQUFDekYsT0FBWixDQUFvQixVQUFBNEYsS0FBSyxFQUFHO0FBQzFCeUIsZ0JBQUFBLE1BQU0sQ0FBQ3pCLEtBQUQsQ0FBTixHQUFnQnRLLG9CQUFRZ00sV0FBUixDQUFvQnRGLElBQUksQ0FBQzRELEtBQUQsQ0FBeEIsSUFBbUMsSUFBbkMsR0FBMEM1RCxJQUFJLENBQUM0RCxLQUFELENBQTlEO0FBQ0QsZUFGRDtBQUdBLHFCQUFPeUIsTUFBUDtBQUNELGFBVmUsQ0FBaEI7QUFXQWpMLFlBQUFBLE1BQU0sQ0FBQ21MLFVBQVAsQ0FBa0JMLE9BQWxCLEVBQ0dwRCxJQURILENBQ1EsVUFBQzBELElBQUQsRUFBZ0I7QUFDcEIsa0JBQUlDLFFBQUo7O0FBQ0Esa0JBQUl4SixPQUFPLENBQUN5SixJQUFSLEtBQWlCLFFBQXJCLEVBQStCO0FBQzdCRCxnQkFBQUEsUUFBUSxHQUFHckwsTUFBTSxDQUFDdUwsUUFBUCxDQUFnQkgsSUFBaEIsRUFBc0IsQ0FBQyxDQUF2QixDQUFYO0FBQ0QsZUFGRCxNQUVPO0FBQ0xDLGdCQUFBQSxRQUFRLEdBQUdyTCxNQUFNLENBQUN3TCxVQUFQLENBQWtCSixJQUFsQixDQUFYO0FBQ0Q7O0FBQ0QscUJBQU9DLFFBQVEsQ0FBQzNELElBQVQsQ0FBYyxZQUFLO0FBQ3hCLG9CQUFJbUMsY0FBSixFQUFvQjtBQUNsQkEsa0JBQUFBLGNBQWMsQ0FBQztBQUFFN0Isb0JBQUFBLE1BQU0sRUFBRTtBQUFWLG1CQUFELENBQWQ7QUFDRDtBQUNGLGVBSk0sQ0FBUDtBQUtELGFBYkg7O0FBY0EsZ0JBQUk3RSxPQUFKLEVBQWE7QUFDWFgsY0FBQUEsS0FBSyxDQUFDRSxPQUFOLENBQWM7QUFBRUEsZ0JBQUFBLE9BQU8sRUFBRUQsQ0FBQyxDQUFDLHNCQUFELEVBQXlCLENBQUNxSSxPQUFPLENBQUN4TCxNQUFULENBQXpCLENBQVo7QUFBd0QwSSxnQkFBQUEsTUFBTSxFQUFFO0FBQWhFLGVBQWQ7QUFDRDtBQUNGLFdBN0JELE1BNkJPO0FBQ0x5QixZQUFBQSxXQUFXLENBQUM5SCxNQUFELENBQVg7QUFDRDtBQUNGLFNBckNELE1BcUNPO0FBQ0w4SCxVQUFBQSxXQUFXLENBQUM5SCxNQUFELENBQVg7QUFDRDtBQUNGLE9BMUNEO0FBMkNELEtBNUNELE1BNENPO0FBQ0w4SCxNQUFBQSxXQUFXLENBQUM5SCxNQUFELENBQVg7QUFDRDtBQUNGLEdBekREOztBQTBEQW1JLEVBQUFBLFVBQVUsQ0FBQzJCLGlCQUFYLENBQTZCN0IsSUFBN0I7QUFDRDs7QUFFRCxTQUFTOEIsaUJBQVQsQ0FBNEIvSixNQUE1QixFQUEyRDtBQUN6RCxNQUFJQSxNQUFNLENBQUNFLE9BQVAsQ0FBZXNGLElBQWYsS0FBd0IsTUFBNUIsRUFBb0M7QUFDbEN3QyxJQUFBQSxVQUFVLENBQUNoSSxNQUFELENBQVY7QUFDQSxXQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVELFNBQVNnSyxpQkFBVCxDQUE0QmhLLE1BQTVCLEVBQTJEO0FBQ3pELE1BQUlBLE1BQU0sQ0FBQ0UsT0FBUCxDQUFlc0YsSUFBZixLQUF3QixNQUE1QixFQUFvQztBQUNsQ3pGLElBQUFBLFVBQVUsQ0FBQ0MsTUFBRCxDQUFWO0FBQ0EsV0FBTyxLQUFQO0FBQ0Q7QUFDRjtBQUVEO0FDL0JBO0FBQ0E7OztBRGlDTyxJQUFNaUssd0JBQXdCLEdBQUc7QUFDdENDLEVBQUFBLE9BRHNDLG1CQUM3QkMsUUFENkIsRUFDSjtBQUFBLFFBQ3hCQyxXQUR3QixHQUNSRCxRQURRLENBQ3hCQyxXQUR3QjtBQUVoQ0QsSUFBQUEsUUFBUSxDQUFDRSxLQUFULENBQWU7QUFDYixnQkFBUTtBQUNOQyxRQUFBQSxLQUFLLEVBQUU7QUFDTHpFLFVBQUFBLElBQUksRUFBRTtBQUREO0FBREQ7QUFESyxLQUFmO0FBT0F1RSxJQUFBQSxXQUFXLENBQUNHLEtBQVosQ0FBa0I7QUFDaEIsc0JBQWdCUixpQkFEQTtBQUVoQixzQkFBZ0JDO0FBRkEsS0FBbEI7QUFJRDtBQWRxQyxDQUFqQzs7O0FBaUJQLElBQUksT0FBT3ZELE1BQVAsS0FBa0IsV0FBbEIsSUFBaUNBLE1BQU0sQ0FBQytELFFBQXhDLElBQW9EL0QsTUFBTSxDQUFDK0QsUUFBUCxDQUFnQkMsR0FBeEUsRUFBNkU7QUFDM0VoRSxFQUFBQSxNQUFNLENBQUMrRCxRQUFQLENBQWdCQyxHQUFoQixDQUFvQlIsd0JBQXBCO0FBQ0Q7O2VBRWNBLHdCIiwiZmlsZSI6ImluZGV4LmNvbW1vbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBYRVV0aWxzIGZyb20gJ3hlLXV0aWxzJ1xyXG5pbXBvcnQge1xyXG4gIFZYRVRhYmxlLFxyXG4gIFRhYmxlLFxyXG4gIEludGVyY2VwdG9yRXhwb3J0UGFyYW1zLFxyXG4gIEludGVyY2VwdG9ySW1wb3J0UGFyYW1zLFxyXG4gIENvbHVtbkNvbmZpZyxcclxuICBUYWJsZUV4cG9ydENvbmZpZyxcclxuICBDb2x1bW5BbGlnblxyXG59IGZyb20gJ3Z4ZS10YWJsZS9saWIvdnhlLXRhYmxlJ1xyXG5pbXBvcnQgKiBhcyBFeGNlbEpTIGZyb20gJ2V4Y2VsanMnXHJcblxyXG5jb25zdCBkZWZhdWx0SGVhZGVyQmFja2dyb3VuZENvbG9yID0gJ2Y4ZjhmOSdcclxuY29uc3QgZGVmYXVsdENlbGxGb250Q29sb3IgPSAnNjA2MjY2J1xyXG5jb25zdCBkZWZhdWx0Q2VsbEJvcmRlclN0eWxlID0gJ3RoaW4nXHJcbmNvbnN0IGRlZmF1bHRDZWxsQm9yZGVyQ29sb3IgPSAnZThlYWVjJ1xyXG5cclxuZnVuY3Rpb24gZ2V0Q2VsbExhYmVsIChjb2x1bW46IENvbHVtbkNvbmZpZywgY2VsbFZhbHVlOiBhbnkpIHtcclxuICBpZiAoY2VsbFZhbHVlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbHVtbi5jZWxsVHlwZSkge1xyXG4gICAgICBjYXNlICdzdHJpbmcnOlxyXG4gICAgICAgIHJldHVybiBYRVV0aWxzLnRvU3RyaW5nKGNlbGxWYWx1ZSlcclxuICAgICAgY2FzZSAnbnVtYmVyJzpcclxuICAgICAgICBpZiAoIWlzTmFOKGNlbGxWYWx1ZSkpIHtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIoY2VsbFZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGlmIChjZWxsVmFsdWUubGVuZ3RoIDwgMTIgJiYgIWlzTmFOKGNlbGxWYWx1ZSkpIHtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIoY2VsbFZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY2VsbFZhbHVlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEZvb3RlckRhdGEgKG9wdHM6IFRhYmxlRXhwb3J0Q29uZmlnLCBmb290ZXJEYXRhOiBhbnlbXVtdKSB7XHJcbiAgY29uc3QgeyBmb290ZXJGaWx0ZXJNZXRob2QgfSA9IG9wdHNcclxuICByZXR1cm4gZm9vdGVyRmlsdGVyTWV0aG9kID8gZm9vdGVyRGF0YS5maWx0ZXIoKGl0ZW1zLCBpbmRleCkgPT4gZm9vdGVyRmlsdGVyTWV0aG9kKHsgaXRlbXMsICRyb3dJbmRleDogaW5kZXggfSkpIDogZm9vdGVyRGF0YVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRGb290ZXJDZWxsVmFsdWUgKCR0YWJsZTogVGFibGUsIG9wdHM6IFRhYmxlRXhwb3J0Q29uZmlnLCByb3dzOiBhbnlbXSwgY29sdW1uOiBDb2x1bW5Db25maWcpIHtcclxuICBjb25zdCBjZWxsVmFsdWUgPSBnZXRDZWxsTGFiZWwoY29sdW1uLCByb3dzWyR0YWJsZS5nZXRWTUNvbHVtbkluZGV4KGNvbHVtbildKVxyXG4gIHJldHVybiBjZWxsVmFsdWVcclxufVxyXG5cclxuZGVjbGFyZSBtb2R1bGUgJ3Z4ZS10YWJsZS9saWIvdnhlLXRhYmxlJyB7XHJcbiAgaW50ZXJmYWNlIENvbHVtbkluZm8ge1xyXG4gICAgX3JvdzogYW55O1xyXG4gICAgX2NvbFNwYW46IG51bWJlcjtcclxuICAgIF9yb3dTcGFuOiBudW1iZXI7XHJcbiAgICBjaGlsZE5vZGVzOiBDb2x1bW5Db25maWdbXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFZhbGlkQ29sdW1uIChjb2x1bW46IENvbHVtbkNvbmZpZyk6IENvbHVtbkNvbmZpZyB7XHJcbiAgY29uc3QgeyBjaGlsZE5vZGVzIH0gPSBjb2x1bW5cclxuICBjb25zdCBpc0NvbEdyb3VwID0gY2hpbGROb2RlcyAmJiBjaGlsZE5vZGVzLmxlbmd0aFxyXG4gIGlmIChpc0NvbEdyb3VwKSB7XHJcbiAgICByZXR1cm4gZ2V0VmFsaWRDb2x1bW4oY2hpbGROb2Rlc1swXSlcclxuICB9XHJcbiAgcmV0dXJuIGNvbHVtblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRFeGNlbFJvd0hlaWdodCAoZXhjZWxSb3c6IEV4Y2VsSlMuUm93LCBoZWlnaHQ6IG51bWJlcikge1xyXG4gIGlmIChoZWlnaHQpIHtcclxuICAgIGV4Y2VsUm93LmhlaWdodCA9IFhFVXRpbHMuZmxvb3IoaGVpZ2h0ICogMC43NSwgMTIpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRFeGNlbENlbGxTdHlsZSAoZXhjZWxDZWxsOiBFeGNlbEpTLkNlbGwsIGFsaWduPzogQ29sdW1uQWxpZ24pIHtcclxuICBleGNlbENlbGwucHJvdGVjdGlvbiA9IHtcclxuICAgIGxvY2tlZDogZmFsc2VcclxuICB9XHJcbiAgZXhjZWxDZWxsLmFsaWdubWVudCA9IHtcclxuICAgIHZlcnRpY2FsOiAnbWlkZGxlJyxcclxuICAgIGhvcml6b250YWw6IGFsaWduIHx8ICdsZWZ0J1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdEJvcmRlclN0eWxlICgpIHtcclxuICByZXR1cm4ge1xyXG4gICAgdG9wOiB7XHJcbiAgICAgIHN0eWxlOiBkZWZhdWx0Q2VsbEJvcmRlclN0eWxlLFxyXG4gICAgICBjb2xvcjoge1xyXG4gICAgICAgIGFyZ2I6IGRlZmF1bHRDZWxsQm9yZGVyQ29sb3JcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGxlZnQ6IHtcclxuICAgICAgc3R5bGU6IGRlZmF1bHRDZWxsQm9yZGVyU3R5bGUsXHJcbiAgICAgIGNvbG9yOiB7XHJcbiAgICAgICAgYXJnYjogZGVmYXVsdENlbGxCb3JkZXJDb2xvclxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgYm90dG9tOiB7XHJcbiAgICAgIHN0eWxlOiBkZWZhdWx0Q2VsbEJvcmRlclN0eWxlLFxyXG4gICAgICBjb2xvcjoge1xyXG4gICAgICAgIGFyZ2I6IGRlZmF1bHRDZWxsQm9yZGVyQ29sb3JcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJpZ2h0OiB7XHJcbiAgICAgIHN0eWxlOiBkZWZhdWx0Q2VsbEJvcmRlclN0eWxlLFxyXG4gICAgICBjb2xvcjoge1xyXG4gICAgICAgIGFyZ2I6IGRlZmF1bHRDZWxsQm9yZGVyQ29sb3JcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3J0WExTWCAocGFyYW1zOiBJbnRlcmNlcHRvckV4cG9ydFBhcmFtcykge1xyXG4gIGNvbnN0IG1zZ0tleSA9ICd4bHN4J1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zLCBjb2x1bW5zLCBjb2xncm91cHMsIGRhdGFzIH0gPSBwYXJhbXNcclxuICBjb25zdCB7ICR2eGUsIHJvd0hlaWdodCwgaGVhZGVyQWxpZ246IGFsbEhlYWRlckFsaWduLCBhbGlnbjogYWxsQWxpZ24sIGZvb3RlckFsaWduOiBhbGxGb290ZXJBbGlnbiB9ID0gJHRhYmxlXHJcbiAgY29uc3QgeyBtb2RhbCwgdCB9ID0gJHZ4ZVxyXG4gIGNvbnN0IHsgbWVzc2FnZSwgc2hlZXROYW1lLCBpc0hlYWRlciwgaXNGb290ZXIsIGlzTWVyZ2UsIGlzQ29sZ3JvdXAsIG9yaWdpbmFsLCB1c2VTdHlsZSwgc2hlZXRNZXRob2QgfSA9IG9wdGlvbnNcclxuICBjb25zdCBzaG93TXNnID0gbWVzc2FnZSAhPT0gZmFsc2VcclxuICBjb25zdCBtZXJnZUNlbGxzID0gJHRhYmxlLmdldE1lcmdlQ2VsbHMoKVxyXG4gIGNvbnN0IGNvbExpc3Q6IGFueVtdID0gW11cclxuICBjb25zdCBmb290TGlzdDogYW55W10gPSBbXVxyXG4gIGNvbnN0IHNoZWV0Q29sczogYW55W10gPSBbXVxyXG4gIGNvbnN0IHNoZWV0TWVyZ2VzOiB7IHM6IHsgcjogbnVtYmVyLCBjOiBudW1iZXIgfSwgZTogeyByOiBudW1iZXIsIGM6IG51bWJlciB9IH1bXSA9IFtdXHJcbiAgbGV0IGJlZm9yZVJvd0NvdW50ID0gMFxyXG4gIGNvbnN0IGNvbEhlYWQ6IGFueSA9IHt9XHJcbiAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgIGNvbnN0IHsgaWQsIHByb3BlcnR5LCByZW5kZXJXaWR0aCB9ID0gY29sdW1uXHJcbiAgICBjb2xIZWFkW2lkXSA9IG9yaWdpbmFsID8gcHJvcGVydHkgOiBjb2x1bW4uZ2V0VGl0bGUoKVxyXG4gICAgc2hlZXRDb2xzLnB1c2goe1xyXG4gICAgICBrZXk6IGlkLFxyXG4gICAgICB3aWR0aDogWEVVdGlscy5jZWlsKHJlbmRlcldpZHRoIC8gOCwgMSlcclxuICAgIH0pXHJcbiAgfSlcclxuICAvLyDlpITnkIbooajlpLRcclxuICBpZiAoaXNIZWFkZXIpIHtcclxuICAgIC8vIOWkhOeQhuWIhue7hFxyXG4gICAgaWYgKGlzQ29sZ3JvdXAgJiYgIW9yaWdpbmFsICYmIGNvbGdyb3Vwcykge1xyXG4gICAgICBjb2xncm91cHMuZm9yRWFjaCgoY29scywgckluZGV4KSA9PiB7XHJcbiAgICAgICAgbGV0IGdyb3VwSGVhZDogYW55ID0ge31cclxuICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgZ3JvdXBIZWFkW2NvbHVtbi5pZF0gPSBudWxsXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb2xzLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgeyBfY29sU3BhbiwgX3Jvd1NwYW4gfSA9IGNvbHVtblxyXG4gICAgICAgICAgY29uc3QgdmFsaWRDb2x1bW4gPSBnZXRWYWxpZENvbHVtbihjb2x1bW4pXHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IGNvbHVtbnMuaW5kZXhPZih2YWxpZENvbHVtbilcclxuICAgICAgICAgIGdyb3VwSGVhZFt2YWxpZENvbHVtbi5pZF0gPSBvcmlnaW5hbCA/IHZhbGlkQ29sdW1uLnByb3BlcnR5IDogY29sdW1uLmdldFRpdGxlKClcclxuICAgICAgICAgIGlmIChfY29sU3BhbiA+IDEgfHwgX3Jvd1NwYW4gPiAxKSB7XHJcbiAgICAgICAgICAgIHNoZWV0TWVyZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgIHM6IHsgcjogckluZGV4LCBjOiBjb2x1bW5JbmRleCB9LFxyXG4gICAgICAgICAgICAgIGU6IHsgcjogckluZGV4ICsgX3Jvd1NwYW4gLSAxLCBjOiBjb2x1bW5JbmRleCArIF9jb2xTcGFuIC0gMSB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb2xMaXN0LnB1c2goZ3JvdXBIZWFkKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29sTGlzdC5wdXNoKGNvbEhlYWQpXHJcbiAgICB9XHJcbiAgICBiZWZvcmVSb3dDb3VudCArPSBjb2xMaXN0Lmxlbmd0aFxyXG4gIH1cclxuICAvLyDlpITnkIblkIjlubZcclxuICBpZiAoaXNNZXJnZSAmJiAhb3JpZ2luYWwpIHtcclxuICAgIG1lcmdlQ2VsbHMuZm9yRWFjaChtZXJnZUl0ZW0gPT4ge1xyXG4gICAgICBsZXQgeyByb3c6IG1lcmdlUm93SW5kZXgsIHJvd3NwYW46IG1lcmdlUm93c3BhbiwgY29sOiBtZXJnZUNvbEluZGV4LCBjb2xzcGFuOiBtZXJnZUNvbHNwYW4gfSA9IG1lcmdlSXRlbVxyXG4gICAgICBzaGVldE1lcmdlcy5wdXNoKHtcclxuICAgICAgICBzOiB7IHI6IG1lcmdlUm93SW5kZXggKyBiZWZvcmVSb3dDb3VudCwgYzogbWVyZ2VDb2xJbmRleCB9LFxyXG4gICAgICAgIGU6IHsgcjogbWVyZ2VSb3dJbmRleCArIGJlZm9yZVJvd0NvdW50ICsgbWVyZ2VSb3dzcGFuIC0gMSwgYzogbWVyZ2VDb2xJbmRleCArIG1lcmdlQ29sc3BhbiAtIDEgfVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3Qgcm93TGlzdCA9IGRhdGFzLm1hcChpdGVtID0+IHtcclxuICAgIGNvbnN0IHJlc3Q6IGFueSA9IHt9XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICByZXN0W2NvbHVtbi5pZF0gPSBnZXRDZWxsTGFiZWwoY29sdW1uLCBpdGVtW2NvbHVtbi5pZF0pXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHJlc3RcclxuICB9KVxyXG4gIGJlZm9yZVJvd0NvdW50ICs9IHJvd0xpc3QubGVuZ3RoXHJcbiAgLy8g5aSE55CG6KGo5bC+XHJcbiAgaWYgKGlzRm9vdGVyKSB7XHJcbiAgICBjb25zdCB7IGZvb3RlckRhdGEgfSA9ICR0YWJsZS5nZXRUYWJsZURhdGEoKVxyXG4gICAgY29uc3QgZm9vdGVycyA9IGdldEZvb3RlckRhdGEob3B0aW9ucywgZm9vdGVyRGF0YSlcclxuICAgIGNvbnN0IG1lcmdlRm9vdGVySXRlbXMgPSAkdGFibGUuZ2V0TWVyZ2VGb290ZXJJdGVtcygpXHJcbiAgICAvLyDlpITnkIblkIjlubZcclxuICAgIGlmIChpc01lcmdlICYmICFvcmlnaW5hbCkge1xyXG4gICAgICBtZXJnZUZvb3Rlckl0ZW1zLmZvckVhY2gobWVyZ2VJdGVtID0+IHtcclxuICAgICAgICBsZXQgeyByb3c6IG1lcmdlUm93SW5kZXgsIHJvd3NwYW46IG1lcmdlUm93c3BhbiwgY29sOiBtZXJnZUNvbEluZGV4LCBjb2xzcGFuOiBtZXJnZUNvbHNwYW4gfSA9IG1lcmdlSXRlbVxyXG4gICAgICAgIHNoZWV0TWVyZ2VzLnB1c2goe1xyXG4gICAgICAgICAgczogeyByOiBtZXJnZVJvd0luZGV4ICsgYmVmb3JlUm93Q291bnQsIGM6IG1lcmdlQ29sSW5kZXggfSxcclxuICAgICAgICAgIGU6IHsgcjogbWVyZ2VSb3dJbmRleCArIGJlZm9yZVJvd0NvdW50ICsgbWVyZ2VSb3dzcGFuIC0gMSwgYzogbWVyZ2VDb2xJbmRleCArIG1lcmdlQ29sc3BhbiAtIDEgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBmb290ZXJzLmZvckVhY2goKHJvd3MpID0+IHtcclxuICAgICAgY29uc3QgaXRlbTogYW55ID0ge31cclxuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBpdGVtW2NvbHVtbi5pZF0gPSBnZXRGb290ZXJDZWxsVmFsdWUoJHRhYmxlLCBvcHRpb25zLCByb3dzLCBjb2x1bW4pXHJcbiAgICAgIH0pXHJcbiAgICAgIGZvb3RMaXN0LnB1c2goaXRlbSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGNvbnN0IGV4cG9ydE1ldGhvZCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKVxyXG4gICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoc2hlZXROYW1lKVxyXG4gICAgd29ya2Jvb2suY3JlYXRvciA9ICd2eGUtdGFibGUnXHJcbiAgICBzaGVldC5jb2x1bW5zID0gc2hlZXRDb2xzXHJcbiAgICBpZiAoaXNIZWFkZXIpIHtcclxuICAgICAgc2hlZXQuYWRkUm93cyhjb2xMaXN0KS5mb3JFYWNoKGV4Y2VsUm93ID0+IHtcclxuICAgICAgICBpZiAodXNlU3R5bGUpIHtcclxuICAgICAgICAgIHNldEV4Y2VsUm93SGVpZ2h0KGV4Y2VsUm93LCByb3dIZWlnaHQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV4Y2VsUm93LmVhY2hDZWxsKGV4Y2VsQ2VsbCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBleGNlbENvbCA9IHNoZWV0LmdldENvbHVtbihleGNlbENlbGwuY29sKVxyXG4gICAgICAgICAgY29uc3QgY29sdW1uOiBhbnkgPSAkdGFibGUuZ2V0Q29sdW1uQnlJZChleGNlbENvbC5rZXkgYXMgc3RyaW5nKVxyXG4gICAgICAgICAgY29uc3QgeyBoZWFkZXJBbGlnbiwgYWxpZ24gfSA9IGNvbHVtblxyXG4gICAgICAgICAgc2V0RXhjZWxDZWxsU3R5bGUoZXhjZWxDZWxsLCBoZWFkZXJBbGlnbiB8fCBhbGlnbiB8fCBhbGxIZWFkZXJBbGlnbiB8fCBhbGxBbGlnbilcclxuICAgICAgICAgIGlmICh1c2VTdHlsZSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGV4Y2VsQ2VsbCwge1xyXG4gICAgICAgICAgICAgIGZvbnQ6IHtcclxuICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb2xvcjoge1xyXG4gICAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0Q2VsbEZvbnRDb2xvclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZmlsbDoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3BhdHRlcm4nLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjonc29saWQnLFxyXG4gICAgICAgICAgICAgICAgZmdDb2xvcjoge1xyXG4gICAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0SGVhZGVyQmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBib3JkZXI6IGdldERlZmF1bHRCb3JkZXJTdHlsZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHNoZWV0LmFkZFJvd3Mocm93TGlzdCkuZm9yRWFjaChleGNlbFJvdyA9PiB7XHJcbiAgICAgIGlmICh1c2VTdHlsZSkge1xyXG4gICAgICAgIHNldEV4Y2VsUm93SGVpZ2h0KGV4Y2VsUm93LCByb3dIZWlnaHQpXHJcbiAgICAgIH1cclxuICAgICAgZXhjZWxSb3cuZWFjaENlbGwoZXhjZWxDZWxsID0+IHtcclxuICAgICAgICBjb25zdCBleGNlbENvbCA9IHNoZWV0LmdldENvbHVtbihleGNlbENlbGwuY29sKVxyXG4gICAgICAgIGNvbnN0IGNvbHVtbjogYW55ID0gJHRhYmxlLmdldENvbHVtbkJ5SWQoZXhjZWxDb2wua2V5IGFzIHN0cmluZylcclxuICAgICAgICBjb25zdCB7IGFsaWduIH0gPSBjb2x1bW5cclxuICAgICAgICBzZXRFeGNlbENlbGxTdHlsZShleGNlbENlbGwsIGFsaWduIHx8IGFsbEFsaWduKVxyXG4gICAgICAgIGlmICh1c2VTdHlsZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihleGNlbENlbGwsIHtcclxuICAgICAgICAgICAgZm9udDoge1xyXG4gICAgICAgICAgICAgIGNvbG9yOiB7XHJcbiAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0Q2VsbEZvbnRDb2xvclxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYm9yZGVyOiBnZXREZWZhdWx0Qm9yZGVyU3R5bGUoKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gICAgaWYgKGlzRm9vdGVyKSB7XHJcbiAgICAgIHNoZWV0LmFkZFJvd3MoZm9vdExpc3QpLmZvckVhY2goZXhjZWxSb3cgPT4ge1xyXG4gICAgICAgIGlmICh1c2VTdHlsZSkge1xyXG4gICAgICAgICAgc2V0RXhjZWxSb3dIZWlnaHQoZXhjZWxSb3csIHJvd0hlaWdodClcclxuICAgICAgICB9XHJcbiAgICAgICAgZXhjZWxSb3cuZWFjaENlbGwoZXhjZWxDZWxsID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV4Y2VsQ29sID0gc2hlZXQuZ2V0Q29sdW1uKGV4Y2VsQ2VsbC5jb2wpXHJcbiAgICAgICAgICBjb25zdCBjb2x1bW46IGFueSA9ICR0YWJsZS5nZXRDb2x1bW5CeUlkKGV4Y2VsQ29sLmtleSBhcyBzdHJpbmcpXHJcbiAgICAgICAgICBjb25zdCB7IGZvb3RlckFsaWduLCBhbGlnbiB9ID0gY29sdW1uXHJcbiAgICAgICAgICBzZXRFeGNlbENlbGxTdHlsZShleGNlbENlbGwsIGZvb3RlckFsaWduIHx8IGFsaWduIHx8IGFsbEZvb3RlckFsaWduIHx8IGFsbEFsaWduKVxyXG4gICAgICAgICAgaWYgKHVzZVN0eWxlKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhjZWxDZWxsLCB7XHJcbiAgICAgICAgICAgICAgZm9udDoge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IHtcclxuICAgICAgICAgICAgICAgICAgYXJnYjogZGVmYXVsdENlbGxGb250Q29sb3JcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGJvcmRlcjogZ2V0RGVmYXVsdEJvcmRlclN0eWxlKClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgaWYgKHVzZVN0eWxlICYmIHNoZWV0TWV0aG9kKSB7XHJcbiAgICAgIHNoZWV0TWV0aG9kKHsgb3B0aW9ucywgd29ya2Jvb2ssIHdvcmtzaGVldDogc2hlZXQsIGNvbHVtbnMsIGNvbGdyb3VwcywgZGF0YXMsICR0YWJsZSB9KVxyXG4gICAgfVxyXG4gICAgc2hlZXRNZXJnZXMuZm9yRWFjaCgoeyBzLCBlIH0pID0+IHtcclxuICAgICAgc2hlZXQubWVyZ2VDZWxscyhzLnIgKyAxLCBzLmMgKyAxLCBlLnIgKyAxLCBlLmMgKyAxKVxyXG4gICAgfSlcclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciAgPT4ge1xyXG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pXHJcbiAgICAgIC8vIOWvvOWHuiB4bHN4XHJcbiAgICAgIGRvd25sb2FkRmlsZShwYXJhbXMsIGJsb2IsIG9wdGlvbnMpXHJcbiAgICAgIGlmIChzaG93TXNnKSB7XHJcbiAgICAgICAgbW9kYWwuY2xvc2UobXNnS2V5KVxyXG4gICAgICAgIG1vZGFsLm1lc3NhZ2UoeyBtZXNzYWdlOiB0KCd2eGUudGFibGUuZXhwU3VjY2VzcycpLCBzdGF0dXM6ICdzdWNjZXNzJyB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBpZiAoc2hvd01zZykge1xyXG4gICAgbW9kYWwubWVzc2FnZSh7IGlkOiBtc2dLZXksIG1lc3NhZ2U6IHQoJ3Z4ZS50YWJsZS5leHBMb2FkaW5nJyksIHN0YXR1czogJ2xvYWRpbmcnLCBkdXJhdGlvbjogLTEgfSlcclxuICAgIHNldFRpbWVvdXQoZXhwb3J0TWV0aG9kLCAxNTAwKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBleHBvcnRNZXRob2QoKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG93bmxvYWRGaWxlIChwYXJhbXM6IEludGVyY2VwdG9yRXhwb3J0UGFyYW1zLCBibG9iOiBCbG9iLCBvcHRpb25zOiBUYWJsZUV4cG9ydENvbmZpZykge1xyXG4gIGNvbnN0IHsgJHRhYmxlIH0gPSBwYXJhbXNcclxuICBjb25zdCB7ICR2eGUgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IHsgbW9kYWwsIHQgfSA9ICR2eGVcclxuICBjb25zdCB7IG1lc3NhZ2UsIGZpbGVuYW1lLCB0eXBlIH0gPSBvcHRpb25zXHJcbiAgY29uc3Qgc2hvd01zZyA9IG1lc3NhZ2UgIT09IGZhbHNlXHJcbiAgaWYgKHdpbmRvdy5CbG9iKSB7XHJcbiAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcclxuICAgICAgbmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYiwgYCR7ZmlsZW5hbWV9LiR7dHlwZX1gKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbGlua0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgbGlua0VsZW0udGFyZ2V0ID0gJ19ibGFuaydcclxuICAgICAgbGlua0VsZW0uZG93bmxvYWQgPSBgJHtmaWxlbmFtZX0uJHt0eXBlfWBcclxuICAgICAgbGlua0VsZW0uaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rRWxlbSlcclxuICAgICAgbGlua0VsZW0uY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmtFbGVtKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBpZiAoc2hvd01zZykge1xyXG4gICAgICBtb2RhbC5hbGVydCh7IG1lc3NhZ2U6IHQoJ3Z4ZS5lcnJvci5ub3RFeHAnKSwgc3RhdHVzOiAnZXJyb3InIH0pXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0ltcG9ydERhdGEgKHRhYmxlRmllbGRzOiBzdHJpbmdbXSwgZmllbGRzOiBzdHJpbmdbXSkge1xyXG4gIHJldHVybiBmaWVsZHMuc29tZShmaWVsZCA9PiB0YWJsZUZpZWxkcy5pbmRleE9mKGZpZWxkKSA+IC0xKVxyXG59XHJcblxyXG5kZWNsYXJlIG1vZHVsZSAndnhlLXRhYmxlL2xpYi92eGUtdGFibGUnIHtcclxuICBpbnRlcmZhY2UgVGFibGUge1xyXG4gICAgX2ltcG9ydFJlc29sdmU/OiBGdW5jdGlvbiB8IG51bGw7XHJcbiAgICBfaW1wb3J0UmVqZWN0PzogRnVuY3Rpb24gfCBudWxsO1xyXG4gIH1cclxufVxyXG5mdW5jdGlvbiBpbXBvcnRFcnJvciAocGFyYW1zOiBJbnRlcmNlcHRvckltcG9ydFBhcmFtcykge1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zIH0gPSBwYXJhbXNcclxuICBjb25zdCB7ICR2eGUsIF9pbXBvcnRSZWplY3QgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IHNob3dNc2cgPSBvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlXHJcbiAgY29uc3QgeyBtb2RhbCwgdCB9ID0gJHZ4ZVxyXG4gIGlmIChzaG93TXNnKSB7XHJcbiAgICBtb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogdCgndnhlLmVycm9yLmltcEZpZWxkcycpLCBzdGF0dXM6ICdlcnJvcicgfSlcclxuICB9XHJcbiAgaWYgKF9pbXBvcnRSZWplY3QpIHtcclxuICAgIF9pbXBvcnRSZWplY3QoeyBzdGF0dXM6IGZhbHNlIH0pXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbXBvcnRYTFNYIChwYXJhbXM6IEludGVyY2VwdG9ySW1wb3J0UGFyYW1zKSB7XHJcbiAgY29uc3QgeyAkdGFibGUsIGNvbHVtbnMsIG9wdGlvbnMsIGZpbGUgfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgJHZ4ZSwgX2ltcG9ydFJlc29sdmUgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IHsgbW9kYWwsIHQgfSA9ICR2eGVcclxuICBjb25zdCBzaG93TXNnID0gb3B0aW9ucy5tZXNzYWdlICE9PSBmYWxzZVxyXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgZmlsZVJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgaW1wb3J0RXJyb3IocGFyYW1zKVxyXG4gIH1cclxuICBmaWxlUmVhZGVyLm9ubG9hZCA9IChldm50KSA9PiB7XHJcbiAgICBjb25zdCB0YWJsZUZpZWxkczogc3RyaW5nW10gPSBbXVxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ucHJvcGVydHlcclxuICAgICAgaWYgKGZpZWxkKSB7XHJcbiAgICAgICAgdGFibGVGaWVsZHMucHVzaChmaWVsZClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKVxyXG4gICAgY29uc3QgcmVhZGVyVGFyZ2V0ID0gZXZudC50YXJnZXRcclxuICAgIGlmIChyZWFkZXJUYXJnZXQpIHtcclxuICAgICAgd29ya2Jvb2sueGxzeC5sb2FkKHJlYWRlclRhcmdldC5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpLnRoZW4od2IgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0U2hlZXQgPSB3Yi53b3Jrc2hlZXRzWzBdXHJcbiAgICAgICAgaWYgKGZpcnN0U2hlZXQpIHtcclxuICAgICAgICAgIGNvbnN0IHNoZWV0VmFsdWVzID0gZmlyc3RTaGVldC5nZXRTaGVldFZhbHVlcygpIGFzIHN0cmluZ1tdW11cclxuICAgICAgICAgIGNvbnN0IGZpZWxkSW5kZXggPSBYRVV0aWxzLmZpbmRJbmRleE9mKHNoZWV0VmFsdWVzLCAobGlzdCkgPT4gbGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSBzaGVldFZhbHVlc1tmaWVsZEluZGV4XSBhcyBzdHJpbmdbXVxyXG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gY2hlY2tJbXBvcnREYXRhKHRhYmxlRmllbGRzLCBmaWVsZHMpXHJcbiAgICAgICAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZHMgPSBzaGVldFZhbHVlcy5zbGljZShmaWVsZEluZGV4KS5tYXAobGlzdCA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA6IGFueT0ge31cclxuICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGNlbGxWYWx1ZSwgY0luZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtW2ZpZWxkc1tjSW5kZXhdXSA9IGNlbGxWYWx1ZVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgY29uc3QgcmVjb3JkOiBhbnkgPSB7fVxyXG4gICAgICAgICAgICAgIHRhYmxlRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFhFVXRpbHMuaXNVbmRlZmluZWQoaXRlbVtmaWVsZF0pID8gbnVsbCA6IGl0ZW1bZmllbGRdXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICR0YWJsZS5jcmVhdGVEYXRhKHJlY29yZHMpXHJcbiAgICAgICAgICAgICAgLnRoZW4oKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9hZFJlc3Q6IFByb21pc2U8YW55PlxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ2luc2VydCcpIHtcclxuICAgICAgICAgICAgICAgICAgbG9hZFJlc3QgPSAkdGFibGUuaW5zZXJ0QXQoZGF0YSwgLTEpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBsb2FkUmVzdCA9ICR0YWJsZS5yZWxvYWREYXRhKGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZFJlc3QudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChfaW1wb3J0UmVzb2x2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF9pbXBvcnRSZXNvbHZlKHsgc3RhdHVzOiB0cnVlIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYgKHNob3dNc2cpIHtcclxuICAgICAgICAgICAgICBtb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogdCgndnhlLnRhYmxlLmltcFN1Y2Nlc3MnLCBbcmVjb3Jkcy5sZW5ndGhdKSwgc3RhdHVzOiAnc3VjY2VzcycgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1wb3J0RXJyb3IocGFyYW1zKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpbXBvcnRFcnJvcihwYXJhbXMpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1wb3J0RXJyb3IocGFyYW1zKVxyXG4gICAgfVxyXG4gIH1cclxuICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUltcG9ydEV2ZW50IChwYXJhbXM6IEludGVyY2VwdG9ySW1wb3J0UGFyYW1zKSB7XHJcbiAgaWYgKHBhcmFtcy5vcHRpb25zLnR5cGUgPT09ICd4bHN4Jykge1xyXG4gICAgaW1wb3J0WExTWChwYXJhbXMpXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUV4cG9ydEV2ZW50IChwYXJhbXM6IEludGVyY2VwdG9yRXhwb3J0UGFyYW1zKSB7XHJcbiAgaWYgKHBhcmFtcy5vcHRpb25zLnR5cGUgPT09ICd4bHN4Jykge1xyXG4gICAgZXhwb3J0WExTWChwYXJhbXMpXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDln7rkuo4gdnhlLXRhYmxlIOihqOagvOeahOWinuW8uuaPkuS7tu+8jOaUr+aMgeWvvOWHuiB4bHN4IOagvOW8j1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWCA9IHtcclxuICBpbnN0YWxsICh2eGV0YWJsZTogdHlwZW9mIFZYRVRhYmxlKSB7XHJcbiAgICBjb25zdCB7IGludGVyY2VwdG9yIH0gPSB2eGV0YWJsZVxyXG4gICAgdnhldGFibGUuc2V0dXAoe1xyXG4gICAgICBleHBvcnQ6IHtcclxuICAgICAgICB0eXBlczoge1xyXG4gICAgICAgICAgeGxzeDogMFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGludGVyY2VwdG9yLm1peGluKHtcclxuICAgICAgJ2V2ZW50LmltcG9ydCc6IGhhbmRsZUltcG9ydEV2ZW50LFxyXG4gICAgICAnZXZlbnQuZXhwb3J0JzogaGFuZGxlRXhwb3J0RXZlbnRcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZYRVRhYmxlICYmIHdpbmRvdy5WWEVUYWJsZS51c2UpIHtcclxuICB3aW5kb3cuVlhFVGFibGUudXNlKFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWClcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYXHJcbiIsImltcG9ydCBYRVV0aWxzIGZyb20gJ3hlLXV0aWxzJztcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XG5jb25zdCBkZWZhdWx0SGVhZGVyQmFja2dyb3VuZENvbG9yID0gJ2Y4ZjhmOSc7XG5jb25zdCBkZWZhdWx0Q2VsbEZvbnRDb2xvciA9ICc2MDYyNjYnO1xuY29uc3QgZGVmYXVsdENlbGxCb3JkZXJTdHlsZSA9ICd0aGluJztcbmNvbnN0IGRlZmF1bHRDZWxsQm9yZGVyQ29sb3IgPSAnZThlYWVjJztcbmZ1bmN0aW9uIGdldENlbGxMYWJlbChjb2x1bW4sIGNlbGxWYWx1ZSkge1xuICAgIGlmIChjZWxsVmFsdWUpIHtcbiAgICAgICAgc3dpdGNoIChjb2x1bW4uY2VsbFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFhFVXRpbHMudG9TdHJpbmcoY2VsbFZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihjZWxsVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIoY2VsbFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChjZWxsVmFsdWUubGVuZ3RoIDwgMTIgJiYgIWlzTmFOKGNlbGxWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihjZWxsVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2VsbFZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Rm9vdGVyRGF0YShvcHRzLCBmb290ZXJEYXRhKSB7XG4gICAgY29uc3QgeyBmb290ZXJGaWx0ZXJNZXRob2QgfSA9IG9wdHM7XG4gICAgcmV0dXJuIGZvb3RlckZpbHRlck1ldGhvZCA/IGZvb3RlckRhdGEuZmlsdGVyKChpdGVtcywgaW5kZXgpID0+IGZvb3RlckZpbHRlck1ldGhvZCh7IGl0ZW1zLCAkcm93SW5kZXg6IGluZGV4IH0pKSA6IGZvb3RlckRhdGE7XG59XG5mdW5jdGlvbiBnZXRGb290ZXJDZWxsVmFsdWUoJHRhYmxlLCBvcHRzLCByb3dzLCBjb2x1bW4pIHtcbiAgICBjb25zdCBjZWxsVmFsdWUgPSBnZXRDZWxsTGFiZWwoY29sdW1uLCByb3dzWyR0YWJsZS5nZXRWTUNvbHVtbkluZGV4KGNvbHVtbildKTtcbiAgICByZXR1cm4gY2VsbFZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0VmFsaWRDb2x1bW4oY29sdW1uKSB7XG4gICAgY29uc3QgeyBjaGlsZE5vZGVzIH0gPSBjb2x1bW47XG4gICAgY29uc3QgaXNDb2xHcm91cCA9IGNoaWxkTm9kZXMgJiYgY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgaWYgKGlzQ29sR3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGdldFZhbGlkQ29sdW1uKGNoaWxkTm9kZXNbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uO1xufVxuZnVuY3Rpb24gc2V0RXhjZWxSb3dIZWlnaHQoZXhjZWxSb3csIGhlaWdodCkge1xuICAgIGlmIChoZWlnaHQpIHtcbiAgICAgICAgZXhjZWxSb3cuaGVpZ2h0ID0gWEVVdGlscy5mbG9vcihoZWlnaHQgKiAwLjc1LCAxMik7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0RXhjZWxDZWxsU3R5bGUoZXhjZWxDZWxsLCBhbGlnbikge1xuICAgIGV4Y2VsQ2VsbC5wcm90ZWN0aW9uID0ge1xuICAgICAgICBsb2NrZWQ6IGZhbHNlXG4gICAgfTtcbiAgICBleGNlbENlbGwuYWxpZ25tZW50ID0ge1xuICAgICAgICB2ZXJ0aWNhbDogJ21pZGRsZScsXG4gICAgICAgIGhvcml6b250YWw6IGFsaWduIHx8ICdsZWZ0J1xuICAgIH07XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0Qm9yZGVyU3R5bGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9wOiB7XG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdENlbGxCb3JkZXJTdHlsZSxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgYXJnYjogZGVmYXVsdENlbGxCb3JkZXJDb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdENlbGxCb3JkZXJTdHlsZSxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgYXJnYjogZGVmYXVsdENlbGxCb3JkZXJDb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBib3R0b206IHtcbiAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0Q2VsbEJvcmRlclN0eWxlLFxuICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0Q2VsbEJvcmRlckNvbG9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdENlbGxCb3JkZXJTdHlsZSxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgYXJnYjogZGVmYXVsdENlbGxCb3JkZXJDb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGV4cG9ydFhMU1gocGFyYW1zKSB7XG4gICAgY29uc3QgbXNnS2V5ID0gJ3hsc3gnO1xuICAgIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zLCBjb2x1bW5zLCBjb2xncm91cHMsIGRhdGFzIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyAkdnhlLCByb3dIZWlnaHQsIGhlYWRlckFsaWduOiBhbGxIZWFkZXJBbGlnbiwgYWxpZ246IGFsbEFsaWduLCBmb290ZXJBbGlnbjogYWxsRm9vdGVyQWxpZ24gfSA9ICR0YWJsZTtcbiAgICBjb25zdCB7IG1vZGFsLCB0IH0gPSAkdnhlO1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgc2hlZXROYW1lLCBpc0hlYWRlciwgaXNGb290ZXIsIGlzTWVyZ2UsIGlzQ29sZ3JvdXAsIG9yaWdpbmFsLCB1c2VTdHlsZSwgc2hlZXRNZXRob2QgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2hvd01zZyA9IG1lc3NhZ2UgIT09IGZhbHNlO1xuICAgIGNvbnN0IG1lcmdlQ2VsbHMgPSAkdGFibGUuZ2V0TWVyZ2VDZWxscygpO1xuICAgIGNvbnN0IGNvbExpc3QgPSBbXTtcbiAgICBjb25zdCBmb290TGlzdCA9IFtdO1xuICAgIGNvbnN0IHNoZWV0Q29scyA9IFtdO1xuICAgIGNvbnN0IHNoZWV0TWVyZ2VzID0gW107XG4gICAgbGV0IGJlZm9yZVJvd0NvdW50ID0gMDtcbiAgICBjb25zdCBjb2xIZWFkID0ge307XG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgeyBpZCwgcHJvcGVydHksIHJlbmRlcldpZHRoIH0gPSBjb2x1bW47XG4gICAgICAgIGNvbEhlYWRbaWRdID0gb3JpZ2luYWwgPyBwcm9wZXJ0eSA6IGNvbHVtbi5nZXRUaXRsZSgpO1xuICAgICAgICBzaGVldENvbHMucHVzaCh7XG4gICAgICAgICAgICBrZXk6IGlkLFxuICAgICAgICAgICAgd2lkdGg6IFhFVXRpbHMuY2VpbChyZW5kZXJXaWR0aCAvIDgsIDEpXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIOWkhOeQhuihqOWktFxuICAgIGlmIChpc0hlYWRlcikge1xuICAgICAgICAvLyDlpITnkIbliIbnu4RcbiAgICAgICAgaWYgKGlzQ29sZ3JvdXAgJiYgIW9yaWdpbmFsICYmIGNvbGdyb3Vwcykge1xuICAgICAgICAgICAgY29sZ3JvdXBzLmZvckVhY2goKGNvbHMsIHJJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBncm91cEhlYWQgPSB7fTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBncm91cEhlYWRbY29sdW1uLmlkXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29scy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBfY29sU3BhbiwgX3Jvd1NwYW4gfSA9IGNvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRDb2x1bW4gPSBnZXRWYWxpZENvbHVtbihjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IGNvbHVtbnMuaW5kZXhPZih2YWxpZENvbHVtbik7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSGVhZFt2YWxpZENvbHVtbi5pZF0gPSBvcmlnaW5hbCA/IHZhbGlkQ29sdW1uLnByb3BlcnR5IDogY29sdW1uLmdldFRpdGxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfY29sU3BhbiA+IDEgfHwgX3Jvd1NwYW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaGVldE1lcmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiB7IHI6IHJJbmRleCwgYzogY29sdW1uSW5kZXggfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiB7IHI6IHJJbmRleCArIF9yb3dTcGFuIC0gMSwgYzogY29sdW1uSW5kZXggKyBfY29sU3BhbiAtIDEgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb2xMaXN0LnB1c2goZ3JvdXBIZWFkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29sTGlzdC5wdXNoKGNvbEhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGJlZm9yZVJvd0NvdW50ICs9IGNvbExpc3QubGVuZ3RoO1xuICAgIH1cbiAgICAvLyDlpITnkIblkIjlubZcbiAgICBpZiAoaXNNZXJnZSAmJiAhb3JpZ2luYWwpIHtcbiAgICAgICAgbWVyZ2VDZWxscy5mb3JFYWNoKG1lcmdlSXRlbSA9PiB7XG4gICAgICAgICAgICBsZXQgeyByb3c6IG1lcmdlUm93SW5kZXgsIHJvd3NwYW46IG1lcmdlUm93c3BhbiwgY29sOiBtZXJnZUNvbEluZGV4LCBjb2xzcGFuOiBtZXJnZUNvbHNwYW4gfSA9IG1lcmdlSXRlbTtcbiAgICAgICAgICAgIHNoZWV0TWVyZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIHM6IHsgcjogbWVyZ2VSb3dJbmRleCArIGJlZm9yZVJvd0NvdW50LCBjOiBtZXJnZUNvbEluZGV4IH0sXG4gICAgICAgICAgICAgICAgZTogeyByOiBtZXJnZVJvd0luZGV4ICsgYmVmb3JlUm93Q291bnQgKyBtZXJnZVJvd3NwYW4gLSAxLCBjOiBtZXJnZUNvbEluZGV4ICsgbWVyZ2VDb2xzcGFuIC0gMSB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJvd0xpc3QgPSBkYXRhcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIHJlc3RbY29sdW1uLmlkXSA9IGdldENlbGxMYWJlbChjb2x1bW4sIGl0ZW1bY29sdW1uLmlkXSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdDtcbiAgICB9KTtcbiAgICBiZWZvcmVSb3dDb3VudCArPSByb3dMaXN0Lmxlbmd0aDtcbiAgICAvLyDlpITnkIbooajlsL5cbiAgICBpZiAoaXNGb290ZXIpIHtcbiAgICAgICAgY29uc3QgeyBmb290ZXJEYXRhIH0gPSAkdGFibGUuZ2V0VGFibGVEYXRhKCk7XG4gICAgICAgIGNvbnN0IGZvb3RlcnMgPSBnZXRGb290ZXJEYXRhKG9wdGlvbnMsIGZvb3RlckRhdGEpO1xuICAgICAgICBjb25zdCBtZXJnZUZvb3Rlckl0ZW1zID0gJHRhYmxlLmdldE1lcmdlRm9vdGVySXRlbXMoKTtcbiAgICAgICAgLy8g5aSE55CG5ZCI5bm2XG4gICAgICAgIGlmIChpc01lcmdlICYmICFvcmlnaW5hbCkge1xuICAgICAgICAgICAgbWVyZ2VGb290ZXJJdGVtcy5mb3JFYWNoKG1lcmdlSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcm93OiBtZXJnZVJvd0luZGV4LCByb3dzcGFuOiBtZXJnZVJvd3NwYW4sIGNvbDogbWVyZ2VDb2xJbmRleCwgY29sc3BhbjogbWVyZ2VDb2xzcGFuIH0gPSBtZXJnZUl0ZW07XG4gICAgICAgICAgICAgICAgc2hlZXRNZXJnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHM6IHsgcjogbWVyZ2VSb3dJbmRleCArIGJlZm9yZVJvd0NvdW50LCBjOiBtZXJnZUNvbEluZGV4IH0sXG4gICAgICAgICAgICAgICAgICAgIGU6IHsgcjogbWVyZ2VSb3dJbmRleCArIGJlZm9yZVJvd0NvdW50ICsgbWVyZ2VSb3dzcGFuIC0gMSwgYzogbWVyZ2VDb2xJbmRleCArIG1lcmdlQ29sc3BhbiAtIDEgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9vdGVycy5mb3JFYWNoKChyb3dzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0ge307XG4gICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IGdldEZvb3RlckNlbGxWYWx1ZSgkdGFibGUsIG9wdGlvbnMsIHJvd3MsIGNvbHVtbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvb3RMaXN0LnB1c2goaXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBleHBvcnRNZXRob2QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcbiAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5hZGRXb3Jrc2hlZXQoc2hlZXROYW1lKTtcbiAgICAgICAgd29ya2Jvb2suY3JlYXRvciA9ICd2eGUtdGFibGUnO1xuICAgICAgICBzaGVldC5jb2x1bW5zID0gc2hlZXRDb2xzO1xuICAgICAgICBpZiAoaXNIZWFkZXIpIHtcbiAgICAgICAgICAgIHNoZWV0LmFkZFJvd3MoY29sTGlzdCkuZm9yRWFjaChleGNlbFJvdyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEV4Y2VsUm93SGVpZ2h0KGV4Y2VsUm93LCByb3dIZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleGNlbFJvdy5lYWNoQ2VsbChleGNlbENlbGwgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlbENvbCA9IHNoZWV0LmdldENvbHVtbihleGNlbENlbGwuY29sKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gJHRhYmxlLmdldENvbHVtbkJ5SWQoZXhjZWxDb2wua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXJBbGlnbiwgYWxpZ24gfSA9IGNvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXhjZWxDZWxsU3R5bGUoZXhjZWxDZWxsLCBoZWFkZXJBbGlnbiB8fCBhbGlnbiB8fCBhbGxIZWFkZXJBbGlnbiB8fCBhbGxBbGlnbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleGNlbENlbGwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0Q2VsbEZvbnRDb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYXR0ZXJuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmdDb2xvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYjogZGVmYXVsdEhlYWRlckJhY2tncm91bmRDb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGdldERlZmF1bHRCb3JkZXJTdHlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2hlZXQuYWRkUm93cyhyb3dMaXN0KS5mb3JFYWNoKGV4Y2VsUm93ID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VTdHlsZSkge1xuICAgICAgICAgICAgICAgIHNldEV4Y2VsUm93SGVpZ2h0KGV4Y2VsUm93LCByb3dIZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhjZWxSb3cuZWFjaENlbGwoZXhjZWxDZWxsID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGNlbENvbCA9IHNoZWV0LmdldENvbHVtbihleGNlbENlbGwuY29sKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSAkdGFibGUuZ2V0Q29sdW1uQnlJZChleGNlbENvbC5rZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYWxpZ24gfSA9IGNvbHVtbjtcbiAgICAgICAgICAgICAgICBzZXRFeGNlbENlbGxTdHlsZShleGNlbENlbGwsIGFsaWduIHx8IGFsbEFsaWduKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlU3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleGNlbENlbGwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiOiBkZWZhdWx0Q2VsbEZvbnRDb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGdldERlZmF1bHRCb3JkZXJTdHlsZSgpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzRm9vdGVyKSB7XG4gICAgICAgICAgICBzaGVldC5hZGRSb3dzKGZvb3RMaXN0KS5mb3JFYWNoKGV4Y2VsUm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodXNlU3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0RXhjZWxSb3dIZWlnaHQoZXhjZWxSb3csIHJvd0hlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4Y2VsUm93LmVhY2hDZWxsKGV4Y2VsQ2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VsQ29sID0gc2hlZXQuZ2V0Q29sdW1uKGV4Y2VsQ2VsbC5jb2wpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSAkdGFibGUuZ2V0Q29sdW1uQnlJZChleGNlbENvbC5rZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZvb3RlckFsaWduLCBhbGlnbiB9ID0gY29sdW1uO1xuICAgICAgICAgICAgICAgICAgICBzZXRFeGNlbENlbGxTdHlsZShleGNlbENlbGwsIGZvb3RlckFsaWduIHx8IGFsaWduIHx8IGFsbEZvb3RlckFsaWduIHx8IGFsbEFsaWduKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGV4Y2VsQ2VsbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2I6IGRlZmF1bHRDZWxsRm9udENvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogZ2V0RGVmYXVsdEJvcmRlclN0eWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlU3R5bGUgJiYgc2hlZXRNZXRob2QpIHtcbiAgICAgICAgICAgIHNoZWV0TWV0aG9kKHsgb3B0aW9ucywgd29ya2Jvb2ssIHdvcmtzaGVldDogc2hlZXQsIGNvbHVtbnMsIGNvbGdyb3VwcywgZGF0YXMsICR0YWJsZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBzaGVldE1lcmdlcy5mb3JFYWNoKCh7IHMsIGUgfSkgPT4ge1xuICAgICAgICAgICAgc2hlZXQubWVyZ2VDZWxscyhzLnIgKyAxLCBzLmMgKyAxLCBlLnIgKyAxLCBlLmMgKyAxKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XG4gICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgICAgICAgLy8g5a+85Ye6IHhsc3hcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZShwYXJhbXMsIGJsb2IsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHNob3dNc2cpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5jbG9zZShtc2dLZXkpO1xuICAgICAgICAgICAgICAgIG1vZGFsLm1lc3NhZ2UoeyBtZXNzYWdlOiB0KCd2eGUudGFibGUuZXhwU3VjY2VzcycpLCBzdGF0dXM6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoc2hvd01zZykge1xuICAgICAgICBtb2RhbC5tZXNzYWdlKHsgaWQ6IG1zZ0tleSwgbWVzc2FnZTogdCgndnhlLnRhYmxlLmV4cExvYWRpbmcnKSwgc3RhdHVzOiAnbG9hZGluZycsIGR1cmF0aW9uOiAtMSB9KTtcbiAgICAgICAgc2V0VGltZW91dChleHBvcnRNZXRob2QsIDE1MDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZXhwb3J0TWV0aG9kKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZG93bmxvYWRGaWxlKHBhcmFtcywgYmxvYiwgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgJHRhYmxlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyAkdnhlIH0gPSAkdGFibGU7XG4gICAgY29uc3QgeyBtb2RhbCwgdCB9ID0gJHZ4ZTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGZpbGVuYW1lLCB0eXBlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNob3dNc2cgPSBtZXNzYWdlICE9PSBmYWxzZTtcbiAgICBpZiAod2luZG93LkJsb2IpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBgJHtmaWxlbmFtZX0uJHt0eXBlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGlua0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsaW5rRWxlbS50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGxpbmtFbGVtLmRvd25sb2FkID0gYCR7ZmlsZW5hbWV9LiR7dHlwZX1gO1xuICAgICAgICAgICAgbGlua0VsZW0uaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmtFbGVtKTtcbiAgICAgICAgICAgIGxpbmtFbGVtLmNsaWNrKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmtFbGVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHNob3dNc2cpIHtcbiAgICAgICAgICAgIG1vZGFsLmFsZXJ0KHsgbWVzc2FnZTogdCgndnhlLmVycm9yLm5vdEV4cCcpLCBzdGF0dXM6ICdlcnJvcicgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0ltcG9ydERhdGEodGFibGVGaWVsZHMsIGZpZWxkcykge1xuICAgIHJldHVybiBmaWVsZHMuc29tZShmaWVsZCA9PiB0YWJsZUZpZWxkcy5pbmRleE9mKGZpZWxkKSA+IC0xKTtcbn1cbmZ1bmN0aW9uIGltcG9ydEVycm9yKHBhcmFtcykge1xuICAgIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgeyAkdnhlLCBfaW1wb3J0UmVqZWN0IH0gPSAkdGFibGU7XG4gICAgY29uc3Qgc2hvd01zZyA9IG9wdGlvbnMubWVzc2FnZSAhPT0gZmFsc2U7XG4gICAgY29uc3QgeyBtb2RhbCwgdCB9ID0gJHZ4ZTtcbiAgICBpZiAoc2hvd01zZykge1xuICAgICAgICBtb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogdCgndnhlLmVycm9yLmltcEZpZWxkcycpLCBzdGF0dXM6ICdlcnJvcicgfSk7XG4gICAgfVxuICAgIGlmIChfaW1wb3J0UmVqZWN0KSB7XG4gICAgICAgIF9pbXBvcnRSZWplY3QoeyBzdGF0dXM6IGZhbHNlIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGltcG9ydFhMU1gocGFyYW1zKSB7XG4gICAgY29uc3QgeyAkdGFibGUsIGNvbHVtbnMsIG9wdGlvbnMsIGZpbGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7ICR2eGUsIF9pbXBvcnRSZXNvbHZlIH0gPSAkdGFibGU7XG4gICAgY29uc3QgeyBtb2RhbCwgdCB9ID0gJHZ4ZTtcbiAgICBjb25zdCBzaG93TXNnID0gb3B0aW9ucy5tZXNzYWdlICE9PSBmYWxzZTtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGltcG9ydEVycm9yKHBhcmFtcyk7XG4gICAgfTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChldm50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhYmxlRmllbGRzID0gW107XG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5wcm9wZXJ0eTtcbiAgICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIHRhYmxlRmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgd29ya2Jvb2sgPSBuZXcgRXhjZWxKUy5Xb3JrYm9vaygpO1xuICAgICAgICBjb25zdCByZWFkZXJUYXJnZXQgPSBldm50LnRhcmdldDtcbiAgICAgICAgaWYgKHJlYWRlclRhcmdldCkge1xuICAgICAgICAgICAgd29ya2Jvb2sueGxzeC5sb2FkKHJlYWRlclRhcmdldC5yZXN1bHQpLnRoZW4od2IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0U2hlZXQgPSB3Yi53b3Jrc2hlZXRzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdFNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0VmFsdWVzID0gZmlyc3RTaGVldC5nZXRTaGVldFZhbHVlcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEluZGV4ID0gWEVVdGlscy5maW5kSW5kZXhPZihzaGVldFZhbHVlcywgKGxpc3QpID0+IGxpc3QgJiYgbGlzdC5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRzID0gc2hlZXRWYWx1ZXNbZmllbGRJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGNoZWNrSW1wb3J0RGF0YSh0YWJsZUZpZWxkcywgZmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IHNoZWV0VmFsdWVzLnNsaWNlKGZpZWxkSW5kZXgpLm1hcChsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChjZWxsVmFsdWUsIGNJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtW2ZpZWxkc1tjSW5kZXhdXSA9IGNlbGxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2ZpZWxkXSA9IFhFVXRpbHMuaXNVbmRlZmluZWQoaXRlbVtmaWVsZF0pID8gbnVsbCA6IGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0YWJsZS5jcmVhdGVEYXRhKHJlY29yZHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbG9hZFJlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFJlc3QgPSAkdGFibGUuaW5zZXJ0QXQoZGF0YSwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFJlc3QgPSAkdGFibGUucmVsb2FkRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRSZXN0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2ltcG9ydFJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbXBvcnRSZXNvbHZlKHsgc3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93TXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IHQoJ3Z4ZS50YWJsZS5pbXBTdWNjZXNzJywgW3JlY29yZHMubGVuZ3RoXSksIHN0YXR1czogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0RXJyb3IocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RXJyb3IocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGltcG9ydEVycm9yKHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG59XG5mdW5jdGlvbiBoYW5kbGVJbXBvcnRFdmVudChwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLm9wdGlvbnMudHlwZSA9PT0gJ3hsc3gnKSB7XG4gICAgICAgIGltcG9ydFhMU1gocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUV4cG9ydEV2ZW50KHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcbiAgICAgICAgZXhwb3J0WExTWChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiDln7rkuo4gdnhlLXRhYmxlIOihqOagvOeahOWinuW8uuaPkuS7tu+8jOaUr+aMgeWvvOWHuiB4bHN4IOagvOW8j1xuICovXG5leHBvcnQgY29uc3QgVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYID0ge1xuICAgIGluc3RhbGwodnhldGFibGUpIHtcbiAgICAgICAgY29uc3QgeyBpbnRlcmNlcHRvciB9ID0gdnhldGFibGU7XG4gICAgICAgIHZ4ZXRhYmxlLnNldHVwKHtcbiAgICAgICAgICAgIGV4cG9ydDoge1xuICAgICAgICAgICAgICAgIHR5cGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHhsc3g6IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpbnRlcmNlcHRvci5taXhpbih7XG4gICAgICAgICAgICAnZXZlbnQuaW1wb3J0JzogaGFuZGxlSW1wb3J0RXZlbnQsXG4gICAgICAgICAgICAnZXZlbnQuZXhwb3J0JzogaGFuZGxlRXhwb3J0RXZlbnRcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVlhFVGFibGUgJiYgd2luZG93LlZYRVRhYmxlLnVzZSkge1xuICAgIHdpbmRvdy5WWEVUYWJsZS51c2UoVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYKTtcbn1cbmV4cG9ydCBkZWZhdWx0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWDtcbiJdfQ==