docx4js-fork
Version:
javascript docx parser
412 lines (366 loc) • 50.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _officeDocument = require("../officeDocument");
var _officeDocument2 = _interopRequireDefault(_officeDocument);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var A = "A".charCodeAt(0);
//A=>0, Z=>25, AA=>26
function colStrToInt(col) {
var last = col.substr(-1).charCodeAt(0) - A;
if (col.length > 1) {
return 26 * (colStrToInt(col.substring(0, col.length - 1)) + 1) + last;
}
return last;
}
//0=>A, 25=>Z, 26=>AA
function colIntToStr(col) {
var i0 = String.fromCharCode(A + col % 26);
if (col >= 26) {
return colIntToStr(parseInt(col / 26) - 1) + i0;
} else {
return i0;
}
}
var OfficeDocument = function (_Base) {
_inherits(OfficeDocument, _Base);
function OfficeDocument() {
_classCallCheck(this, OfficeDocument);
return _possibleConstructorReturn(this, (OfficeDocument.__proto__ || Object.getPrototypeOf(OfficeDocument)).apply(this, arguments));
}
_createClass(OfficeDocument, [{
key: "_init",
value: function _init() {
var _this2 = this;
_get(OfficeDocument.prototype.__proto__ || Object.getPrototypeOf(OfficeDocument.prototype), "_init", this).call(this);
var doc = this.doc;
this._assignRel(["styles", "sharedStrings"]);
Object.assign(this.sharedStrings, {
eq: function eq(i) {
return this.root().children("sst").children().eq(parseInt(i));
},
doc: doc
});
Object.assign(this.styles, { identities: this.constructor.identities, doc: doc });
this.theme.color = function (i) {
var $ = this("a\\:clrScheme>a\\:" + ColorIndex[parseInt(i)]).children().first();
return doc.asColor($.attr("lastClr") || $.attr("val"));
};
this.color = function (_ref) {
var _ref$attribs = _ref.attribs,
rgb = _ref$attribs.rgb,
theme = _ref$attribs.theme,
indexed = _ref$attribs.indexed,
tint = _ref$attribs.tint;
var v = rgb && "#" + rgb.substr(2) || theme && _this2.theme.color(theme) || indexed != undefined && "" + XLSIcv[parseInt(indexed)];
return tint ? _this2.doc.asColor(v, { tint: parseFloat(tint) }) : v;
};
}
}, {
key: "cellPlainText",
value: function cellPlainText(sheetIndex, row, col) {
row = row + 1;
col = colIntToStr(col);
var sheet = this.sheet(this.content("sheets>sheet").get(sheetIndex).attribs);
var s = sheet("worksheet>sheetData>row[r=" + row + "]>c[r='" + col + row + "']>v").text();
if (s) {
return this.sharedStrings.eq(s).text();
}
return "";
}
}, {
key: "sheet",
value: function sheet(_ref2) {
var rid = _ref2["r:id"];
return this.getRel(rid);
}
}, {
key: "render",
value: function render(createElement) {
var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor);
this.renderNode(this.styles("styleSheet").get(0), createElement, identify);
return this.renderNode(this.content("workbook").get(0), createElement, identify);
}
}]);
return OfficeDocument;
}(_officeDocument2.default);
OfficeDocument.colStrToInt = colStrToInt;
OfficeDocument.colIntToStr = colIntToStr;
OfficeDocument.identities = {
workbook: function workbook(wXml, officeDocument) {
var $ = officeDocument.content("sheets");
var children = $.children("sheet").toArray();
return {
type: "workbook",
children: children
};
},
sst: function sst(_ref3, od) {
var _ref3$attribs = _ref3.attribs,
count = _ref3$attribs.count,
uniqueCount = _ref3$attribs.uniqueCount;
return { type: "sharedStrings", count: parseInt(count), uniqueCount: parseInt(uniqueCount) };
},
sheet: function sheet(wXml, od) {
var $ = od.sheet(wXml.attribs);
var _$$get = $("sheetFormatPr").get(0),
_$$get$attribs = _$$get.attribs,
baseColWidth = _$$get$attribs.baseColWidth,
defaultRowHeight = _$$get$attribs.defaultRowHeight;
var children = $("sheetData>row").toArray();
var _wXml$attribs = wXml.attribs,
rId = _wXml$attribs["r:id"],
props = _objectWithoutProperties(_wXml$attribs, ["r:id"]);
var colProps = "customWidth,min,max,style,hidden".split(",").reduce(function (o, k) {
return o[k] = parseInt, o;
}, {
width: parseFloat,
tidy: function tidy(_ref4) {
var min = _ref4.min,
max = _ref4.max,
props = _objectWithoutProperties(_ref4, ["min", "max"]);
return _extends({}, props, { min: min - 1, max: max - 1 });
}
});
return _extends({}, props, {
type: "sheet",
children: children,
cols: $("cols").children().map(function (i, a) {
return $(a).props(colProps);
}).get(),
colWidth: parseFloat(baseColWidth),
rowHeight: parseFloat(defaultRowHeight),
view: $("sheetViews>sheetView").props({ xSplit: parseInt, ySplit: parseInt })
});
},
row: function row(wXml, od) {
var $ = od.$(wXml);
var _wXml$attribs2 = wXml.attribs,
customFormat = _wXml$attribs2.customFormat,
hidden = _wXml$attribs2.hidden,
s = _wXml$attribs2.s,
_wXml$attribs2$style = _wXml$attribs2.style,
style = _wXml$attribs2$style === undefined ? customFormat && parseInt(s) || undefined : _wXml$attribs2$style,
r = _wXml$attribs2.r,
customHeight = _wXml$attribs2.customHeight,
ht = _wXml$attribs2.ht,
_wXml$attribs2$height = _wXml$attribs2.height,
height = _wXml$attribs2$height === undefined ? ht && parseFloat(ht) * (od.doc.precision || 1) : _wXml$attribs2$height;
var children = $.children("c").toArray();
return { type: "row", children: children, customHeight: customHeight, height: height, i: parseInt(r) - 1, style: style, hidden: hidden };
},
c: function c(wXml, od) {
var _wXml$attribs3 = wXml.attribs,
r = _wXml$attribs3.r,
style = _wXml$attribs3.s;
var children = od.$(wXml).children().toArray();
var _$exec = /([A-Z]+)(\d+$)/.exec(r),
_$exec2 = _slicedToArray(_$exec, 3),
col = _$exec2[1],
row = _$exec2[2];
return {
type: "cell",
name: "" + (parseInt(row) - 1) + col,
col: colStrToInt(col),
row: parseInt(row) - 1,
children: children,
style: style != undefined ? parseInt(style) : undefined
};
},
v: function v(wXml, od) {
var kind = wXml.parent.attribs.t;
var _wXml$children = _slicedToArray(wXml.children, 1),
data = _wXml$children[0].data;
switch (kind) {
case "i":
return { type: "paragraph", kind: kind, children: [].concat(_toConsumableArray(wXml.children)) };
case "s":
od.$(wXml).empty().append(od.sharedStrings.eq(data).clone().children());
break;
default:
od.$(wXml).empty().append("<r><t>" + data + "</t></r>");
break;
}
wXml.parent.attribs.t = "i";
return { type: "paragraph", kind: kind, children: [].concat(_toConsumableArray(wXml.children)) };
},
is: function is(wXml, od) {
wXml.name = "v";
return { type: "paragraph", kind: "is", children: [].concat(_toConsumableArray(wXml.children)) };
},
r: function r(wXml, od) {
var style = od.$(wXml).find(">rPr").props(TextStyle(od));
return {
type: "run",
style: style,
children: wXml.children.filter(function (_ref5) {
var name = _ref5.name;
return name != "rPr";
})
};
},
//styles
numFmt: function numFmt(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props());
},
cellStyle: function cellStyle(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props());
},
xf: function xf(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props(_extends({
names: {
wrapText: "wrap",
horizontal: "align",
vertical: "vertAlign"
},
wrapText: function wrapText(v) {
return v == "true" || v == "1" ? true : false;
}
}, parseInt4Keys("numFmtId,fontId,fillId,borderId,xfId,applyNumberFormat,applyFont,applyFill,applyBorder,applyAlignment"), {
tidy: function tidy(_ref6) {
var applyNumberFormat = _ref6.applyNumberFormat,
applyFont = _ref6.applyFont,
applyFill = _ref6.applyFill,
applyBorder = _ref6.applyBorder,
applyAlignment = _ref6.applyAlignment,
a = _objectWithoutProperties(_ref6, ["applyNumberFormat", "applyFont", "applyFill", "applyBorder", "applyAlignment"]);
if (applyNumberFormat == 0) delete a.numFmtId;
if (applyFont == 0) delete a.fontId;
if (applyFill == 0) delete a.fillId;
if (applyBorder == 0) delete a.borderId;
if (applyAlignment == 0) delete a.alignment;
return a;
}
})));
},
tableStyle: function tableStyle(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props());
},
font: function font(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props(TextStyle(od)));
},
fill: function fill(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props({
bgColor: od.color,
fgColor: od.color,
tidy: function tidy(_ref7) {
var _ref7$patternFill = _ref7.patternFill,
background = _ref7$patternFill.fgColor,
patternType = _ref7$patternFill.patternType;
if (patternType == "none") return {};
if (patternType && patternType.startsWith("gray")) {
var r = Number(parseInt(patternType.substring(4))).toString(16);
return { background: "#" + r + r + r };
}
return { background: background };
}
}));
},
border: function border(wXml, od) {
return _extends({ children: null }, od.styles(wXml).props({
color: od.color,
tidy_left: tidy_border,
tidy_right: tidy_border,
tidy_bottom: tidy_border,
tidy_top: tidy_border,
tidy_diagonal: tidy_border
}));
}
};
exports.default = OfficeDocument;
var parseInt4Keys = function parseInt4Keys(keys) {
return keys.split(",").reduce(function (s, k) {
return s[k] = parseInt, s;
}, {});
};
var ColorIndex = "lt1,dk1,lt2,dk2,accent1,accent2,accent3,accent4,accent5,accent6,hlink,folHlink".split(",");
var tidy_border = function tidy_border(_ref8) {
var style = _ref8.style,
a = _objectWithoutProperties(_ref8, ["style"]);
switch (style) {
case "thin":
a.sz = 1;
break;
default:
break;
}
return a;
};
var TextStyle = function TextStyle(od) {
return {
__filter: ":not(scheme,family,charset)",
names: {
rFont: "fonts",
name: "fonts",
sz: "size",
b: "bold",
i: "italic",
u: "underline",
vanish: "hidden"
},
rFont: function rFont(_ref9) {
var val = _ref9.attribs.val;
return val;
},
name: function name(_ref10) {
var val = _ref10.attribs.val;
return val;
},
b: function b(_ref11) {
var _ref11$attribs$val = _ref11.attribs.val,
val = _ref11$attribs$val === undefined ? true : _ref11$attribs$val;
return !!val;
},
i: function i(_ref12) {
var _ref12$attribs$val = _ref12.attribs.val,
val = _ref12$attribs$val === undefined ? true : _ref12$attribs$val;
return !!val;
},
u: function u(_ref13) {
var _ref13$attribs$val = _ref13.attribs.val,
val = _ref13$attribs$val === undefined ? "single" : _ref13$attribs$val;
return val;
},
vanish: function vanish(_ref14) {
var _ref14$attribs$val = _ref14.attribs.val,
val = _ref14$attribs$val === undefined ? true : _ref14$attribs$val;
return !!val;
},
sz: function sz(_ref15) {
var val = _ref15.attribs.val;
return od.doc.pt2Px(parseInt(val));
},
color: od.color
};
};
var XLSIcv = ["#000000", "#FFFFFF", "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF", "#000000", "#FFFFFF", "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF", "#800000", "#008000", "#000080", "#808000", "#800080", "#008080", "#C0C0C0", "#808080", "#9999FF", "#993366", "#FFFFCC", "#CCFFFF", "#660066", "#FF8080", "#0066CC", "#CCCCFF", "#000080", "#FF00FF", "#FFFF00", "#00FFFF", "#800080", "#800000", "#008080", "#0000FF", "#00CCFF", "#CCFFFF", "#CCFFCC", "#FFFF99", "#99CCFF", "#FF99CC", "#CC99FF", "#FFCC99", "#3366FF", "#33CCCC", "#99CC00", "#FFCC00", "#FF9900", "#FF6600", "#666699", "#969696", "#003366", "#339966", "#003300", "#333300", "#993300", "#993366", "#333399", "#333333", "#000000", /* "#40 icvForeground ?? */
"#000000", /* "#41 icvBackground ?? */
"#000000", /* "#42 icvFrame ?? */
"#000000", /* "#43 icv3D ?? */
"#000000", /* "#44 icv3DText ?? */
"#000000", /* "#45 icv3DHilite ?? */
"#000000", /* "#46 icv3DShadow ?? */
"#000000", /* "#47 icvHilite ?? */
"#000000", /* "#48 icvCtlText ?? */
"#000000", /* "#49 icvCtlScrl ?? */
"#000000", /* "#4A icvCtlInv ?? */
"#000000", /* "#4B icvCtlBody ?? */
"#000000", /* "#4C icvCtlFrame ?? */
"#000000", /* "#4D icvCtlFore ?? */
"#000000", /* "#4E icvCtlBack ?? */
"#000000", /* "#4F icvCtlNeutral */
"#000000", /* "#50 icvInfoBk ?? */
"#000000" /* "#51 icvInfoText ?? */
];
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL3hsc3gvb2ZmaWNlRG9jdW1lbnQuanMiXSwibmFtZXMiOlsiQSIsImNoYXJDb2RlQXQiLCJjb2xTdHJUb0ludCIsImNvbCIsImxhc3QiLCJzdWJzdHIiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJjb2xJbnRUb1N0ciIsImkwIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwicGFyc2VJbnQiLCJPZmZpY2VEb2N1bWVudCIsImRvYyIsIl9hc3NpZ25SZWwiLCJPYmplY3QiLCJhc3NpZ24iLCJzaGFyZWRTdHJpbmdzIiwiZXEiLCJpIiwicm9vdCIsImNoaWxkcmVuIiwic3R5bGVzIiwiaWRlbnRpdGllcyIsImNvbnN0cnVjdG9yIiwidGhlbWUiLCJjb2xvciIsIiQiLCJDb2xvckluZGV4IiwiZmlyc3QiLCJhc0NvbG9yIiwiYXR0ciIsImF0dHJpYnMiLCJyZ2IiLCJpbmRleGVkIiwidGludCIsInYiLCJ1bmRlZmluZWQiLCJYTFNJY3YiLCJwYXJzZUZsb2F0Iiwic2hlZXRJbmRleCIsInJvdyIsInNoZWV0IiwiY29udGVudCIsImdldCIsInMiLCJ0ZXh0IiwicmlkIiwiZ2V0UmVsIiwiY3JlYXRlRWxlbWVudCIsImlkZW50aWZ5IiwiYmluZCIsInJlbmRlck5vZGUiLCJ3b3JrYm9vayIsIndYbWwiLCJvZmZpY2VEb2N1bWVudCIsInRvQXJyYXkiLCJ0eXBlIiwic3N0Iiwib2QiLCJjb3VudCIsInVuaXF1ZUNvdW50IiwiYmFzZUNvbFdpZHRoIiwiZGVmYXVsdFJvd0hlaWdodCIsInJJZCIsInByb3BzIiwiY29sUHJvcHMiLCJzcGxpdCIsInJlZHVjZSIsIm8iLCJrIiwid2lkdGgiLCJ0aWR5IiwibWluIiwibWF4IiwiY29scyIsIm1hcCIsImEiLCJjb2xXaWR0aCIsInJvd0hlaWdodCIsInZpZXciLCJ4U3BsaXQiLCJ5U3BsaXQiLCJjdXN0b21Gb3JtYXQiLCJoaWRkZW4iLCJzdHlsZSIsInIiLCJjdXN0b21IZWlnaHQiLCJodCIsImhlaWdodCIsInByZWNpc2lvbiIsImMiLCJleGVjIiwibmFtZSIsImtpbmQiLCJwYXJlbnQiLCJ0IiwiZGF0YSIsImVtcHR5IiwiYXBwZW5kIiwiY2xvbmUiLCJpcyIsImZpbmQiLCJUZXh0U3R5bGUiLCJmaWx0ZXIiLCJudW1GbXQiLCJjZWxsU3R5bGUiLCJ4ZiIsIm5hbWVzIiwid3JhcFRleHQiLCJob3Jpem9udGFsIiwidmVydGljYWwiLCJwYXJzZUludDRLZXlzIiwiYXBwbHlOdW1iZXJGb3JtYXQiLCJhcHBseUZvbnQiLCJhcHBseUZpbGwiLCJhcHBseUJvcmRlciIsImFwcGx5QWxpZ25tZW50IiwibnVtRm10SWQiLCJmb250SWQiLCJmaWxsSWQiLCJib3JkZXJJZCIsImFsaWdubWVudCIsInRhYmxlU3R5bGUiLCJmb250IiwiZmlsbCIsImJnQ29sb3IiLCJmZ0NvbG9yIiwicGF0dGVybkZpbGwiLCJiYWNrZ3JvdW5kIiwicGF0dGVyblR5cGUiLCJzdGFydHNXaXRoIiwiTnVtYmVyIiwidG9TdHJpbmciLCJib3JkZXIiLCJ0aWR5X2xlZnQiLCJ0aWR5X2JvcmRlciIsInRpZHlfcmlnaHQiLCJ0aWR5X2JvdHRvbSIsInRpZHlfdG9wIiwidGlkeV9kaWFnb25hbCIsImtleXMiLCJzeiIsIl9fZmlsdGVyIiwickZvbnQiLCJiIiwidSIsInZhbmlzaCIsInZhbCIsInB0MlB4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBTUEsSUFBRSxJQUFJQyxVQUFKLENBQWUsQ0FBZixDQUFSO0FBQ0E7QUFDQSxTQUFTQyxXQUFULENBQXFCQyxHQUFyQixFQUF5QjtBQUNyQixRQUFNQyxPQUFLRCxJQUFJRSxNQUFKLENBQVcsQ0FBQyxDQUFaLEVBQWVKLFVBQWYsQ0FBMEIsQ0FBMUIsSUFBNkJELENBQXhDO0FBQ0EsUUFBR0csSUFBSUcsTUFBSixHQUFXLENBQWQsRUFBZ0I7QUFDWixlQUFPLE1BQUlKLFlBQVlDLElBQUlJLFNBQUosQ0FBYyxDQUFk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MEVIO0FBQ1gsU0EzRWMsRUEyRUg7QUFDWCxTQTVFYyxFQTRFSDtBQUNYLFNBN0VjLEVBNkVIO0FBQ1gsU0E5RWMsRUE4RUg7QUFDWCxTQS9FYyxFQStFSDtBQUNYLFNBaEZjLEVBZ0ZIO0FBQ1gsU0FqRmMsRUFpRkg7QUFDWCxTQWxGYyxDQWtGSjtBQWxGSSxDQUFmIiwiZmlsZSI6Im9mZmljZURvY3VtZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uL29mZmljZURvY3VtZW50XCJcclxuY29uc3QgQT1cIkFcIi5jaGFyQ29kZUF0KDApXHJcbi8vQT0+MCwgWj0+MjUsIEFBPT4yNlxyXG5mdW5jdGlvbiBjb2xTdHJUb0ludChjb2wpe1xyXG4gICAgY29uc3QgbGFzdD1jb2wuc3Vic3RyKC0xKS5jaGFyQ29kZUF0KDApLUFcclxuICAgIGlmKGNvbC5sZW5ndGg+MSl7XHJcbiAgICAgICAgcmV0dXJuIDI2Kihjb2xTdHJUb0ludChjb2wuc3Vic3RyaW5nKDAsY29sLmxlbmd0aC0xKSkrMSkrbGFzdFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxhc3RcclxufVxyXG4vLzA9PkEsIDI1PT5aLCAyNj0+QUFcclxuZnVuY3Rpb24gY29sSW50VG9TdHIoY29sKXtcclxuICAgIGNvbnN0IGkwPVN0cmluZy5mcm9tQ2hhckNvZGUoQStjb2wlMjYpXHJcbiAgICBpZihjb2w+PTI2KXtcclxuICAgICAgICByZXR1cm4gY29sSW50VG9TdHIocGFyc2VJbnQoY29sLzI2KS0xKStpMFxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgcmV0dXJuIGkwXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9mZmljZURvY3VtZW50IGV4dGVuZHMgQmFzZXtcclxuICAgIHN0YXRpYyBjb2xTdHJUb0ludD1jb2xTdHJUb0ludFxyXG4gICAgc3RhdGljIGNvbEludFRvU3RyPWNvbEludFRvU3RyXHJcbiAgICBfaW5pdCgpe1xyXG4gICAgICAgIHN1cGVyLl9pbml0KClcclxuICAgICAgICBjb25zdCBkb2M9dGhpcy5kb2NcclxuICAgICAgICB0aGlzLl9hc3NpZ25SZWwoW1wic3R5bGVzXCIsXCJzaGFyZWRTdHJpbmdzXCJdKVxyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zaGFyZWRTdHJpbmdzLHtcclxuICAgICAgICAgICAgZXEoaSl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb290KCkuY2hpbGRyZW4oXCJzc3RcIikuY2hpbGRyZW4oKS5lcShwYXJzZUludChpKSlcclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIGRvYywgXHJcbiAgICAgICAgfSlcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuc3R5bGVzLHtpZGVudGl0aWVzOnRoaXMuY29uc3RydWN0b3IuaWRlbnRpdGllcyxkb2N9KVxyXG4gICAgICAgIHRoaXMudGhlbWUuY29sb3I9ZnVuY3Rpb24oaSl7XHJcbiAgICAgICAgICAgIGNvbnN0ICQ9dGhpcyhgYVxcXFw6Y2xyU2NoZW1lPmFcXFxcOiR7Q29sb3JJbmRleFtwYXJzZUludChpKV19YCkuY2hpbGRyZW4oKS5maXJzdCgpXHJcbiAgICAgICAgICAgIHJldHVybiBkb2MuYXNDb2xvcigkLmF0dHIoXCJsYXN0Q2xyXCIpfHwkLmF0dHIoXCJ2YWxcIikpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sb3I9KHthdHRyaWJzOntyZ2IsdGhlbWUsaW5kZXhlZCx0aW50fX0pPT57XHJcbiAgICAgICAgICAgIGNvbnN0IHY9KHJnYiYmYCMke3JnYi5zdWJzdHIoMil9YCl8fCh0aGVtZSAmJiB0aGlzLnRoZW1lLmNvbG9yKHRoZW1lKSl8fCAoaW5kZXhlZCE9dW5kZWZpbmVkICYmIGAke1hMU0ljdltwYXJzZUludChpbmRleGVkKV19YClcclxuICAgICAgICAgICAgcmV0dXJuIHRpbnQgPyB0aGlzLmRvYy5hc0NvbG9yKHYse3RpbnQ6cGFyc2VGbG9hdCh0aW50KX0pIDogdlxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjZWxsUGxhaW5UZXh0KHNoZWV0SW5kZXgscm93LGNvbCl7XHJcbiAgICAgICAgcm93PXJvdysxXHJcbiAgICAgICAgY29sPWNvbEludFRvU3RyKGNvbClcclxuICAgICAgICBjb25zdCBzaGVldD10aGlzLnNoZWV0KHRoaXMuY29udGVudChgc2hlZXRzPnNoZWV0YCkuZ2V0KHNoZWV0SW5kZXgpLmF0dHJpYnMpXHJcbiAgICAgICAgY29uc3Qgcz1zaGVldChgd29ya3NoZWV0PnNoZWV0RGF0YT5yb3dbcj0ke3Jvd31dPmNbcj0nJHtjb2x9JHtyb3d9J10+dmApLnRleHQoKVxyXG4gICAgICAgIGlmKHMpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWRTdHJpbmdzLmVxKHMpLnRleHQoKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJcIlxyXG4gICAgfVxyXG5cclxuICAgIHNoZWV0KHtcInI6aWRcIjpyaWR9KXtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWwocmlkKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcihjcmVhdGVFbGVtZW50LCBpZGVudGlmeT10aGlzLmNvbnN0cnVjdG9yLmlkZW50aWZ5LmJpbmQodGhpcy5jb25zdHJ1Y3Rvcikpe1xyXG4gICAgICAgIHRoaXMucmVuZGVyTm9kZSh0aGlzLnN0eWxlcyhcInN0eWxlU2hlZXRcIikuZ2V0KDApLGNyZWF0ZUVsZW1lbnQsaWRlbnRpZnkpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTm9kZSh0aGlzLmNvbnRlbnQoXCJ3b3JrYm9va1wiKS5nZXQoMCksIGNyZWF0ZUVsZW1lbnQsIGlkZW50aWZ5KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpZGVudGl0aWVzPXtcclxuICAgICAgICB3b3JrYm9vayh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XHJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuY29udGVudChcInNoZWV0c1wiKVxyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbj0kLmNoaWxkcmVuKFwic2hlZXRcIikudG9BcnJheSgpXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOlwid29ya2Jvb2tcIixcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNzdCh7YXR0cmliczp7Y291bnQsIHVuaXF1ZUNvdW50fX0sb2Qpe1xyXG4gICAgICAgICAgICByZXR1cm4ge3R5cGU6XCJzaGFyZWRTdHJpbmdzXCIsY291bnQ6cGFyc2VJbnQoY291bnQpLHVuaXF1ZUNvdW50OnBhcnNlSW50KHVuaXF1ZUNvdW50KX1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNoZWV0KHdYbWwsIG9kKXtcclxuICAgICAgICAgICAgY29uc3QgJD1vZC5zaGVldCh3WG1sLmF0dHJpYnMpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCB7YXR0cmliczp7YmFzZUNvbFdpZHRoLGRlZmF1bHRSb3dIZWlnaHR9fT0kKFwic2hlZXRGb3JtYXRQclwiKS5nZXQoMClcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW49JChcInNoZWV0RGF0YT5yb3dcIikudG9BcnJheSgpXHJcbiAgICAgICAgICAgIGNvbnN0IHtcInI6aWRcIjpySWQsLi4ucHJvcHN9PXdYbWwuYXR0cmlic1xyXG4gICAgICAgICAgICBjb25zdCBjb2xQcm9wcz1cImN1c3RvbVdpZHRoLG1pbixtYXgsc3R5bGUsaGlkZGVuXCIuc3BsaXQoXCIsXCIpLnJlZHVjZSgobyxrKT0+KG9ba109cGFyc2VJbnQsbykse1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6cGFyc2VGbG9hdCxcclxuICAgICAgICAgICAgICAgIHRpZHk6KHttaW4sbWF4LC4uLnByb3BzfSk9Pih7Li4ucHJvcHMsbWluOm1pbi0xLG1heDptYXgtMX0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5wcm9wcyxcclxuICAgICAgICAgICAgICAgIHR5cGU6XCJzaGVldFwiLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sIFxyXG4gICAgICAgICAgICAgICAgY29sczogJChcImNvbHNcIikuY2hpbGRyZW4oKS5tYXAoKGksYSk9PiQoYSkucHJvcHMoY29sUHJvcHMpKS5nZXQoKSxcclxuICAgICAgICAgICAgICAgIGNvbFdpZHRoOiBwYXJzZUZsb2F0KGJhc2VDb2xXaWR0aCksIFxyXG4gICAgICAgICAgICAgICAgcm93SGVpZ2h0OnBhcnNlRmxvYXQoZGVmYXVsdFJvd0hlaWdodCksXHJcbiAgICAgICAgICAgICAgICB2aWV3OiQoXCJzaGVldFZpZXdzPnNoZWV0Vmlld1wiKS5wcm9wcyh7eFNwbGl0OnBhcnNlSW50LHlTcGxpdDpwYXJzZUludH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHJvdyh3WG1sLCBvZCl7XHJcbiAgICAgICAgICAgIGNvbnN0ICQ9b2QuJCh3WG1sKVxyXG4gICAgICAgICAgICBjb25zdCB7Y3VzdG9tRm9ybWF0LCBoaWRkZW4scywgc3R5bGU9Y3VzdG9tRm9ybWF0JiZwYXJzZUludChzKXx8dW5kZWZpbmVkLCByLGN1c3RvbUhlaWdodCxodCwgaGVpZ2h0PWh0ICYmIHBhcnNlRmxvYXQoaHQpKihvZC5kb2MucHJlY2lzaW9ufHwxKX09d1htbC5hdHRyaWJzXHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuPSQuY2hpbGRyZW4oXCJjXCIpLnRvQXJyYXkoKVxyXG4gICAgICAgICAgICByZXR1cm4ge3R5cGU6XCJyb3dcIixjaGlsZHJlbiwgY3VzdG9tSGVpZ2h0LCBoZWlnaHQsIGk6cGFyc2VJbnQociktMSwgc3R5bGUsaGlkZGVufVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYyh3WG1sLCBvZCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHthdHRyaWJzOntyLHM6c3R5bGV9fT13WG1sXHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuPW9kLiQod1htbCkuY2hpbGRyZW4oKS50b0FycmF5KClcclxuICAgICAgICAgICAgY29uc3QgWyxjb2wscm93LF09LyhbQS1aXSspKFxcZCskKS8uZXhlYyhyKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTpcImNlbGxcIixcclxuICAgICAgICAgICAgICAgIG5hbWU6YCR7cGFyc2VJbnQocm93KS0xfSR7Y29sfWAsXHJcbiAgICAgICAgICAgICAgICBjb2w6Y29sU3RyVG9JbnQoY29sKSxcclxuICAgICAgICAgICAgICAgIHJvdzpwYXJzZUludChyb3cpLTEsIFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXHJcbiAgICAgICAgICAgICAgICBzdHlsZTpzdHlsZSE9dW5kZWZpbmVkID8gcGFyc2VJbnQoc3R5bGUpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHYod1htbCxvZCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHthdHRyaWJzOnt0OmtpbmR9fT13WG1sLnBhcmVudFxyXG4gICAgICAgICAgICBjb25zdCB7Y2hpbGRyZW46W3tkYXRhfV19PXdYbWxcclxuICAgICAgICAgICAgc3dpdGNoKGtpbmQpe1xyXG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt0eXBlOlwicGFyYWdyYXBoXCIsa2luZCxjaGlsZHJlbjpbLi4ud1htbC5jaGlsZHJlbl19XHJcbiAgICAgICAgICAgIGNhc2UgXCJzXCI6XHJcbiAgICAgICAgICAgICAgICBvZC4kKHdYbWwpLmVtcHR5KCkuYXBwZW5kKG9kLnNoYXJlZFN0cmluZ3MuZXEoZGF0YSkuY2xvbmUoKS5jaGlsZHJlbigpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIG9kLiQod1htbCkuZW1wdHkoKS5hcHBlbmQoYDxyPjx0PiR7ZGF0YX08L3Q+PC9yPmApXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdYbWwucGFyZW50LmF0dHJpYnMudD1cImlcIlxyXG4gICAgICAgICAgICByZXR1cm4ge3R5cGU6XCJwYXJhZ3JhcGhcIixraW5kLGNoaWxkcmVuOlsuLi53WG1sLmNoaWxkcmVuXX1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGlzKHdYbWwsb2Qpe1xyXG4gICAgICAgICAgICB3WG1sLm5hbWU9XCJ2XCJcclxuICAgICAgICAgICAgcmV0dXJuIHt0eXBlOlwicGFyYWdyYXBoXCIsa2luZDpcImlzXCIsY2hpbGRyZW46Wy4uLndYbWwuY2hpbGRyZW5dfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgcih3WG1sLG9kKXtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGU9b2QuJCh3WG1sKS5maW5kKFwiPnJQclwiKS5wcm9wcyhUZXh0U3R5bGUob2QpKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTpcInJ1blwiLFxyXG4gICAgICAgICAgICAgICAgc3R5bGUsIFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IHdYbWwuY2hpbGRyZW4uZmlsdGVyKCh7bmFtZX0pPT5uYW1lIT1cInJQclwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy9zdHlsZXNcclxuICAgICAgICBudW1GbXQod1htbCxvZCl7XHJcbiAgICAgICAgICAgIHJldHVybiB7Y2hpbGRyZW46bnVsbCwuLi5vZC5zdHlsZXMod1htbCkucHJvcHMoKX1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNlbGxTdHlsZSh3WG1sLG9kKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtjaGlsZHJlbjpudWxsLC4uLm9kLnN0eWxlcyh3WG1sKS5wcm9wcygpfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeGYod1htbCxvZCl7XHJcbiAgICAgICAgICAgIHJldHVybiB7Y2hpbGRyZW46bnVsbCwuLi5vZC5zdHlsZXMod1htbCkucHJvcHMoe1xyXG4gICAgICAgICAgICAgICAgbmFtZXM6e1xyXG4gICAgICAgICAgICAgICAgICAgIHdyYXBUZXh0Olwid3JhcFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWw6XCJhbGlnblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsOlwidmVydEFsaWduXCIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcFRleHQ6dj0+dj09XCJ0cnVlXCJ8fHY9PVwiMVwiID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgLi4ucGFyc2VJbnQ0S2V5cyhcIm51bUZtdElkLGZvbnRJZCxmaWxsSWQsYm9yZGVySWQseGZJZCxhcHBseU51bWJlckZvcm1hdCxhcHBseUZvbnQsYXBwbHlGaWxsLGFwcGx5Qm9yZGVyLGFwcGx5QWxpZ25tZW50XCIpLFxyXG4gICAgICAgICAgICAgICAgdGlkeSh7YXBwbHlOdW1iZXJGb3JtYXQsYXBwbHlGb250LGFwcGx5RmlsbCxhcHBseUJvcmRlcixhcHBseUFsaWdubWVudCwgLi4uYX0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGFwcGx5TnVtYmVyRm9ybWF0PT0wKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYS5udW1GbXRJZFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGFwcGx5Rm9udD09MClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGEuZm9udElkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYXBwbHlGaWxsPT0wKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYS5maWxsSWRcclxuICAgICAgICAgICAgICAgICAgICBpZihhcHBseUJvcmRlcj09MClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGEuYm9yZGVySWRcclxuICAgICAgICAgICAgICAgICAgICBpZihhcHBseUFsaWdubWVudD09MClcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGEuYWxpZ25tZW50XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0YWJsZVN0eWxlKHdYbWwsb2Qpe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NoaWxkcmVuOm51bGwsLi4ub2Quc3R5bGVzKHdYbWwpLnByb3BzKCl9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBmb250KHdYbWwsb2Qpe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NoaWxkcmVuOm51bGwsLi4ub2Quc3R5bGVzKHdYbWwpLnByb3BzKFRleHRTdHlsZShvZCkpfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmlsbCh3WG1sLG9kKXtcclxuICAgICAgICAgICAgcmV0dXJuIHtjaGlsZHJlbjpudWxsLC4uLm9kLnN0eWxlcyh3WG1sKS5wcm9wcyh7XHJcbiAgICAgICAgICAgICAgICBiZ0NvbG9yOm9kLmNvbG9yLFxyXG4gICAgICAgICAgICAgICAgZmdDb2xvcjpvZC5jb2xvcixcclxuICAgICAgICAgICAgICAgIHRpZHkoe3BhdHRlcm5GaWxsOntmZ0NvbG9yOmJhY2tncm91bmQscGF0dGVyblR5cGV9fSl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocGF0dGVyblR5cGU9PVwibm9uZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge31cclxuICAgICAgICAgICAgICAgICAgICBpZihwYXR0ZXJuVHlwZSAmJiBwYXR0ZXJuVHlwZS5zdGFydHNXaXRoKFwiZ3JheVwiKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHI9TnVtYmVyKHBhcnNlSW50KHBhdHRlcm5UeXBlLnN1YnN0cmluZyg0KSkpLnRvU3RyaW5nKDE2KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2JhY2tncm91bmQ6YCMke3J9JHtyfSR7cn1gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2JhY2tncm91bmR9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYm9yZGVyKHdYbWwsb2Qpe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NoaWxkcmVuOm51bGwsLi4ub2Quc3R5bGVzKHdYbWwpLnByb3BzKHtcclxuICAgICAgICAgICAgICAgIGNvbG9yOm9kLmNvbG9yLFxyXG4gICAgICAgICAgICAgICAgdGlkeV9sZWZ0OnRpZHlfYm9yZGVyLFxyXG4gICAgICAgICAgICAgICAgdGlkeV9yaWdodDp0aWR5X2JvcmRlcixcclxuICAgICAgICAgICAgICAgIHRpZHlfYm90dG9tOnRpZHlfYm9yZGVyLFxyXG4gICAgICAgICAgICAgICAgdGlkeV90b3A6dGlkeV9ib3JkZXIsXHJcbiAgICAgICAgICAgICAgICB0aWR5X2RpYWdvbmFsOiB0aWR5X2JvcmRlcixcclxuICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgfSxcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmNvbnN0IHBhcnNlSW50NEtleXM9a2V5cz0+a2V5cy5zcGxpdChcIixcIikucmVkdWNlKChzLGspPT4oc1trXT1wYXJzZUludCxzKSx7fSlcclxuY29uc3QgQ29sb3JJbmRleD1cImx0MSxkazEsbHQyLGRrMixhY2NlbnQxLGFjY2VudDIsYWNjZW50MyxhY2NlbnQ0LGFjY2VudDUsYWNjZW50NixobGluayxmb2xIbGlua1wiLnNwbGl0KFwiLFwiKVxyXG5jb25zdCB0aWR5X2JvcmRlcj0oe3N0eWxlLC4uLmF9KT0+e1xyXG4gICAgc3dpdGNoKHN0eWxlKXtcclxuICAgICAgICBjYXNlIFwidGhpblwiOlxyXG4gICAgICAgICAgICBhLnN6PTFcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFcclxufVxyXG5jb25zdCBUZXh0U3R5bGU9b2Q9Pih7XHJcbiAgICBfX2ZpbHRlcjpcIjpub3Qoc2NoZW1lLGZhbWlseSxjaGFyc2V0KVwiLFxyXG4gICAgbmFtZXM6e1xyXG4gICAgICAgIHJGb250OlwiZm9udHNcIixcclxuICAgICAgICBuYW1lOlwiZm9udHNcIixcclxuICAgICAgICBzejpcInNpemVcIixcclxuICAgICAgICBiOlwiYm9sZFwiLFxyXG4gICAgICAgIGk6XCJpdGFsaWNcIixcclxuICAgICAgICB1OlwidW5kZXJsaW5lXCIsXHJcbiAgICAgICAgdmFuaXNoOlwiaGlkZGVuXCJcclxuICAgIH0sXHJcbiAgICByRm9udDooe2F0dHJpYnM6e3ZhbH19KT0+dmFsLFxyXG4gICAgbmFtZTooe2F0dHJpYnM6e3ZhbH19KT0+dmFsLFxyXG4gICAgYjooe2F0dHJpYnM6e3ZhbD10cnVlfX0pPT4hIXZhbCxcclxuICAgIGk6KHthdHRyaWJzOnt2YWw9dHJ1ZX19KT0+ISF2YWwsXHJcbiAgICB1Oih7YXR0cmliczp7dmFsPVwic2luZ2xlXCJ9fSk9PnZhbCxcclxuICAgIHZhbmlzaDooe2F0dHJpYnM6e3ZhbD10cnVlfX0pPT4hIXZhbCxcclxuICAgIHN6Oih7YXR0cmliczp7dmFsfX0pPT5vZC5kb2MucHQyUHgocGFyc2VJbnQodmFsKSksXHJcblxyXG4gICAgY29sb3I6b2QuY29sb3IsXHJcbn0pXHJcblxyXG5jb25zdCBYTFNJY3YgPSBbXHJcbiAgICBcIiMwMDAwMDBcIixcclxuXHRcIiNGRkZGRkZcIixcclxuXHRcIiNGRjAwMDBcIixcclxuXHRcIiMwMEZGMDBcIixcclxuXHRcIiMwMDAwRkZcIixcclxuXHRcIiNGRkZGMDBcIixcclxuXHRcIiNGRjAwRkZcIixcclxuXHRcIiMwMEZGRkZcIixcclxuXHRcIiMwMDAwMDBcIixcclxuXHRcIiNGRkZGRkZcIixcclxuXHRcIiNGRjAwMDBcIixcclxuXHRcIiMwMEZGMDBcIixcclxuXHRcIiMwMDAwRkZcIixcclxuXHRcIiNGRkZGMDBcIixcclxuXHRcIiNGRjAwRkZcIixcclxuXHRcIiMwMEZGRkZcIixcclxuXHRcIiM4MDAwMDBcIixcclxuXHRcIiMwMDgwMDBcIixcclxuXHRcIiMwMDAwODBcIixcclxuXHRcIiM4MDgwMDBcIixcclxuXHRcIiM4MDAwODBcIixcclxuXHRcIiMwMDgwODBcIixcclxuXHRcIiNDMEMwQzBcIixcclxuXHRcIiM4MDgwODBcIixcclxuXHRcIiM5OTk5RkZcIixcclxuXHRcIiM5OTMzNjZcIixcclxuXHRcIiNGRkZGQ0NcIixcclxuXHRcIiNDQ0ZGRkZcIixcclxuXHRcIiM2NjAwNjZcIixcclxuXHRcIiNGRjgwODBcIixcclxuXHRcIiMwMDY2Q0NcIixcclxuXHRcIiNDQ0NDRkZcIixcclxuXHRcIiMwMDAwODBcIixcclxuXHRcIiNGRjAwRkZcIixcclxuXHRcIiNGRkZGMDBcIixcclxuXHRcIiMwMEZGRkZcIixcclxuXHRcIiM4MDAwODBcIixcclxuXHRcIiM4MDAwMDBcIixcclxuXHRcIiMwMDgwODBcIixcclxuXHRcIiMwMDAwRkZcIixcclxuXHRcIiMwMENDRkZcIixcclxuXHRcIiNDQ0ZGRkZcIixcclxuXHRcIiNDQ0ZGQ0NcIixcclxuXHRcIiNGRkZGOTlcIixcclxuXHRcIiM5OUNDRkZcIixcclxuXHRcIiNGRjk5Q0NcIixcclxuXHRcIiNDQzk5RkZcIixcclxuXHRcIiNGRkNDOTlcIixcclxuXHRcIiMzMzY2RkZcIixcclxuXHRcIiMzM0NDQ0NcIixcclxuXHRcIiM5OUNDMDBcIixcclxuXHRcIiNGRkNDMDBcIixcclxuXHRcIiNGRjk5MDBcIixcclxuXHRcIiNGRjY2MDBcIixcclxuXHRcIiM2NjY2OTlcIixcclxuXHRcIiM5Njk2OTZcIixcclxuXHRcIiMwMDMzNjZcIixcclxuXHRcIiMzMzk5NjZcIixcclxuXHRcIiMwMDMzMDBcIixcclxuXHRcIiMzMzMzMDBcIixcclxuXHRcIiM5OTMzMDBcIixcclxuXHRcIiM5OTMzNjZcIixcclxuXHRcIiMzMzMzOTlcIixcclxuXHRcIiMzMzMzMzNcIixcclxuXHRcIiMwMDAwMDBcIiwgLyogXCIjNDAgaWN2Rm9yZWdyb3VuZCA/PyAqL1xyXG5cdFwiIzAwMDAwMFwiLCAvKiBcIiM0MSBpY3ZCYWNrZ3JvdW5kID8/ICovXHJcblx0XCIjMDAwMDAwXCIsIC8qIFwiIzQyIGljdkZyYW1lID8/ICovXHJcblx0XCIjMDAwMDAwXCIsIC8qIFwiIzQzIGljdjNEID8/ICovXHJcblx0XCIjMDAwMDAwXCIsIC8qIFwiIzQ0IGljdjNEVGV4