docx4js
Version:
javascript docx parser
334 lines (297 loc) • 32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _part = require("../part");
var _part2 = _interopRequireDefault(_part);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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; }
exports.default = function (od) {
return _extends({
__filter: ":not(a\\:extLst)",
id: function id() {
return undefined;
}
}, same("latin,ea,cs".split(","), function (_ref) {
var _ref$attribs$typeface = _ref.attribs.typeface,
typeface = _ref$attribs$typeface === undefined ? "" : _ref$attribs$typeface;
return od.theme.font(typeface);
}), same("lumMod,lumOff,tint,shade".split(","), function (_ref2) {
var val = _ref2.attribs.val;
return parseInt(val) / 100000;
}), {
tidy_schemeClr: function tidy_schemeClr(_ref3) {
var val = _ref3.val,
effect = _objectWithoutProperties(_ref3, ["val"]);
return od.doc.asColor(od.theme.color(val), effect);
},
tidy_srgbClr: function tidy_srgbClr(_ref4) {
var val = _ref4.val,
effect = _objectWithoutProperties(_ref4, ["val"]);
return od.doc.asColor(val, effect);
},
tidy_prstClr: function tidy_prstClr(_ref5) {
var val = _ref5.val,
effect = _objectWithoutProperties(_ref5, ["val"]);
return od.doc.asColor(val, effect);
},
sysClr: function sysClr(_ref6) {
var val = _ref6.attribs.val;
return val;
},
tidy_solidFill: function tidy_solidFill(_ref7) {
var color = _ref7.color;
return color;
},
rot: function rot(v) {
return parseInt(v) / 60000;
},
blip: function blip(n) {
var _n$attribs = n.attribs,
embed = _n$attribs["r:embed"],
url = _n$attribs["r:link"];
if (url) return { url: url };
if (!embed) return;
var part = od.$(n).part();
return new _part2.default(part, od.doc).getRel(embed);
},
prstGeom: function prstGeom(x) {
return x.attribs.prst;
},
pathLst: function pathLst(_ref8) {
var children = _ref8.children;
var px = function px(x) {
return od.doc.emu2Px(x);
};
return children.filter(function (a) {
return a.name == "a:path";
}).reduce(function (d, path) {
path.children.filter(function (a) {
return a.name;
}).forEach(function (a) {
switch (a.name.split(":").pop()) {
case 'moveTo':
d.push('M ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
break;
case 'lnTo':
d.push('L ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
break;
break;
case 'cubicBezTo':
d.push('L ' + px(a.children[0].attribs.x) + ' ' + px(a.children[0].attribs.y));
d.push('Q ' + px(a.children[1].attribs.x) + ' ' + px(a.children[1].attribs.y) + ' ' + px(a.children[2].attribs.x) + ' ' + px(a.children[2].attribs.y));
break;
case 'arcTo':
d.push("A");
break;
case 'close':
d.push('Z');
break;
}
});
return d;
}, []).join(" ");
},
tidy_custGeom: function tidy_custGeom(_ref9) {
var pathLst = _ref9.pathLst;
return pathLst;
},
lvl: function lvl(v) {
return parseInt(v);
},
spcPts: function spcPts(_ref10) {
var val = _ref10.attribs.val;
return od.doc.pt2Px(parseInt(val) / 100);
},
tidy_spcAft: function tidy_spcAft(_ref11) {
var a = _ref11.spcPts;
return a;
},
tidy_spcBef: function tidy_spcBef(_ref12) {
var a = _ref12.spcPts;
return a;
},
buFont: function buFont(_ref13) {
var typeface = _ref13.attribs.typeface;
return od.theme.font(typeface);
},
buChar: function buChar(_ref14) {
var char = _ref14.attribs.char;
return char;
},
buSzPts: function buSzPts(_ref15) {
var val = _ref15.attribs.val;
return od.doc.pt2Px(parseInt(val) / 100);
},
buSzPct: function buSzPct(_ref16) {
var val = _ref16.attribs.val;
return parseInt(val) / 1000 / 100;
},
buAutoNum: function buAutoNum(_ref17) {
var attribs = _ref17.attribs;
return _extends({}, attribs);
},
tidy_buClr: function tidy_buClr(_ref18) {
var color = _ref18.color;
return color;
},
indent: function indent(v) {
return od.doc.emu2Px(v);
},
marL: function marL(v) {
return od.doc.emu2Px(v);
},
marR: function marR(v) {
return od.doc.emu2Px(v);
},
marT: function marT(v) {
return od.doc.emu2Px(v);
},
marB: function marB(v) {
return od.doc.emu2Px(v);
},
lIns: function lIns(v) {
return od.doc.emu2Px(v);
},
rIns: function rIns(v) {
return od.doc.emu2Px(v);
},
bIns: function bIns(v) {
return od.doc.emu2Px(v);
},
tIns: function tIns(v) {
return od.doc.emu2Px(v);
},
distL: function distL(v) {
return od.doc.emu2Px(v);
},
distR: function distR(v) {
return od.doc.emu2Px(v);
},
distT: function distT(v) {
return od.doc.emu2Px(v);
},
distB: function distB(v) {
return od.doc.emu2Px(v);
},
ext: function ext(_ref19) {
var _ref19$attribs = _ref19.attribs,
cx = _ref19$attribs.cx,
cy = _ref19$attribs.cy;
return { width: od.doc.emu2Px(cx), height: od.doc.emu2Px(cy) };
},
extent: function extent(_ref20) {
var _ref20$attribs = _ref20.attribs,
cx = _ref20$attribs.cx,
cy = _ref20$attribs.cy;
return { width: od.doc.emu2Px(cx), height: od.doc.emu2Px(cy) };
},
effectExtent: function effectExtent(_ref21) {
var _ref21$attribs = _ref21.attribs,
l = _ref21$attribs.l,
t = _ref21$attribs.t,
r = _ref21$attribs.r,
b = _ref21$attribs.b;
return { left: od.doc.emu2Px(l), right: od.doc.emu2Px(r), top: od.doc.emu2Px(t), bottom: od.doc.emu2Px(b) };
},
off: function off(_ref22) {
var _ref22$attribs = _ref22.attribs,
x = _ref22$attribs.x,
y = _ref22$attribs.y;
return { x: od.doc.emu2Px(x), y: od.doc.emu2Px(y) };
},
tidy_xfrm: function tidy_xfrm(_ref23) {
var _ref23$ext = _ref23.ext,
ext = _ref23$ext === undefined ? {} : _ref23$ext,
_ref23$off = _ref23.off,
off = _ref23$off === undefined ? {} : _ref23$off,
transform = _objectWithoutProperties(_ref23, ["ext", "off"]);
return _extends({}, ext, off, transform);
}
}, same("ln,lnB,lnR,lnL,lnT,lnTlToBr,lnBlToTr".split(",").map(function (a) {
return 'tidy_' + a;
}), function (_ref24) {
var w = _ref24.w,
props = _objectWithoutProperties(_ref24, ["w"]);
return _extends({}, props, { w: w ? od.doc.emu2Px(w) : undefined });
}), same("left,right,top,bottom".split(",").map(function (a) {
return 'tidy_' + a;
}), function (_ref25) {
var ln = _ref25.ln;
return ln;
}), {
tidy_tcTxStyle: function tidy_tcTxStyle(_ref26) {
var color = _ref26.color,
props = _objectWithoutProperties(_ref26, ["color"]);
return _extends({}, props, { solidFill: color });
},
tidy_lnRef: function tidy_lnRef(_ref27) {
var idx = _ref27.idx,
ph = _objectWithoutProperties(_ref27, ["idx"]);
return od.theme.lnRef(idx, ph);
},
tidy_fillRef: function tidy_fillRef(_ref28) {
var idx = _ref28.idx,
ph = _objectWithoutProperties(_ref28, ["idx"]);
return od.theme.fillRef(idx, ph);
},
tidy_effectRef: function tidy_effectRef(_ref29) {
var idx = _ref29.idx,
ph = _objectWithoutProperties(_ref29, ["idx"]);
return od.theme.effectRef(idx, ph);
},
tidy_fontRef: function tidy_fontRef(_ref30) {
var idx = _ref30.idx,
ph = _objectWithoutProperties(_ref30, ["idx"]);
return od.theme.fontRef(idx, ph);
},
tidy_noAutoFit: function tidy_noAutoFit() {
return undefined;
},
tidy_normAutoFit: function tidy_normAutoFit(props) {
return _extends({ type: "font" }, props);
},
tidy_spAutoFit: function tidy_spAutoFit(props) {
return _extends({ type: "block" }, props);
},
names: {
schemeClr: "color", srgbClr: "color", sysClr: "color", prstClr: "color",
prstGeom: "geometry", custGeom: "geometry",
lnB: "bottom", lnR: "right", lnL: "left", lnT: "top",
rot: "rotate",
spAutoFit: "autofit", normAutoFit: "autofit", noAutoFit: "autofit",
gsLst: "[]"
},
inherit: function inherit() {
for (var _len = arguments.length, additions = Array(_len), _key = 0; _key < _len; _key++) {
additions[_key] = arguments[_key];
}
return additions.reduce(function (_ref31, _ref32) {
var _ref32$__filter = _ref32.__filter,
_filter = _ref32$__filter === undefined ? "" : _ref32$__filter,
_ref32$names = _ref32.names,
_names = _ref32$names === undefined ? {} : _ref32$names,
_others = _objectWithoutProperties(_ref32, ["__filter", "names"]);
var _ref31$__filter = _ref31.__filter,
__filter = _ref31$__filter === undefined ? "" : _ref31$__filter,
_ref31$names = _ref31.names,
names = _ref31$names === undefined ? {} : _ref31$names,
others = _objectWithoutProperties(_ref31, ["__filter", "names"]);
return _extends({}, others, _others, {
__filter: [__filter, _filter].filter(function (a) {
return !!a;
}).join(","),
names: _extends({}, names, _names)
});
}, this);
}
});
};
var same = function same(keys, fx) {
return keys.reduce(function (fs, k) {
return fs[k] = fx, fs;
}, {});
};
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL2RyYXdtbC9pbmRleC5qcyJdLCJuYW1lcyI6WyJfX2ZpbHRlciIsImlkIiwidW5kZWZpbmVkIiwic2FtZSIsInNwbGl0IiwiYXR0cmlicyIsInR5cGVmYWNlIiwib2QiLCJ0aGVtZSIsImZvbnQiLCJ2YWwiLCJwYXJzZUludCIsInRpZHlfc2NoZW1lQ2xyIiwiZWZmZWN0IiwiZG9jIiwiYXNDb2xvciIsImNvbG9yIiwidGlkeV9zcmdiQ2xyIiwidGlkeV9wcnN0Q2xyIiwic3lzQ2xyIiwidGlkeV9zb2xpZEZpbGwiLCJyb3QiLCJ2IiwiYmxpcCIsIm4iLCJlbWJlZCIsInVybCIsInBhcnQiLCIkIiwiZ2V0UmVsIiwicHJzdEdlb20iLCJ4IiwicHJzdCIsInBhdGhMc3QiLCJjaGlsZHJlbiIsInB4IiwiZW11MlB4IiwiZmlsdGVyIiwiYSIsIm5hbWUiLCJyZWR1Y2UiLCJkIiwicGF0aCIsImZvckVhY2giLCJwb3AiLCJwdXNoIiwieSIsImpvaW4iLCJ0aWR5X2N1c3RHZW9tIiwibHZsIiwic3BjUHRzIiwicHQyUHgiLCJ0aWR5X3NwY0FmdCIsInRpZHlfc3BjQmVmIiwiYnVGb250IiwiYnVDaGFyIiwiY2hhciIsImJ1U3pQdHMiLCJidVN6UGN0IiwiYnVBdXRvTnVtIiwidGlkeV9idUNsciIsImluZGVudCIsIm1hckwiLCJtYXJSIiwibWFyVCIsIm1hckIiLCJsSW5zIiwicklucyIsImJJbnMiLCJ0SW5zIiwiZGlzdEwiLCJkaXN0UiIsImRpc3RUIiwiZGlzdEIiLCJleHQiLCJjeCIsImN5Iiwid2lkdGgiLCJoZWlnaHQiLCJleHRlbnQiLCJlZmZlY3RFeHRlbnQiLCJsIiwidCIsInIiLCJiIiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwib2ZmIiwidGlkeV94ZnJtIiwidHJhbnNmb3JtIiwibWFwIiwidyIsInByb3BzIiwibG4iLCJ0aWR5X3RjVHhTdHlsZSIsInNvbGlkRmlsbCIsInRpZHlfbG5SZWYiLCJpZHgiLCJwaCIsImxuUmVmIiwidGlkeV9maWxsUmVmIiwiZmlsbFJlZiIsInRpZHlfZWZmZWN0UmVmIiwiZWZmZWN0UmVmIiwidGlkeV9mb250UmVmIiwiZm9udFJlZiIsInRpZHlfbm9BdXRvRml0IiwidGlkeV9ub3JtQXV0b0ZpdCIsInR5cGUiLCJ0aWR5X3NwQXV0b0ZpdCIsIm5hbWVzIiwic2NoZW1lQ2xyIiwic3JnYkNsciIsInByc3RDbHIiLCJjdXN0R2VvbSIsImxuQiIsImxuUiIsImxuTCIsImxuVCIsInNwQXV0b0ZpdCIsIm5vcm1BdXRvRml0Iiwibm9BdXRvRml0IiwiZ3NMc3QiLCJpbmhlcml0IiwiYWRkaXRpb25zIiwiX2ZpbHRlciIsIl9uYW1lcyIsIl9vdGhlcnMiLCJvdGhlcnMiLCJrZXlzIiwiZngiLCJmcyIsImsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7O2tCQUVlO0FBQUE7QUFDWEEsa0JBQVMsa0JBREU7QUFFWEMsWUFBRztBQUFBLG1CQUFJQyxTQUFKO0FBQUE7QUFGUSxPQUdSQyxLQUFLLGNBQWNDLEtBQWQsQ0FBb0IsR0FBcEIsQ0FBTCxFQUE4QjtBQUFBLHlDQUFFQyxPQUFGLENBQVdDLFFBQVg7QUFBQSxZQUFXQSxRQUFYLHlDQUFvQixFQUFwQjtBQUFBLGVBQTJCQyxHQUFHQyxLQUFILENBQVNDLElBQVQsQ0FBY0gsUUFBZCxDQUEzQjtBQUFBLEtBQTlCLENBSFEsRUFLUkgsS0FBSywyQkFBMkJDLEtBQTNCLENBQWlDLEdBQWpDLENBQUwsRUFBMkM7QUFBQSxZQUFXTSxHQUFYLFNBQUVMLE9BQUYsQ0FBV0ssR0FBWDtBQUFBLGVBQW1CQyxTQUFTRCxHQUFULElBQWMsTUFBakM7QUFBQSxLQUEzQyxDQUxRO0FBTVhFLHdCQUFlO0FBQUEsZ0JBQUVGLEdBQUYsU0FBRUEsR0FBRjtBQUFBLGdCQUFTRyxNQUFUOztBQUFBLG1CQUFtQk4sR0FBR08sR0FBSCxDQUFPQyxPQUFQLENBQWVSLEdBQUdDLEtBQUgsQ0FBU1EsS0FBVCxDQUFlTixHQUFmLENBQWYs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O0FBQVZBLHlCQUFVO0FBQUE7O0FBQ2pCLG1CQUFPQSxVQUFVdEYsTUFBVixDQUFpQiwwQkFBd0Y7QUFBQSw2Q0FBbkR4QyxRQUFtRDtBQUFBLG9CQUExQytILE9BQTBDLG1DQUFsQyxFQUFrQztBQUFBLDBDQUEvQmYsS0FBK0I7QUFBQSxvQkFBekJnQixNQUF5QixnQ0FBbEIsRUFBa0I7QUFBQSxvQkFBWEMsT0FBVzs7QUFBQSw2Q0FBdEZqSSxRQUFzRjtBQUFBLG9CQUF0RkEsUUFBc0YsbUNBQTdFLEVBQTZFO0FBQUEsMENBQTFFZ0gsS0FBMEU7QUFBQSxvQkFBMUVBLEtBQTBFLGdDQUFwRSxFQUFvRTtBQUFBLG9CQUE3RGtCLE1BQTZEOztBQUM1RyxvQ0FDT0EsTUFEUCxFQUVPRCxPQUZQO0FBR0lqSSw4QkFBUyxDQUFDQSxRQUFELEVBQVUrSCxPQUFWLEVBQW1CMUYsTUFBbkIsQ0FBMEI7QUFBQSwrQkFBRyxDQUFDLENBQUNDLENBQUw7QUFBQSxxQkFBMUIsRUFBa0NTLElBQWxDLENBQXVDLEdBQXZDLENBSGI7QUFJSWlFLHdDQUFVQSxLQUFWLEVBQW9CZ0IsTUFBcEI7QUFKSjtBQU1ILGFBUE0sRUFPTCxJQVBLLENBQVA7QUFRSDtBQTNIVTtBQUFBLEM7O0FBOEhmLElBQU03SCxPQUFLLFNBQUxBLElBQUssQ0FBQ2dJLElBQUQsRUFBTUMsRUFBTjtBQUFBLFdBQVdELEtBQUszRixNQUFMLENBQVksVUFBQzZGLEVBQUQsRUFBS0MsQ0FBTDtBQUFBLGVBQVVELEdBQUdDLENBQUgsSUFBTUYsRUFBTixFQUFVQyxFQUFwQjtBQUFBLEtBQVosRUFBb0MsRUFBcEMsQ0FBWDtBQUFBLENBQVgiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFydCBmcm9tIFwiLi4vcGFydFwiXG5cbmV4cG9ydCBkZWZhdWx0IG9kPT4oe1xuICAgIF9fZmlsdGVyOlwiOm5vdChhXFxcXDpleHRMc3QpXCIsXG4gICAgaWQ6KCk9PnVuZGVmaW5lZCxcbiAgICAuLi5zYW1lKFwibGF0aW4sZWEsY3NcIi5zcGxpdChcIixcIiksKHthdHRyaWJzOnt0eXBlZmFjZT1cIlwifX0pPT5vZC50aGVtZS5mb250KHR5cGVmYWNlKSksXG4gICAgLy9zejp2PT5vZC5kb2MucHQyUHgocGFyc2VJbnQodikvMTAwKSxcbiAgICAuLi5zYW1lKFwibHVtTW9kLGx1bU9mZix0aW50LHNoYWRlXCIuc3BsaXQoXCIsXCIpLCh7YXR0cmliczp7dmFsfX0pPT5wYXJzZUludCh2YWwpLzEwMDAwMCksXG4gICAgdGlkeV9zY2hlbWVDbHI6KHt2YWwsLi4uZWZmZWN0fSk9Pm9kLmRvYy5hc0NvbG9yKG9kLnRoZW1lLmNvbG9yKHZhbCksZWZmZWN0KSxcbiAgICB0aWR5X3NyZ2JDbHI6KHt2YWwsLi4uZWZmZWN0fSk9Pm9kLmRvYy5hc0NvbG9yKHZhbCxlZmZlY3QpLFxuICAgIHRpZHlfcHJzdENscjooe3ZhbCwuLi5lZmZlY3R9KT0+b2QuZG9jLmFzQ29sb3IodmFsLGVmZmVjdCksXG4gICAgc3lzQ2xyOih7YXR0cmliczp7dmFsfX0pPT52YWwsXG4gICAgdGlkeV9zb2xpZEZpbGw6KHtjb2xvcn0pPT5jb2xvcixcbiAgICByb3Q6dj0+cGFyc2VJbnQodikvNjAwMDAsXG5cbiAgICBibGlwOm49PntcbiAgICAgICAgY29uc3Qge2F0dHJpYnM6e1wicjplbWJlZFwiOmVtYmVkLCBcInI6bGlua1wiOnVybH19PW5cbiAgICAgICAgaWYodXJsKVxuICAgICAgICAgICAgcmV0dXJuIHt1cmx9XG4gICAgICAgIGlmKCFlbWJlZClcbiAgICAgICAgICAgIHJldHVybiBcbiAgICAgICAgY29uc3QgcGFydD1vZC4kKG4pLnBhcnQoKVxuICAgICAgICByZXR1cm4gbmV3IFBhcnQocGFydCxvZC5kb2MpLmdldFJlbChlbWJlZClcbiAgICB9LFxuXG4gICAgcHJzdEdlb20oeCl7XG5cdFx0cmV0dXJuIHguYXR0cmlicy5wcnN0XG5cdH0sXG5cdHBhdGhMc3Qoe2NoaWxkcmVufSl7XG5cdFx0Y29uc3QgcHg9eD0+b2QuZG9jLmVtdTJQeCh4KVxuICAgICAgICByZXR1cm4gY2hpbGRyZW4uZmlsdGVyKGE9PmEubmFtZT09XCJhOnBhdGhcIilcbiAgICAgICAgICAgIC5yZWR1Y2UoKGQscGF0aCk9PntcbiAgICAgICAgICAgICAgICBwYXRoLmNoaWxkcmVuLmZpbHRlcihhPT5hLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGE9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhLm5hbWUuc3BsaXQoXCI6XCIpLnBvcCgpKXtcbiAgICAgICAgICAgIFx0XHRcdGNhc2UgJ21vdmVUbyc6XG4gICAgICAgICAgICBcdFx0XHRcdGQucHVzaCgnTSAnK3B4KGEuY2hpbGRyZW5bMF0uYXR0cmlicy54KSsnICcrcHgoYS5jaGlsZHJlblswXS5hdHRyaWJzLnkpKVxuICAgICAgICAgICAgXHRcdFx0XHRicmVha1xuICAgICAgICAgICAgXHRcdFx0Y2FzZSAnbG5Ubyc6XG4gICAgICAgICAgICBcdFx0XHRcdGQucHVzaCgnTCAnK3B4KGEuY2hpbGRyZW5bMF0uYXR0cmlicy54KSsnICcrcHgoYS5jaGlsZHJlblswXS5hdHRyaWJzLnkpKVxuICAgICAgICAgICAgXHRcdFx0XHRicmVha1xuICAgICAgICAgICAgXHRcdFx0YnJlYWtcbiAgICAgICAgICAgIFx0XHRcdGNhc2UgJ2N1YmljQmV6VG8nOlxuICAgICAgICAgICAgXHRcdFx0XHRkLnB1c2goJ0wgJytweChhLmNoaWxkcmVuWzBdLmF0dHJpYnMueCkrJyAnK3B4KGEuY2hpbGRyZW5bMF0uYXR0cmlicy55KSlcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKCdRICcrcHgoYS5jaGlsZHJlblsxXS5hdHRyaWJzLngpKycgJytweChhLmNoaWxkcmVuWzFdLmF0dHJpYnMueSlcbiAgICAgICAgICAgIFx0XHRcdFx0XHQrJyAnK3B4KGEuY2hpbGRyZW5bMl0uYXR0cmlicy54KSsnICcrcHgoYS5jaGlsZHJlblsyXS5hdHRyaWJzLnkpKVxuICAgICAgICAgICAgXHRcdFx0YnJlYWtcbiAgICAgICAgICAgIFx0XHRcdGNhc2UgJ2FyY1RvJzpcbiAgICAgICAgICAgIFx0XHRcdFx0ZC5wdXNoKGBBYClcbiAgICAgICAgICAgIFx0XHRcdGJyZWFrXG4gICAgICAgICAgICBcdFx0XHRjYXNlICdjbG9zZSc6XG4gICAgICAgICAgICBcdFx0XHRcdGQucHVzaCgnWicpXG4gICAgICAgICAgICBcdFx0XHRicmVha1xuICAgICAgICAgICAgXHRcdFx0fVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHJldHVybiBkXG4gICAgICAgICAgICB9LFtdKS5qb2luKFwiIFwiKVxuXHR9LFxuICAgIHRpZHlfY3VzdEdlb206KHtwYXRoTHN0fSk9PnBhdGhMc3QsXG5cbiAgICBsdmw6dj0+cGFyc2VJbnQodiksXG4gICAgc3BjUHRzOih7YXR0cmliczp7dmFsfX0pPT5vZC5kb2MucHQyUHgocGFyc2VJbnQodmFsKS8xMDApLFxuICAgIHRpZHlfc3BjQWZ0Oih7c3BjUHRzOmF9KT0+YSxcbiAgICB0aWR5X3NwY0JlZjooe3NwY1B0czphfSk9PmEsXG5cbiAgICBidUZvbnQ6KHthdHRyaWJzOnt0eXBlZmFjZX19KT0+b2QudGhlbWUuZm9udCh0eXBlZmFjZSksXG4gICAgYnVDaGFyOih7YXR0cmliczp7Y2hhcn19KT0+Y2hhcixcbiAgICBidVN6UHRzOih7YXR0cmliczp7dmFsfX0pPT5vZC5kb2MucHQyUHgocGFyc2VJbnQodmFsKS8xMDApLFxuICAgIGJ1U3pQY3Q6KHthdHRyaWJzOnt2YWx9fSk9PnBhcnNlSW50KHZhbCkvMTAwMC8xMDAsXG4gICAgYnVBdXRvTnVtOih7YXR0cmlic30pPT4oey4uLmF0dHJpYnN9KSxcbiAgICB0aWR5X2J1Q2xyOih7Y29sb3J9KT0+Y29sb3IsXG5cbiAgICBpbmRlbnQ6dj0+b2QuZG9jLmVtdTJQeCh2KSxcbiAgICBtYXJMOnY9Pm9kLmRvYy5lbXUyUHgodiksXG4gICAgbWFyUjp2PT5vZC5kb2MuZW11MlB4KHYpLFxuICAgIG1hclQ6dj0+b2QuZG9jLmVtdTJQeCh2KSxcbiAgICBtYXJCOnY9Pm9kLmRvYy5lbXUyUHgodiksXG4gICAgXG4gICAgbEluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxuICAgIHJJbnM6dj0+b2QuZG9jLmVtdTJQeCh2KSxcbiAgICBiSW5zOnY9Pm9kLmRvYy5lbXUyUHgodiksXG4gICAgdEluczp2PT5vZC5kb2MuZW11MlB4KHYpLFxuXG4gICAgZGlzdEw6dj0+b2QuZG9jLmVtdTJQeCh2KSxcbiAgICBkaXN0Ujp2PT5vZC5kb2MuZW11MlB4KHYpLFxuICAgIGRpc3RUOnY9Pm9kLmRvYy5lbXUyUHgodiksXG4gICAgZGlzdEI6dj0+b2QuZG9jLmVtdTJQeCh2KSxcblxuICAgIGV4dDooe2F0dHJpYnM6e2N4LGN5fX0pPT4oe3dpZHRoOm9kLmRvYy5lbXUyUHgoY3gpLGhlaWdodDpvZC5kb2MuZW11MlB4KGN5KX0pLFxuICAgIGV4dGVudDooe2F0dHJpYnM6e2N4LGN5fX0pPT4oe3dpZHRoOm9kLmRvYy5lbXUyUHgoY3gpLGhlaWdodDpvZC5kb2MuZW11MlB4KGN5KX0pLFxuICAgIGVmZmVjdEV4dGVudDooe2F0dHJpYnM6e2wsdCxyLGJ9fSk9Pih7bGVmdDpvZC5kb2MuZW11MlB4KGwpLHJpZ2h0Om9kLmRvYy5lbXUyUHgociksdG9wOm9kLmRvYy5lbXUyUHgodCksYm90dG9tOm9kLmRvYy5lbXUyUHgoYil9KSxcbiAgICBvZmY6KHthdHRyaWJzOnt4LHl9fSk9Pih7eDpvZC5kb2MuZW11MlB4KHgpLHk6b2QuZG9jLmVtdTJQeCh5KX0pLFxuICAgIHRpZHlfeGZybTooe2V4dD17fSxvZmY9e30sIC4uLnRyYW5zZm9ybX0pPT4oey4uLmV4dCwgLi4ub2ZmLCAuLi50cmFuc2Zvcm19KSxcblxuICAgIC4uLnNhbWUoXCJsbixsbkIsbG5SLGxuTCxsblQsbG5UbFRvQnIsbG5CbFRvVHJcIi5zcGxpdChcIixcIikubWFwKGE9Pid0aWR5XycrYSksKHt3LC4uLnByb3BzfSk9Pih7Li4ucHJvcHMsIHc6dyA/IG9kLmRvYy5lbXUyUHgodykgOiB1bmRlZmluZWR9KSksXG4gICAgLi4uc2FtZShcImxlZnQscmlnaHQsdG9wLGJvdHRvbVwiLnNwbGl0KFwiLFwiKS5tYXAoYT0+J3RpZHlfJythKSwoe2xufSk9PmxuKSxcbiAgICB0aWR5X3RjVHhTdHlsZTooe2NvbG9yLC4uLnByb3BzfSk9Pih7Li4ucHJvcHMsIHNvbGlkRmlsbDpjb2xvcn0pLFxuXG4gICAgdGlkeV9sblJlZjooe2lkeCwuLi5waH0pPT5vZC50aGVtZS5sblJlZihpZHgscGgpLFxuICAgIHRpZHlfZmlsbFJlZjooe2lkeCwuLi5waH0pPT5vZC50aGVtZS5maWxsUmVmKGlkeCxwaCksXG4gICAgdGlkeV9lZmZlY3RSZWY6KHtpZHgsLi4ucGh9KT0+b2QudGhlbWUuZWZmZWN0UmVmKGlkeCxwaCksXG4gICAgdGlkeV9mb250UmVmOih7aWR4LC4uLnBofSk9Pm9kLnRoZW1lLmZvbnRSZWYoaWR4LHBoKSxcblxuICAgIHRpZHlfbm9BdXRvRml0OigpPT51bmRlZmluZWQsXG4gICAgdGlkeV9ub3JtQXV0b0ZpdDpwcm9wcz0+KHt0eXBlOlwiZm9udFwiLC4uLnByb3BzfSksXG4gICAgdGlkeV9zcEF1dG9GaXQ6cHJvcHM9Pih7dHlwZTpcImJsb2NrXCIsLi4ucHJvcHN9KSxcblxuICAgIG5hbWVzOntcbiAgICAgICAgc2NoZW1lQ2xyOlwiY29sb3JcIiwgc3JnYkNscjpcImNvbG9yXCIsIHN5c0NscjpcImNvbG9yXCIscHJzdENscjpcImNvbG9yXCIsXG4gICAgICAgIHByc3RHZW9tOlwiZ2VvbWV0cnlcIiwgY3VzdEdlb206XCJnZW9tZXRyeVwiLFxuICAgICAgICBsbkI6XCJib3R0b21cIiwgbG5SOlwicmlnaHRcIiwgbG5MOlwibGVmdFwiLCBsblQ6XCJ0b3BcIixcbiAgICAgICAgcm90Olwicm90YXRlXCIsXG4gICAgICAgIHNwQXV0b0ZpdDpcImF1dG9maXRcIixub3JtQXV0b0ZpdDpcImF1dG9maXRcIixub0F1dG9GaXQ6XCJhdXRvZml0XCIsXG4gICAgICAgIGdzTHN0OlwiW11cIlxuICAgIH0sXG5cbiAgICBpbmhlcml0KC4uLmFkZGl0aW9ucyl7XG4gICAgICAgIHJldHVybiBhZGRpdGlvbnMucmVkdWNlKCh7X19maWx0ZXI9XCJcIixuYW1lcz17fSwgLi4ub3RoZXJzfSwge19fZmlsdGVyOl9maWx0ZXI9XCJcIixuYW1lczpfbmFtZXM9e30sIC4uLl9vdGhlcnN9KT0+e1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5vdGhlcnMsXG4gICAgICAgICAgICAgICAgLi4uX290aGVycyxcbiAgICAgICAgICAgICAgICBfX2ZpbHRlcjpbX19maWx0ZXIsX2ZpbHRlcl0uZmlsdGVyKGE9PiEhYSkuam9pbihcIixcIiksXG4gICAgICAgICAgICAgICAgbmFtZXM6ey4uLm5hbWVzLCAuLi5fbmFtZXN9LFxuICAgICAgICAgICAgfVxuICAgICAgICB9LHRoaXMpXG4gICAgfVxufSlcblxuY29uc3Qgc2FtZT0oa2V5cyxmeCk9PmtleXMucmVkdWNlKChmcywgayk9Pihmc1trXT1meCwgZnMpLHt9KVxuIl19