UNPKG

docx4js-fork

Version:
412 lines (366 loc) 50.8 kB
"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