From 8b46e8df7de083f88971680fab7cd5f1eb6d4b6f Mon Sep 17 00:00:00 2001 From: Pete Boysen Date: Thu, 31 Dec 2015 16:07:00 -0600 Subject: [PATCH] added new widgets-built --- widgets-built.js | 23613 +++++++++++++++++++++++---------------------- 1 file changed, 11847 insertions(+), 11766 deletions(-) diff --git a/widgets-built.js b/widgets-built.js index 56d56ba..7af8154 100644 --- a/widgets-built.js +++ b/widgets-built.js @@ -1,585 +1,662 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } -require("../../prosemirror/dist/menu/menubar"); + for (var i = 0; i < args.length; i++) { + add(args[i], result); + }return result; +} -require("../../prosemirror/dist/inputrules/autoinput"); +function add(value, target) { + if (typeof value == "string") value = document.createTextNode(value); + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + add(value[i], target); + } + } else { + target.appendChild(value); + } +} -var _prosemirrorDistModel = require("../../prosemirror/dist/model"); +var reqFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; -var _widgets = require("./widgets"); +function requestAnimationFrame(f) { + if (reqFrame) reqFrame(f);else setTimeout(f, 10); +} -var widgetsSpec = new _prosemirrorDistModel.SchemaSpec({ - doc: _prosemirrorDistModel.Doc, - blockquote: _prosemirrorDistModel.BlockQuote, - ordered_list: _prosemirrorDistModel.OrderedList, - bullet_list: _prosemirrorDistModel.BulletList, - list_item: _prosemirrorDistModel.ListItem, - horizontal_rule: _prosemirrorDistModel.HorizontalRule, +var ie_upto10 = /MSIE \d/.test(navigator.userAgent); +var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); - paragraph: _prosemirrorDistModel.Paragraph, - heading: _prosemirrorDistModel.Heading, +var browser = { + mac: /Mac/.test(navigator.platform), + ie_upto10: ie_upto10, + ie_11up: ie_11up, + ie: ie_upto10 || ie_11up, + gecko: /gecko\/\d/i.test(navigator.userAgent) +}; - text: _prosemirrorDistModel.Text, - image: _widgets.Image, - hard_break: _prosemirrorDistModel.HardBreak, +exports.browser = browser; +function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); +} - input: _widgets.Input, - textfield: _widgets.TextField, - textarea: _widgets.TextArea, - checkbox: _widgets.CheckBox, - radiobutton: _widgets.RadioButton, - select: _widgets.Select, - inlinemath: _widgets.InlineMath, - blockmath: _widgets.BlockMath, - iframe: _widgets.IFrame, - choice: _widgets.Choice, - multiplechoice: _widgets.MultipleChoice, - scale: _widgets.Scale, - checkitem: _widgets.CheckItem, - checklist: _widgets.CheckList, - spreadsheet: _widgets.SpreadSheet, - widget: _widgets.Widget -}, { - em: _prosemirrorDistModel.EmMark, - strong: _prosemirrorDistModel.StrongMark, - link: _prosemirrorDistModel.LinkMark, - code: _prosemirrorDistModel.CodeMark -}); +function rmClass(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } +} -var widgetSchema = new _prosemirrorDistModel.Schema(widgetsSpec); +function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; +} -var pm = window.pm = new _prosemirrorDistEdit.ProseMirror({ - place: document.querySelector("#editor"), - menuBar: true, - doc: document.querySelector("#content").innerHTML, - docFormat: "html", - schema: widgetSchema, - autoInput: true -}); +function contains(parent, child) { + // Android browser and IE will return false if child is a text node. + if (child.nodeType != 1) child = child.parentNode; + return child && parent.contains(child); +} -(0, _prosemirrorDistDom.insertCSS)("\n\t\t\ndiv.ProseMirror-select-menu {\n position: absolute;\n background: #EEE;\n color: black;\n padding: 2px 2px;\n z-index: 15;\n}\n\ndiv.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n\ndiv.ProseMirror-select-menu div:hover {\n background: white;\n}\n\ndiv.ProseMirror-menu form {\n\tbackground: #EEE;\n\twidth: 300px;\n\tborder: 1px solid #AAA\n}\n\ndiv.ProseMirror-menu form select {\n\tbackground: white;\n}\n\ndiv.ProseMirror-menubar-sliding {\n -webkit-transition: right 0.2s ease-out;\n -moz-transition: right 0.2s ease-out;\n transition: right 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n\n"); +function insertCSS(css) { + var style = document.createElement("style"); + style.textContent = css; + document.head.insertBefore(style, document.head.firstChild); +} -},{"../../prosemirror/dist/dom":19,"../../prosemirror/dist/edit":27,"../../prosemirror/dist/inputrules/autoinput":34,"../../prosemirror/dist/menu/menubar":38,"../../prosemirror/dist/menu/tooltipmenu":40,"../../prosemirror/dist/model":45,"./widgets":8}],2:[function(require,module,exports){ +},{}],2:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -exports.defParser = defParser; -exports.defParamsClick = defParamsClick; - -var _prosemirrorDistMenuMenu = require("../../../prosemirror/dist/menu/menu"); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +var _selection = require("./selection"); -var _prosemirrorDistEditSelection = require("../../../prosemirror/dist/edit/selection"); +var _dom = require("../dom"); -var andScroll = { scrollIntoView: true }; +var _keys = require("./keys"); -exports.andScroll = andScroll; -MathJax.Hub.Queue(function () { - MathJax.Hub.Config({ - tex2jax: { - displayMath: [["\\[", "\\]"]], - inlineMath: [["\\(", "\\)"]], - processEscapes: true - }, - displayAlign: "left" - }); -}); +function nothing() {} -function defParser(type, tag, cls) { - type.register("parseDOM", { - tag: tag, - rank: 25, - parse: function parse(dom, context, type, attrs) { - var contains = dom.classList.contains(cls); - if (!contains) return false; - context.insertFrom(dom, type, attrs); - } - }); +function ensureSelection(pm) { + if (pm.selection.node) { + var found = (0, _selection.findSelectionNear)(pm.doc, pm.selection.from, 1, true); + if (found) (0, _selection.setDOMSelectionToPos)(pm, found.head); + } + return false; } -function selectClickedNode(pm, e) { - var pos = (0, _prosemirrorDistEditSelection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); - if (!pos) return pm.sel.pollForUpdate(); +// A backdrop keymap used to make sure we always suppress keys that +// have a dangerous default effect, even if the commands they are +// bound to return false, and to make sure that cursor-motion keys +// find a cursor (as opposed to a node selection) when pressed. - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; +var keys = { + "Esc": nothing, + "Enter": nothing, + "Mod-Enter": nothing, + "Shift-Enter": nothing, + "Backspace": nothing, + "Delete": nothing, + "Mod-B": nothing, + "Mod-I": nothing, + "Mod-Backspace": nothing, + "Mod-Delete": nothing, + "Shift-Backspace": nothing, + "Shift-Delete": nothing, + "Shift-Mod-Backspace": nothing, + "Shift-Mod-Delete": nothing, + "Mod-Z": nothing, + "Mod-Y": nothing, + "Shift-Mod-Z": nothing, + "Ctrl-D": nothing, + "Ctrl-H": nothing, + "Ctrl-Alt-Backspace": nothing, + "Alt-D": nothing, + "Alt-Delete": nothing, + "Alt-Backspace": nothing, - if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { - if (from.depth == 0) return pm.sel.pollForUpdate(); - pos = from.shorten(); - } + "Mod-A": ensureSelection +};["Left", "Right", "Up", "Down", "Home", "End", "PageUp", "PageDown"].forEach(function (key) { + keys[key] = keys["Shift-" + key] = keys["Mod-" + key] = keys["Shift-Mod-" + key] = keys["Alt-" + key] = keys["Shift-Alt-" + key] = ensureSelection; +});["Left", "Mod-Left", "Right", "Mod-Right", "Up", "Down"].forEach(function (key) { + return delete keys[key]; +}); - pm.setNodeSelection(pos); - pm.focus(); - e.preventDefault(); -} +if (_dom.browser.mac) keys["Ctrl-F"] = keys["Ctrl-B"] = keys["Ctrl-P"] = keys["Ctrl-N"] = keys["Alt-F"] = keys["Alt-B"] = keys["Ctrl-A"] = keys["Ctrl-E"] = keys["Ctrl-V"] = keys["goPageUp"] = ensureSelection; -function defParamsClick(type) { - type.prototype.handleClick = function (pm, e, path, node) { - var menu = pm.mod.menuBar.menu; - var cmd = pm.commands["insert" + type.name]; - if (menu && cmd) { - selectClickedNode(pm, e); - menu.enter((0, _prosemirrorDistMenuMenu.readParams)(cmd)); - return true; - } else return false; - }; -} +var captureKeys = new _keys.Keymap(keys); +exports.captureKeys = captureKeys; -},{"../../../prosemirror/dist/edit/selection":33,"../../../prosemirror/dist/menu/menu":37,"../../../prosemirror/dist/model":45}],3:[function(require,module,exports){ +},{"../dom":1,"./keys":11,"./selection":15}],3:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); +exports.isWordChar = isWordChar; +exports.charCategory = charCategory; +exports.isExtendingChar = isExtendingChar; +var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -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 _prosemirrorDistModel = require("../../../prosemirror/dist/model"); - -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var BlockMath = (function (_Block) { - _inherits(BlockMath, _Block); +// Extending unicode characters. A series of a non-extending char + +// any number of extending chars is treated as a single unit as far +// as editing and measuring is concerned. This is not fully correct, +// since some scripts/fonts/browsers also treat other configurations +// of code points as a group. +var extendingChar = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - function BlockMath() { - _classCallCheck(this, BlockMath); +function isWordChar(ch) { + return (/\w/.test(ch) || isExtendingChar(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + ); +} - _get(Object.getPrototypeOf(BlockMath.prototype), "constructor", this).apply(this, arguments); - } +/** + * Get the category of a given character. Either a "space", + * a character that can be part of a word ("word"), or anything else ("other"). + * + * @param {string} ch The character. + * @return {string} + */ - return BlockMath; -})(_prosemirrorDistModel.Block); +function charCategory(ch) { + return (/\s/.test(ch) ? "space" : isWordChar(ch) ? "word" : "other" + ); +} -exports.BlockMath = BlockMath; +function isExtendingChar(ch) { + return ch.charCodeAt(0) >= 768 && extendingChar.test(ch); +} -BlockMath.attributes = { - tex: new _prosemirrorDistModel.Attribute({ "default": "" }) -}; +},{}],4:[function(require,module,exports){ +"use strict"; -(0, _utils.defParser)(BlockMath, "div", "widgets-blockmath"); +Object.defineProperty(exports, "__esModule", { + value: true +}); -BlockMath.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _prosemirrorDistDom.elt)("div", { "class": "widgets-blockmath" }, "\\[" + node.attrs.tex + "\\]"); - // wait until node is attached to document to render - MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); - } - return node.rendered; -}; +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"); + } + }; +})(); -BlockMath.register("command", { - name: "insertBlockMath", - label: "BlockMath", - run: function run(pm, tex) { - return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); - }, - params: [{ label: "Latex Expression", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; +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; + }; +})(); - if (node) return [node.attrs.tex]; - } -}); +exports.defineParamHandler = defineParamHandler; +exports.initCommands = initCommands; +exports.defaultKeymap = defaultKeymap; -(0, _utils.defParamsClick)(BlockMath); +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-blockmath {}\n\n"); +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); + } +} -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],4:[function(require,module,exports){ -"use strict"; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -Object.defineProperty(exports, "__esModule", { - value: true -}); +var _model = require("../model"); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; +var _transform = require("../transform"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _dom = require("../dom"); -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 _utilSortedinsert = require("../util/sortedinsert"); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +var _char = require("./char"); -var _input = require("./input"); +var _keys = require("./keys"); -var _utils = require("../utils"); +var _selection = require("./selection"); -var CheckBox = (function (_Input) { - _inherits(CheckBox, _Input); +var _options = require("./options"); - function CheckBox() { - _classCallCheck(this, CheckBox); +var paramHandlers = Object.create(null); - _get(Object.getPrototypeOf(CheckBox.prototype), "constructor", this).apply(this, arguments); - } +var empty = []; - return CheckBox; -})(_input.Input); +// FIXME document individual commands -exports.CheckBox = CheckBox; +// ;; A command is a named piece of functionality that can be bound to +// a key, shown in the menu, or otherwise exposed to the user. +// +// The commands available in a given editor are gathered from the +// [registries](#registries) given to the editor, and the node and +// mark types in its [schema](#Schema.registry). Use the +// [`register`](#NodeType.register) method with `"command"` as the +// name and a `CommandSpec` as value to define a new command. -CheckBox.attributes = { - name: new _prosemirrorDistModel.Attribute(), - type: new _prosemirrorDistModel.Attribute({ "default": "checkbox" }), - value: new _prosemirrorDistModel.Attribute({ "default": 1 }), - "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-checkbox" }) -}; +var Command = (function () { + function Command(spec, self) { + _classCallCheck(this, Command); -(0, _utils.defParser)(CheckBox, "input", "widgets-checkbox"); + // :: string The name of the command. + this.name = spec.name; + if (!this.name) throw new Error("Trying to define a command without a name"); + // :: CommandSpec The command's specifying object. + this.spec = spec; + this.self = self; + } -// Checkbox inherits serializer from input + // ;; #path=CommandSpec #kind=interface #toc=false + // Commands are defined using objects that specify various aspects of + // the command. The only properties that _must_ appear in a command + // spec are [`name`](#CommandSpec.name) and [`run`](#CommandSpec.run). + // You should probably also give your commands a `label`. -CheckBox.register("command", { - name: "insertCheckBox", - label: "CheckBox", - run: function run(pm, name, label, loc) { - return pm.tr.replaceSelection(this.create({ name: name, label: label, loc: loc })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + // :: string #path=CommandSpec.name + // The name of the command, which will be its key in + // `ProseMirror.commands`, and the thing passed to + // [`execCommand`](#ProseMirror.execCommand). - if (node) return [node.attrs.name, node.attrs.label, node.attrs.loc]; - } -}); + // :: string #path=CommandSpec.label + // A user-facing label for the command. This will be used, among other + // things. as the tooltip title for the command's menu item. If there + // is no `label`, the command's `name` will be used instead. -(0, _utils.defParamsClick)(CheckBox); + // :: (pm: ProseMirror, ...params: [any]) → ?bool #path=CommandSpec.run + // The function that executes the command. If the command has + // [parameters](#CommandSpec.params), their values are passed as + // arguments. For commands [registered](#NodeType.register) on node or + // mark types, `this` will be bound to the node or mark type when this + // function is ran. Should return `false` when the command could not + // be executed. -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-checkbox {}\n\n"); + // :: [CommandParam] #path=CommandSpec.params + // The parameters that this command expects. -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],5:[function(require,module,exports){ -"use strict"; + // :: (pm: ProseMirror) → bool #path=CommandSpec.select + // The function used to [select](#Command.select) the command. `this` + // will again be bound to a node or mark type, when available. -Object.defineProperty(exports, "__esModule", { - value: true -}); + // :: (pm: ProseMirror) → bool #path=CommandSpec.active + // The function used to determine whether the command is + // [active](#Command.active). `this` refers to the associated node or + // mark type. -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; }; })(); + // :: union #path=CommandSpec.key + // The default key binding or bindings for this command. -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + // :: union #path=CommandSpec.pcKey + // Default key binding or bindings specific to non-Mac platforms. -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + // :: union #path=CommandSpec.macKey + // Default key binding or bindings specific to the Mac platform. -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; } + // FIXME document menu and icon properties -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + // ;; #path=CommandParam #kind=interface #toc=false + // The parameters that a command can take are specified using objects + // with the following properties: -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + // :: string #path=CommandParam.label + // The user-facing name of the parameter. Shown to the user when + // prompting for this parameter. -var _utils = require("../utils"); + // :: string #path=CommandParam.type + // The type of the parameter. Supported types are `"text"` and `"select"`. -var CheckItem = (function (_Paragraph) { - _inherits(CheckItem, _Paragraph); + // :: any #path=CommandParam.default + // A default value for the parameter. - function CheckItem() { - _classCallCheck(this, CheckItem); + // :: (string, (pm: ProseMirror, cmd: Command, callback: (?[any]))) + // Register a parameter handler, which is a function that prompts the + // user to enter values for a command's [parameters](#CommandParam), and + // calls a callback with the values received. See also the + // [`commandParamHandler` option](#commandParamHandler). - _get(Object.getPrototypeOf(CheckItem.prototype), "constructor", this).apply(this, arguments); - } + // :: (ProseMirror, ?[any]) → ?bool + // Execute this command. If the command takes + // [parameters](#Command.params), they can be passed as second + // argument here, or omitted, in which case a [parameter + // handler](#defineParamHandler) will be called to prompt the user + // for values. + // + // Returns the value returned by the command spec's [`run` + // method](#CommandSpec.run), or `false` if the command could not be + // ran. - _createClass(CheckItem, [{ - key: "create", - value: function create(attrs, content, marks) { - if (attrs.value > 0) content = [this.schema.node("checkbox", attrs)]; - return _get(Object.getPrototypeOf(CheckItem.prototype), "create", this).call(this, attrs, content, marks); - } - }], [{ - key: "kind", - get: function get() { - return "."; + _createClass(Command, [{ + key: "exec", + value: function exec(pm, params) { + var _this = this; + + var run = this.spec.run; + if (!this.params.length) return run.call(this.self, pm); + if (params) return run.call.apply(run, [this.self, pm].concat(_toConsumableArray(params))); + var handler = getParamHandler(pm); + if (!handler) return false; + handler(pm, this, function (params) { + if (params) run.call.apply(run, [_this.self, pm].concat(_toConsumableArray(params))); + }); } - }]); - return CheckItem; -})(_prosemirrorDistModel.Paragraph); + // :: (ProseMirror) → bool + // Ask this command whether it is currently relevant, given the + // editor's document and selection. If the command does not define a + // [`select`](#CommandSpec.select) method, this always returns true. + }, { + key: "select", + value: function select(pm) { + var f = this.spec.select; + return f ? f.call(this.self, pm) : true; + } -exports.CheckItem = CheckItem; + // :: (ProseMirror) → bool + // Ask this command whether it is “active”. This is mostly used to + // style inline mark icons (such as strong) differently when the + // selection contains such marks. + }, { + key: "active", + value: function active(pm) { + var f = this.spec.active; + return f ? f.call(this.self, pm) : false; + } -CheckItem.attributes = { - name: new _prosemirrorDistModel.Attribute(), - value: new _prosemirrorDistModel.Attribute() -}; - -var CheckList = (function (_Block) { - _inherits(CheckList, _Block); - - function CheckList() { - _classCallCheck(this, CheckList); - - _get(Object.getPrototypeOf(CheckList.prototype), "constructor", this).apply(this, arguments); - } + // :: [CommandParam] + // Get the list of parameters that this command expects. + }, { + key: "params", + get: function get() { + return this.spec.params || empty; + } - _createClass(CheckList, null, [{ - key: "contains", + // :: string + // Get the label for this command. + }, { + key: "label", get: function get() { - return "checkitem"; + return this.spec.label || this.name; } }]); - return CheckList; -})(_prosemirrorDistModel.Block); + return Command; +})(); -exports.CheckList = CheckList; +exports.Command = Command; -CheckList.attributes = { - name: new _prosemirrorDistModel.Attribute(), - layout: new _prosemirrorDistModel.Attribute({ "default": "vertical" }) -}; +function defineParamHandler(name, handler) { + paramHandlers[name] = handler; +} -(0, _utils.defParser)(CheckItem, "div", "widgets-checkitem"); -(0, _utils.defParser)(CheckList, "div", "widgets-checklist"); +function getParamHandler(pm) { + var option = pm.options.commandParamHandler; + if (option && paramHandlers[option]) return paramHandlers[option]; +} -CheckItem.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "p", { - name: node.attrs.name + "-" + node.attrs.value, - value: node.attrs.value, - "class": "widgets-checkitem" +function initCommands(pm) { + var result = Object.create(null); + pm.registry("command", function (spec, type) { + result[spec.name] = new Command(spec, type); }); -}; + return result; +} -CheckList.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "div", { - name: node.attrs.name, - layout: node.attrs.layout, - "class": "widgets-checklist" - }); -}; +function defaultKeymap(pm) { + var bindings = {}; + function add(command, key) { + if (Array.isArray(key)) { + for (var i = 0; i < key.length; i++) { + add(command, key[i]); + } + } else if (key) { + var _d$$exec = /^(.+?)(?:\((\d+)\))?$/.exec(key); -CheckItem.register("command", { - name: "splitCheckitem", - label: "Split the current checkitem", + var _d$$exec2 = _slicedToArray(_d$$exec, 3); + + var _ = _d$$exec2[0]; + var _name = _d$$exec2[1]; + var _d$$exec2$2 = _d$$exec2[2]; + var rank = _d$$exec2$2 === undefined ? 50 : _d$$exec2$2; + + (0, _utilSortedinsert2["default"])(bindings[_name] || (bindings[_name] = []), { command: command, rank: rank }, function (a, b) { + return a.rank - b.rank; + }); + } + } + for (var _name2 in pm.commands) { + var cmd = pm.commands[_name2]; + add(_name2, cmd.spec.key); + add(_name2, _dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); + } + + for (var key in bindings) { + bindings[key] = bindings[key].map(function (b) { + return b.command; + }); + }return new _keys.Keymap(bindings); +} + +var andScroll = { scrollIntoView: true }; + +_model.HardBreak.register("command", { + name: "insertHardBreak", + label: "Insert hard break", run: function run(pm) { var _pm$selection = pm.selection; var node = _pm$selection.node; var from = _pm$selection.from; - var to = _pm$selection.to; - if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - console.log(grandParent.type.name); - if (grandParent.type.name != "checklist") return false; - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + if (node && node.isBlock) return false;else if (pm.doc.path(from.path).type.isCode) return pm.tr.typeText("\n").apply(andScroll);else return pm.tr.replaceSelection(this.create()).apply(andScroll); }, - key: "Enter(50)" + key: ["Mod-Enter", "Shift-Enter"] }); -CheckList.register("command", { - name: "insertCheckList", - label: "CheckList", - run: function run(pm, name, layout) { - var chkitem = pm.schema.nodes.checkitem.create({ name: name, value: 0 }); - return pm.tr.replaceSelection(this.create({ name: name + "-0", layout: layout }, chkitem)).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Layout (vertical, horizontal)", type: "select", options: [{ value: "horizontal", label: "horizontal" }, { value: "vertical", label: "vertical" }] }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; +function markActive(pm, type) { + var sel = pm.selection; + if (sel.empty) return type.isInSet(pm.activeMarks());else return pm.doc.rangeHasMark(sel.from, sel.to, type); +} - if (node) return [node.attrs.name, node.attrs.layout]; - } -}); +function canAddInline(pm, type) { + var _pm$selection2 = pm.selection; + var from = _pm$selection2.from; + var to = _pm$selection2.to; + var empty = _pm$selection2.empty; -CheckItem.register("command", { - name: "splitCheckItem", - label: "Split the current checkitem", - run: function run(pm) { - var _pm$selection2 = pm.selection; - var node = _pm$selection2.node; - var from = _pm$selection2.from; - var to = _pm$selection2.to; + if (empty) return !type.isInSet(pm.activeMarks()) && pm.doc.path(from.path).type.canContainMark(type); + var can = false; + pm.doc.nodesBetween(from, to, function (node) { + if (can || node.isTextblock && !node.type.canContainMark(type)) return false; + if (node.isInline && !type.isInSet(node.marks)) can = true; + }); + return can; +} - if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { - name: grandParent.attrs.name + "-" + grandParent.size, - value: grandParent.size }).apply(_utils.andScroll); - }, - key: "Enter(50)" -}); +function markApplies(pm, type) { + var _pm$selection3 = pm.selection; + var from = _pm$selection3.from; + var to = _pm$selection3.to; -CheckItem.register("command", { - name: "deleteCheckItem", - label: "delete this checkitem or checklist", - run: function run(pm) { - var _pm$selection3 = pm.selection; - var head = _pm$selection3.head; - var empty = _pm$selection3.empty; + var relevant = false; + pm.doc.nodesBetween(from, to, function (node) { + if (node.isTextblock) { + if (node.type.canContainMark(type)) relevant = true; + return false; + } + }); + return relevant; +} - if (!empty || head.offset > 1) return false; - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - }var mc = pm.doc.path(cut.path).child(cut.offset); - // if top choice, delete whole question if only one choice - if (mc.type.name == "checkitem") { - return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); - } else { - // don't delete question if more than one choice - if (mc.size == 1) { - return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); - } else return false; +function generateMarkCommands(type, name, labelName, spec) { + if (!labelName) labelName = name; + var cap = name.charAt(0).toUpperCase() + name.slice(1); + type.register("command", { + name: "set" + cap, + label: "Set " + labelName, + run: function run(pm) { + pm.setMark(this, true); + }, + select: function select(pm) { + return canAddInline(pm, this); + }, + icon: { from: name } + }); + type.register("command", { + name: "unset" + cap, + label: "Remove " + labelName, + run: function run(pm) { + pm.setMark(this, false); + }, + select: function select(pm) { + return markActive(pm, this); + }, + icon: { from: name } + }); + var command = { + name: name, + label: "Toggle " + labelName, + run: function run(pm) { + pm.setMark(this, null); + }, + active: function active(pm) { + return markActive(pm, this); + }, + select: function select(pm) { + return markApplies(pm, this); } + }; + for (var prop in spec) { + command[prop] = spec[prop]; + }type.register("command", command); +} + +generateMarkCommands(_model.StrongMark, "strong", null, { + menuGroup: "inline", menuRank: 20, + icon: { + width: 805, height: 1024, + path: "M317 869q42 18 80 18 214 0 214-191 0-65-23-102-15-25-35-42t-38-26-46-14-48-6-54-1q-41 0-57 5 0 30-0 90t-0 90q0 4-0 38t-0 55 2 47 6 38zM309 442q24 4 62 4 46 0 81-7t62-25 42-51 14-81q0-40-16-70t-45-46-61-24-70-8q-28 0-74 7 0 28 2 86t2 86q0 15-0 45t-0 45q0 26 0 39zM0 950l1-53q8-2 48-9t60-15q4-6 7-15t4-19 3-18 1-21 0-19v-37q0-561-12-585-2-4-12-8t-25-6-28-4-27-2-17-1l-2-47q56-1 194-6t213-5q13 0 39 0t38 0q40 0 78 7t73 24 61 40 42 59 16 78q0 29-9 54t-22 41-36 32-41 25-48 22q88 20 146 76t58 141q0 57-20 102t-53 74-78 48-93 27-100 8q-25 0-75-1t-75-1q-60 0-175 6t-132 6z" }, - key: ["Backspace(50)", "Mod-Backspace(50)"] + key: "Mod-B" }); -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-checkitem {}\n.widgets-checklist {}\n\n"); - -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],6:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true +generateMarkCommands(_model.EmMark, "em", "emphasis", { + menuGroup: "inline", menuRank: 21, + icon: { + width: 585, height: 1024, + path: "M0 949l9-48q3-1 46-12t63-21q16-20 23-57 0-4 35-165t65-310 29-169v-14q-13-7-31-10t-39-4-33-3l10-58q18 1 68 3t85 4 68 1q27 0 56-1t69-4 56-3q-2 22-10 50-17 5-58 16t-62 19q-4 10-8 24t-5 22-4 26-3 24q-15 84-50 239t-44 203q-1 5-7 33t-11 51-9 47-3 32l0 10q9 2 105 17-1 25-9 56-6 0-18 0t-18 0q-16 0-49-5t-49-5q-78-1-117-1-29 0-81 5t-69 6z" + }, + key: "Mod-I" }); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -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 _prosemirrorDistModel = require("../../../prosemirror/dist/model"); - -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var IFrame = (function (_Block) { - _inherits(IFrame, _Block); - - function IFrame() { - _classCallCheck(this, IFrame); - - _get(Object.getPrototypeOf(IFrame.prototype), "constructor", this).apply(this, arguments); - } - - return IFrame; -})(_prosemirrorDistModel.Block); - -exports.IFrame = IFrame; - -IFrame.attributes = { - src: new _prosemirrorDistModel.Attribute({ "default": "" }), - width: new _prosemirrorDistModel.Attribute({ "default": 200 }), - height: new _prosemirrorDistModel.Attribute({ "default": 200 }) -}; - -(0, _utils.defParser)(IFrame, "iframe", "widgets-iframe"); - -IFrame.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "iframe", { - src: node.attrs.src, - width: node.attrs.width, - height: node.attrs.height, - content: "text/html;charset=UTF-8", - "class": "iframe", - frameborder: "1", - allowfullscreen: "1" - }); -}; - -IFrame.register("command", { - name: "insertIFrame", - label: "show websites, youTube, GoogleMaps,...", - run: function run(pm, src, width, height) { - return pm.tr.replaceSelection(this.create({ src: src, width: width, height: height })).apply(_utils.andScroll); - }, - params: [{ label: "Link (website, youTube, Google Maps ...)", type: "text" }, { label: "Width in pixels", type: "text", "default": 200 }, { label: "Height in pixels", type: "text", "default": 200 }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.src, node.attrs.width, node.attrs.height]; - } +generateMarkCommands(_model.CodeMark, "code", null, { + menuGroup: "inline", menuRank: 22, + icon: { + width: 896, height: 1024, + path: "M608 192l-96 96 224 224-224 224 96 96 288-320-288-320zM288 192l-288 320 288 320 96-96-224-224 224-224-96-96z" + }, + key: "Mod-`" }); -(0, _utils.defParamsClick)(IFrame); - -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-iframe {}\n\n"); - -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],7:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true +_model.LinkMark.register("command", { + name: "unlink", + label: "Unlink", + run: function run(pm) { + pm.setMark(this, false); + }, + select: function select(pm) { + return markActive(pm, this); + }, + active: function active() { + return true; + }, + menuGroup: "inline", menuRank: 30, + icon: { from: "link" } }); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -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 _prosemirrorDistModel = require("../../../prosemirror/dist/model"); - -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); - -var _utils = require("../utils"); - -var Image = (function (_Inline) { - _inherits(Image, _Inline); - - function Image() { - _classCallCheck(this, Image); - - _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); +_model.LinkMark.register("command", { + name: "link", + label: "Add link", + run: function run(pm, href, title) { + pm.setMark(this, true, { href: href, title: title }); + }, + params: [{ label: "Target", type: "text" }, { label: "Title", type: "text", "default": "" }], + select: function select(pm) { + return markApplies(pm, this) && !markActive(pm, this); + }, + menuGroup: "inline", menuRank: 30, + icon: { + width: 951, height: 1024, + path: "M832 694q0-22-16-38l-118-118q-16-16-38-16-24 0-41 18 1 1 10 10t12 12 8 10 7 14 2 15q0 22-16 38t-38 16q-8 0-15-2t-14-7-10-8-12-12-10-10q-18 17-18 41 0 22 16 38l117 118q15 15 38 15 22 0 38-14l84-83q16-16 16-38zM430 292q0-22-16-38l-117-118q-16-16-38-16-22 0-38 15l-84 83q-16 16-16 38 0 22 16 38l118 118q15 15 38 15 24 0 41-17-1-1-10-10t-12-12-8-10-7-14-2-15q0-22 16-38t38-16q8 0 15 2t14 7 10 8 12 12 10 10q18-17 18-41zM941 694q0 68-48 116l-84 83q-47 47-116 47-69 0-116-48l-117-118q-47-47-47-116 0-70 50-119l-50-50q-49 50-118 50-68 0-116-48l-118-118q-48-48-48-116t48-116l84-83q47-47 116-47 69 0 116 48l117 118q47 47 47 116 0 70-50 119l50 50q49-50 118-50 68 0 116 48l118 118q48 48 48 116z" } +}); - return Image; -})(_prosemirrorDistModel.Inline); - -exports.Image = Image; - -Image.attributes = { - src: new _prosemirrorDistModel.Attribute(), - alt: new _prosemirrorDistModel.Attribute({ "default": "" }), - title: new _prosemirrorDistModel.Attribute({ "default": "" }), - "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-img" }) -}; - -(0, _utils.defParser)(Image, "img", "widgets-img"); - -Image.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "img", node.attrs); -}; - -Image.register("command", { +_model.Image.register("command", { name: "insertImage", label: "Insert image", run: function run(pm, src, alt, title) { - return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(_utils.andScroll); + return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(andScroll); }, params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], select: function select(pm) { return pm.doc.path(pm.selection.from.path).type.canContainType(this); }, + menuGroup: "inline", menuRank: 40, + icon: { + width: 1097, height: 1024, + path: "M365 329q0 45-32 77t-77 32-77-32-32-77 32-77 77-32 77 32 32 77zM950 548v256h-804v-109l182-182 91 91 292-292zM1005 146h-914q-7 0-12 5t-5 12v694q0 7 5 12t12 5h914q7 0 12-5t5-12v-694q0-7-5-12t-12-5zM1097 164v694q0 37-26 64t-64 26h-914q-37 0-64-26t-26-64v-694q0-37 26-64t64-26h914q37 0 64 26t26 64z" + }, prefillParams: function prefillParams(pm) { var node = pm.selection.node; @@ -587,3291 +664,3171 @@ Image.register("command", { } }); -(0, _utils.defParamsClick)(Image); +/** + * Get an offset moving backward from a current offset inside a node. + * + * @param {Object} parent The parent node. + * @param {int} offset Offset to move from inside the node. + * @param {string} by Size to delete by. Either "char" or "word". + */ +function moveBackward(parent, offset, by) { + if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-image {}\n\n"); + var cat = null, + counted = 0; + for (;;) { + if (offset == 0) return offset; -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],8:[function(require,module,exports){ -"use strict"; + var _parent$chunkBefore = parent.chunkBefore(offset); -Object.defineProperty(exports, "__esModule", { - value: true -}); + var start = _parent$chunkBefore.start; + var node = _parent$chunkBefore.node; -var _blockmath = require("./blockmath"); + if (!node.isText) return cat ? offset : offset - 1; -Object.defineProperty(exports, "BlockMath", { - enumerable: true, - get: function get() { - return _blockmath.BlockMath; + if (by == "char") { + for (var i = offset - start; i > 0; i--) { + if (!(0, _char.isExtendingChar)(node.text.charAt(i - 1))) return offset - 1; + offset--; + } + } else if (by == "word") { + // Work from the current position backwards through text of a singular + // character category (e.g. "cat" of "#!*") until reaching a character in a + // different category (i.e. the end of the word). + for (var i = offset - start; i > 0; i--) { + var nextCharCat = (0, _char.charCategory)(node.text.charAt(i - 1)); + if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; + offset--; + counted++; + } + } } -}); - -var _checkbox = require("./checkbox"); +} -Object.defineProperty(exports, "CheckBox", { - enumerable: true, - get: function get() { - return _checkbox.CheckBox; - } +_options.defaultRegistry.register("command", { + name: "deleteSelection", + label: "Delete the selection", + run: function run(pm) { + return pm.tr.replaceSelection().apply(andScroll); + }, + key: ["Backspace(10)", "Delete(10)", "Mod-Backspace(10)", "Mod-Delete(10)"], + macKey: ["Ctrl-H(10)", "Alt-Backspace(10)", "Ctrl-D(10)", "Ctrl-Alt-Backspace(10)", "Alt-Delete(10)", "Alt-D(10)"] }); -var _checklist = require("./checklist"); +function deleteBarrier(pm, cut) { + var around = pm.doc.path(cut.path); + var before = around.child(cut.offset - 1), + after = around.child(cut.offset); + if (before.type.canContainContent(after.type) && pm.tr.join(cut).apply(andScroll) !== false) return; -Object.defineProperty(exports, "CheckList", { - enumerable: true, - get: function get() { - return _checklist.CheckList; - } -}); -Object.defineProperty(exports, "CheckItem", { - enumerable: true, - get: function get() { - return _checklist.CheckItem; + var conn = undefined; + if (after.isTextblock && (conn = before.type.findConnection(after.type))) { + var tr = pm.tr, + end = cut.move(1); + tr.step("ancestor", cut, end, null, { types: [before.type].concat(_toConsumableArray(conn)), + attrs: [before.attrs].concat(_toConsumableArray(conn.map(function () { + return null; + }))) }); + tr.join(end); + tr.join(cut); + if (tr.apply(andScroll) !== false) return; } -}); -var _iframe = require("./iframe"); + var selAfter = (0, _selection.findSelectionFrom)(pm.doc, cut, 1); + return pm.tr.lift(selAfter.from, selAfter.to).apply(andScroll); +} -Object.defineProperty(exports, "IFrame", { - enumerable: true, - get: function get() { - return _iframe.IFrame; - } -}); +_options.defaultRegistry.register("command", { + name: "joinBackward", + label: "Join with the block above", + run: function run(pm) { + var _pm$selection4 = pm.selection; + var head = _pm$selection4.head; + var empty = _pm$selection4.empty; -var _inlinemath = require("./inlinemath"); + if (!empty || head.offset > 0) return false; -Object.defineProperty(exports, "InlineMath", { - enumerable: true, - get: function get() { - return _inlinemath.InlineMath; - } -}); + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + } // If there is no node before this, try to lift + if (!before) return pm.tr.lift(head).apply(andScroll); -var _input = require("./input"); + // If the node doesn't allow children, delete it + if (before.type.contains == null) return pm.tr["delete"](cut.move(-1), cut).apply(andScroll); -Object.defineProperty(exports, "Input", { - enumerable: true, - get: function get() { - return _input.Input; - } + // Apply the joining algorithm + return deleteBarrier(pm, cut); + }, + key: ["Backspace(30)", "Mod-Backspace(30)"] }); -var _multiplechoice = require("./multiplechoice"); +_options.defaultRegistry.register("command", { + name: "deleteCharBefore", + label: "Delete a character before the cursor", + run: function run(pm) { + var _pm$selection5 = pm.selection; + var head = _pm$selection5.head; + var empty = _pm$selection5.empty; -Object.defineProperty(exports, "MultipleChoice", { - enumerable: true, - get: function get() { - return _multiplechoice.MultipleChoice; - } -}); -Object.defineProperty(exports, "Choice", { - enumerable: true, - get: function get() { - return _multiplechoice.Choice; - } + if (!empty || head.offset == 0) return false; + var from = moveBackward(pm.doc.path(head.path), head.offset, "char"); + return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); + }, + key: "Backspace(60)", + macKey: "Ctrl-H(40)" }); -var _radiobutton = require("./radiobutton"); +_options.defaultRegistry.register("command", { + name: "deleteWordBefore", + label: "Delete the word before the cursor", + run: function run(pm) { + var _pm$selection6 = pm.selection; + var head = _pm$selection6.head; + var empty = _pm$selection6.empty; -Object.defineProperty(exports, "RadioButton", { - enumerable: true, - get: function get() { - return _radiobutton.RadioButton; - } + if (!empty || head.offset == 0) return false; + var from = moveBackward(pm.doc.path(head.path), head.offset, "word"); + return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); + }, + key: "Mod-Backspace(40)", + macKey: "Alt-Backspace(40)" }); -var _scale = require("./scale"); +function moveForward(parent, offset, by) { + if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); -Object.defineProperty(exports, "Scale", { - enumerable: true, - get: function get() { - return _scale.Scale; - } -}); + var cat = null, + counted = 0; + for (;;) { + if (offset == parent.size) return offset; -var _select = require("./select"); + var _parent$chunkAfter = parent.chunkAfter(offset); -Object.defineProperty(exports, "Select", { - enumerable: true, - get: function get() { - return _select.Select; - } -}); + var start = _parent$chunkAfter.start; + var node = _parent$chunkAfter.node; -var _textarea = require("./textarea"); + if (!node.isText) return cat ? offset : offset + 1; -Object.defineProperty(exports, "TextArea", { - enumerable: true, - get: function get() { - return _textarea.TextArea; + if (by == "char") { + for (var i = offset - start; i < node.text.length; i++) { + if (!(0, _char.isExtendingChar)(node.text.charAt(i + 1))) return offset + 1; + offset++; + } + } else if (by == "word") { + for (var i = offset - start; i < node.text.length; i++) { + var nextCharCat = (0, _char.charCategory)(node.text.charAt(i)); + if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; + offset++; + counted++; + } + } } -}); +} -var _textfield = require("./textfield"); +_options.defaultRegistry.register("command", { + name: "joinForward", + label: "Join with the block below", + run: function run(pm) { + var _pm$selection7 = pm.selection; + var head = _pm$selection7.head; + var empty = _pm$selection7.empty; -Object.defineProperty(exports, "TextField", { - enumerable: true, - get: function get() { - return _textfield.TextField; - } -}); + if (!empty || head.offset < pm.doc.path(head.path).size) return false; -var _image = require("./image"); + // Find the node after this one + var after = undefined, + cut = undefined; + for (var i = head.path.length - 1; !after && i >= 0; i--) { + cut = head.shorten(i, 1); + var _parent = pm.doc.path(cut.path); + if (cut.offset < _parent.size) after = _parent.child(cut.offset); + } -Object.defineProperty(exports, "Image", { - enumerable: true, - get: function get() { - return _image.Image; - } -}); + // If there is no node after this, there's nothing to do + if (!after) return false; -var _spreadsheet = require("./spreadsheet"); + // If the node doesn't allow children, delete it + if (after.type.contains == null) return pm.tr["delete"](cut, cut.move(1)).apply(andScroll); -Object.defineProperty(exports, "SpreadSheet", { - enumerable: true, - get: function get() { - return _spreadsheet.SpreadSheet; - } + // Apply the joining algorithm + return deleteBarrier(pm, cut); + }, + key: ["Delete(30)", "Mod-Delete(30)"] }); -var _widget = require("./widget"); +_options.defaultRegistry.register("command", { + name: "deleteCharAfter", + label: "Delete a character after the cursor", + run: function run(pm) { + var _pm$selection8 = pm.selection; + var head = _pm$selection8.head; + var empty = _pm$selection8.empty; -Object.defineProperty(exports, "Widget", { - enumerable: true, - get: function get() { - return _widget.Widget; - } + if (!empty || head.offset == pm.doc.path(head.path).size) return false; + var to = moveForward(pm.doc.path(head.path), head.offset, "char"); + return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); + }, + key: "Delete(60)", + macKey: "Ctrl-D(60)" }); -},{"./blockmath":3,"./checkbox":4,"./checklist":5,"./iframe":6,"./image":7,"./inlinemath":9,"./input":10,"./multiplechoice":11,"./radiobutton":12,"./scale":13,"./select":14,"./spreadsheet":15,"./textarea":16,"./textfield":17,"./widget":18}],9:[function(require,module,exports){ -"use strict"; +_options.defaultRegistry.register("command", { + name: "deleteWordAfter", + label: "Delete a character after the cursor", + run: function run(pm) { + var _pm$selection9 = pm.selection; + var head = _pm$selection9.head; + var empty = _pm$selection9.empty; -Object.defineProperty(exports, "__esModule", { - value: true + if (!empty || head.offset == pm.doc.path(head.path).size) return false; + var to = moveForward(pm.doc.path(head.path), head.offset, "word"); + return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); + }, + key: "Mod-Delete(40)", + macKey: ["Ctrl-Alt-Backspace(40)", "Alt-Delete(40)", "Alt-D(40)"] }); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -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 _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +function joinPointAbove(pm) { + var _pm$selection10 = pm.selection; + var node = _pm$selection10.node; + var from = _pm$selection10.from; -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + if (node) return (0, _transform.joinableBlocks)(pm.doc, from) ? from : null;else return (0, _transform.joinPoint)(pm.doc, from, -1); +} -var _utils = require("../utils"); +_options.defaultRegistry.register("command", { + name: "joinUp", + label: "Join with above block", + run: function run(pm) { + var node = pm.selection.node; + var point = joinPointAbove(pm); + if (!point) return false; + pm.tr.join(point).apply(); + if (node) pm.setNodeSelection(point.move(-1)); + }, + select: function select(pm) { + return joinPointAbove(pm); + }, + menuGroup: "block", menuRank: 80, + icon: { + width: 800, height: 900, + path: "M0 75h800v125h-800z M0 825h800v-125h-800z M250 400h100v-100h100v100h100v100h-100v100h-100v-100h-100z" + }, + key: "Alt-Up" +}); -var InlineMath = (function (_Inline) { - _inherits(InlineMath, _Inline); +function joinPointBelow(pm) { + var _pm$selection11 = pm.selection; + var node = _pm$selection11.node; + var to = _pm$selection11.to; - function InlineMath() { - _classCallCheck(this, InlineMath); + if (node) return (0, _transform.joinableBlocks)(pm.doc, to) ? to : null;else return (0, _transform.joinPoint)(pm.doc, to, 1); +} - _get(Object.getPrototypeOf(InlineMath.prototype), "constructor", this).apply(this, arguments); - } +_options.defaultRegistry.register("command", { + name: "joinDown", + label: "Join with below block", + run: function run(pm) { + var node = pm.selection.node; + var point = joinPointBelow(pm); + if (!point) return false; + pm.tr.join(point).apply(); + if (node) pm.setNodeSelection(point.move(-1)); + }, + select: function select(pm) { + return joinPointBelow(pm); + }, + key: "Alt-Down" +}); - return InlineMath; -})(_prosemirrorDistModel.Inline); +_options.defaultRegistry.register("command", { + name: "lift", + label: "Lift out of enclosing block", + run: function run(pm) { + var _pm$selection12 = pm.selection; + var from = _pm$selection12.from; + var to = _pm$selection12.to; -exports.InlineMath = InlineMath; + return pm.tr.lift(from, to).apply(andScroll); + }, + select: function select(pm) { + var _pm$selection13 = pm.selection; + var from = _pm$selection13.from; + var to = _pm$selection13.to; -InlineMath.attributes = { - tex: new _prosemirrorDistModel.Attribute({ "default": "" }) -}; + return (0, _transform.canLift)(pm.doc, from, to); + }, + menuGroup: "block", menuRank: 75, + icon: { + width: 1024, height: 1024, + path: "M219 310v329q0 7-5 12t-12 5q-8 0-13-5l-164-164q-5-5-5-13t5-13l164-164q5-5 13-5 7 0 12 5t5 12zM1024 749v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12zM1024 530v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 310v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 91v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12z" + }, + key: "Alt-Left" +}); -(0, _utils.defParser)(InlineMath, "span", "widgets-inlinemath"); +function isAtTopOfListItem(doc, from, to, listType) { + return _model.Pos.samePath(from.path, to.path) && from.path.length >= 2 && from.path[from.path.length - 1] == 0 && listType.canContain(doc.path(from.path.slice(0, from.path.length - 1))); +} -InlineMath.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _prosemirrorDistDom.elt)("span", { "class": "widgets-inlinemath" }, " \\(" + node.attrs.tex + "\\) "); - // wait until node is attached to document to render - MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); - } - return node.rendered; -}; +function wrapCommand(type, name, labelName, isList, spec) { + var command = { + name: "wrap" + name, + label: "Wrap in " + labelName, + run: function run(pm) { + var _pm$selection14 = pm.selection; + var from = _pm$selection14.from; + var to = _pm$selection14.to; + var head = _pm$selection14.head;var doJoin = false; + if (isList && head && isAtTopOfListItem(pm.doc, from, to, this)) { + // Don't do anything if this is the top of the list + if (from.path[from.path.length - 2] == 0) return false; + doJoin = true; + } + var tr = pm.tr.wrap(from, to, this); + if (doJoin) tr.join(from.shorten(from.depth - 2)); + return tr.apply(andScroll); + }, + select: function select(pm) { + var _pm$selection15 = pm.selection; + var from = _pm$selection15.from; + var to = _pm$selection15.to; + var head = _pm$selection15.head; -InlineMath.register("command", { - name: "insertInlineMath", - label: "InlineMath", - run: function run(pm, tex) { - return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); - }, - params: [{ label: "Latex Expression", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + if (isList && head && isAtTopOfListItem(pm.doc, from, to, this) && from.path[from.path.length - 2] == 0) return false; + return (0, _transform.canWrap)(pm.doc, from, to, this); + } + }; + for (var key in spec) { + command[key] = spec[key]; + }type.register("command", command); +} - if (node) return [node.attrs.tex]; - } +wrapCommand(_model.BulletList, "BulletList", "bullet list", true, { + menuGroup: "block", menuRank: 40, + icon: { + width: 768, height: 896, + path: "M0 512h128v-128h-128v128zM0 256h128v-128h-128v128zM0 768h128v-128h-128v128zM256 512h512v-128h-512v128zM256 256h512v-128h-512v128zM256 768h512v-128h-512v128z" + }, + key: ["Alt-Right '*'", "Alt-Right '-'"] }); -(0, _utils.defParamsClick)(InlineMath); - -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-inlinemath {}\n\n"); - -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],10:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true +wrapCommand(_model.OrderedList, "OrderedList", "ordered list", true, { + menuGroup: "block", menuRank: 41, + icon: { + width: 768, height: 896, + path: "M320 512h448v-128h-448v128zM320 768h448v-128h-448v128zM320 128v128h448v-128h-448zM79 384h78v-256h-36l-85 23v50l43-2v185zM189 590c0-36-12-78-96-78-33 0-64 6-83 16l1 66c21-10 42-15 67-15s32 11 32 28c0 26-30 58-110 112v50h192v-67l-91 2c49-30 87-66 87-113l1-1z" + }, + key: "Alt-Right '1'" }); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; +wrapCommand(_model.BlockQuote, "BlockQuote", "block quote", false, { + menuGroup: "block", menuRank: 45, + icon: { + width: 640, height: 896, + path: "M0 448v256h256v-256h-128c0 0 0-128 128-128v-128c0 0-256 0-256 256zM640 320v-128c0 0-256 0-256 256v256h256v-256h-128c0 0 0-128 128-128z" + }, + key: ["Alt-Right '>'", "Alt-Right '\"'"] +}); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +_options.defaultRegistry.register("command", { + name: "newlineInCode", + label: "Insert newline", + run: function run(pm) { + var _pm$selection16 = pm.selection; + var from = _pm$selection16.from; + var to = _pm$selection16.to; + var node = _pm$selection16.node;var block = undefined; + if (!node && _model.Pos.samePath(from.path, to.path) && (block = pm.doc.path(from.path)).type.isCode && to.offset < block.size) return pm.tr.typeText("\n").apply(andScroll);else return false; + }, + key: "Enter(10)" +}); -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; } +_options.defaultRegistry.register("command", { + name: "createParagraphNear", + label: "Create a paragraph near the selected leaf block", + run: function run(pm) { + var _pm$selection17 = pm.selection; + var from = _pm$selection17.from; + var to = _pm$selection17.to; + var node = _pm$selection17.node; -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + if (!node || !node.isBlock || node.type.contains) return false; + var side = from.offset ? to : from; + pm.tr.insert(side, pm.schema.defaultTextblockType().create()).apply(andScroll); + pm.setTextSelection(new _model.Pos(side.toPath(), 0)); + }, + key: "Enter(20)" +}); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +_options.defaultRegistry.register("command", { + name: "liftEmptyBlock", + label: "Move current block up", + run: function run(pm) { + var _pm$selection18 = pm.selection; + var head = _pm$selection18.head; + var empty = _pm$selection18.empty; -var _utils = require("../utils"); + if (!empty || head.offset > 0 || pm.doc.path(head.path).size) return false; + if (head.depth > 1) { + var shorter = head.shorten(); + if (shorter.offset > 0 && shorter.offset < pm.doc.path(shorter.path).size - 1 && pm.tr.split(shorter).apply() !== false) return; + } + return pm.tr.lift(head).apply(andScroll); + }, + key: "Enter(30)" +}); -var Input = (function (_Inline) { - _inherits(Input, _Inline); +_options.defaultRegistry.register("command", { + name: "splitBlock", + label: "Split the current block", + run: function run(pm) { + var _pm$selection19 = pm.selection; + var from = _pm$selection19.from; + var to = _pm$selection19.to; + var node = _pm$selection19.node;var block = pm.doc.path(to.path); + if (node && node.isBlock) { + if (!from.offset) return false; + return pm.tr.split(from).apply(andScroll); + } else { + var type = to.offset == block.size ? pm.schema.defaultTextblockType() : null; + return pm.tr["delete"](from, to).split(from, 1, type).apply(andScroll); + } + }, + key: "Enter(60)" +}); - function Input() { - _classCallCheck(this, Input); +_model.ListItem.register("command", { + name: "splitListItem", + label: "Split the current list item", + run: function run(pm) { + var _pm$selection20 = pm.selection; + var from = _pm$selection20.from; + var to = _pm$selection20.to; + var node = _pm$selection20.node; - _get(Object.getPrototypeOf(Input.prototype), "constructor", this).apply(this, arguments); - } + if (node && node.isBlock || from.path.length < 2 || !_model.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + if (grandParent.type != this) return false; + var nextType = to.offset == grandParent.child(toParent.offset).size ? pm.schema.defaultTextblockType() : null; + return pm.tr["delete"](from, to).split(from, 2, nextType).apply(andScroll); + }, + key: "Enter(50)" +}); - return Input; -})(_prosemirrorDistModel.Inline); +function alreadyHasBlockType(doc, from, to, type, attrs) { + var found = false; + if (!attrs) attrs = {}; + doc.nodesBetween(from, to || from, function (node) { + if (node.isTextblock) { + if (node.hasMarkup(type, attrs)) found = true; + return false; + } + }); + return found; +} -exports.Input = Input; +function blockTypeCommand(type, name, labelName, attrs, key) { + if (!attrs) attrs = {}; + type.register("command", { + name: name, + label: "Change to " + labelName, + run: function run(pm) { + var _pm$selection21 = pm.selection; + var from = _pm$selection21.from; + var to = _pm$selection21.to; -Input.attributes = { - name: new _prosemirrorDistModel.Attribute(), - type: new _prosemirrorDistModel.Attribute({ "default": "text" }), - value: new _prosemirrorDistModel.Attribute() -}; + return pm.tr.setBlockType(from, to, this, attrs).apply(andScroll); + }, + select: function select(pm) { + var _pm$selection22 = pm.selection; + var from = _pm$selection22.from; + var to = _pm$selection22.to; + var node = _pm$selection22.node; -(0, _utils.defParser)(Input, "widgets-input"); + if (node) return node.isTextblock && !node.hasMarkup(this, attrs);else return !alreadyHasBlockType(pm.doc, from, to, this, attrs); + }, + key: key + }); +} -Input.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "input", node.attrs); -}; +blockTypeCommand(_model.Heading, "makeH1", "heading 1", { level: 1 }, "Mod-H '1'"); +blockTypeCommand(_model.Heading, "makeH2", "heading 2", { level: 2 }, "Mod-H '2'"); +blockTypeCommand(_model.Heading, "makeH3", "heading 3", { level: 3 }, "Mod-H '3'"); +blockTypeCommand(_model.Heading, "makeH4", "heading 4", { level: 4 }, "Mod-H '4'"); +blockTypeCommand(_model.Heading, "makeH5", "heading 5", { level: 5 }, "Mod-H '5'"); +blockTypeCommand(_model.Heading, "makeH6", "heading 6", { level: 6 }, "Mod-H '6'"); -(0, _prosemirrorDistDom.insertCSS)("\n\t\t\n.widgets-input {}\n\n"); +blockTypeCommand(_model.Paragraph, "makeParagraph", "paragraph", null, "Mod-P"); +blockTypeCommand(_model.CodeBlock, "makeCodeBlock", "code block", null, "Mod-\\"); -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],11:[function(require,module,exports){ -"use strict"; +_model.HorizontalRule.register("command", { + name: "insertHorizontalRule", + label: "Insert horizontal rule", + run: function run(pm) { + return pm.tr.replaceSelection(this.create()).apply(andScroll); + }, + key: "Mod-Space" +}); -Object.defineProperty(exports, "__esModule", { - value: true +_options.defaultRegistry.register("command", { + name: "undo", + label: "Undo last change", + run: function run(pm) { + pm.scrollIntoView();return pm.history.undo(); + }, + select: function select(pm) { + return pm.history.canUndo(); + }, + menuGroup: "history", menuRank: 10, + icon: { + width: 1024, height: 1024, + path: "M761 1024c113-206 132-520-313-509v253l-384-384 384-384v248c534-13 594 472 313 775z" + }, + key: "Mod-Z" }); -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(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; +_options.defaultRegistry.register("command", { + name: "redo", + label: "Redo last undone change", + run: function run(pm) { + pm.scrollIntoView();return pm.history.redo(); + }, + select: function select(pm) { + return pm.history.canRedo(); + }, + menuGroup: "history", menuRank: 20, + icon: { + width: 1024, height: 1024, + path: "M576 248v-248l384 384-384 384v-253c-446-10-427 303-313 509-280-303-221-789 313-775z" + }, + key: ["Mod-Y", "Shift-Mod-Z"] +}); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +_options.defaultRegistry.register("command", { + name: "textblockType", + label: "Change block type", + run: function run(pm, type) { + var _pm$selection23 = pm.selection; + var from = _pm$selection23.from; + var to = _pm$selection23.to; -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; } + return pm.tr.setBlockType(from, to, type.type, type.attrs).apply(); + }, + select: function select(pm) { + var node = pm.selection.node; -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + return !node || node.isTextblock; + }, + params: [{ label: "Type", type: "select", options: listTextblockTypes, "default": currentTextblockType, defaultLabel: "Type..." }], + display: "select", + menuGroup: "block", menuRank: 10 +}); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +_model.Paragraph.prototype.textblockTypes = [{ label: "Normal", rank: 10 }]; +_model.CodeBlock.prototype.textblockTypes = [{ label: "Code", rank: 20 }]; +_model.Heading.prototype.textblockTypes = [1, 2, 3, 4, 5, 6].map(function (n) { + return { label: "Head " + n, attrs: { level: n }, rank: 30 + n }; +}); -var _utils = require("../utils"); +function listTextblockTypes(pm) { + var cached = pm.schema.cached.textblockTypes; + if (cached) return cached; -var Choice = (function (_Paragraph) { - _inherits(Choice, _Paragraph); + var found = []; + for (var _name3 in pm.schema.nodes) { + var type = pm.schema.nodes[_name3]; + if (!type.textblockTypes) continue; + for (var i = 0; i < type.textblockTypes.length; i++) { + var info = type.textblockTypes[i]; + (0, _utilSortedinsert2["default"])(found, { label: info.label, value: { type: type, attrs: info.attrs }, rank: info.rank }, function (a, b) { + return a.rank - b.rank; + }); + } + } + return pm.schema.cached.textblockTypes = found; +} - function Choice() { - _classCallCheck(this, Choice); +function currentTextblockType(pm) { + var _pm$selection24 = pm.selection; + var from = _pm$selection24.from; + var to = _pm$selection24.to; + var node = _pm$selection24.node; - _get(Object.getPrototypeOf(Choice.prototype), "constructor", this).apply(this, arguments); + if (!node || node.isInline) { + if (!_model.Pos.samePath(from.path, to.path)) return null; + node = pm.doc.path(from.path); + } else if (!node.isTextblock) { + return null; + } + var types = listTextblockTypes(pm); + for (var i = 0; i < types.length; i++) { + var tp = types[i], + val = tp.value; + if (node.hasMarkup(val.type, val.attrs)) return tp; } +} - _createClass(Choice, [{ - key: "create", - value: function create(attrs, content, marks) { - if (attrs.value > 0) content = [this.schema.node("radiobutton", attrs)]; - return _get(Object.getPrototypeOf(Choice.prototype), "create", this).call(this, attrs, content, marks); - } - }], [{ - key: "kind", - get: function get() { - return "."; - } - }]); +function nodeAboveSelection(pm) { + var sel = pm.selection, + i = 0; + if (sel.node) return !!sel.from.depth && sel.from.shorten(); + for (; i < sel.head.depth && i < sel.anchor.depth; i++) if (sel.head.path[i] != sel.anchor.path[i]) break; + return i == 0 ? false : sel.head.shorten(i - 1); +} - return Choice; -})(_prosemirrorDistModel.Paragraph); +_options.defaultRegistry.register("command", { + name: "selectParentBlock", + label: "Select parent node", + run: function run(pm) { + var node = nodeAboveSelection(pm); + if (!node) return false; + pm.setNodeSelection(node); + }, + select: function select(pm) { + return nodeAboveSelection(pm); + }, + menuGroup: "block", menuRank: 90, + icon: { text: "⬚", style: "font-weight: bold; vertical-align: 20%" }, + key: "Esc" +}); -exports.Choice = Choice; +function moveSelectionBlock(pm, dir) { + var _pm$selection25 = pm.selection; + var from = _pm$selection25.from; + var to = _pm$selection25.to; + var node = _pm$selection25.node; -Choice.attributes = { - name: new _prosemirrorDistModel.Attribute(), - value: new _prosemirrorDistModel.Attribute() -}; + var side = dir > 0 ? to : from; + return (0, _selection.findSelectionFrom)(pm.doc, node && node.isBlock ? side : side.shorten(null, dir > 0 ? 1 : 0), dir); +} -var MultipleChoice = (function (_Block) { - _inherits(MultipleChoice, _Block); +function selectBlockHorizontally(pm, dir) { + var _pm$selection26 = pm.selection; + var empty = _pm$selection26.empty; + var node = _pm$selection26.node; + var from = _pm$selection26.from; + var to = _pm$selection26.to; - function MultipleChoice() { - _classCallCheck(this, MultipleChoice); + if (!empty && !node) return false; - _get(Object.getPrototypeOf(MultipleChoice.prototype), "constructor", this).apply(this, arguments); + if (node && node.isInline) { + pm.setTextSelection(dir > 0 ? to : from); + return true; } - _createClass(MultipleChoice, null, [{ - key: "contains", - get: function get() { - return "choice"; - } - }]); - - return MultipleChoice; -})(_prosemirrorDistModel.Block); - -exports.MultipleChoice = MultipleChoice; - -MultipleChoice.attributes = { - name: new _prosemirrorDistModel.Attribute() -}; + var parent = undefined; + if (!node && (parent = pm.doc.path(from.path)) && (dir > 0 ? from.offset < parent.size : from.offset)) { + var _ref = dir > 0 ? parent.chunkAfter(from.offset) : parent.chunkBefore(from.offset); -(0, _utils.defParser)(Choice, "p", "widgets-choice"); -(0, _utils.defParser)(MultipleChoice, "div", "widgets-multiplechoice"); + var nextNode = _ref.node; + var start = _ref.start; -Choice.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "p", { name: node.attrs.name, value: node.attrs.value, "class": "widgets-choice" }); -}; + if (nextNode.type.selectable && start == from.offset - (dir > 0 ? 0 : 1)) { + pm.setNodeSelection(dir < 0 ? from.move(-1) : from); + return true; + } + return false; + } -MultipleChoice.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "div", { name: node.attrs.name, "class": "widgets-multiplechoice" }); -}; + var next = moveSelectionBlock(pm, dir); + if (next && (next instanceof _selection.NodeSelection || node)) { + pm.setSelectionDirect(next); + return true; + } + return false; +} -Choice.register("command", { - name: "splitChoice", - label: "Split the current choice", +_options.defaultRegistry.register("command", { + name: "selectBlockLeft", + label: "Move the selection onto or out of the block to the left", run: function run(pm) { - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; - var to = _pm$selection.to; - - if (node && node.isBlock || from.path.length < 2 || !_prosemirrorDistModel.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - if (grandParent.type.name != "multiplechoice") return false; - return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.choice, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + var done = selectBlockHorizontally(pm, -1); + if (done) pm.scrollIntoView(); + return done; }, - key: "Enter(50)" + key: ["Left", "Mod-Left"] }); -Choice.register("command", { - name: "deleteChoice", - label: "delete this choice or multiplechoice", +_options.defaultRegistry.register("command", { + name: "selectBlockRight", + label: "Move the selection onto or out of the block to the right", run: function run(pm) { - var _pm$selection2 = pm.selection; - var head = _pm$selection2.head; - var empty = _pm$selection2.empty; - - if (!empty || head.offset > 1) return false; - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - }var mc = pm.doc.path(cut.path).child(cut.offset); - // if top choice, delete whole question if only one choice - if (mc.type.name == "choice") { - return pm.tr["delete"](cut, cut.move(1)).apply(); - } else { - // don't delete question if more than one choice - if (mc.size == 1) { - return pm.tr["delete"](cut, cut.move(1)).apply(); - } else return false; - } + var done = selectBlockHorizontally(pm, 1); + if (done) pm.scrollIntoView(); + return done; }, - key: ["Backspace(50)", "Mod-Backspace(50)"] + key: ["Right", "Mod-Right"] }); -MultipleChoice.register("command", { - name: "insertMultipleChoice", - label: "MultipleChoice", - run: function run(pm, name) { - var _pm$selection3 = pm.selection; - var from = _pm$selection3.from; - var to = _pm$selection3.to; - var head = _pm$selection3.head; +function selectBlockVertically(pm, dir) { + var _pm$selection27 = pm.selection; + var empty = _pm$selection27.empty; + var node = _pm$selection27.node; + var from = _pm$selection27.from; + var to = _pm$selection27.to; - var choice = pm.schema.node("choice", { name: name, value: 0 }); - var tr = pm.tr.replaceSelection(this.create({ name: name }, choice)).apply(_utils.andScroll); - //find path of next sibling - var len = from.path.length - 1; - var sib = from.path[len] + 1; - pm.setTextSelection(new _prosemirrorDistModel.Pos(from.path.splice(0, len).concat(sib), 0)); - return tr; - }, - select: function select(pm) { - console.log("select"); - return pm.doc.path(pm.selection.from.path).type.canContainType(this); - }, - params: [{ label: "Name", type: "text" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + if (!empty && !node) return false; - if (node) return [node.attrs.name]; + var leavingTextblock = true; + if (!node || node.isInline) leavingTextblock = (0, _selection.verticalMotionLeavesTextblock)(pm, dir > 0 ? to : from, dir); + + if (leavingTextblock) { + var next = moveSelectionBlock(pm, dir); + if (next && next instanceof _selection.NodeSelection) { + pm.setSelectionDirect(next); + if (!node) pm.sel.lastNonNodePos = from; + return true; + } + } + + if (!node) return false; + + if (node.isInline) { + (0, _selection.setDOMSelectionToPos)(pm, from); + return false; + } + + var last = pm.sel.lastNonNodePos; + var beyond = (0, _selection.findSelectionFrom)(pm.doc, dir < 0 ? from : to, dir); + if (last && beyond && _model.Pos.samePath(last.path, beyond.from.path)) { + (0, _selection.setDOMSelectionToPos)(pm, last); + return false; } + pm.setSelectionDirect(beyond); + return true; +} + +_options.defaultRegistry.register("command", { + name: "selectBlockUp", + label: "Move the selection onto or out of the block above", + run: function run(pm) { + var done = selectBlockVertically(pm, -1); + if (done !== false) pm.scrollIntoView(); + return done; + }, + key: "Up" +}); + +_options.defaultRegistry.register("command", { + name: "selectBlockDown", + label: "Move the selection onto or out of the block below", + run: function run(pm) { + var done = selectBlockVertically(pm, 1); + if (done !== false) pm.scrollIntoView(); + return done; + }, + key: "Down" }); -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-choice {}\n.widgets-multiplechoice {}\n\n"); +},{"../dom":1,"../model":27,"../transform":39,"../util/sortedinsert":51,"./char":3,"./keys":11,"./options":13,"./selection":15}],5:[function(require,module,exports){ +"use strict"; + +var _dom = require("../dom"); + +(0, _dom.insertCSS)("\n\n.ProseMirror {\n border: 1px solid silver;\n position: relative;\n}\n\n.ProseMirror-content {\n padding: 4px 8px 4px 14px;\n white-space: pre-wrap;\n line-height: 1.2;\n}\n\n.ProseMirror-drop-target {\n position: absolute;\n width: 1px;\n background: #666;\n display: none;\n}\n\n.ProseMirror-content ul.tight p, .ProseMirror-content ol.tight p {\n margin: 0;\n}\n\n.ProseMirror-content ul, .ProseMirror-content ol {\n padding-left: 30px;\n cursor: default;\n}\n\n.ProseMirror-content blockquote {\n padding-left: 1em;\n border-left: 3px solid #eee;\n margin-left: 0; margin-right: 0;\n}\n\n.ProseMirror-content pre {\n white-space: pre-wrap;\n}\n\n.ProseMirror-selectednode {\n outline: 2px solid #8cf;\n}\n\n.ProseMirror-content p:first-child,\n.ProseMirror-content h1:first-child,\n.ProseMirror-content h2:first-child,\n.ProseMirror-content h3:first-child,\n.ProseMirror-content h4:first-child,\n.ProseMirror-content h5:first-child,\n.ProseMirror-content h6:first-child {\n margin-top: .3em;\n}\n\n/* Add space around the hr to make clicking it easier */\n\n.ProseMirror-content hr {\n position: relative;\n height: 6px;\n border: none;\n}\n\n.ProseMirror-content hr:after {\n content: \"\";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 2px;\n border-top: 2px solid silver;\n}\n\n.ProseMirror-content img {\n cursor: default;\n}\n\n/* Make sure li selections wrap around markers */\n\n.ProseMirror-content li {\n position: relative;\n pointer-events: none; /* Don't do weird stuff with marker clicks */\n}\n.ProseMirror-content li > * {\n pointer-events: auto;\n}\n\nli.ProseMirror-selectednode {\n outline: none;\n}\n\nli.ProseMirror-selectednode:after {\n content: \"\";\n position: absolute;\n left: -32px;\n right: -2px; top: -2px; bottom: -2px;\n border: 2px solid #8cf;\n pointer-events: none;\n}\n\n"); -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],12:[function(require,module,exports){ +},{"../dom":1}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); +exports.applyDOMChange = applyDOMChange; +exports.textContext = textContext; +exports.textInContext = textInContext; -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; +var _model = require("../model"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _parseDom = require("../parse/dom"); -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 _transformTree = require("../transform/tree"); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +var _selection = require("./selection"); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +function isAtEnd(node, pos, depth) { + for (var i = depth || 0; i < pos.path.length; i++) { + var n = pos.path[depth]; + if (n < node.size - 1) return false; + node = node.child(n); + } + return pos.offset == node.size; +} +function isAtStart(pos, depth) { + if (pos.offset > 0) return false; + for (var i = depth || 0; i < pos.path.length; i++) { + if (pos.path[depth] > 0) return false; + }return true; +} -var _utils = require("../utils"); +function parseNearSelection(pm) { + var dom = pm.content, + node = pm.doc; + var _pm$selection = pm.selection; + var from = _pm$selection.from; + var to = _pm$selection.to; -var _input = require("./input"); + for (var depth = 0;; depth++) { + var toNode = node.child(to.path[depth]); + var fromStart = isAtStart(from, depth + 1); + var toEnd = isAtEnd(toNode, to, depth + 1); + if (fromStart || toEnd || from.path[depth] != to.path[depth] || toNode.isTextblock) { + var startOffset = depth == from.depth ? from.offset : from.path[depth]; + if (fromStart && startOffset > 0) startOffset--; + var endOffset = depth == to.depth ? to.offset : to.path[depth] + 1; + if (toEnd && endOffset < node.size - 1) endOffset++; + var parsed = (0, _parseDom.fromDOM)(pm.schema, dom, { topNode: node.copy(), + from: startOffset, + to: dom.childNodes.length - (node.size - endOffset) }); + parsed = parsed.copy(node.content.slice(0, startOffset).append(parsed.content).append(node.content.slice(endOffset))); + for (var i = depth - 1; i >= 0; i--) { + var wrap = pm.doc.path(from.path.slice(0, i)); + parsed = wrap.replace(from.path[i], parsed); + } + return parsed; + } + node = toNode; + dom = (0, _selection.findByPath)(dom, from.path[depth], false); + } +} -var RadioButton = (function (_Input) { - _inherits(RadioButton, _Input); +function applyDOMChange(pm) { + var updated = parseNearSelection(pm); + var changeStart = (0, _model.findDiffStart)(pm.doc.content, updated.content); + if (changeStart) { + var changeEnd = findDiffEndConstrained(pm.doc.content, updated.content, changeStart); + // Mark nodes touched by this change as 'to be redrawn' + pm.markRangeDirty(pm.doc.siblingRange(changeStart, changeEnd.a)); - function RadioButton() { - _classCallCheck(this, RadioButton); + pm.tr.replace(changeStart, changeEnd.a, updated, changeStart, changeEnd.b).apply(); + return true; + } else { + return false; + } +} - _get(Object.getPrototypeOf(RadioButton.prototype), "constructor", this).apply(this, arguments); - } +function offsetBy(first, second, pos) { + var same = (0, _transformTree.samePathDepth)(first, second); + var firstEnd = same == first.depth, + secondEnd = same == second.depth; + var off = (secondEnd ? second.offset : second.path[same]) - (firstEnd ? first.offset : first.path[same]); + var shorter = firstEnd ? pos.move(off) : pos.shorten(same, off); + if (secondEnd) return shorter;else return shorter.extend(new _model.Pos(second.path.slice(same), second.offset)); +} - return RadioButton; -})(_input.Input); +function findDiffEndConstrained(a, b, start) { + var end = (0, _model.findDiffEnd)(a, b); + if (!end) return end; + if (end.a.cmp(start) < 0) return { a: start, b: offsetBy(end.a, start, end.b) }; + if (end.b.cmp(start) < 0) return { a: offsetBy(end.b, start, end.a), b: start }; + return end; +} -exports.RadioButton = RadioButton; +// Text-only queries for composition events -RadioButton.attributes = { - name: new _prosemirrorDistModel.Attribute(), - type: new _prosemirrorDistModel.Attribute({ "default": "radio" }), - value: new _prosemirrorDistModel.Attribute(), - "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-radiobutton" }) -}; +function textContext(data) { + var range = getSelection().getRangeAt(0); + var start = range.startContainer, + end = range.endContainer; + if (start == end && start.nodeType == 3) { + var value = start.nodeValue, + lead = range.startOffset, + _end = range.endOffset; + if (data && _end >= data.length && value.slice(_end - data.length, _end) == data) lead = _end - data.length; + return { inside: start, lead: lead, trail: value.length - _end }; + } -(0, _utils.defParser)(RadioButton, "input", "widgets-radiobutton"); + var sizeBefore = null, + sizeAfter = null; + var before = start.childNodes[range.startOffset - 1] || nodeBefore(start); + while (before.lastChild) before = before.lastChild; + if (before && before.nodeType == 3) { + var value = before.nodeValue; + sizeBefore = value.length; + if (data && value.slice(value.length - data.length) == data) sizeBefore -= data.length; + } + var after = end.childNodes[range.endOffset] || nodeAfter(end); + while (after.firstChild) after = after.firstChild; + if (after && after.nodeType == 3) sizeAfter = after.nodeValue.length; -// inherits serializer from input + return { before: before, sizeBefore: sizeBefore, + after: after, sizeAfter: sizeAfter }; +} + +function textInContext(context, deflt) { + if (context.inside) { + var _val = context.inside.nodeValue; + return _val.slice(context.lead, _val.length - context.trail); + } else { + var before = context.before, + after = context.after, + val = ""; + if (!before) return deflt; + if (before.nodeType == 3) val = before.nodeValue.slice(context.sizeBefore); + var scan = scanText(before, after); + if (scan == null) return deflt; + val += scan; + if (after && after.nodeType == 3) { + var valAfter = after.nodeValue; + val += valAfter.slice(0, valAfter.length - context.sizeAfter); + } + return val; + } +} + +function nodeAfter(node) { + for (;;) { + var next = node.nextSibling; + if (next) { + while (next.firstChild) next = next.firstChild; + return next; + } + if (!(node = node.parentElement)) return null; + } +} + +function nodeBefore(node) { + for (;;) { + var prev = node.previousSibling; + if (prev) { + while (prev.lastChild) prev = prev.lastChild; + return prev; + } + if (!(node = node.parentElement)) return null; + } +} -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-radiobutton {}\n\n"); +function scanText(start, end) { + var text = "", + cur = nodeAfter(start); + for (;;) { + if (cur == end) return text; + if (!cur) return null; + if (cur.nodeType == 3) text += cur.nodeValue; + cur = cur.firstChild || nodeAfter(cur); + } +} -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],13:[function(require,module,exports){ +},{"../model":27,"../parse/dom":32,"../transform/tree":47,"./selection":15}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); +exports.draw = draw; +exports.redraw = redraw; -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; +var _model = require("../model"); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _serializeDom = require("../serialize/dom"); -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 _dom = require("../dom"); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +var _main = require("./main"); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +// FIXME clean up threading of path and offset, maybe remove from DOM renderer entirely -var _utils = require("../utils"); +function options(path, ranges) { + return { + onRender: function onRender(node, dom, offset) { + if (!node.isText && node.type.contains == null) { + dom.contentEditable = false; + if (node.isBlock) dom.setAttribute("pm-leaf", "true"); + } + if (node.isBlock && offset != null) dom.setAttribute("pm-offset", offset); + if (node.isTextblock) adjustTrailingHacks(dom, node); -var Scale = (function (_Block) { - _inherits(Scale, _Block); - - function Scale() { - _classCallCheck(this, Scale); + return dom; + }, + renderInlineFlat: function renderInlineFlat(node, dom, offset) { + ranges.advanceTo(new _model.Pos(path, offset)); + var end = new _model.Pos(path, offset + node.width); + var nextCut = ranges.nextChangeBefore(end); - _get(Object.getPrototypeOf(Scale.prototype), "constructor", this).apply(this, arguments); - } + var inner = dom, + wrapped = undefined; + for (var i = 0; i < node.marks.length; i++) { + inner = inner.firstChild; + }if (dom.nodeType != 1) { + dom = (0, _dom.elt)("span", null, dom); + if (!nextCut) wrapped = dom; + } + if (!wrapped && (nextCut || ranges.current.length)) { + wrapped = inner == dom ? dom = (0, _dom.elt)("span", null, inner) : inner.parentNode.appendChild((0, _dom.elt)("span", null, inner)); + } - return Scale; -})(_prosemirrorDistModel.Block); + dom.setAttribute("pm-offset", offset); + if (node.type.contains == null) dom.setAttribute("pm-leaf", node.isText ? node.width : "true"); -exports.Scale = Scale; + var inlineOffset = 0; + while (nextCut) { + var size = nextCut - offset; + var split = splitSpan(wrapped, size); + if (ranges.current.length) split.className = ranges.current.join(" "); + split.setAttribute("pm-inner-offset", inlineOffset); + inlineOffset += size; + offset += size; + ranges.advanceTo(new _model.Pos(path, offset)); + if (!(nextCut = ranges.nextChangeBefore(end))) wrapped.setAttribute("pm-inner-offset", inlineOffset); + } -Scale.attributes = { - name: new _prosemirrorDistModel.Attribute(), - startvalue: new _prosemirrorDistModel.Attribute({ "default": "1" }), - startlabel: new _prosemirrorDistModel.Attribute({ "default": "low" }), - endvalue: new _prosemirrorDistModel.Attribute({ "default": "10" }), - endlabel: new _prosemirrorDistModel.Attribute({ "default": "high" }) -}; + if (ranges.current.length) wrapped.className = ranges.current.join(" "); + return dom; + }, + document: document, path: path + }; +} -(0, _utils.defParser)(Scale, "div", "scale"); +function splitSpan(span, at) { + var textNode = span.firstChild, + text = textNode.nodeValue; + var newNode = span.parentNode.insertBefore((0, _dom.elt)("span", null, text.slice(0, at)), span); + textNode.nodeValue = text.slice(at); + return newNode; +} -Scale.prototype.serializeDOM = function (node) { - var dom = (0, _prosemirrorDistDom.elt)("div", { "class": "widgets-scale" }); - dom.appendChild((0, _prosemirrorDistDom.elt)("span", null, node.attrs.startlabel + " ")); - var startVal = Number(node.attrs.startvalue); - var endVal = Number(node.attrs.endvalue); - if (startVal < endVal) for (var i = startVal; i <= endVal; i++) { - dom.appendChild((0, _prosemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _prosemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); - } else for (var i = startVal; i >= endVal; i--) { - dom.appendChild((0, _prosemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _prosemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); - } - dom.appendChild((0, _prosemirrorDistDom.elt)("span", null, " " + node.attrs.endlabel)); - return dom; -}; +function draw(pm, doc) { + pm.content.textContent = ""; + pm.content.appendChild((0, _serializeDom.toDOM)(doc, options([], pm.ranges.activeRangeTracker()))); +} -Scale.register("command", { - name: "insertScale", - label: "Scale", - run: function run(pm, name, startvalue, startlabel, endvalue, endlabel) { - return pm.tr.replaceSelection(this.create({ name: name, startvalue: startvalue, startlabel: startlabel, endvalue: endvalue, endlabel: endlabel })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Start value", type: "text", "default": 1 }, { label: "Start label", type: "text", "default": "min" }, { label: "End value", type: "text", "default": 10 }, { label: "End label", type: "text", "default": "max" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; +function adjustTrailingHacks(dom, node) { + var needs = node.size == 0 || node.lastChild.type.isBR ? "br" : !node.lastChild.isText && node.lastChild.type.contains == null ? "text" : null; + var last = dom.lastChild; + var has = !last || last.nodeType != 1 || !last.hasAttribute("pm-ignore") ? null : last.nodeName == "BR" ? "br" : "text"; + if (needs != has) { + if (has) dom.removeChild(last); + if (needs) dom.appendChild(needs == "br" ? (0, _dom.elt)("br", { "pm-ignore": "trailing-break" }) : (0, _dom.elt)("span", { "pm-ignore": "cursor-text" }, "")); + } +} - if (node) return [node.attrs.name, node.attrs.startvalue, node.attrs.startlabel, node.attrs.endvalue, node.attrs.endlabel]; - } -}); +function findNodeIn(iter, node) { + var copy = iter.copy(); + for (var child = undefined; child = copy.next().value;) { + if (child == node) return child; + } +} -(0, _utils.defParamsClick)(Scale); +function movePast(dom) { + var next = dom.nextSibling; + dom.parentNode.removeChild(dom); + return next; +} -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-scaleitem {}\t\t\n.widgets-scale {}\n\n"); +function redraw(pm, dirty, doc, prev) { + var opts = options([], pm.ranges.activeRangeTracker()); -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],14:[function(require,module,exports){ -"use strict"; + function scan(dom, node, prev) { + var iNode = node.iter(), + iPrev = prev.iter(), + pChild = iPrev.next().value; + var domPos = dom.firstChild; -Object.defineProperty(exports, "__esModule", { - value: true -}); + for (var child = undefined; child = iNode.next().value;) { + var offset = iNode.offset - child.width, + matching = undefined, + reuseDOM = undefined; + if (!node.isTextblock) opts.path.push(offset); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + if (pChild == child) { + matching = pChild; + } else if (matching = findNodeIn(iPrev, child)) { + while (pChild != matching) { + pChild = iPrev.next().value; + domPos = movePast(domPos); + } + } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + if (matching && !dirty.get(matching)) { + reuseDOM = true; + } else if (pChild && !child.isText && child.sameMarkup(pChild) && dirty.get(pChild) != _main.DIRTY_REDRAW) { + reuseDOM = true; + var contentNode = domPos; + for (;;) { + var first = contentNode.firstChild; + if (!first || !first.hasAttribute || first.hasAttribute("pm-ignore") || first.hasAttribute("pm-offset")) break; + contentNode = first; + } + scan(contentNode, child, pChild); + } else { + var rendered = (0, _serializeDom.renderNodeToDOM)(child, opts, offset); + dom.insertBefore(rendered, domPos); + reuseDOM = false; + } -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; } + if (reuseDOM) { + domPos.setAttribute("pm-offset", offset); + domPos = domPos.nextSibling; + pChild = iPrev.next().value; + } + if (!node.isTextblock) opts.path.pop(); + } -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + while (pChild) { + domPos = movePast(domPos); + pChild = iPrev.next().value; + } + if (node.isTextblock) adjustTrailingHacks(dom, node); + } + scan(pm.content, doc, prev); +} -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +},{"../dom":1,"../model":27,"../serialize/dom":35,"./main":12}],8:[function(require,module,exports){ +"use strict"; -var _utils = require("../utils"); +Object.defineProperty(exports, "__esModule", { + value: true +}); -var Select = (function (_Inline) { - _inherits(Select, _Inline); +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; + }; +})(); - function Select() { - _classCallCheck(this, Select); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} - _get(Object.getPrototypeOf(Select.prototype), "constructor", this).apply(this, arguments); - } +var _model = require("../model"); - return Select; -})(_prosemirrorDistModel.Inline); +var _transform = require("../transform"); -exports.Select = Select; +var InvertedStep = function InvertedStep(step, version, id) { + _classCallCheck(this, InvertedStep); -Select.attributes = { - name: new _prosemirrorDistModel.Attribute(), - options: new _prosemirrorDistModel.Attribute(), - multiple: new _prosemirrorDistModel.Attribute({ "default": "single" }) + this.step = step; + this.version = version; + this.id = id; }; -(0, _utils.defParser)(Select, "select", "widgets-select"); +var BranchRemapping = (function () { + function BranchRemapping(branch) { + _classCallCheck(this, BranchRemapping); -Select.prototype.serializeDOM = function (node) { - var selection = node.attrs.multiple == "multiple"; - var select = (0, _prosemirrorDistDom.elt)("select", { name: node.attrs.name, "class": "widgets-select", size: 1, multiple: selection }); - node.attrs.options.split(",").map(function (option) { - select.appendChild((0, _prosemirrorDistDom.elt)("option", { value: option.trim() }, option)); - }); - return select; -}; + this.branch = branch; + this.remap = new _transform.Remapping(); + this.version = branch.version; + this.mirrorBuffer = Object.create(null); + } -Select.register("command", { - name: "insertSelect", - label: "Select", - run: function run(pm, name, options, multiple) { - return pm.tr.replaceSelection(this.create({ name: name, options: options, multiple: multiple })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Options (comma separated)", type: "text" }, { label: "Selection (single or multiple)", type: "select", options: [{ value: "multiple", label: "multiple" }, { value: "single", label: "single" }] }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + _createClass(BranchRemapping, [{ + key: "moveToVersion", + value: function moveToVersion(version) { + while (this.version > version) this.addNextMap(); + } + }, { + key: "addNextMap", + value: function addNextMap() { + var found = this.branch.mirror[this.version]; + var mapOffset = this.branch.maps.length - (this.branch.version - this.version) - 1; + var id = this.remap.addToFront(this.branch.maps[mapOffset], this.mirrorBuffer[this.version]); + --this.version; + if (found != null) this.mirrorBuffer[found] = id; + return id; + } + }, { + key: "movePastStep", + value: function movePastStep(result) { + var id = this.addNextMap(); + if (result) this.remap.addToBack(result.map, id); + } + }]); - if (node) { - return [node.attrs.name, node.attrs.options, node.attrs.multiple]; - } - } -}); + return BranchRemapping; +})(); -(0, _utils.defParamsClick)(Select); +var workTime = 100, + pauseTime = 150; -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-select {}\n\n"); +var CompressionWorker = (function () { + function CompressionWorker(doc, branch, callback) { + _classCallCheck(this, CompressionWorker); -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],15:[function(require,module,exports){ -"use strict"; + this.branch = branch; + this.callback = callback; + this.remap = new BranchRemapping(branch); -Object.defineProperty(exports, "__esModule", { - value: true -}); + this.doc = doc; + this.events = []; + this.maps = []; + this.version = this.startVersion = branch.version; -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + this.i = branch.events.length; + this.timeout = null; + this.aborted = false; + } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + _createClass(CompressionWorker, [{ + key: "work", + value: function work() { + var _this = this; -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; } + if (this.aborted) return; -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + var endTime = Date.now() + workTime; -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + for (;;) { + if (this.i == 0) return this.finish(); + var _event = this.branch.events[--this.i], + outEvent = []; + for (var j = _event.length - 1; j >= 0; j--) { + var _event$j = _event[j]; + var step = _event$j.step; + var stepVersion = _event$j.version; + var stepID = _event$j.id; -var _utils = require("../utils"); + this.remap.moveToVersion(stepVersion); -var SpreadSheet = (function (_Block) { - _inherits(SpreadSheet, _Block); + var mappedStep = step.map(this.remap.remap); + if (mappedStep && isDelStep(step)) { + var extra = 0, + start = step.from; + while (j > 0) { + var next = _event[j - 1]; + if (next.version != stepVersion - 1 || !isDelStep(next.step) || start.cmp(next.step.to)) break; + extra += next.step.to.offset - next.step.from.offset; + start = next.step.from; + stepVersion--; + j--; + this.remap.addNextMap(); + } + if (extra > 0) { + var _start = mappedStep.from.move(-extra); + mappedStep = new _transform.Step("replace", _start, mappedStep.to, _start); + } + } + var result = mappedStep && mappedStep.apply(this.doc); + if (result) { + this.doc = result.doc; + this.maps.push(result.map.invert()); + outEvent.push(new InvertedStep(mappedStep, this.version, stepID)); + this.version--; + } + this.remap.movePastStep(result); + } + if (outEvent.length) { + outEvent.reverse(); + this.events.push(outEvent); + } + if (Date.now() > endTime) { + this.timeout = window.setTimeout(function () { + return _this.work(); + }, pauseTime); + return; + } + } + } + }, { + key: "finish", + value: function finish() { + if (this.aborted) return; - function SpreadSheet() { - _classCallCheck(this, SpreadSheet); + this.events.reverse(); + this.maps.reverse(); + this.callback(this.maps.concat(this.branch.maps.slice(this.branch.maps.length - (this.branch.version - this.startVersion))), this.events); + } + }, { + key: "abort", + value: function abort() { + this.aborted = true; + window.clearTimeout(this.timeout); + } + }]); - _get(Object.getPrototypeOf(SpreadSheet.prototype), "constructor", this).apply(this, arguments); - } + return CompressionWorker; +})(); - return SpreadSheet; -})(_prosemirrorDistModel.Block); +function isDelStep(step) { + return step.type == "replace" && step.from.offset < step.to.offset && _model.Pos.samePath(step.from.path, step.to.path) && (!step.param || step.param.content.size == 0); +} -exports.SpreadSheet = SpreadSheet; +var compressStepCount = 150; -SpreadSheet.attributes = { - data: new _prosemirrorDistModel.Attribute({ "default": "" }) -}; +var Branch = (function () { + function Branch(maxDepth) { + _classCallCheck(this, Branch); -(0, _utils.defParser)(SpreadSheet, "div", "widgets-spreadsheet"); + this.maxDepth = maxDepth; + this.version = 0; + this.nextStepID = 1; -SpreadSheet.prototype.serializeDOM = function (node) { - if (node.rendered) { - node.rendered = node.rendered.cloneNode(true); - } else { - node.rendered = (0, _prosemirrorDistDom.elt)("div", { - id: "spreadsheet", - "class": "widgets-spreadsheet" - }); - // wait until node is attached to document to render - window.setTimeout(function () { - var data = [["", "Ford", "Volvo", "Toyota", "Honda"], ["2014", 10, 11, 12, 13], ["2015", 20, 11, 14, 13], ["2016", 30, 15, 12, 13]]; + this.maps = []; + this.mirror = Object.create(null); + this.events = []; - var container = document.getElementById('spreadsheet'); - var hot = new Handsontable(container, { - data: data, - minSpareRows: 1, - rowHeaders: true, - colHeaders: true, - contextMenu: true - }); - }, 100); - } - return node.rendered; -}; + this.stepsSinceCompress = 0; + this.compressing = null; + this.compressTimeout = null; + } -SpreadSheet.register("command", { - name: "insertSpreadSheet", - label: "SpreadSheet", - run: function run(pm, data) { - return pm.tr.replaceSelection(this.create({ data: data })).apply(_utils.andScroll); - }, - params: [{ label: "Link to data csv (fixed for demo)", type: "text", "default": "cars.csv" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + _createClass(Branch, [{ + key: "clear", + value: function clear(force) { + if (force || !this.empty()) { + this.maps.length = this.events.length = this.stepsSinceCompress = 0; + this.mirror = Object.create(null); + this.abortCompression(); + } + } + }, { + key: "newEvent", + value: function newEvent() { + this.abortCompression(); + this.events.push([]); + while (this.events.length > this.maxDepth) this.events.shift(); + } + }, { + key: "addMap", + value: function addMap(map) { + if (!this.empty()) { + this.maps.push(map); + this.version++; + this.stepsSinceCompress++; + return true; + } + } + }, { + key: "empty", + value: function empty() { + return this.events.length == 0; + } + }, { + key: "addStep", + value: function addStep(step, map, id) { + this.addMap(map); + if (id == null) id = this.nextStepID++; + this.events[this.events.length - 1].push(new InvertedStep(step, this.version, id)); + } + }, { + key: "addTransform", + value: function addTransform(transform, ids) { + this.abortCompression(); + for (var i = 0; i < transform.steps.length; i++) { + var inverted = transform.steps[i].invert(transform.docs[i], transform.maps[i]); + this.addStep(inverted, transform.maps[i], ids && ids[i]); + } + } + }, { + key: "popEvent", + value: function popEvent(doc, allowCollapsing) { + this.abortCompression(); + var event = this.events.pop(); + if (!event) return null; - if (node) return [node.attrs.data]; - } -}); + var remap = new BranchRemapping(this), + collapsing = allowCollapsing; + var tr = new _transform.Transform(doc); + var ids = []; -(0, _utils.defParamsClick)(SpreadSheet); + for (var i = event.length - 1; i >= 0; i--) { + var invertedStep = event[i], + step = invertedStep.step; + if (!collapsing || invertedStep.version != remap.version) { + collapsing = false; + remap.moveToVersion(invertedStep.version); -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-spreadsheet {}\n\n"); + step = step.map(remap.remap); + var result = step && tr.step(step); + if (result) { + ids.push(invertedStep.id); + if (this.addMap(result.map)) this.mirror[this.version] = invertedStep.version; + } -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],16:[function(require,module,exports){ -"use strict"; + if (i > 0) remap.movePastStep(result); + } else { + this.version--; + delete this.mirror[this.version]; + this.maps.pop(); + tr.step(step); + ids.push(invertedStep.id); + --remap.version; + } + } + if (this.empty()) this.clear(true); + return { transform: tr, ids: ids }; + } + }, { + key: "getVersion", + value: function getVersion() { + return { id: this.nextStepID, version: this.version }; + } + }, { + key: "findVersion", + value: function findVersion(version) { + for (var i = this.events.length - 1; i >= 0; i--) { + var _event2 = this.events[i]; + for (var j = _event2.length - 1; j >= 0; j--) { + var step = _event2[j]; + if (step.id == version.id) return { event: i, step: j };else if (step.id < version.id) return { event: i, step: j + 1 }; + } + } + } + }, { + key: "rebased", + value: function rebased(newMaps, rebasedTransform, positions) { + if (this.empty()) return; + this.abortCompression(); -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + var startVersion = this.version - positions.length; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + // Update and clean up the events + out: for (var i = this.events.length - 1; i >= 0; i--) { + var _event3 = this.events[i]; + for (var j = _event3.length - 1; j >= 0; j--) { + var step = _event3[j]; + if (step.version <= startVersion) break out; + var off = positions[step.version - startVersion - 1]; + if (off == -1) { + _event3.splice(j--, 1); + } else { + var inv = rebasedTransform.steps[off].invert(rebasedTransform.docs[off], rebasedTransform.maps[off]); + _event3[j] = new InvertedStep(inv, startVersion + newMaps.length + off + 1, step.id); + } + } + } -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; } + // Sync the array of maps + if (this.maps.length > positions.length) this.maps = this.maps.slice(0, this.maps.length - positions.length).concat(newMaps).concat(rebasedTransform.maps);else this.maps = rebasedTransform.maps.slice(); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + this.version = startVersion + newMaps.length + rebasedTransform.maps.length; -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + this.stepsSinceCompress += newMaps.length + rebasedTransform.steps.length - positions.length; + } + }, { + key: "abortCompression", + value: function abortCompression() { + if (this.compressing) { + this.compressing.abort(); + this.compressing = null; + } + } + }, { + key: "needsCompression", + value: function needsCompression() { + return this.stepsSinceCompress > compressStepCount && !this.compressing; + } + }, { + key: "startCompression", + value: function startCompression(doc) { + var _this2 = this; -var _utils = require("../utils"); + this.compressing = new CompressionWorker(doc, this, function (maps, events) { + _this2.maps = maps; + _this2.events = events; + _this2.mirror = Object.create(null); + _this2.compressing = null; + _this2.stepsSinceCompress = 0; + }); + this.compressing.work(); + } + }]); -var TextArea = (function (_Block) { - _inherits(TextArea, _Block); + return Branch; +})(); - function TextArea() { - _classCallCheck(this, TextArea); +var compressDelay = 750; - _get(Object.getPrototypeOf(TextArea.prototype), "constructor", this).apply(this, arguments); - } +var History = (function () { + function History(pm) { + var _this3 = this; - return TextArea; -})(_prosemirrorDistModel.Block); + _classCallCheck(this, History); -exports.TextArea = TextArea; + this.pm = pm; -TextArea.attributes = { - name: new _prosemirrorDistModel.Attribute(), - rows: new _prosemirrorDistModel.Attribute(), - cols: new _prosemirrorDistModel.Attribute(), - "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-textarea" }) -}; + this.done = new Branch(pm.options.historyDepth); + this.undone = new Branch(pm.options.historyDepth); -(0, _utils.defParser)(TextArea, "input", "widgets-textarea"); + this.lastAddedAt = 0; + this.ignoreTransform = false; -TextArea.prototype.serializeDOM = function (node, s) { - return s.renderAs(node, "textarea", node.attrs); -}; + this.allowCollapsing = true; -TextArea.register("command", { - name: "insertTextArea", - label: "TextArea", - run: function run(pm, name, rows, cols) { - return pm.tr.replaceSelection(this.create({ name: name, rows: rows, cols: cols })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Rows", type: "text", "default": "4" }, { label: "Columns", type: "text", "default": "20" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + pm.on("transform", function (transform, options) { + return _this3.recordTransform(transform, options); + }); + } - if (node) return [node.attrs.name, node.attrs.rows, node.attrs.cols]; - } -}); + _createClass(History, [{ + key: "recordTransform", + value: function recordTransform(transform, options) { + if (this.ignoreTransform) return; -(0, _utils.defParamsClick)(TextArea); + if (options.addToHistory == false) { + for (var i = 0; i < transform.maps.length; i++) { + var map = transform.maps[i]; + this.done.addMap(map); + this.undone.addMap(map); + } + } else { + this.undone.clear(); + var now = Date.now(); + if (now > this.lastAddedAt + this.pm.options.historyEventDelay) this.done.newEvent(); -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-textarea {}\n\n"); + this.done.addTransform(transform); + this.lastAddedAt = now; + } + this.maybeScheduleCompression(); + } + }, { + key: "undo", + value: function undo() { + return this.shift(this.done, this.undone); + } + }, { + key: "redo", + value: function redo() { + return this.shift(this.undone, this.done); + } + }, { + key: "canUndo", + value: function canUndo() { + return this.done.events.length > 0; + } + }, { + key: "canRedo", + value: function canRedo() { + return this.undone.events.length > 0; + } + }, { + key: "shift", + value: function shift(from, to) { + var event = from.popEvent(this.pm.doc, this.allowCollapsing); + if (!event) return false; + var transform = event.transform; + var ids = event.ids; -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2}],17:[function(require,module,exports){ -"use strict"; + this.ignoreTransform = true; + this.pm.apply(transform); + this.ignoreTransform = false; -Object.defineProperty(exports, "__esModule", { - value: true -}); + if (!transform.steps.length) return this.shift(from, to); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + if (to) { + to.newEvent(); + to.addTransform(transform, ids); + } + this.lastAddedAt = 0; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + return true; + } + }, { + key: "getVersion", + value: function getVersion() { + return this.done.getVersion(); + } + }, { + key: "backToVersion", + value: function backToVersion(version) { + var found = this.done.findVersion(version); + if (!found) return false; + var event = this.done.events[found.event]; + var combined = this.done.events.slice(found.event + 1).reduce(function (comb, arr) { + return comb.concat(arr); + }, event.slice(found.step)); + this.done.events.length = found.event + ((event.length = found.step) ? 1 : 0); + this.done.events.push(combined); -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; } + this.shift(this.done); + } + }, { + key: "rebased", + value: function rebased(newMaps, rebasedTransform, positions) { + this.done.rebased(newMaps, rebasedTransform, positions); + this.undone.rebased(newMaps, rebasedTransform, positions); + this.maybeScheduleCompression(); + } + }, { + key: "maybeScheduleCompression", + value: function maybeScheduleCompression() { + this.maybeScheduleCompressionForBranch(this.done); + this.maybeScheduleCompressionForBranch(this.undone); + } + }, { + key: "maybeScheduleCompressionForBranch", + value: function maybeScheduleCompressionForBranch(branch) { + var _this4 = this; -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); + window.clearTimeout(branch.compressTimeout); + if (branch.needsCompression()) branch.compressTimeout = window.setTimeout(function () { + if (branch.needsCompression()) branch.startCompression(_this4.pm.doc); + }, compressDelay); + } + }]); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); + return History; +})(); -var _input = require("./input"); +exports.History = History; -var _utils = require("../utils"); +},{"../model":27,"../transform":39}],9:[function(require,module,exports){ +// !! This module implements the ProseMirror editor. It contains +// functionality related to editing, selection, and integration with +// the browser. `ProseMirror` is the class you'll want to instantiate +// and interact with when using the editor. -var TextField = (function (_Input) { - _inherits(TextField, _Input); +"use strict"; - function TextField() { - _classCallCheck(this, TextField); +Object.defineProperty(exports, "__esModule", { + value: true +}); - _get(Object.getPrototypeOf(TextField.prototype), "constructor", this).apply(this, arguments); - } +var _main = require("./main"); - return TextField; -})(_input.Input); +Object.defineProperty(exports, "ProseMirror", { + enumerable: true, + get: function get() { + return _main.ProseMirror; + } +}); -exports.TextField = TextField; +var _options = require("./options"); -TextField.attributes = { - name: new _prosemirrorDistModel.Attribute(), - type: new _prosemirrorDistModel.Attribute({ "default": "text" }), - size: new _prosemirrorDistModel.Attribute({ "default": "20" }), - "class": new _prosemirrorDistModel.Attribute({ "default": "widgets-textfield" }) -}; +Object.defineProperty(exports, "defineOption", { + enumerable: true, + get: function get() { + return _options.defineOption; + } +}); +Object.defineProperty(exports, "Registry", { + enumerable: true, + get: function get() { + return _options.Registry; + } +}); +Object.defineProperty(exports, "defaultRegistry", { + enumerable: true, + get: function get() { + return _options.defaultRegistry; + } +}); -(0, _utils.defParser)(TextField, "input", "widgets-textfield"); +var _selection = require("./selection"); -// serializer inherits from input - -TextField.register("command", { - name: "insertTextField", - label: "TextField", - run: function run(pm, name, size) { - return pm.tr.replaceSelection(this.create({ name: name, size: size })).apply(_utils.andScroll); - }, - params: [{ label: "Name", type: "text" }, { label: "Size", type: "text", "default": "20" }], - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; - - if (node) return [node.attrs.name, node.attrs.size]; - } +Object.defineProperty(exports, "Range", { + enumerable: true, + get: function get() { + return _selection.Range; + } }); -(0, _utils.defParamsClick)(TextField); - -(0, _prosemirrorDistDom.insertCSS)("\n\n.widgets-textfield {}\n\n"); - -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/model":45,"../utils":2,"./input":10}],18:[function(require,module,exports){ -"use strict"; +var _keys = require("./keys"); -Object.defineProperty(exports, "__esModule", { - value: true +Object.defineProperty(exports, "Keymap", { + enumerable: true, + get: function get() { + return _keys.Keymap; + } +}); +Object.defineProperty(exports, "keyName", { + enumerable: true, + get: function get() { + return _keys.keyName; + } +}); +Object.defineProperty(exports, "keyNames", { + enumerable: true, + get: function get() { + return _keys.keyNames; + } }); -var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -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 _range = require("./range"); -var _prosemirrorDistMenuMenu = require("../../../prosemirror/dist/menu/menu"); +Object.defineProperty(exports, "MarkedRange", { + enumerable: true, + get: function get() { + return _range.MarkedRange; + } +}); -var _prosemirrorDistModel = require("../../../prosemirror/dist/model"); +var _commands = require("./commands"); -var _prosemirrorDistDom = require("../../../prosemirror/dist/dom"); +Object.defineProperty(exports, "defineCommand", { + enumerable: true, + get: function get() { + return _commands.defineCommand; + } +}); +Object.defineProperty(exports, "defineParamHandler", { + enumerable: true, + get: function get() { + return _commands.defineParamHandler; + } +}); +Object.defineProperty(exports, "Command", { + enumerable: true, + get: function get() { + return _commands.Command; + } +}); -var widgets = ["Image", "TextField", "TextArea", "CheckBox", "Select", "IFrame", "InlineMath", "BlockMath", "SpreadSheet", "MultipleChoice", "Scale", "CheckList"]; +},{"./commands":4,"./keys":11,"./main":12,"./options":13,"./range":14,"./selection":15}],10:[function(require,module,exports){ +"use strict"; -var insertWidget = widgets.map(function (w) { - return { - value: "insert" + w, - display: function display() { - return (0, _prosemirrorDistDom.elt)("span", null, w); - } - }; +Object.defineProperty(exports, "__esModule", { + value: true }); -var Widget = (function (_Textblock) { - _inherits(Widget, _Textblock); +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; + }; +})(); - function Widget() { - _classCallCheck(this, Widget); +exports.dispatchKey = dispatchKey; - _get(Object.getPrototypeOf(Widget.prototype), "constructor", this).apply(this, arguments); - } +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} - return Widget; -})(_prosemirrorDistModel.Textblock); +var _model = require("../model"); -exports.Widget = Widget; +var _parseDom = require("../parse/dom"); -Widget.register("command", { - name: "insertWidget", - label: "Insert...", - select: function select(pm) { - return true; - }, - params: [{ name: "Widget type", type: "select", options: insertWidget, defaultLabel: "Insert..." }], - run: function run(pm, type) { - var menu = pm.mod.menuBar.menu; - var cmd = pm.commands[type]; - if (menu && cmd) menu.enter((0, _prosemirrorDistMenuMenu.readParams)(cmd)); - }, - display: "select", - menuGroup: "block", - menuRank: 99 -}); +var _parseText = require("../parse/text"); -},{"../../../prosemirror/dist/dom":19,"../../../prosemirror/dist/menu/menu":37,"../../../prosemirror/dist/model":45}],19:[function(require,module,exports){ -"use strict"; +var _dom = require("../dom"); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.elt = elt; -exports.requestAnimationFrame = requestAnimationFrame; -exports.rmClass = rmClass; -exports.addClass = addClass; -exports.contains = contains; -exports.insertCSS = insertCSS; +var _serializeDom = require("../serialize/dom"); -function elt(tag, attrs) { - var result = document.createElement(tag); - if (attrs) for (var _name in attrs) { - if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name] != null) result.setAttribute(_name, attrs[_name]); - } +var _serializeText = require("../serialize/text"); - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } +var _parse = require("../parse"); - for (var i = 0; i < args.length; i++) { - add(args[i], result); - }return result; -} +var _keys = require("./keys"); -function add(value, target) { - if (typeof value == "string") value = document.createTextNode(value); - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - add(value[i], target); - } - } else { - target.appendChild(value); - } -} +var _capturekeys = require("./capturekeys"); -var reqFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; +var _domchange = require("./domchange"); -function requestAnimationFrame(f) { - if (reqFrame) reqFrame(f);else setTimeout(f, 10); -} +var _selection = require("./selection"); -var ie_upto10 = /MSIE \d/.test(navigator.userAgent); -var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); +var stopSeq = null; -var browser = { - mac: /Mac/.test(navigator.platform), - ie_upto10: ie_upto10, - ie_11up: ie_11up, - ie: ie_upto10 || ie_11up, - gecko: /gecko\/\d/i.test(navigator.userAgent) -}; +/** + * A collection of DOM events that occur within the editor, and callback functions + * to invoke when the event fires. + */ +var handlers = {}; -exports.browser = browser; -function classTest(cls) { - return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); -} +var Input = (function () { + function Input(pm) { + var _this = this; -function rmClass(node, cls) { - var current = node.className; - var match = classTest(cls).exec(current); - if (match) { - var after = current.slice(match.index + match[0].length); - node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); - } -} + _classCallCheck(this, Input); -function addClass(node, cls) { - var current = node.className; - if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls; -} + this.pm = pm; -function contains(parent, child) { - // Android browser and IE will return false if child is a text node. - if (child.nodeType != 1) child = child.parentNode; - return child && parent.contains(child); -} + this.keySeq = null; -function insertCSS(css) { - var style = document.createElement("style"); - style.textContent = css; - document.head.insertBefore(style, document.head.firstChild); -} + // When the user is creating a composed character, + // this is set to a Composing instance. + this.composing = null; + this.shiftKey = this.updatingComposition = false; + this.skipInput = 0; -},{}],20:[function(require,module,exports){ -"use strict"; + this.draggingFrom = false; -Object.defineProperty(exports, "__esModule", { - value: true -}); + this.keymaps = []; + this.defaultKeymap = null; -var _selection = require("./selection"); + this.storedMarks = null; -var _dom = require("../dom"); + this.dropTarget = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": "ProseMirror-drop-target" })); -var _keys = require("./keys"); + var _loop = function _loop(_event) { + var handler = handlers[_event]; + pm.content.addEventListener(_event, function (e) { + return handler(pm, e); + }); + }; -function nothing() {} + for (var _event in handlers) { + _loop(_event); + } -function ensureSelection(pm) { - if (pm.selection.node) { - var found = (0, _selection.findSelectionNear)(pm.doc, pm.selection.from, 1, true); - if (found) (0, _selection.setDOMSelectionToPos)(pm, found.head); + pm.on("selectionChange", function () { + return _this.storedMarks = null; + }); } - return false; -} - -// A backdrop keymap used to make sure we always suppress keys that -// have a dangerous default effect, even if the commands they are -// bound to return false, and to make sure that cursor-motion keys -// find a cursor (as opposed to a node selection) when pressed. -var keys = { - "Esc": nothing, - "Enter": nothing, - "Mod-Enter": nothing, - "Shift-Enter": nothing, - "Backspace": nothing, - "Delete": nothing, - "Mod-B": nothing, - "Mod-I": nothing, - "Mod-Backspace": nothing, - "Mod-Delete": nothing, - "Shift-Backspace": nothing, - "Shift-Delete": nothing, - "Shift-Mod-Backspace": nothing, - "Shift-Mod-Delete": nothing, - "Mod-Z": nothing, - "Mod-Y": nothing, - "Shift-Mod-Z": nothing, - "Ctrl-D": nothing, - "Ctrl-H": nothing, - "Ctrl-Alt-Backspace": nothing, - "Alt-D": nothing, - "Alt-Delete": nothing, - "Alt-Backspace": nothing, - - "Mod-A": ensureSelection -};["Left", "Right", "Up", "Down", "Home", "End", "PageUp", "PageDown"].forEach(function (key) { - keys[key] = keys["Shift-" + key] = keys["Mod-" + key] = keys["Shift-Mod-" + key] = keys["Alt-" + key] = keys["Shift-Alt-" + key] = ensureSelection; -});["Left", "Mod-Left", "Right", "Mod-Right", "Up", "Down"].forEach(function (key) { - return delete keys[key]; -}); - -if (_dom.browser.mac) keys["Ctrl-F"] = keys["Ctrl-B"] = keys["Ctrl-P"] = keys["Ctrl-N"] = keys["Alt-F"] = keys["Alt-B"] = keys["Ctrl-A"] = keys["Ctrl-E"] = keys["Ctrl-V"] = keys["goPageUp"] = ensureSelection; - -var captureKeys = new _keys.Keymap(keys); -exports.captureKeys = captureKeys; - -},{"../dom":19,"./keys":29,"./selection":33}],21:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isWordChar = isWordChar; -exports.charCategory = charCategory; -exports.isExtendingChar = isExtendingChar; -var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - -// Extending unicode characters. A series of a non-extending char + -// any number of extending chars is treated as a single unit as far -// as editing and measuring is concerned. This is not fully correct, -// since some scripts/fonts/browsers also treat other configurations -// of code points as a group. -var extendingChar = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - -function isWordChar(ch) { - return (/\w/.test(ch) || isExtendingChar(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) - ); -} + /** + * Dispatch a key press to the internal keymaps, which will override the default + * DOM behavior. + * + * @param {ProseMirror} pm The editor instance. + * @param {string} name The name of the key pressed. + * @param {KeyboardEvent} e + * @return {string} If the key name has a mapping and the callback is invoked ("handled"), + * if the key name needs to be combined in sequence with the next key ("multi"), + * if there is no mapping ("nothing"). + */ -/** - * Get the category of a given character. Either a "space", - * a character that can be part of a word ("word"), or anything else ("other"). - * - * @param {string} ch The character. - * @return {string} - */ + _createClass(Input, [{ + key: "maybeAbortComposition", + value: function maybeAbortComposition() { + if (this.composing && !this.updatingComposition) { + if (this.composing.finished) { + finishComposing(this.pm); + } else { + // Toggle selection to force end of composition + this.composing = null; + this.skipInput++; + var sel = getSelection(); + if (sel.rangeCount) { + var range = sel.getRangeAt(0); + sel.removeAllRanges(); + sel.addRange(range); + } + } + return true; + } + } + }]); -function charCategory(ch) { - return (/\s/.test(ch) ? "space" : isWordChar(ch) ? "word" : "other" - ); -} + return Input; +})(); -function isExtendingChar(ch) { - return ch.charCodeAt(0) >= 768 && extendingChar.test(ch); -} +exports.Input = Input; -},{}],22:[function(require,module,exports){ -"use strict"; +function dispatchKey(pm, name, e) { + var seq = pm.input.keySeq; + // If the previous key should be used in sequence with this one, modify the name accordingly. + if (seq) { + if ((0, _keys.isModifierKey)(name)) return true; + clearTimeout(stopSeq); + stopSeq = setTimeout(function () { + if (pm.input.keySeq == seq) pm.input.keySeq = null; + }, 50); + name = seq + " " + name; + } -Object.defineProperty(exports, "__esModule", { - value: true -}); + var handle = function handle(bound) { + if (bound === false) return "nothing"; + if (bound == "...") return "multi"; + if (bound == null) return false; -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; + var result = false; + if (Array.isArray(bound)) { + for (var i = 0; result === false && i < bound.length; i++) { + result = handle(bound[i]); } - }return _arr; - }return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); + } else if (typeof bound == "string") { + result = pm.execCommand(bound); } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); + result = bound(pm); } + return result == false ? false : "handled"; }; -})(); -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 result = undefined; + for (var i = 0; !result && i < pm.input.keymaps.length; i++) { + result = handle(pm.input.keymaps[i].map.lookup(name, pm)); + }if (!result) result = handle(pm.baseKeymap.lookup(name, pm)) || handle(_capturekeys.captureKeys.lookup(name)); -exports.defineParamHandler = defineParamHandler; -exports.initCommands = initCommands; -exports.defaultKeymap = defaultKeymap; + // If the key should be used in sequence with the next key, store the keyname internally. + if (result == "multi") pm.input.keySeq = name; -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; -} + if (result == "handled" || result == "multi") e.preventDefault(); -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); + if (seq && !result && /\'$/.test(name)) { + e.preventDefault(); + return true; } + return !!result; } -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} +handlers.keydown = function (pm, e) { + if (e.keyCode == 16) pm.input.shiftKey = true; + if (pm.input.composing) return; + var name = (0, _keys.keyName)(e); + if (name && dispatchKey(pm, name, e)) return; + pm.sel.pollForUpdate(); +}; -var _model = require("../model"); +handlers.keyup = function (pm, e) { + if (e.keyCode == 16) pm.input.shiftKey = false; +}; -var _transform = require("../transform"); +function inputText(pm, range, text) { + if (range.empty && !text) return false; + var marks = pm.input.storedMarks || pm.doc.marksAt(range.from); + var tr = pm.tr; + tr.replaceWith(range.from, range.to, pm.schema.text(text, marks)).apply(); + pm.scrollIntoView(); + // :: () #path=ProseMirror#events#textInput + // Fired when the user types text into the editor. + pm.signal("textInput", text); +} -var _dom = require("../dom"); +handlers.keypress = function (pm, e) { + if (pm.input.composing || !e.charCode || e.ctrlKey && !e.altKey || _dom.browser.mac && e.metaKey) return; + var ch = String.fromCharCode(e.charCode); + if (dispatchKey(pm, "'" + ch + "'", e)) return; + var sel = pm.selection; + if (sel.node && sel.node.contains == null) { + pm.tr["delete"](sel.from, sel.to).apply(); + sel = pm.selection; + } + inputText(pm, sel, ch); + e.preventDefault(); +}; -var _utilSortedinsert = require("../util/sortedinsert"); +function selectClickedNode(pm, e) { + var pos = (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); + if (!pos) return pm.sel.pollForUpdate(); -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; -var _char = require("./char"); + if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { + if (from.depth == 0) return pm.sel.pollForUpdate(); + pos = from.shorten(); + } -var _keys = require("./keys"); + pm.setNodeSelection(pos); + pm.focus(); + e.preventDefault(); +} -var _selection = require("./selection"); +var lastClick = 0; -var _options = require("./options"); +handlers.mousedown = function (pm, e) { + if (e.ctrlKey) return selectClickedNode(pm, e); -var paramHandlers = Object.create(null); + pm.sel.pollForUpdate(); -var empty = []; + var now = Date.now(), + multi = now - lastClick < 500; + lastClick = now; + if (pm.input.shiftKey || multi) return; -// FIXME document individual commands - -// ;; A command is a named piece of functionality that can be bound to -// a key, shown in the menu, or otherwise exposed to the user. -// -// The commands available in a given editor are gathered from the -// [registries](#registries) given to the editor, and the node and -// mark types in its [schema](#Schema.registry). Use the -// [`register`](#NodeType.register) method with `"command"` as the -// name and a `CommandSpec` as value to define a new command. + var x = e.clientX, + y = e.clientY, + moved = false; + var up = function up() { + removeEventListener("mouseup", up); + removeEventListener("mousemove", move); + if ((0, _selection.handleNodeClick)(pm, e)) return; -var Command = (function () { - function Command(spec, self) { - _classCallCheck(this, Command); + var pos = !moved && (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }); + if (pos) { + pm.setNodeSelection(pos); + pm.focus(); + } else { + pm.sel.pollForUpdate(); + } + }; + var move = function move(e) { + if (!moved && (Math.abs(x - e.clientX) > 4 || Math.abs(y - e.clientY) > 4)) moved = true; + pm.sel.pollForUpdate(); + }; + addEventListener("mouseup", up); + addEventListener("mousemove", move); +}; - // :: string The name of the command. - this.name = spec.name; - if (!this.name) throw new Error("Trying to define a command without a name"); - // :: CommandSpec The command's specifying object. - this.spec = spec; - this.self = self; - } +handlers.touchdown = function (pm) { + pm.sel.pollForUpdate(); +}; - // ;; #path=CommandSpec #kind=interface #toc=false - // Commands are defined using objects that specify various aspects of - // the command. The only properties that _must_ appear in a command - // spec are [`name`](#CommandSpec.name) and [`run`](#CommandSpec.run). - // You should probably also give your commands a `label`. +/** + * A class to track state while creating a composed character. + */ - // :: string #path=CommandSpec.name - // The name of the command, which will be its key in - // `ProseMirror.commands`, and the thing passed to - // [`execCommand`](#ProseMirror.execCommand). +var Composing = function Composing(pm, data) { + _classCallCheck(this, Composing); - // :: string #path=CommandSpec.label - // A user-facing label for the command. This will be used, among other - // things. as the tooltip title for the command's menu item. If there - // is no `label`, the command's `name` will be used instead. + this.finished = false; + this.context = (0, _domchange.textContext)(data); + this.data = data; + this.endData = null; + var range = pm.selection; + if (data) { + var path = range.head.path, + line = pm.doc.path(path).textContent; + var found = line.indexOf(data, range.head.offset - data.length); + if (found > -1 && found <= range.head.offset + data.length) range = new _selection.TextSelection(new _model.Pos(path, found), new _model.Pos(path, found + data.length)); + } + this.range = range; +}; - // :: (pm: ProseMirror, ...params: [any]) → ?bool #path=CommandSpec.run - // The function that executes the command. If the command has - // [parameters](#CommandSpec.params), their values are passed as - // arguments. For commands [registered](#NodeType.register) on node or - // mark types, `this` will be bound to the node or mark type when this - // function is ran. Should return `false` when the command could not - // be executed. +handlers.compositionstart = function (pm, e) { + if (pm.input.maybeAbortComposition()) return; - // :: [CommandParam] #path=CommandSpec.params - // The parameters that this command expects. + pm.flush(); + pm.input.composing = new Composing(pm, e.data); + var above = pm.selection.head.shorten(); + pm.markRangeDirty({ from: above, to: above.move(1) }); +}; - // :: (pm: ProseMirror) → bool #path=CommandSpec.select - // The function used to [select](#Command.select) the command. `this` - // will again be bound to a node or mark type, when available. +handlers.compositionupdate = function (pm, e) { + var info = pm.input.composing; + if (info && info.data != e.data) { + info.data = e.data; + pm.input.updatingComposition = true; + inputText(pm, info.range, info.data); + pm.input.updatingComposition = false; + info.range = new _selection.TextSelection(info.range.from, info.range.from.move(info.data.length)); + } +}; - // :: (pm: ProseMirror) → bool #path=CommandSpec.active - // The function used to determine whether the command is - // [active](#Command.active). `this` refers to the associated node or - // mark type. +handlers.compositionend = function (pm, e) { + var info = pm.input.composing; + if (info) { + pm.input.composing.finished = true; + pm.input.composing.endData = e.data; + setTimeout(function () { + if (pm.input.composing == info) finishComposing(pm); + }, 20); + } +}; - // :: union #path=CommandSpec.key - // The default key binding or bindings for this command. +function finishComposing(pm) { + var info = pm.input.composing; + var text = (0, _domchange.textInContext)(info.context, info.endData); + var range = (0, _selection.rangeFromDOMLoose)(pm); + pm.ensureOperation(); + pm.input.composing = null; + if (text != info.data) inputText(pm, info.range, text); + if (range && !range.eq(pm.sel.range)) pm.setSelectionDirect(range); +} - // :: union #path=CommandSpec.pcKey - // Default key binding or bindings specific to non-Mac platforms. +handlers.input = function (pm) { + if (pm.input.skipInput) return --pm.input.skipInput; - // :: union #path=CommandSpec.macKey - // Default key binding or bindings specific to the Mac platform. + if (pm.input.composing) { + if (pm.input.composing.finished) finishComposing(pm); + return; + } - // FIXME document menu and icon properties + pm.sel.stopPollingForUpdate(); + (0, _domchange.applyDOMChange)(pm); + pm.scrollIntoView(); +}; - // ;; #path=CommandParam #kind=interface #toc=false - // The parameters that a command can take are specified using objects - // with the following properties: +var lastCopied = null; - // :: string #path=CommandParam.label - // The user-facing name of the parameter. Shown to the user when - // prompting for this parameter. +handlers.copy = handlers.cut = function (pm, e) { + var _pm$selection2 = pm.selection; + var from = _pm$selection2.from; + var to = _pm$selection2.to; + var empty = _pm$selection2.empty; - // :: string #path=CommandParam.type - // The type of the parameter. Supported types are `"text"` and `"select"`. + if (empty) return; + var fragment = pm.selectedDoc; + lastCopied = { doc: pm.doc, from: from, to: to, + html: (0, _serializeDom.toHTML)(fragment), + text: (0, _serializeText.toText)(fragment) }; - // :: any #path=CommandParam.default - // A default value for the parameter. + if (e.clipboardData) { + e.preventDefault(); + e.clipboardData.clearData(); + e.clipboardData.setData("text/html", lastCopied.html); + e.clipboardData.setData("text/plain", lastCopied.text); + if (e.type == "cut" && !empty) pm.tr["delete"](from, to).apply(); + } +}; - // :: (string, (pm: ProseMirror, cmd: Command, callback: (?[any]))) - // Register a parameter handler, which is a function that prompts the - // user to enter values for a command's [parameters](#CommandParam), and - // calls a callback with the values received. See also the - // [`commandParamHandler` option](#commandParamHandler). +handlers.paste = function (pm, e) { + if (!e.clipboardData) return; + var sel = pm.selection; + var txt = e.clipboardData.getData("text/plain"); + var html = e.clipboardData.getData("text/html"); + if (html || txt) { + e.preventDefault(); + var doc = undefined, + from = undefined, + to = undefined; + if (pm.input.shiftKey && txt) { + doc = (0, _parseText.fromText)(pm.schema, txt); + } else if (lastCopied && (lastCopied.html == html || lastCopied.text == txt)) { + ;var _lastCopied = lastCopied; + doc = _lastCopied.doc; + from = _lastCopied.from; + to = _lastCopied.to; + } else if (html) { + doc = (0, _parseDom.fromHTML)(pm.schema, html); + } else { + doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); + } + pm.tr.replace(sel.from, sel.to, doc, from || (0, _selection.findSelectionAtStart)(doc).from, to || (0, _selection.findSelectionAtEnd)(doc).to).apply(); + pm.scrollIntoView(); + } +}; - // :: (ProseMirror, ?[any]) → ?bool - // Execute this command. If the command takes - // [parameters](#Command.params), they can be passed as second - // argument here, or omitted, in which case a [parameter - // handler](#defineParamHandler) will be called to prompt the user - // for values. - // - // Returns the value returned by the command spec's [`run` - // method](#CommandSpec.run), or `false` if the command could not be - // ran. +handlers.dragstart = function (pm, e) { + if (!e.dataTransfer) return; - _createClass(Command, [{ - key: "exec", - value: function exec(pm, params) { - var _this = this; + var fragment = pm.selectedDoc; - var run = this.spec.run; - if (!this.params.length) return run.call(this.self, pm); - if (params) return run.call.apply(run, [this.self, pm].concat(_toConsumableArray(params))); - var handler = getParamHandler(pm); - if (!handler) return false; - handler(pm, this, function (params) { - if (params) run.call.apply(run, [_this.self, pm].concat(_toConsumableArray(params))); - }); - } + e.dataTransfer.setData("text/html", (0, _serializeDom.toHTML)(fragment)); + e.dataTransfer.setData("text/plain", (0, _serializeText.toText)(fragment)); + pm.input.draggingFrom = true; +}; - // :: (ProseMirror) → bool - // Ask this command whether it is currently relevant, given the - // editor's document and selection. If the command does not define a - // [`select`](#CommandSpec.select) method, this always returns true. - }, { - key: "select", - value: function select(pm) { - var f = this.spec.select; - return f ? f.call(this.self, pm) : true; - } +handlers.dragend = function (pm) { + return window.setTimeout(function () { + return pm.input.dragginFrom = false; + }, 50); +}; - // :: (ProseMirror) → bool - // Ask this command whether it is “active”. This is mostly used to - // style inline mark icons (such as strong) differently when the - // selection contains such marks. - }, { - key: "active", - value: function active(pm) { - var f = this.spec.active; - return f ? f.call(this.self, pm) : false; - } +handlers.dragover = handlers.dragenter = function (pm, e) { + e.preventDefault(); + var cursorPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); + if (!cursorPos) return; + var coords = (0, _selection.coordsAtPos)(pm, cursorPos); + var rect = pm.wrapper.getBoundingClientRect(); + coords.top -= rect.top; + coords.right -= rect.left; + coords.bottom -= rect.top; + coords.left -= rect.left; + var target = pm.input.dropTarget; + target.style.display = "block"; + target.style.left = coords.left - 1 + "px"; + target.style.top = coords.top + "px"; + target.style.height = coords.bottom - coords.top + "px"; +}; - // :: [CommandParam] - // Get the list of parameters that this command expects. - }, { - key: "params", - get: function get() { - return this.spec.params || empty; - } +handlers.dragleave = function (pm) { + return pm.input.dropTarget.style.display = ""; +}; - // :: string - // Get the label for this command. - }, { - key: "label", - get: function get() { - return this.spec.label || this.name; - } - }]); +handlers.drop = function (pm, e) { + pm.input.dropTarget.style.display = ""; - return Command; -})(); + if (!e.dataTransfer) return; -exports.Command = Command; + var html = undefined, + txt = undefined, + doc = undefined; + if (html = e.dataTransfer.getData("text/html")) doc = (0, _parseDom.fromHTML)(pm.schema, html, { document: document });else if (txt = e.dataTransfer.getData("text/plain")) doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); -function defineParamHandler(name, handler) { - paramHandlers[name] = handler; -} + if (doc) { + e.preventDefault(); + var insertPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); + if (!insertPos) return; + var tr = pm.tr; + if (pm.input.draggingFrom && !e.ctrlKey) { + tr.deleteSelection(); + insertPos = tr.map(insertPos).pos; + } + tr.replace(insertPos, insertPos, doc, (0, _selection.findSelectionAtStart)(doc).from, (0, _selection.findSelectionAtEnd)(doc).to).apply(); + pm.setTextSelection(insertPos, tr.map(insertPos).pos); + pm.focus(); + } +}; -function getParamHandler(pm) { - var option = pm.options.commandParamHandler; - if (option && paramHandlers[option]) return paramHandlers[option]; -} +handlers.focus = function (pm) { + (0, _dom.addClass)(pm.wrapper, "ProseMirror-focused"); + // :: () #path=ProseMirror#events#focus + // Fired when the editor gains focus. + pm.signal("focus"); +}; -function initCommands(pm) { - var result = Object.create(null); - pm.registry("command", function (spec, type) { - result[spec.name] = new Command(spec, type); - }); - return result; -} +handlers.blur = function (pm) { + (0, _dom.rmClass)(pm.wrapper, "ProseMirror-focused"); + // :: () #path=ProseMirror#events#blur + // Fired when the editor loses focus. + pm.signal("blur"); +}; -function defaultKeymap(pm) { - var bindings = {}; - function add(command, key) { - if (Array.isArray(key)) { - for (var i = 0; i < key.length; i++) { - add(command, key[i]); - } - } else if (key) { - var _d$$exec = /^(.+?)(?:\((\d+)\))?$/.exec(key); +},{"../dom":1,"../model":27,"../parse":33,"../parse/dom":32,"../parse/text":34,"../serialize/dom":35,"../serialize/text":37,"./capturekeys":2,"./domchange":6,"./keys":11,"./selection":15}],11:[function(require,module,exports){ +// From CodeMirror, should be factored into its own NPM module - var _d$$exec2 = _slicedToArray(_d$$exec, 3); +// declare_global: navigator +"use strict"; - var _ = _d$$exec2[0]; - var _name = _d$$exec2[1]; - var _d$$exec2$2 = _d$$exec2[2]; - var rank = _d$$exec2$2 === undefined ? 50 : _d$$exec2$2; +Object.defineProperty(exports, "__esModule", { + value: true +}); - (0, _utilSortedinsert2["default"])(bindings[_name] || (bindings[_name] = []), { command: command, rank: rank }, function (a, b) { - return a.rank - b.rank; - }); +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); } - } - for (var _name2 in pm.commands) { - var cmd = pm.commands[_name2]; - add(_name2, cmd.spec.key); - add(_name2, _dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); - } + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); - for (var key in bindings) { - bindings[key] = bindings[key].map(function (b) { - return b.command; - }); - }return new _keys.Keymap(bindings); +exports.keyName = keyName; +exports.isModifierKey = isModifierKey; +exports.normalizeKeyName = normalizeKeyName; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } } -var andScroll = { scrollIntoView: true }; +var mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; -_model.HardBreak.register("command", { - name: "insertHardBreak", - label: "Insert hard break", - run: function run(pm) { - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; +// :: Object +// A map from key codes to key names. +var keyNames = { + 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" +}; - if (node && node.isBlock) return false;else if (pm.doc.path(from.path).type.isCode) return pm.tr.typeText("\n").apply(andScroll);else return pm.tr.replaceSelection(this.create()).apply(andScroll); - }, - key: ["Mod-Enter", "Shift-Enter"] -}); +exports.keyNames = keyNames; +// Number keys +for (var i = 0; i < 10; i++) { + keyNames[i + 48] = keyNames[i + 96] = String(i); +} // Alphabetic keys +for (var i = 65; i <= 90; i++) { + keyNames[i] = String.fromCharCode(i); +} // Function keys +for (var i = 1; i <= 12; i++) { + keyNames[i + 111] = keyNames[i + 63235] = "F" + i; +} // :: (KeyboardEvent) → ?string +// Find a name for the given keydown event. If the keycode in the +// event is not known, this will return `null`. Otherwise, it will +// return a string like `"Shift-Cmd-Ctrl-Alt-Home"`. The parts before +// the dashes give the modifiers (always in that order, if present), +// and the last word gives the key name, which one of the names in +// `keyNames`. +// +// The convention for keypress events is to use the pressed character +// between single quotes. Due to limitations in the browser API, +// keypress events can not have modifiers. -function markActive(pm, type) { - var sel = pm.selection; - if (sel.empty) return type.isInSet(pm.activeMarks());else return pm.doc.rangeHasMark(sel.from, sel.to, type); +function keyName(event) { + var base = keyNames[event.keyCode], + name = base; + if (name == null || event.altGraphKey) return null; + + if (event.altKey && base != "Alt") name = "Alt-" + name; + if (event.ctrlKey && base != "Ctrl") name = "Ctrl-" + name; + if (event.metaKey && base != "Cmd") name = "Cmd-" + name; + if (event.shiftKey && base != "Shift") name = "Shift-" + name; + return name; } -function canAddInline(pm, type) { - var _pm$selection2 = pm.selection; - var from = _pm$selection2.from; - var to = _pm$selection2.to; - var empty = _pm$selection2.empty; +// :: (string) → bool +// Test whether the given key name refers to a modifier key. - if (empty) return !type.isInSet(pm.activeMarks()) && pm.doc.path(from.path).type.canContainMark(type); - var can = false; - pm.doc.nodesBetween(from, to, function (node) { - if (can || node.isTextblock && !node.type.canContainMark(type)) return false; - if (node.isInline && !type.isInSet(node.marks)) can = true; - }); - return can; +function isModifierKey(name) { + name = /[^-]*$/.exec(name)[0]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; } -function markApplies(pm, type) { - var _pm$selection3 = pm.selection; - var from = _pm$selection3.from; - var to = _pm$selection3.to; +// :: (string) → string +// Normalize a sloppy key name, which may have modifiers in the wrong +// order or use shorthands for modifiers, to a properly formed key +// name. Used to normalize names provided in keymaps. +// +// Note that the modifier `mod` is a shorthand for `Cmd` on Mac, and +// `Ctrl` on other platforms. - var relevant = false; - pm.doc.nodesBetween(from, to, function (node) { - if (node.isTextblock) { - if (node.type.canContainMark(type)) relevant = true; - return false; - } - }); - return relevant; +function normalizeKeyName(name) { + var parts = name.split(/-(?!'?$)/), + result = parts[parts.length - 1]; + var alt = undefined, + ctrl = undefined, + shift = undefined, + cmd = undefined; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;else if (/^a(lt)?$/i.test(mod)) alt = true;else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;else if (/^s(hift)$/i.test(mod)) shift = true;else if (/^mod$/i.test(mod)) { + if (mac) cmd = true;else ctrl = true; + } else throw new Error("Unrecognized modifier name: " + mod); + } + if (alt) result = "Alt-" + result; + if (ctrl) result = "Ctrl-" + result; + if (cmd) result = "Cmd-" + result; + if (shift) result = "Shift-" + result; + return result; } -function generateMarkCommands(type, name, labelName, spec) { - if (!labelName) labelName = name; - var cap = name.charAt(0).toUpperCase() + name.slice(1); - type.register("command", { - name: "set" + cap, - label: "Set " + labelName, - run: function run(pm) { - pm.setMark(this, true); - }, - select: function select(pm) { - return canAddInline(pm, this); - }, - icon: { from: name } - }); - type.register("command", { - name: "unset" + cap, - label: "Remove " + labelName, - run: function run(pm) { - pm.setMark(this, false); - }, - select: function select(pm) { - return markActive(pm, this); - }, - icon: { from: name } - }); - var command = { - name: name, - label: "Toggle " + labelName, - run: function run(pm) { - pm.setMark(this, null); - }, - active: function active(pm) { - return markActive(pm, this); - }, - select: function select(pm) { - return markApplies(pm, this); - } - }; - for (var prop in spec) { - command[prop] = spec[prop]; - }type.register("command", command); -} - -generateMarkCommands(_model.StrongMark, "strong", null, { - menuGroup: "inline", menuRank: 20, - icon: { - width: 805, height: 1024, - path: "M317 869q42 18 80 18 214 0 214-191 0-65-23-102-15-25-35-42t-38-26-46-14-48-6-54-1q-41 0-57 5 0 30-0 90t-0 90q0 4-0 38t-0 55 2 47 6 38zM309 442q24 4 62 4 46 0 81-7t62-25 42-51 14-81q0-40-16-70t-45-46-61-24-70-8q-28 0-74 7 0 28 2 86t2 86q0 15-0 45t-0 45q0 26 0 39zM0 950l1-53q8-2 48-9t60-15q4-6 7-15t4-19 3-18 1-21 0-19v-37q0-561-12-585-2-4-12-8t-25-6-28-4-27-2-17-1l-2-47q56-1 194-6t213-5q13 0 39 0t38 0q40 0 78 7t73 24 61 40 42 59 16 78q0 29-9 54t-22 41-36 32-41 25-48 22q88 20 146 76t58 141q0 57-20 102t-53 74-78 48-93 27-100 8q-25 0-75-1t-75-1q-60 0-175 6t-132 6z" - }, - key: "Mod-B" -}); - -generateMarkCommands(_model.EmMark, "em", "emphasis", { - menuGroup: "inline", menuRank: 21, - icon: { - width: 585, height: 1024, - path: "M0 949l9-48q3-1 46-12t63-21q16-20 23-57 0-4 35-165t65-310 29-169v-14q-13-7-31-10t-39-4-33-3l10-58q18 1 68 3t85 4 68 1q27 0 56-1t69-4 56-3q-2 22-10 50-17 5-58 16t-62 19q-4 10-8 24t-5 22-4 26-3 24q-15 84-50 239t-44 203q-1 5-7 33t-11 51-9 47-3 32l0 10q9 2 105 17-1 25-9 56-6 0-18 0t-18 0q-16 0-49-5t-49-5q-78-1-117-1-29 0-81 5t-69 6z" - }, - key: "Mod-I" -}); +// ;; A keymap binds a set of [key names](#keyName) to commands names +// or functions. -generateMarkCommands(_model.CodeMark, "code", null, { - menuGroup: "inline", menuRank: 22, - icon: { - width: 896, height: 1024, - path: "M608 192l-96 96 224 224-224 224 96 96 288-320-288-320zM288 192l-288 320 288 320 96-96-224-224 224-224-96-96z" - }, - key: "Mod-`" -}); +var Keymap = (function () { + // :: (Object, ?Object) + // Construct a keymap using the bindings in `keys`, whose properties + // should be [key names](#keyName) or space-separated sequences of + // key names. In the second case, the binding will be for a + // multi-stroke key combination. + // + // When `options` has a property `call`, this will be a programmatic + // keymap, meaning that instead of looking keys up in its set of + // bindings, it will pass the key name to `options.call`, and use + // the return value of that calls as the resolved binding. + // + // `options.name` can be used to give the keymap a name, making it + // easier to [remove](#ProseMirror.removeKeymap) from an editor. -_model.LinkMark.register("command", { - name: "unlink", - label: "Unlink", - run: function run(pm) { - pm.setMark(this, false); - }, - select: function select(pm) { - return markActive(pm, this); - }, - active: function active() { - return true; - }, - menuGroup: "inline", menuRank: 30, - icon: { from: "link" } -}); + function Keymap(keys, options) { + _classCallCheck(this, Keymap); -_model.LinkMark.register("command", { - name: "link", - label: "Add link", - run: function run(pm, href, title) { - pm.setMark(this, true, { href: href, title: title }); - }, - params: [{ label: "Target", type: "text" }, { label: "Title", type: "text", "default": "" }], - select: function select(pm) { - return markApplies(pm, this) && !markActive(pm, this); - }, - menuGroup: "inline", menuRank: 30, - icon: { - width: 951, height: 1024, - path: "M832 694q0-22-16-38l-118-118q-16-16-38-16-24 0-41 18 1 1 10 10t12 12 8 10 7 14 2 15q0 22-16 38t-38 16q-8 0-15-2t-14-7-10-8-12-12-10-10q-18 17-18 41 0 22 16 38l117 118q15 15 38 15 22 0 38-14l84-83q16-16 16-38zM430 292q0-22-16-38l-117-118q-16-16-38-16-22 0-38 15l-84 83q-16 16-16 38 0 22 16 38l118 118q15 15 38 15 24 0 41-17-1-1-10-10t-12-12-8-10-7-14-2-15q0-22 16-38t38-16q8 0 15 2t14 7 10 8 12 12 10 10q18-17 18-41zM941 694q0 68-48 116l-84 83q-47 47-116 47-69 0-116-48l-117-118q-47-47-47-116 0-70 50-119l-50-50q-49 50-118 50-68 0-116-48l-118-118q-48-48-48-116t48-116l84-83q47-47 116-47 69 0 116 48l117 118q47 47 47 116 0 70-50 119l50 50q49-50 118-50 68 0 116 48l118 118q48 48 48 116z" + this.options = options || {}; + this.bindings = Object.create(null); + if (keys) for (var keyname in keys) { + if (Object.prototype.hasOwnProperty.call(keys, keyname)) this.addBinding(keyname, keys[keyname]); + } } -}); -_model.Image.register("command", { - name: "insertImage", - label: "Insert image", - run: function run(pm, src, alt, title) { - return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(andScroll); - }, - params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], - select: function select(pm) { - return pm.doc.path(pm.selection.from.path).type.canContainType(this); - }, - menuGroup: "inline", menuRank: 40, - icon: { - width: 1097, height: 1024, - path: "M365 329q0 45-32 77t-77 32-77-32-32-77 32-77 77-32 77 32 32 77zM950 548v256h-804v-109l182-182 91 91 292-292zM1005 146h-914q-7 0-12 5t-5 12v694q0 7 5 12t12 5h914q7 0 12-5t5-12v-694q0-7-5-12t-12-5zM1097 164v694q0 37-26 64t-64 26h-914q-37 0-64-26t-26-64v-694q0-37 26-64t64-26h914q37 0 64 26t26 64z" - }, - prefillParams: function prefillParams(pm) { - var node = pm.selection.node; + // :: (string, any) + // Add a binding for the given key or key sequence. - if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; - } -}); + _createClass(Keymap, [{ + key: "addBinding", + value: function addBinding(keyname, value) { + var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var _name = keys.slice(0, i + 1).join(" "); + var val = i == keys.length - 1 ? value : "..."; + var prev = this.bindings[_name]; + if (!prev) this.bindings[_name] = val;else if (prev != val) throw new Error("Inconsistent bindings for " + _name); + } + } -/** - * Get an offset moving backward from a current offset inside a node. - * - * @param {Object} parent The parent node. - * @param {int} offset Offset to move from inside the node. - * @param {string} by Size to delete by. Either "char" or "word". - */ -function moveBackward(parent, offset, by) { - if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); + // :: (string) + // Remove the binding for the given key or key sequence. + }, { + key: "removeBinding", + value: function removeBinding(keyname) { + var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); + for (var i = keys.length - 1; i >= 0; i--) { + var _name2 = keys.slice(0, i).join(" "); + var val = this.bindings[_name2]; + if (val == "..." && !this.unusedMulti(_name2)) break;else if (val) delete this.bindings[_name2]; + } + } + }, { + key: "unusedMulti", + value: function unusedMulti(name) { + for (var binding in this.bindings) { + if (binding.length > name && binding.indexOf(name) == 0 && binding.charAt(name.length) == " ") return false; + }return true; + } - var cat = null, - counted = 0; - for (;;) { - if (offset == 0) return offset; + // :: (string, ?any) → any + // Looks up the given key or key sequence in this keymap. Returns + // the value the key is bound to (which may be undefined if it is + // not bound), or the string `"..."` if the key is a prefix of a + // multi-key sequence that is bound by this keymap. + }, { + key: "lookup", + value: function lookup(key, context) { + return this.options.call ? this.options.call(key, context) : this.bindings[key]; + } + }]); - var _parent$chunkBefore = parent.chunkBefore(offset); + return Keymap; +})(); - var start = _parent$chunkBefore.start; - var node = _parent$chunkBefore.node; +exports.Keymap = Keymap; - if (!node.isText) return cat ? offset : offset - 1; +},{}],12:[function(require,module,exports){ +"use strict"; - if (by == "char") { - for (var i = offset - start; i > 0; i--) { - if (!(0, _char.isExtendingChar)(node.text.charAt(i - 1))) return offset - 1; - offset--; - } - } else if (by == "word") { - // Work from the current position backwards through text of a singular - // character category (e.g. "cat" of "#!*") until reaching a character in a - // different category (i.e. the end of the word). - for (var i = offset - start; i > 0; i--) { - var nextCharCat = (0, _char.charCategory)(node.text.charAt(i - 1)); - if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; - offset--; - counted++; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _get = function get(_x4, _x5, _x6) { + var _again = true;_function: while (_again) { + var object = _x4, + property = _x5, + receiver = _x6;_again = false;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 { + _x4 = parent;_x5 = property;_x6 = receiver;_again = true;desc = parent = undefined;continue _function; } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); } } -} +}; -_options.defaultRegistry.register("command", { - name: "deleteSelection", - label: "Delete the selection", - run: function run(pm) { - return pm.tr.replaceSelection().apply(andScroll); - }, - key: ["Backspace(10)", "Delete(10)", "Mod-Backspace(10)", "Mod-Delete(10)"], - macKey: ["Ctrl-H(10)", "Alt-Backspace(10)", "Ctrl-D(10)", "Ctrl-Alt-Backspace(10)", "Alt-Delete(10)", "Alt-D(10)"] -}); +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; + }; +})(); -function deleteBarrier(pm, cut) { - var around = pm.doc.path(cut.path); - var before = around.child(cut.offset - 1), - after = around.child(cut.offset); - if (before.type.canContainContent(after.type) && pm.tr.join(cut).apply(andScroll) !== false) return; - - var conn = undefined; - if (after.isTextblock && (conn = before.type.findConnection(after.type))) { - var tr = pm.tr, - end = cut.move(1); - tr.step("ancestor", cut, end, null, { types: [before.type].concat(_toConsumableArray(conn)), - attrs: [before.attrs].concat(_toConsumableArray(conn.map(function () { - return null; - }))) }); - tr.join(end); - tr.join(cut); - if (tr.apply(andScroll) !== false) return; - } +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} - var selAfter = (0, _selection.findSelectionFrom)(pm.doc, cut, 1); - return pm.tr.lift(selAfter.from, selAfter.to).apply(andScroll); +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; } -_options.defaultRegistry.register("command", { - name: "joinBackward", - label: "Join with the block above", - run: function run(pm) { - var _pm$selection4 = pm.selection; - var head = _pm$selection4.head; - var empty = _pm$selection4.empty; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} - if (!empty || head.offset > 0) return false; +require("./css"); - // Find the node before this one - var before = undefined, - cut = undefined; - for (var i = head.path.length - 1; !before && i >= 0; i--) { - if (head.path[i] > 0) { - cut = head.shorten(i); - before = pm.doc.path(cut.path).child(cut.offset - 1); - } - } // If there is no node before this, try to lift - if (!before) return pm.tr.lift(head).apply(andScroll); +var _model = require("../model"); - // If the node doesn't allow children, delete it - if (before.type.contains == null) return pm.tr["delete"](cut.move(-1), cut).apply(andScroll); +var _transform = require("../transform"); - // Apply the joining algorithm - return deleteBarrier(pm, cut); - }, - key: ["Backspace(30)", "Mod-Backspace(30)"] -}); +var _utilSortedinsert = require("../util/sortedinsert"); -_options.defaultRegistry.register("command", { - name: "deleteCharBefore", - label: "Delete a character before the cursor", - run: function run(pm) { - var _pm$selection5 = pm.selection; - var head = _pm$selection5.head; - var empty = _pm$selection5.empty; +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); - if (!empty || head.offset == 0) return false; - var from = moveBackward(pm.doc.path(head.path), head.offset, "char"); - return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); - }, - key: "Backspace(60)", - macKey: "Ctrl-H(40)" -}); +var _utilMap = require("../util/map"); -_options.defaultRegistry.register("command", { - name: "deleteWordBefore", - label: "Delete the word before the cursor", - run: function run(pm) { - var _pm$selection6 = pm.selection; - var head = _pm$selection6.head; - var empty = _pm$selection6.empty; +var _utilEvent = require("../util/event"); - if (!empty || head.offset == 0) return false; - var from = moveBackward(pm.doc.path(head.path), head.offset, "word"); - return pm.tr["delete"](new _model.Pos(head.path, from), head).apply(andScroll); - }, - key: "Mod-Backspace(40)", - macKey: "Alt-Backspace(40)" -}); +var _dom = require("../dom"); -function moveForward(parent, offset, by) { - if (by != "char" && by != "word") throw new Error("Unknown motion unit: " + by); +var _serializeText = require("../serialize/text"); - var cat = null, - counted = 0; - for (;;) { - if (offset == parent.size) return offset; +require("../parse/text"); - var _parent$chunkAfter = parent.chunkAfter(offset); +var _parse = require("../parse"); - var start = _parent$chunkAfter.start; - var node = _parent$chunkAfter.node; +var _serialize = require("../serialize"); - if (!node.isText) return cat ? offset : offset + 1; +var _options = require("./options"); - if (by == "char") { - for (var i = offset - start; i < node.text.length; i++) { - if (!(0, _char.isExtendingChar)(node.text.charAt(i + 1))) return offset + 1; - offset++; - } - } else if (by == "word") { - for (var i = offset - start; i < node.text.length; i++) { - var nextCharCat = (0, _char.charCategory)(node.text.charAt(i)); - if (cat == null || counted == 1 && cat == "space") cat = nextCharCat;else if (cat != nextCharCat) return offset; - offset++; - counted++; - } - } - } -} +var _selection2 = require("./selection"); -_options.defaultRegistry.register("command", { - name: "joinForward", - label: "Join with the block below", - run: function run(pm) { - var _pm$selection7 = pm.selection; - var head = _pm$selection7.head; - var empty = _pm$selection7.empty; +var _draw = require("./draw"); - if (!empty || head.offset < pm.doc.path(head.path).size) return false; +var _input = require("./input"); - // Find the node after this one - var after = undefined, - cut = undefined; - for (var i = head.path.length - 1; !after && i >= 0; i--) { - cut = head.shorten(i, 1); - var _parent = pm.doc.path(cut.path); - if (cut.offset < _parent.size) after = _parent.child(cut.offset); - } +var _history = require("./history"); - // If there is no node after this, there's nothing to do - if (!after) return false; +var _commands = require("./commands"); - // If the node doesn't allow children, delete it - if (after.type.contains == null) return pm.tr["delete"](cut, cut.move(1)).apply(andScroll); +var _range = require("./range"); - // Apply the joining algorithm - return deleteBarrier(pm, cut); - }, - key: ["Delete(30)", "Mod-Delete(30)"] -}); +var _keys = require("./keys"); -_options.defaultRegistry.register("command", { - name: "deleteCharAfter", - label: "Delete a character after the cursor", - run: function run(pm) { - var _pm$selection8 = pm.selection; - var head = _pm$selection8.head; - var empty = _pm$selection8.empty; +// ;; This is the class used to represent instances of the editor. A +// ProseMirror editor holds a [document](#Node) and a +// [selection](#Selection), and displays an editable surface +// representing that document in the browser document. +// +// Contains event methods (`on`, etc) from the [event +// mixin](#EventMixin). - if (!empty || head.offset == pm.doc.path(head.path).size) return false; - var to = moveForward(pm.doc.path(head.path), head.offset, "char"); - return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); - }, - key: "Delete(60)", - macKey: "Ctrl-D(60)" -}); +var ProseMirror = (function () { + // :: (Object) + // Construct a new editor from a set of [options](#edit_options) + // and, if it has a [`place`](#place) option, add it to the + // document. -_options.defaultRegistry.register("command", { - name: "deleteWordAfter", - label: "Delete a character after the cursor", - run: function run(pm) { - var _pm$selection9 = pm.selection; - var head = _pm$selection9.head; - var empty = _pm$selection9.empty; + function ProseMirror(opts) { + _classCallCheck(this, ProseMirror); - if (!empty || head.offset == pm.doc.path(head.path).size) return false; - var to = moveForward(pm.doc.path(head.path), head.offset, "word"); - return pm.tr["delete"](head, new _model.Pos(head.path, to)).apply(andScroll); - }, - key: "Mod-Delete(40)", - macKey: ["Ctrl-Alt-Backspace(40)", "Alt-Delete(40)", "Alt-D(40)"] -}); + opts = this.options = (0, _options.parseOptions)(opts); + // :: Schema + // The schema for this editor's document. + this.schema = opts.schema; + if (opts.doc == null) opts.doc = this.schema.node("doc", null, [this.schema.node("paragraph")]); + // :: DOMNode + // The editable DOM node containing the document. + this.content = (0, _dom.elt)("div", { "class": "ProseMirror-content" }); + // :: DOMNode + // The outer DOM element of the editor. + this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror" }, this.content); + this.wrapper.ProseMirror = this; -function joinPointAbove(pm) { - var _pm$selection10 = pm.selection; - var node = _pm$selection10.node; - var from = _pm$selection10.from; + if (opts.place && opts.place.appendChild) opts.place.appendChild(this.wrapper);else if (opts.place) opts.place(this.wrapper); - if (node) return (0, _transform.joinableBlocks)(pm.doc, from) ? from : null;else return (0, _transform.joinPoint)(pm.doc, from, -1); -} + this.setDocInner(opts.docFormat ? (0, _parse.parseFrom)(this.schema, opts.doc, opts.docFormat) : opts.doc); + (0, _draw.draw)(this, this.doc); + this.content.contentEditable = true; + if (opts.label) this.content.setAttribute("aria-label", opts.label); -_options.defaultRegistry.register("command", { - name: "joinUp", - label: "Join with above block", - run: function run(pm) { - var node = pm.selection.node; - var point = joinPointAbove(pm); - if (!point) return false; - pm.tr.join(point).apply(); - if (node) pm.setNodeSelection(point.move(-1)); - }, - select: function select(pm) { - return joinPointAbove(pm); - }, - menuGroup: "block", menuRank: 80, - icon: { - width: 800, height: 900, - path: "M0 75h800v125h-800z M0 825h800v-125h-800z M250 400h100v-100h100v100h100v100h-100v100h-100v-100h-100z" - }, - key: "Alt-Up" -}); + // :: Object + // A namespace where modules can store references to themselves + // associated with this editor instance. + this.mod = Object.create(null); + this.operation = null; + this.dirtyNodes = new _utilMap.Map(); // Maps node object to 1 (re-scan content) or 2 (redraw entirely) + this.flushScheduled = false; -function joinPointBelow(pm) { - var _pm$selection11 = pm.selection; - var node = _pm$selection11.node; - var to = _pm$selection11.to; + this.sel = new _selection2.SelectionState(this); + this.accurateSelection = false; + this.input = new _input.Input(this); - if (node) return (0, _transform.joinableBlocks)(pm.doc, to) ? to : null;else return (0, _transform.joinPoint)(pm.doc, to, 1); -} + // :: Object + // The commands available in the editor. + this.commands = (0, _commands.initCommands)(this); + this.commandKeys = Object.create(null); -_options.defaultRegistry.register("command", { - name: "joinDown", - label: "Join with below block", - run: function run(pm) { - var node = pm.selection.node; - var point = joinPointBelow(pm); - if (!point) return false; - pm.tr.join(point).apply(); - if (node) pm.setNodeSelection(point.move(-1)); - }, - select: function select(pm) { - return joinPointBelow(pm); - }, - key: "Alt-Down" -}); + (0, _options.initOptions)(this); + } -_options.defaultRegistry.register("command", { - name: "lift", - label: "Lift out of enclosing block", - run: function run(pm) { - var _pm$selection12 = pm.selection; - var from = _pm$selection12.from; - var to = _pm$selection12.to; + // :: (string, any) + // Update the value of the given [option](#edit_options). - return pm.tr.lift(from, to).apply(andScroll); - }, - select: function select(pm) { - var _pm$selection13 = pm.selection; - var from = _pm$selection13.from; - var to = _pm$selection13.to; + _createClass(ProseMirror, [{ + key: "setOption", + value: function setOption(name, value) { + (0, _options.setOption)(this, name, value); + } - return (0, _transform.canLift)(pm.doc, from, to); - }, - menuGroup: "block", menuRank: 75, - icon: { - width: 1024, height: 1024, - path: "M219 310v329q0 7-5 12t-12 5q-8 0-13-5l-164-164q-5-5-5-13t5-13l164-164q5-5 13-5 7 0 12 5t5 12zM1024 749v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12zM1024 530v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 310v109q0 7-5 12t-12 5h-621q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h621q7 0 12 5t5 12zM1024 91v109q0 7-5 12t-12 5h-987q-7 0-12-5t-5-12v-109q0-7 5-12t12-5h987q7 0 12 5t5 12z" - }, - key: "Alt-Left" -}); + // :: (string) → any + // Get the current value of the given [option](#edit_options). + }, { + key: "getOption", + value: function getOption(name) { + return this.options[name]; + } -function isAtTopOfListItem(doc, from, to, listType) { - return _model.Pos.samePath(from.path, to.path) && from.path.length >= 2 && from.path[from.path.length - 1] == 0 && listType.canContain(doc.path(from.path.slice(0, from.path.length - 1))); -} + // :: Selection + // Get the current selection. + }, { + key: "setTextSelection", -function wrapCommand(type, name, labelName, isList, spec) { - var command = { - name: "wrap" + name, - label: "Wrap in " + labelName, - run: function run(pm) { - var _pm$selection14 = pm.selection; - var from = _pm$selection14.from; - var to = _pm$selection14.to; - var head = _pm$selection14.head;var doJoin = false; - if (isList && head && isAtTopOfListItem(pm.doc, from, to, this)) { - // Don't do anything if this is the top of the list - if (from.path[from.path.length - 2] == 0) return false; - doJoin = true; + // :: (Pos, ?Pos) + // Set the selection to a [text selection](#TextSelection) from + // `anchor` to `head`, or, if `head` is null, a cursor selection at + // `anchor`. + value: function setTextSelection(anchor, head) { + this.setSelection(new _selection2.TextSelection(anchor, head)); + } + + // :: (Pos) + // Set the selection to a node selection on the node after `pos`. + }, { + key: "setNodeSelection", + value: function setNodeSelection(pos) { + this.checkPos(pos, false); + var parent = this.doc.path(pos.path); + if (pos.offset >= parent.size) throw new Error("Trying to set a node selection at the end of a node"); + var node = parent.child(pos.offset); + if (!node.type.selectable) throw new Error("Trying to select a non-selectable node"); + this.input.maybeAbortComposition(); + this.sel.setAndSignal(new _selection2.NodeSelection(pos, pos.move(1), node)); + } + + // :: (Selection) + // Set the selection to the given selection object. + }, { + key: "setSelection", + value: function setSelection(selection) { + if (selection instanceof _selection2.TextSelection) { + this.checkPos(selection.head, true); + if (!selection.empty) this.checkPos(selection.anchor, true); + } else { + this.checkPos(selection.to, false); } - var tr = pm.tr.wrap(from, to, this); - if (doJoin) tr.join(from.shorten(from.depth - 2)); - return tr.apply(andScroll); - }, - select: function select(pm) { - var _pm$selection15 = pm.selection; - var from = _pm$selection15.from; - var to = _pm$selection15.to; - var head = _pm$selection15.head; + this.setSelectionDirect(selection); + } + }, { + key: "setSelectionDirect", + value: function setSelectionDirect(selection) { + this.ensureOperation(); + this.input.maybeAbortComposition(); + if (!selection.eq(this.sel.range)) this.sel.setAndSignal(selection); + } - if (isList && head && isAtTopOfListItem(pm.doc, from, to, this) && from.path[from.path.length - 2] == 0) return false; - return (0, _transform.canWrap)(pm.doc, from, to, this); + // :: (any, ?string) + // Replace the editor's document. When `format` is given, it should + // be a [parsable format](#parse), and `value` should something in + // that format. If not, `value` should be a `Node`. + }, { + key: "setContent", + value: function setContent(value, format) { + if (format) value = (0, _parse.parseFrom)(this.schema, value, format); + this.setDoc(value); } - }; - for (var key in spec) { - command[key] = spec[key]; - }type.register("command", command); -} -wrapCommand(_model.BulletList, "BulletList", "bullet list", true, { - menuGroup: "block", menuRank: 40, - icon: { - width: 768, height: 896, - path: "M0 512h128v-128h-128v128zM0 256h128v-128h-128v128zM0 768h128v-128h-128v128zM256 512h512v-128h-512v128zM256 256h512v-128h-512v128zM256 768h512v-128h-512v128z" - }, - key: ["Alt-Right '*'", "Alt-Right '-'"] -}); + // :: (?string) → any + // Get the editor's content in a given format. When `format` is not + // given, a `Node` is returned. If it is given, it should be an + // existing [serialization format](#serialize). + }, { + key: "getContent", + value: function getContent(format) { + return format ? (0, _serialize.serializeTo)(this.doc, format) : this.doc; + } + }, { + key: "setDocInner", + value: function setDocInner(doc) { + if (doc.type != this.schema.nodes.doc) throw new Error("Trying to set a document with a different schema"); + // :: Node The current document. + this.doc = doc; + this.ranges = new _range.RangeStore(this); + this.history = new _history.History(this); + } -wrapCommand(_model.OrderedList, "OrderedList", "ordered list", true, { - menuGroup: "block", menuRank: 41, - icon: { - width: 768, height: 896, - path: "M320 512h448v-128h-448v128zM320 768h448v-128h-448v128zM320 128v128h448v-128h-448zM79 384h78v-256h-36l-85 23v50l43-2v185zM189 590c0-36-12-78-96-78-33 0-64 6-83 16l1 66c21-10 42-15 67-15s32 11 32 28c0 26-30 58-110 112v50h192v-67l-91 2c49-30 87-66 87-113l1-1z" - }, - key: "Alt-Right '1'" -}); + // :: (Node, ?Selection) + // Set the editor's content, and optionally include a new selection. + }, { + key: "setDoc", + value: function setDoc(doc, sel) { + if (!sel) sel = (0, _selection2.findSelectionAtStart)(doc); + // :: (doc: Node, selection: Selection) #path=ProseMirror#events#beforeSetDoc + // Fired when [`setDoc`](#ProseMirror.setDoc) is called, before + // the document is actually updated. + this.signal("beforeSetDoc", doc, sel); + this.ensureOperation(); + this.setDocInner(doc); + this.sel.set(sel, true); + // :: (doc: Node, selection: Selection) #path=ProseMirror#events#setDoc + // Fired when [`setDoc`](#ProseMirror.setDoc) is called, after + // the document is updated. + this.signal("setDoc", doc, sel); + } + }, { + key: "updateDoc", + value: function updateDoc(doc, mapping, selection) { + this.ensureOperation(); + this.input.maybeAbortComposition(); + this.ranges.transform(mapping); + this.doc = doc; + this.sel.setAndSignal(selection || this.sel.range.map(doc, mapping)); + // :: () #path=ProseMirror#events#change + // Fired when the document has changed. See + // [`setDoc`](#ProseMirror.event_setDoc) and + // [`transform`](#ProseMirror.event_transform) for more specific + // change-related events. + this.signal("change"); + } -wrapCommand(_model.BlockQuote, "BlockQuote", "block quote", false, { - menuGroup: "block", menuRank: 45, - icon: { - width: 640, height: 896, - path: "M0 448v256h256v-256h-128c0 0 0-128 128-128v-128c0 0-256 0-256 256zM640 320v-128c0 0-256 0-256 256v256h256v-256h-128c0 0 0-128 128-128z" - }, - key: ["Alt-Right '>'", "Alt-Right '\"'"] -}); + // :: EditorTransform + // Create an editor- and selection-aware `Transform` for this editor. + }, { + key: "apply", -_options.defaultRegistry.register("command", { - name: "newlineInCode", - label: "Insert newline", - run: function run(pm) { - var _pm$selection16 = pm.selection; - var from = _pm$selection16.from; - var to = _pm$selection16.to; - var node = _pm$selection16.node;var block = undefined; - if (!node && _model.Pos.samePath(from.path, to.path) && (block = pm.doc.path(from.path)).type.isCode && to.offset < block.size) return pm.tr.typeText("\n").apply(andScroll);else return false; - }, - key: "Enter(10)" -}); + // :: (Transform, ?Object) → ?Transform + // Apply a transformation (which you might want to create with the + // [`tr` getter](#ProseMirror.tr)) to the document in the editor. + // The following options are supported: + // + // **`selection`**`: ?Selection` + // : A new selection to set after the transformation is applied. + // + // **`scrollIntoView`**: ?bool + // : When true, scroll the selection into view on the next + // [redraw](#ProseMirror.flush). + // + // Returns the transform, or `false` if there were no steps in it. + value: function apply(transform) { + var options = arguments.length <= 1 || arguments[1] === undefined ? nullOptions : arguments[1]; -_options.defaultRegistry.register("command", { - name: "createParagraphNear", - label: "Create a paragraph near the selected leaf block", - run: function run(pm) { - var _pm$selection17 = pm.selection; - var from = _pm$selection17.from; - var to = _pm$selection17.to; - var node = _pm$selection17.node; + if (transform.doc == this.doc) return false; + if (transform.docs[0] != this.doc && (0, _model.findDiffStart)(transform.docs[0], this.doc)) throw new Error("Applying a transform that does not start with the current document"); - if (!node || !node.isBlock || node.type.contains) return false; - var side = from.offset ? to : from; - pm.tr.insert(side, pm.schema.defaultTextblockType().create()).apply(andScroll); - pm.setTextSelection(new _model.Pos(side.toPath(), 0)); - }, - key: "Enter(20)" -}); - -_options.defaultRegistry.register("command", { - name: "liftEmptyBlock", - label: "Move current block up", - run: function run(pm) { - var _pm$selection18 = pm.selection; - var head = _pm$selection18.head; - var empty = _pm$selection18.empty; + this.updateDoc(transform.doc, transform, options.selection); + // :: (Transform, Object) #path=ProseMirror#events#transform + // Signals that a (non-empty) transformation has been aplied to + // the editor. Passes the `Transform` and the options given to + // [`apply`](#ProseMirror.apply) as arguments to the handler. + this.signal("transform", transform, options); + if (options.scrollIntoView) this.scrollIntoView(); + return transform; + } - if (!empty || head.offset > 0 || pm.doc.path(head.path).size) return false; - if (head.depth > 1) { - var shorter = head.shorten(); - if (shorter.offset > 0 && shorter.offset < pm.doc.path(shorter.path).size - 1 && pm.tr.split(shorter).apply() !== false) return; + // :: (Pos, ?bool) + // Verify that the given position is valid in the current document, + // and throw an error otherwise. When `textblock` is true, the position + // must also fall within a textblock node. + }, { + key: "checkPos", + value: function checkPos(pos, textblock) { + if (!this.doc.isValidPos(pos, textblock)) throw new Error("Position " + pos + " is not valid in current document"); } - return pm.tr.lift(head).apply(andScroll); - }, - key: "Enter(30)" -}); + }, { + key: "ensureOperation", + value: function ensureOperation() { + return this.operation || this.startOperation(); + } + }, { + key: "startOperation", + value: function startOperation() { + var _this = this; -_options.defaultRegistry.register("command", { - name: "splitBlock", - label: "Split the current block", - run: function run(pm) { - var _pm$selection19 = pm.selection; - var from = _pm$selection19.from; - var to = _pm$selection19.to; - var node = _pm$selection19.node;var block = pm.doc.path(to.path); - if (node && node.isBlock) { - if (!from.offset) return false; - return pm.tr.split(from).apply(andScroll); - } else { - var type = to.offset == block.size ? pm.schema.defaultTextblockType() : null; - return pm.tr["delete"](from, to).split(from, 1, type).apply(andScroll); + this.sel.beforeStartOp(); + this.operation = new Operation(this); + if (!this.flushScheduled) { + (0, _dom.requestAnimationFrame)(function () { + _this.flushScheduled = false; + _this.flush(); + }); + this.flushScheduled = true; + } + return this.operation; } - }, - key: "Enter(60)" -}); -_model.ListItem.register("command", { - name: "splitListItem", - label: "Split the current list item", - run: function run(pm) { - var _pm$selection20 = pm.selection; - var from = _pm$selection20.from; - var to = _pm$selection20.to; - var node = _pm$selection20.node; + // :: () + // Flush any pending changes to the DOM. When the document, + // selection, or marked ranges in an editor change, the DOM isn't + // updated immediately, but rather scheduled to be updated the next + // time the browser redraws the screen. This method can be used to + // force this to happen immediately. It can be useful when you, for + // example, want to measure where on the screen a part of the + // document ends up, immediately after changing the document. + }, { + key: "flush", + value: function flush() { + if (!document.body.contains(this.wrapper) || !this.operation) return; + // :: () #path=ProseMirror#events#flushing + // Fired when the editor is about to [flush](#ProseMirror.flush) + // an update to the DOM. + this.signal("flushing"); + var op = this.operation; + if (!op) return; + this.operation = null; + this.accurateSelection = true; - if (node && node.isBlock || from.path.length < 2 || !_model.Pos.samePath(from.path, to.path)) return false; - var toParent = from.shorten(), - grandParent = pm.doc.path(toParent.path); - if (grandParent.type != this) return false; - var nextType = to.offset == grandParent.child(toParent.offset).size ? pm.schema.defaultTextblockType() : null; - return pm.tr["delete"](from, to).split(from, 2, nextType).apply(andScroll); - }, - key: "Enter(50)" -}); + var docChanged = op.doc != this.doc || this.dirtyNodes.size, + redrawn = false; + if (!this.input.composing && (docChanged || op.composingAtStart)) { + (0, _draw.redraw)(this, this.dirtyNodes, this.doc, op.doc); + this.dirtyNodes.clear(); + redrawn = true; + } -function alreadyHasBlockType(doc, from, to, type, attrs) { - var found = false; - if (!attrs) attrs = {}; - doc.nodesBetween(from, to || from, function (node) { - if (node.isTextblock) { - if (node.hasMarkup(type, attrs)) found = true; - return false; - } - }); - return found; -} + if ((redrawn || !op.sel.eq(this.sel.range)) && !this.input.composing) this.sel.toDOM(op.focus); -function blockTypeCommand(type, name, labelName, attrs, key) { - if (!attrs) attrs = {}; - type.register("command", { - name: name, - label: "Change to " + labelName, - run: function run(pm) { - var _pm$selection21 = pm.selection; - var from = _pm$selection21.from; - var to = _pm$selection21.to; + if (op.scrollIntoView !== false) (0, _selection2.scrollIntoView)(this, op.scrollIntoView); + // :: () #path=ProseMirror#events#draw + // Fired when the editor redrew its document in the DOM. + if (docChanged) this.signal("draw"); + // :: () #path=ProseMirror#events#flush + // Fired when the editor has finished + // [flushing](#ProseMirror.flush) an update to the DOM. If you + // need to respond to this with a DOM update of your own, use this + // event to read layout from the DOM, and + // [`flushed`](#ProseMirror.event_flushed) to update the DOM. + this.signal("flush"); + // :: () #path=ProseMirror#events#flushed + // Fired when the editor has finished + // [flushing](#ProseMirror.flush) an update to the DOM, after + // [`flush`](#ProseMirror.event_flush) has fired. + this.signal("flushed"); + this.accurateSelection = false; + } - return pm.tr.setBlockType(from, to, this, attrs).apply(andScroll); - }, - select: function select(pm) { - var _pm$selection22 = pm.selection; - var from = _pm$selection22.from; - var to = _pm$selection22.to; - var node = _pm$selection22.node; + // :: (Keymap, ?number) + // Add a [keymap](#Keymap) to the editor. Keymaps added in this way + // are queried before the [base keymap](#keymap). + // The `rank` parameter can be used to control when they are queried + // relative to other maps added like this. Maps with a lower rank + // get queried first. + }, { + key: "addKeymap", + value: function addKeymap(map) { + var rank = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; - if (node) return node.isTextblock && !node.hasMarkup(this, attrs);else return !alreadyHasBlockType(pm.doc, from, to, this, attrs); - }, - key: key - }); -} + (0, _utilSortedinsert2["default"])(this.input.keymaps, { map: map, rank: rank }, function (a, b) { + return a.rank - b.rank; + }); + } -blockTypeCommand(_model.Heading, "makeH1", "heading 1", { level: 1 }, "Mod-H '1'"); -blockTypeCommand(_model.Heading, "makeH2", "heading 2", { level: 2 }, "Mod-H '2'"); -blockTypeCommand(_model.Heading, "makeH3", "heading 3", { level: 3 }, "Mod-H '3'"); -blockTypeCommand(_model.Heading, "makeH4", "heading 4", { level: 4 }, "Mod-H '4'"); -blockTypeCommand(_model.Heading, "makeH5", "heading 5", { level: 5 }, "Mod-H '5'"); -blockTypeCommand(_model.Heading, "makeH6", "heading 6", { level: 6 }, "Mod-H '6'"); + // :: (union) + // Remove the given keymap, or the keymap with the given name, from + // the editor. + }, { + key: "removeKeymap", + value: function removeKeymap(map) { + var maps = this.input.keymaps; + for (var i = 0; i < maps.length; ++i) { + if (maps[i].map == map || maps[i].map.options.name == map) { + maps.splice(i, 1); + return true; + } + } + } + }, { + key: "markRange", -blockTypeCommand(_model.Paragraph, "makeParagraph", "paragraph", null, "Mod-P"); -blockTypeCommand(_model.CodeBlock, "makeCodeBlock", "code block", null, "Mod-\\"); + // :: (Pos, Pos, ?Object) → MarkedRange + // Create a marked range between the given positions. Marked ranges + // “track” the part of the document they point to—as the document + // changes, they are updated to move, grow, and shrink along with + // their content. + // + // `options` may be an object containing these properties: + // + // **`inclusiveLeft`**`: bool = false` + // : Whether the left side of the range is inclusive. When it is, + // content inserted at that point will become part of the range. + // When not, it will be outside of the range. + // + // **`inclusiveRight`**`: bool = false` + // : Whether the right side of the range is inclusive. + // + // **`removeWhenEmpty`**`: bool = true` + // : Whether the range should be forgotten when it becomes empty + // (because all of its content was deleted). + // + // **`className`**: string + // : A CSS class to add to the inline content that is part of this + // range. + value: function markRange(from, to, options) { + this.checkPos(from); + this.checkPos(to); + var range = new _range.MarkedRange(from, to, options); + this.ranges.addRange(range); + return range; + } -_model.HorizontalRule.register("command", { - name: "insertHorizontalRule", - label: "Insert horizontal rule", - run: function run(pm) { - return pm.tr.replaceSelection(this.create()).apply(andScroll); - }, - key: "Mod-Space" -}); + // :: (MarkedRange) + // Remove the given range from the editor. + }, { + key: "removeRange", + value: function removeRange(range) { + this.ranges.removeRange(range); + } -_options.defaultRegistry.register("command", { - name: "undo", - label: "Undo last change", - run: function run(pm) { - pm.scrollIntoView();return pm.history.undo(); - }, - select: function select(pm) { - return pm.history.canUndo(); - }, - menuGroup: "history", menuRank: 10, - icon: { - width: 1024, height: 1024, - path: "M761 1024c113-206 132-520-313-509v253l-384-384 384-384v248c534-13 594 472 313 775z" - }, - key: "Mod-Z" -}); - -_options.defaultRegistry.register("command", { - name: "redo", - label: "Redo last undone change", - run: function run(pm) { - pm.scrollIntoView();return pm.history.redo(); - }, - select: function select(pm) { - return pm.history.canRedo(); - }, - menuGroup: "history", menuRank: 20, - icon: { - width: 1024, height: 1024, - path: "M576 248v-248l384 384-384 384v-253c-446-10-427 303-313 509-280-303-221-789 313-775z" - }, - key: ["Mod-Y", "Shift-Mod-Z"] -}); - -_options.defaultRegistry.register("command", { - name: "textblockType", - label: "Change block type", - run: function run(pm, type) { - var _pm$selection23 = pm.selection; - var from = _pm$selection23.from; - var to = _pm$selection23.to; - - return pm.tr.setBlockType(from, to, type.type, type.attrs).apply(); - }, - select: function select(pm) { - var node = pm.selection.node; - - return !node || node.isTextblock; - }, - params: [{ label: "Type", type: "select", options: listTextblockTypes, "default": currentTextblockType, defaultLabel: "Type..." }], - display: "select", - menuGroup: "block", menuRank: 10 -}); - -_model.Paragraph.prototype.textblockTypes = [{ label: "Normal", rank: 10 }]; -_model.CodeBlock.prototype.textblockTypes = [{ label: "Code", rank: 20 }]; -_model.Heading.prototype.textblockTypes = [1, 2, 3, 4, 5, 6].map(function (n) { - return { label: "Head " + n, attrs: { level: n }, rank: 30 + n }; -}); - -function listTextblockTypes(pm) { - var cached = pm.schema.cached.textblockTypes; - if (cached) return cached; - - var found = []; - for (var _name3 in pm.schema.nodes) { - var type = pm.schema.nodes[_name3]; - if (!type.textblockTypes) continue; - for (var i = 0; i < type.textblockTypes.length; i++) { - var info = type.textblockTypes[i]; - (0, _utilSortedinsert2["default"])(found, { label: info.label, value: { type: type, attrs: info.attrs }, rank: info.rank }, function (a, b) { - return a.rank - b.rank; - }); - } - } - return pm.schema.cached.textblockTypes = found; -} - -function currentTextblockType(pm) { - var _pm$selection24 = pm.selection; - var from = _pm$selection24.from; - var to = _pm$selection24.to; - var node = _pm$selection24.node; - - if (!node || node.isInline) { - if (!_model.Pos.samePath(from.path, to.path)) return null; - node = pm.doc.path(from.path); - } else if (!node.isTextblock) { - return null; - } - var types = listTextblockTypes(pm); - for (var i = 0; i < types.length; i++) { - var tp = types[i], - val = tp.value; - if (node.hasMarkup(val.type, val.attrs)) return tp; - } -} - -function nodeAboveSelection(pm) { - var sel = pm.selection, - i = 0; - if (sel.node) return !!sel.from.depth && sel.from.shorten(); - for (; i < sel.head.depth && i < sel.anchor.depth; i++) if (sel.head.path[i] != sel.anchor.path[i]) break; - return i == 0 ? false : sel.head.shorten(i - 1); -} - -_options.defaultRegistry.register("command", { - name: "selectParentBlock", - label: "Select parent node", - run: function run(pm) { - var node = nodeAboveSelection(pm); - if (!node) return false; - pm.setNodeSelection(node); - }, - select: function select(pm) { - return nodeAboveSelection(pm); - }, - menuGroup: "block", menuRank: 90, - icon: { text: "⬚", style: "font-weight: bold; vertical-align: 20%" }, - key: "Esc" -}); - -function moveSelectionBlock(pm, dir) { - var _pm$selection25 = pm.selection; - var from = _pm$selection25.from; - var to = _pm$selection25.to; - var node = _pm$selection25.node; - - var side = dir > 0 ? to : from; - return (0, _selection.findSelectionFrom)(pm.doc, node && node.isBlock ? side : side.shorten(null, dir > 0 ? 1 : 0), dir); -} - -function selectBlockHorizontally(pm, dir) { - var _pm$selection26 = pm.selection; - var empty = _pm$selection26.empty; - var node = _pm$selection26.node; - var from = _pm$selection26.from; - var to = _pm$selection26.to; - - if (!empty && !node) return false; - - if (node && node.isInline) { - pm.setTextSelection(dir > 0 ? to : from); - return true; - } - - var parent = undefined; - if (!node && (parent = pm.doc.path(from.path)) && (dir > 0 ? from.offset < parent.size : from.offset)) { - var _ref = dir > 0 ? parent.chunkAfter(from.offset) : parent.chunkBefore(from.offset); - - var nextNode = _ref.node; - var start = _ref.start; - - if (nextNode.type.selectable && start == from.offset - (dir > 0 ? 0 : 1)) { - pm.setNodeSelection(dir < 0 ? from.move(-1) : from); - return true; - } - return false; - } - - var next = moveSelectionBlock(pm, dir); - if (next && (next instanceof _selection.NodeSelection || node)) { - pm.setSelectionDirect(next); - return true; - } - return false; -} - -_options.defaultRegistry.register("command", { - name: "selectBlockLeft", - label: "Move the selection onto or out of the block to the left", - run: function run(pm) { - var done = selectBlockHorizontally(pm, -1); - if (done) pm.scrollIntoView(); - return done; - }, - key: ["Left", "Mod-Left"] -}); - -_options.defaultRegistry.register("command", { - name: "selectBlockRight", - label: "Move the selection onto or out of the block to the right", - run: function run(pm) { - var done = selectBlockHorizontally(pm, 1); - if (done) pm.scrollIntoView(); - return done; - }, - key: ["Right", "Mod-Right"] -}); - -function selectBlockVertically(pm, dir) { - var _pm$selection27 = pm.selection; - var empty = _pm$selection27.empty; - var node = _pm$selection27.node; - var from = _pm$selection27.from; - var to = _pm$selection27.to; - - if (!empty && !node) return false; - - var leavingTextblock = true; - if (!node || node.isInline) leavingTextblock = (0, _selection.verticalMotionLeavesTextblock)(pm, dir > 0 ? to : from, dir); - - if (leavingTextblock) { - var next = moveSelectionBlock(pm, dir); - if (next && next instanceof _selection.NodeSelection) { - pm.setSelectionDirect(next); - if (!node) pm.sel.lastNonNodePos = from; - return true; - } - } - - if (!node) return false; - - if (node.isInline) { - (0, _selection.setDOMSelectionToPos)(pm, from); - return false; - } - - var last = pm.sel.lastNonNodePos; - var beyond = (0, _selection.findSelectionFrom)(pm.doc, dir < 0 ? from : to, dir); - if (last && beyond && _model.Pos.samePath(last.path, beyond.from.path)) { - (0, _selection.setDOMSelectionToPos)(pm, last); - return false; - } - pm.setSelectionDirect(beyond); - return true; -} - -_options.defaultRegistry.register("command", { - name: "selectBlockUp", - label: "Move the selection onto or out of the block above", - run: function run(pm) { - var done = selectBlockVertically(pm, -1); - if (done !== false) pm.scrollIntoView(); - return done; - }, - key: "Up" -}); - -_options.defaultRegistry.register("command", { - name: "selectBlockDown", - label: "Move the selection onto or out of the block below", - run: function run(pm) { - var done = selectBlockVertically(pm, 1); - if (done !== false) pm.scrollIntoView(); - return done; - }, - key: "Down" -}); - -},{"../dom":19,"../model":45,"../transform":57,"../util/sortedinsert":69,"./char":21,"./keys":29,"./options":31,"./selection":33}],23:[function(require,module,exports){ -"use strict"; - -var _dom = require("../dom"); - -(0, _dom.insertCSS)("\n\n.ProseMirror {\n border: 1px solid silver;\n position: relative;\n}\n\n.ProseMirror-content {\n padding: 4px 8px 4px 14px;\n white-space: pre-wrap;\n line-height: 1.2;\n}\n\n.ProseMirror-drop-target {\n position: absolute;\n width: 1px;\n background: #666;\n display: none;\n}\n\n.ProseMirror-content ul.tight p, .ProseMirror-content ol.tight p {\n margin: 0;\n}\n\n.ProseMirror-content ul, .ProseMirror-content ol {\n padding-left: 30px;\n cursor: default;\n}\n\n.ProseMirror-content blockquote {\n padding-left: 1em;\n border-left: 3px solid #eee;\n margin-left: 0; margin-right: 0;\n}\n\n.ProseMirror-content pre {\n white-space: pre-wrap;\n}\n\n.ProseMirror-selectednode {\n outline: 2px solid #8cf;\n}\n\n.ProseMirror-content p:first-child,\n.ProseMirror-content h1:first-child,\n.ProseMirror-content h2:first-child,\n.ProseMirror-content h3:first-child,\n.ProseMirror-content h4:first-child,\n.ProseMirror-content h5:first-child,\n.ProseMirror-content h6:first-child {\n margin-top: .3em;\n}\n\n/* Add space around the hr to make clicking it easier */\n\n.ProseMirror-content hr {\n position: relative;\n height: 6px;\n border: none;\n}\n\n.ProseMirror-content hr:after {\n content: \"\";\n position: absolute;\n left: 10px;\n right: 10px;\n top: 2px;\n border-top: 2px solid silver;\n}\n\n.ProseMirror-content img {\n cursor: default;\n}\n\n/* Make sure li selections wrap around markers */\n\n.ProseMirror-content li {\n position: relative;\n pointer-events: none; /* Don't do weird stuff with marker clicks */\n}\n.ProseMirror-content li > * {\n pointer-events: auto;\n}\n\nli.ProseMirror-selectednode {\n outline: none;\n}\n\nli.ProseMirror-selectednode:after {\n content: \"\";\n position: absolute;\n left: -32px;\n right: -2px; top: -2px; bottom: -2px;\n border: 2px solid #8cf;\n pointer-events: none;\n}\n\n"); - -},{"../dom":19}],24:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.applyDOMChange = applyDOMChange; -exports.textContext = textContext; -exports.textInContext = textInContext; - -var _model = require("../model"); - -var _parseDom = require("../parse/dom"); - -var _transformTree = require("../transform/tree"); - -var _selection = require("./selection"); - -function isAtEnd(node, pos, depth) { - for (var i = depth || 0; i < pos.path.length; i++) { - var n = pos.path[depth]; - if (n < node.size - 1) return false; - node = node.child(n); - } - return pos.offset == node.size; -} -function isAtStart(pos, depth) { - if (pos.offset > 0) return false; - for (var i = depth || 0; i < pos.path.length; i++) { - if (pos.path[depth] > 0) return false; - }return true; -} - -function parseNearSelection(pm) { - var dom = pm.content, - node = pm.doc; - var _pm$selection = pm.selection; - var from = _pm$selection.from; - var to = _pm$selection.to; - - for (var depth = 0;; depth++) { - var toNode = node.child(to.path[depth]); - var fromStart = isAtStart(from, depth + 1); - var toEnd = isAtEnd(toNode, to, depth + 1); - if (fromStart || toEnd || from.path[depth] != to.path[depth] || toNode.isTextblock) { - var startOffset = depth == from.depth ? from.offset : from.path[depth]; - if (fromStart && startOffset > 0) startOffset--; - var endOffset = depth == to.depth ? to.offset : to.path[depth] + 1; - if (toEnd && endOffset < node.size - 1) endOffset++; - var parsed = (0, _parseDom.fromDOM)(pm.schema, dom, { topNode: node.copy(), - from: startOffset, - to: dom.childNodes.length - (node.size - endOffset) }); - parsed = parsed.copy(node.content.slice(0, startOffset).append(parsed.content).append(node.content.slice(endOffset))); - for (var i = depth - 1; i >= 0; i--) { - var wrap = pm.doc.path(from.path.slice(0, i)); - parsed = wrap.replace(from.path[i], parsed); - } - return parsed; - } - node = toNode; - dom = (0, _selection.findByPath)(dom, from.path[depth], false); - } -} - -function applyDOMChange(pm) { - var updated = parseNearSelection(pm); - var changeStart = (0, _model.findDiffStart)(pm.doc.content, updated.content); - if (changeStart) { - var changeEnd = findDiffEndConstrained(pm.doc.content, updated.content, changeStart); - // Mark nodes touched by this change as 'to be redrawn' - pm.markRangeDirty(pm.doc.siblingRange(changeStart, changeEnd.a)); - - pm.tr.replace(changeStart, changeEnd.a, updated, changeStart, changeEnd.b).apply(); - return true; - } else { - return false; - } -} - -function offsetBy(first, second, pos) { - var same = (0, _transformTree.samePathDepth)(first, second); - var firstEnd = same == first.depth, - secondEnd = same == second.depth; - var off = (secondEnd ? second.offset : second.path[same]) - (firstEnd ? first.offset : first.path[same]); - var shorter = firstEnd ? pos.move(off) : pos.shorten(same, off); - if (secondEnd) return shorter;else return shorter.extend(new _model.Pos(second.path.slice(same), second.offset)); -} - -function findDiffEndConstrained(a, b, start) { - var end = (0, _model.findDiffEnd)(a, b); - if (!end) return end; - if (end.a.cmp(start) < 0) return { a: start, b: offsetBy(end.a, start, end.b) }; - if (end.b.cmp(start) < 0) return { a: offsetBy(end.b, start, end.a), b: start }; - return end; -} - -// Text-only queries for composition events - -function textContext(data) { - var range = getSelection().getRangeAt(0); - var start = range.startContainer, - end = range.endContainer; - if (start == end && start.nodeType == 3) { - var value = start.nodeValue, - lead = range.startOffset, - _end = range.endOffset; - if (data && _end >= data.length && value.slice(_end - data.length, _end) == data) lead = _end - data.length; - return { inside: start, lead: lead, trail: value.length - _end }; - } - - var sizeBefore = null, - sizeAfter = null; - var before = start.childNodes[range.startOffset - 1] || nodeBefore(start); - while (before.lastChild) before = before.lastChild; - if (before && before.nodeType == 3) { - var value = before.nodeValue; - sizeBefore = value.length; - if (data && value.slice(value.length - data.length) == data) sizeBefore -= data.length; - } - var after = end.childNodes[range.endOffset] || nodeAfter(end); - while (after.firstChild) after = after.firstChild; - if (after && after.nodeType == 3) sizeAfter = after.nodeValue.length; - - return { before: before, sizeBefore: sizeBefore, - after: after, sizeAfter: sizeAfter }; -} - -function textInContext(context, deflt) { - if (context.inside) { - var _val = context.inside.nodeValue; - return _val.slice(context.lead, _val.length - context.trail); - } else { - var before = context.before, - after = context.after, - val = ""; - if (!before) return deflt; - if (before.nodeType == 3) val = before.nodeValue.slice(context.sizeBefore); - var scan = scanText(before, after); - if (scan == null) return deflt; - val += scan; - if (after && after.nodeType == 3) { - var valAfter = after.nodeValue; - val += valAfter.slice(0, valAfter.length - context.sizeAfter); - } - return val; - } -} - -function nodeAfter(node) { - for (;;) { - var next = node.nextSibling; - if (next) { - while (next.firstChild) next = next.firstChild; - return next; - } - if (!(node = node.parentElement)) return null; - } -} - -function nodeBefore(node) { - for (;;) { - var prev = node.previousSibling; - if (prev) { - while (prev.lastChild) prev = prev.lastChild; - return prev; - } - if (!(node = node.parentElement)) return null; - } -} - -function scanText(start, end) { - var text = "", - cur = nodeAfter(start); - for (;;) { - if (cur == end) return text; - if (!cur) return null; - if (cur.nodeType == 3) text += cur.nodeValue; - cur = cur.firstChild || nodeAfter(cur); - } -} - -},{"../model":45,"../parse/dom":50,"../transform/tree":65,"./selection":33}],25:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.draw = draw; -exports.redraw = redraw; - -var _model = require("../model"); - -var _serializeDom = require("../serialize/dom"); - -var _dom = require("../dom"); - -var _main = require("./main"); - -// FIXME clean up threading of path and offset, maybe remove from DOM renderer entirely - -function options(path, ranges) { - return { - onRender: function onRender(node, dom, offset) { - if (!node.isText && node.type.contains == null) { - dom.contentEditable = false; - if (node.isBlock) dom.setAttribute("pm-leaf", "true"); - } - if (node.isBlock && offset != null) dom.setAttribute("pm-offset", offset); - if (node.isTextblock) adjustTrailingHacks(dom, node); - - return dom; - }, - renderInlineFlat: function renderInlineFlat(node, dom, offset) { - ranges.advanceTo(new _model.Pos(path, offset)); - var end = new _model.Pos(path, offset + node.width); - var nextCut = ranges.nextChangeBefore(end); - - var inner = dom, - wrapped = undefined; - for (var i = 0; i < node.marks.length; i++) { - inner = inner.firstChild; - }if (dom.nodeType != 1) { - dom = (0, _dom.elt)("span", null, dom); - if (!nextCut) wrapped = dom; - } - if (!wrapped && (nextCut || ranges.current.length)) { - wrapped = inner == dom ? dom = (0, _dom.elt)("span", null, inner) : inner.parentNode.appendChild((0, _dom.elt)("span", null, inner)); - } - - dom.setAttribute("pm-offset", offset); - if (node.type.contains == null) dom.setAttribute("pm-leaf", node.isText ? node.width : "true"); - - var inlineOffset = 0; - while (nextCut) { - var size = nextCut - offset; - var split = splitSpan(wrapped, size); - if (ranges.current.length) split.className = ranges.current.join(" "); - split.setAttribute("pm-inner-offset", inlineOffset); - inlineOffset += size; - offset += size; - ranges.advanceTo(new _model.Pos(path, offset)); - if (!(nextCut = ranges.nextChangeBefore(end))) wrapped.setAttribute("pm-inner-offset", inlineOffset); - } - - if (ranges.current.length) wrapped.className = ranges.current.join(" "); - return dom; - }, - document: document, path: path - }; -} - -function splitSpan(span, at) { - var textNode = span.firstChild, - text = textNode.nodeValue; - var newNode = span.parentNode.insertBefore((0, _dom.elt)("span", null, text.slice(0, at)), span); - textNode.nodeValue = text.slice(at); - return newNode; -} - -function draw(pm, doc) { - pm.content.textContent = ""; - pm.content.appendChild((0, _serializeDom.toDOM)(doc, options([], pm.ranges.activeRangeTracker()))); -} - -function adjustTrailingHacks(dom, node) { - var needs = node.size == 0 || node.lastChild.type.isBR ? "br" : !node.lastChild.isText && node.lastChild.type.contains == null ? "text" : null; - var last = dom.lastChild; - var has = !last || last.nodeType != 1 || !last.hasAttribute("pm-ignore") ? null : last.nodeName == "BR" ? "br" : "text"; - if (needs != has) { - if (has) dom.removeChild(last); - if (needs) dom.appendChild(needs == "br" ? (0, _dom.elt)("br", { "pm-ignore": "trailing-break" }) : (0, _dom.elt)("span", { "pm-ignore": "cursor-text" }, "")); - } -} - -function findNodeIn(iter, node) { - var copy = iter.copy(); - for (var child = undefined; child = copy.next().value;) { - if (child == node) return child; - } -} - -function movePast(dom) { - var next = dom.nextSibling; - dom.parentNode.removeChild(dom); - return next; -} - -function redraw(pm, dirty, doc, prev) { - var opts = options([], pm.ranges.activeRangeTracker()); - - function scan(dom, node, prev) { - var iNode = node.iter(), - iPrev = prev.iter(), - pChild = iPrev.next().value; - var domPos = dom.firstChild; - - for (var child = undefined; child = iNode.next().value;) { - var offset = iNode.offset - child.width, - matching = undefined, - reuseDOM = undefined; - if (!node.isTextblock) opts.path.push(offset); - - if (pChild == child) { - matching = pChild; - } else if (matching = findNodeIn(iPrev, child)) { - while (pChild != matching) { - pChild = iPrev.next().value; - domPos = movePast(domPos); - } - } - - if (matching && !dirty.get(matching)) { - reuseDOM = true; - } else if (pChild && !child.isText && child.sameMarkup(pChild) && dirty.get(pChild) != _main.DIRTY_REDRAW) { - reuseDOM = true; - var contentNode = domPos; - for (;;) { - var first = contentNode.firstChild; - if (!first || !first.hasAttribute || first.hasAttribute("pm-ignore") || first.hasAttribute("pm-offset")) break; - contentNode = first; - } - scan(contentNode, child, pChild); - } else { - var rendered = (0, _serializeDom.renderNodeToDOM)(child, opts, offset); - dom.insertBefore(rendered, domPos); - reuseDOM = false; - } - - if (reuseDOM) { - domPos.setAttribute("pm-offset", offset); - domPos = domPos.nextSibling; - pChild = iPrev.next().value; - } - if (!node.isTextblock) opts.path.pop(); - } - - while (pChild) { - domPos = movePast(domPos); - pChild = iPrev.next().value; - } - if (node.isTextblock) adjustTrailingHacks(dom, node); - } - scan(pm.content, doc, prev); -} - -},{"../dom":19,"../model":45,"../serialize/dom":53,"./main":30}],26:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -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; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _transform = require("../transform"); - -var InvertedStep = function InvertedStep(step, version, id) { - _classCallCheck(this, InvertedStep); - - this.step = step; - this.version = version; - this.id = id; -}; - -var BranchRemapping = (function () { - function BranchRemapping(branch) { - _classCallCheck(this, BranchRemapping); - - this.branch = branch; - this.remap = new _transform.Remapping(); - this.version = branch.version; - this.mirrorBuffer = Object.create(null); - } - - _createClass(BranchRemapping, [{ - key: "moveToVersion", - value: function moveToVersion(version) { - while (this.version > version) this.addNextMap(); - } - }, { - key: "addNextMap", - value: function addNextMap() { - var found = this.branch.mirror[this.version]; - var mapOffset = this.branch.maps.length - (this.branch.version - this.version) - 1; - var id = this.remap.addToFront(this.branch.maps[mapOffset], this.mirrorBuffer[this.version]); - --this.version; - if (found != null) this.mirrorBuffer[found] = id; - return id; - } - }, { - key: "movePastStep", - value: function movePastStep(result) { - var id = this.addNextMap(); - if (result) this.remap.addToBack(result.map, id); - } - }]); - - return BranchRemapping; -})(); - -var workTime = 100, - pauseTime = 150; - -var CompressionWorker = (function () { - function CompressionWorker(doc, branch, callback) { - _classCallCheck(this, CompressionWorker); - - this.branch = branch; - this.callback = callback; - this.remap = new BranchRemapping(branch); - - this.doc = doc; - this.events = []; - this.maps = []; - this.version = this.startVersion = branch.version; - - this.i = branch.events.length; - this.timeout = null; - this.aborted = false; - } - - _createClass(CompressionWorker, [{ - key: "work", - value: function work() { - var _this = this; - - if (this.aborted) return; - - var endTime = Date.now() + workTime; - - for (;;) { - if (this.i == 0) return this.finish(); - var _event = this.branch.events[--this.i], - outEvent = []; - for (var j = _event.length - 1; j >= 0; j--) { - var _event$j = _event[j]; - var step = _event$j.step; - var stepVersion = _event$j.version; - var stepID = _event$j.id; - - this.remap.moveToVersion(stepVersion); - - var mappedStep = step.map(this.remap.remap); - if (mappedStep && isDelStep(step)) { - var extra = 0, - start = step.from; - while (j > 0) { - var next = _event[j - 1]; - if (next.version != stepVersion - 1 || !isDelStep(next.step) || start.cmp(next.step.to)) break; - extra += next.step.to.offset - next.step.from.offset; - start = next.step.from; - stepVersion--; - j--; - this.remap.addNextMap(); - } - if (extra > 0) { - var _start = mappedStep.from.move(-extra); - mappedStep = new _transform.Step("replace", _start, mappedStep.to, _start); - } - } - var result = mappedStep && mappedStep.apply(this.doc); - if (result) { - this.doc = result.doc; - this.maps.push(result.map.invert()); - outEvent.push(new InvertedStep(mappedStep, this.version, stepID)); - this.version--; - } - this.remap.movePastStep(result); - } - if (outEvent.length) { - outEvent.reverse(); - this.events.push(outEvent); - } - if (Date.now() > endTime) { - this.timeout = window.setTimeout(function () { - return _this.work(); - }, pauseTime); - return; - } - } - } - }, { - key: "finish", - value: function finish() { - if (this.aborted) return; - - this.events.reverse(); - this.maps.reverse(); - this.callback(this.maps.concat(this.branch.maps.slice(this.branch.maps.length - (this.branch.version - this.startVersion))), this.events); - } - }, { - key: "abort", - value: function abort() { - this.aborted = true; - window.clearTimeout(this.timeout); - } - }]); - - return CompressionWorker; -})(); - -function isDelStep(step) { - return step.type == "replace" && step.from.offset < step.to.offset && _model.Pos.samePath(step.from.path, step.to.path) && (!step.param || step.param.content.size == 0); -} - -var compressStepCount = 150; - -var Branch = (function () { - function Branch(maxDepth) { - _classCallCheck(this, Branch); - - this.maxDepth = maxDepth; - this.version = 0; - this.nextStepID = 1; - - this.maps = []; - this.mirror = Object.create(null); - this.events = []; - - this.stepsSinceCompress = 0; - this.compressing = null; - this.compressTimeout = null; - } - - _createClass(Branch, [{ - key: "clear", - value: function clear(force) { - if (force || !this.empty()) { - this.maps.length = this.events.length = this.stepsSinceCompress = 0; - this.mirror = Object.create(null); - this.abortCompression(); - } - } - }, { - key: "newEvent", - value: function newEvent() { - this.abortCompression(); - this.events.push([]); - while (this.events.length > this.maxDepth) this.events.shift(); - } - }, { - key: "addMap", - value: function addMap(map) { - if (!this.empty()) { - this.maps.push(map); - this.version++; - this.stepsSinceCompress++; - return true; - } - } - }, { - key: "empty", - value: function empty() { - return this.events.length == 0; - } - }, { - key: "addStep", - value: function addStep(step, map, id) { - this.addMap(map); - if (id == null) id = this.nextStepID++; - this.events[this.events.length - 1].push(new InvertedStep(step, this.version, id)); - } - }, { - key: "addTransform", - value: function addTransform(transform, ids) { - this.abortCompression(); - for (var i = 0; i < transform.steps.length; i++) { - var inverted = transform.steps[i].invert(transform.docs[i], transform.maps[i]); - this.addStep(inverted, transform.maps[i], ids && ids[i]); - } - } - }, { - key: "popEvent", - value: function popEvent(doc, allowCollapsing) { - this.abortCompression(); - var event = this.events.pop(); - if (!event) return null; - - var remap = new BranchRemapping(this), - collapsing = allowCollapsing; - var tr = new _transform.Transform(doc); - var ids = []; - - for (var i = event.length - 1; i >= 0; i--) { - var invertedStep = event[i], - step = invertedStep.step; - if (!collapsing || invertedStep.version != remap.version) { - collapsing = false; - remap.moveToVersion(invertedStep.version); - - step = step.map(remap.remap); - var result = step && tr.step(step); - if (result) { - ids.push(invertedStep.id); - if (this.addMap(result.map)) this.mirror[this.version] = invertedStep.version; - } - - if (i > 0) remap.movePastStep(result); - } else { - this.version--; - delete this.mirror[this.version]; - this.maps.pop(); - tr.step(step); - ids.push(invertedStep.id); - --remap.version; - } - } - if (this.empty()) this.clear(true); - return { transform: tr, ids: ids }; - } - }, { - key: "getVersion", - value: function getVersion() { - return { id: this.nextStepID, version: this.version }; - } + // :: (MarkType, ?bool, ?Object) + // Set (when `to` is true), unset (`to` is false), or toggle (`to` + // is null) the given mark type on the selection. When there is a + // non-empty selection, the marks of the selection are updated. When + // the selection is empty, the set of [active + // marks](#ProseMirror.activeMarks) is updated. }, { - key: "findVersion", - value: function findVersion(version) { - for (var i = this.events.length - 1; i >= 0; i--) { - var _event2 = this.events[i]; - for (var j = _event2.length - 1; j >= 0; j--) { - var step = _event2[j]; - if (step.id == version.id) return { event: i, step: j };else if (step.id < version.id) return { event: i, step: j + 1 }; - } + key: "setMark", + value: function setMark(type, to, attrs) { + var sel = this.selection; + if (sel.empty) { + var marks = this.activeMarks(); + if (to == null) to = !type.isInSet(marks); + if (to && !this.doc.path(sel.head.path).type.canContainMark(type)) return; + this.input.storedMarks = to ? type.create(attrs).addToSet(marks) : type.removeFromSet(marks); + // :: () #path=ProseMirror#events#activeMarkChange + // Fired when the set of [active marks](#ProseMirror.activeMarks) changes. + this.signal("activeMarkChange"); + } else { + if (to != null ? to : !this.doc.rangeHasMark(sel.from, sel.to, type)) this.apply(this.tr.addMark(sel.from, sel.to, type.create(attrs)));else this.apply(this.tr.removeMark(sel.from, sel.to, type)); } } - }, { - key: "rebased", - value: function rebased(newMaps, rebasedTransform, positions) { - if (this.empty()) return; - this.abortCompression(); - - var startVersion = this.version - positions.length; - - // Update and clean up the events - out: for (var i = this.events.length - 1; i >= 0; i--) { - var _event3 = this.events[i]; - for (var j = _event3.length - 1; j >= 0; j--) { - var step = _event3[j]; - if (step.version <= startVersion) break out; - var off = positions[step.version - startVersion - 1]; - if (off == -1) { - _event3.splice(j--, 1); - } else { - var inv = rebasedTransform.steps[off].invert(rebasedTransform.docs[off], rebasedTransform.maps[off]); - _event3[j] = new InvertedStep(inv, startVersion + newMaps.length + off + 1, step.id); - } - } - } - - // Sync the array of maps - if (this.maps.length > positions.length) this.maps = this.maps.slice(0, this.maps.length - positions.length).concat(newMaps).concat(rebasedTransform.maps);else this.maps = rebasedTransform.maps.slice(); - - this.version = startVersion + newMaps.length + rebasedTransform.maps.length; - this.stepsSinceCompress += newMaps.length + rebasedTransform.steps.length - positions.length; - } + // :: () → [Mark] + // Get the marks at the cursor. By default, this yields the marks + // associated with the content at the cursor, as per `Node.marksAt`. + // But `setMark` may have been used to change the set of active + // marks, in which case that set is returned. }, { - key: "abortCompression", - value: function abortCompression() { - if (this.compressing) { - this.compressing.abort(); - this.compressing = null; - } + key: "activeMarks", + value: function activeMarks() { + var head; + return this.input.storedMarks || ((head = this.selection.head) ? this.doc.marksAt(head) : []); } + + // :: () + // Give the editor focus. }, { - key: "needsCompression", - value: function needsCompression() { - return this.stepsSinceCompress > compressStepCount && !this.compressing; + key: "focus", + value: function focus() { + if (this.operation) this.operation.focus = true;else this.sel.toDOM(true); } - }, { - key: "startCompression", - value: function startCompression(doc) { - var _this2 = this; - this.compressing = new CompressionWorker(doc, this, function (maps, events) { - _this2.maps = maps; - _this2.events = events; - _this2.mirror = Object.create(null); - _this2.compressing = null; - _this2.stepsSinceCompress = 0; - }); - this.compressing.work(); + // :: () → bool + // Query whether the editor has focus. + }, { + key: "hasFocus", + value: function hasFocus() { + if (this.sel.range instanceof _selection2.NodeSelection) return document.activeElement == this.content;else return (0, _selection2.hasFocus)(this); } - }]); - - return Branch; -})(); - -var compressDelay = 750; - -var History = (function () { - function History(pm) { - var _this3 = this; - - _classCallCheck(this, History); - - this.pm = pm; - - this.done = new Branch(pm.options.historyDepth); - this.undone = new Branch(pm.options.historyDepth); - - this.lastAddedAt = 0; - this.ignoreTransform = false; - - this.allowCollapsing = true; - - pm.on("transform", function (transform, options) { - return _this3.recordTransform(transform, options); - }); - } - - _createClass(History, [{ - key: "recordTransform", - value: function recordTransform(transform, options) { - if (this.ignoreTransform) return; - - if (options.addToHistory == false) { - for (var i = 0; i < transform.maps.length; i++) { - var map = transform.maps[i]; - this.done.addMap(map); - this.undone.addMap(map); - } - } else { - this.undone.clear(); - var now = Date.now(); - if (now > this.lastAddedAt + this.pm.options.historyEventDelay) this.done.newEvent(); - this.done.addTransform(transform); - this.lastAddedAt = now; - } - this.maybeScheduleCompression(); - } + // :: () → Node + // Get the part of the document that falls within the selection. }, { - key: "undo", - value: function undo() { - return this.shift(this.done, this.undone); + key: "posAtCoords", + + // :: ({top: number, left: number}) → ?Pos + // If the given coordinates (which should be relative to the top + // left corner of the window—not the page) fall within the editable + // content, this method will return the document position that + // corresponds to those coordinates. + value: function posAtCoords(coords) { + return (0, _selection2.posAtCoords)(this, coords); } + + // :: (Pos) → {top: number, left: number, bottom: number} + // Find the screen coordinates (relative to top left corner of the + // window) of the given document position. }, { - key: "redo", - value: function redo() { - return this.shift(this.undone, this.done); + key: "coordsAtPos", + value: function coordsAtPos(pos) { + this.checkPos(pos); + return (0, _selection2.coordsAtPos)(this, pos); } + + // :: (?Pos) + // Scroll the given position, or the cursor position if `pos` isn't + // given, into view. }, { - key: "canUndo", - value: function canUndo() { - return this.done.events.length > 0; + key: "scrollIntoView", + value: function scrollIntoView() { + var pos = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + + if (pos) this.checkPos(pos); + this.ensureOperation(); + this.operation.scrollIntoView = pos; } + + // :: (string, ?[any]) → bool + // Execute the named [command](#Command). If the command takes + // parameters and they are not passed here, the user will be + // prompted for them. }, { - key: "canRedo", - value: function canRedo() { - return this.undone.events.length > 0; + key: "execCommand", + value: function execCommand(name, params) { + var cmd = this.commands[name]; + return !!(cmd && cmd.exec(this, params) !== false); } - }, { - key: "shift", - value: function shift(from, to) { - var event = from.popEvent(this.pm.doc, this.allowCollapsing); - if (!event) return false; - var transform = event.transform; - var ids = event.ids; - - this.ignoreTransform = true; - this.pm.apply(transform); - this.ignoreTransform = false; - if (!transform.steps.length) return this.shift(from, to); + // :: (string) → ?string + // Return the name of the key that is bound to the given command, if + // any. + }, { + key: "keyForCommand", + value: function keyForCommand(name) { + var cached = this.commandKeys[name]; + if (cached !== undefined) return cached; - if (to) { - to.newEvent(); - to.addTransform(transform, ids); + var cmd = this.commands[name], + keymap = this.baseKeymap; + if (!cmd) return this.commandKeys[name] = null; + var key = cmd.spec.key || (_dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); + if (key) { + key = (0, _keys.normalizeKeyName)(Array.isArray(key) ? key[0] : key); + var deflt = keymap.bindings[key]; + if (Array.isArray(deflt) ? deflt.indexOf(name) > -1 : deflt == name) return this.commandKeys[name] = key; } - this.lastAddedAt = 0; - - return true; + for (var _key in keymap.bindings) { + var bound = keymap.bindings[_key]; + if (Array.isArray(bound) ? bound.indexOf(name) > -1 : bound == name) return this.commandKeys[name] = _key; + } + return this.commandKeys[name] = null; } }, { - key: "getVersion", - value: function getVersion() { - return this.done.getVersion(); + key: "registry", + value: function registry(name, f) { + var _this2 = this; + + this.schema.registry(name, f); + this.options.registries.forEach(function (reg) { + var array = reg.registry[name]; + if (array) for (var i = 0; i < array.length; i++) f(array[i], _this2); + }); } }, { - key: "backToVersion", - value: function backToVersion(version) { - var found = this.done.findVersion(version); - if (!found) return false; - var event = this.done.events[found.event]; - var combined = this.done.events.slice(found.event + 1).reduce(function (comb, arr) { - return comb.concat(arr); - }, event.slice(found.step)); - this.done.events.length = found.event + ((event.length = found.step) ? 1 : 0); - this.done.events.push(combined); + key: "markRangeDirty", + value: function markRangeDirty(range) { + this.ensureOperation(); + var dirty = this.dirtyNodes; + var from = range.from, + to = range.to; + for (var depth = 0, node = this.doc;; depth++) { + var fromEnd = depth == from.depth, + toEnd = depth == to.depth; + if (!fromEnd && !toEnd && from.path[depth] == to.path[depth]) { + var child = node.child(from.path[depth]); + if (!dirty.has(child)) dirty.set(child, DIRTY_RESCAN); + node = child; + } else { + var _ret = (function () { + var start = fromEnd ? from.offset : from.path[depth]; + var end = toEnd ? to.offset : to.path[depth] + 1; + if (node.isTextblock) { + node.forEach(function (child, cStart, cEnd) { + if (cStart < end && cEnd > start) dirty.set(child, DIRTY_REDRAW); + }); + } else { + for (var i = node.iter(start, end), child = undefined; child = i.next().value;) { + dirty.set(child, DIRTY_REDRAW); + } + } + return "break"; + })(); - this.shift(this.done); + if (_ret === "break") break; + } + } } }, { - key: "rebased", - value: function rebased(newMaps, rebasedTransform, positions) { - this.done.rebased(newMaps, rebasedTransform, positions); - this.undone.rebased(newMaps, rebasedTransform, positions); - this.maybeScheduleCompression(); + key: "selection", + get: function get() { + if (!this.accurateSelection) this.ensureOperation(); + return this.sel.range; } }, { - key: "maybeScheduleCompression", - value: function maybeScheduleCompression() { - this.maybeScheduleCompressionForBranch(this.done); - this.maybeScheduleCompressionForBranch(this.undone); + key: "tr", + get: function get() { + return new EditorTransform(this); } }, { - key: "maybeScheduleCompressionForBranch", - value: function maybeScheduleCompressionForBranch(branch) { - var _this4 = this; + key: "baseKeymap", + get: function get() { + return this.options.keymap || this.defaultKeymap || (this.defaultKeymap = (0, _commands.defaultKeymap)(this)); + } + }, { + key: "selectedDoc", + get: function get() { + var sel = this.selection; + return this.doc.sliceBetween(sel.from, sel.to); + } - window.clearTimeout(branch.compressTimeout); - if (branch.needsCompression()) branch.compressTimeout = window.setTimeout(function () { - if (branch.needsCompression()) branch.startCompression(_this4.pm.doc); - }, compressDelay); + // :: () → string + // Get the text that falls within the selection. + }, { + key: "selectedText", + get: function get() { + return (0, _serializeText.toText)(this.selectedDoc); } }]); - return History; + return ProseMirror; })(); -exports.History = History; +exports.ProseMirror = ProseMirror; +var DIRTY_RESCAN = 1, + DIRTY_REDRAW = 2; -},{"../model":45,"../transform":57}],27:[function(require,module,exports){ -// !! This module implements the ProseMirror editor. It contains -// functionality related to editing, selection, and integration with -// the browser. `ProseMirror` is the class you'll want to instantiate -// and interact with when using the editor. +exports.DIRTY_RESCAN = DIRTY_RESCAN; +exports.DIRTY_REDRAW = DIRTY_REDRAW; +var nullOptions = {}; -"use strict"; +(0, _utilEvent.eventMixin)(ProseMirror); -Object.defineProperty(exports, "__esModule", { - value: true -}); +var Operation = function Operation(pm) { + _classCallCheck(this, Operation); -var _main = require("./main"); + this.doc = pm.doc; + this.sel = pm.sel.range; + this.scrollIntoView = false; + this.focus = false; + this.composingAtStart = !!pm.input.composing; +} -Object.defineProperty(exports, "ProseMirror", { - enumerable: true, - get: function get() { - return _main.ProseMirror; - } -}); +// ;; #toc=false A selection-aware extension of `Transform`. Use +// `ProseMirror.tr` to create an instance. +; -var _options = require("./options"); +var EditorTransform = (function (_Transform) { + _inherits(EditorTransform, _Transform); -Object.defineProperty(exports, "defineOption", { - enumerable: true, - get: function get() { - return _options.defineOption; - } -}); -Object.defineProperty(exports, "Registry", { - enumerable: true, - get: function get() { - return _options.Registry; - } -}); -Object.defineProperty(exports, "defaultRegistry", { - enumerable: true, - get: function get() { - return _options.defaultRegistry; + function EditorTransform(pm) { + _classCallCheck(this, EditorTransform); + + _get(Object.getPrototypeOf(EditorTransform.prototype), "constructor", this).call(this, pm.doc); + this.pm = pm; } -}); -var _selection = require("./selection"); + // :: (?Object) → ?EditorTransform + // Apply the transformation. Returns the transform, or `false` it is + // was empty. -Object.defineProperty(exports, "Range", { - enumerable: true, - get: function get() { - return _selection.Range; - } -}); + _createClass(EditorTransform, [{ + key: "apply", + value: function apply(options) { + return this.pm.apply(this, options); + } -var _keys = require("./keys"); + // :: Selection + // Get the editor's current selection, [mapped](#Selection.map) + // through the steps in this transform. + }, { + key: "replaceSelection", -Object.defineProperty(exports, "Keymap", { - enumerable: true, - get: function get() { - return _keys.Keymap; - } -}); -Object.defineProperty(exports, "keyName", { - enumerable: true, - get: function get() { - return _keys.keyName; - } -}); -Object.defineProperty(exports, "keyNames", { - enumerable: true, - get: function get() { - return _keys.keyNames; - } -}); + // :: (?Node, ?bool) → EditorTransform + // Replace the selection with the given node, or delete it if `node` + // is null. When `inheritMarks` is true and the node is an inline + // node, it inherits the marks from the place where it is inserted. + value: function replaceSelection(node, inheritMarks) { + var _selection = this.selection; + var empty = _selection.empty; + var from = _selection.from; + var to = _selection.to; + var selNode = _selection.node;var parent = undefined; + if (node && node.isInline && inheritMarks !== false) { + var marks = empty ? this.pm.input.storedMarks : this.doc.marksAt(from); + node = node.type.create(node.attrs, node.text, marks); + } -var _range = require("./range"); + if (selNode && selNode.isTextblock && node && node.isInline) { + // Putting inline stuff onto a selected textblock puts it inside + from = new _model.Pos(from.toPath(), 0); + to = new _model.Pos(from.path, selNode.size); + } else if (selNode) { + // This node can not simply be removed/replaced. Remove its parent as well + while (from.depth && from.offset == 0 && (parent = this.doc.path(from.path)) && from.offset == parent.size - 1 && !parent.type.canBeEmpty && !(node && parent.type.canContain(node))) { + from = from.shorten(); + to = to.shorten(null, 1); + } + } else if (node && node.isBlock && this.doc.path(from.path.slice(0, from.depth - 1)).type.canContain(node)) { + // Inserting a block node into a textblock. Try to insert it above by splitting the textblock + this["delete"](from, to); + var _parent = this.doc.path(from.path); + if (from.offset && from.offset != _parent.size) this.split(from); + return this.insert(from.shorten(null, from.offset ? 1 : 0), node); + } -Object.defineProperty(exports, "MarkedRange", { - enumerable: true, - get: function get() { - return _range.MarkedRange; - } -}); + if (node) return this.replaceWith(from, to, node);else return this["delete"](from, to); + } -var _commands = require("./commands"); + // :: () → EditorTransform + // Delete the selection. + }, { + key: "deleteSelection", + value: function deleteSelection() { + return this.replaceSelection(); + } + + // :: (string) → EditorTransform + // Replace the selection with a text node containing the given string. + }, { + key: "typeText", + value: function typeText(text) { + return this.replaceSelection(this.pm.schema.text(text), true); + } + }, { + key: "selection", + get: function get() { + return this.steps.length ? this.pm.selection.map(this) : this.pm.selection; + } + }]); -Object.defineProperty(exports, "defineCommand", { - enumerable: true, - get: function get() { - return _commands.defineCommand; - } -}); -Object.defineProperty(exports, "defineParamHandler", { - enumerable: true, - get: function get() { - return _commands.defineParamHandler; - } -}); -Object.defineProperty(exports, "Command", { - enumerable: true, - get: function get() { - return _commands.Command; - } -}); + return EditorTransform; +})(_transform.Transform); -},{"./commands":22,"./keys":29,"./main":30,"./options":31,"./range":32,"./selection":33}],28:[function(require,module,exports){ +},{"../dom":1,"../model":27,"../parse":33,"../parse/text":34,"../serialize":36,"../serialize/text":37,"../transform":39,"../util/event":49,"../util/map":50,"../util/sortedinsert":51,"./commands":4,"./css":5,"./draw":7,"./history":8,"./input":10,"./keys":11,"./options":13,"./range":14,"./selection":15}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3888,7 +3845,10 @@ var _createClass = (function () { }; })(); -exports.dispatchKey = dispatchKey; +exports.defineOption = defineOption; +exports.parseOptions = parseOptions; +exports.initOptions = initOptions; +exports.setOption = setOption; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -3898,1613 +3858,1906 @@ function _classCallCheck(instance, Constructor) { var _model = require("../model"); -var _parseDom = require("../parse/dom"); +// ;; A registry is a namespace for [commands](#Commands), input +// rules, and so on. They provide a way to define commands and such in +// a scoped way, without having them show up on all your editors by +// default all of a sudden. See also the [`registries` +// option](#registries). -var _parseText = require("../parse/text"); +var Registry = (function () { + // :: (string) + // Create a new registry with the given name. -var _dom = require("../dom"); + function Registry(name) { + _classCallCheck(this, Registry); -var _serializeDom = require("../serialize/dom"); + this.name = name; + this.registry = Object.create(null); + } -var _serializeText = require("../serialize/text"); + // :: Registry + // The registry in which built-in commands and input rules are + // registered. The default content of the `registries` option. -var _parse = require("../parse"); + // :: (string, *) + // Register a new item in this registry. -var _keys = require("./keys"); + _createClass(Registry, [{ + key: "register", + value: function register(name, value) { + ;(this.registry[name] || (this.registry[name] = [])).push(value); + } + }]); -var _capturekeys = require("./capturekeys"); + return Registry; +})(); -var _domchange = require("./domchange"); +exports.Registry = Registry; +var defaultRegistry = new Registry("default"); -var _selection = require("./selection"); +exports.defaultRegistry = defaultRegistry; -var stopSeq = null; +var Option = function Option(defaultValue, update, updateOnInit) { + _classCallCheck(this, Option); -/** - * A collection of DOM events that occur within the editor, and callback functions - * to invoke when the event fires. - */ -var handlers = {}; + this.defaultValue = defaultValue; + this.update = update; + this.updateOnInit = updateOnInit !== false; +}; -var Input = (function () { - function Input(pm) { - var _this = this; +var options = Object.create(null); - _classCallCheck(this, Input); +// :: (string, any, (pm: ProseMirror, newValue: any, oldValue: any, init: bool), bool) +// Define a new option. The `update` handler will be called with the +// option's old and new value every time the option is +// [changed](#ProseMirror.setOption). When `updateOnInit` is true, it +// is also called on editor init, with null as the old value, and a fourth +// argument of true. - this.pm = pm; +function defineOption(name, defaultValue, update, updateOnInit) { + options[name] = new Option(defaultValue, update, updateOnInit); +} - this.keySeq = null; +// :: Schema #path=schema #kind=option +// The [schema](#Schema) that the editor's document should use. +defineOption("schema", _model.defaultSchema, false); - // When the user is creating a composed character, - // this is set to a Composing instance. - this.composing = null; - this.shiftKey = this.updatingComposition = false; - this.skipInput = 0; +// :: any #path=doc #kind=option +// The starting document. Usually a `Node`, but can be in another +// format when the `docFormat` option is also specified. +defineOption("doc", null, function (pm, value) { + return pm.setDoc(value); +}, false); - this.draggingFrom = false; +// :: ?string #path=docFormat #kind=option +// The format in which the `doc` option is given. Defaults to `null` +// (a raw `Node`). +defineOption("docFormat", null); - this.keymaps = []; - this.defaultKeymap = null; +// :: ?union #path=place #kind=option +// Determines the placement of the editor in the page. When `null`, +// the editor is not placed. When a DOM node is given, the editor is +// appended to that node. When a function is given, it is called +// with the editor's wrapping DOM node, and is expected to place it +// into the document. +defineOption("place", null); - this.storedMarks = null; +// :: Keymap #path=keymap #kind=option +// The base [keymap](#Keymap). When not given, a default keymap is +// synthesized from the default key bindings provided by the +// [commands](#Command) that are in scope for the editor. +defineOption("keymap", null); - this.dropTarget = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": "ProseMirror-drop-target" })); +// :: [Registry] +// The set of [registries](#Registry) the editor should load items +// from. +defineOption("registries", [defaultRegistry], false); - var _loop = function _loop(_event) { - var handler = handlers[_event]; - pm.content.addEventListener(_event, function (e) { - return handler(pm, e); - }); - }; +// :: number #path=historyDepth #kind=option +// The amount of history events that are collected before the oldest +// events are discarded. Defaults to 100. +defineOption("historyDepth", 100); - for (var _event in handlers) { - _loop(_event); - } +// :: number #path=historyEventDelay #kind=option +// The amount of milliseconds that must pass between changes to +// start a new history event. Defaults to 500. +defineOption("historyEventDelay", 500); - pm.on("selectionChange", function () { - return _this.storedMarks = null; - }); - } +// :: string #path=commandParamHandler #kind=option +// The name of the handler used to prompt the user for [command +// parameters](#CommandParam). Only relevant when multiple such +// handlers are loaded, and you want to choose between them. +defineOption("commandParamHandler", "default"); - /** - * Dispatch a key press to the internal keymaps, which will override the default - * DOM behavior. - * - * @param {ProseMirror} pm The editor instance. - * @param {string} name The name of the key pressed. - * @param {KeyboardEvent} e - * @return {string} If the key name has a mapping and the callback is invoked ("handled"), - * if the key name needs to be combined in sequence with the next key ("multi"), - * if there is no mapping ("nothing"). - */ +// :: ?string #path=label #kind=option +// The label of the editor. When set, the editable DOM node gets an +// `aria-label` attribute with this value. +defineOption("label", null); - _createClass(Input, [{ - key: "maybeAbortComposition", - value: function maybeAbortComposition() { - if (this.composing && !this.updatingComposition) { - if (this.composing.finished) { - finishComposing(this.pm); - } else { - // Toggle selection to force end of composition - this.composing = null; - this.skipInput++; - var sel = getSelection(); - if (sel.rangeCount) { - var range = sel.getRangeAt(0); - sel.removeAllRanges(); - sel.addRange(range); - } - } - return true; +function parseOptions(obj) { + var result = Object.create(null); + var given = obj ? [obj].concat(obj.use || []) : []; + outer: for (var opt in options) { + for (var i = 0; i < given.length; i++) { + if (opt in given[i]) { + result[opt] = given[i][opt]; + continue outer; } } - }]); - - return Input; -})(); - -exports.Input = Input; - -function dispatchKey(pm, name, e) { - var seq = pm.input.keySeq; - // If the previous key should be used in sequence with this one, modify the name accordingly. - if (seq) { - if ((0, _keys.isModifierKey)(name)) return true; - clearTimeout(stopSeq); - stopSeq = setTimeout(function () { - if (pm.input.keySeq == seq) pm.input.keySeq = null; - }, 50); - name = seq + " " + name; + result[opt] = options[opt].defaultValue; } + return result; +} - var handle = function handle(bound) { - if (bound === false) return "nothing"; - if (bound == "...") return "multi"; - if (bound == null) return false; - - var result = false; - if (Array.isArray(bound)) { - for (var i = 0; result === false && i < bound.length; i++) { - result = handle(bound[i]); - } - } else if (typeof bound == "string") { - result = pm.execCommand(bound); - } else { - result = bound(pm); - } - return result == false ? false : "handled"; - }; - - var result = undefined; - for (var i = 0; !result && i < pm.input.keymaps.length; i++) { - result = handle(pm.input.keymaps[i].map.lookup(name, pm)); - }if (!result) result = handle(pm.baseKeymap.lookup(name, pm)) || handle(_capturekeys.captureKeys.lookup(name)); - - // If the key should be used in sequence with the next key, store the keyname internally. - if (result == "multi") pm.input.keySeq = name; - - if (result == "handled" || result == "multi") e.preventDefault(); - - if (seq && !result && /\'$/.test(name)) { - e.preventDefault(); - return true; +function initOptions(pm) { + for (var opt in options) { + var desc = options[opt]; + if (desc.update && desc.updateOnInit) desc.update(pm, pm.options[opt], null, true); } - return !!result; } -handlers.keydown = function (pm, e) { - if (e.keyCode == 16) pm.input.shiftKey = true; - if (pm.input.composing) return; - var name = (0, _keys.keyName)(e); - if (name && dispatchKey(pm, name, e)) return; - pm.sel.pollForUpdate(); -}; +function setOption(pm, name, value) { + var desc = options[name]; + if (desc.update === false) throw new Error("Option '" + name + "' can not be changed"); + var old = pm.options[name]; + pm.options[name] = value; + if (desc.update) desc.update(pm, value, old, false); +} + +},{"../model":27}],14:[function(require,module,exports){ +"use strict"; -handlers.keyup = function (pm, e) { - if (e.keyCode == 16) pm.input.shiftKey = false; -}; +Object.defineProperty(exports, "__esModule", { + value: true +}); -function inputText(pm, range, text) { - if (range.empty && !text) return false; - var marks = pm.input.storedMarks || pm.doc.marksAt(range.from); - var tr = pm.tr; - tr.replaceWith(range.from, range.to, pm.schema.text(text, marks)).apply(); - pm.scrollIntoView(); - // :: () #path=ProseMirror#events#textInput - // Fired when the user types text into the editor. - pm.signal("textInput", text); -} +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; + }; +})(); -handlers.keypress = function (pm, e) { - if (pm.input.composing || !e.charCode || e.ctrlKey && !e.altKey || _dom.browser.mac && e.metaKey) return; - var ch = String.fromCharCode(e.charCode); - if (dispatchKey(pm, "'" + ch + "'", e)) return; - var sel = pm.selection; - if (sel.node && sel.node.contains == null) { - pm.tr["delete"](sel.from, sel.to).apply(); - sel = pm.selection; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } - inputText(pm, sel, ch); - e.preventDefault(); -}; +} -function selectClickedNode(pm, e) { - var pos = (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); - if (!pos) return pm.sel.pollForUpdate(); +var _utilEvent = require("../util/event"); - var _pm$selection = pm.selection; - var node = _pm$selection.node; - var from = _pm$selection.from; +// ;; A [marked range](#ProseMirror.markRange). Includes the methods +// from the [event mixin](#EventMixin). - if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { - if (from.depth == 0) return pm.sel.pollForUpdate(); - pos = from.shorten(); +var MarkedRange = (function () { + function MarkedRange(from, to, options) { + _classCallCheck(this, MarkedRange); + + this.options = options || {}; + // :: ?Pos + // The current start position of the range. Updated whenever the + // editor's document is changed. Set to `null` when the marked + // range is [removed](#ProseMirror.removeRange). + this.from = from; + // :: ?Pos + // The current end position of the range. Updated whenever the + // editor's document is changed. Set to `null` when the marked + // range is [removed](#ProseMirror.removeRange). + this.to = to; } - pm.setNodeSelection(pos); - pm.focus(); - e.preventDefault(); -} + _createClass(MarkedRange, [{ + key: "remove", + value: function remove() { + // :: (from: Pos, to: Pos) #path=MarkedRange#events#removed + // Signalled when the marked range is removed from the editor. + this.signal("removed", this.from, this.to.max(this.from)); + this.from = this.to = null; + } + }]); -var lastClick = 0; + return MarkedRange; +})(); -handlers.mousedown = function (pm, e) { - if (e.ctrlKey) return selectClickedNode(pm, e); +exports.MarkedRange = MarkedRange; - pm.sel.pollForUpdate(); +(0, _utilEvent.eventMixin)(MarkedRange); - var now = Date.now(), - multi = now - lastClick < 500; - lastClick = now; - if (pm.input.shiftKey || multi) return; +var RangeSorter = (function () { + function RangeSorter() { + _classCallCheck(this, RangeSorter); - var x = e.clientX, - y = e.clientY, - moved = false; - var up = function up() { - removeEventListener("mouseup", up); - removeEventListener("mousemove", move); - if ((0, _selection.handleNodeClick)(pm, e)) return; + this.sorted = []; + } - var pos = !moved && (0, _selection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }); - if (pos) { - pm.setNodeSelection(pos); - pm.focus(); - } else { - pm.sel.pollForUpdate(); + _createClass(RangeSorter, [{ + key: "find", + value: function find(at) { + var min = 0, + max = this.sorted.length; + for (;;) { + if (max < min + 10) { + for (var i = min; i < max; i++) { + if (this.sorted[i].at.cmp(at) >= 0) return i; + }return max; + } + var mid = min + max >> 1; + if (this.sorted[mid].at.cmp(at) > 0) max = mid;else min = mid; + } } - }; - var move = function move(e) { - if (!moved && (Math.abs(x - e.clientX) > 4 || Math.abs(y - e.clientY) > 4)) moved = true; - pm.sel.pollForUpdate(); - }; - addEventListener("mouseup", up); - addEventListener("mousemove", move); -}; - -handlers.touchdown = function (pm) { - pm.sel.pollForUpdate(); -}; + }, { + key: "insert", + value: function insert(obj) { + this.sorted.splice(this.find(obj.at), 0, obj); + } + }, { + key: "remove", + value: function remove(at, range) { + var pos = this.find(at); + for (var dist = 0;; dist++) { + var leftPos = pos - dist - 1, + rightPos = pos + dist; + if (leftPos >= 0 && this.sorted[leftPos].range == range) { + this.sorted.splice(leftPos, 1); + return; + } else if (rightPos < this.sorted.length && this.sorted[rightPos].range == range) { + this.sorted.splice(rightPos, 1); + return; + } + } + } + }, { + key: "resort", + value: function resort() { + for (var i = 0; i < this.sorted.length; i++) { + var cur = this.sorted[i]; + var at = cur.at = cur.type == "open" ? cur.range.from : cur.range.to; + var pos = i; + while (pos > 0 && this.sorted[pos - 1].at.cmp(at) > 0) { + this.sorted[pos] = this.sorted[pos - 1]; + this.sorted[--pos] = cur; + } + } + } + }]); -/** - * A class to track state while creating a composed character. - */ + return RangeSorter; +})(); -var Composing = function Composing(pm, data) { - _classCallCheck(this, Composing); +var RangeStore = (function () { + function RangeStore(pm) { + _classCallCheck(this, RangeStore); - this.finished = false; - this.context = (0, _domchange.textContext)(data); - this.data = data; - this.endData = null; - var range = pm.selection; - if (data) { - var path = range.head.path, - line = pm.doc.path(path).textContent; - var found = line.indexOf(data, range.head.offset - data.length); - if (found > -1 && found <= range.head.offset + data.length) range = new _selection.TextSelection(new _model.Pos(path, found), new _model.Pos(path, found + data.length)); + this.pm = pm; + this.ranges = []; + this.sorted = new RangeSorter(); } - this.range = range; -}; -handlers.compositionstart = function (pm, e) { - if (pm.input.maybeAbortComposition()) return; + _createClass(RangeStore, [{ + key: "addRange", + value: function addRange(range) { + this.ranges.push(range); + this.sorted.insert({ type: "open", at: range.from, range: range }); + this.sorted.insert({ type: "close", at: range.to, range: range }); + this.pm.markRangeDirty(range); + } + }, { + key: "removeRange", + value: function removeRange(range) { + var found = this.ranges.indexOf(range); + if (found > -1) { + this.ranges.splice(found, 1); + this.sorted.remove(range.from, range); + this.sorted.remove(range.to, range); + this.pm.markRangeDirty(range); + range.remove(); + } + } + }, { + key: "transform", + value: function transform(mapping) { + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + range.from = mapping.map(range.from, range.options.inclusiveLeft ? -1 : 1).pos; + range.to = mapping.map(range.to, range.options.inclusiveRight ? 1 : -1).pos; + var diff = range.from.cmp(range.to); + if (range.options.removeWhenEmpty !== false && diff >= 0) { + this.removeRange(range); + i--; + } else if (diff > 0) { + range.to = range.from; + } + } + this.sorted.resort(); + } + }, { + key: "activeRangeTracker", + value: function activeRangeTracker() { + return new RangeTracker(this.sorted.sorted); + } + }]); + + return RangeStore; +})(); + +exports.RangeStore = RangeStore; - pm.flush(); - pm.input.composing = new Composing(pm, e.data); - var above = pm.selection.head.shorten(); - pm.markRangeDirty({ from: above, to: above.move(1) }); -}; +var RangeTracker = (function () { + function RangeTracker(sorted) { + _classCallCheck(this, RangeTracker); -handlers.compositionupdate = function (pm, e) { - var info = pm.input.composing; - if (info && info.data != e.data) { - info.data = e.data; - pm.input.updatingComposition = true; - inputText(pm, info.range, info.data); - pm.input.updatingComposition = false; - info.range = new _selection.TextSelection(info.range.from, info.range.from.move(info.data.length)); + this.sorted = sorted; + this.pos = 0; + this.current = []; } -}; -handlers.compositionend = function (pm, e) { - var info = pm.input.composing; - if (info) { - pm.input.composing.finished = true; - pm.input.composing.endData = e.data; - setTimeout(function () { - if (pm.input.composing == info) finishComposing(pm); - }, 20); - } -}; + _createClass(RangeTracker, [{ + key: "advanceTo", + value: function advanceTo(pos) { + var next = undefined; + while (this.pos < this.sorted.length && (next = this.sorted[this.pos]).at.cmp(pos) <= 0) { + var className = next.range.options.className; + if (!className) continue; + if (next.type == "open") this.current.push(className);else this.current.splice(this.current.indexOf(className), 1); + this.pos++; + } + } + }, { + key: "nextChangeBefore", + value: function nextChangeBefore(pos) { + for (;;) { + if (this.pos == this.sorted.length) return null; + var next = this.sorted[this.pos]; + if (!next.range.options.className) this.pos++;else if (next.at.cmp(pos) >= 0) return null;else return next.at.offset; + } + } + }]); -function finishComposing(pm) { - var info = pm.input.composing; - var text = (0, _domchange.textInContext)(info.context, info.endData); - var range = (0, _selection.rangeFromDOMLoose)(pm); - pm.ensureOperation(); - pm.input.composing = null; - if (text != info.data) inputText(pm, info.range, text); - if (range && !range.eq(pm.sel.range)) pm.setSelectionDirect(range); -} + return RangeTracker; +})(); -handlers.input = function (pm) { - if (pm.input.skipInput) return --pm.input.skipInput; +},{"../util/event":49}],15:[function(require,module,exports){ +"use strict"; - if (pm.input.composing) { - if (pm.input.composing.finished) finishComposing(pm); - return; - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - pm.sel.stopPollingForUpdate(); - (0, _domchange.applyDOMChange)(pm); - pm.scrollIntoView(); +var _get = function get(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;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 { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } }; -var lastCopied = null; +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; + }; +})(); -handlers.copy = handlers.cut = function (pm, e) { - var _pm$selection2 = pm.selection; - var from = _pm$selection2.from; - var to = _pm$selection2.to; - var empty = _pm$selection2.empty; +exports.posFromDOM = posFromDOM; +exports.rangeFromDOMLoose = rangeFromDOMLoose; +exports.findByPath = findByPath; +exports.resolvePath = resolvePath; +exports.hasFocus = hasFocus; +exports.posAtCoords = posAtCoords; +exports.coordsAtPos = coordsAtPos; +exports.scrollIntoView = scrollIntoView; +exports.findSelectionFrom = findSelectionFrom; +exports.findSelectionNear = findSelectionNear; +exports.findSelectionAtStart = findSelectionAtStart; +exports.findSelectionAtEnd = findSelectionAtEnd; +exports.selectableNodeAbove = selectableNodeAbove; +exports.handleNodeClick = handleNodeClick; +exports.verticalMotionLeavesTextblock = verticalMotionLeavesTextblock; +exports.setDOMSelectionToPos = setDOMSelectionToPos; - if (empty) return; - var fragment = pm.selectedDoc; - lastCopied = { doc: pm.doc, from: from, to: to, - html: (0, _serializeDom.toHTML)(fragment), - text: (0, _serializeText.toText)(fragment) }; +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; +} - if (e.clipboardData) { - e.preventDefault(); - e.clipboardData.clearData(); - e.clipboardData.setData("text/html", lastCopied.html); - e.clipboardData.setData("text/plain", lastCopied.text); - if (e.type == "cut" && !empty) pm.tr["delete"](from, to).apply(); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } -}; +} -handlers.paste = function (pm, e) { - if (!e.clipboardData) return; - var sel = pm.selection; - var txt = e.clipboardData.getData("text/plain"); - var html = e.clipboardData.getData("text/html"); - if (html || txt) { - e.preventDefault(); - var doc = undefined, - from = undefined, - to = undefined; - if (pm.input.shiftKey && txt) { - doc = (0, _parseText.fromText)(pm.schema, txt); - } else if (lastCopied && (lastCopied.html == html || lastCopied.text == txt)) { - ;var _lastCopied = lastCopied; - doc = _lastCopied.doc; - from = _lastCopied.from; - to = _lastCopied.to; - } else if (html) { - doc = (0, _parseDom.fromHTML)(pm.schema, html); - } else { - doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); - } - pm.tr.replace(sel.from, sel.to, doc, from || (0, _selection.findSelectionAtStart)(doc).from, to || (0, _selection.findSelectionAtEnd)(doc).to).apply(); - pm.scrollIntoView(); - } -}; +var _model = require("../model"); -handlers.dragstart = function (pm, e) { - if (!e.dataTransfer) return; +var _dom = require("../dom"); - var fragment = pm.selectedDoc; +var SelectionState = (function () { + function SelectionState(pm) { + var _this = this; - e.dataTransfer.setData("text/html", (0, _serializeDom.toHTML)(fragment)); - e.dataTransfer.setData("text/plain", (0, _serializeText.toText)(fragment)); - pm.input.draggingFrom = true; -}; + _classCallCheck(this, SelectionState); -handlers.dragend = function (pm) { - return window.setTimeout(function () { - return pm.input.dragginFrom = false; - }, 50); -}; + this.pm = pm; -handlers.dragover = handlers.dragenter = function (pm, e) { - e.preventDefault(); - var cursorPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); - if (!cursorPos) return; - var coords = (0, _selection.coordsAtPos)(pm, cursorPos); - var rect = pm.wrapper.getBoundingClientRect(); - coords.top -= rect.top; - coords.right -= rect.left; - coords.bottom -= rect.top; - coords.left -= rect.left; - var target = pm.input.dropTarget; - target.style.display = "block"; - target.style.left = coords.left - 1 + "px"; - target.style.top = coords.top + "px"; - target.style.height = coords.bottom - coords.top + "px"; -}; + this.range = findSelectionAtStart(pm.doc); + this.lastNonNodePos = null; -handlers.dragleave = function (pm) { - return pm.input.dropTarget.style.display = ""; -}; + this.pollState = null; + this.pollTimeout = null; + this.lastAnchorNode = this.lastHeadNode = this.lastAnchorOffset = this.lastHeadOffset = null; + this.lastNode = null; -handlers.drop = function (pm, e) { - pm.input.dropTarget.style.display = ""; + pm.content.addEventListener("focus", function () { + return _this.receivedFocus(); + }); + } - if (!e.dataTransfer) return; + _createClass(SelectionState, [{ + key: "setAndSignal", + value: function setAndSignal(range, clearLast) { + this.set(range, clearLast); + // :: () #path=ProseMirror#events#selectionChange + // Indicates that the editor's selection has changed. + this.pm.signal("selectionChange"); + } + }, { + key: "set", + value: function set(range, clearLast) { + this.range = range; + if (!range.node) this.lastNonNodePos = null; + if (clearLast !== false) this.lastAnchorNode = null; + } + }, { + key: "pollForUpdate", + value: function pollForUpdate() { + var _this2 = this; - var html = undefined, - txt = undefined, - doc = undefined; - if (html = e.dataTransfer.getData("text/html")) doc = (0, _parseDom.fromHTML)(pm.schema, html, { document: document });else if (txt = e.dataTransfer.getData("text/plain")) doc = (0, _parse.parseFrom)(pm.schema, txt, (0, _parse.knownSource)("markdown") ? "markdown" : "text"); + if (this.pm.input.composing) return; + clearTimeout(this.pollTimeout); + this.pollState = "update"; + var n = 0, + check = function check() { + if (_this2.pm.input.composing) { + // Abort + } else if (_this2.pm.operation) { + _this2.pollTimeout = setTimeout(check, 20); + } else if (!_this2.readUpdate() && ++n == 1) { + _this2.pollTimeout = setTimeout(check, 50); + } else { + _this2.stopPollingForUpdate(); + } + }; + this.pollTimeout = setTimeout(check, 20); + } + }, { + key: "stopPollingForUpdate", + value: function stopPollingForUpdate() { + if (this.pollState == "update") { + this.pollState = null; + this.pollToSync(); + } + } + }, { + key: "domChanged", + value: function domChanged() { + var sel = getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastHeadNode || sel.focusOffset != this.lastHeadOffset; + } + }, { + key: "storeDOMState", + value: function storeDOMState() { + var sel = getSelection(); + this.lastAnchorNode = sel.anchorNode;this.lastAnchorOffset = sel.anchorOffset; + this.lastHeadNode = sel.focusNode;this.lastHeadOffset = sel.focusOffset; + } + }, { + key: "readUpdate", + value: function readUpdate() { + if (this.pm.input.composing || !hasFocus(this.pm) || !this.domChanged()) return false; - if (doc) { - e.preventDefault(); - var insertPos = pm.posAtCoords({ left: e.clientX, top: e.clientY }); - if (!insertPos) return; - var tr = pm.tr; - if (pm.input.draggingFrom && !e.ctrlKey) { - tr.deleteSelection(); - insertPos = tr.map(insertPos).pos; + var sel = getSelection(), + doc = this.pm.doc; + var anchor = posFromDOMInner(this.pm, sel.anchorNode, sel.anchorOffset); + var head = posFromDOMInner(this.pm, sel.focusNode, sel.focusOffset); + var newSel = findSelectionNear(doc, head, this.range.head && this.range.head.cmp(head) < 0 ? -1 : 1); + if (newSel instanceof TextSelection && doc.path(anchor.path).isTextblock) newSel = new TextSelection(anchor, newSel.head); + this.setAndSignal(newSel); + if (newSel instanceof NodeSelection || newSel.head.cmp(head) || newSel.anchor.cmp(anchor)) { + this.toDOM(); + } else { + this.clearNode(); + this.storeDOMState(); + } + return true; } - tr.replace(insertPos, insertPos, doc, (0, _selection.findSelectionAtStart)(doc).from, (0, _selection.findSelectionAtEnd)(doc).to).apply(); - pm.setTextSelection(insertPos, tr.map(insertPos).pos); - pm.focus(); - } -}; + }, { + key: "pollToSync", + value: function pollToSync() { + var _this3 = this; -handlers.focus = function (pm) { - (0, _dom.addClass)(pm.wrapper, "ProseMirror-focused"); - // :: () #path=ProseMirror#events#focus - // Fired when the editor gains focus. - pm.signal("focus"); -}; + if (this.pollState) return; + this.pollState = "sync"; + var sync = function sync() { + if (document.activeElement != _this3.pm.content) { + _this3.pollState = null; + } else { + if (!_this3.pm.operation && !_this3.pm.input.composing) _this3.syncDOM(); + _this3.pollTimeout = setTimeout(sync, 200); + } + }; + this.pollTimeout = setTimeout(sync, 200); + } + }, { + key: "syncDOM", + value: function syncDOM() { + if (!this.pm.input.composing && hasFocus(this.pm) && this.domChanged()) this.toDOM(); + } + }, { + key: "toDOM", + value: function toDOM(takeFocus) { + if (this.range instanceof NodeSelection) this.nodeToDOM(takeFocus);else this.rangeToDOM(takeFocus); + } + }, { + key: "nodeToDOM", + value: function nodeToDOM(takeFocus) { + window.getSelection().removeAllRanges(); + if (takeFocus) this.pm.content.focus(); + var pos = this.range.from, + node = this.range.node; + var dom = resolvePath(this.pm.content, pos.toPath()); + if (dom == this.lastNode) return; + this.clearNode(); + addNodeSelection(node, dom); + this.lastNode = dom; + } + }, { + key: "clearNode", + value: function clearNode() { + if (this.lastNode) { + clearNodeSelection(this.lastNode); + this.lastNode = null; + return true; + } + } + }, { + key: "rangeToDOM", + value: function rangeToDOM(takeFocus) { + var sel = window.getSelection(); + if (!this.clearNode() && !hasFocus(this.pm)) { + if (!takeFocus) return; + // See https://bugzilla.mozilla.org/show_bug.cgi?id=921444 + else if (_dom.browser.gecko) this.pm.content.focus(); + } + if (!this.domChanged()) return; -handlers.blur = function (pm) { - (0, _dom.rmClass)(pm.wrapper, "ProseMirror-focused"); - // :: () #path=ProseMirror#events#blur - // Fired when the editor loses focus. - pm.signal("blur"); -}; + var range = document.createRange(); + var content = this.pm.content; + var anchor = DOMFromPos(content, this.range.anchor); + var head = DOMFromPos(content, this.range.head); -},{"../dom":19,"../model":45,"../parse":51,"../parse/dom":50,"../parse/text":52,"../serialize/dom":53,"../serialize/text":55,"./capturekeys":20,"./domchange":24,"./keys":29,"./selection":33}],29:[function(require,module,exports){ -// From CodeMirror, should be factored into its own NPM module + if (sel.extend) { + range.setEnd(anchor.node, anchor.offset); + range.collapse(false); + } else { + if (this.range.anchor.cmp(this.range.head) > 0) { + var tmp = anchor;anchor = head;head = tmp; + } + range.setEnd(head.node, head.offset); + range.setStart(anchor.node, anchor.offset); + } + sel.removeAllRanges(); + sel.addRange(range); + if (sel.extend) sel.extend(head.node, head.offset); + this.storeDOMState(); + } + }, { + key: "receivedFocus", + value: function receivedFocus() { + if (!this.pollState) this.pollToSync(); + } + }, { + key: "beforeStartOp", + value: function beforeStartOp() { + if (this.pollState == "update" && this.readUpdate()) { + clearTimeout(this.pollTimeout); + this.stopPollingForUpdate(); + } else { + this.syncDOM(); + } + } + }]); -// declare_global: navigator -"use strict"; + return SelectionState; +})(); -Object.defineProperty(exports, "__esModule", { - value: true -}); +exports.SelectionState = SelectionState; -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; - }; -})(); +function clearNodeSelection(dom) { + dom.classList.remove("ProseMirror-selectednode"); +} -exports.keyName = keyName; -exports.isModifierKey = isModifierKey; -exports.normalizeKeyName = normalizeKeyName; +function addNodeSelection(_node, dom) { + dom.classList.add("ProseMirror-selectednode"); +} -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } +function windowRect() { + return { left: 0, right: window.innerWidth, + top: 0, bottom: window.innerHeight }; } -var mac = typeof navigator != "undefined" ? /Mac/.test(navigator.platform) : false; +// ;; An editor selection. Can be one of two selection types: +// `TextSelection` and `NodeSelection`. Both have the properties +// listed here, but also contain more information (such as the +// selected [node](#NodeSelection.node) or the +// [head](#TextSelection.head) and [anchor](#TextSelection.anchor)). -// :: Object -// A map from key codes to key names. -var keyNames = { - 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", - 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", - 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", - 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" +var Selection = function Selection() { + _classCallCheck(this, Selection); }; -exports.keyNames = keyNames; -// Number keys -for (var i = 0; i < 10; i++) { - keyNames[i + 48] = keyNames[i + 96] = String(i); -} // Alphabetic keys -for (var i = 65; i <= 90; i++) { - keyNames[i] = String.fromCharCode(i); -} // Function keys -for (var i = 1; i <= 12; i++) { - keyNames[i + 111] = keyNames[i + 63235] = "F" + i; -} // :: (KeyboardEvent) → ?string -// Find a name for the given keydown event. If the keycode in the -// event is not known, this will return `null`. Otherwise, it will -// return a string like `"Shift-Cmd-Ctrl-Alt-Home"`. The parts before -// the dashes give the modifiers (always in that order, if present), -// and the last word gives the key name, which one of the names in -// `keyNames`. -// -// The convention for keypress events is to use the pressed character -// between single quotes. Due to limitations in the browser API, -// keypress events can not have modifiers. +exports.Selection = Selection; -function keyName(event) { - var base = keyNames[event.keyCode], - name = base; - if (name == null || event.altGraphKey) return null; +// :: Pos #path=Selection.prototype.from +// The start of the selection. - if (event.altKey && base != "Alt") name = "Alt-" + name; - if (event.ctrlKey && base != "Ctrl") name = "Ctrl-" + name; - if (event.metaKey && base != "Cmd") name = "Cmd-" + name; - if (event.shiftKey && base != "Shift") name = "Shift-" + name; - return name; -} +// :: Pos #path=Selection.prototype.to +// The end of the selection. -// :: (string) → bool -// Test whether the given key name refers to a modifier key. +// :: bool #path=Selection.empty +// True if the selection is an empty text selection (head an anchor +// are the same). -function isModifierKey(name) { - name = /[^-]*$/.exec(name)[0]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; -} +// :: (other: Selection) → bool #path=Selection.eq +// Test whether the selection is the same as another selection. -// :: (string) → string -// Normalize a sloppy key name, which may have modifiers in the wrong -// order or use shorthands for modifiers, to a properly formed key -// name. Used to normalize names provided in keymaps. -// -// Note that the modifier `mod` is a shorthand for `Cmd` on Mac, and -// `Ctrl` on other platforms. +// :: (doc: Node, mapping: Mappable) → Selection #path=Selection.map +// Map this selection through a [mappable](#Mappable) thing. `doc` +// should be the new document, to which we are mapping. -function normalizeKeyName(name) { - var parts = name.split(/-(?!'?$)/), - result = parts[parts.length - 1]; - var alt = undefined, - ctrl = undefined, - shift = undefined, - cmd = undefined; - for (var i = 0; i < parts.length - 1; i++) { - var mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;else if (/^a(lt)?$/i.test(mod)) alt = true;else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;else if (/^s(hift)$/i.test(mod)) shift = true;else if (/^mod$/i.test(mod)) { - if (mac) cmd = true;else ctrl = true; - } else throw new Error("Unrecognized modifier name: " + mod); - } - if (alt) result = "Alt-" + result; - if (ctrl) result = "Ctrl-" + result; - if (cmd) result = "Cmd-" + result; - if (shift) result = "Shift-" + result; - return result; -} +// ;; #toc=false A text selection represents a classical editor +// selection, with a head (the moving side) and anchor (immobile +// side), both of which point into textblock nodes. It can be empty (a +// regular cursor position). -// ;; A keymap binds a set of [key names](#keyName) to commands names -// or functions. +var TextSelection = (function (_Selection) { + _inherits(TextSelection, _Selection); -var Keymap = (function () { - // :: (Object, ?Object) - // Construct a keymap using the bindings in `keys`, whose properties - // should be [key names](#keyName) or space-separated sequences of - // key names. In the second case, the binding will be for a - // multi-stroke key combination. - // - // When `options` has a property `call`, this will be a programmatic - // keymap, meaning that instead of looking keys up in its set of - // bindings, it will pass the key name to `options.call`, and use - // the return value of that calls as the resolved binding. - // - // `options.name` can be used to give the keymap a name, making it - // easier to [remove](#ProseMirror.removeKeymap) from an editor. + // :: (Pos, ?Pos) + // Construct a text selection. When `head` is not given, it defaults + // to `anchor`. - function Keymap(keys, options) { - _classCallCheck(this, Keymap); + function TextSelection(anchor, head) { + _classCallCheck(this, TextSelection); - this.options = options || {}; - this.bindings = Object.create(null); - if (keys) for (var keyname in keys) { - if (Object.prototype.hasOwnProperty.call(keys, keyname)) this.addBinding(keyname, keys[keyname]); - } + _get(Object.getPrototypeOf(TextSelection.prototype), "constructor", this).call(this); + // :: Pos + // The selection's immobile side (does not move when pressing + // shift-arrow). + this.anchor = anchor; + // :: Pos + // The selection's mobile side (the side that moves when pressing + // shift-arrow). + this.head = head || anchor; } - // :: (string, any) - // Add a binding for the given key or key sequence. + // ;; #toc=false A node selection is a selection that points at a + // single node. All nodes marked [selectable](#NodeType.selectable) + // can be the target of a node selection. In such an object, `from` + // and `to` point directly before and after the selected node. - _createClass(Keymap, [{ - key: "addBinding", - value: function addBinding(keyname, value) { - var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); - for (var i = 0; i < keys.length; i++) { - var _name = keys.slice(0, i + 1).join(" "); - var val = i == keys.length - 1 ? value : "..."; - var prev = this.bindings[_name]; - if (!prev) this.bindings[_name] = val;else if (prev != val) throw new Error("Inconsistent bindings for " + _name); - } + _createClass(TextSelection, [{ + key: "eq", + value: function eq(other) { + return other instanceof TextSelection && !other.head.cmp(this.head) && !other.anchor.cmp(this.anchor); } - - // :: (string) - // Remove the binding for the given key or key sequence. }, { - key: "removeBinding", - value: function removeBinding(keyname) { - var keys = keyname.split(/ +(?!\'$)/).map(normalizeKeyName); - for (var i = keys.length - 1; i >= 0; i--) { - var _name2 = keys.slice(0, i).join(" "); - var val = this.bindings[_name2]; - if (val == "..." && !this.unusedMulti(_name2)) break;else if (val) delete this.bindings[_name2]; - } + key: "map", + value: function map(doc, mapping) { + var head = mapping.map(this.head).pos; + if (!doc.path(head.path).isTextblock) return findSelectionNear(doc, head); + var anchor = mapping.map(this.anchor).pos; + return new TextSelection(doc.path(anchor.path).isTextblock ? anchor : head, head); } }, { - key: "unusedMulti", - value: function unusedMulti(name) { - for (var binding in this.bindings) { - if (binding.length > name && binding.indexOf(name) == 0 && binding.charAt(name.length) == " ") return false; - }return true; + key: "inverted", + get: function get() { + return this.anchor.cmp(this.head) > 0; } - - // :: (string, ?any) → any - // Looks up the given key or key sequence in this keymap. Returns - // the value the key is bound to (which may be undefined if it is - // not bound), or the string `"..."` if the key is a prefix of a - // multi-key sequence that is bound by this keymap. }, { - key: "lookup", - value: function lookup(key, context) { - return this.options.call ? this.options.call(key, context) : this.bindings[key]; + key: "from", + get: function get() { + return this.inverted ? this.head : this.anchor; + } + }, { + key: "to", + get: function get() { + return this.inverted ? this.anchor : this.head; + } + }, { + key: "empty", + get: function get() { + return this.anchor.cmp(this.head) == 0; } }]); - return Keymap; -})(); + return TextSelection; +})(Selection); -exports.Keymap = Keymap; +exports.TextSelection = TextSelection; -},{}],30:[function(require,module,exports){ -"use strict"; +var NodeSelection = (function (_Selection2) { + _inherits(NodeSelection, _Selection2); -Object.defineProperty(exports, "__esModule", { - value: true -}); + // :: (Pos, Pos, Node) + // Create a node selection. Does not verify the validity of its + // arguments. Use `ProseMirror.setNodeSelection` for an easier, + // error-checking way to create a node selection. -var _get = function get(_x4, _x5, _x6) { - var _again = true;_function: while (_again) { - var object = _x4, - property = _x5, - receiver = _x6;_again = false;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 { - _x4 = parent;_x5 = property;_x6 = receiver;_again = true;desc = parent = undefined;continue _function; + function NodeSelection(from, to, node) { + _classCallCheck(this, NodeSelection); + + _get(Object.getPrototypeOf(NodeSelection.prototype), "constructor", this).call(this); + this.from = from; + this.to = to; + // :: Node The selected node. + this.node = node; + } + + _createClass(NodeSelection, [{ + key: "eq", + value: function eq(other) { + return other instanceof NodeSelection && !this.from.cmp(other.from); + } + }, { + key: "map", + value: function map(doc, mapping) { + var from = mapping.map(this.from, 1).pos; + var to = mapping.map(this.to, -1).pos; + if (_model.Pos.samePath(from.path, to.path) && from.offset == to.offset - 1) { + var node = doc.nodeAfter(from); + if (node.type.selectable) return new NodeSelection(from, to, node); } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); + return findSelectionNear(doc, from); + } + }, { + key: "empty", + get: function get() { + return false; } + }]); + + return NodeSelection; +})(Selection); + +exports.NodeSelection = NodeSelection; + +function pathFromDOM(pm, node) { + var path = []; + for (; node != pm.content;) { + var attr = node.getAttribute("pm-offset"); + if (attr) path.unshift(+attr); + node = node.parentNode; } -}; + return path; +} + +function widthFromDOM(dom) { + var attr = dom.getAttribute("pm-leaf"); + return attr && attr != "true" ? +attr : 1; +} + +function posFromDOMInner(pm, dom, domOffset, loose) { + if (!loose && pm.operation && pm.doc != pm.operation.doc) throw new Error("Fetching a position from an outdated DOM structure"); + + var extraOffset = 0, + tag = undefined; + for (;;) { + var adjust = 0; + if (dom.nodeType == 3) { + extraOffset += domOffset; + } else if (dom.hasAttribute("pm-offset") || dom == pm.content) { + break; + } else if (tag = dom.getAttribute("pm-inner-offset")) { + extraOffset += +tag; + adjust = -1; + } else if (domOffset && domOffset == dom.childNodes.length) { + adjust = 1; + } + + var _parent = dom.parentNode; + domOffset = adjust < 0 ? 0 : Array.prototype.indexOf.call(_parent.childNodes, dom) + adjust; + dom = _parent; + } + + var path = pathFromDOM(pm, dom); + if (dom.hasAttribute("pm-leaf")) return _model.Pos.from(path, extraOffset + (domOffset ? 1 : 0)); -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); + var offset = 0; + for (var i = domOffset - 1; i >= 0; i--) { + var child = dom.childNodes[i]; + if (child.nodeType == 3) { + if (loose) extraOffset += child.nodeValue.length; + } else if (tag = child.getAttribute("pm-offset")) { + offset = +tag + widthFromDOM(child); + break; + } else if (loose && !child.hasAttribute("pm-ignore")) { + extraOffset += child.textContent.length; } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); + } + return new _model.Pos(path, offset + extraOffset); +} -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; +function posFromDOM(pm, node, offset) { + if (offset == null) { + offset = Array.prototype.indexOf.call(node.parentNode.childNodes, node); + node = node.parentNode; + } + return posFromDOMInner(pm, node, offset); } -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; +function rangeFromDOMLoose(pm) { + if (!hasFocus(pm)) return null; + var sel = getSelection(); + return new TextSelection(posFromDOMInner(pm, sel.anchorNode, sel.anchorOffset, true), posFromDOMInner(pm, sel.focusNode, sel.focusOffset, true)); } -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); +function findByPath(node, n, fromEnd) { + for (var ch = fromEnd ? node.lastChild : node.firstChild; ch; ch = fromEnd ? ch.previousSibling : ch.nextSibling) { + if (ch.nodeType != 1) continue; + var offset = ch.getAttribute("pm-offset"); + if (!offset) { + var found = findByPath(ch, n); + if (found) return found; + } else if (+offset == n) { + return ch; + } } } -require("./css"); - -var _model = require("../model"); - -var _transform = require("../transform"); - -var _utilSortedinsert = require("../util/sortedinsert"); - -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); +function resolvePath(parent, path) { + var node = parent; + for (var i = 0; i < path.length; i++) { + node = findByPath(node, path[i]); + if (!node) throw new Error("Failed to resolve path " + path.join("/")); + } + return node; +} -var _utilMap = require("../util/map"); +function findByOffset(node, offset, after) { + function search(node) { + for (var ch = node.firstChild, i = 0, attr = undefined; ch; ch = ch.nextSibling, i++) { + if (ch.nodeType != 1) continue; + if (attr = ch.getAttribute("pm-offset")) { + var diff = offset - +attr, + width = widthFromDOM(ch); + if (diff >= 0 && (after ? diff <= width : diff < width)) return { node: ch, offset: i, innerOffset: diff }; + } else { + var result = search(ch); + if (result) return result; + } + } + } + return search(node); +} -var _utilEvent = require("../util/event"); +function leafAt(node, offset) { + for (;;) { + var child = node.firstChild; + if (!child) return { node: node, offset: offset }; + if (child.nodeType != 1) return { node: child, offset: offset }; + if (child.hasAttribute("pm-inner-offset")) { + var nodeOffset = 0; + for (;;) { + var nextSib = child.nextSibling, + nextOffset = undefined; + if (!nextSib || (nextOffset = +nextSib.getAttribute("pm-inner-offset")) >= offset) break; + child = nextSib; + nodeOffset = nextOffset; + } + offset -= nodeOffset; + } + node = child; + } +} -var _dom = require("../dom"); +/** + * Get a DOM element at a given position in the document. + * + * @param {Node} parent The parent DOM node. + * @param {Pos} pos The position in the document. + * @return {Object} The DOM node and character offset inside the node. + */ +function DOMFromPos(parent, pos) { + var dom = resolvePath(parent, pos.path); + var found = findByOffset(dom, pos.offset, true), + inner = undefined; + if (!found) return { node: dom, offset: 0 }; + if (found.node.getAttribute("pm-leaf") == "true" || !(inner = leafAt(found.node, found.innerOffset))) return { node: found.node.parentNode, offset: found.offset + (found.innerOffset ? 1 : 0) };else return inner; +} -var _serializeText = require("../serialize/text"); +function hasFocus(pm) { + var sel = window.getSelection(); + return sel.rangeCount && (0, _dom.contains)(pm.content, sel.anchorNode); +} -require("../parse/text"); +/** + * Given an x,y position on the editor, get the position in the document. + * + * @param {ProseMirror} pm Editor instance. + * @param {Object} coords The x, y coordinates. + * @return {Pos} + */ +// FIXME fails on the space between lines +// FIXME reformulate as selectionAtCoords? So that it can't return null -var _parse = require("../parse"); +function posAtCoords(pm, coords) { + var element = document.elementFromPoint(coords.left, coords.top + 1); + if (!(0, _dom.contains)(pm.content, element)) return null; -var _serialize = require("../serialize"); + var offset = undefined; + if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) { + element = element.firstChild; + offset = offsetInTextNode(element, coords); + } else { + offset = offsetInElement(element, coords); + } -var _options = require("./options"); + return posFromDOM(pm, element, offset); +} -var _selection2 = require("./selection"); +function textRect(node, from, to) { + var range = document.createRange(); + range.setEnd(node, to); + range.setStart(node, from); + return range.getBoundingClientRect(); +} -var _draw = require("./draw"); +/** + * Given a position in the document model, get a bounding box of the character at + * that position, relative to the window. + * + * @param {ProseMirror} pm The editor instance. + * @param {Pos} pos + * @return {Object} The bounding box. + */ -var _input = require("./input"); +function coordsAtPos(pm, pos) { + var _DOMFromPos = DOMFromPos(pm.content, pos); -var _history = require("./history"); + var node = _DOMFromPos.node; + var offset = _DOMFromPos.offset; -var _commands = require("./commands"); + var side = undefined, + rect = undefined; + if (node.nodeType == 3) { + if (offset < node.nodeValue.length) { + rect = textRect(node, offset, offset + 1); + side = "left"; + } + if ((!rect || rect.left == rect.right) && offset) { + rect = textRect(node, offset - 1, offset); + side = "right"; + } + } else if (node.firstChild) { + if (offset < node.childNodes.length) { + var child = node.childNodes[offset]; + rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); + side = "left"; + } + if ((!rect || rect.left == rect.right) && offset) { + var child = node.childNodes[offset - 1]; + rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); + side = "right"; + } + } else { + rect = node.getBoundingClientRect(); + side = "left"; + } + var x = rect[side]; + return { top: rect.top, bottom: rect.bottom, left: x, right: x }; +} -var _range = require("./range"); +var scrollMargin = 5; -var _keys = require("./keys"); +function scrollIntoView(pm, pos) { + if (!pos) pos = pm.sel.range.head || pm.sel.range.from; + var coords = coordsAtPos(pm, pos); + for (var _parent2 = pm.content;; _parent2 = _parent2.parentNode) { + var atBody = _parent2 == document.body; + var rect = atBody ? windowRect() : _parent2.getBoundingClientRect(); + var moveX = 0, + moveY = 0; + if (coords.top < rect.top) moveY = -(rect.top - coords.top + scrollMargin);else if (coords.bottom > rect.bottom) moveY = coords.bottom - rect.bottom + scrollMargin; + if (coords.left < rect.left) moveX = -(rect.left - coords.left + scrollMargin);else if (coords.right > rect.right) moveX = coords.right - rect.right + scrollMargin; + if (moveX || moveY) { + if (atBody) window.scrollBy(moveX, moveY); + } else { + if (moveY) _parent2.scrollTop += moveY; + if (moveX) _parent2.scrollLeft += moveX; + } + if (atBody) break; + } +} -// ;; This is the class used to represent instances of the editor. A -// ProseMirror editor holds a [document](#Node) and a -// [selection](#Selection), and displays an editable surface -// representing that document in the browser document. -// -// Contains event methods (`on`, etc) from the [event -// mixin](#EventMixin). +function offsetInRects(coords, rects, strict) { + var y = coords.top; + var x = coords.left; -var ProseMirror = (function () { - // :: (Object) - // Construct a new editor from a set of [options](#edit_options) - // and, if it has a [`place`](#place) option, add it to the - // document. + var minY = 1e8, + minX = 1e8, + offset = 0; + for (var i = 0; i < rects.length; i++) { + var rect = rects[i]; + if (!rect || rect.top == rect.bottom) continue; + var dX = x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0; + if (dX > minX) continue; + if (dX < minX) { + minX = dX;minY = 1e8; + } + var dY = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0; + if (dY < minY) { + minY = dY; + offset = x < (rect.left + rect.right) / 2 ? i : i + 1; + } + } + if (strict && (minX || minY)) return null; + return offset; +} - function ProseMirror(opts) { - _classCallCheck(this, ProseMirror); +function offsetInTextNode(text, coords, strict) { + var len = text.nodeValue.length; + var range = document.createRange(); + var rects = []; + for (var i = 0; i < len; i++) { + range.setEnd(text, i + 1); + range.setStart(text, i); + rects.push(range.getBoundingClientRect()); + } + return offsetInRects(coords, rects, strict); +} - opts = this.options = (0, _options.parseOptions)(opts); - // :: Schema - // The schema for this editor's document. - this.schema = opts.schema; - if (opts.doc == null) opts.doc = this.schema.node("doc", null, [this.schema.node("paragraph")]); - // :: DOMNode - // The editable DOM node containing the document. - this.content = (0, _dom.elt)("div", { "class": "ProseMirror-content" }); - // :: DOMNode - // The outer DOM element of the editor. - this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror" }, this.content); - this.wrapper.ProseMirror = this; +function offsetInElement(element, coords) { + var rects = []; + for (var child = element.firstChild; child; child = child.nextSibling) { + if (child.getBoundingClientRect) rects.push(child.getBoundingClientRect());else rects.push(null); + } + return offsetInRects(coords, rects); +} - if (opts.place && opts.place.appendChild) opts.place.appendChild(this.wrapper);else if (opts.place) opts.place(this.wrapper); +function findSelectionIn(doc, path, offset, dir, text) { + var node = doc.path(path); + if (node.isTextblock) return new TextSelection(new _model.Pos(path, offset)); - this.setDocInner(opts.docFormat ? (0, _parse.parseFrom)(this.schema, opts.doc, opts.docFormat) : opts.doc); - (0, _draw.draw)(this, this.doc); - this.content.contentEditable = true; - if (opts.label) this.content.setAttribute("aria-label", opts.label); + for (var i = offset + (dir > 0 ? 0 : -1); dir > 0 ? i < node.size : i >= 0; i += dir) { + var child = node.child(i); + if (!text && child.type.contains == null && child.type.selectable) return new NodeSelection(new _model.Pos(path, i), new _model.Pos(path, i + 1), child); + path.push(i); + var inside = findSelectionIn(doc, path, dir < 0 ? child.size : 0, dir, text); + if (inside) return inside; + path.pop(); + } +} - // :: Object - // A namespace where modules can store references to themselves - // associated with this editor instance. - this.mod = Object.create(null); - this.operation = null; - this.dirtyNodes = new _utilMap.Map(); // Maps node object to 1 (re-scan content) or 2 (redraw entirely) - this.flushScheduled = false; +// FIXME we'll need some awareness of bidi motion when determining block start and end - this.sel = new _selection2.SelectionState(this); - this.accurateSelection = false; - this.input = new _input.Input(this); +function findSelectionFrom(doc, pos, dir, text) { + for (var path = pos.path.slice(), offset = pos.offset;;) { + var found = findSelectionIn(doc, path, offset, dir, text); + if (found) return found; + if (!path.length) break; + offset = path.pop() + (dir > 0 ? 1 : 0); + } +} - // :: Object - // The commands available in the editor. - this.commands = (0, _commands.initCommands)(this); - this.commandKeys = Object.create(null); +function findSelectionNear(doc, pos, bias, text) { + if (bias === undefined) bias = 1; - (0, _options.initOptions)(this); - } + var result = findSelectionFrom(doc, pos, bias, text) || findSelectionFrom(doc, pos, -bias, text); + if (!result) throw new Error("Searching for selection in invalid document " + doc); + return result; +} - // :: (string, any) - // Update the value of the given [option](#edit_options). +function findSelectionAtStart(node, path, text) { + if (path === undefined) path = []; - _createClass(ProseMirror, [{ - key: "setOption", - value: function setOption(name, value) { - (0, _options.setOption)(this, name, value); - } + return findSelectionIn(node, path.slice(), 0, 1, text); +} - // :: (string) → any - // Get the current value of the given [option](#edit_options). - }, { - key: "getOption", - value: function getOption(name) { - return this.options[name]; - } +function findSelectionAtEnd(node, path, text) { + if (path === undefined) path = []; - // :: Selection - // Get the current selection. - }, { - key: "setTextSelection", + return findSelectionIn(node, path.slice(), node.size, -1, text); +} - // :: (Pos, ?Pos) - // Set the selection to a [text selection](#TextSelection) from - // `anchor` to `head`, or, if `head` is null, a cursor selection at - // `anchor`. - value: function setTextSelection(anchor, head) { - this.setSelection(new _selection2.TextSelection(anchor, head)); - } +// ;; #path=NodeType #kind=class #noAnchor +// You can add several properties to [node types](#NodeType) to +// influence the way the editor interacts with them. - // :: (Pos) - // Set the selection to a node selection on the node after `pos`. - }, { - key: "setNodeSelection", - value: function setNodeSelection(pos) { - this.checkPos(pos, false); - var parent = this.doc.path(pos.path); - if (pos.offset >= parent.size) throw new Error("Trying to set a node selection at the end of a node"); - var node = parent.child(pos.offset); - if (!node.type.selectable) throw new Error("Trying to select a non-selectable node"); - this.input.maybeAbortComposition(); - this.sel.setAndSignal(new _selection2.NodeSelection(pos, pos.move(1), node)); - } +// :: (node: Node, path: [number], dom: DOMNode, coords: {left: number, top: number}) → ?Pos +// #path=NodeType.prototype.countCoordsAsChild +// Specifies that, if this node is clicked, a child node might +// actually be meant. This is used to, for example, make clicking a +// list marker (which, in the DOM, is part of the list node) select +// the list item it belongs to. Should return null if the given +// coordinates don't refer to a child node, or the [position](#Pos) +// before thechild otherwise. - // :: (Selection) - // Set the selection to the given selection object. - }, { - key: "setSelection", - value: function setSelection(selection) { - if (selection instanceof _selection2.TextSelection) { - this.checkPos(selection.head, true); - if (!selection.empty) this.checkPos(selection.anchor, true); - } else { - this.checkPos(selection.to, false); +function selectableNodeAbove(pm, dom, coords, liberal) { + for (; dom && dom != pm.content; dom = dom.parentNode) { + if (dom.hasAttribute("pm-offset")) { + var path = pathFromDOM(pm, dom), + node = pm.doc.path(path); + if (node.type.countCoordsAsChild) { + var result = node.type.countCoordsAsChild(node, path, dom, coords); + if (result) return result; } - this.setSelectionDirect(selection); - } - }, { - key: "setSelectionDirect", - value: function setSelectionDirect(selection) { - this.ensureOperation(); - this.input.maybeAbortComposition(); - if (!selection.eq(this.sel.range)) this.sel.setAndSignal(selection); + // Leaf nodes are implicitly clickable + if ((liberal || node.type.contains == null) && node.type.selectable) return _model.Pos.from(path); + if (!liberal) return null; } + } +} - // :: (any, ?string) - // Replace the editor's document. When `format` is given, it should - // be a [parsable format](#parse), and `value` should something in - // that format. If not, `value` should be a `Node`. - }, { - key: "setContent", - value: function setContent(value, format) { - if (format) value = (0, _parse.parseFrom)(this.schema, value, format); - this.setDoc(value); - } +// :: (pm: ProseMirror, event: MouseEvent, path: [number], node: Node) → bool +// #path=NodeType.prototype.handleClick +// If a node is directly clicked (that is, the click didn't land in a +// DOM node belonging to a child node), and its type has a +// `handleClick` method, that method is given a chance to handle the +// click. The method is called, and should return `false` if it did +// _not_ handle the click. +// +// The `event` passed is the event for `"mousedown"`, but calling +// `preventDefault` on it has no effect, since this method is only +// called after a corresponding `"mouseup"` has occurred and +// ProseMirror has determined that this is not a drag or multi-click +// event. - // :: (?string) → any - // Get the editor's content in a given format. When `format` is not - // given, a `Node` is returned. If it is given, it should be an - // existing [serialization format](#serialize). - }, { - key: "getContent", - value: function getContent(format) { - return format ? (0, _serialize.serializeTo)(this.doc, format) : this.doc; - } - }, { - key: "setDocInner", - value: function setDocInner(doc) { - if (doc.type != this.schema.nodes.doc) throw new Error("Trying to set a document with a different schema"); - // :: Node The current document. - this.doc = doc; - this.ranges = new _range.RangeStore(this); - this.history = new _history.History(this); +function handleNodeClick(pm, event) { + for (var dom = event.target; dom && dom != pm.content; dom = dom.parentNode) { + if (dom.hasAttribute("pm-offset")) { + var path = pathFromDOM(pm, dom), + node = pm.doc.path(path); + return node.type.handleClick && node.type.handleClick(pm, event, path, node) !== false; } + } +} - // :: (Node, ?Selection) - // Set the editor's content, and optionally include a new selection. - }, { - key: "setDoc", - value: function setDoc(doc, sel) { - if (!sel) sel = (0, _selection2.findSelectionAtStart)(doc); - // :: (doc: Node, selection: Selection) #path=ProseMirror#events#beforeSetDoc - // Fired when [`setDoc`](#ProseMirror.setDoc) is called, before - // the document is actually updated. - this.signal("beforeSetDoc", doc, sel); - this.ensureOperation(); - this.setDocInner(doc); - this.sel.set(sel, true); - // :: (doc: Node, selection: Selection) #path=ProseMirror#events#setDoc - // Fired when [`setDoc`](#ProseMirror.setDoc) is called, after - // the document is updated. - this.signal("setDoc", doc, sel); - } - }, { - key: "updateDoc", - value: function updateDoc(doc, mapping, selection) { - this.ensureOperation(); - this.input.maybeAbortComposition(); - this.ranges.transform(mapping); - this.doc = doc; - this.sel.setAndSignal(selection || this.sel.range.map(doc, mapping)); - // :: () #path=ProseMirror#events#change - // Fired when the document has changed. See - // [`setDoc`](#ProseMirror.event_setDoc) and - // [`transform`](#ProseMirror.event_transform) for more specific - // change-related events. - this.signal("change"); +function verticalMotionLeavesTextblock(pm, pos, dir) { + var dom = resolvePath(pm.content, pos.path); + var coords = coordsAtPos(pm, pos); + for (var child = dom.firstChild; child; child = child.nextSibling) { + if (child.nodeType != 1) continue; + var boxes = child.getClientRects(); + for (var i = 0; i < boxes.length; i++) { + var box = boxes[i]; + if (dir < 0 ? box.bottom < coords.top : box.top > coords.bottom) return false; } + } + return true; +} - // :: EditorTransform - // Create an editor- and selection-aware `Transform` for this editor. - }, { - key: "apply", +function setDOMSelectionToPos(pm, pos) { + var _DOMFromPos2 = DOMFromPos(pm.content, pos); - // :: (Transform, ?Object) → ?Transform - // Apply a transformation (which you might want to create with the - // [`tr` getter](#ProseMirror.tr)) to the document in the editor. - // The following options are supported: - // - // **`selection`**`: ?Selection` - // : A new selection to set after the transformation is applied. - // - // **`scrollIntoView`**: ?bool - // : When true, scroll the selection into view on the next - // [redraw](#ProseMirror.flush). - // - // Returns the transform, or `false` if there were no steps in it. - value: function apply(transform) { - var options = arguments.length <= 1 || arguments[1] === undefined ? nullOptions : arguments[1]; + var node = _DOMFromPos2.node; + var offset = _DOMFromPos2.offset; - if (transform.doc == this.doc) return false; - if (transform.docs[0] != this.doc && (0, _model.findDiffStart)(transform.docs[0], this.doc)) throw new Error("Applying a transform that does not start with the current document"); + var range = document.createRange(); + range.setEnd(node, offset); + range.setStart(node, offset); + var sel = getSelection(); + sel.removeAllRanges(); + sel.addRange(range); +} - this.updateDoc(transform.doc, transform, options.selection); - // :: (Transform, Object) #path=ProseMirror#events#transform - // Signals that a (non-empty) transformation has been aplied to - // the editor. Passes the `Transform` and the options given to - // [`apply`](#ProseMirror.apply) as arguments to the handler. - this.signal("transform", transform, options); - if (options.scrollIntoView) this.scrollIntoView(); - return transform; - } +},{"../dom":1,"../model":27}],16:[function(require,module,exports){ +"use strict"; - // :: (Pos, ?bool) - // Verify that the given position is valid in the current document, - // and throw an error otherwise. When `textblock` is true, the position - // must also fall within a textblock node. - }, { - key: "checkPos", - value: function checkPos(pos, textblock) { - if (!this.doc.isValidPos(pos, textblock)) throw new Error("Position " + pos + " is not valid in current document"); - } - }, { - key: "ensureOperation", - value: function ensureOperation() { - return this.operation || this.startOperation(); - } - }, { - key: "startOperation", - value: function startOperation() { - var _this = this; +var _model = require("../model"); - this.sel.beforeStartOp(); - this.operation = new Operation(this); - if (!this.flushScheduled) { - (0, _dom.requestAnimationFrame)(function () { - _this.flushScheduled = false; - _this.flush(); - }); - this.flushScheduled = true; - } - return this.operation; - } +var _edit = require("../edit"); - // :: () - // Flush any pending changes to the DOM. When the document, - // selection, or marked ranges in an editor change, the DOM isn't - // updated immediately, but rather scheduled to be updated the next - // time the browser redraws the screen. This method can be used to - // force this to happen immediately. It can be useful when you, for - // example, want to measure where on the screen a part of the - // document ends up, immediately after changing the document. - }, { - key: "flush", - value: function flush() { - if (!document.body.contains(this.wrapper) || !this.operation) return; - // :: () #path=ProseMirror#events#flushing - // Fired when the editor is about to [flush](#ProseMirror.flush) - // an update to the DOM. - this.signal("flushing"); - var op = this.operation; - if (!op) return; - this.operation = null; - this.accurateSelection = true; +var _inputrules = require("./inputrules"); - var docChanged = op.doc != this.doc || this.dirtyNodes.size, - redrawn = false; - if (!this.input.composing && (docChanged || op.composingAtStart)) { - (0, _draw.redraw)(this, this.dirtyNodes, this.doc, op.doc); - this.dirtyNodes.clear(); - redrawn = true; - } +// :: bool #path=autoInput #kind=option +// When set to true, enables the input rules stored under the +// `"autoInput"` name in the editor's +// [`registry`](#ProseMirror.registry)—by default, these are things +// like smart quotes, and automatically wrapping a block in a list if +// you start it with `"1. "`. +(0, _edit.defineOption)("autoInput", false, function (pm, val) { + if (pm.mod.autoInput) { + pm.mod.autoInput.forEach(function (name) { + return (0, _inputrules.removeInputRule)(pm, name); + }); + pm.mod.autoInput = null; + } + if (val) { + pm.mod.autoInput = []; + pm.registry("autoInput", function (rule, type) { + pm.mod.autoInput.push(rule.name); + if (rule.handler.bind) rule = new _inputrules.InputRule(rule.name, rule.match, rule.filter, rule.handler.bind(type)); + (0, _inputrules.addInputRule)(pm, rule); + }); + } +}); - if ((redrawn || !op.sel.eq(this.sel.range)) && !this.input.composing) this.sel.toDOM(op.focus); +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("emDash", /--$/, "-", "—")); - if (op.scrollIntoView !== false) (0, _selection2.scrollIntoView)(this, op.scrollIntoView); - // :: () #path=ProseMirror#events#draw - // Fired when the editor redrew its document in the DOM. - if (docChanged) this.signal("draw"); - // :: () #path=ProseMirror#events#flush - // Fired when the editor has finished - // [flushing](#ProseMirror.flush) an update to the DOM. If you - // need to respond to this with a DOM update of your own, use this - // event to read layout from the DOM, and - // [`flushed`](#ProseMirror.event_flushed) to update the DOM. - this.signal("flush"); - // :: () #path=ProseMirror#events#flushed - // Fired when the editor has finished - // [flushing](#ProseMirror.flush) an update to the DOM, after - // [`flush`](#ProseMirror.event_flush) has fired. - this.signal("flushed"); - this.accurateSelection = false; - } +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openDoubleQuote", /\s(")$/, '"', "“")); - // :: (Keymap, ?number) - // Add a [keymap](#Keymap) to the editor. Keymaps added in this way - // are queried before the [base keymap](#keymap). - // The `rank` parameter can be used to control when they are queried - // relative to other maps added like this. Maps with a lower rank - // get queried first. - }, { - key: "addKeymap", - value: function addKeymap(map) { - var rank = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeDoubleQuote", /"$/, '"', "”")); - (0, _utilSortedinsert2["default"])(this.input.keymaps, { map: map, rank: rank }, function (a, b) { - return a.rank - b.rank; - }); - } +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openSingleQuote", /\s(')$/, "'", "‘")); - // :: (union) - // Remove the given keymap, or the keymap with the given name, from - // the editor. - }, { - key: "removeKeymap", - value: function removeKeymap(map) { - var maps = this.input.keymaps; - for (var i = 0; i < maps.length; ++i) { - if (maps[i].map == map || maps[i].map.options.name == map) { - maps.splice(i, 1); - return true; - } - } - } - }, { - key: "markRange", +_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeSingleQuote", /'$/, "'", "’")); - // :: (Pos, Pos, ?Object) → MarkedRange - // Create a marked range between the given positions. Marked ranges - // “track” the part of the document they point to—as the document - // changes, they are updated to move, grow, and shrink along with - // their content. - // - // `options` may be an object containing these properties: - // - // **`inclusiveLeft`**`: bool = false` - // : Whether the left side of the range is inclusive. When it is, - // content inserted at that point will become part of the range. - // When not, it will be outside of the range. - // - // **`inclusiveRight`**`: bool = false` - // : Whether the right side of the range is inclusive. - // - // **`removeWhenEmpty`**`: bool = true` - // : Whether the range should be forgotten when it becomes empty - // (because all of its content was deleted). - // - // **`className`**: string - // : A CSS class to add to the inline content that is part of this - // range. - value: function markRange(from, to, options) { - this.checkPos(from); - this.checkPos(to); - var range = new _range.MarkedRange(from, to, options); - this.ranges.addRange(range); - return range; - } +_model.BlockQuote.register("autoInput", new _inputrules.InputRule("startBlockQuote", /^\s*> $/, " ", function (pm, _, pos) { + wrapAndJoin(pm, pos, this); +})); + +_model.OrderedList.register("autoInput", new _inputrules.InputRule("startOrderedList", /^(\d+)\. $/, " ", function (pm, match, pos) { + var order = +match[1]; + wrapAndJoin(pm, pos, this, { order: order || null }, function (node) { + return node.size + (node.attrs.order || 1) == order; + }); +})); + +_model.BulletList.register("autoInput", new _inputrules.InputRule("startBulletList", /^\s*([-+*]) $/, " ", function (pm, match, pos) { + var bullet = match[1]; + wrapAndJoin(pm, pos, this, null, function (node) { + return node.attrs.bullet == bullet; + }); +})); + +_model.CodeBlock.register("autoInput", new _inputrules.InputRule("startCodeBlock", /^```$/, "`", function (pm, _, pos) { + setAs(pm, pos, this, { params: "" }); +})); + +_model.Heading.register("autoInput", new _inputrules.InputRule("startHeading", /^(#{1,6}) $/, " ", function (pm, match, pos) { + setAs(pm, pos, this, { level: match[1].length }); +})); + +function wrapAndJoin(pm, pos, type) { + var attrs = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; + var predicate = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; + + var before = pos.shorten(); + var sibling = before.offset > 0 && pm.doc.path(before.path).child(before.offset - 1); + var join = sibling && sibling.type.name == type && (!predicate || predicate(sibling)); + var tr = pm.tr.wrap(pos, pos, type, attrs); + var delPos = tr.map(pos).pos; + tr["delete"](new _model.Pos(delPos.path, 0), delPos); + if (join) tr.join(before); + tr.apply(); +} + +function setAs(pm, pos, type, attrs) { + pm.tr.setBlockType(pos, pos, type, attrs)["delete"](new _model.Pos(pos.path, 0), pos).apply(); +} - // :: (MarkedRange) - // Remove the given range from the editor. - }, { - key: "removeRange", - value: function removeRange(range) { - this.ranges.removeRange(range); - } +},{"../edit":9,"../model":27,"./inputrules":17}],17:[function(require,module,exports){ +"use strict"; - // :: (MarkType, ?bool, ?Object) - // Set (when `to` is true), unset (`to` is false), or toggle (`to` - // is null) the given mark type on the selection. When there is a - // non-empty selection, the marks of the selection are updated. When - // the selection is empty, the set of [active - // marks](#ProseMirror.activeMarks) is updated. - }, { - key: "setMark", - value: function setMark(type, to, attrs) { - var sel = this.selection; - if (sel.empty) { - var marks = this.activeMarks(); - if (to == null) to = !type.isInSet(marks); - if (to && !this.doc.path(sel.head.path).type.canContainMark(type)) return; - this.input.storedMarks = to ? type.create(attrs).addToSet(marks) : type.removeFromSet(marks); - // :: () #path=ProseMirror#events#activeMarkChange - // Fired when the set of [active marks](#ProseMirror.activeMarks) changes. - this.signal("activeMarkChange"); - } else { - if (to != null ? to : !this.doc.rangeHasMark(sel.from, sel.to, type)) this.apply(this.tr.addMark(sel.from, sel.to, type.create(attrs)));else this.apply(this.tr.removeMark(sel.from, sel.to, type)); - } - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - // :: () → [Mark] - // Get the marks at the cursor. By default, this yields the marks - // associated with the content at the cursor, as per `Node.marksAt`. - // But `setMark` may have been used to change the set of active - // marks, in which case that set is returned. - }, { - key: "activeMarks", - value: function activeMarks() { - var head; - return this.input.storedMarks || ((head = this.selection.head) ? this.doc.marksAt(head) : []); +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; + }; +})(); - // :: () - // Give the editor focus. - }, { - key: "focus", - value: function focus() { - if (this.operation) this.operation.focus = true;else this.sel.toDOM(true); - } +exports.addInputRule = addInputRule; +exports.removeInputRule = removeInputRule; - // :: () → bool - // Query whether the editor has focus. - }, { - key: "hasFocus", - value: function hasFocus() { - if (this.sel.range instanceof _selection2.NodeSelection) return document.activeElement == this.content;else return (0, _selection2.hasFocus)(this); - } +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} - // :: () → Node - // Get the part of the document that falls within the selection. - }, { - key: "posAtCoords", +var _model = require("../model"); - // :: ({top: number, left: number}) → ?Pos - // If the given coordinates (which should be relative to the top - // left corner of the window—not the page) fall within the editable - // content, this method will return the document position that - // corresponds to those coordinates. - value: function posAtCoords(coords) { - return (0, _selection2.posAtCoords)(this, coords); - } +var _edit = require("../edit"); - // :: (Pos) → {top: number, left: number, bottom: number} - // Find the screen coordinates (relative to top left corner of the - // window) of the given document position. - }, { - key: "coordsAtPos", - value: function coordsAtPos(pos) { - this.checkPos(pos); - return (0, _selection2.coordsAtPos)(this, pos); - } +// :: (ProseMirror, InputRule) +// Add the given [input rule](#InputRule) to an editor. From now on, +// whenever the rule's pattern is typed, its handler is activated. +// +// Note that the effect of an input rule can be canceled by pressing +// Backspace right after it happens. - // :: (?Pos) - // Scroll the given position, or the cursor position if `pos` isn't - // given, into view. - }, { - key: "scrollIntoView", - value: function scrollIntoView() { - var pos = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; +function addInputRule(pm, rule) { + if (!pm.mod.interpretInput) pm.mod.interpretInput = new InputRules(pm); + pm.mod.interpretInput.addRule(rule); +} - if (pos) this.checkPos(pos); - this.ensureOperation(); - this.operation.scrollIntoView = pos; - } +// :: (ProseMirror, string) +// Remove the input rule with the given name (added earlier with +// `addInputRule`) from the editor. - // :: (string, ?[any]) → bool - // Execute the named [command](#Command). If the command takes - // parameters and they are not passed here, the user will be - // prompted for them. - }, { - key: "execCommand", - value: function execCommand(name, params) { - var cmd = this.commands[name]; - return !!(cmd && cmd.exec(this, params) !== false); - } +function removeInputRule(pm, name) { + var ii = pm.mod.interpretInput; + if (!ii) return; + ii.removeRule(name); + if (ii.rules.length == 0) { + ii.unregister(); + pm.mod.interpretInput = null; + } +} - // :: (string) → ?string - // Return the name of the key that is bound to the given command, if - // any. - }, { - key: "keyForCommand", - value: function keyForCommand(name) { - var cached = this.commandKeys[name]; - if (cached !== undefined) return cached; +// ;; Input rules are regular expressions describing a piece of text +// that, when typed, causes something to happen. This might be +// changing two dashes into an emdash, wrapping a paragraph starting +// with `"> "` into a blockquote, or something entirely different. - var cmd = this.commands[name], - keymap = this.baseKeymap; - if (!cmd) return this.commandKeys[name] = null; - var key = cmd.spec.key || (_dom.browser.mac ? cmd.spec.macKey : cmd.spec.pcKey); - if (key) { - key = (0, _keys.normalizeKeyName)(Array.isArray(key) ? key[0] : key); - var deflt = keymap.bindings[key]; - if (Array.isArray(deflt) ? deflt.indexOf(name) > -1 : deflt == name) return this.commandKeys[name] = key; - } - for (var _key in keymap.bindings) { - var bound = keymap.bindings[_key]; - if (Array.isArray(bound) ? bound.indexOf(name) > -1 : bound == name) return this.commandKeys[name] = _key; - } - return this.commandKeys[name] = null; - } - }, { - key: "registry", - value: function registry(name, f) { - var _this2 = this; +var InputRule = +// :: (string, RegExp, ?string, union) +// Create an input rule. Its name is used to identify it (to disable +// it). The rule applies when the user typed something and the text +// directly in front of the cursor matches `match`, which should +// probably end with `$`. You can optionally provide a filter, which +// should be a single character that always appears at the end of +// the match, and will be used to only apply the rule when there's +// an actual chance of it succeeding. +// +// The `handler` can be a string, in which case the matched text +// will simply be replaced by that string, or a function, which will +// be called with the match array produced by +// [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), +// and should produce the effect of the rule. +function InputRule(name, match, filter, handler) { + _classCallCheck(this, InputRule); - this.schema.registry(name, f); - this.options.registries.forEach(function (reg) { - var array = reg.registry[name]; - if (array) for (var i = 0; i < array.length; i++) f(array[i], _this2); - }); - } - }, { - key: "markRangeDirty", - value: function markRangeDirty(range) { - this.ensureOperation(); - var dirty = this.dirtyNodes; - var from = range.from, - to = range.to; - for (var depth = 0, node = this.doc;; depth++) { - var fromEnd = depth == from.depth, - toEnd = depth == to.depth; - if (!fromEnd && !toEnd && from.path[depth] == to.path[depth]) { - var child = node.child(from.path[depth]); - if (!dirty.has(child)) dirty.set(child, DIRTY_RESCAN); - node = child; - } else { - var _ret = (function () { - var start = fromEnd ? from.offset : from.path[depth]; - var end = toEnd ? to.offset : to.path[depth] + 1; - if (node.isTextblock) { - node.forEach(function (child, cStart, cEnd) { - if (cStart < end && cEnd > start) dirty.set(child, DIRTY_REDRAW); - }); - } else { - for (var i = node.iter(start, end), child = undefined; child = i.next().value;) { - dirty.set(child, DIRTY_REDRAW); - } - } - return "break"; - })(); + this.name = name; + this.filter = filter; + this.match = match; + this.handler = handler; +}; - if (_ret === "break") break; - } - } - } - }, { - key: "selection", - get: function get() { - if (!this.accurateSelection) this.ensureOperation(); - return this.sel.range; +exports.InputRule = InputRule; + +var InputRules = (function () { + function InputRules(pm) { + var _this = this; + + _classCallCheck(this, InputRules); + + this.pm = pm; + this.rules = []; + this.cancelVersion = null; + + pm.on("selectionChange", this.onSelChange = function () { + return _this.cancelVersion = null; + }); + pm.on("textInput", this.onTextInput = this.onTextInput.bind(this)); + pm.addKeymap(new _edit.Keymap({ Backspace: function Backspace(pm) { + return _this.backspace(pm); + } }, { name: "inputRules" }), 20); + } + + _createClass(InputRules, [{ + key: "unregister", + value: function unregister() { + this.pm.off("selectionChange", this.onSelChange); + this.pm.off("textInput", this.onTextInput); + this.pm.removeKeymap("inputRules"); } }, { - key: "tr", - get: function get() { - return new EditorTransform(this); + key: "addRule", + value: function addRule(rule) { + this.rules.push(rule); } }, { - key: "baseKeymap", - get: function get() { - return this.options.keymap || this.defaultKeymap || (this.defaultKeymap = (0, _commands.defaultKeymap)(this)); + key: "removeRule", + value: function removeRule(name) { + for (var i = 0; i < this.rules.length; i++) { + if (this.rules[i].name == name) { + this.rules.splice(i, 1); + return true; + } + } } }, { - key: "selectedDoc", - get: function get() { - var sel = this.selection; - return this.doc.sliceBetween(sel.from, sel.to); - } + key: "onTextInput", + value: function onTextInput(text) { + var pos = this.pm.selection.head; + if (!pos) return; - // :: () → string - // Get the text that falls within the selection. + var textBefore = undefined, + isCode = undefined; + var lastCh = text[text.length - 1]; + + for (var i = 0; i < this.rules.length; i++) { + var rule = this.rules[i], + match = undefined; + if (rule.filter && rule.filter != lastCh) continue; + if (textBefore == null) { + ; + var _getContext = getContext(this.pm.doc, pos); + + textBefore = _getContext.textBefore; + isCode = _getContext.isCode; + + if (isCode) return; + } + if (match = rule.match.exec(textBefore)) { + var startVersion = this.pm.history.getVersion(); + if (typeof rule.handler == "string") { + var offset = pos.offset - (match[1] || match[0]).length; + var start = new _model.Pos(pos.path, offset); + var marks = this.pm.doc.marksAt(pos); + this.pm.tr["delete"](start, pos).insert(start, this.pm.schema.text(rule.handler, marks)).apply(); + } else { + rule.handler(this.pm, match, pos); + } + this.cancelVersion = startVersion; + return; + } + } + } }, { - key: "selectedText", - get: function get() { - return (0, _serializeText.toText)(this.selectedDoc); + key: "backspace", + value: function backspace() { + if (this.cancelVersion) { + this.pm.history.backToVersion(this.cancelVersion); + this.cancelVersion = null; + } else { + return false; + } } }]); - return ProseMirror; + return InputRules; })(); -exports.ProseMirror = ProseMirror; -var DIRTY_RESCAN = 1, - DIRTY_REDRAW = 2; +function getContext(doc, pos) { + var parent = doc.path(pos.path); + var isCode = parent.type.isCode; + var textBefore = ""; + for (var i = parent.iter(0, pos.offset), child = undefined; child = i.next().value;) { + if (child.isText) textBefore += child.text;else textBefore = ""; + if (i.atEnd() && child.marks.some(function (st) { + return st.type.isCode; + })) isCode = true; + } + return { textBefore: textBefore, isCode: isCode }; +} -exports.DIRTY_RESCAN = DIRTY_RESCAN; -exports.DIRTY_REDRAW = DIRTY_REDRAW; -var nullOptions = {}; +},{"../edit":9,"../model":27}],18:[function(require,module,exports){ +"use strict"; -(0, _utilEvent.eventMixin)(ProseMirror); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getIcon = getIcon; -var Operation = function Operation(pm) { - _classCallCheck(this, Operation); +var _dom = require("../dom"); - this.doc = pm.doc; - this.sel = pm.sel.range; - this.scrollIntoView = false; - this.focus = false; - this.composingAtStart = !!pm.input.composing; +var svgCollection = null; +var svgBuilt = Object.create(null); + +var SVG = "http://www.w3.org/2000/svg"; +var XLINK = "http://www.w3.org/1999/xlink"; + +function getIcon(name, data) { + var node = document.createElement("div"); + node.className = "ProseMirror-icon"; + if (data.path) { + if (!svgBuilt[name]) buildSVG(name, data); + var svg = node.appendChild(document.createElementNS(SVG, "svg")); + svg.style.width = data.width / data.height + "em"; + var use = svg.appendChild(document.createElementNS(SVG, "use")); + use.setAttributeNS(XLINK, "href", "#pm-icon-" + name); + } else { + node.textContent = data.text; + if (data.css) node.style.cssText = data.css; + } + return node; } -// ;; #toc=false A selection-aware extension of `Transform`. Use -// `ProseMirror.tr` to create an instance. -; +function buildSVG(name, data) { + if (!svgCollection) { + svgCollection = document.createElementNS(SVG, "svg"); + svgCollection.style.display = "none"; + document.body.insertBefore(svgCollection, document.body.firstChild); + } + var sym = document.createElementNS(SVG, "symbol"); + sym.id = "pm-icon-" + name; + sym.setAttribute("viewBox", "0 0 " + data.width + " " + data.height); + var path = sym.appendChild(document.createElementNS(SVG, "path")); + path.setAttribute("d", data.path); + svgCollection.appendChild(sym); + svgBuilt[name] = true; +} -var EditorTransform = (function (_Transform) { - _inherits(EditorTransform, _Transform); +(0, _dom.insertCSS)("\n.ProseMirror-icon {\n display: inline-block;\n line-height: .8;\n vertical-align: middle;\n padding: 2px 8px;\n cursor: pointer;\n}\n\n.ProseMirror-icon-active {\n background: #666;\n border-radius: 4px;\n}\n\n.ProseMirror-icon svg {\n fill: currentColor;\n height: 1em;\n}\n"); - function EditorTransform(pm) { - _classCallCheck(this, EditorTransform); +},{"../dom":1}],19:[function(require,module,exports){ +"use strict"; - _get(Object.getPrototypeOf(EditorTransform.prototype), "constructor", this).call(this, pm.doc); - this.pm = pm; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; + }; +})(); + +exports.showSelectMenu = showSelectMenu; +exports.readParams = readParams; +exports.commandGroups = commandGroups; + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { "default": obj }; +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } +} - // :: (?Object) → ?EditorTransform - // Apply the transformation. Returns the transform, or `false` it is - // was empty. +var _tooltip = require("./tooltip"); - _createClass(EditorTransform, [{ - key: "apply", - value: function apply(options) { - return this.pm.apply(this, options); - } +var _dom = require("../dom"); - // :: Selection - // Get the editor's current selection, [mapped](#Selection.map) - // through the steps in this transform. - }, { - key: "replaceSelection", +var _edit = require("../edit"); - // :: (?Node, ?bool) → EditorTransform - // Replace the selection with the given node, or delete it if `node` - // is null. When `inheritMarks` is true and the node is an inline - // node, it inherits the marks from the place where it is inserted. - value: function replaceSelection(node, inheritMarks) { - var _selection = this.selection; - var empty = _selection.empty; - var from = _selection.from; - var to = _selection.to; - var selNode = _selection.node;var parent = undefined; - if (node && node.isInline && inheritMarks !== false) { - var marks = empty ? this.pm.input.storedMarks : this.doc.marksAt(from); - node = node.type.create(node.attrs, node.text, marks); - } +var _utilSortedinsert = require("../util/sortedinsert"); - if (selNode && selNode.isTextblock && node && node.isInline) { - // Putting inline stuff onto a selected textblock puts it inside - from = new _model.Pos(from.toPath(), 0); - to = new _model.Pos(from.path, selNode.size); - } else if (selNode) { - // This node can not simply be removed/replaced. Remove its parent as well - while (from.depth && from.offset == 0 && (parent = this.doc.path(from.path)) && from.offset == parent.size - 1 && !parent.type.canBeEmpty && !(node && parent.type.canContain(node))) { - from = from.shorten(); - to = to.shorten(null, 1); +var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); + +var _icons = require("./icons"); + +var Menu = (function () { + function Menu(pm, display) { + _classCallCheck(this, Menu); + + this.display = display; + this.stack = []; + this.pm = pm; + } + + _createClass(Menu, [{ + key: "show", + value: function show(content, displayInfo) { + this.stack.length = 0; + this.enter(content, displayInfo); + } + }, { + key: "reset", + value: function reset() { + this.stack.length = 0; + this.display.reset(); + } + }, { + key: "enter", + value: function enter(content, displayInfo) { + var _this = this; + + var pieces = [], + explore = function explore(value) { + if (Array.isArray(value)) { + for (var i = 0; i < value.length; i++) { + explore(value[i]); + }pieces.push(separator); + } else if (!value.select || value.select(_this.pm)) { + pieces.push(value); } - } else if (node && node.isBlock && this.doc.path(from.path.slice(0, from.depth - 1)).type.canContain(node)) { - // Inserting a block node into a textblock. Try to insert it above by splitting the textblock - this["delete"](from, to); - var _parent = this.doc.path(from.path); - if (from.offset && from.offset != _parent.size) this.split(from); - return this.insert(from.shorten(null, from.offset ? 1 : 0), node); - } + }; + explore(content); + // Remove superfluous separators + for (var i = 0; i < pieces.length; i++) { + if (pieces[i] == separator && (i == 0 || i == pieces.length - 1 || pieces[i + 1] == separator)) pieces.splice(i--, 1); + }if (!pieces.length) return this.display.clear(); - if (node) return this.replaceWith(from, to, node);else return this["delete"](from, to); + this.stack.push(pieces); + this.draw(displayInfo); } - - // :: () → EditorTransform - // Delete the selection. }, { - key: "deleteSelection", - value: function deleteSelection() { - return this.replaceSelection(); - } + key: "draw", + value: function draw(displayInfo) { + var _this2 = this; - // :: (string) → EditorTransform - // Replace the selection with a text node containing the given string. + var cur = this.stack[this.stack.length - 1]; + var rendered = (0, _dom.elt)("div", { "class": "ProseMirror-menu" }, cur.map(function (item) { + return renderItem(item, _this2); + })); + if (this.stack.length > 1) this.display.enter(rendered, function () { + return _this2.leave(); + }, displayInfo);else this.display.show(rendered, displayInfo); + } }, { - key: "typeText", - value: function typeText(text) { - return this.replaceSelection(this.pm.schema.text(text), true); + key: "leave", + value: function leave() { + this.stack.pop(); + if (this.stack.length) this.draw();else this.display.reset(); } }, { - key: "selection", + key: "active", get: function get() { - return this.steps.length ? this.pm.selection.map(this) : this.pm.selection; + return this.stack.length > 1; } }]); - return EditorTransform; -})(_transform.Transform); - -},{"../dom":19,"../model":45,"../parse":51,"../parse/text":52,"../serialize":54,"../serialize/text":55,"../transform":57,"../util/event":67,"../util/map":68,"../util/sortedinsert":69,"./commands":22,"./css":23,"./draw":25,"./history":26,"./input":28,"./keys":29,"./options":31,"./range":32,"./selection":33}],31:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -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; - }; + return Menu; })(); -exports.defineOption = defineOption; -exports.parseOptions = parseOptions; -exports.initOptions = initOptions; -exports.setOption = setOption; - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -// ;; A registry is a namespace for [commands](#Commands), input -// rules, and so on. They provide a way to define commands and such in -// a scoped way, without having them show up on all your editors by -// default all of a sudden. See also the [`registries` -// option](#registries). - -var Registry = (function () { - // :: (string) - // Create a new registry with the given name. +exports.Menu = Menu; - function Registry(name) { - _classCallCheck(this, Registry); +var TooltipDisplay = (function () { + function TooltipDisplay(tooltip, resetFunc) { + _classCallCheck(this, TooltipDisplay); - this.name = name; - this.registry = Object.create(null); + this.tooltip = tooltip; + this.resetFunc = resetFunc; } - // :: Registry - // The registry in which built-in commands and input rules are - // registered. The default content of the `registries` option. - - // :: (string, *) - // Register a new item in this registry. - - _createClass(Registry, [{ - key: "register", - value: function register(name, value) { - ;(this.registry[name] || (this.registry[name] = [])).push(value); + _createClass(TooltipDisplay, [{ + key: "clear", + value: function clear() { + this.tooltip.close(); + } + }, { + key: "reset", + value: function reset() { + if (this.resetFunc) this.resetFunc();else this.clear(); + } + }, { + key: "show", + value: function show(dom, info) { + this.tooltip.open(dom, info); + } + }, { + key: "enter", + value: function enter(dom, back, info) { + var button = (0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back", title: "Back" }); + button.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + back(); + }); + this.show((0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back-wrapper" }, dom, button), info); } }]); - return Registry; + return TooltipDisplay; })(); -exports.Registry = Registry; -var defaultRegistry = new Registry("default"); +exports.TooltipDisplay = TooltipDisplay; -exports.defaultRegistry = defaultRegistry; +function title(pm, command) { + var key = pm.keyForCommand(command.name); + return key ? command.label + " (" + key + ")" : command.label; +} -var Option = function Option(defaultValue, update, updateOnInit) { - _classCallCheck(this, Option); +function renderIcon(command, menu) { + var icon = resolveIcon(menu.pm, command); + if (command.active(menu.pm)) icon.className += " ProseMirror-icon-active"; + var dom = (0, _dom.elt)("span", { "class": "ProseMirror-menuicon", title: title(menu.pm, command) }, icon); + dom.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + if (!command.params.length) { + command.exec(menu.pm); + menu.reset(); + } else if (command.params.length == 1 && command.params[0].type == "select") { + showSelectMenu(menu.pm, command, dom); + } else { + menu.enter(readParams(command)); + } + }); + return dom; +} - this.defaultValue = defaultValue; - this.update = update; - this.updateOnInit = updateOnInit !== false; -}; +function resolveIcon(pm, command) { + for (;;) { + var icon = command.spec.icon; + if (!icon) break; + if (icon.from) { + command = pm.commands[icon.from]; + if (!command) break; + } else { + return (0, _icons.getIcon)(command.name, icon); + } + } + return (0, _icons.getIcon)("default", { text: "✘" }); +} -var options = Object.create(null); +function renderSelect(item, menu) { + var param = item.params[0]; + var value = !param["default"] ? null : param["default"].call ? param["default"](menu.pm) : param["default"]; -// :: (string, any, (pm: ProseMirror, newValue: any, oldValue: any, init: bool), bool) -// Define a new option. The `update` handler will be called with the -// option's old and new value every time the option is -// [changed](#ProseMirror.setOption). When `updateOnInit` is true, it -// is also called on editor init, with null as the old value, and a fourth -// argument of true. + var dom = (0, _dom.elt)("div", { "class": "ProseMirror-select ProseMirror-select-command-" + item.name, title: item.label }, !value ? param.defaultLabel || "Select..." : value.display ? value.display(value) : value.label); + dom.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + showSelectMenu(menu.pm, item, dom); + }); + return dom; +} -function defineOption(name, defaultValue, update, updateOnInit) { - options[name] = new Option(defaultValue, update, updateOnInit); +function showSelectMenu(pm, item, dom) { + var param = item.params[0]; + var options = param.options.call ? param.options(pm) : param.options; + var menu = (0, _dom.elt)("div", { "class": "ProseMirror-select-menu" }, options.map(function (o) { + var dom = (0, _dom.elt)("div", null, o.display ? o.display(o) : o.label); + dom.addEventListener("mousedown", function (e) { + e.preventDefault(); + item.exec(pm, [o.value]); + finish(); + }); + return dom; + })); + var pos = dom.getBoundingClientRect(), + box = pm.wrapper.getBoundingClientRect(); + menu.style.left = pos.left - box.left - 2 + "px"; + menu.style.top = pos.top - box.top - 2 + "px"; + + var done = false; + function finish() { + if (done) return; + done = true; + document.body.removeEventListener("mousedown", finish); + document.body.removeEventListener("keydown", finish); + pm.wrapper.removeChild(menu); + } + document.body.addEventListener("mousedown", finish); + document.body.addEventListener("keydown", finish); + pm.wrapper.appendChild(menu); } -// :: Schema #path=schema #kind=option -// The [schema](#Schema) that the editor's document should use. -defineOption("schema", _model.defaultSchema, false); +function renderItem(item, menu) { + var display = item.display || item.spec.display || "icon"; + if (display == "icon") return renderIcon(item, menu);else if (display == "select") return renderSelect(item, menu);else if (!display) throw new Error("Command " + item.name + " can not be shown in a menu");else return display.call(item, menu); +} -// :: any #path=doc #kind=option -// The starting document. Usually a `Node`, but can be in another -// format when the `docFormat` option is also specified. -defineOption("doc", null, function (pm, value) { - return pm.setDoc(value); -}, false); +function buildParamForm(pm, command) { + var prefill = command.spec.prefillParams && command.spec.prefillParams(pm); + var fields = command.params.map(function (param, i) { + var field = undefined, + name = "field_" + i; + var val = prefill ? prefill[i] : param["default"] || ""; + if (param.type == "text") field = (0, _dom.elt)("input", { name: name, type: "text", + placeholder: param.label, + value: val, + autocomplete: "off" });else if (param.type == "select") field = (0, _dom.elt)("select", { name: name }, (param.options.call ? param.options(pm) : param.options).map(function (o) { + return (0, _dom.elt)("option", { value: o.value, selected: o.value == val }, o.label); + }));else // FIXME more types + throw new Error("Unsupported parameter type: " + param.type); + return (0, _dom.elt)("div", null, field); + }); + return (0, _dom.elt)("form", null, fields); +} -// :: ?string #path=docFormat #kind=option -// The format in which the `doc` option is given. Defaults to `null` -// (a raw `Node`). -defineOption("docFormat", null); +function gatherParams(pm, command, form) { + var bad = false; + var params = command.params.map(function (param, i) { + var val = form.elements["field_" + i].value; + if (val) return val; + if (param["default"] == null) bad = true;else return param["default"].call ? param["default"](pm) : param["default"]; + }); + return bad ? null : params; +} -// :: ?union #path=place #kind=option -// Determines the placement of the editor in the page. When `null`, -// the editor is not placed. When a DOM node is given, the editor is -// appended to that node. When a function is given, it is called -// with the editor's wrapping DOM node, and is expected to place it -// into the document. -defineOption("place", null); +function paramForm(pm, command, callback) { + var form = buildParamForm(pm, command), + done = false; -// :: Keymap #path=keymap #kind=option -// The base [keymap](#Keymap). When not given, a default keymap is -// synthesized from the default key bindings provided by the -// [commands](#Command) that are in scope for the editor. -defineOption("keymap", null); + var finish = function finish(result) { + if (!done) { + done = true; + callback(result); + } + }; -// :: [Registry] -// The set of [registries](#Registry) the editor should load items -// from. -defineOption("registries", [defaultRegistry], false); + var submit = function submit() { + // FIXME error messages + finish(gatherParams(pm, command, form)); + }; + form.addEventListener("submit", function (e) { + e.preventDefault(); + submit(); + }); + form.addEventListener("keydown", function (e) { + if (e.keyCode == 27) { + finish(null); + } else if (e.keyCode == 13 && !(e.ctrlKey || e.metaKey || e.shiftKey)) { + e.preventDefault(); + submit(); + } + }); + // FIXME too hacky? + setTimeout(function () { + var input = form.querySelector("input, textarea"); + if (input) input.focus(); + }, 20); -// :: number #path=historyDepth #kind=option -// The amount of history events that are collected before the oldest -// events are discarded. Defaults to 100. -defineOption("historyDepth", 100); + return form; +} -// :: number #path=historyEventDelay #kind=option -// The amount of milliseconds that must pass between changes to -// start a new history event. Defaults to 500. -defineOption("historyEventDelay", 500); +function readParams(command) { + return { display: function display(menu) { + return paramForm(menu.pm, command, function (params) { + menu.pm.focus(); + if (params) { + command.exec(menu.pm, params); + menu.reset(); + } else { + menu.leave(); + } + }); + } }; +} -// :: string #path=commandParamHandler #kind=option -// The name of the handler used to prompt the user for [command -// parameters](#CommandParam). Only relevant when multiple such -// handlers are loaded, and you want to choose between them. -defineOption("commandParamHandler", "default"); +var separator = { + display: function display() { + return (0, _dom.elt)("div", { "class": "ProseMirror-menuseparator" }); + } +}; -// :: ?string #path=label #kind=option -// The label of the editor. When set, the editable DOM node gets an -// `aria-label` attribute with this value. -defineOption("label", null); +function commandGroups(pm) { + for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + names[_key - 1] = arguments[_key]; + } -function parseOptions(obj) { - var result = Object.create(null); - var given = obj ? [obj].concat(obj.use || []) : []; - outer: for (var opt in options) { - for (var i = 0; i < given.length; i++) { - if (opt in given[i]) { - result[opt] = given[i][opt]; - continue outer; - } + return names.map(function (group) { + var found = []; + for (var _name in pm.commands) { + var cmd = pm.commands[_name]; + if (cmd.spec.menuGroup && cmd.spec.menuGroup == group) (0, _utilSortedinsert2["default"])(found, cmd, function (a, b) { + return (a.spec.menuRank || 50) - (b.spec.menuRank || 50); + }); } - result[opt] = options[opt].defaultValue; - } - return result; + return found; + }); } -function initOptions(pm) { - for (var opt in options) { - var desc = options[opt]; - if (desc.update && desc.updateOnInit) desc.update(pm, pm.options[opt], null, true); - } +function tooltipParamHandler(pm, command, callback) { + var tooltip = new _tooltip.Tooltip(pm, "center"); + tooltip.open(paramForm(pm, command, function (params) { + pm.focus(); + tooltip.close(); + callback(params); + })); } -function setOption(pm, name, value) { - var desc = options[name]; - if (desc.update === false) throw new Error("Option '" + name + "' can not be changed"); - var old = pm.options[name]; - pm.options[name] = value; - if (desc.update) desc.update(pm, value, old, false); -} +(0, _edit.defineParamHandler)("default", tooltipParamHandler); +(0, _edit.defineParamHandler)("tooltip", tooltipParamHandler); -},{"../model":45}],32:[function(require,module,exports){ -"use strict"; +// FIXME check for obsolete styles +(0, _dom.insertCSS)("\n\n.ProseMirror-menu {\n margin: 0 -4px;\n line-height: 1;\n white-space: pre;\n}\n.ProseMirror-tooltip .ProseMirror-menu {\n width: -webkit-fit-content;\n width: fit-content;\n}\n\n.ProseMirror-tooltip-back-wrapper {\n padding-left: 12px;\n}\n.ProseMirror-tooltip-back {\n position: absolute;\n top: 5px; left: 5px;\n cursor: pointer;\n}\n.ProseMirror-tooltip-back:after {\n content: \"«\";\n}\n\n.ProseMirror-menuicon {\n margin: 0 7px;\n}\n\n.ProseMirror-menuseparator {\n display: inline-block;\n}\n.ProseMirror-menuseparator:after {\n content: \"︙\";\n opacity: 0.5;\n padding: 0 4px;\n vertical-align: baseline;\n}\n\n.ProseMirror-select, .ProseMirror-select-menu {\n border: 1px solid #777;\n border-radius: 3px;\n font-size: 90%;\n}\n\n.ProseMirror-select {\n padding: 1px 12px 1px 4px;\n display: inline-block;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n margin: 0 8px;\n}\n\n.ProseMirror-select-command-textblockType {\n min-width: 3.2em;\n}\n\n.ProseMirror-select:after {\n content: \"▿\";\n color: #777;\n position: absolute;\n right: 4px;\n}\n\n.ProseMirror-select-menu {\n position: absolute;\n background: #444;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n.ProseMirror-select-menu div:hover {\n background: #777;\n}\n\n"); -Object.defineProperty(exports, "__esModule", { - value: true -}); +},{"../dom":1,"../edit":9,"../util/sortedinsert":51,"./icons":18,"./tooltip":21}],20:[function(require,module,exports){ +"use strict"; var _createClass = (function () { function defineProperties(target, props) { @@ -5522,257 +5775,201 @@ function _classCallCheck(instance, Constructor) { } } -var _utilEvent = require("../util/event"); - -// ;; A [marked range](#ProseMirror.markRange). Includes the methods -// from the [event mixin](#EventMixin). - -var MarkedRange = (function () { - function MarkedRange(from, to, options) { - _classCallCheck(this, MarkedRange); - - this.options = options || {}; - // :: ?Pos - // The current start position of the range. Updated whenever the - // editor's document is changed. Set to `null` when the marked - // range is [removed](#ProseMirror.removeRange). - this.from = from; - // :: ?Pos - // The current end position of the range. Updated whenever the - // editor's document is changed. Set to `null` when the marked - // range is [removed](#ProseMirror.removeRange). - this.to = to; - } - - _createClass(MarkedRange, [{ - key: "remove", - value: function remove() { - // :: (from: Pos, to: Pos) #path=MarkedRange#events#removed - // Signalled when the marked range is removed from the editor. - this.signal("removed", this.from, this.to.max(this.from)); - this.from = this.to = null; - } - }]); - - return MarkedRange; -})(); - -exports.MarkedRange = MarkedRange; - -(0, _utilEvent.eventMixin)(MarkedRange); +var _edit = require("../edit"); -var RangeSorter = (function () { - function RangeSorter() { - _classCallCheck(this, RangeSorter); +var _dom = require("../dom"); - this.sorted = []; - } +var _update = require("./update"); - _createClass(RangeSorter, [{ - key: "find", - value: function find(at) { - var min = 0, - max = this.sorted.length; - for (;;) { - if (max < min + 10) { - for (var i = min; i < max; i++) { - if (this.sorted[i].at.cmp(at) >= 0) return i; - }return max; - } - var mid = min + max >> 1; - if (this.sorted[mid].at.cmp(at) > 0) max = mid;else min = mid; - } - } - }, { - key: "insert", - value: function insert(obj) { - this.sorted.splice(this.find(obj.at), 0, obj); - } - }, { - key: "remove", - value: function remove(at, range) { - var pos = this.find(at); - for (var dist = 0;; dist++) { - var leftPos = pos - dist - 1, - rightPos = pos + dist; - if (leftPos >= 0 && this.sorted[leftPos].range == range) { - this.sorted.splice(leftPos, 1); - return; - } else if (rightPos < this.sorted.length && this.sorted[rightPos].range == range) { - this.sorted.splice(rightPos, 1); - return; - } - } - } - }, { - key: "resort", - value: function resort() { - for (var i = 0; i < this.sorted.length; i++) { - var cur = this.sorted[i]; - var at = cur.at = cur.type == "open" ? cur.range.from : cur.range.to; - var pos = i; - while (pos > 0 && this.sorted[pos - 1].at.cmp(at) > 0) { - this.sorted[pos] = this.sorted[pos - 1]; - this.sorted[--pos] = cur; - } - } - } - }]); +var _menu = require("./menu"); - return RangeSorter; -})(); +(0, _edit.defineOption)("menuBar", false, function (pm, value) { + if (pm.mod.menuBar) pm.mod.menuBar.detach(); + pm.mod.menuBar = value ? new MenuBar(pm, value) : null; +}); -var RangeStore = (function () { - function RangeStore(pm) { - _classCallCheck(this, RangeStore); +var BarDisplay = (function () { + function BarDisplay(container, resetFunc) { + _classCallCheck(this, BarDisplay); - this.pm = pm; - this.ranges = []; - this.sorted = new RangeSorter(); + this.container = container; + this.resetFunc = resetFunc; } - _createClass(RangeStore, [{ - key: "addRange", - value: function addRange(range) { - this.ranges.push(range); - this.sorted.insert({ type: "open", at: range.from, range: range }); - this.sorted.insert({ type: "close", at: range.to, range: range }); - this.pm.markRangeDirty(range); + _createClass(BarDisplay, [{ + key: "clear", + value: function clear() { + this.container.textContent = ""; } }, { - key: "removeRange", - value: function removeRange(range) { - var found = this.ranges.indexOf(range); - if (found > -1) { - this.ranges.splice(found, 1); - this.sorted.remove(range.from, range); - this.sorted.remove(range.to, range); - this.pm.markRangeDirty(range); - range.remove(); - } + key: "reset", + value: function reset() { + this.resetFunc(); } }, { - key: "transform", - value: function transform(mapping) { - for (var i = 0; i < this.ranges.length; i++) { - var range = this.ranges[i]; - range.from = mapping.map(range.from, range.options.inclusiveLeft ? -1 : 1).pos; - range.to = mapping.map(range.to, range.options.inclusiveRight ? 1 : -1).pos; - var diff = range.from.cmp(range.to); - if (range.options.removeWhenEmpty !== false && diff >= 0) { - this.removeRange(range); - i--; - } else if (diff > 0) { - range.to = range.from; - } - } - this.sorted.resort(); + key: "show", + value: function show(dom) { + this.clear(); + this.container.appendChild(dom); } }, { - key: "activeRangeTracker", - value: function activeRangeTracker() { - return new RangeTracker(this.sorted.sorted); + key: "enter", + value: function enter(dom, back) { + var current = this.container.firstChild; + if (current) { + current.style.position = "absolute"; + current.style.opacity = "0.5"; + } + var backButton = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-back" }); + backButton.addEventListener("mousedown", function (e) { + e.preventDefault();e.stopPropagation(); + back(); + }); + var added = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-sliding" }, backButton, dom); + this.container.appendChild(added); + added.getBoundingClientRect(); // Force layout for transition + added.style.left = "0"; + added.addEventListener("transitionend", function () { + if (current && current.parentNode) current.parentNode.removeChild(current); + }); } }]); - return RangeStore; + return BarDisplay; })(); -exports.RangeStore = RangeStore; +var MenuBar = (function () { + function MenuBar(pm, config) { + var _this = this; -var RangeTracker = (function () { - function RangeTracker(sorted) { - _classCallCheck(this, RangeTracker); + _classCallCheck(this, MenuBar); - this.sorted = sorted; - this.pos = 0; - this.current = []; + this.pm = pm; + + this.menuElt = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-inner" }); + this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror-menubar" }, (0, _dom.elt)("div", { "class": "ProseMirror-menu", style: "visibility: hiffdden; z-index: 100" }, (0, _dom.elt)("span", { "class": "ProseMirror-menuicon" }, (0, _dom.elt)("div", { "class": "ProseMirror-icon" }, "x"))), this.menuElt); + pm.wrapper.insertBefore(this.wrapper, pm.wrapper.firstChild); + + this.update = new _update.MenuUpdate(pm, "selectionChange change activeMarkChange", function () { + return _this.prepareUpdate(); + }); + this.menu = new _menu.Menu(pm, new BarDisplay(this.menuElt, function () { + return _this.resetMenu(); + })); + + this.menuItems = config && config.items || (0, _menu.commandGroups)(pm, "inline", "block", "history"); + this.update.force(); + + this.floating = false; + if (config && config.float) { + this.updateFloat(); + this.scrollFunc = function () { + if (!document.body.contains(_this.pm.wrapper)) window.removeEventListener("scroll", _this.scrollFunc);else _this.updateFloat(); + }; + window.addEventListener("scroll", this.scrollFunc); + } } - _createClass(RangeTracker, [{ - key: "advanceTo", - value: function advanceTo(pos) { - var next = undefined; - while (this.pos < this.sorted.length && (next = this.sorted[this.pos]).at.cmp(pos) <= 0) { - var className = next.range.options.className; - if (!className) continue; - if (next.type == "open") this.current.push(className);else this.current.splice(this.current.indexOf(className), 1); - this.pos++; + _createClass(MenuBar, [{ + key: "detach", + value: function detach() { + this.update.detach(); + this.wrapper.parentNode.removeChild(this.wrapper); + + if (this.scrollFunc) window.removeEventListener("scroll", this.scrollFunc); + } + }, { + key: "prepareUpdate", + value: function prepareUpdate() { + var _this2 = this; + + var scrollCursor = this.prepareScrollCursor(); + return function () { + if (!_this2.menu.active) _this2.resetMenu(); + if (scrollCursor) scrollCursor(); + }; + } + }, { + key: "resetMenu", + value: function resetMenu() { + this.menu.show(this.menuItems); + } + }, { + key: "updateFloat", + value: function updateFloat() { + var editorRect = this.pm.wrapper.getBoundingClientRect(); + if (this.floating) { + if (editorRect.top >= 0 || editorRect.bottom < this.menuElt.offsetHeight + 10) { + this.floating = false; + this.menuElt.style.position = this.menuElt.style.left = this.menuElt.style.width = ""; + this.menuElt.style.display = ""; + } else { + var border = (this.pm.wrapper.offsetWidth - this.pm.wrapper.clientWidth) / 2; + this.menuElt.style.left = editorRect.left + border + "px"; + this.menuElt.style.display = editorRect.top > window.innerHeight ? "none" : ""; + } + } else { + if (editorRect.top < 0 && editorRect.bottom >= this.menuElt.offsetHeight + 10) { + this.floating = true; + var menuRect = this.menuElt.getBoundingClientRect(); + this.menuElt.style.left = menuRect.left + "px"; + this.menuElt.style.width = menuRect.width + "px"; + this.menuElt.style.position = "fixed"; + } } } }, { - key: "nextChangeBefore", - value: function nextChangeBefore(pos) { - for (;;) { - if (this.pos == this.sorted.length) return null; - var next = this.sorted[this.pos]; - if (!next.range.options.className) this.pos++;else if (next.at.cmp(pos) >= 0) return null;else return next.at.offset; + key: "prepareScrollCursor", + value: function prepareScrollCursor() { + var _this3 = this; + + if (!this.floating) return null; + var head = this.pm.selection.head; + if (!head) return null; + var cursorPos = this.pm.coordsAtPos(head); + var menuRect = this.menuElt.getBoundingClientRect(); + if (cursorPos.top < menuRect.bottom && cursorPos.bottom > menuRect.top) { + var _ret = (function () { + var scrollable = findWrappingScrollable(_this3.pm.wrapper); + if (scrollable) return { + v: function v() { + return scrollable.scrollTop -= menuRect.bottom - cursorPos.top; + } + }; + })(); + + if (typeof _ret === "object") return _ret.v; } } }]); - return RangeTracker; + return MenuBar; })(); -},{"../util/event":67}],33:[function(require,module,exports){ +function findWrappingScrollable(node) { + for (var cur = node.parentNode; cur; cur = cur.parentNode) { + if (cur.scrollHeight > cur.clientHeight) return cur; + } +} + +(0, _dom.insertCSS)("\n.ProseMirror-menubar {\n position: relative;\n margin-bottom: 3px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar-inner {\n color: #666;\n padding: 1px 6px;\n top: 0; left: 0; right: 0;\n position: absolute;\n border-bottom: 1px solid silver;\n background: white;\n z-index: 10;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar .ProseMirror-icon-active {\n background: #eee;\n}\n\n.ProseMirror-menubar input[type=\"text\"],\n.ProseMirror-menubar textarea {\n background: #eee;\n color: black;\n border: none;\n outline: none;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n}\n\n.ProseMirror-menubar input[type=\"text\"] {\n padding: 0 4px;\n}\n\n.ProseMirror-menubar form {\n position: relative;\n padding: 2px 4px;\n}\n\n.ProseMirror-menubar .ProseMirror-blocktype {\n border: 1px solid #ccc;\n min-width: 4em;\n}\n.ProseMirror-menubar .ProseMirror-blocktype:after {\n color: #ccc;\n}\n\n.ProseMirror-menubar-sliding {\n -webkit-transition: left 0.2s ease-out;\n -moz-transition: left 0.2s ease-out;\n transition: left 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n.ProseMirror-menubar-back {\n position: absolute;\n height: 100%;\n margin-top: -1px;\n padding-bottom: 2px;\n width: 10px;\n left: 0;\n border-right: 1px solid silver;\n cursor: pointer;\n}\n.ProseMirror-menubar-back:after {\n content: \"«\";\n}\n\n"); + +},{"../dom":1,"../edit":9,"./menu":19,"./update":23}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var _get = function get(_x, _x2, _x3) { - var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;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 { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - -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; - }; -})(); - -exports.posFromDOM = posFromDOM; -exports.rangeFromDOMLoose = rangeFromDOMLoose; -exports.findByPath = findByPath; -exports.resolvePath = resolvePath; -exports.hasFocus = hasFocus; -exports.posAtCoords = posAtCoords; -exports.coordsAtPos = coordsAtPos; -exports.scrollIntoView = scrollIntoView; -exports.findSelectionFrom = findSelectionFrom; -exports.findSelectionNear = findSelectionNear; -exports.findSelectionAtStart = findSelectionAtStart; -exports.findSelectionAtEnd = findSelectionAtEnd; -exports.selectableNodeAbove = selectableNodeAbove; -exports.handleNodeClick = handleNodeClick; -exports.verticalMotionLeavesTextblock = verticalMotionLeavesTextblock; -exports.setDOMSelectionToPos = setDOMSelectionToPos; - -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 _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; + }; +})(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -5780,1125 +5977,1018 @@ function _classCallCheck(instance, Constructor) { } } -var _model = require("../model"); - var _dom = require("../dom"); -var SelectionState = (function () { - function SelectionState(pm) { +var prefix = "ProseMirror-tooltip"; + +var Tooltip = (function () { + function Tooltip(pm, dir) { var _this = this; - _classCallCheck(this, SelectionState); + _classCallCheck(this, Tooltip); this.pm = pm; - - this.range = findSelectionAtStart(pm.doc); - this.lastNonNodePos = null; - - this.pollState = null; - this.pollTimeout = null; - this.lastAnchorNode = this.lastHeadNode = this.lastAnchorOffset = this.lastHeadOffset = null; - this.lastNode = null; - - pm.content.addEventListener("focus", function () { - return _this.receivedFocus(); + this.dir = dir || "above"; + this.pointer = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix + "-pointer-" + this.dir + " " + prefix + "-pointer" })); + this.pointerWidth = this.pointerHeight = null; + this.dom = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix })); + this.dom.addEventListener("transitionend", function () { + if (_this.dom.style.opacity == "0") _this.dom.style.display = _this.pointer.style.display = ""; }); + + this.isOpen = false; + this.lastLeft = this.lastRight = null; } - _createClass(SelectionState, [{ - key: "setAndSignal", - value: function setAndSignal(range, clearLast) { - this.set(range, clearLast); - // :: () #path=ProseMirror#events#selectionChange - // Indicates that the editor's selection has changed. - this.pm.signal("selectionChange"); + _createClass(Tooltip, [{ + key: "detach", + value: function detach() { + this.dom.parentNode.removeChild(this.dom); + this.pointer.parentNode.removeChild(this.pointer); } }, { - key: "set", - value: function set(range, clearLast) { - this.range = range; - if (!range.node) this.lastNonNodePos = null; - if (clearLast !== false) this.lastAnchorNode = null; + key: "getSize", + value: function getSize(node) { + var wrap = this.pm.wrapper.appendChild((0, _dom.elt)("div", { + "class": prefix, + style: "display: block; position: absolute" + }, node)); + var size = { width: wrap.offsetWidth, height: wrap.offsetHeight }; + wrap.parentNode.removeChild(wrap); + return size; } }, { - key: "pollForUpdate", - value: function pollForUpdate() { - var _this2 = this; + key: "open", + value: function open(node, pos) { + var left = this.lastLeft = pos ? pos.left : this.lastLeft; + var top = this.lastTop = pos ? pos.top : this.lastTop; - if (this.pm.input.composing) return; - clearTimeout(this.pollTimeout); - this.pollState = "update"; - var n = 0, - check = function check() { - if (_this2.pm.input.composing) { - // Abort - } else if (_this2.pm.operation) { - _this2.pollTimeout = setTimeout(check, 20); - } else if (!_this2.readUpdate() && ++n == 1) { - _this2.pollTimeout = setTimeout(check, 50); - } else { - _this2.stopPollingForUpdate(); - } - }; - this.pollTimeout = setTimeout(check, 20); - } - }, { - key: "stopPollingForUpdate", - value: function stopPollingForUpdate() { - if (this.pollState == "update") { - this.pollState = null; - this.pollToSync(); - } - } - }, { - key: "domChanged", - value: function domChanged() { - var sel = getSelection(); - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastHeadNode || sel.focusOffset != this.lastHeadOffset; - } - }, { - key: "storeDOMState", - value: function storeDOMState() { - var sel = getSelection(); - this.lastAnchorNode = sel.anchorNode;this.lastAnchorOffset = sel.anchorOffset; - this.lastHeadNode = sel.focusNode;this.lastHeadOffset = sel.focusOffset; - } - }, { - key: "readUpdate", - value: function readUpdate() { - if (this.pm.input.composing || !hasFocus(this.pm) || !this.domChanged()) return false; + var size = this.getSize(node); - var sel = getSelection(), - doc = this.pm.doc; - var anchor = posFromDOMInner(this.pm, sel.anchorNode, sel.anchorOffset); - var head = posFromDOMInner(this.pm, sel.focusNode, sel.focusOffset); - var newSel = findSelectionNear(doc, head, this.range.head && this.range.head.cmp(head) < 0 ? -1 : 1); - if (newSel instanceof TextSelection && doc.path(anchor.path).isTextblock) newSel = new TextSelection(anchor, newSel.head); - this.setAndSignal(newSel); - if (newSel instanceof NodeSelection || newSel.head.cmp(head) || newSel.anchor.cmp(anchor)) { - this.toDOM(); - } else { - this.clearNode(); - this.storeDOMState(); - } - return true; - } - }, { - key: "pollToSync", - value: function pollToSync() { - var _this3 = this; + var around = this.pm.wrapper.getBoundingClientRect(); - if (this.pollState) return; - this.pollState = "sync"; - var sync = function sync() { - if (document.activeElement != _this3.pm.content) { - _this3.pollState = null; - } else { - if (!_this3.pm.operation && !_this3.pm.input.composing) _this3.syncDOM(); - _this3.pollTimeout = setTimeout(sync, 200); - } - }; - this.pollTimeout = setTimeout(sync, 200); - } - }, { - key: "syncDOM", - value: function syncDOM() { - if (!this.pm.input.composing && hasFocus(this.pm) && this.domChanged()) this.toDOM(); - } - }, { - key: "toDOM", - value: function toDOM(takeFocus) { - if (this.range instanceof NodeSelection) this.nodeToDOM(takeFocus);else this.rangeToDOM(takeFocus); - } - }, { - key: "nodeToDOM", - value: function nodeToDOM(takeFocus) { - window.getSelection().removeAllRanges(); - if (takeFocus) this.pm.content.focus(); - var pos = this.range.from, - node = this.range.node; - var dom = resolvePath(this.pm.content, pos.toPath()); - if (dom == this.lastNode) return; - this.clearNode(); - addNodeSelection(node, dom); - this.lastNode = dom; - } - }, { - key: "clearNode", - value: function clearNode() { - if (this.lastNode) { - clearNodeSelection(this.lastNode); - this.lastNode = null; - return true; + for (var child = this.dom.firstChild, next = undefined; child; child = next) { + next = child.nextSibling; + if (child != this.pointer) this.dom.removeChild(child); } - } - }, { - key: "rangeToDOM", - value: function rangeToDOM(takeFocus) { - var sel = window.getSelection(); - if (!this.clearNode() && !hasFocus(this.pm)) { - if (!takeFocus) return; - // See https://bugzilla.mozilla.org/show_bug.cgi?id=921444 - else if (_dom.browser.gecko) this.pm.content.focus(); + this.dom.appendChild(node); + + this.dom.style.display = this.pointer.style.display = "block"; + + if (this.pointerWidth == null) { + this.pointerWidth = this.pointer.offsetWidth - 1; + this.pointerHeight = this.pointer.offsetHeight - 1; } - if (!this.domChanged()) return; - var range = document.createRange(); - var content = this.pm.content; - var anchor = DOMFromPos(content, this.range.anchor); - var head = DOMFromPos(content, this.range.head); + this.dom.style.width = size.width + "px"; + this.dom.style.height = size.height + "px"; - if (sel.extend) { - range.setEnd(anchor.node, anchor.offset); - range.collapse(false); - } else { - if (this.range.anchor.cmp(this.range.head) > 0) { - var tmp = anchor;anchor = head;head = tmp; + var margin = 5; + if (this.dir == "above" || this.dir == "below") { + var tipLeft = Math.max(0, Math.min(left - size.width / 2, window.innerWidth - size.width)); + this.dom.style.left = tipLeft - around.left + "px"; + this.pointer.style.left = left - around.left - this.pointerWidth / 2 + "px"; + if (this.dir == "above") { + var tipTop = top - around.top - margin - this.pointerHeight - size.height; + this.dom.style.top = tipTop + "px"; + this.pointer.style.top = tipTop + size.height + "px"; + } else { + // below + var tipTop = top - around.top + margin; + this.pointer.style.top = tipTop + "px"; + this.dom.style.top = tipTop + this.pointerHeight + "px"; } - range.setEnd(head.node, head.offset); - range.setStart(anchor.node, anchor.offset); + } else if (this.dir == "left" || this.dir == "right") { + this.dom.style.top = top - around.top - size.height / 2 + "px"; + this.pointer.style.top = top - this.pointerHeight / 2 - around.top + "px"; + if (this.dir == "left") { + var pointerLeft = left - around.left - margin - this.pointerWidth; + this.dom.style.left = pointerLeft - size.width + "px"; + this.pointer.style.left = pointerLeft + "px"; + } else { + // right + var pointerLeft = left - around.left + margin; + this.dom.style.left = pointerLeft + this.pointerWidth + "px"; + this.pointer.style.left = pointerLeft + "px"; + } + } else if (this.dir == "center") { + var _top = Math.max(around.top, 0), + bottom = Math.min(around.bottom, window.innerHeight); + var fromTop = (bottom - _top - size.height) / 2; + this.dom.style.left = (around.width - size.width) / 2 + "px"; + this.dom.style.top = _top - around.top + fromTop + "px"; } - sel.removeAllRanges(); - sel.addRange(range); - if (sel.extend) sel.extend(head.node, head.offset); - this.storeDOMState(); - } - }, { - key: "receivedFocus", - value: function receivedFocus() { - if (!this.pollState) this.pollToSync(); + + getComputedStyle(this.dom).opacity; + getComputedStyle(this.pointer).opacity; + this.dom.style.opacity = this.pointer.style.opacity = 1; + this.isOpen = true; } }, { - key: "beforeStartOp", - value: function beforeStartOp() { - if (this.pollState == "update" && this.readUpdate()) { - clearTimeout(this.pollTimeout); - this.stopPollingForUpdate(); - } else { - this.syncDOM(); + key: "close", + value: function close() { + if (this.isOpen) { + this.isOpen = false; + this.dom.style.opacity = this.pointer.style.opacity = 0; } } }]); - return SelectionState; + return Tooltip; })(); -exports.SelectionState = SelectionState; +exports.Tooltip = Tooltip; -function clearNodeSelection(dom) { - dom.classList.remove("ProseMirror-selectednode"); -} +(0, _dom.insertCSS)("\n\n.ProseMirror-tooltip {\n position: absolute;\n display: none;\n box-sizing: border-box;\n -moz-box-sizing: border- box;\n overflow: hidden;\n\n -webkit-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n border-radius: 5px;\n padding: 3px 7px;\n margin: 0;\n background: #444;\n border-color: #777;\n color: white;\n\n z-index: 5;\n}\n\n.ProseMirror-tooltip-pointer {\n content: \"\";\n position: absolute;\n display: none;\n width: 0; height: 0;\n\n -webkit-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n z-index: 10;\n}\n\n.ProseMirror-tooltip-pointer-above {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-below {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-right {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-right: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-left {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-left: 6px solid #444;\n}\n\n.ProseMirror-tooltip input[type=\"text\"],\n.ProseMirror-tooltip textarea {\n background: #666;\n color: white;\n border: none;\n outline: none;\n}\n\n.ProseMirror-tooltip input[type=\"text\"] {\n padding: 0 4px;\n}\n\n"); -function addNodeSelection(_node, dom) { - dom.classList.add("ProseMirror-selectednode"); -} +},{"../dom":1}],22:[function(require,module,exports){ +"use strict"; -function windowRect() { - return { left: 0, right: window.innerWidth, - top: 0, bottom: window.innerHeight }; -} +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; + }; +})(); -// ;; An editor selection. Can be one of two selection types: -// `TextSelection` and `NodeSelection`. Both have the properties -// listed here, but also contain more information (such as the -// selected [node](#NodeSelection.node) or the -// [head](#TextSelection.head) and [anchor](#TextSelection.anchor)). +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -var Selection = function Selection() { - _classCallCheck(this, Selection); -}; +var _model = require("../model"); -exports.Selection = Selection; +var _edit = require("../edit"); -// :: Pos #path=Selection.prototype.from -// The start of the selection. +var _dom = require("../dom"); -// :: Pos #path=Selection.prototype.to -// The end of the selection. +var _update = require("./update"); -// :: bool #path=Selection.empty -// True if the selection is an empty text selection (head an anchor -// are the same). +var _tooltip = require("./tooltip"); -// :: (other: Selection) → bool #path=Selection.eq -// Test whether the selection is the same as another selection. +var _menu = require("./menu"); -// :: (doc: Node, mapping: Mappable) → Selection #path=Selection.map -// Map this selection through a [mappable](#Mappable) thing. `doc` -// should be the new document, to which we are mapping. +var classPrefix = "ProseMirror-tooltipmenu"; -// ;; #toc=false A text selection represents a classical editor -// selection, with a head (the moving side) and anchor (immobile -// side), both of which point into textblock nodes. It can be empty (a -// regular cursor position). +(0, _edit.defineOption)("tooltipMenu", false, function (pm, value) { + if (pm.mod.tooltipMenu) pm.mod.tooltipMenu.detach(); + pm.mod.tooltipMenu = value ? new TooltipMenu(pm, value) : null; +}); -var TextSelection = (function (_Selection) { - _inherits(TextSelection, _Selection); +var TooltipMenu = (function () { + function TooltipMenu(pm, config) { + var _this = this; - // :: (Pos, ?Pos) - // Construct a text selection. When `head` is not given, it defaults - // to `anchor`. + _classCallCheck(this, TooltipMenu); - function TextSelection(anchor, head) { - _classCallCheck(this, TextSelection); + this.pm = pm; + this.inlineItems = config && config.inlineItems || (0, _menu.commandGroups)(pm, "inline"); + this.blockItems = config && config.blockItems || (0, _menu.commandGroups)(pm, "block"); + this.showLinks = config ? config.showLinks !== false : true; + this.selectedBlockMenu = config && config.selectedBlockMenu; + this.update = new _update.MenuUpdate(pm, "change selectionChange blur", function () { + return _this.prepareUpdate(); + }); - _get(Object.getPrototypeOf(TextSelection.prototype), "constructor", this).call(this); - // :: Pos - // The selection's immobile side (does not move when pressing - // shift-arrow). - this.anchor = anchor; - // :: Pos - // The selection's mobile side (the side that moves when pressing - // shift-arrow). - this.head = head || anchor; + this.tooltip = new _tooltip.Tooltip(pm, "above"); + this.menu = new _menu.Menu(pm, new _menu.TooltipDisplay(this.tooltip, function () { + return _this.update.force(); + })); } - // ;; #toc=false A node selection is a selection that points at a - // single node. All nodes marked [selectable](#NodeType.selectable) - // can be the target of a node selection. In such an object, `from` - // and `to` point directly before and after the selected node. + /** + * Get the x and y coordinates at the top center of the current DOM selection. + * + * @return {Object} + */ - _createClass(TextSelection, [{ - key: "eq", - value: function eq(other) { - return other instanceof TextSelection && !other.head.cmp(this.head) && !other.anchor.cmp(this.anchor); - } - }, { - key: "map", - value: function map(doc, mapping) { - var head = mapping.map(this.head).pos; - if (!doc.path(head.path).isTextblock) return findSelectionNear(doc, head); - var anchor = mapping.map(this.anchor).pos; - return new TextSelection(doc.path(anchor.path).isTextblock ? anchor : head, head); - } - }, { - key: "inverted", - get: function get() { - return this.anchor.cmp(this.head) > 0; - } - }, { - key: "from", - get: function get() { - return this.inverted ? this.head : this.anchor; - } - }, { - key: "to", - get: function get() { - return this.inverted ? this.anchor : this.head; + _createClass(TooltipMenu, [{ + key: "detach", + value: function detach() { + this.update.detach(); + this.tooltip.detach(); } }, { - key: "empty", - get: function get() { - return this.anchor.cmp(this.head) == 0; - } - }]); - - return TextSelection; -})(Selection); + key: "prepareUpdate", + value: function prepareUpdate() { + var _this2 = this; -exports.TextSelection = TextSelection; + if (this.menu.active) return null; -var NodeSelection = (function (_Selection2) { - _inherits(NodeSelection, _Selection2); + var _pm$selection = this.pm.selection; + var empty = _pm$selection.empty; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to;var link = undefined; + if (!this.pm.hasFocus()) { + return function () { + return _this2.tooltip.close(); + }; + } else if (node && node.isBlock) { + var _ret = (function () { + var coords = topOfNodeSelection(_this2.pm); + return { + v: function v() { + return _this2.menu.show(_this2.blockItems, coords); + } + }; + })(); - // :: (Pos, Pos, Node) - // Create a node selection. Does not verify the validity of its - // arguments. Use `ProseMirror.setNodeSelection` for an easier, - // error-checking way to create a node selection. + if (typeof _ret === "object") return _ret.v; + } else if (!empty) { + var _ret2 = (function () { + var coords = node ? topOfNodeSelection(_this2.pm) : topCenterOfSelection(); + var showBlock = _this2.selectedBlockMenu && _model.Pos.samePath(from.path, to.path) && from.offset == 0 && to.offset == _this2.pm.doc.path(from.path).size; + return { + v: function v() { + return _this2.menu.show(showBlock ? [_this2.inlineItems, _this2.blockItems] : _this2.inlineItems, coords); + } + }; + })(); - function NodeSelection(from, to, node) { - _classCallCheck(this, NodeSelection); + if (typeof _ret2 === "object") return _ret2.v; + } else if (this.selectedBlockMenu && this.pm.doc.path(from.path).size == 0) { + var _ret3 = (function () { + var coords = _this2.pm.coordsAtPos(from); + return { + v: function v() { + return _this2.menu.show(_this2.blockItems, coords); + } + }; + })(); - _get(Object.getPrototypeOf(NodeSelection.prototype), "constructor", this).call(this); - this.from = from; - this.to = to; - // :: Node The selected node. - this.node = node; - } + if (typeof _ret3 === "object") return _ret3.v; + } else if (this.showLinks && (link = this.linkUnderCursor())) { + var _ret4 = (function () { + var coords = _this2.pm.coordsAtPos(from); + return { + v: function v() { + return _this2.showLink(link, coords); + } + }; + })(); - _createClass(NodeSelection, [{ - key: "eq", - value: function eq(other) { - return other instanceof NodeSelection && !this.from.cmp(other.from); + if (typeof _ret4 === "object") return _ret4.v; + } else { + return function () { + return _this2.tooltip.close(); + }; + } } }, { - key: "map", - value: function map(doc, mapping) { - var from = mapping.map(this.from, 1).pos; - var to = mapping.map(this.to, -1).pos; - if (_model.Pos.samePath(from.path, to.path) && from.offset == to.offset - 1) { - var node = doc.nodeAfter(from); - if (node.type.selectable) return new NodeSelection(from, to, node); - } - return findSelectionNear(doc, from); + key: "linkUnderCursor", + value: function linkUnderCursor() { + var head = this.pm.selection.head; + if (!head) return null; + var marks = this.pm.doc.marksAt(head); + return marks.reduce(function (found, m) { + return found || m.type.name == "link" && m; + }, null); } }, { - key: "empty", - get: function get() { - return false; + key: "showLink", + value: function showLink(link, pos) { + var node = (0, _dom.elt)("div", { "class": classPrefix + "-linktext" }, (0, _dom.elt)("a", { href: link.attrs.href, title: link.attrs.title }, link.attrs.href)); + this.tooltip.open(node, pos); } }]); - return NodeSelection; -})(Selection); - -exports.NodeSelection = NodeSelection; + return TooltipMenu; +})(); -function pathFromDOM(pm, node) { - var path = []; - for (; node != pm.content;) { - var attr = node.getAttribute("pm-offset"); - if (attr) path.unshift(+attr); - node = node.parentNode; +function topCenterOfSelection() { + var rects = window.getSelection().getRangeAt(0).getClientRects(); + var _rects$0 = rects[0]; + var left = _rects$0.left; + var right = _rects$0.right; + var top = _rects$0.top;var i = 1; + while (left == right && rects.length > i) { + ;var _rects = rects[i++]; + left = _rects.left; + right = _rects.right; + top = _rects.top; } - return path; + for (; i < rects.length; i++) { + if (rects[i].top < rects[0].bottom - 1 && ( + // Chrome bug where bogus rectangles are inserted at span boundaries + i == rects.length - 1 || Math.abs(rects[i + 1].left - rects[i].left) > 1)) { + left = Math.min(left, rects[i].left); + right = Math.max(right, rects[i].right); + top = Math.min(top, rects[i].top); + } + } + return { top: top, left: (left + right) / 2 }; } -function widthFromDOM(dom) { - var attr = dom.getAttribute("pm-leaf"); - return attr && attr != "true" ? +attr : 1; +function topOfNodeSelection(pm) { + var selected = pm.content.querySelector(".ProseMirror-selectednode"); + if (!selected) return { left: 0, top: 0 }; + var box = selected.getBoundingClientRect(); + return { left: Math.min((box.left + box.right) / 2, box.left + 20), top: box.top }; } -function posFromDOMInner(pm, dom, domOffset, loose) { - if (!loose && pm.operation && pm.doc != pm.operation.doc) throw new Error("Fetching a position from an outdated DOM structure"); - - var extraOffset = 0, - tag = undefined; - for (;;) { - var adjust = 0; - if (dom.nodeType == 3) { - extraOffset += domOffset; - } else if (dom.hasAttribute("pm-offset") || dom == pm.content) { - break; - } else if (tag = dom.getAttribute("pm-inner-offset")) { - extraOffset += +tag; - adjust = -1; - } else if (domOffset && domOffset == dom.childNodes.length) { - adjust = 1; - } +(0, _dom.insertCSS)("\n\n.ProseMirror-tooltipmenu-linktext a {\n color: white;\n text-decoration: none;\n padding: 0 5px;\n}\n\n.ProseMirror-tooltipmenu-linktext a:hover {\n text-decoration: underline;\n}\n\n"); - var _parent = dom.parentNode; - domOffset = adjust < 0 ? 0 : Array.prototype.indexOf.call(_parent.childNodes, dom) + adjust; - dom = _parent; - } +},{"../dom":1,"../edit":9,"../model":27,"./menu":19,"./tooltip":21,"./update":23}],23:[function(require,module,exports){ +"use strict"; - var path = pathFromDOM(pm, dom); - if (dom.hasAttribute("pm-leaf")) return _model.Pos.from(path, extraOffset + (domOffset ? 1 : 0)); +Object.defineProperty(exports, "__esModule", { + value: true +}); - var offset = 0; - for (var i = domOffset - 1; i >= 0; i--) { - var child = dom.childNodes[i]; - if (child.nodeType == 3) { - if (loose) extraOffset += child.nodeValue.length; - } else if (tag = child.getAttribute("pm-offset")) { - offset = +tag + widthFromDOM(child); - break; - } else if (loose && !child.hasAttribute("pm-ignore")) { - extraOffset += child.textContent.length; +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 new _model.Pos(path, offset + extraOffset); -} + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); -function posFromDOM(pm, node, offset) { - if (offset == null) { - offset = Array.prototype.indexOf.call(node.parentNode.childNodes, node); - node = node.parentNode; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } - return posFromDOMInner(pm, node, offset); } -function rangeFromDOMLoose(pm) { - if (!hasFocus(pm)) return null; - var sel = getSelection(); - return new TextSelection(posFromDOMInner(pm, sel.anchorNode, sel.anchorOffset, true), posFromDOMInner(pm, sel.focusNode, sel.focusOffset, true)); -} +var MIN_FLUSH_DELAY = 200; +var UPDATE_TIMEOUT = 200; -function findByPath(node, n, fromEnd) { - for (var ch = fromEnd ? node.lastChild : node.firstChild; ch; ch = fromEnd ? ch.previousSibling : ch.nextSibling) { - if (ch.nodeType != 1) continue; - var offset = ch.getAttribute("pm-offset"); - if (!offset) { - var found = findByPath(ch, n); - if (found) return found; - } else if (+offset == n) { - return ch; - } - } -} +var MenuUpdate = (function () { + function MenuUpdate(pm, events, prepare) { + var _this = this; -function resolvePath(parent, path) { - var node = parent; - for (var i = 0; i < path.length; i++) { - node = findByPath(node, path[i]); - if (!node) throw new Error("Failed to resolve path " + path.join("/")); + _classCallCheck(this, MenuUpdate); + + this.pm = pm; + this.prepare = prepare; + + this.mustUpdate = false; + this.updateInfo = null; + this.timeout = null; + this.lastFlush = 0; + + this.events = events.split(" "); + this.onEvent = this.onEvent.bind(this); + this.force = this.force.bind(this); + this.events.forEach(function (event) { + return pm.on(event, _this.onEvent); + }); + pm.on("flush", this.onFlush = this.onFlush.bind(this)); + pm.on("flushed", this.onFlushed = this.onFlushed.bind(this)); } - return node; -} -function findByOffset(node, offset, after) { - function search(node) { - for (var ch = node.firstChild, i = 0, attr = undefined; ch; ch = ch.nextSibling, i++) { - if (ch.nodeType != 1) continue; - if (attr = ch.getAttribute("pm-offset")) { - var diff = offset - +attr, - width = widthFromDOM(ch); - if (diff >= 0 && (after ? diff <= width : diff < width)) return { node: ch, offset: i, innerOffset: diff }; + _createClass(MenuUpdate, [{ + key: "detach", + value: function detach() { + var _this2 = this; + + clearTimeout(this.timeout); + this.events.forEach(function (event) { + return _this2.pm.off(event, _this2.onEvent); + }); + this.pm.off("flush", this.onFlush); + this.pm.off("flushed", this.onFlushed); + } + }, { + key: "onFlush", + value: function onFlush() { + var now = Date.now(); + if (this.mustUpdate && now - this.lastFlush >= MIN_FLUSH_DELAY) { + this.lastFlush = now; + clearTimeout(this.timeout); + this.mustUpdate = false; + this.update = this.prepare(); + } + } + }, { + key: "onFlushed", + value: function onFlushed() { + if (this.update) { + this.update(); + this.update = null; + } + } + }, { + key: "onEvent", + value: function onEvent() { + this.mustUpdate = true; + clearTimeout(this.timeout); + this.timeout = setTimeout(this.force, UPDATE_TIMEOUT); + } + }, { + key: "force", + value: function force() { + if (this.pm.operation) { + this.onEvent(); } else { - var result = search(ch); - if (result) return result; + this.mustUpdate = false; + this.updateInfo = null; + this.lastFlush = Date.now(); + clearTimeout(this.timeout); + var update = this.prepare(); + if (update) update(); } } - } - return search(node); -} + }]); -function leafAt(node, offset) { - for (;;) { - var child = node.firstChild; - if (!child) return { node: node, offset: offset }; - if (child.nodeType != 1) return { node: child, offset: offset }; - if (child.hasAttribute("pm-inner-offset")) { - var nodeOffset = 0; - for (;;) { - var nextSib = child.nextSibling, - nextOffset = undefined; - if (!nextSib || (nextOffset = +nextSib.getAttribute("pm-inner-offset")) >= offset) break; - child = nextSib; - nodeOffset = nextOffset; + return MenuUpdate; +})(); + +exports.MenuUpdate = MenuUpdate; + +},{}],24:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;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 { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; } - offset -= nodeOffset; + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); } - node = child; } -} +}; -/** - * Get a DOM element at a given position in the document. - * - * @param {Node} parent The parent DOM node. - * @param {Pos} pos The position in the document. - * @return {Object} The DOM node and character offset inside the node. - */ -function DOMFromPos(parent, pos) { - var dom = resolvePath(parent, pos.path); - var found = findByOffset(dom, pos.offset, true), - inner = undefined; - if (!found) return { node: dom, offset: 0 }; - if (found.node.getAttribute("pm-leaf") == "true" || !(inner = leafAt(found.node, found.innerOffset))) return { node: found.node.parentNode, offset: found.offset + (found.innerOffset ? 1 : 0) };else return inner; +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } } -function hasFocus(pm) { - var sel = window.getSelection(); - return sel.rangeCount && (0, _dom.contains)(pm.content, sel.anchorNode); +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; } -/** - * Given an x,y position on the editor, get the position in the document. - * - * @param {ProseMirror} pm Editor instance. - * @param {Object} coords The x, y coordinates. - * @return {Pos} - */ -// FIXME fails on the space between lines -// FIXME reformulate as selectionAtCoords? So that it can't return null +var _schema = require("./schema"); -function posAtCoords(pm, coords) { - var element = document.elementFromPoint(coords.left, coords.top + 1); - if (!(0, _dom.contains)(pm.content, element)) return null; +// ;; #toc="Default schema" The default top-level document node type. - var offset = undefined; - if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) { - element = element.firstChild; - offset = offsetInTextNode(element, coords); - } else { - offset = offsetInElement(element, coords); +var Doc = (function (_Block) { + _inherits(Doc, _Block); + + function Doc() { + _classCallCheck(this, Doc); + + _get(Object.getPrototypeOf(Doc.prototype), "constructor", this).apply(this, arguments); } - return posFromDOM(pm, element, offset); -} + // ;; #toc=false The default blockquote node type. -function textRect(node, from, to) { - var range = document.createRange(); - range.setEnd(node, to); - range.setStart(node, from); - return range.getBoundingClientRect(); -} + _createClass(Doc, null, [{ + key: "kind", + get: function get() { + return "."; + } + }]); -/** - * Given a position in the document model, get a bounding box of the character at - * that position, relative to the window. - * - * @param {ProseMirror} pm The editor instance. - * @param {Pos} pos - * @return {Object} The bounding box. - */ + return Doc; +})(_schema.Block); -function coordsAtPos(pm, pos) { - var _DOMFromPos = DOMFromPos(pm.content, pos); +exports.Doc = Doc; - var node = _DOMFromPos.node; - var offset = _DOMFromPos.offset; +var BlockQuote = (function (_Block2) { + _inherits(BlockQuote, _Block2); - var side = undefined, - rect = undefined; - if (node.nodeType == 3) { - if (offset < node.nodeValue.length) { - rect = textRect(node, offset, offset + 1); - side = "left"; - } - if ((!rect || rect.left == rect.right) && offset) { - rect = textRect(node, offset - 1, offset); - side = "right"; - } - } else if (node.firstChild) { - if (offset < node.childNodes.length) { - var child = node.childNodes[offset]; - rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); - side = "left"; - } - if ((!rect || rect.left == rect.right) && offset) { - var child = node.childNodes[offset - 1]; - rect = child.nodeType == 3 ? textRect(child, 0, child.nodeValue.length) : child.getBoundingClientRect(); - side = "right"; - } - } else { - rect = node.getBoundingClientRect(); - side = "left"; + function BlockQuote() { + _classCallCheck(this, BlockQuote); + + _get(Object.getPrototypeOf(BlockQuote.prototype), "constructor", this).apply(this, arguments); } - var x = rect[side]; - return { top: rect.top, bottom: rect.bottom, left: x, right: x }; -} -var scrollMargin = 5; + // ;; #toc=false The default ordered list node type. Has a single attribute, + // `order`, which determines the number at which the list starts + // counting, and defaults to 1. + return BlockQuote; +})(_schema.Block); -function scrollIntoView(pm, pos) { - if (!pos) pos = pm.sel.range.head || pm.sel.range.from; - var coords = coordsAtPos(pm, pos); - for (var _parent2 = pm.content;; _parent2 = _parent2.parentNode) { - var atBody = _parent2 == document.body; - var rect = atBody ? windowRect() : _parent2.getBoundingClientRect(); - var moveX = 0, - moveY = 0; - if (coords.top < rect.top) moveY = -(rect.top - coords.top + scrollMargin);else if (coords.bottom > rect.bottom) moveY = coords.bottom - rect.bottom + scrollMargin; - if (coords.left < rect.left) moveX = -(rect.left - coords.left + scrollMargin);else if (coords.right > rect.right) moveX = coords.right - rect.right + scrollMargin; - if (moveX || moveY) { - if (atBody) window.scrollBy(moveX, moveY); - } else { - if (moveY) _parent2.scrollTop += moveY; - if (moveX) _parent2.scrollLeft += moveX; +exports.BlockQuote = BlockQuote; + +var OrderedList = (function (_Block3) { + _inherits(OrderedList, _Block3); + + function OrderedList() { + _classCallCheck(this, OrderedList); + + _get(Object.getPrototypeOf(OrderedList.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(OrderedList, null, [{ + key: "contains", + get: function get() { + return "list_item"; } - if (atBody) break; + }]); + + return OrderedList; +})(_schema.Block); + +exports.OrderedList = OrderedList; + +OrderedList.attributes = { order: new _schema.Attribute({ "default": "1" }) }; + +// ;; #toc=false The default bullet list node type. + +var BulletList = (function (_Block4) { + _inherits(BulletList, _Block4); + + function BulletList() { + _classCallCheck(this, BulletList); + + _get(Object.getPrototypeOf(BulletList.prototype), "constructor", this).apply(this, arguments); } -} -function offsetInRects(coords, rects, strict) { - var y = coords.top; - var x = coords.left; + // ;; #toc=false The default list item node type. - var minY = 1e8, - minX = 1e8, - offset = 0; - for (var i = 0; i < rects.length; i++) { - var rect = rects[i]; - if (!rect || rect.top == rect.bottom) continue; - var dX = x < rect.left ? rect.left - x : x > rect.right ? x - rect.right : 0; - if (dX > minX) continue; - if (dX < minX) { - minX = dX;minY = 1e8; - } - var dY = y < rect.top ? rect.top - y : y > rect.bottom ? y - rect.bottom : 0; - if (dY < minY) { - minY = dY; - offset = x < (rect.left + rect.right) / 2 ? i : i + 1; + _createClass(BulletList, null, [{ + key: "contains", + get: function get() { + return "list_item"; } - } - if (strict && (minX || minY)) return null; - return offset; -} + }]); -function offsetInTextNode(text, coords, strict) { - var len = text.nodeValue.length; - var range = document.createRange(); - var rects = []; - for (var i = 0; i < len; i++) { - range.setEnd(text, i + 1); - range.setStart(text, i); - rects.push(range.getBoundingClientRect()); - } - return offsetInRects(coords, rects, strict); -} + return BulletList; +})(_schema.Block); -function offsetInElement(element, coords) { - var rects = []; - for (var child = element.firstChild; child; child = child.nextSibling) { - if (child.getBoundingClientRect) rects.push(child.getBoundingClientRect());else rects.push(null); +exports.BulletList = BulletList; + +var ListItem = (function (_Block5) { + _inherits(ListItem, _Block5); + + function ListItem() { + _classCallCheck(this, ListItem); + + _get(Object.getPrototypeOf(ListItem.prototype), "constructor", this).apply(this, arguments); } - return offsetInRects(coords, rects); -} -function findSelectionIn(doc, path, offset, dir, text) { - var node = doc.path(path); - if (node.isTextblock) return new TextSelection(new _model.Pos(path, offset)); + // ;; #toc=false The default horizontal rule node type. + + _createClass(ListItem, null, [{ + key: "kind", + get: function get() { + return "."; + } + }]); + + return ListItem; +})(_schema.Block); + +exports.ListItem = ListItem; + +var HorizontalRule = (function (_Block6) { + _inherits(HorizontalRule, _Block6); + + function HorizontalRule() { + _classCallCheck(this, HorizontalRule); - for (var i = offset + (dir > 0 ? 0 : -1); dir > 0 ? i < node.size : i >= 0; i += dir) { - var child = node.child(i); - if (!text && child.type.contains == null && child.type.selectable) return new NodeSelection(new _model.Pos(path, i), new _model.Pos(path, i + 1), child); - path.push(i); - var inside = findSelectionIn(doc, path, dir < 0 ? child.size : 0, dir, text); - if (inside) return inside; - path.pop(); + _get(Object.getPrototypeOf(HorizontalRule.prototype), "constructor", this).apply(this, arguments); } -} -// FIXME we'll need some awareness of bidi motion when determining block start and end + // ;; #toc=false The default heading node type. Has a single attribute + // `level`, which indicates the heading level, and defaults to 1. -function findSelectionFrom(doc, pos, dir, text) { - for (var path = pos.path.slice(), offset = pos.offset;;) { - var found = findSelectionIn(doc, path, offset, dir, text); - if (found) return found; - if (!path.length) break; - offset = path.pop() + (dir > 0 ? 1 : 0); - } -} + _createClass(HorizontalRule, null, [{ + key: "contains", + get: function get() { + return null; + } + }]); -function findSelectionNear(doc, pos, bias, text) { - if (bias === undefined) bias = 1; + return HorizontalRule; +})(_schema.Block); - var result = findSelectionFrom(doc, pos, bias, text) || findSelectionFrom(doc, pos, -bias, text); - if (!result) throw new Error("Searching for selection in invalid document " + doc); - return result; -} +exports.HorizontalRule = HorizontalRule; -function findSelectionAtStart(node, path, text) { - if (path === undefined) path = []; +var Heading = (function (_Textblock) { + _inherits(Heading, _Textblock); - return findSelectionIn(node, path.slice(), 0, 1, text); -} + function Heading() { + _classCallCheck(this, Heading); -function findSelectionAtEnd(node, path, text) { - if (path === undefined) path = []; + _get(Object.getPrototypeOf(Heading.prototype), "constructor", this).apply(this, arguments); + } - return findSelectionIn(node, path.slice(), node.size, -1, text); -} + return Heading; +})(_schema.Textblock); -// ;; #path=NodeType #kind=class #noAnchor -// You can add several properties to [node types](#NodeType) to -// influence the way the editor interacts with them. +exports.Heading = Heading; -// :: (node: Node, path: [number], dom: DOMNode, coords: {left: number, top: number}) → ?Pos -// #path=NodeType.prototype.countCoordsAsChild -// Specifies that, if this node is clicked, a child node might -// actually be meant. This is used to, for example, make clicking a -// list marker (which, in the DOM, is part of the list node) select -// the list item it belongs to. Should return null if the given -// coordinates don't refer to a child node, or the [position](#Pos) -// before thechild otherwise. +Heading.attributes = { level: new _schema.Attribute({ "default": "1" }) }; -function selectableNodeAbove(pm, dom, coords, liberal) { - for (; dom && dom != pm.content; dom = dom.parentNode) { - if (dom.hasAttribute("pm-offset")) { - var path = pathFromDOM(pm, dom), - node = pm.doc.path(path); - if (node.type.countCoordsAsChild) { - var result = node.type.countCoordsAsChild(node, path, dom, coords); - if (result) return result; - } - // Leaf nodes are implicitly clickable - if ((liberal || node.type.contains == null) && node.type.selectable) return _model.Pos.from(path); - if (!liberal) return null; - } - } -} +// ;; #toc=false The default code block / listing node type. Only +// allows unmarked text nodes inside of it. -// :: (pm: ProseMirror, event: MouseEvent, path: [number], node: Node) → bool -// #path=NodeType.prototype.handleClick -// If a node is directly clicked (that is, the click didn't land in a -// DOM node belonging to a child node), and its type has a -// `handleClick` method, that method is given a chance to handle the -// click. The method is called, and should return `false` if it did -// _not_ handle the click. -// -// The `event` passed is the event for `"mousedown"`, but calling -// `preventDefault` on it has no effect, since this method is only -// called after a corresponding `"mouseup"` has occurred and -// ProseMirror has determined that this is not a drag or multi-click -// event. +var CodeBlock = (function (_Textblock2) { + _inherits(CodeBlock, _Textblock2); -function handleNodeClick(pm, event) { - for (var dom = event.target; dom && dom != pm.content; dom = dom.parentNode) { - if (dom.hasAttribute("pm-offset")) { - var path = pathFromDOM(pm, dom), - node = pm.doc.path(path); - return node.type.handleClick && node.type.handleClick(pm, event, path, node) !== false; - } - } -} + function CodeBlock() { + _classCallCheck(this, CodeBlock); -function verticalMotionLeavesTextblock(pm, pos, dir) { - var dom = resolvePath(pm.content, pos.path); - var coords = coordsAtPos(pm, pos); - for (var child = dom.firstChild; child; child = child.nextSibling) { - if (child.nodeType != 1) continue; - var boxes = child.getClientRects(); - for (var i = 0; i < boxes.length; i++) { - var box = boxes[i]; - if (dir < 0 ? box.bottom < coords.top : box.top > coords.bottom) return false; - } + _get(Object.getPrototypeOf(CodeBlock.prototype), "constructor", this).apply(this, arguments); } - return true; -} - -function setDOMSelectionToPos(pm, pos) { - var _DOMFromPos2 = DOMFromPos(pm.content, pos); - var node = _DOMFromPos2.node; - var offset = _DOMFromPos2.offset; + // ;; #toc=false The default paragraph node type. - var range = document.createRange(); - range.setEnd(node, offset); - range.setStart(node, offset); - var sel = getSelection(); - sel.removeAllRanges(); - sel.addRange(range); -} + _createClass(CodeBlock, [{ + key: "containsMarks", + get: function get() { + return false; + } + }, { + key: "isCode", + get: function get() { + return true; + } + }], [{ + key: "contains", + get: function get() { + return "text"; + } + }]); -},{"../dom":19,"../model":45}],34:[function(require,module,exports){ -"use strict"; + return CodeBlock; +})(_schema.Textblock); -var _model = require("../model"); +exports.CodeBlock = CodeBlock; -var _edit = require("../edit"); +var Paragraph = (function (_Textblock3) { + _inherits(Paragraph, _Textblock3); -var _inputrules = require("./inputrules"); + function Paragraph() { + _classCallCheck(this, Paragraph); -// :: bool #path=autoInput #kind=option -// When set to true, enables the input rules stored under the -// `"autoInput"` name in the editor's -// [`registry`](#ProseMirror.registry)—by default, these are things -// like smart quotes, and automatically wrapping a block in a list if -// you start it with `"1. "`. -(0, _edit.defineOption)("autoInput", false, function (pm, val) { - if (pm.mod.autoInput) { - pm.mod.autoInput.forEach(function (name) { - return (0, _inputrules.removeInputRule)(pm, name); - }); - pm.mod.autoInput = null; - } - if (val) { - pm.mod.autoInput = []; - pm.registry("autoInput", function (rule, type) { - pm.mod.autoInput.push(rule.name); - if (rule.handler.bind) rule = new _inputrules.InputRule(rule.name, rule.match, rule.filter, rule.handler.bind(type)); - (0, _inputrules.addInputRule)(pm, rule); - }); + _get(Object.getPrototypeOf(Paragraph.prototype), "constructor", this).apply(this, arguments); } -}); -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("emDash", /--$/, "-", "—")); + // ;; #toc=false The default inline image node type. Has these + // attributes: + // + // - **`src`** (required): The URL of the image. + // - **`alt`**: The alt text. + // - **`title`**: The title of the image. -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openDoubleQuote", /\s(")$/, '"', "“")); + _createClass(Paragraph, [{ + key: "defaultTextblock", + get: function get() { + return true; + } + }]); -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeDoubleQuote", /"$/, '"', "”")); + return Paragraph; +})(_schema.Textblock); -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("openSingleQuote", /\s(')$/, "'", "‘")); +exports.Paragraph = Paragraph; -_edit.defaultRegistry.register("autoInput", new _inputrules.InputRule("closeSingleQuote", /'$/, "'", "’")); +var Image = (function (_Inline) { + _inherits(Image, _Inline); -_model.BlockQuote.register("autoInput", new _inputrules.InputRule("startBlockQuote", /^\s*> $/, " ", function (pm, _, pos) { - wrapAndJoin(pm, pos, this); -})); + function Image() { + _classCallCheck(this, Image); -_model.OrderedList.register("autoInput", new _inputrules.InputRule("startOrderedList", /^(\d+)\. $/, " ", function (pm, match, pos) { - var order = +match[1]; - wrapAndJoin(pm, pos, this, { order: order || null }, function (node) { - return node.size + (node.attrs.order || 1) == order; - }); -})); + _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); + } -_model.BulletList.register("autoInput", new _inputrules.InputRule("startBulletList", /^\s*([-+*]) $/, " ", function (pm, match, pos) { - var bullet = match[1]; - wrapAndJoin(pm, pos, this, null, function (node) { - return node.attrs.bullet == bullet; - }); -})); + return Image; +})(_schema.Inline); -_model.CodeBlock.register("autoInput", new _inputrules.InputRule("startCodeBlock", /^```$/, "`", function (pm, _, pos) { - setAs(pm, pos, this, { params: "" }); -})); +exports.Image = Image; -_model.Heading.register("autoInput", new _inputrules.InputRule("startHeading", /^(#{1,6}) $/, " ", function (pm, match, pos) { - setAs(pm, pos, this, { level: match[1].length }); -})); +Image.attributes = { + src: new _schema.Attribute(), + alt: new _schema.Attribute({ "default": "" }), + title: new _schema.Attribute({ "default": "" }) +}; -function wrapAndJoin(pm, pos, type) { - var attrs = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3]; - var predicate = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; +// ;; #toc=false The default hard break node type. - var before = pos.shorten(); - var sibling = before.offset > 0 && pm.doc.path(before.path).child(before.offset - 1); - var join = sibling && sibling.type.name == type && (!predicate || predicate(sibling)); - var tr = pm.tr.wrap(pos, pos, type, attrs); - var delPos = tr.map(pos).pos; - tr["delete"](new _model.Pos(delPos.path, 0), delPos); - if (join) tr.join(before); - tr.apply(); -} +var HardBreak = (function (_Inline2) { + _inherits(HardBreak, _Inline2); -function setAs(pm, pos, type, attrs) { - pm.tr.setBlockType(pos, pos, type, attrs)["delete"](new _model.Pos(pos.path, 0), pos).apply(); -} + function HardBreak() { + _classCallCheck(this, HardBreak); -},{"../edit":27,"../model":45,"./inputrules":35}],35:[function(require,module,exports){ -"use strict"; + _get(Object.getPrototypeOf(HardBreak.prototype), "constructor", this).apply(this, arguments); + } -Object.defineProperty(exports, "__esModule", { - value: true -}); + // ;; #toc=false The default emphasis mark type. -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); + _createClass(HardBreak, [{ + key: "selectable", + get: function get() { + return false; } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); + }, { + key: "isBR", + get: function get() { + return true; + } + }]); -exports.addInputRule = addInputRule; -exports.removeInputRule = removeInputRule; + return HardBreak; +})(_schema.Inline); -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); +exports.HardBreak = HardBreak; + +var EmMark = (function (_MarkType) { + _inherits(EmMark, _MarkType); + + function EmMark() { + _classCallCheck(this, EmMark); + + _get(Object.getPrototypeOf(EmMark.prototype), "constructor", this).apply(this, arguments); } -} -var _model = require("../model"); + // ;; #toc=false The default strong mark type. -var _edit = require("../edit"); + _createClass(EmMark, null, [{ + key: "rank", + get: function get() { + return 51; + } + }]); -// :: (ProseMirror, InputRule) -// Add the given [input rule](#InputRule) to an editor. From now on, -// whenever the rule's pattern is typed, its handler is activated. -// -// Note that the effect of an input rule can be canceled by pressing -// Backspace right after it happens. + return EmMark; +})(_schema.MarkType); -function addInputRule(pm, rule) { - if (!pm.mod.interpretInput) pm.mod.interpretInput = new InputRules(pm); - pm.mod.interpretInput.addRule(rule); -} +exports.EmMark = EmMark; -// :: (ProseMirror, string) -// Remove the input rule with the given name (added earlier with -// `addInputRule`) from the editor. +var StrongMark = (function (_MarkType2) { + _inherits(StrongMark, _MarkType2); -function removeInputRule(pm, name) { - var ii = pm.mod.interpretInput; - if (!ii) return; - ii.removeRule(name); - if (ii.rules.length == 0) { - ii.unregister(); - pm.mod.interpretInput = null; - } -} + function StrongMark() { + _classCallCheck(this, StrongMark); -// ;; Input rules are regular expressions describing a piece of text -// that, when typed, causes something to happen. This might be -// changing two dashes into an emdash, wrapping a paragraph starting -// with `"> "` into a blockquote, or something entirely different. + _get(Object.getPrototypeOf(StrongMark.prototype), "constructor", this).apply(this, arguments); + } -var InputRule = -// :: (string, RegExp, ?string, union) -// Create an input rule. Its name is used to identify it (to disable -// it). The rule applies when the user typed something and the text -// directly in front of the cursor matches `match`, which should -// probably end with `$`. You can optionally provide a filter, which -// should be a single character that always appears at the end of -// the match, and will be used to only apply the rule when there's -// an actual chance of it succeeding. -// -// The `handler` can be a string, in which case the matched text -// will simply be replaced by that string, or a function, which will -// be called with the match array produced by -// [`RegExp.exec`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec), -// and should produce the effect of the rule. -function InputRule(name, match, filter, handler) { - _classCallCheck(this, InputRule); + // ;; #toc=false The default link mark type. Has these attributes: + // + // - **`href`** (required): The link target. + // - **`title`**: The link's title. - this.name = name; - this.filter = filter; - this.match = match; - this.handler = handler; -}; + _createClass(StrongMark, null, [{ + key: "rank", + get: function get() { + return 52; + } + }]); -exports.InputRule = InputRule; + return StrongMark; +})(_schema.MarkType); -var InputRules = (function () { - function InputRules(pm) { - var _this = this; +exports.StrongMark = StrongMark; - _classCallCheck(this, InputRules); +var LinkMark = (function (_MarkType3) { + _inherits(LinkMark, _MarkType3); - this.pm = pm; - this.rules = []; - this.cancelVersion = null; + function LinkMark() { + _classCallCheck(this, LinkMark); - pm.on("selectionChange", this.onSelChange = function () { - return _this.cancelVersion = null; - }); - pm.on("textInput", this.onTextInput = this.onTextInput.bind(this)); - pm.addKeymap(new _edit.Keymap({ Backspace: function Backspace(pm) { - return _this.backspace(pm); - } }, { name: "inputRules" }), 20); + _get(Object.getPrototypeOf(LinkMark.prototype), "constructor", this).apply(this, arguments); } - _createClass(InputRules, [{ - key: "unregister", - value: function unregister() { - this.pm.off("selectionChange", this.onSelChange); - this.pm.off("textInput", this.onTextInput); - this.pm.removeKeymap("inputRules"); - } - }, { - key: "addRule", - value: function addRule(rule) { - this.rules.push(rule); - } - }, { - key: "removeRule", - value: function removeRule(name) { - for (var i = 0; i < this.rules.length; i++) { - if (this.rules[i].name == name) { - this.rules.splice(i, 1); - return true; - } - } + _createClass(LinkMark, null, [{ + key: "rank", + get: function get() { + return 53; } - }, { - key: "onTextInput", - value: function onTextInput(text) { - var pos = this.pm.selection.head; - if (!pos) return; + }]); - var textBefore = undefined, - isCode = undefined; - var lastCh = text[text.length - 1]; + return LinkMark; +})(_schema.MarkType); - for (var i = 0; i < this.rules.length; i++) { - var rule = this.rules[i], - match = undefined; - if (rule.filter && rule.filter != lastCh) continue; - if (textBefore == null) { - ; - var _getContext = getContext(this.pm.doc, pos); +exports.LinkMark = LinkMark; - textBefore = _getContext.textBefore; - isCode = _getContext.isCode; +LinkMark.attributes = { + href: new _schema.Attribute(), + title: new _schema.Attribute({ "default": "" }) +}; - if (isCode) return; - } - if (match = rule.match.exec(textBefore)) { - var startVersion = this.pm.history.getVersion(); - if (typeof rule.handler == "string") { - var offset = pos.offset - (match[1] || match[0]).length; - var start = new _model.Pos(pos.path, offset); - var marks = this.pm.doc.marksAt(pos); - this.pm.tr["delete"](start, pos).insert(start, this.pm.schema.text(rule.handler, marks)).apply(); - } else { - rule.handler(this.pm, match, pos); - } - this.cancelVersion = startVersion; - return; - } - } +// ;; #toc=false The default code font mark type. + +var CodeMark = (function (_MarkType4) { + _inherits(CodeMark, _MarkType4); + + function CodeMark() { + _classCallCheck(this, CodeMark); + + _get(Object.getPrototypeOf(CodeMark.prototype), "constructor", this).apply(this, arguments); + } + + // :: SchemaSpec + // The specification for the default schema. + + _createClass(CodeMark, [{ + key: "isCode", + get: function get() { + return true; } - }, { - key: "backspace", - value: function backspace() { - if (this.cancelVersion) { - this.pm.history.backToVersion(this.cancelVersion); - this.cancelVersion = null; - } else { - return false; - } + }], [{ + key: "rank", + get: function get() { + return 101; } }]); - return InputRules; -})(); + return CodeMark; +})(_schema.MarkType); + +exports.CodeMark = CodeMark; +var defaultSpec = new _schema.SchemaSpec({ + doc: Doc, + blockquote: BlockQuote, + ordered_list: OrderedList, + bullet_list: BulletList, + list_item: ListItem, + horizontal_rule: HorizontalRule, + + paragraph: Paragraph, + heading: Heading, + code_block: CodeBlock, -function getContext(doc, pos) { - var parent = doc.path(pos.path); - var isCode = parent.type.isCode; - var textBefore = ""; - for (var i = parent.iter(0, pos.offset), child = undefined; child = i.next().value;) { - if (child.isText) textBefore += child.text;else textBefore = ""; - if (i.atEnd() && child.marks.some(function (st) { - return st.type.isCode; - })) isCode = true; - } - return { textBefore: textBefore, isCode: isCode }; -} + text: _schema.Text, + image: Image, + hard_break: HardBreak +}, { + em: EmMark, + strong: StrongMark, + link: LinkMark, + code: CodeMark +}); + +// :: Schema +// ProseMirror's default document schema. +var defaultSchema = new _schema.Schema(defaultSpec); +exports.defaultSchema = defaultSchema; -},{"../edit":27,"../model":45}],36:[function(require,module,exports){ +},{"./schema":31}],25:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.getIcon = getIcon; +exports.findDiffStart = findDiffStart; +exports.findDiffEnd = findDiffEnd; -var _dom = require("../dom"); +var _pos = require("./pos"); -var svgCollection = null; -var svgBuilt = Object.create(null); +// :: (Node, Node) → ?Pos +// Find the first position at which nodes `a` and `b` differ, or +// `null` if they are the same. -var SVG = "http://www.w3.org/2000/svg"; -var XLINK = "http://www.w3.org/1999/xlink"; +function findDiffStart(a, b) { + var path = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; -function getIcon(name, data) { - var node = document.createElement("div"); - node.className = "ProseMirror-icon"; - if (data.path) { - if (!svgBuilt[name]) buildSVG(name, data); - var svg = node.appendChild(document.createElementNS(SVG, "svg")); - svg.style.width = data.width / data.height + "em"; - var use = svg.appendChild(document.createElementNS(SVG, "use")); - use.setAttributeNS(XLINK, "href", "#pm-icon-" + name); - } else { - node.textContent = data.text; - if (data.css) node.style.cssText = data.css; + var iA = a.iter(), + iB = b.iter(), + offset = 0; + for (;;) { + if (iA.atEnd() || iB.atEnd()) { + if (a.size == b.size) return null; + break; + } + + var childA = iA.next(), + childB = iB.next(); + if (childA == childB) { + offset += childA.width;continue; + } + + if (!childA.sameMarkup(childB)) break; + + if (childA.isText && childA.text != childB.text) { + for (var j = 0; childA.text[j] == childB.text[j]; j++) { + offset++; + }break; + } + + if (childA.size || childB.size) { + path.push(offset); + var inner = findDiffStart(childA.content, childB.content, path); + if (inner) return inner; + path.pop(); + } + offset += childA.width; } - return node; + return new _pos.Pos(path, offset); } -function buildSVG(name, data) { - if (!svgCollection) { - svgCollection = document.createElementNS(SVG, "svg"); - svgCollection.style.display = "none"; - document.body.insertBefore(svgCollection, document.body.firstChild); +// :: (Node, Node) → ?{a: Pos, b: Pos} +// Find the first position, searching from the end, at which nodes `a` +// and `b` differ, or `null` if they are the same. Since this position +// will not be the same in both nodes, an object with two separate +// positions is returned. + +function findDiffEnd(a, b) { + var pathA = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; + var pathB = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; + + var iA = a.reverseIter(), + iB = b.reverseIter(); + var offA = a.size, + offB = b.size; + + for (;;) { + if (iA.atEnd() || iB.atEnd()) { + if (a.size == b.size) return null; + break; + } + var childA = iA.next(), + childB = iB.next(); + if (childA == childB) { + offA -= childA.width;offB -= childB.width; + continue; + } + + if (!childA.sameMarkup(childB)) break; + + if (childA.isText && childA.text != childB.text) { + var same = 0, + minSize = Math.min(childA.text.length, childB.text.length); + while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { + same++;offA--;offB--; + } + break; + } + offA -= childA.width;offB -= childB.width; + if (childA.size || childB.size) { + pathA.push(offA);pathB.push(offB); + var inner = findDiffEnd(childA.content, childB.content, pathA, pathB); + if (inner) return inner; + pathA.pop();pathB.pop(); + } } - var sym = document.createElementNS(SVG, "symbol"); - sym.id = "pm-icon-" + name; - sym.setAttribute("viewBox", "0 0 " + data.width + " " + data.height); - var path = sym.appendChild(document.createElementNS(SVG, "path")); - path.setAttribute("d", data.path); - svgCollection.appendChild(sym); - svgBuilt[name] = true; + return { a: new _pos.Pos(pathA, offA), b: new _pos.Pos(pathB, offB) }; } -(0, _dom.insertCSS)("\n.ProseMirror-icon {\n display: inline-block;\n line-height: .8;\n vertical-align: middle;\n padding: 2px 8px;\n cursor: pointer;\n}\n\n.ProseMirror-icon-active {\n background: #666;\n border-radius: 4px;\n}\n\n.ProseMirror-icon svg {\n fill: currentColor;\n height: 1em;\n}\n"); - -},{"../dom":19}],37:[function(require,module,exports){ +},{"./pos":30}],26:[function(require,module,exports){ +// ;; A fragment is an abstract type used to represent a node's +// collection of child nodes. It tries to hide considerations about +// the actual way in which the child nodes are stored, so that +// different representations (nodes that only contain simple nodes +// versus nodes that also contain text) can be approached using the +// same API. +// +// Fragments are persistent data structures. That means you should +// _not_ mutate them or their content, but create new instances +// whenever needed. The API tries to make this easy. "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var _get = function get(_x16, _x17, _x18) { + var _again = true;_function: while (_again) { + var object = _x16, + property = _x17, + receiver = _x18;_again = false;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 { + _x16 = parent;_x17 = property;_x18 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { @@ -6909,12 +6999,10 @@ var _createClass = (function () { }; })(); -exports.showSelectMenu = showSelectMenu; -exports.readParams = readParams; -exports.commandGroups = commandGroups; - -function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { "default": obj }; +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; } function _classCallCheck(instance, Constructor) { @@ -6923,872 +7011,902 @@ function _classCallCheck(instance, Constructor) { } } -var _tooltip = require("./tooltip"); - -var _dom = require("../dom"); - -var _edit = require("../edit"); - -var _utilSortedinsert = require("../util/sortedinsert"); - -var _utilSortedinsert2 = _interopRequireDefault(_utilSortedinsert); - -var _icons = require("./icons"); - -var Menu = (function () { - function Menu(pm, display) { - _classCallCheck(this, Menu); - - this.display = display; - this.stack = []; - this.pm = pm; +var Fragment = (function () { + function Fragment() { + _classCallCheck(this, Fragment); } - _createClass(Menu, [{ - key: "show", - value: function show(content, displayInfo) { - this.stack.length = 0; - this.enter(content, displayInfo); - } - }, { - key: "reset", - value: function reset() { - this.stack.length = 0; - this.display.reset(); - } - }, { - key: "enter", - value: function enter(content, displayInfo) { - var _this = this; + _createClass(Fragment, [{ + key: "append", - var pieces = [], - explore = function explore(value) { - if (Array.isArray(value)) { - for (var i = 0; i < value.length; i++) { - explore(value[i]); - }pieces.push(separator); - } else if (!value.select || value.select(_this.pm)) { - pieces.push(value); - } - }; - explore(content); - // Remove superfluous separators - for (var i = 0; i < pieces.length; i++) { - if (pieces[i] == separator && (i == 0 || i == pieces.length - 1 || pieces[i + 1] == separator)) pieces.splice(i--, 1); - }if (!pieces.length) return this.display.clear(); + // :: (Fragment, number, number) → Fragment + // Create a fragment that combines this one with another fragment. + // Takes care of merging adjacent text nodes and can also merge + // “open” nodes at the boundary. `joinLeft` and `joinRight` give the + // depth to which the left and right fragments are open. If open + // nodes with the same markup are found on both sides, they are + // joined. If not, the open nodes are [closed](#Node.close). + value: function append(other) { + var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - this.stack.push(pieces); - this.draw(displayInfo); + if (!this.size) return joinRight ? other.replace(0, other.firstChild.close(joinRight - 1, "start")) : other; + if (!other.size) return joinLeft ? this.replace(this.size - 1, this.lastChild.close(joinLeft - 1, "end")) : this; + return this.appendInner(other, joinLeft, joinRight); } + + // :: string + // Concatenate all the text nodes found in this fragment and its + // children. }, { - key: "draw", - value: function draw(displayInfo) { - var _this2 = this; + key: "toString", - var cur = this.stack[this.stack.length - 1]; - var rendered = (0, _dom.elt)("div", { "class": "ProseMirror-menu" }, cur.map(function (item) { - return renderItem(item, _this2); - })); - if (this.stack.length > 1) this.display.enter(rendered, function () { - return _this2.leave(); - }, displayInfo);else this.display.show(rendered, displayInfo); + // :: () → string + // Return a debugging string that describes this fragment. + value: function toString() { + var str = ""; + this.forEach(function (n) { + return str += (str ? ", " : "") + n.toString(); + }); + return str; } + + // :: (number, number, ?(Node) → Node) → [Node] + // Produce an array with the child nodes between the given + // boundaries, optionally mapping a function over them. }, { - key: "leave", - value: function leave() { - this.stack.pop(); - if (this.stack.length) this.draw();else this.display.reset(); + key: "toArray", + value: function toArray(from, to, f) { + if (from === undefined) from = 0; + if (to === undefined) to = this.size; + + var result = []; + for (var iter = this.iter(from, to), n = undefined; n = iter.next().value;) { + result.push(f ? f(n) : n); + }return result; } + + // :: ((Node) → Node) → Fragment + // Produce a new Fragment by mapping all this fragment's children + // through a function. }, { - key: "active", - get: function get() { - return this.stack.length > 1; + key: "map", + value: function map(f) { + // FIXME join text nodes? + return Fragment.fromArray(this.toArray(undefined, undefined, f)); } - }]); - - return Menu; -})(); - -exports.Menu = Menu; - -var TooltipDisplay = (function () { - function TooltipDisplay(tooltip, resetFunc) { - _classCallCheck(this, TooltipDisplay); - this.tooltip = tooltip; - this.resetFunc = resetFunc; - } - - _createClass(TooltipDisplay, [{ - key: "clear", - value: function clear() { - this.tooltip.close(); - } + // :: ((Node) → bool) → bool + // Returns `true` if the given function returned `true` for any of + // the fragment's children. }, { - key: "reset", - value: function reset() { - if (this.resetFunc) this.resetFunc();else this.clear(); + key: "some", + value: function some(f) { + for (var iter = this.iter(), n = undefined; n = iter.next().value;) { + if (f(n)) return n; + } } }, { - key: "show", - value: function show(dom, info) { - this.tooltip.open(dom, info); + key: "close", + value: function close(depth, side) { + var child = side == "start" ? this.firstChild : this.lastChild; + var closed = child.close(depth - 1, side); + if (closed == child) return this; + return this.replace(side == "start" ? 0 : this.size - 1, closed); } }, { - key: "enter", - value: function enter(dom, back, info) { - var button = (0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back", title: "Back" }); - button.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - back(); - }); - this.show((0, _dom.elt)("div", { "class": "ProseMirror-tooltip-back-wrapper" }, dom, button), info); + key: "nodesBetween", + value: function nodesBetween(from, to, f, path, parent) { + var moreFrom = from && from.depth > path.length, + moreTo = to && to.depth > path.length; + var start = moreFrom ? from.path[path.length] : from ? from.offset : 0; + var end = moreTo ? to.path[path.length] + 1 : to ? to.offset : this.size; + for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { + var startOffset = iter.offset - node.width; + path.push(startOffset); + node.nodesBetween(moreFrom && startOffset == start ? from : null, moreTo && iter.offset == end ? to : null, f, path, parent); + path.pop(); + } } - }]); - - return TooltipDisplay; -})(); - -exports.TooltipDisplay = TooltipDisplay; -function title(pm, command) { - var key = pm.keyForCommand(command.name); - return key ? command.label + " (" + key + ")" : command.label; -} + // :: (?Pos, ?Pos) → Fragment + // Slice out the sub-fragment between the two given positions. + // `null` can be passed for either to indicate the slice should go + // all the way to the start or end of the fragment. + }, { + key: "sliceBetween", + value: function sliceBetween(from, to) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; -function renderIcon(command, menu) { - var icon = resolveIcon(menu.pm, command); - if (command.active(menu.pm)) icon.className += " ProseMirror-icon-active"; - var dom = (0, _dom.elt)("span", { "class": "ProseMirror-menuicon", title: title(menu.pm, command) }, icon); - dom.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - if (!command.params.length) { - command.exec(menu.pm); - menu.reset(); - } else if (command.params.length == 1 && command.params[0].type == "select") { - showSelectMenu(menu.pm, command, dom); - } else { - menu.enter(readParams(command)); + var moreFrom = from && from.depth > depth, + moreTo = to && to.depth > depth; + var start = moreFrom ? from.path[depth] : from ? from.offset : 0; + var end = moreTo ? to.path[depth] + 1 : to ? to.offset : this.size; + var nodes = []; + for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { + var passFrom = moreFrom && iter.offset - node.width == start ? from : null; + var passTo = moreTo && iter.offset == end ? to : null; + if (passFrom || passTo) node = node.sliceBetween(passFrom, passTo, depth + 1); + nodes.push(node); + } + return new this.constructor(nodes); } - }); - return dom; -} -function resolveIcon(pm, command) { - for (;;) { - var icon = command.spec.icon; - if (!icon) break; - if (icon.from) { - command = pm.commands[icon.from]; - if (!command) break; - } else { - return (0, _icons.getIcon)(command.name, icon); + // :: (Schema, Object) → Fragment + // Deserialize a fragment from its JSON representation. + }, { + key: "textContent", + get: function get() { + var text = ""; + this.forEach(function (n) { + return text += n.textContent; + }); + return text; + } + }], [{ + key: "fromJSON", + value: function fromJSON(schema, value) { + return value ? this.fromArray(value.map(schema.nodeFromJSON)) : emptyFragment; } - } - return (0, _icons.getIcon)("default", { text: "✘" }); -} - -function renderSelect(item, menu) { - var param = item.params[0]; - var value = !param["default"] ? null : param["default"].call ? param["default"](menu.pm) : param["default"]; - - var dom = (0, _dom.elt)("div", { "class": "ProseMirror-select ProseMirror-select-command-" + item.name, title: item.label }, !value ? param.defaultLabel || "Select..." : value.display ? value.display(value) : value.label); - dom.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - showSelectMenu(menu.pm, item, dom); - }); - return dom; -} -function showSelectMenu(pm, item, dom) { - var param = item.params[0]; - var options = param.options.call ? param.options(pm) : param.options; - var menu = (0, _dom.elt)("div", { "class": "ProseMirror-select-menu" }, options.map(function (o) { - var dom = (0, _dom.elt)("div", null, o.display ? o.display(o) : o.label); - dom.addEventListener("mousedown", function (e) { - e.preventDefault(); - item.exec(pm, [o.value]); - finish(); - }); - return dom; - })); - var pos = dom.getBoundingClientRect(), - box = pm.wrapper.getBoundingClientRect(); - menu.style.left = pos.left - box.left - 2 + "px"; - menu.style.top = pos.top - box.top - 2 + "px"; + // :: ([Node]) → Fragment + // Build a fragment from an array of nodes. + }, { + key: "fromArray", + value: function fromArray(array) { + if (!array.length) return emptyFragment; + var hasText = false; + for (var i = 0; i < array.length; i++) { + if (array[i].isText) hasText = true; + }return new (hasText ? TextFragment : FlatFragment)(array); + } - var done = false; - function finish() { - if (done) return; - done = true; - document.body.removeEventListener("mousedown", finish); - document.body.removeEventListener("keydown", finish); - pm.wrapper.removeChild(menu); - } - document.body.addEventListener("mousedown", finish); - document.body.addEventListener("keydown", finish); - pm.wrapper.appendChild(menu); -} + // :: (?union) → Fragment + // Create a fragment from something that can be interpreted as a set + // of nodes. For `null`, it returns the empty fragment. For a + // fragment, the fragment itself. For a node or array of nodes, a + // fragment containing those nodes. + }, { + key: "from", + value: function from(nodes) { + if (!nodes) return emptyFragment; + if (nodes instanceof Fragment) return nodes; + return this.fromArray(Array.isArray(nodes) ? nodes : [nodes]); + } + }]); -function renderItem(item, menu) { - var display = item.display || item.spec.display || "icon"; - if (display == "icon") return renderIcon(item, menu);else if (display == "select") return renderSelect(item, menu);else if (!display) throw new Error("Command " + item.name + " can not be shown in a menu");else return display.call(item, menu); -} + return Fragment; +})(); -function buildParamForm(pm, command) { - var prefill = command.spec.prefillParams && command.spec.prefillParams(pm); - var fields = command.params.map(function (param, i) { - var field = undefined, - name = "field_" + i; - var val = prefill ? prefill[i] : param["default"] || ""; - if (param.type == "text") field = (0, _dom.elt)("input", { name: name, type: "text", - placeholder: param.label, - value: val, - autocomplete: "off" });else if (param.type == "select") field = (0, _dom.elt)("select", { name: name }, (param.options.call ? param.options(pm) : param.options).map(function (o) { - return (0, _dom.elt)("option", { value: o.value, selected: o.value == val }, o.label); - }));else // FIXME more types - throw new Error("Unsupported parameter type: " + param.type); - return (0, _dom.elt)("div", null, field); - }); - return (0, _dom.elt)("form", null, fields); -} +exports.Fragment = Fragment; -function gatherParams(pm, command, form) { - var bad = false; - var params = command.params.map(function (param, i) { - var val = form.elements["field_" + i].value; - if (val) return val; - if (param["default"] == null) bad = true;else return param["default"].call ? param["default"](pm) : param["default"]; - }); - return bad ? null : params; -} +var iterEnd = { done: true }; -function paramForm(pm, command, callback) { - var form = buildParamForm(pm, command), - done = false; +var FlatIterator = (function () { + function FlatIterator(array, pos, end) { + _classCallCheck(this, FlatIterator); - var finish = function finish(result) { - if (!done) { - done = true; - callback(result); - } - }; + this.array = array; + this.pos = pos; + this.end = end; + } - var submit = function submit() { - // FIXME error messages - finish(gatherParams(pm, command, form)); - }; - form.addEventListener("submit", function (e) { - e.preventDefault(); - submit(); - }); - form.addEventListener("keydown", function (e) { - if (e.keyCode == 27) { - finish(null); - } else if (e.keyCode == 13 && !(e.ctrlKey || e.metaKey || e.shiftKey)) { - e.preventDefault(); - submit(); + _createClass(FlatIterator, [{ + key: "copy", + value: function copy() { + return new this.constructor(this.array, this.pos, this.end); } - }); - // FIXME too hacky? - setTimeout(function () { - var input = form.querySelector("input, textarea"); - if (input) input.focus(); - }, 20); + }, { + key: "atEnd", + value: function atEnd() { + return this.pos == this.end; + } + }, { + key: "next", + value: function next() { + return this.pos == this.end ? iterEnd : this.array[this.pos++]; + } + }, { + key: "offset", + get: function get() { + return this.pos; + } + }]); - return form; -} + return FlatIterator; +})(); -function readParams(command) { - return { display: function display(menu) { - return paramForm(menu.pm, command, function (params) { - menu.pm.focus(); - if (params) { - command.exec(menu.pm, params); - menu.reset(); - } else { - menu.leave(); - } - }); - } }; -} +var ReverseFlatIterator = (function (_FlatIterator) { + _inherits(ReverseFlatIterator, _FlatIterator); -var separator = { - display: function display() { - return (0, _dom.elt)("div", { "class": "ProseMirror-menuseparator" }); - } -}; + function ReverseFlatIterator() { + _classCallCheck(this, ReverseFlatIterator); -function commandGroups(pm) { - for (var _len = arguments.length, names = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - names[_key - 1] = arguments[_key]; + _get(Object.getPrototypeOf(ReverseFlatIterator.prototype), "constructor", this).apply(this, arguments); } - return names.map(function (group) { - var found = []; - for (var _name in pm.commands) { - var cmd = pm.commands[_name]; - if (cmd.spec.menuGroup && cmd.spec.menuGroup == group) (0, _utilSortedinsert2["default"])(found, cmd, function (a, b) { - return (a.spec.menuRank || 50) - (b.spec.menuRank || 50); - }); + // ;; #forward=Fragment + + _createClass(ReverseFlatIterator, [{ + key: "next", + value: function next() { + return this.pos == this.end ? iterEnd : this.array[--this.pos]; } - return found; - }); -} + }]); -function tooltipParamHandler(pm, command, callback) { - var tooltip = new _tooltip.Tooltip(pm, "center"); - tooltip.open(paramForm(pm, command, function (params) { - pm.focus(); - tooltip.close(); - callback(params); - })); -} + return ReverseFlatIterator; +})(FlatIterator); -(0, _edit.defineParamHandler)("default", tooltipParamHandler); -(0, _edit.defineParamHandler)("tooltip", tooltipParamHandler); +var FlatFragment = (function (_Fragment) { + _inherits(FlatFragment, _Fragment); -// FIXME check for obsolete styles -(0, _dom.insertCSS)("\n\n.ProseMirror-menu {\n margin: 0 -4px;\n line-height: 1;\n white-space: pre;\n}\n.ProseMirror-tooltip .ProseMirror-menu {\n width: -webkit-fit-content;\n width: fit-content;\n}\n\n.ProseMirror-tooltip-back-wrapper {\n padding-left: 12px;\n}\n.ProseMirror-tooltip-back {\n position: absolute;\n top: 5px; left: 5px;\n cursor: pointer;\n}\n.ProseMirror-tooltip-back:after {\n content: \"«\";\n}\n\n.ProseMirror-menuicon {\n margin: 0 7px;\n}\n\n.ProseMirror-menuseparator {\n display: inline-block;\n}\n.ProseMirror-menuseparator:after {\n content: \"︙\";\n opacity: 0.5;\n padding: 0 4px;\n vertical-align: baseline;\n}\n\n.ProseMirror-select, .ProseMirror-select-menu {\n border: 1px solid #777;\n border-radius: 3px;\n font-size: 90%;\n}\n\n.ProseMirror-select {\n padding: 1px 12px 1px 4px;\n display: inline-block;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n margin: 0 8px;\n}\n\n.ProseMirror-select-command-textblockType {\n min-width: 3.2em;\n}\n\n.ProseMirror-select:after {\n content: \"▿\";\n color: #777;\n position: absolute;\n right: 4px;\n}\n\n.ProseMirror-select-menu {\n position: absolute;\n background: #444;\n color: white;\n padding: 2px 2px;\n z-index: 15;\n}\n.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n.ProseMirror-select-menu div:hover {\n background: #777;\n}\n\n"); + function FlatFragment(content) { + _classCallCheck(this, FlatFragment); -},{"../dom":19,"../edit":27,"../util/sortedinsert":69,"./icons":36,"./tooltip":39}],38:[function(require,module,exports){ -"use strict"; + _get(Object.getPrototypeOf(FlatFragment.prototype), "constructor", this).call(this); + this.content = content; + } -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); + // :: Fragment + // An empty fragment. Intended to be reused whenever a node doesn't + // contain anything (rather than allocating a new empty fragment for + // each leaf node). + + // :: (?number, ?number) → Iterator + // Create a forward iterator over the content of the fragment. An + // explicit start and end offset can be given to have the iterator + // go over only part of the content. If an iteration bound falls + // within a text node, only the part that is within the bounds is + // yielded. + + _createClass(FlatFragment, [{ + key: "iter", + value: function iter() { + var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var end = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + + return new FlatIterator(this.content, start, end); } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} + // :: (?number, ?number) → Iterator + // Create a reverse iterator over the content of the fragment. An + // explicit start and end offset can be given to have the iterator + // go over only part of the content. **Note**: `start` should be + // greater than `end`, when passed. + }, { + key: "reverseIter", + value: function reverseIter() { + var start = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; + var end = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; -var _edit = require("../edit"); + return new ReverseFlatIterator(this.content, start, end); + } -var _dom = require("../dom"); + // :: number + // The maximum offset in this fragment. + }, { + key: "child", -var _update = require("./update"); + // :: (number) → Node + // Get the child at the given offset. Might return a text node that + // stretches before and/or after the offset. + value: function child(off) { + if (off < 0 || off >= this.content.length) throw new Error("Offset " + off + " out of range"); + return this.content[off]; + } -var _menu = require("./menu"); + // :: ((node: Node, start: number, end: number)) + // Call the given function for each node in the fragment, passing it + // the node, its start offset, and its end offset. + }, { + key: "forEach", + value: function forEach(f) { + for (var i = 0; i < this.content.length; i++) { + f(this.content[i], i, i + 1); + } + } -(0, _edit.defineOption)("menuBar", false, function (pm, value) { - if (pm.mod.menuBar) pm.mod.menuBar.detach(); - pm.mod.menuBar = value ? new MenuBar(pm, value) : null; -}); + // :: (number) → {start: number, node: Node} + // Find the node before the given offset. Returns an object + // containing the node as well as its start index. Offset should be + // greater than zero. + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + return { node: this.child(off - 1), start: off - 1 }; + } -var BarDisplay = (function () { - function BarDisplay(container, resetFunc) { - _classCallCheck(this, BarDisplay); + // :: (number) → {start: number, node: Node} + // Find the node after the given offset. Returns an object + // containing the node as well as its start index. Offset should be + // less than the fragment's size. + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + return { node: this.child(off), start: off }; + } - this.container = container; - this.resetFunc = resetFunc; - } + // :: (number, ?number) → Fragment + // Return a fragment with only the nodes between the given offsets. + // When `to` is not given, the slice will go to the end of the + // fragment. + }, { + key: "slice", + value: function slice(from) { + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - _createClass(BarDisplay, [{ - key: "clear", - value: function clear() { - this.container.textContent = ""; + if (from == to) return emptyFragment; + return new FlatFragment(this.content.slice(from, to)); } + + // :: (number, Node) → Fragment + // Return a fragment in which the node at the given offset is + // replaced by the given node. The node, as well as the one it + // replaces, should not be text nodes. }, { - key: "reset", - value: function reset() { - this.resetFunc(); + key: "replace", + value: function replace(offset, node) { + if (node.isText) throw new Error("Argument to replace should be a non-text node"); + var copy = this.content.slice(); + copy[offset] = node; + return new FlatFragment(copy); } }, { - key: "show", - value: function show(dom) { - this.clear(); - this.container.appendChild(dom); + key: "appendInner", + value: function appendInner(other, joinLeft, joinRight) { + var last = this.content.length - 1, + content = this.content.slice(0, last); + var before = this.content[last], + after = other.firstChild; + if (joinLeft > 0 && joinRight > 0 && before.sameMarkup(after)) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); + return Fragment.fromArray(content.concat(other.toArray(after.width))); } + + // :: () → Object + // Create a JSON-serializeable representation of this fragment. }, { - key: "enter", - value: function enter(dom, back) { - var current = this.container.firstChild; - if (current) { - current.style.position = "absolute"; - current.style.opacity = "0.5"; - } - var backButton = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-back" }); - backButton.addEventListener("mousedown", function (e) { - e.preventDefault();e.stopPropagation(); - back(); - }); - var added = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-sliding" }, backButton, dom); - this.container.appendChild(added); - added.getBoundingClientRect(); // Force layout for transition - added.style.left = "0"; - added.addEventListener("transitionend", function () { - if (current && current.parentNode) current.parentNode.removeChild(current); + key: "toJSON", + value: function toJSON() { + return this.content.map(function (n) { + return n.toJSON(); }); } - }]); + }, { + key: "size", + get: function get() { + return this.content.length; + } - return BarDisplay; -})(); + // :: ?Node + // The first child of the fragment, or `null` if it is empty. + }, { + key: "firstChild", + get: function get() { + return this.content.length ? this.content[0] : null; + } -var MenuBar = (function () { - function MenuBar(pm, config) { - var _this = this; + // :: ?Node + // The last child of the fragment, or `null` if it is empty. + }, { + key: "lastChild", + get: function get() { + return this.content.length ? this.content[this.content.length - 1] : null; + } + }]); - _classCallCheck(this, MenuBar); + return FlatFragment; +})(Fragment); - this.pm = pm; +var emptyFragment = new FlatFragment([]); - this.menuElt = (0, _dom.elt)("div", { "class": "ProseMirror-menubar-inner" }); - this.wrapper = (0, _dom.elt)("div", { "class": "ProseMirror-menubar" }, (0, _dom.elt)("div", { "class": "ProseMirror-menu", style: "visibility: hiffdden; z-index: 100" }, (0, _dom.elt)("span", { "class": "ProseMirror-menuicon" }, (0, _dom.elt)("div", { "class": "ProseMirror-icon" }, "x"))), this.menuElt); - pm.wrapper.insertBefore(this.wrapper, pm.wrapper.firstChild); +exports.emptyFragment = emptyFragment; - this.update = new _update.MenuUpdate(pm, "selectionChange change activeMarkChange", function () { - return _this.prepareUpdate(); - }); - this.menu = new _menu.Menu(pm, new BarDisplay(this.menuElt, function () { - return _this.resetMenu(); - })); +var TextIterator = (function () { + function TextIterator(fragment, startOffset, endOffset) { + var pos = arguments.length <= 3 || arguments[3] === undefined ? -1 : arguments[3]; - this.menuItems = config && config.items || (0, _menu.commandGroups)(pm, "inline", "block", "history"); - this.update.force(); + _classCallCheck(this, TextIterator); - this.floating = false; - if (config && config.float) { - this.updateFloat(); - this.scrollFunc = function () { - if (!document.body.contains(_this.pm.wrapper)) window.removeEventListener("scroll", _this.scrollFunc);else _this.updateFloat(); - }; - window.addEventListener("scroll", this.scrollFunc); - } + this.frag = fragment; + this.offset = startOffset; + this.pos = pos; + this.endOffset = endOffset; } - _createClass(MenuBar, [{ - key: "detach", - value: function detach() { - this.update.detach(); - this.wrapper.parentNode.removeChild(this.wrapper); - - if (this.scrollFunc) window.removeEventListener("scroll", this.scrollFunc); + _createClass(TextIterator, [{ + key: "copy", + value: function copy() { + return new this.constructor(this.frag, this.offset, this.endOffset, this.pos); } }, { - key: "prepareUpdate", - value: function prepareUpdate() { - var _this2 = this; - - var scrollCursor = this.prepareScrollCursor(); - return function () { - if (!_this2.menu.active) _this2.resetMenu(); - if (scrollCursor) scrollCursor(); - }; + key: "atEnd", + value: function atEnd() { + return this.offset == this.endOffset; } }, { - key: "resetMenu", - value: function resetMenu() { - this.menu.show(this.menuItems); + key: "next", + value: function next() { + if (this.pos == -1) { + var start = this.init(); + if (start) return start; + } + return this.offset == this.endOffset ? iterEnd : this.advance(); } }, { - key: "updateFloat", - value: function updateFloat() { - var editorRect = this.pm.wrapper.getBoundingClientRect(); - if (this.floating) { - if (editorRect.top >= 0 || editorRect.bottom < this.menuElt.offsetHeight + 10) { - this.floating = false; - this.menuElt.style.position = this.menuElt.style.left = this.menuElt.style.width = ""; - this.menuElt.style.display = ""; - } else { - var border = (this.pm.wrapper.offsetWidth - this.pm.wrapper.clientWidth) / 2; - this.menuElt.style.left = editorRect.left + border + "px"; - this.menuElt.style.display = editorRect.top > window.innerHeight ? "none" : ""; - } - } else { - if (editorRect.top < 0 && editorRect.bottom >= this.menuElt.offsetHeight + 10) { - this.floating = true; - var menuRect = this.menuElt.getBoundingClientRect(); - this.menuElt.style.left = menuRect.left + "px"; - this.menuElt.style.width = menuRect.width + "px"; - this.menuElt.style.position = "fixed"; - } + key: "advance", + value: function advance() { + var node = this.frag.content[this.pos++], + end = this.offset + node.width; + if (end > this.endOffset) { + node = node.copy(node.text.slice(0, this.endOffset - this.offset)); + this.offset = this.endOffset; + return node; } + this.offset = end; + return node; } }, { - key: "prepareScrollCursor", - value: function prepareScrollCursor() { - var _this3 = this; + key: "init", + value: function init() { + this.pos = 0; + var offset = 0; + while (offset < this.offset) { + var node = this.frag.content[this.pos++], + end = offset + node.width; + if (end == this.offset) break; + if (end > this.offset) { + var sliceEnd = node.width; + if (end > this.endOffset) { + sliceEnd = this.endOffset - offset; + end = this.endOffset; + } + node = node.copy(node.text.slice(this.offset - offset, sliceEnd)); + this.offset = end; + return node; + } + offset = end; + } + } + }]); - if (!this.floating) return null; - var head = this.pm.selection.head; - if (!head) return null; - var cursorPos = this.pm.coordsAtPos(head); - var menuRect = this.menuElt.getBoundingClientRect(); - if (cursorPos.top < menuRect.bottom && cursorPos.bottom > menuRect.top) { - var _ret = (function () { - var scrollable = findWrappingScrollable(_this3.pm.wrapper); - if (scrollable) return { - v: function v() { - return scrollable.scrollTop -= menuRect.bottom - cursorPos.top; - } - }; - })(); + return TextIterator; +})(); - if (typeof _ret === "object") return _ret.v; +var ReverseTextIterator = (function (_TextIterator) { + _inherits(ReverseTextIterator, _TextIterator); + + function ReverseTextIterator() { + _classCallCheck(this, ReverseTextIterator); + + _get(Object.getPrototypeOf(ReverseTextIterator.prototype), "constructor", this).apply(this, arguments); + } + + _createClass(ReverseTextIterator, [{ + key: "advance", + value: function advance() { + var node = this.frag.content[--this.pos], + end = this.offset - node.width; + if (end < this.endOffset) { + node = node.copy(node.text.slice(this.endOffset - end)); + this.offset = this.endOffset; + return node; + } + this.offset = end; + return node; + } + }, { + key: "init", + value: function init() { + this.pos = this.frag.content.length; + var offset = this.frag.size; + while (offset > this.offset) { + var node = this.frag.content[--this.pos], + end = offset - node.width; + if (end == this.offset) break; + if (end < this.offset) { + if (end < this.endOffset) { + node = node.copy(node.text.slice(this.endOffset - end, this.offset - end)); + end = this.endOffset; + } else { + node = node.copy(node.text.slice(0, this.offset - end)); + } + this.offset = end; + return node; + } + offset = end; } } }]); - return MenuBar; -})(); - -function findWrappingScrollable(node) { - for (var cur = node.parentNode; cur; cur = cur.parentNode) { - if (cur.scrollHeight > cur.clientHeight) return cur; - } -} - -(0, _dom.insertCSS)("\n.ProseMirror-menubar {\n position: relative;\n margin-bottom: 3px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar-inner {\n color: #666;\n padding: 1px 6px;\n top: 0; left: 0; right: 0;\n position: absolute;\n border-bottom: 1px solid silver;\n background: white;\n z-index: 10;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n\n.ProseMirror-menubar .ProseMirror-icon-active {\n background: #eee;\n}\n\n.ProseMirror-menubar input[type=\"text\"],\n.ProseMirror-menubar textarea {\n background: #eee;\n color: black;\n border: none;\n outline: none;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n}\n\n.ProseMirror-menubar input[type=\"text\"] {\n padding: 0 4px;\n}\n\n.ProseMirror-menubar form {\n position: relative;\n padding: 2px 4px;\n}\n\n.ProseMirror-menubar .ProseMirror-blocktype {\n border: 1px solid #ccc;\n min-width: 4em;\n}\n.ProseMirror-menubar .ProseMirror-blocktype:after {\n color: #ccc;\n}\n\n.ProseMirror-menubar-sliding {\n -webkit-transition: left 0.2s ease-out;\n -moz-transition: left 0.2s ease-out;\n transition: left 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n.ProseMirror-menubar-back {\n position: absolute;\n height: 100%;\n margin-top: -1px;\n padding-bottom: 2px;\n width: 10px;\n left: 0;\n border-right: 1px solid silver;\n cursor: pointer;\n}\n.ProseMirror-menubar-back:after {\n content: \"«\";\n}\n\n"); + return ReverseTextIterator; +})(TextIterator); -},{"../dom":19,"../edit":27,"./menu":37,"./update":41}],39:[function(require,module,exports){ -"use strict"; +var TextFragment = (function (_Fragment2) { + _inherits(TextFragment, _Fragment2); -Object.defineProperty(exports, "__esModule", { - value: true -}); + function TextFragment(content, size) { + _classCallCheck(this, TextFragment); -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); + _get(Object.getPrototypeOf(TextFragment.prototype), "constructor", this).call(this); + this.content = content; + this.size = size || 0; + if (size == null) for (var i = 0; i < content.length; i++) { + this.size += content[i].width; } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); } -} -var _dom = require("../dom"); - -var prefix = "ProseMirror-tooltip"; - -var Tooltip = (function () { - function Tooltip(pm, dir) { - var _this = this; - - _classCallCheck(this, Tooltip); - - this.pm = pm; - this.dir = dir || "above"; - this.pointer = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix + "-pointer-" + this.dir + " " + prefix + "-pointer" })); - this.pointerWidth = this.pointerHeight = null; - this.dom = pm.wrapper.appendChild((0, _dom.elt)("div", { "class": prefix })); - this.dom.addEventListener("transitionend", function () { - if (_this.dom.style.opacity == "0") _this.dom.style.display = _this.pointer.style.display = ""; - }); + _createClass(TextFragment, [{ + key: "iter", + value: function iter() { + var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - this.isOpen = false; - this.lastLeft = this.lastRight = null; - } + return new TextIterator(this, from, to); + } + }, { + key: "reverseIter", + value: function reverseIter() { + var from = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - _createClass(Tooltip, [{ - key: "detach", - value: function detach() { - this.dom.parentNode.removeChild(this.dom); - this.pointer.parentNode.removeChild(this.pointer); + return new ReverseTextIterator(this, from, to); } }, { - key: "getSize", - value: function getSize(node) { - var wrap = this.pm.wrapper.appendChild((0, _dom.elt)("div", { - "class": prefix, - style: "display: block; position: absolute" - }, node)); - var size = { width: wrap.offsetWidth, height: wrap.offsetHeight }; - wrap.parentNode.removeChild(wrap); - return size; + key: "child", + value: function child(off) { + if (off < 0 || off >= this.size) throw new Error("Offset " + off + " out of range"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i]; + curOff += child.width; + if (curOff > off) return child; + } } }, { - key: "open", - value: function open(node, pos) { - var left = this.lastLeft = pos ? pos.left : this.lastLeft; - var top = this.lastTop = pos ? pos.top : this.lastTop; - - var size = this.getSize(node); - - var around = this.pm.wrapper.getBoundingClientRect(); - - for (var child = this.dom.firstChild, next = undefined; child; child = next) { - next = child.nextSibling; - if (child != this.pointer) this.dom.removeChild(child); + key: "forEach", + value: function forEach(f) { + for (var i = 0, off = 0; i < this.content.length; i++) { + var child = this.content[i]; + f(child, off, off += child.width); } - this.dom.appendChild(node); - - this.dom.style.display = this.pointer.style.display = "block"; - - if (this.pointerWidth == null) { - this.pointerWidth = this.pointer.offsetWidth - 1; - this.pointerHeight = this.pointer.offsetHeight - 1; + } + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + if (!off) throw new Error("No chunk before start of node"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i], + end = curOff + child.width; + if (end >= off) return { node: child, start: curOff }; + curOff = end; } - - this.dom.style.width = size.width + "px"; - this.dom.style.height = size.height + "px"; - - var margin = 5; - if (this.dir == "above" || this.dir == "below") { - var tipLeft = Math.max(0, Math.min(left - size.width / 2, window.innerWidth - size.width)); - this.dom.style.left = tipLeft - around.left + "px"; - this.pointer.style.left = left - around.left - this.pointerWidth / 2 + "px"; - if (this.dir == "above") { - var tipTop = top - around.top - margin - this.pointerHeight - size.height; - this.dom.style.top = tipTop + "px"; - this.pointer.style.top = tipTop + size.height + "px"; - } else { - // below - var tipTop = top - around.top + margin; - this.pointer.style.top = tipTop + "px"; - this.dom.style.top = tipTop + this.pointerHeight + "px"; - } - } else if (this.dir == "left" || this.dir == "right") { - this.dom.style.top = top - around.top - size.height / 2 + "px"; - this.pointer.style.top = top - this.pointerHeight / 2 - around.top + "px"; - if (this.dir == "left") { - var pointerLeft = left - around.left - margin - this.pointerWidth; - this.dom.style.left = pointerLeft - size.width + "px"; - this.pointer.style.left = pointerLeft + "px"; - } else { - // right - var pointerLeft = left - around.left + margin; - this.dom.style.left = pointerLeft + this.pointerWidth + "px"; - this.pointer.style.left = pointerLeft + "px"; - } - } else if (this.dir == "center") { - var _top = Math.max(around.top, 0), - bottom = Math.min(around.bottom, window.innerHeight); - var fromTop = (bottom - _top - size.height) / 2; - this.dom.style.left = (around.width - size.width) / 2 + "px"; - this.dom.style.top = _top - around.top + fromTop + "px"; + } + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + if (off == this.size) throw new Error("No chunk after end of node"); + for (var i = 0, curOff = 0; i < this.content.length; i++) { + var child = this.content[i], + end = curOff + child.width; + if (end > off) return { node: child, start: curOff }; + curOff = end; } + } + }, { + key: "slice", + value: function slice() { + var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; + var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - getComputedStyle(this.dom).opacity; - getComputedStyle(this.pointer).opacity; - this.dom.style.opacity = this.pointer.style.opacity = 1; - this.isOpen = true; + if (from == to) return emptyFragment; + return new TextFragment(this.toArray(from, to)); } }, { - key: "close", - value: function close() { - if (this.isOpen) { - this.isOpen = false; - this.dom.style.opacity = this.pointer.style.opacity = 0; + key: "replace", + value: function replace(off, node) { + if (node.isText) throw new Error("Argument to replace should be a non-text node"); + var curNode = undefined, + index = undefined; + for (var curOff = 0; curOff < off; index++) { + curNode = this.content[index]; + curOff += curNode.width; } + if (curNode.isText) throw new Error("Can not replace text content with replace method"); + var copy = this.content.slice(); + copy[index] = node; + return new TextFragment(copy); } - }]); - - return Tooltip; -})(); - -exports.Tooltip = Tooltip; - -(0, _dom.insertCSS)("\n\n.ProseMirror-tooltip {\n position: absolute;\n display: none;\n box-sizing: border-box;\n -moz-box-sizing: border- box;\n overflow: hidden;\n\n -webkit-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: width 0.4s ease-out, height 0.4s ease-out, left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n border-radius: 5px;\n padding: 3px 7px;\n margin: 0;\n background: #444;\n border-color: #777;\n color: white;\n\n z-index: 5;\n}\n\n.ProseMirror-tooltip-pointer {\n content: \"\";\n position: absolute;\n display: none;\n width: 0; height: 0;\n\n -webkit-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n -moz-transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n transition: left 0.4s ease-out, top 0.4s ease-out, opacity 0.2s;\n opacity: 0;\n\n z-index: 10;\n}\n\n.ProseMirror-tooltip-pointer-above {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-top: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-below {\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-right {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-right: 6px solid #444;\n}\n\n.ProseMirror-tooltip-pointer-left {\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n border-left: 6px solid #444;\n}\n\n.ProseMirror-tooltip input[type=\"text\"],\n.ProseMirror-tooltip textarea {\n background: #666;\n color: white;\n border: none;\n outline: none;\n}\n\n.ProseMirror-tooltip input[type=\"text\"] {\n padding: 0 4px;\n}\n\n"); - -},{"../dom":19}],40:[function(require,module,exports){ -"use strict"; - -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); + }, { + key: "appendInner", + value: function appendInner(other, joinLeft, joinRight) { + var last = this.content.length - 1, + content = this.content.slice(0, last); + var before = this.content[last], + after = other.firstChild; + var same = before.sameMarkup(after); + if (same && before.isText) content.push(before.copy(before.text + after.text));else if (same && joinLeft > 0 && joinRight > 0) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); + return Fragment.fromArray(content.concat(other.toArray(after.width))); + } + }, { + key: "toJSON", + value: function toJSON() { + return this.content.map(function (n) { + return n.toJSON(); + }); + } + }, { + key: "firstChild", + get: function get() { + return this.size ? this.content[0] : null; + } + }, { + key: "lastChild", + get: function get() { + return this.size ? this.content[this.content.length - 1] : null; } - }return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _model = require("../model"); - -var _edit = require("../edit"); - -var _dom = require("../dom"); + }]); -var _update = require("./update"); + return TextFragment; +})(Fragment); -var _tooltip = require("./tooltip"); +if (typeof Symbol != "undefined") { + // :: () → Iterator + // A fragment is iterable, in the ES6 sense. + Fragment.prototype[Symbol.iterator] = function () { + return this.iter(); + }; + FlatIterator.prototype[Symbol.iterator] = TextIterator.prototype[Symbol.iterator] = function () { + return this; + }; +} -var _menu = require("./menu"); +},{}],27:[function(require,module,exports){ +// !! +// This module defines ProseMirror's document model, the data +// structure used to define and inspect content documents. It +// includes: +// +// * The [node](#Node) type that represents document elements +// +// * The [schema](#Schema) types used to tag and constrain the +// document structure +// +// * The data type for document [positions](#Pos) +// +// This module does not depend on the browser API being available +// (i.e. you can load it into any JavaScript environment). -var classPrefix = "ProseMirror-tooltipmenu"; +"use strict"; -(0, _edit.defineOption)("tooltipMenu", false, function (pm, value) { - if (pm.mod.tooltipMenu) pm.mod.tooltipMenu.detach(); - pm.mod.tooltipMenu = value ? new TooltipMenu(pm, value) : null; +Object.defineProperty(exports, "__esModule", { + value: true }); -var TooltipMenu = (function () { - function TooltipMenu(pm, config) { - var _this = this; - - _classCallCheck(this, TooltipMenu); - - this.pm = pm; - this.inlineItems = config && config.inlineItems || (0, _menu.commandGroups)(pm, "inline"); - this.blockItems = config && config.blockItems || (0, _menu.commandGroups)(pm, "block"); - this.showLinks = config ? config.showLinks !== false : true; - this.selectedBlockMenu = config && config.selectedBlockMenu; - this.update = new _update.MenuUpdate(pm, "change selectionChange blur", function () { - return _this.prepareUpdate(); - }); +var _node = require("./node"); - this.tooltip = new _tooltip.Tooltip(pm, "above"); - this.menu = new _menu.Menu(pm, new _menu.TooltipDisplay(this.tooltip, function () { - return _this.update.force(); - })); - } +Object.defineProperty(exports, "Node", { + enumerable: true, + get: function get() { + return _node.Node; + } +}); - /** - * Get the x and y coordinates at the top center of the current DOM selection. - * - * @return {Object} - */ +var _fragment = require("./fragment"); - _createClass(TooltipMenu, [{ - key: "detach", - value: function detach() { - this.update.detach(); - this.tooltip.detach(); - } - }, { - key: "prepareUpdate", - value: function prepareUpdate() { - var _this2 = this; +Object.defineProperty(exports, "Fragment", { + enumerable: true, + get: function get() { + return _fragment.Fragment; + } +}); +Object.defineProperty(exports, "emptyFragment", { + enumerable: true, + get: function get() { + return _fragment.emptyFragment; + } +}); - if (this.menu.active) return null; +var _mark = require("./mark"); - var _pm$selection = this.pm.selection; - var empty = _pm$selection.empty; - var node = _pm$selection.node; - var from = _pm$selection.from; - var to = _pm$selection.to;var link = undefined; - if (!this.pm.hasFocus()) { - return function () { - return _this2.tooltip.close(); - }; - } else if (node && node.isBlock) { - var _ret = (function () { - var coords = topOfNodeSelection(_this2.pm); - return { - v: function v() { - return _this2.menu.show(_this2.blockItems, coords); - } - }; - })(); +Object.defineProperty(exports, "Mark", { + enumerable: true, + get: function get() { + return _mark.Mark; + } +}); - if (typeof _ret === "object") return _ret.v; - } else if (!empty) { - var _ret2 = (function () { - var coords = node ? topOfNodeSelection(_this2.pm) : topCenterOfSelection(); - var showBlock = _this2.selectedBlockMenu && _model.Pos.samePath(from.path, to.path) && from.offset == 0 && to.offset == _this2.pm.doc.path(from.path).size; - return { - v: function v() { - return _this2.menu.show(showBlock ? [_this2.inlineItems, _this2.blockItems] : _this2.inlineItems, coords); - } - }; - })(); +var _schema = require("./schema"); - if (typeof _ret2 === "object") return _ret2.v; - } else if (this.selectedBlockMenu && this.pm.doc.path(from.path).size == 0) { - var _ret3 = (function () { - var coords = _this2.pm.coordsAtPos(from); - return { - v: function v() { - return _this2.menu.show(_this2.blockItems, coords); - } - }; - })(); +Object.defineProperty(exports, "SchemaSpec", { + enumerable: true, + get: function get() { + return _schema.SchemaSpec; + } +}); +Object.defineProperty(exports, "Schema", { + enumerable: true, + get: function get() { + return _schema.Schema; + } +}); +Object.defineProperty(exports, "SchemaError", { + enumerable: true, + get: function get() { + return _schema.SchemaError; + } +}); +Object.defineProperty(exports, "NodeType", { + enumerable: true, + get: function get() { + return _schema.NodeType; + } +}); +Object.defineProperty(exports, "Block", { + enumerable: true, + get: function get() { + return _schema.Block; + } +}); +Object.defineProperty(exports, "Textblock", { + enumerable: true, + get: function get() { + return _schema.Textblock; + } +}); +Object.defineProperty(exports, "Inline", { + enumerable: true, + get: function get() { + return _schema.Inline; + } +}); +Object.defineProperty(exports, "Text", { + enumerable: true, + get: function get() { + return _schema.Text; + } +}); +Object.defineProperty(exports, "MarkType", { + enumerable: true, + get: function get() { + return _schema.MarkType; + } +}); +Object.defineProperty(exports, "Attribute", { + enumerable: true, + get: function get() { + return _schema.Attribute; + } +}); - if (typeof _ret3 === "object") return _ret3.v; - } else if (this.showLinks && (link = this.linkUnderCursor())) { - var _ret4 = (function () { - var coords = _this2.pm.coordsAtPos(from); - return { - v: function v() { - return _this2.showLink(link, coords); - } - }; - })(); +var _defaultschema = require("./defaultschema"); - if (typeof _ret4 === "object") return _ret4.v; - } else { - return function () { - return _this2.tooltip.close(); - }; - } - } - }, { - key: "linkUnderCursor", - value: function linkUnderCursor() { - var head = this.pm.selection.head; - if (!head) return null; - var marks = this.pm.doc.marksAt(head); - return marks.reduce(function (found, m) { - return found || m.type.name == "link" && m; - }, null); - } - }, { - key: "showLink", - value: function showLink(link, pos) { - var node = (0, _dom.elt)("div", { "class": classPrefix + "-linktext" }, (0, _dom.elt)("a", { href: link.attrs.href, title: link.attrs.title }, link.attrs.href)); - this.tooltip.open(node, pos); - } - }]); +Object.defineProperty(exports, "defaultSchema", { + enumerable: true, + get: function get() { + return _defaultschema.defaultSchema; + } +}); +Object.defineProperty(exports, "Doc", { + enumerable: true, + get: function get() { + return _defaultschema.Doc; + } +}); +Object.defineProperty(exports, "BlockQuote", { + enumerable: true, + get: function get() { + return _defaultschema.BlockQuote; + } +}); +Object.defineProperty(exports, "OrderedList", { + enumerable: true, + get: function get() { + return _defaultschema.OrderedList; + } +}); +Object.defineProperty(exports, "BulletList", { + enumerable: true, + get: function get() { + return _defaultschema.BulletList; + } +}); +Object.defineProperty(exports, "ListItem", { + enumerable: true, + get: function get() { + return _defaultschema.ListItem; + } +}); +Object.defineProperty(exports, "HorizontalRule", { + enumerable: true, + get: function get() { + return _defaultschema.HorizontalRule; + } +}); +Object.defineProperty(exports, "Paragraph", { + enumerable: true, + get: function get() { + return _defaultschema.Paragraph; + } +}); +Object.defineProperty(exports, "Heading", { + enumerable: true, + get: function get() { + return _defaultschema.Heading; + } +}); +Object.defineProperty(exports, "CodeBlock", { + enumerable: true, + get: function get() { + return _defaultschema.CodeBlock; + } +}); +Object.defineProperty(exports, "Image", { + enumerable: true, + get: function get() { + return _defaultschema.Image; + } +}); +Object.defineProperty(exports, "HardBreak", { + enumerable: true, + get: function get() { + return _defaultschema.HardBreak; + } +}); +Object.defineProperty(exports, "CodeMark", { + enumerable: true, + get: function get() { + return _defaultschema.CodeMark; + } +}); +Object.defineProperty(exports, "EmMark", { + enumerable: true, + get: function get() { + return _defaultschema.EmMark; + } +}); +Object.defineProperty(exports, "StrongMark", { + enumerable: true, + get: function get() { + return _defaultschema.StrongMark; + } +}); +Object.defineProperty(exports, "LinkMark", { + enumerable: true, + get: function get() { + return _defaultschema.LinkMark; + } +}); - return TooltipMenu; -})(); +var _pos = require("./pos"); -function topCenterOfSelection() { - var rects = window.getSelection().getRangeAt(0).getClientRects(); - var _rects$0 = rects[0]; - var left = _rects$0.left; - var right = _rects$0.right; - var top = _rects$0.top;var i = 1; - while (left == right && rects.length > i) { - ;var _rects = rects[i++]; - left = _rects.left; - right = _rects.right; - top = _rects.top; - } - for (; i < rects.length; i++) { - if (rects[i].top < rects[0].bottom - 1 && ( - // Chrome bug where bogus rectangles are inserted at span boundaries - i == rects.length - 1 || Math.abs(rects[i + 1].left - rects[i].left) > 1)) { - left = Math.min(left, rects[i].left); - right = Math.max(right, rects[i].right); - top = Math.min(top, rects[i].top); - } - } - return { top: top, left: (left + right) / 2 }; -} +Object.defineProperty(exports, "Pos", { + enumerable: true, + get: function get() { + return _pos.Pos; + } +}); -function topOfNodeSelection(pm) { - var selected = pm.content.querySelector(".ProseMirror-selectednode"); - if (!selected) return { left: 0, top: 0 }; - var box = selected.getBoundingClientRect(); - return { left: Math.min((box.left + box.right) / 2, box.left + 20), top: box.top }; -} +var _diff = require("./diff"); -(0, _dom.insertCSS)("\n\n.ProseMirror-tooltipmenu-linktext a {\n color: white;\n text-decoration: none;\n padding: 0 5px;\n}\n\n.ProseMirror-tooltipmenu-linktext a:hover {\n text-decoration: underline;\n}\n\n"); +Object.defineProperty(exports, "findDiffStart", { + enumerable: true, + get: function get() { + return _diff.findDiffStart; + } +}); +Object.defineProperty(exports, "findDiffEnd", { + enumerable: true, + get: function get() { + return _diff.findDiffEnd; + } +}); -},{"../dom":19,"../edit":27,"../model":45,"./menu":37,"./tooltip":39,"./update":41}],41:[function(require,module,exports){ +},{"./defaultschema":24,"./diff":25,"./fragment":26,"./mark":28,"./node":29,"./pos":30,"./schema":31}],28:[function(require,module,exports){ +// ;; A mark is a piece of information that can be attached to a node, +// such as it being emphasized, in code font, or a link. It has a type +// and optionally a set of attributes that provide further information +// (such as the target of the link). Marks are created through a +// `Schema`, which controls which types exist and which +// attributes they have. "use strict"; Object.defineProperty(exports, "__esModule", { @@ -7811,118 +7929,132 @@ function _classCallCheck(instance, Constructor) { } } -var MIN_FLUSH_DELAY = 200; -var UPDATE_TIMEOUT = 200; - -var MenuUpdate = (function () { - function MenuUpdate(pm, events, prepare) { - var _this = this; - - _classCallCheck(this, MenuUpdate); - - this.pm = pm; - this.prepare = prepare; - - this.mustUpdate = false; - this.updateInfo = null; - this.timeout = null; - this.lastFlush = 0; +var Mark = (function () { + function Mark(type, attrs) { + _classCallCheck(this, Mark); - this.events = events.split(" "); - this.onEvent = this.onEvent.bind(this); - this.force = this.force.bind(this); - this.events.forEach(function (event) { - return pm.on(event, _this.onEvent); - }); - pm.on("flush", this.onFlush = this.onFlush.bind(this)); - pm.on("flushed", this.onFlushed = this.onFlushed.bind(this)); + // :: MarkType + // The type of this mark. + this.type = type; + // :: Object + // The attributes associated with this mark. + this.attrs = attrs; } - _createClass(MenuUpdate, [{ - key: "detach", - value: function detach() { - var _this2 = this; + // :: () → Object + // Convert this mark to a JSON-serializeable representation. - clearTimeout(this.timeout); - this.events.forEach(function (event) { - return _this2.pm.off(event, _this2.onEvent); - }); - this.pm.off("flush", this.onFlush); - this.pm.off("flushed", this.onFlushed); + _createClass(Mark, [{ + key: "toJSON", + value: function toJSON() { + if (this.type.instance) return this.type.name; + var obj = { _: this.type.name }; + for (var attr in this.attrs) { + obj[attr] = this.attrs[attr]; + }return obj; } + + // :: ([Mark]) → [Mark] + // Given a set of marks, create a new set which contains this one as + // well, in the right position. If this mark or another of its type + // is already in the set, the set itself is returned. }, { - key: "onFlush", - value: function onFlush() { - var now = Date.now(); - if (this.mustUpdate && now - this.lastFlush >= MIN_FLUSH_DELAY) { - this.lastFlush = now; - clearTimeout(this.timeout); - this.mustUpdate = false; - this.update = this.prepare(); + key: "addToSet", + value: function addToSet(set) { + for (var i = 0; i < set.length; i++) { + var other = set[i]; + if (other.type == this.type) { + if (this.eq(other)) return set;else return set.slice(0, i).concat(this).concat(set.slice(i + 1)); + } + if (other.type.rank > this.type.rank) return set.slice(0, i).concat(this).concat(set.slice(i)); } + return set.concat(this); } + + // :: ([Mark]) → [Mark] + // Remove this mark from the given set, returning a new set. If this + // mark is not in the set, the set itself is returned. }, { - key: "onFlushed", - value: function onFlushed() { - if (this.update) { - this.update(); - this.update = null; - } + key: "removeFromSet", + value: function removeFromSet(set) { + for (var i = 0; i < set.length; i++) if (this.eq(set[i])) return set.slice(0, i).concat(set.slice(i + 1)); + return set; + } + + // :: ([Mark]) → bool + // Test whether this mark is in the given set of marks. + }, { + key: "isInSet", + value: function isInSet(set) { + for (var i = 0; i < set.length; i++) { + if (this.eq(set[i])) return true; + }return false; + } + + // :: (Mark) → bool + // Test whether this mark has the same type and attributes as + // another mark. + }, { + key: "eq", + value: function eq(other) { + if (this == other) return true; + if (this.type != other.type) return false; + for (var attr in this.attrs) { + if (other.attrs[attr] != this.attrs[attr]) return false; + }return true; } - }, { - key: "onEvent", - value: function onEvent() { - this.mustUpdate = true; - clearTimeout(this.timeout); - this.timeout = setTimeout(this.force, UPDATE_TIMEOUT); + + // :: ([Mark], [Mark]) → bool + // Test whether two sets of marks are identical. + }], [{ + key: "sameSet", + value: function sameSet(a, b) { + if (a == b) return true; + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + if (!a[i].eq(b[i])) return false; + }return true; } + + // :: (?union) → [Mark] + // Create a properly sorted mark set from null, a single mark, or an + // unsorted array of marks. }, { - key: "force", - value: function force() { - if (this.pm.operation) { - this.onEvent(); - } else { - this.mustUpdate = false; - this.updateInfo = null; - this.lastFlush = Date.now(); - clearTimeout(this.timeout); - var update = this.prepare(); - if (update) update(); - } + key: "setFrom", + value: function setFrom(marks) { + if (!marks || marks.length == 0) return empty; + if (marks instanceof Mark) return [marks]; + var copy = marks.slice(); + copy.sort(function (a, b) { + return a.type.rank - b.type.rank; + }); + return copy; } }]); - return MenuUpdate; + return Mark; })(); -exports.MenuUpdate = MenuUpdate; +exports.Mark = Mark; + +var empty = []; -},{}],42:[function(require,module,exports){ +},{}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -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(_x, _x2, _x3) { +var _get = function get(_x8, _x9, _x10) { var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;if (object === null) object = Function.prototype;var desc = Object.getOwnPropertyDescriptor(object, property);if (desc === undefined) { + var object = _x8, + property = _x9, + receiver = _x10;_again = false;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 { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + _x8 = parent;_x9 = property;_x10 = receiver;_again = true;desc = parent = undefined;continue _function; } } else if ("value" in desc) { return desc.value; @@ -7934,11 +8066,15 @@ var _get = function get(_x, _x2, _x3) { } }; -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} +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; + }; +})(); function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { @@ -7946,1462 +8082,2287 @@ function _inherits(subClass, 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 _schema = require("./schema"); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -// ;; #toc="Default schema" The default top-level document node type. +var _fragment = require("./fragment"); -var Doc = (function (_Block) { - _inherits(Doc, _Block); +var _mark = require("./mark"); - function Doc() { - _classCallCheck(this, Doc); +var _pos = require("./pos"); - _get(Object.getPrototypeOf(Doc.prototype), "constructor", this).apply(this, arguments); +var emptyArray = [], + emptyAttrs = Object.create(null); + +// ;; This class represents a node in the tree that makes up a +// ProseMirror document. So a document is an instance of `Node`, with +// children that are also instances of `Node`. +// +// Nodes are persistent data structures. Instead of changing them, you +// create new ones with the content you want. Old ones keep pointing +// at the old document shape. This is made cheaper by sharing +// structure between the old and new data as much as possible, which a +// tree shape like this (without back pointers) makes easy. +// +// **Never** directly mutate the properties of a `Node` object. + +var Node = (function () { + function Node(type, attrs, content, marks) { + _classCallCheck(this, Node); + + // :: NodeType + // The type of node that this is. + this.type = type; + + // :: Object + // An object mapping attribute names to string values. The kind of + // attributes allowed and required are determined by the node + // type. + this.attrs = attrs; + + // :: Fragment + // The node's content. + this.content = content || _fragment.emptyFragment; + + // :: [Mark] + // The marks (things like whether it is emphasized or part of a + // link) associated with this node. + this.marks = marks || emptyArray; } - // ;; #toc=false The default blockquote node type. + // :: number + // The size of the node's content, which is the maximum offset in + // the node. For nodes that don't contain text, this is also the + // number of child nodes that the node has. - _createClass(Doc, null, [{ - key: "kind", - get: function get() { - return "."; + _createClass(Node, [{ + key: "child", + + // :: (number) → Node + // Retrieve the child at the given offset. Note that this is **not** + // the appropriate way to loop over a node. `child`'s complexity may + // be non-constant for some nodes, and it will return the same node + // multiple times when calling it for different offsets within a + // text node. + value: function child(off) { + return this.content.child(off); } - }]); - return Doc; -})(_schema.Block); + // :: (?number, ?number) → Iterator + // Create an iterator over this node's children, optionally starting + // and ending at a given offset. + }, { + key: "iter", + value: function iter(start, end) { + return this.content.iter(start, end); + } -exports.Doc = Doc; + // :: (?number, ?number) → Iterator + // Create a reverse iterator (iterating from the node's end towards + // its start) over this node's children, optionally starting and + // ending at a given offset. **Note**: if given, `start` should be + // greater than (or equal) to `end`. + }, { + key: "reverseIter", + value: function reverseIter(start, end) { + return this.content.reverseIter(start, end); + } -var BlockQuote = (function (_Block2) { - _inherits(BlockQuote, _Block2); + // :: (number) → {start: number, node: Node} + // Find the node that sits before a given offset. Can be used to + // find out which text node covers a given offset. The `start` + // property of the return value is the starting offset of the + // returned node. It is an error to call this with offset 0. + }, { + key: "chunkBefore", + value: function chunkBefore(off) { + return this.content.chunkBefore(off); + } + + // :: (number) → {start: number, node: Node} + // Find the node that sits after a given offset. The `start` + // property of the return value is the starting offset of the + // returned node. It is an error to call this with offset + // corresponding to the end of the node. + }, { + key: "chunkAfter", + value: function chunkAfter(off) { + return this.content.chunkAfter(off); + } + + // :: ((node: Node, start: number, end: number)) + // Call the given function for each child node. The function will be + // given the node, as well as its start and end offsets, as + // arguments. + }, { + key: "forEach", + value: function forEach(f) { + this.content.forEach(f); + } + + // :: string + // Concatenate all the text nodes found in this fragment and its + // children. + }, { + key: "sameMarkup", + + // :: (Node) → bool + // Compare the markup (type, attributes, and marks) of this node to + // those of another. Returns `true` if both have the same markup. + value: function sameMarkup(other) { + return this.hasMarkup(other.type, other.attrs, other.marks); + } + + // :: (NodeType, ?Object, ?[Mark]) → bool + // Check whether this node's markup correspond to the given type, + // attributes, and marks. + }, { + key: "hasMarkup", + value: function hasMarkup(type, attrs, marks) { + return this.type == type && Node.sameAttrs(this.attrs, attrs || emptyAttrs) && _mark.Mark.sameSet(this.marks, marks || emptyArray); + } + }, { + key: "copy", + + // :: (?Fragment) → Node + // Create a new node with the same markup as this node, containing + // the given content (or empty, if no content is given). + value: function copy() { + var content = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + + return new this.constructor(this.type, this.attrs, content, this.marks); + } + + // :: ([Mark]) → Node + // Create a copy of this node, with the given set of marks instead + // of the node's own marks. + }, { + key: "mark", + value: function mark(marks) { + return new this.constructor(this.type, this.attrs, this.content, marks); + } - function BlockQuote() { - _classCallCheck(this, BlockQuote); + // :: (number, ?number) → Node + // Create a copy of this node with only the content between the + // given offsets. If `to` is not given, it defaults to the end of + // the node. + }, { + key: "slice", + value: function slice(from, to) { + return this.copy(this.content.slice(from, to)); + } - _get(Object.getPrototypeOf(BlockQuote.prototype), "constructor", this).apply(this, arguments); - } + // :: (number, number, Fragment) → Node + // Create a copy of this node with the content between the given + // offsets replaced by the given fragment. + }, { + key: "splice", + value: function splice(from, to, replace) { + return this.copy(this.content.slice(0, from).append(replace).append(this.content.slice(to))); + } - // ;; #toc=false The default ordered list node type. Has a single attribute, - // `order`, which determines the number at which the list starts - // counting, and defaults to 1. - return BlockQuote; -})(_schema.Block); + // :: (Fragment, ?number, ?number) → Node + // [Append](#Fragment.append) the given fragment to this node's + // content, and create a new node with the result. + }, { + key: "append", + value: function append(fragment) { + var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; + var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; -exports.BlockQuote = BlockQuote; + return this.copy(this.content.append(fragment, joinLeft, joinRight)); + } -var OrderedList = (function (_Block3) { - _inherits(OrderedList, _Block3); + // :: (number, Node) → Node + // Return a copy of this node with the child at the given offset + // replaced by the given node. **Note**: The offset should not fall + // within a text node. + }, { + key: "replace", + value: function replace(pos, node) { + return this.copy(this.content.replace(pos, node)); + } - function OrderedList() { - _classCallCheck(this, OrderedList); + // :: ([number], Node) → Node + // Return a copy of this node with the descendant at `path` replaced + // by the given replacement node. This will copy as many sub-nodes as + // there are elements in `path`. + }, { + key: "replaceDeep", + value: function replaceDeep(path, node) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - _get(Object.getPrototypeOf(OrderedList.prototype), "constructor", this).apply(this, arguments); - } + if (depth == path.length) return node; + var pos = path[depth]; + return this.replace(pos, this.child(pos).replaceDeep(path, node, depth + 1)); + } - _createClass(OrderedList, null, [{ - key: "contains", - get: function get() { - return "list_item"; + // :: (number, string) → Node + // “Close” this node by making sure that, if it is empty, and is not + // allowed to be so, it has its default content inserted. When depth + // is greater than zero, sub-nodes at the given side (which can be + // `"start"` or `"end"`) are closed too. Returns itself if no work + // is necessary, or a closed copy if something did need to happen. + }, { + key: "close", + value: function close(depth, side) { + if (depth == 0 && this.size == 0 && !this.type.canBeEmpty) return this.copy(this.type.defaultContent()); + var closedContent = undefined; + if (depth > 0 && (closedContent = this.content.close(depth - 1, side)) != this.content) return this.copy(closedContent); + return this; } - }]); - return OrderedList; -})(_schema.Block); + // :: ([number]) → Node + // Get the descendant node at the given path, which is interpreted + // as a series of offsets into successively deeper nodes. + }, { + key: "path", + value: function path(_path) { + for (var i = 0, node = this; i < _path.length; node = node.child(_path[i]), i++) {} + return node; + } -exports.OrderedList = OrderedList; + // :: (Pos) → Node + // Get the node after the given position. + }, { + key: "nodeAfter", + value: function nodeAfter(pos) { + return this.path(pos.path).child(pos.offset); + } + }, { + key: "pathNodes", + value: function pathNodes(path) { + var nodes = []; + for (var i = 0, node = this;; i++) { + nodes.push(node); + if (i == path.length) break; + node = node.child(path[i]); + } + return nodes; + } -OrderedList.attributes = { order: new _schema.Attribute({ "default": "1" }) }; + // :: (Pos, ?bool) → bool + // Checks whether the given position is valid in this node. When + // `requireTextblock` is true, only positions inside textblocks are + // considered valid. + }, { + key: "isValidPos", + value: function isValidPos(pos, requireTextblock) { + for (var i = 0, node = this;; i++) { + if (i == pos.path.length) { + if (requireTextblock && !node.isTextblock) return false; + return pos.offset <= node.size; + } else { + var n = pos.path[i]; + if (n >= node.size) return false; + node = node.child(n); + } + } + } -// ;; #toc=false The default bullet list node type. + // :: (Pos, Pos) → {from: Pos, to: Pos} + // Finds the narrowest sibling range (two positions that both point + // into the same node) that encloses the given positions. + }, { + key: "siblingRange", + value: function siblingRange(from, to) { + for (var i = 0, node = this;; i++) { + if (node.isTextblock) { + var path = from.path.slice(0, i - 1), + offset = from.path[i - 1]; + return { from: new _pos.Pos(path, offset), to: new _pos.Pos(path, offset + 1) }; + } + var fromEnd = i == from.path.length, + toEnd = i == to.path.length; + var left = fromEnd ? from.offset : from.path[i]; + var right = toEnd ? to.offset : to.path[i]; + if (fromEnd || toEnd || left != right) { + var path = from.path.slice(0, i); + return { from: new _pos.Pos(path, left), to: new _pos.Pos(path, right + (toEnd ? 0 : 1)) }; + } + node = node.child(left); + } + } -var BulletList = (function (_Block4) { - _inherits(BulletList, _Block4); + // :: (?Pos, ?Pos, (node: Node, path: [number], parent: Node)) + // Iterate over all nodes between the given two positions, calling + // the callback with the node, the path towards it, and its parent + // node, as arguments. `from` and `to` may be `null` to denote + // starting at the start of the node or ending at its end. Note that + // the path passed to the callback is mutated as iteration + // continues, so if you want to preserve it, make a copy. + }, { + key: "nodesBetween", + value: function nodesBetween(from, to, f) { + var path = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; + var parent = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; - function BulletList() { - _classCallCheck(this, BulletList); + if (f(this, path, parent) === false) return; + this.content.nodesBetween(from, to, f, path, this); + } - _get(Object.getPrototypeOf(BulletList.prototype), "constructor", this).apply(this, arguments); - } + // :: (?Pos, ?Pos, (node: Node, path: [number], start: number, end: number, parent: Node)) + // Calls the given function for each inline node between the two + // given positions. Pass null for `from` or `to` to start or end at + // the start or end of the node. + }, { + key: "inlineNodesBetween", + value: function inlineNodesBetween(from, to, f) { + this.nodesBetween(from, to, function (node, path, parent) { + if (node.isInline) { + var last = path.length - 1; + f(node, path.slice(0, last), path[last], path[last] + node.width, parent); + } + }); + } - // ;; #toc=false The default list item node type. + // :: (?Pos, ?Pos) → Node + // Returns a copy of this node containing only the content between + // `from` and `to`. You can pass `null` for either of them to start + // or end at the start or end of the node. + }, { + key: "sliceBetween", + value: function sliceBetween(from, to) { + var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - _createClass(BulletList, null, [{ - key: "contains", - get: function get() { - return "list_item"; + return this.copy(this.content.sliceBetween(from, to, depth)); } - }]); - - return BulletList; -})(_schema.Block); -exports.BulletList = BulletList; + // :: (Pos) → [Mark] + // Get the marks of the node before the given position or, if that + // position is at the start of a non-empty node, those of the node + // after it. + }, { + key: "marksAt", + value: function marksAt(pos) { + var parent = this.path(pos.path); + if (!parent.isTextblock || !parent.size) return emptyArray; + return parent.chunkBefore(pos.offset || 1).node.marks; + } -var ListItem = (function (_Block5) { - _inherits(ListItem, _Block5); + // :: (?Pos, ?Pos, MarkType) → bool + // Test whether a mark of the given type occurs in this document + // between the two given positions. + }, { + key: "rangeHasMark", + value: function rangeHasMark(from, to, type) { + var found = false; + this.nodesBetween(from, to, function (node) { + if (type.isInSet(node.marks)) found = true; + }); + return found; + } - function ListItem() { - _classCallCheck(this, ListItem); + // :: bool + // True when this is a block (non-inline node) + }, { + key: "toString", - _get(Object.getPrototypeOf(ListItem.prototype), "constructor", this).apply(this, arguments); - } + // :: () → string + // Return a string representation of this node for debugging + // purposes. + value: function toString() { + var name = this.type.name; + if (this.content.size) name += "(" + this.content.toString() + ")"; + return wrapMarks(this.marks, name); + } - // ;; #toc=false The default horizontal rule node type. + // :: () → Object + // Return a JSON-serializeable representation of this node. + }, { + key: "toJSON", + value: function toJSON() { + var obj = { type: this.type.name }; + for (var _ in this.attrs) { + obj.attrs = this.attrs; + break; + } + if (this.size) obj.content = this.content.toJSON(); + if (this.marks.length) obj.marks = this.marks.map(function (n) { + return n.toJSON(); + }); + return obj; + } - _createClass(ListItem, null, [{ - key: "kind", + // This is a hack to be able to treat a node object as an iterator result + }, { + key: "size", get: function get() { - return "."; + return this.content.size; } - }]); - - return ListItem; -})(_schema.Block); - -exports.ListItem = ListItem; - -var HorizontalRule = (function (_Block6) { - _inherits(HorizontalRule, _Block6); - - function HorizontalRule() { - _classCallCheck(this, HorizontalRule); - - _get(Object.getPrototypeOf(HorizontalRule.prototype), "constructor", this).apply(this, arguments); - } - // ;; #toc=false The default heading node type. Has a single attribute - // `level`, which indicates the heading level, and defaults to 1. + // :: number + // The width of this node. Always 1 for non-text nodes, and the + // length of the text for text nodes. + }, { + key: "width", + get: function get() { + return 1; + } + }, { + key: "textContent", + get: function get() { + return this.content.textContent; + } - _createClass(HorizontalRule, null, [{ - key: "contains", + // :: ?Node + // Returns this node's first child, or `null` if there are no + // children. + }, { + key: "firstChild", get: function get() { - return null; + return this.content.firstChild; } - }]); - return HorizontalRule; -})(_schema.Block); + // :: ?Node + // Returns this node's last child, or `null` if there are no + // children. + }, { + key: "lastChild", + get: function get() { + return this.content.lastChild; + } + }, { + key: "isBlock", + get: function get() { + return this.type.isBlock; + } -exports.HorizontalRule = HorizontalRule; + // :: bool + // True when this is a textblock node, a block node with inline + // content. + }, { + key: "isTextblock", + get: function get() { + return this.type.isTextblock; + } -var Heading = (function (_Textblock) { - _inherits(Heading, _Textblock); + // :: bool + // True when this is an inline node (a text node or a node that can + // appear among text). + }, { + key: "isInline", + get: function get() { + return this.type.isInline; + } - function Heading() { - _classCallCheck(this, Heading); + // :: bool + // True when this is a text node. + }, { + key: "isText", + get: function get() { + return this.type.isText; + } + }, { + key: "value", + get: function get() { + return this; + } - _get(Object.getPrototypeOf(Heading.prototype), "constructor", this).apply(this, arguments); - } + // :: (Schema, Object) → Node + // Deserialize a node from its JSON representation. + }], [{ + key: "sameAttrs", + value: function sameAttrs(a, b) { + if (a == b) return true; + for (var prop in a) { + if (a[prop] !== b[prop]) return false; + }return true; + } + }, { + key: "fromJSON", + value: function fromJSON(schema, json) { + var type = schema.nodeType(json.type); + var content = json.text != null ? json.text : _fragment.Fragment.fromJSON(schema, json.content); + return type.create(json.attrs, content, json.marks && json.marks.map(schema.markFromJSON)); + } + }]); - return Heading; -})(_schema.Textblock); + return Node; +})(); -exports.Heading = Heading; +exports.Node = Node; -Heading.attributes = { level: new _schema.Attribute({ "default": "1" }) }; +if (typeof Symbol != "undefined") { + // :: () → Iterator + // A fragment is iterable, in the ES6 sense. + Node.prototype[Symbol.iterator] = function () { + return this.iter(); + }; +} -// ;; #toc=false The default code block / listing node type. Only -// allows unmarked text nodes inside of it. +// ;; #forward=Node -var CodeBlock = (function (_Textblock2) { - _inherits(CodeBlock, _Textblock2); +var TextNode = (function (_Node) { + _inherits(TextNode, _Node); - function CodeBlock() { - _classCallCheck(this, CodeBlock); + function TextNode(type, attrs, content, marks) { + _classCallCheck(this, TextNode); - _get(Object.getPrototypeOf(CodeBlock.prototype), "constructor", this).apply(this, arguments); + _get(Object.getPrototypeOf(TextNode.prototype), "constructor", this).call(this, type, attrs, null, marks); + // :: ?string + // For text nodes, this contains the node's text content. + this.text = content; } - // ;; #toc=false The default paragraph node type. - - _createClass(CodeBlock, [{ - key: "containsMarks", - get: function get() { - return false; + _createClass(TextNode, [{ + key: "toString", + value: function toString() { + return wrapMarks(this.marks, JSON.stringify(this.text)); } }, { - key: "isCode", + key: "mark", + value: function mark(marks) { + return new TextNode(this.type, this.attrs, this.text, marks); + } + }, { + key: "toJSON", + value: function toJSON() { + var base = _get(Object.getPrototypeOf(TextNode.prototype), "toJSON", this).call(this); + base.text = this.text; + return base; + } + }, { + key: "textContent", get: function get() { - return true; + return this.text; } - }], [{ - key: "contains", + }, { + key: "width", get: function get() { - return "text"; + return this.text.length; } }]); - return CodeBlock; -})(_schema.Textblock); + return TextNode; +})(Node); -exports.CodeBlock = CodeBlock; +exports.TextNode = TextNode; -var Paragraph = (function (_Textblock3) { - _inherits(Paragraph, _Textblock3); +function wrapMarks(marks, str) { + for (var i = marks.length - 1; i >= 0; i--) { + str = marks[i].type.name + "(" + str + ")"; + }return str; +} - function Paragraph() { - _classCallCheck(this, Paragraph); +},{"./fragment":26,"./mark":28,"./pos":30}],30:[function(require,module,exports){ +// ;; Instances of the `Pos` class represent positions in a document. +// A position an array of integers that describe a path to the target +// node (see `Node.path`) and an integer offset into that target node. - _get(Object.getPrototypeOf(Paragraph.prototype), "constructor", this).apply(this, arguments); - } +"use strict"; - // ;; #toc=false The default inline image node type. Has these - // attributes: - // - // - **`src`** (required): The URL of the image. - // - **`alt`**: The alt text. - // - **`title`**: The title of the image. +Object.defineProperty(exports, "__esModule", { + value: true +}); - _createClass(Paragraph, [{ - key: "defaultTextblock", - get: function get() { - return true; +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; + }; +})(); - return Paragraph; -})(_schema.Textblock); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -exports.Paragraph = Paragraph; +var Pos = (function () { + // :: (path: [number], number) + + function Pos(path, offset) { + _classCallCheck(this, Pos); + + // :: [number] The path to the target node. + this.path = path; + // :: number The offset into the target node. + this.offset = offset; + } + + // ;; Return a string representation of the path of the form + // `"0/2:10"`, where the numbers before the colon are the path, and + // the number after it is the offset. + + _createClass(Pos, [{ + key: "toString", + value: function toString() { + return this.path.join("/") + ":" + this.offset; + } -var Image = (function (_Inline) { - _inherits(Image, _Inline); + // :: number + // The length of the position's path. + }, { + key: "max", - function Image() { - _classCallCheck(this, Image); + // :: (Pos) → Pos + // Return the greater of two positions. + value: function max(other) { + return this.cmp(other) > 0 ? this : other; + } - _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); - } + // :: (Pos) → Pos + // Return the lesser of two positions. + }, { + key: "mmin", + value: function mmin(other) { + return this.cmp(other) < 0 ? this : other; + } - return Image; -})(_schema.Inline); + // :: ([number], [number]) → bool + // Compares two paths and returns true when they are the same. + }, { + key: "cmp", -exports.Image = Image; + // :: (Pos) → number + // Compares this position to another position, and returns a number. + // Of this result number, only the sign is significant. It is + // negative if this position is less than the other one, zero if + // they are the same, and positive if this position is greater. + value: function cmp(other) { + if (other == this) return 0; + return Pos.cmp(this.path, this.offset, other.path, other.offset); + } + }, { + key: "shorten", -Image.attributes = { - src: new _schema.Attribute(), - alt: new _schema.Attribute({ "default": "" }), - title: new _schema.Attribute({ "default": "" }) -}; + // :: (?number, ?number) → Pos + // Create a position pointing into a parent of this position's + // target. When `to` is given, it determines the new length of the + // path. By default, the path becomes one shorter. The `offset` + // parameter can be used to determine where in this parent the + // position points. By default, it points before the old target. You + // can pass a negative or positive integer to move it backward or + // forward (**note**: this method performs no bounds checking). + value: function shorten() { + var to = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; + var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; -// ;; #toc=false The default hard break node type. + if (to >= this.depth) return this; + return Pos.shorten(this.path, to, offset); + } -var HardBreak = (function (_Inline2) { - _inherits(HardBreak, _Inline2); + // :: (number) → Pos + // Create a position with an offset moved relative to this + // position's offset. For example moving `0/1:10` by `-2` yields + // `0/1:8`. + }, { + key: "move", + value: function move(by) { + return new Pos(this.path, this.offset + by); + } - function HardBreak() { - _classCallCheck(this, HardBreak); + // :: (?number) → [number] + // Convert this position to an array of numbers (including its + // offset). Optionally pass an argument to adjust the value of the + // offset. + }, { + key: "toPath", + value: function toPath() { + var move = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - _get(Object.getPrototypeOf(HardBreak.prototype), "constructor", this).apply(this, arguments); - } + return this.path.concat(this.offset + move); + } + }, { + key: "extend", + value: function extend(pos) { + var path = this.path.slice(), + add = this.offset; + for (var i = 0; i < pos.path.length; i++) { + path.push(pos.path[i] + add); + add = 0; + } + return new Pos(path, pos.offset + add); + } - // ;; #toc=false The default emphasis mark type. + // :: () → Object + // Convert the position to a JSON-safe representation. + }, { + key: "toJSON", + value: function toJSON() { + return this; + } - _createClass(HardBreak, [{ - key: "selectable", + // :: ([number], ?number) → Pos + // Build a position from an array of numbers (as in + // [`toPath`](#Pos.toPath)), taking the last element of the array as + // offset and optionally moving it by `move`. + }, { + key: "depth", get: function get() { - return false; + return this.path.length; + } + }], [{ + key: "cmp", + value: function cmp(pathA, offsetA, pathB, offsetB) { + var lenA = pathA.length, + lenB = pathB.length; + for (var i = 0, end = Math.min(lenA, lenB); i < end; i++) { + var diff = pathA[i] - pathB[i]; + if (diff != 0) return diff; + } + if (lenA > lenB) return offsetB <= pathA[i] ? 1 : -1;else if (lenB > lenA) return offsetA <= pathB[i] ? -1 : 1;else return offsetA - offsetB; } }, { - key: "isBR", - get: function get() { - return true; + key: "samePath", + value: function samePath(pathA, pathB) { + if (pathA.length != pathB.length) return false; + for (var i = 0; i < pathA.length; i++) { + if (pathA[i] !== pathB[i]) return false; + }return true; } - }]); + }, { + key: "shorten", + value: function shorten(path) { + var to = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; - return HardBreak; -})(_schema.Inline); + if (to == null) to = path.length - 1; + return new Pos(path.slice(0, to), path[to] + offset); + } + }, { + key: "from", + value: function from(array) { + var move = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; -exports.HardBreak = HardBreak; + if (!array.length) throw new Error("Can't create a pos from an empty array"); + return new Pos(array.slice(0, array.length - 1), array[array.length - 1] + move); + } -var EmMark = (function (_MarkType) { - _inherits(EmMark, _MarkType); + // :: (Object) → Pos + // Create a position from a JSON representation. + }, { + key: "fromJSON", + value: function fromJSON(json) { + return new Pos(json.path, json.offset); + } + }]); - function EmMark() { - _classCallCheck(this, EmMark); + return Pos; +})(); - _get(Object.getPrototypeOf(EmMark.prototype), "constructor", this).apply(this, arguments); - } +exports.Pos = Pos; - // ;; #toc=false The default strong mark type. +},{}],31:[function(require,module,exports){ +"use strict"; - _createClass(EmMark, null, [{ - key: "rank", - get: function get() { - return 51; +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"); } - }]); + }; +})(); - return EmMark; -})(_schema.MarkType); +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; + }; +})(); -exports.EmMark = EmMark; +var _get = function get(_x2, _x3, _x4) { + var _again = true;_function: while (_again) { + var object = _x2, + property = _x3, + receiver = _x4;_again = false;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 { + _x2 = parent;_x3 = property;_x4 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); + } + } +}; -var StrongMark = (function (_MarkType2) { - _inherits(StrongMark, _MarkType2); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} - function StrongMark() { - _classCallCheck(this, StrongMark); +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; +} - _get(Object.getPrototypeOf(StrongMark.prototype), "constructor", this).apply(this, arguments); - } +var _node = require("./node"); - // ;; #toc=false The default link mark type. Has these attributes: - // - // - **`href`** (required): The link target. - // - **`title`**: The link's title. +var _fragment = require("./fragment"); - _createClass(StrongMark, null, [{ - key: "rank", - get: function get() { - return 52; - } - }]); +var _mark = require("./mark"); - return StrongMark; -})(_schema.MarkType); +var _utilError = require("../util/error"); -exports.StrongMark = StrongMark; +// ;; #toc=false The exception type used to signal schema-related +// errors. -var LinkMark = (function (_MarkType3) { - _inherits(LinkMark, _MarkType3); +var SchemaError = (function (_ProseMirrorError) { + _inherits(SchemaError, _ProseMirrorError); - function LinkMark() { - _classCallCheck(this, LinkMark); + function SchemaError() { + _classCallCheck(this, SchemaError); - _get(Object.getPrototypeOf(LinkMark.prototype), "constructor", this).apply(this, arguments); + _get(Object.getPrototypeOf(SchemaError.prototype), "constructor", this).apply(this, arguments); } - _createClass(LinkMark, null, [{ - key: "rank", - get: function get() { - return 53; + return SchemaError; +})(_utilError.ProseMirrorError); + +exports.SchemaError = SchemaError; + +function findKinds(type, name, schema, override) { + function set(sub, sup) { + if (sub in schema.kinds) { + if (schema.kinds[sub] == sup) return; + SchemaError.raise("Inconsistent superkinds for kind " + sub + ": " + sup + " and " + schema.kinds[sub]); } - }]); + if (schema.subKind(sub, sup)) SchemaError.raise("Conflicting kind hierarchy through " + sub + " and " + sup); + schema.kinds[sub] = sup; + } - return LinkMark; -})(_schema.MarkType); + for (var cur = type;; cur = Object.getPrototypeOf(cur)) { + var curKind = override != null && cur == type ? override : cur.kind; + if (curKind != null) { + var _$$exec = /^(.*?)(\.)?$/.exec(curKind); -exports.LinkMark = LinkMark; + var _$$exec2 = _slicedToArray(_$$exec, 3); -LinkMark.attributes = { - href: new _schema.Attribute(), - title: new _schema.Attribute({ "default": "" }) -}; + var _ = _$$exec2[0]; + var kind = _$$exec2[1]; + var end = _$$exec2[2]; -// ;; #toc=false The default code font mark type. + if (kind) { + set(name, kind); + name = kind; + } + if (end) { + set(name, null); + return; + } + } + } +} -var CodeMark = (function (_MarkType4) { - _inherits(CodeMark, _MarkType4); +// ;; Node types are objects allocated once per `Schema` +// and used to tag `Node` instances with a type. They are +// instances of sub-types of this class, and contain information about +// the node type (its name, its allowed attributes, methods for +// serializing it to various formats, information to guide +// deserialization, and so on). - function CodeMark() { - _classCallCheck(this, CodeMark); +var NodeType = (function () { + function NodeType(name, contains, attrs, schema) { + _classCallCheck(this, NodeType); - _get(Object.getPrototypeOf(CodeMark.prototype), "constructor", this).apply(this, arguments); + // :: string + // The name the node type has in this schema. + this.name = name; + // :: ?string + // The kind of nodes this node may contain. `null` means it's a + // leaf node. + this.contains = contains; + // :: Object + // The attributes allowed on this node type. + this.attrs = attrs; + // :: Schema + // A link back to the `Schema` the node type belongs to. + this.schema = schema; + this.defaultAttrs = getDefaultAttrs(attrs); } - // :: SchemaSpec - // The specification for the default schema. + // :: Object + // The default set of attributes to associate with a given type. Note + // that schemas may add additional attributes to instances of the + // type. - _createClass(CodeMark, [{ - key: "isCode", - get: function get() { - return true; - } - }], [{ - key: "rank", - get: function get() { - return 101; - } - }]); + // :: bool + // True if this is a block type. - return CodeMark; -})(_schema.MarkType); + _createClass(NodeType, [{ + key: "canContainFragment", -exports.CodeMark = CodeMark; -var defaultSpec = new _schema.SchemaSpec({ - doc: Doc, - blockquote: BlockQuote, - ordered_list: OrderedList, - bullet_list: BulletList, - list_item: ListItem, - horizontal_rule: HorizontalRule, + // :: (Fragment) → bool + // Test whether the content of the given fragment could be contained + // in this node type. + value: function canContainFragment(fragment) { + var _this = this; - paragraph: Paragraph, - heading: Heading, - code_block: CodeBlock, + var ok = true; + fragment.forEach(function (n) { + if (!_this.canContain(n)) ok = false; + }); + return ok; + } - text: _schema.Text, - image: Image, - hard_break: HardBreak -}, { - em: EmMark, - strong: StrongMark, - link: LinkMark, - code: CodeMark -}); + // :: (Node) → bool + // Test whether the given node could be contained in this node type. + }, { + key: "canContain", + value: function canContain(node) { + if (!this.canContainType(node.type)) return false; + for (var i = 0; i < node.marks.length; i++) { + if (!this.canContainMark(node.marks[i])) return false; + }return true; + } -// :: Schema -// ProseMirror's default document schema. -var defaultSchema = new _schema.Schema(defaultSpec); -exports.defaultSchema = defaultSchema; + // :: (Mark) → bool + // Test whether this node type can contain children with the given + // mark. + }, { + key: "canContainMark", + value: function canContainMark(mark) { + var contains = this.containsMarks; + if (contains === true) return true; + if (contains) for (var i = 0; i < contains.length; i++) { + if (contains[i] == mark.name) return true; + }return false; + } -},{"./schema":49}],43:[function(require,module,exports){ -"use strict"; + // :: (NodeType) → bool + // Test whether this node type can contain nodes of the given node + // type. + }, { + key: "canContainType", + value: function canContainType(type) { + return this.schema.subKind(type.name, this.contains); + } -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.findDiffStart = findDiffStart; -exports.findDiffEnd = findDiffEnd; + // :: (NodeType) → bool + // Test whether the nodes that can be contained in the given node + // type are a sub-type of the nodes that can be contained in this + // type. + }, { + key: "canContainContent", + value: function canContainContent(type) { + return this.schema.subKind(type.contains, this.contains); + } -var _pos = require("./pos"); + // :: (NodeType) → [NodeType] + // Find a set of intermediate node types, possibly empty, that have + // to be inserted between this type and `other` to put a node of + // type `other` into this type. + }, { + key: "findConnection", + value: function findConnection(other) { + // FIXME somehow define an order in which these are tried + if (this.canContainType(other)) return []; -// :: (Node, Node) → ?Pos -// Find the first position at which nodes `a` and `b` differ, or -// `null` if they are the same. + var seen = Object.create(null); + var active = [{ from: this, via: [] }]; + while (active.length) { + var current = active.shift(); + for (var _name in this.schema.nodes) { + var type = this.schema.nodes[_name]; + if (type.defaultAttrs && !(type.contains in seen) && current.from.canContainType(type)) { + var via = current.via.concat(type); + if (type.canContainType(other)) return via; + active.push({ from: type, via: via }); + seen[type.contains] = true; + } + } + } + } + }, { + key: "buildAttrs", + value: function buildAttrs(attrs, content) { + if (!attrs && this.defaultAttrs) return this.defaultAttrs;else return _buildAttrs(this.attrs, attrs, this, content); + } + + // :: (?Object, ?Fragment, ?[Mark]) → Node + // Create a `Node` of this type. The given attributes are + // checked and defaulted (you can pass `null` to use the type's + // defaults entirely, if no required attributes exist). `content` + // may be a `Fragment`, a node, an array of nodes, or + // `null`. Similarly `marks` may be `null` to default to the empty + // set of marks. + }, { + key: "create", + value: function create(attrs, content, marks) { + return new _node.Node(this, this.buildAttrs(attrs, content), _fragment.Fragment.from(content), _mark.Mark.setFrom(marks)); + } + }, { + key: "createAutoFill", + value: function createAutoFill(attrs, content, marks) { + if ((!content || content.length == 0) && !this.canBeEmpty) content = this.defaultContent(); + return this.create(attrs, content, marks); + } -function findDiffStart(a, b) { - var path = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; + // :: bool + // Controls whether this node is allowed to be empty. + }, { + key: "isBlock", + get: function get() { + return false; + } - var iA = a.iter(), - iB = b.iter(), - offset = 0; - for (;;) { - if (iA.atEnd() || iB.atEnd()) { - if (a.size == b.size) return null; - break; + // :: bool + // True if this is a textblock type, a block that contains inline + // content. + }, { + key: "isTextblock", + get: function get() { + return false; } - var childA = iA.next(), - childB = iB.next(); - if (childA == childB) { - offset += childA.width;continue; + // :: bool + // True if this is an inline type. + }, { + key: "isInline", + get: function get() { + return false; } - if (!childA.sameMarkup(childB)) break; + // :: bool + // True if this is the text node type. + }, { + key: "isText", + get: function get() { + return false; + } - if (childA.isText && childA.text != childB.text) { - for (var j = 0; childA.text[j] == childB.text[j]; j++) { - offset++; - }break; + // :: bool + // Controls whether nodes of this type can be selected (as a user + // node selection). + }, { + key: "selectable", + get: function get() { + return true; } - if (childA.size || childB.size) { - path.push(offset); - var inner = findDiffStart(childA.content, childB.content, path); - if (inner) return inner; - path.pop(); + // :: bool + // Controls whether this node type is locked. + }, { + key: "locked", + get: function get() { + return false; } - offset += childA.width; - } - return new _pos.Pos(path, offset); -} -// :: (Node, Node) → ?{a: Pos, b: Pos} -// Find the first position, searching from the end, at which nodes `a` -// and `b` differ, or `null` if they are the same. Since this position -// will not be the same in both nodes, an object with two separate -// positions is returned. + // :: string + // Controls the _kind_ of the node, which is used to determine valid + // parent/child relations. Can be a word, which adds that kind to + // the set of kinds of the superclass, a word followed by a dot, to + // ignore the kinds of the superclass and use only that word (along + // with the node's name) as kind, or only a dot, in which case the + // only kind the node has is its own name. + }, { + key: "canBeEmpty", + get: function get() { + return true; + } + }, { + key: "containsMarks", -function findDiffEnd(a, b) { - var pathA = arguments.length <= 2 || arguments[2] === undefined ? [] : arguments[2]; - var pathB = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; + // :: union + // The mark types that child nodes of this node may have. `false` + // means no marks, `true` means any mark, and an array of strings + // can be used to explicitly list the allowed mark types. + get: function get() { + return false; + } + }], [{ + key: "compile", + value: function compile(types, schema) { + var result = Object.create(null); + for (var _name2 in types) { + var info = types[_name2]; + var type = info.type || SchemaError.raise("Missing node type for " + _name2); + findKinds(type, _name2, schema, info.kind); + var contains = "contains" in info ? info.contains : type.contains; + var attrs = type.attributes; + if (info.attributes) { + attrs = copyObj(attrs); + for (var aName in info.attributes) attrs[aName] = info.attributes[aName]; + } + result[_name2] = new type(_name2, contains, attrs, schema); + } + for (var _name3 in result) { + var contains = result[_name3].contains; + if (contains && !(contains in schema.kinds)) SchemaError.raise("Node type " + _name3 + " is specified to contain non-existing kind " + contains); + } + if (!result.doc) SchemaError.raise("Every schema needs a 'doc' type"); + if (!result.text) SchemaError.raise("Every schema needs a 'text' type"); - var iA = a.reverseIter(), - iB = b.reverseIter(); - var offA = a.size, - offB = b.size; + return result; + } - for (;;) { - if (iA.atEnd() || iB.atEnd()) { - if (a.size == b.size) return null; - break; + // :: (string, *) + // Register an element in this type's registry. That is, add `value` + // to the array associated with `name` in the registry stored in + // type's `prototype`. This is mostly used to attach things like + // commands and parsing strategies to node types. See `Schema.registry`. + }, { + key: "register", + value: function register(name, value) { + var registry = this.prototype.hasOwnProperty("registry") ? this.prototype.registry : this.prototype.registry = Object.create(null);(registry[name] || (registry[name] = [])).push(value); } - var childA = iA.next(), - childB = iB.next(); - if (childA == childB) { - offA -= childA.width;offB -= childB.width; - continue; + }, { + key: "kind", + get: function get() { + return "."; } + }]); - if (!childA.sameMarkup(childB)) break; + return NodeType; +})(); - if (childA.isText && childA.text != childB.text) { - var same = 0, - minSize = Math.min(childA.text.length, childB.text.length); - while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { - same++;offA--;offB--; - } - break; - } - offA -= childA.width;offB -= childB.width; - if (childA.size || childB.size) { - pathA.push(offA);pathB.push(offB); - var inner = findDiffEnd(childA.content, childB.content, pathA, pathB); - if (inner) return inner; - pathA.pop();pathB.pop(); - } - } - return { a: new _pos.Pos(pathA, offA), b: new _pos.Pos(pathB, offB) }; -} +exports.NodeType = NodeType; +NodeType.attributes = {}; -},{"./pos":48}],44:[function(require,module,exports){ -// ;; A fragment is an abstract type used to represent a node's -// collection of child nodes. It tries to hide considerations about -// the actual way in which the child nodes are stored, so that -// different representations (nodes that only contain simple nodes -// versus nodes that also contain text) can be approached using the -// same API. -// -// Fragments are persistent data structures. That means you should -// _not_ mutate them or their content, but create new instances -// whenever needed. The API tries to make this easy. -"use strict"; +// ;; #toc=false Base type for block nodetypes. -Object.defineProperty(exports, "__esModule", { - value: true -}); +var Block = (function (_NodeType) { + _inherits(Block, _NodeType); -var _get = function get(_x16, _x17, _x18) { - var _again = true;_function: while (_again) { - var object = _x16, - property = _x17, - receiver = _x18;_again = false;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 { - _x16 = parent;_x17 = property;_x18 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } + function Block() { + _classCallCheck(this, Block); + + _get(Object.getPrototypeOf(Block.prototype), "constructor", this).apply(this, arguments); } -}; -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; - }; -})(); + // ;; #toc=false Base type for textblock node types. -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; -} + _createClass(Block, [{ + key: "defaultContent", + value: function defaultContent() { + var inner = this.schema.defaultTextblockType().create(); + var conn = this.findConnection(inner.type); + if (!conn) SchemaError.raise("Can't create default content for " + this.name); + for (var i = conn.length - 1; i >= 0; i--) { + inner = conn[i].create(null, inner); + }return _fragment.Fragment.from(inner); + } + }, { + key: "isBlock", + get: function get() { + return true; + } + }, { + key: "canBeEmpty", + get: function get() { + return this.contains == null; + } + }], [{ + key: "contains", + get: function get() { + return "block"; + } + }, { + key: "kind", + get: function get() { + return "block."; + } + }]); -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} + return Block; +})(NodeType); -var Fragment = (function () { - function Fragment() { - _classCallCheck(this, Fragment); - } +exports.Block = Block; - _createClass(Fragment, [{ - key: "append", +var Textblock = (function (_Block) { + _inherits(Textblock, _Block); - // :: (Fragment, number, number) → Fragment - // Create a fragment that combines this one with another fragment. - // Takes care of merging adjacent text nodes and can also merge - // “open” nodes at the boundary. `joinLeft` and `joinRight` give the - // depth to which the left and right fragments are open. If open - // nodes with the same markup are found on both sides, they are - // joined. If not, the open nodes are [closed](#Node.close). - value: function append(other) { - var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + function Textblock() { + _classCallCheck(this, Textblock); - if (!this.size) return joinRight ? other.replace(0, other.firstChild.close(joinRight - 1, "start")) : other; - if (!other.size) return joinLeft ? this.replace(this.size - 1, this.lastChild.close(joinLeft - 1, "end")) : this; - return this.appendInner(other, joinLeft, joinRight); - } + _get(Object.getPrototypeOf(Textblock.prototype), "constructor", this).apply(this, arguments); + } - // :: string - // Concatenate all the text nodes found in this fragment and its - // children. - }, { - key: "toString", + // ;; #toc=false Base type for inline node types. - // :: () → string - // Return a debugging string that describes this fragment. - value: function toString() { - var str = ""; - this.forEach(function (n) { - return str += (str ? ", " : "") + n.toString(); - }); - return str; + _createClass(Textblock, [{ + key: "containsMarks", + get: function get() { + return true; } - - // :: (number, number, ?(Node) → Node) → [Node] - // Produce an array with the child nodes between the given - // boundaries, optionally mapping a function over them. }, { - key: "toArray", - value: function toArray(from, to, f) { - if (from === undefined) from = 0; - if (to === undefined) to = this.size; - - var result = []; - for (var iter = this.iter(from, to), n = undefined; n = iter.next().value;) { - result.push(f ? f(n) : n); - }return result; + key: "isTextblock", + get: function get() { + return true; } - - // :: ((Node) → Node) → Fragment - // Produce a new Fragment by mapping all this fragment's children - // through a function. }, { - key: "map", - value: function map(f) { - // FIXME join text nodes? - return Fragment.fromArray(this.toArray(undefined, undefined, f)); + key: "canBeEmpty", + get: function get() { + return true; + } + }], [{ + key: "contains", + get: function get() { + return "inline"; } + }]); - // :: ((Node) → bool) → bool - // Returns `true` if the given function returned `true` for any of - // the fragment's children. - }, { - key: "some", - value: function some(f) { - for (var iter = this.iter(), n = undefined; n = iter.next().value;) { - if (f(n)) return n; - } + return Textblock; +})(Block); + +exports.Textblock = Textblock; + +var Inline = (function (_NodeType2) { + _inherits(Inline, _NodeType2); + + function Inline() { + _classCallCheck(this, Inline); + + _get(Object.getPrototypeOf(Inline.prototype), "constructor", this).apply(this, arguments); + } + + // ;; #toc=false The text node type. + + _createClass(Inline, [{ + key: "isInline", + get: function get() { + return true; } - }, { - key: "close", - value: function close(depth, side) { - var child = side == "start" ? this.firstChild : this.lastChild; - var closed = child.close(depth - 1, side); - if (closed == child) return this; - return this.replace(side == "start" ? 0 : this.size - 1, closed); + }], [{ + key: "contains", + get: function get() { + return null; } }, { - key: "nodesBetween", - value: function nodesBetween(from, to, f, path, parent) { - var moreFrom = from && from.depth > path.length, - moreTo = to && to.depth > path.length; - var start = moreFrom ? from.path[path.length] : from ? from.offset : 0; - var end = moreTo ? to.path[path.length] + 1 : to ? to.offset : this.size; - for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { - var startOffset = iter.offset - node.width; - path.push(startOffset); - node.nodesBetween(moreFrom && startOffset == start ? from : null, moreTo && iter.offset == end ? to : null, f, path, parent); - path.pop(); - } + key: "kind", + get: function get() { + return "inline."; } + }]); - // :: (?Pos, ?Pos) → Fragment - // Slice out the sub-fragment between the two given positions. - // `null` can be passed for either to indicate the slice should go - // all the way to the start or end of the fragment. - }, { - key: "sliceBetween", - value: function sliceBetween(from, to) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; + return Inline; +})(NodeType); - var moreFrom = from && from.depth > depth, - moreTo = to && to.depth > depth; - var start = moreFrom ? from.path[depth] : from ? from.offset : 0; - var end = moreTo ? to.path[depth] + 1 : to ? to.offset : this.size; - var nodes = []; - for (var iter = this.iter(start, end), node = undefined; node = iter.next().value;) { - var passFrom = moreFrom && iter.offset - node.width == start ? from : null; - var passTo = moreTo && iter.offset == end ? to : null; - if (passFrom || passTo) node = node.sliceBetween(passFrom, passTo, depth + 1); - nodes.push(node); - } - return new this.constructor(nodes); - } +exports.Inline = Inline; - // :: (Schema, Object) → Fragment - // Deserialize a fragment from its JSON representation. +var Text = (function (_Inline) { + _inherits(Text, _Inline); + + function Text() { + _classCallCheck(this, Text); + + _get(Object.getPrototypeOf(Text.prototype), "constructor", this).apply(this, arguments); + } + + // Attribute descriptors + + // ;; Attributes are named strings associated with nodes and marks. + // Each node type or mark type has a fixed set of attributes, which + // instances of this class are used to control. + + _createClass(Text, [{ + key: "create", + value: function create(attrs, content, marks) { + return new _node.TextNode(this, this.buildAttrs(attrs, content), content, marks); + } }, { - key: "textContent", + key: "selectable", get: function get() { - var text = ""; - this.forEach(function (n) { - return text += n.textContent; - }); - return text; - } - }], [{ - key: "fromJSON", - value: function fromJSON(schema, value) { - return value ? this.fromArray(value.map(schema.nodeFromJSON)) : emptyFragment; + return false; } - - // :: ([Node]) → Fragment - // Build a fragment from an array of nodes. }, { - key: "fromArray", - value: function fromArray(array) { - if (!array.length) return emptyFragment; - var hasText = false; - for (var i = 0; i < array.length; i++) { - if (array[i].isText) hasText = true; - }return new (hasText ? TextFragment : FlatFragment)(array); + key: "isText", + get: function get() { + return true; } + }]); + + return Text; +})(Inline); + +exports.Text = Text; + +var Attribute = (function () { + // :: (Object) + // Create an attribute. `options` is an object containing the + // settings for the attributes. The following settings are + // supported: + // + // **`default`**: `?string` + // : The default value for this attribute, to choose when no + // explicit value is provided. + // + // **`compute`**: `?(Fragment) → string` + // : A function that computes a default value for the attribute from + // the node's content. + // + // Attributes that have no default or compute property must be + // provided whenever a node or mark of a type that has them is + // created. + + function Attribute() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, Attribute); + + this["default"] = options["default"]; + this.compute = options.compute; + this.registry = Object.create(null); + } + + // Marks + + // ;; Like nodes, marks (which are associated with nodes to signify + // things like emphasis or being part of a link) are tagged with type + // objects, which are instantiated once per `Schema`. + + // :: (string, *) + // Register a value in this attribute's registry. See + // `NodeType.register` and `Schema.registry`. - // :: (?union) → Fragment - // Create a fragment from something that can be interpreted as a set - // of nodes. For `null`, it returns the empty fragment. For a - // fragment, the fragment itself. For a node or array of nodes, a - // fragment containing those nodes. - }, { - key: "from", - value: function from(nodes) { - if (!nodes) return emptyFragment; - if (nodes instanceof Fragment) return nodes; - return this.fromArray(Array.isArray(nodes) ? nodes : [nodes]); + _createClass(Attribute, [{ + key: "register", + value: function register(name, value) { + ;(this.registry[name] || (this.registry[name] = [])).push(value); } }]); - return Fragment; + return Attribute; })(); -exports.Fragment = Fragment; - -var iterEnd = { done: true }; +exports.Attribute = Attribute; -var FlatIterator = (function () { - function FlatIterator(array, pos, end) { - _classCallCheck(this, FlatIterator); +var MarkType = (function () { + function MarkType(name, attrs, rank, schema) { + _classCallCheck(this, MarkType); - this.array = array; - this.pos = pos; - this.end = end; + // :: string + // The name of the mark type. + this.name = name; + // :: Object + // The attributes supported by this type of mark. + this.attrs = attrs; + this.rank = rank; + // :: Schema + // The schema that this mark type instance is part of. + this.schema = schema; + var defaults = getDefaultAttrs(this.attrs); + this.instance = defaults && new _mark.Mark(this, defaults); } - _createClass(FlatIterator, [{ - key: "copy", - value: function copy() { - return new this.constructor(this.array, this.pos, this.end); + // :: Object + // The default set of attributes to associate with a mark type. By + // default, this returns an empty object. + + // :: number + // Mark type ranks are used to determine the order in which mark + // arrays are sorted. (If multiple mark types end up with the same + // rank, they still get a fixed order in the schema, but there's no + // guarantee what it will be.) + + _createClass(MarkType, [{ + key: "create", + + // :: (Object) → Mark + // Create a mark of this type. `attrs` may be `null` or an object + // containing only some of the mark's attributes. The others, if + // they have defaults, will be added. + value: function create(attrs) { + if (!attrs && this.instance) return this.instance; + return new _mark.Mark(this, _buildAttrs(this.attrs, attrs, this)); } }, { - key: "atEnd", - value: function atEnd() { - return this.pos == this.end; + key: "removeFromSet", + + // :: ([Mark]) → [Mark] + // When there is a mark of this type in the given set, a new set + // without it is returned. Otherwise, the input set is returned. + value: function removeFromSet(set) { + for (var i = 0; i < set.length; i++) if (set[i].type == this) return set.slice(0, i).concat(set.slice(i + 1)); + return set; } + + // :: ([Mark]) → bool + // Tests whether there is a mark of this type in the given set. }, { - key: "next", - value: function next() { - return this.pos == this.end ? iterEnd : this.array[this.pos++]; + key: "isInSet", + value: function isInSet(set) { + for (var i = 0; i < set.length; i++) { + if (set[i].type == this) return set[i]; + } + } + }], [{ + key: "getOrder", + value: function getOrder(marks) { + var sorted = []; + for (var _name4 in marks) { + sorted.push({ name: _name4, rank: marks[_name4].type.rank }); + }sorted.sort(function (a, b) { + return a.rank - b.rank; + }); + var ranks = Object.create(null); + for (var i = 0; i < sorted.length; i++) { + ranks[sorted[i].name] = i; + }return ranks; } }, { - key: "offset", + key: "compile", + value: function compile(marks, schema) { + var order = this.getOrder(marks); + var result = Object.create(null); + for (var _name5 in marks) { + var info = marks[_name5]; + var attrs = info.attributes || info.type.attributes; + result[_name5] = new info.type(_name5, attrs, order[_name5], schema); + } + return result; + } + }, { + key: "rank", get: function get() { - return this.pos; + return 50; } }]); - return FlatIterator; + return MarkType; })(); -var ReverseFlatIterator = (function (_FlatIterator) { - _inherits(ReverseFlatIterator, _FlatIterator); +exports.MarkType = MarkType; +MarkType.attributes = {}; - function ReverseFlatIterator() { - _classCallCheck(this, ReverseFlatIterator); +// :: (string, *) +// Register a metadata element for this mark type. See also +// `NodeType.register`. +MarkType.register = NodeType.register; - _get(Object.getPrototypeOf(ReverseFlatIterator.prototype), "constructor", this).apply(this, arguments); - } +// Schema specifications are data structures that specify a schema -- +// a set of node types, their names, attributes, and nesting behavior. - // ;; #forward=Fragment +function copyObj(obj, f) { + var result = Object.create(null); + for (var prop in obj) { + result[prop] = f ? f(obj[prop]) : obj[prop]; + }return result; +} - _createClass(ReverseFlatIterator, [{ - key: "next", - value: function next() { - return this.pos == this.end ? iterEnd : this.array[--this.pos]; +function ensureWrapped(obj) { + return obj instanceof Function ? { type: obj } : obj; +} + +function overlayObj(obj, overlay) { + var copy = copyObj(obj); + for (var _name6 in overlay) { + var info = ensureWrapped(overlay[_name6]); + if (info == null) { + delete copy[_name6]; + } else if (info.type) { + copy[_name6] = info; + } else { + var existing = copy[_name6] = copyObj(copy[_name6]); + for (var prop in info) { + existing[prop] = info[prop]; + } } - }]); + } + return copy; +} - return ReverseFlatIterator; -})(FlatIterator); +// ;; A schema specification is a blueprint for an actual +// `Schema`. It maps names to node and mark types, along +// with extra information, such as additional attributes and changes +// to node kinds and relations. +// +// A specification consists of an object that maps node names to node +// type constructors and another similar object mapping mark names to +// mark type constructors. +// +// For flexibility and reusability, node and mark type classes do not +// declare their own name. Instead, each schema that includes them can +// assign a name to them, as well as override their +// [kind](#NodeType.kind) and [contained kind](#NodeType.contains), or +// adding extra [attributes](#NodeType.attributes). -var FlatFragment = (function (_Fragment) { - _inherits(FlatFragment, _Fragment); +var SchemaSpec = (function () { + // :: (?Object<{type: NodeType}>, ?Object<{type: MarkType}>) + // Create a schema specification from scratch. The arguments map + // node names to node type constructors and mark names to mark type + // constructors. Their property value should be either the type + // constructors themselves, or objects with a type constructor under + // their `type` property, and optionally these other properties: + // + // **`contains`**`: string` + // : Only valid for `nodes`. The [kind](#NodeType.kind) of the + // nodes that this node can contain in this schema. + // + // **`kind`**`: string` + // : Only valid for `nodes`. Overrides the kind of this node in + // this schema. Same format as `NodeType.kind`. + // + // **`attributes`**`: Object` + // : Extra attributes to attach to this node in this schema. - function FlatFragment(content) { - _classCallCheck(this, FlatFragment); + function SchemaSpec(nodes, marks) { + _classCallCheck(this, SchemaSpec); - _get(Object.getPrototypeOf(FlatFragment.prototype), "constructor", this).call(this); - this.content = content; + this.nodes = nodes ? copyObj(nodes, ensureWrapped) : Object.create(null); + this.marks = marks ? copyObj(marks, ensureWrapped) : Object.create(null); } - // :: Fragment - // An empty fragment. Intended to be reused whenever a node doesn't - // contain anything (rather than allocating a new empty fragment for - // each leaf node). + // For node types where all attrs have a default value (or which don't + // have any attributes), build up a single reusable default attribute + // object, and use it for all nodes that don't specify specific + // attributes. + + // :: (?Object, ?Object) → SchemaSpec + // Base a new schema spec on this one by specifying nodes and marks + // to add, change, or remove. + // + // When `nodes` is passed, it should be an object mapping type names + // to either `null`, to delete the type of that name, to a + // `NodeType`, to add or replace the node type of that name, or to + // an object containing [extension + // properties](#SchemaSpec_constructor), to add to the existing + // description of that node type. + // + // Similarly, `marks` can be an object to add, change, or remove + // marks in the schema. + + _createClass(SchemaSpec, [{ + key: "update", + value: function update(nodes, marks) { + return new SchemaSpec(nodes ? overlayObj(this.nodes, nodes) : this.nodes, marks ? overlayObj(this.marks, marks) : this.marks); + } + + // :: (?union, string, Attribute) → SchemaSpec + // Create a new schema spec with attributes added to selected node + // types. `filter` can be `null`, to add the attribute to all node + // types, a string, to add it only to the named node type, or a + // predicate function, to add it to node types that pass the + // predicate. + // + // This attribute will be added alongside the node type's [default + // attributes](#NodeType.attributes). + }, { + key: "addAttribute", + value: function addAttribute(filter, attrName, attr) { + var copy = copyObj(this.nodes); + for (var _name7 in copy) { + if (typeof filter == "string" ? filter == _name7 : typeof filter == "function" ? filter(_name7, copy[_name7]) : filter ? filter == copy[_name7] : true) { + var info = copy[_name7] = copyObj(copy[_name7]);(info.attributes || (info.attributes = Object.create(null)))[attrName] = attr; + } + } + return new SchemaSpec(copy, this.marks); + } + }]); - // :: (?number, ?number) → Iterator - // Create a forward iterator over the content of the fragment. An - // explicit start and end offset can be given to have the iterator - // go over only part of the content. If an iteration bound falls - // within a text node, only the part that is within the bounds is - // yielded. + return SchemaSpec; +})(); - _createClass(FlatFragment, [{ - key: "iter", - value: function iter() { - var start = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var end = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; +exports.SchemaSpec = SchemaSpec; +function getDefaultAttrs(attrs) { + var defaults = Object.create(null); + for (var attrName in attrs) { + var attr = attrs[attrName]; + if (attr["default"] == null) return null; + defaults[attrName] = attr["default"]; + } + return defaults; +} - return new FlatIterator(this.content, start, end); +function _buildAttrs(attrSpec, attrs, arg1, arg2) { + var built = Object.create(null); + for (var _name8 in attrSpec) { + var value = attrs && attrs[_name8]; + if (value == null) { + var attr = attrSpec[_name8]; + if (attr["default"] != null) value = attr["default"];else if (attr.compute) value = attr.compute(arg1, arg2);else SchemaError.raise("No value supplied for attribute " + _name8); } + built[_name8] = value; + } + return built; +} - // :: (?number, ?number) → Iterator - // Create a reverse iterator over the content of the fragment. An - // explicit start and end offset can be given to have the iterator - // go over only part of the content. **Note**: `start` should be - // greater than `end`, when passed. - }, { - key: "reverseIter", - value: function reverseIter() { - var start = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; - var end = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - return new ReverseFlatIterator(this.content, start, end); - } +// ;; Each document is based on a single schema, which provides the +// node and mark types that it is made up of (which, in turn, +// determine the structure it is allowed to have). - // :: number - // The maximum offset in this fragment. - }, { - key: "child", +var Schema = (function () { + // :: (SchemaSpec) + // Construct a schema from a specification. - // :: (number) → Node - // Get the child at the given offset. Might return a text node that - // stretches before and/or after the offset. - value: function child(off) { - if (off < 0 || off >= this.content.length) throw new Error("Offset " + off + " out of range"); - return this.content[off]; - } + function Schema(spec) { + _classCallCheck(this, Schema); - // :: ((node: Node, start: number, end: number)) - // Call the given function for each node in the fragment, passing it - // the node, its start offset, and its end offset. - }, { - key: "forEach", - value: function forEach(f) { - for (var i = 0; i < this.content.length; i++) { - f(this.content[i], i, i + 1); - } - } + // :: SchemaSpec + // The specification on which the schema is based. + this.spec = spec; + this.kinds = Object.create(null); + // :: Object + // An object mapping the schema's node names to node type objects. + this.nodes = NodeType.compile(spec.nodes, this); + // :: Object + // A map from mark names to mark type objects. + this.marks = MarkType.compile(spec.marks, this); + // :: Object + // An object for storing whatever values modules may want to + // compute and cache per schema. (If you want to store something + // in it, try to use property names unlikely to clash.) + this.cached = Object.create(null); - // :: (number) → {start: number, node: Node} - // Find the node before the given offset. Returns an object - // containing the node as well as its start index. Offset should be - // greater than zero. - }, { - key: "chunkBefore", - value: function chunkBefore(off) { - return { node: this.child(off - 1), start: off - 1 }; - } + this.node = this.node.bind(this); + this.text = this.text.bind(this); + this.nodeFromJSON = this.nodeFromJSON.bind(this); + this.markFromJSON = this.markFromJSON.bind(this); + } - // :: (number) → {start: number, node: Node} - // Find the node after the given offset. Returns an object - // containing the node as well as its start index. Offset should be - // less than the fragment's size. - }, { - key: "chunkAfter", - value: function chunkAfter(off) { - return { node: this.child(off), start: off }; - } + // :: (union, ?Object, ?union, ?[Mark]) → Node + // Create a node in this schema. The `type` may be a string or a + // `NodeType` instance. Attributes will be extended + // with defaults, `content` may be a `Fragment`, + // `null`, a `Node`, or an array of nodes. + // + // When creating a text node, `content` should be a string and is + // interpreted as the node's text. + // + // This method is bound to the Schema, meaning you don't have to + // call it as a method, but can pass it to higher-order functions + // and such. - // :: (number, ?number) → Fragment - // Return a fragment with only the nodes between the given offsets. - // When `to` is not given, the slice will go to the end of the - // fragment. - }, { - key: "slice", - value: function slice(from) { - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; + _createClass(Schema, [{ + key: "node", + value: function node(type, attrs, content, marks) { + if (typeof type == "string") type = this.nodeType(type);else if (!(type instanceof NodeType)) SchemaError.raise("Invalid node type: " + type);else if (type.schema != this) SchemaError.raise("Node type from different schema used (" + type.name + ")"); - if (from == to) return emptyFragment; - return new FlatFragment(this.content.slice(from, to)); + return type.create(attrs, content, marks); } - // :: (number, Node) → Fragment - // Return a fragment in which the node at the given offset is - // replaced by the given node. The node, as well as the one it - // replaces, should not be text nodes. - }, { - key: "replace", - value: function replace(offset, node) { - if (node.isText) throw new Error("Argument to replace should be a non-text node"); - var copy = this.content.slice(); - copy[offset] = node; - return new FlatFragment(copy); - } + // :: (string, ?[Mark]) → Node + // Create a text node in the schema. This method is bound to the Schema. }, { - key: "appendInner", - value: function appendInner(other, joinLeft, joinRight) { - var last = this.content.length - 1, - content = this.content.slice(0, last); - var before = this.content[last], - after = other.firstChild; - if (joinLeft > 0 && joinRight > 0 && before.sameMarkup(after)) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); - return Fragment.fromArray(content.concat(other.toArray(after.width))); + key: "text", + value: function text(_text, marks) { + return this.nodes.text.create(null, _text, _mark.Mark.setFrom(marks)); } - // :: () → Object - // Create a JSON-serializeable representation of this fragment. - }, { - key: "toJSON", - value: function toJSON() { - return this.content.map(function (n) { - return n.toJSON(); - }); - } + // :: () → ?NodeType + // Return the default textblock type for this schema, or `null` if + // it does not contain a node type with a `defaultTextblock` + // property. }, { - key: "size", - get: function get() { - return this.content.length; + key: "defaultTextblockType", + value: function defaultTextblockType() { + var cached = this.cached.defaultTextblockType; + if (cached !== undefined) return cached; + for (var _name9 in this.nodes) { + if (this.nodes[_name9].defaultTextblock) return this.cached.defaultTextblockType = this.nodes[_name9]; + } + return this.cached.defaultTextblockType = null; } - // :: ?Node - // The first child of the fragment, or `null` if it is empty. + // :: (string, ?Object) → Mark + // Create a mark with the named type }, { - key: "firstChild", - get: function get() { - return this.content.length ? this.content[0] : null; + key: "mark", + value: function mark(name, attrs) { + var spec = this.marks[name] || SchemaError.raise("No mark named " + name); + return spec.create(attrs); } - // :: ?Node - // The last child of the fragment, or `null` if it is empty. + // :: (Object) → Node + // Deserialize a node from its JSON representation. This method is + // bound. }, { - key: "lastChild", - get: function get() { - return this.content.length ? this.content[this.content.length - 1] : null; + key: "nodeFromJSON", + value: function nodeFromJSON(json) { + return _node.Node.fromJSON(this, json); } - }]); - - return FlatFragment; -})(Fragment); - -var emptyFragment = new FlatFragment([]); -exports.emptyFragment = emptyFragment; - -var TextIterator = (function () { - function TextIterator(fragment, startOffset, endOffset) { - var pos = arguments.length <= 3 || arguments[3] === undefined ? -1 : arguments[3]; - - _classCallCheck(this, TextIterator); - - this.frag = fragment; - this.offset = startOffset; - this.pos = pos; - this.endOffset = endOffset; - } - - _createClass(TextIterator, [{ - key: "copy", - value: function copy() { - return new this.constructor(this.frag, this.offset, this.endOffset, this.pos); - } + // :: (Object) → Mark + // Deserialize a mark from its JSON representation. This method is + // bound. }, { - key: "atEnd", - value: function atEnd() { - return this.offset == this.endOffset; + key: "markFromJSON", + value: function markFromJSON(json) { + if (typeof json == "string") return this.mark(json); + return this.mark(json._, json); } + + // :: (string) → NodeType + // Get the `NodeType` associated with the given name in + // this schema, or raise an error if it does not exist. }, { - key: "next", - value: function next() { - if (this.pos == -1) { - var start = this.init(); - if (start) return start; - } - return this.offset == this.endOffset ? iterEnd : this.advance(); + key: "nodeType", + value: function nodeType(name) { + return this.nodes[name] || SchemaError.raise("Unknown node type: " + name); } + + // :: (string, string) → bool + // Test whether a node kind is a sub-kind of another kind. }, { - key: "advance", - value: function advance() { - var node = this.frag.content[this.pos++], - end = this.offset + node.width; - if (end > this.endOffset) { - node = node.copy(node.text.slice(0, this.endOffset - this.offset)); - this.offset = this.endOffset; - return node; + key: "subKind", + value: function subKind(sub, sup) { + for (;;) { + if (sub == sup) return true; + sub = this.kinds[sub]; + if (!sub) return false; } - this.offset = end; - return node; } + + // :: (string, (value: *, source: union)) + // Retrieve all registered items under the given name from this + // schema. The given function will be called with each item and, as + // a second argument, the element—node type, mark type, or + // attribute—that it was associated with. }, { - key: "init", - value: function init() { - this.pos = 0; - var offset = 0; - while (offset < this.offset) { - var node = this.frag.content[this.pos++], - end = offset + node.width; - if (end == this.offset) break; - if (end > this.offset) { - var sliceEnd = node.width; - if (end > this.endOffset) { - sliceEnd = this.endOffset - offset; - end = this.endOffset; + key: "registry", + value: function registry(name, f) { + var attrsSeen = []; + for (var i = 0; i < 2; i++) { + var obj = i ? this.marks : this.nodes; + for (var tname in obj) { + var type = obj[tname]; + if (type.constructor.prototype.hasOwnProperty("registry")) { + var reg = type.registry[name]; + if (reg) for (var j = 0; j < reg.length; j++) { + f(reg[j], type); + } + } + for (var aname in type.attrs) { + var attr = type.attrs[aname], + reg = attr.registry[name]; + if (reg && attrsSeen.indexOf(attr) == -1) { + attrsSeen.push(attr); + for (var j = 0; j < reg.length; j++) { + f(reg[j], attr); + } + } } - node = node.copy(node.text.slice(this.offset - offset, sliceEnd)); - this.offset = end; - return node; } - offset = end; } } }]); - return TextIterator; + return Schema; })(); -var ReverseTextIterator = (function (_TextIterator) { - _inherits(ReverseTextIterator, _TextIterator); +exports.Schema = Schema; - function ReverseTextIterator() { - _classCallCheck(this, ReverseTextIterator); +},{"../util/error":48,"./fragment":26,"./mark":28,"./node":29}],32:[function(require,module,exports){ +"use strict"; - _get(Object.getPrototypeOf(ReverseTextIterator.prototype), "constructor", this).apply(this, arguments); +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; + }; +})(); + +exports.fromDOM = fromDOM; +exports.fromHTML = fromHTML; + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } +} - _createClass(ReverseTextIterator, [{ - key: "advance", - value: function advance() { - var node = this.frag.content[--this.pos], - end = this.offset - node.width; - if (end < this.endOffset) { - node = node.copy(node.text.slice(this.endOffset - end)); - this.offset = this.endOffset; - return node; +var _model = require("../model"); + +var _index = require("./index"); + +// :: (Schema, DOMNode, ?Object) → Node +// Parse document from the content of a DOM node. To pass an explicit +// parent document (for example, when not in a browser window +// environment, where we simply use the global document), pass it as +// the `document` property of `options`. + +function fromDOM(schema, dom, options) { + if (!options) options = {}; + var context = new DOMParseState(schema, options.topNode || schema.node("doc"), options); + var start = options.from ? dom.childNodes[options.from] : dom.firstChild; + var end = options.to != null && dom.childNodes[options.to] || null; + context.addAll(start, end, true); + var doc = undefined; + while (context.stack.length) doc = context.leave(); + return doc; +} + +// ;; #path=DOMParseSpec #kind=interface #toc=false +// To define the way [node](#NodeType) and [mark](#MarkType) types are +// parsed, you can associate one or more DOM parsing specifications to +// them using the [`register`](#NodeType.register) method with the +// `parseDOM` property name. Each of them defines a parsing strategy +// for a certain type of DOM node. +// +// Note that `Attribute`s may also contain a `parseDOM` property, +// which should _not_ be a `DOMParseSpec`, but simply a function that +// computes the attribute's value from a DOM node. + +// :: ?string #path=DOMParseSpec.tag +// The (lower-case) tag name for which to activate this parser. When +// not given, it is activated for all nodes. + +// :: ?number #path=DOMParseSpec.rank +// The precedence of this parsing strategy. Should be a number between +// 0 and 100, which determines when this parser gets a chance relative +// to others that apply to the node (low ranks go first). Defaults to +// 50. + +// :: union #path=DOMParseSpec.parse +// The function that, given a DOM node, parses it, updating the parse +// state. It should return (the exact value) `false` when it wants to +// indicate that it was not able to parse this node. This function is +// called in such a way that `this` is bound to the type that the +// parse spec was associated with. +// +// When this is set to the string `"block"`, the content of the DOM +// node is parsed as the content in a node of the type that this spec +// was associated with. +// +// When set to the string `"mark"`, the content of the DOM node is +// parsed with an instance of the mark that this spec was associated +// with added to their marks. + +(0, _index.defineSource)("dom", fromDOM); + +// :: (Schema, string, ?Object) → Node +// Parses the HTML into a DOM, and then calls through to `fromDOM`. + +function fromHTML(schema, html, options) { + var wrap = (options && options.document || window.document).createElement("div"); + wrap.innerHTML = html; + return fromDOM(schema, wrap, options); +} + +(0, _index.defineSource)("html", fromHTML); + +var blockElements = { + address: true, article: true, aside: true, blockquote: true, canvas: true, + dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true, + footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true, + h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true, + output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true +}; + +var noMarks = []; + +// ;; #toc=false A state object used to track context during a parse, +// and to expose methods to custom parsing functions. + +var DOMParseState = (function () { + function DOMParseState(schema, topNode, options) { + _classCallCheck(this, DOMParseState); + + // :: Object The options passed to this parse. + this.options = options || {}; + // :: Schema The schema that we are parsing into. + this.schema = schema; + this.stack = []; + this.marks = noMarks; + this.closing = false; + this.enter(topNode.type, topNode.attrs); + this.nodeInfo = nodeInfo(schema); + } + + _createClass(DOMParseState, [{ + key: "parseAttrs", + value: function parseAttrs(dom, type, attrs) { + for (var attr in type.attrs) { + var desc = type.attrs[attr]; + if (desc.parseDOM && (!attrs || !Object.prototype.hasOwnProperty.call(attrs, attr))) { + var value = desc.parseDOM(dom, this.options, desc, type); + if (value != null) { + if (!attrs) attrs = {}; + attrs[attr] = value; + } + } } - this.offset = end; - return node; + return attrs; } }, { - key: "init", - value: function init() { - this.pos = this.frag.content.length; - var offset = this.frag.size; - while (offset > this.offset) { - var node = this.frag.content[--this.pos], - end = offset - node.width; - if (end == this.offset) break; - if (end < this.offset) { - if (end < this.endOffset) { - node = node.copy(node.text.slice(this.endOffset - end, this.offset - end)); - end = this.endOffset; - } else { - node = node.copy(node.text.slice(0, this.offset - end)); - } - this.offset = end; - return node; + key: "addDOM", + value: function addDOM(dom) { + if (dom.nodeType == 3) { + // FIXME define a coherent strategy for dealing with trailing, leading, and multiple spaces (this isn't one) + var value = dom.nodeValue; + var _top = this.top, + last = undefined; + if (/\S/.test(value) || _top.type.isTextblock) { + value = value.replace(/\s+/g, " "); + if (/^\s/.test(value) && (last = _top.content[_top.content.length - 1]) && last.type.name == "text" && /\s$/.test(last.text)) value = value.slice(1); + if (value) this.insert(this.schema.text(value, this.marks)); + } + } else if (dom.nodeType != 1 || dom.hasAttribute("pm-ignore")) { + // Ignore non-text non-element nodes + } else if (!this.parseNodeType(dom)) { + this.addAll(dom.firstChild, null); + var _name = dom.nodeName.toLowerCase(); + if (blockElements.hasOwnProperty(_name) && this.top.type == this.schema.defaultTextblockType()) this.closing = true; } - offset = end; - } - } - }]); - - return ReverseTextIterator; -})(TextIterator); - -var TextFragment = (function (_Fragment2) { - _inherits(TextFragment, _Fragment2); - - function TextFragment(content, size) { - _classCallCheck(this, TextFragment); - - _get(Object.getPrototypeOf(TextFragment.prototype), "constructor", this).call(this); - this.content = content; - this.size = size || 0; - if (size == null) for (var i = 0; i < content.length; i++) { - this.size += content[i].width; } - } - - _createClass(TextFragment, [{ - key: "iter", - value: function iter() { - var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - return new TextIterator(this, from, to); + }, { + key: "tryParsers", + value: function tryParsers(parsers, dom) { + if (parsers) for (var i = 0; i < parsers.length; i++) { + var parser = parsers[i]; + if (parser.parse.call(parser.type, dom, this) !== false) return true; + } } }, { - key: "reverseIter", - value: function reverseIter() { - var from = arguments.length <= 0 || arguments[0] === undefined ? this.size : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - - return new ReverseTextIterator(this, from, to); + key: "parseNodeType", + value: function parseNodeType(dom) { + return this.tryParsers(this.nodeInfo[dom.nodeName.toLowerCase()], dom) || this.tryParsers(this.nodeInfo._, dom); } }, { - key: "child", - value: function child(off) { - if (off < 0 || off >= this.size) throw new Error("Offset " + off + " out of range"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i]; - curOff += child.width; - if (curOff > off) return child; + key: "addAll", + value: function addAll(from, to, sync) { + var stack = sync && this.stack.slice(); + for (var dom = from; dom != to; dom = dom.nextSibling) { + this.addDOM(dom); + if (sync && blockElements.hasOwnProperty(dom.nodeName.toLowerCase())) this.sync(stack); } } }, { - key: "forEach", - value: function forEach(f) { - for (var i = 0, off = 0; i < this.content.length; i++) { - var child = this.content[i]; - f(child, off, off += child.width); - } + key: "doClose", + value: function doClose() { + if (!this.closing || this.stack.length < 2) return; + var left = this.leave(); + this.enter(left.type, left.attrs); + this.closing = false; } }, { - key: "chunkBefore", - value: function chunkBefore(off) { - if (!off) throw new Error("No chunk before start of node"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i], - end = curOff + child.width; - if (end >= off) return { node: child, start: curOff }; - curOff = end; + key: "insert", + value: function insert(node) { + if (this.top.type.canContain(node)) { + this.doClose(); + } else { + for (var i = this.stack.length - 1; i >= 0; i--) { + var route = this.stack[i].type.findConnection(node.type); + if (!route) continue; + if (i == this.stack.length - 1) { + this.doClose(); + } else { + while (this.stack.length > i + 1) this.leave(); + } + for (var j = 0; j < route.length; j++) { + this.enter(route[j]); + }if (this.marks.length) this.marks = noMarks; + break; + } } + this.top.content.push(node); + return node; } + + // :: (DOMNode, NodeType, ?Object, [Node]) → Node + // Insert a node of the given type, with the given content, based on + // `dom`, at the current position in the document. }, { - key: "chunkAfter", - value: function chunkAfter(off) { - if (off == this.size) throw new Error("No chunk after end of node"); - for (var i = 0, curOff = 0; i < this.content.length; i++) { - var child = this.content[i], - end = curOff + child.width; - if (end > off) return { node: child, start: curOff }; - curOff = end; - } + key: "insertFrom", + value: function insertFrom(dom, type, attrs, content) { + return this.insert(type.createAutoFill(this.parseAttrs(dom, type, attrs), content, this.marks)); } }, { - key: "slice", - value: function slice() { - var from = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - var to = arguments.length <= 1 || arguments[1] === undefined ? this.size : arguments[1]; - - if (from == to) return emptyFragment; - return new TextFragment(this.toArray(from, to)); + key: "enter", + value: function enter(type, attrs) { + if (this.marks.length) this.marks = noMarks; + this.stack.push({ type: type, attrs: attrs, content: [] }); } }, { - key: "replace", - value: function replace(off, node) { - if (node.isText) throw new Error("Argument to replace should be a non-text node"); - var curNode = undefined, - index = undefined; - for (var curOff = 0; curOff < off; index++) { - curNode = this.content[index]; - curOff += curNode.width; - } - if (curNode.isText) throw new Error("Can not replace text content with replace method"); - var copy = this.content.slice(); - copy[index] = node; - return new TextFragment(copy); + key: "enterFrom", + value: function enterFrom(dom, type, attrs) { + this.enter(type, this.parseAttrs(dom, type, attrs)); } }, { - key: "appendInner", - value: function appendInner(other, joinLeft, joinRight) { - var last = this.content.length - 1, - content = this.content.slice(0, last); - var before = this.content[last], - after = other.firstChild; - var same = before.sameMarkup(after); - if (same && before.isText) content.push(before.copy(before.text + after.text));else if (same && joinLeft > 0 && joinRight > 0) content.push(before.append(after.content, joinLeft - 1, joinRight - 1));else content.push(before.close(joinLeft - 1, "end"), after.close(joinRight - 1, "start")); - return Fragment.fromArray(content.concat(other.toArray(after.width))); + key: "leave", + value: function leave() { + var top = this.stack.pop(); + var node = top.type.createAutoFill(top.attrs, top.content); + if (this.stack.length) this.insert(node); + return node; } }, { - key: "toJSON", - value: function toJSON() { - return this.content.map(function (n) { - return n.toJSON(); - }); + key: "sync", + value: function sync(stack) { + while (this.stack.length > stack.length) this.leave(); + for (;;) { + var n = this.stack.length - 1, + one = this.stack[n], + two = stack[n]; + if (one.type == two.type && _model.Node.sameAttrs(one.attrs, two.attrs)) break; + this.leave(); + } + while (stack.length > this.stack.length) { + var add = stack[this.stack.length]; + this.enter(add.type, add.attrs); + } + if (this.marks.length) this.marks = noMarks; + this.closing = false; } + + // :: (DOMNode, NodeType, ?Object) + // Parse the contents of `dom` as children of a node of the given + // type. }, { - key: "firstChild", - get: function get() { - return this.size ? this.content[0] : null; + key: "wrapIn", + value: function wrapIn(dom, type, attrs) { + this.enterFrom(dom, type, attrs); + this.addAll(dom.firstChild, null, true); + this.leave(); } + + // :: (DOMNode, Mark) + // Parse the contents of `dom`, with `mark` added to the set of + // current marks. }, { - key: "lastChild", + key: "wrapMark", + value: function wrapMark(dom, mark) { + var old = this.marks; + this.marks = (mark.instance || mark).addToSet(old); + this.addAll(dom.firstChild, null); + this.marks = old; + } + }, { + key: "top", get: function get() { - return this.size ? this.content[this.content.length - 1] : null; + return this.stack[this.stack.length - 1]; } }]); - return TextFragment; -})(Fragment); + return DOMParseState; +})(); -if (typeof Symbol != "undefined") { - // :: () → Iterator - // A fragment is iterable, in the ES6 sense. - Fragment.prototype[Symbol.iterator] = function () { - return this.iter(); - }; - FlatIterator.prototype[Symbol.iterator] = TextIterator.prototype[Symbol.iterator] = function () { - return this; - }; +function nodeInfo(schema) { + return schema.cached.parseDOMNodes || (schema.cached.parseDOMNodes = summarizeNodeInfo(schema)); +} + +function summarizeNodeInfo(schema) { + var tags = Object.create(null); + tags._ = []; + schema.registry("parseDOM", function (info, type) { + var tag = info.tag || "_"; + var parse = info.parse; + if (parse == "block") parse = function (dom, state) { + state.wrapIn(dom, this); + };else if (parse == "mark") parse = function (dom, state) { + state.wrapMark(dom, this); + };(tags[tag] || (tags[tag] = [])).push({ + type: type, parse: parse, + rank: info.rank == null ? 50 : info.rank + }); + }); + for (var tag in tags) { + tags[tag].sort(function (a, b) { + return a.rank - b.rank; + }); + }return tags; } -},{}],45:[function(require,module,exports){ -// !! -// This module defines ProseMirror's document model, the data -// structure used to define and inspect content documents. It -// includes: -// -// * The [node](#Node) type that represents document elements -// -// * The [schema](#Schema) types used to tag and constrain the -// document structure -// -// * The data type for document [positions](#Pos) -// -// This module does not depend on the browser API being available -// (i.e. you can load it into any JavaScript environment). +_model.Paragraph.register("parseDOM", { tag: "p", parse: "block" }); + +_model.BlockQuote.register("parseDOM", { tag: "blockquote", parse: "block" }); + +var _loop = function _loop(i) { + _model.Heading.register("parseDOM", { + tag: "h" + i, + parse: function parse(dom, state) { + state.wrapIn(dom, this, { level: i }); + } + }); +}; + +for (var i = 1; i <= 6; i++) { + _loop(i); +}_model.HorizontalRule.register("parseDOM", { tag: "hr", parse: "block" }); -"use strict"; +_model.CodeBlock.register("parseDOM", { tag: "pre", parse: function parse(dom, state) { + var params = dom.firstChild && /^code$/i.test(dom.firstChild.nodeName) && dom.firstChild.getAttribute("class"); + if (params && /fence/.test(params)) { + var found = [], + re = /(?:^|\s)lang-(\S+)/g, + m = undefined; + while (m = re.test(params)) found.push(m[1]); + params = found.join(" "); + } else { + params = null; + } + var text = dom.textContent; + state.insertFrom(dom, this, { params: params }, text ? [state.schema.text(text)] : []); + } }); -Object.defineProperty(exports, "__esModule", { - value: true -}); +_model.BulletList.register("parseDOM", { tag: "ul", parse: "block" }); -var _node = require("./node"); +_model.OrderedList.register("parseDOM", { tag: "ol", parse: function parse(dom, state) { + var attrs = { order: dom.getAttribute("start") || 1 }; + state.wrapIn(dom, this, attrs); + } }); -Object.defineProperty(exports, "Node", { - enumerable: true, - get: function get() { - return _node.Node; - } -}); +_model.ListItem.register("parseDOM", { tag: "li", parse: "block" }); -var _fragment = require("./fragment"); +_model.HardBreak.register("parseDOM", { tag: "br", parse: function parse(dom, state) { + state.insertFrom(dom, this); + } }); -Object.defineProperty(exports, "Fragment", { - enumerable: true, - get: function get() { - return _fragment.Fragment; - } -}); -Object.defineProperty(exports, "emptyFragment", { - enumerable: true, - get: function get() { - return _fragment.emptyFragment; - } -}); +_model.Image.register("parseDOM", { tag: "img", parse: function parse(dom, state) { + state.insertFrom(dom, this, { + src: dom.getAttribute("src"), + title: dom.getAttribute("title") || null, + alt: dom.getAttribute("alt") || null + }); + } }); -var _mark = require("./mark"); +// Inline style tokens -Object.defineProperty(exports, "Mark", { - enumerable: true, - get: function get() { - return _mark.Mark; - } -}); +_model.LinkMark.register("parseDOM", { tag: "a", parse: function parse(dom, state) { + var href = dom.getAttribute("href"); + if (!href) return false; + state.wrapMark(dom, this.create({ href: href, title: dom.getAttribute("title") })); + } }); -var _schema = require("./schema"); +_model.EmMark.register("parseDOM", { tag: "i", parse: "mark" }); +_model.EmMark.register("parseDOM", { tag: "em", parse: "mark" }); -Object.defineProperty(exports, "SchemaSpec", { - enumerable: true, - get: function get() { - return _schema.SchemaSpec; - } -}); -Object.defineProperty(exports, "Schema", { - enumerable: true, - get: function get() { - return _schema.Schema; - } -}); -Object.defineProperty(exports, "SchemaError", { - enumerable: true, - get: function get() { - return _schema.SchemaError; - } -}); -Object.defineProperty(exports, "NodeType", { - enumerable: true, - get: function get() { - return _schema.NodeType; - } -}); -Object.defineProperty(exports, "Block", { - enumerable: true, - get: function get() { - return _schema.Block; - } -}); -Object.defineProperty(exports, "Textblock", { - enumerable: true, - get: function get() { - return _schema.Textblock; - } -}); -Object.defineProperty(exports, "Inline", { - enumerable: true, - get: function get() { - return _schema.Inline; - } -}); -Object.defineProperty(exports, "Text", { - enumerable: true, - get: function get() { - return _schema.Text; - } -}); -Object.defineProperty(exports, "MarkType", { - enumerable: true, - get: function get() { - return _schema.MarkType; - } -}); -Object.defineProperty(exports, "Attribute", { - enumerable: true, - get: function get() { - return _schema.Attribute; - } -}); +_model.StrongMark.register("parseDOM", { tag: "b", parse: "mark" }); +_model.StrongMark.register("parseDOM", { tag: "strong", parse: "mark" }); -var _defaultschema = require("./defaultschema"); +_model.CodeMark.register("parseDOM", { tag: "code", parse: "mark" }); -Object.defineProperty(exports, "defaultSchema", { - enumerable: true, - get: function get() { - return _defaultschema.defaultSchema; - } -}); -Object.defineProperty(exports, "Doc", { - enumerable: true, - get: function get() { - return _defaultschema.Doc; - } -}); -Object.defineProperty(exports, "BlockQuote", { - enumerable: true, - get: function get() { - return _defaultschema.BlockQuote; - } -}); -Object.defineProperty(exports, "OrderedList", { - enumerable: true, - get: function get() { - return _defaultschema.OrderedList; - } -}); -Object.defineProperty(exports, "BulletList", { - enumerable: true, - get: function get() { - return _defaultschema.BulletList; - } -}); -Object.defineProperty(exports, "ListItem", { - enumerable: true, - get: function get() { - return _defaultschema.ListItem; - } -}); -Object.defineProperty(exports, "HorizontalRule", { - enumerable: true, - get: function get() { - return _defaultschema.HorizontalRule; - } -}); -Object.defineProperty(exports, "Paragraph", { - enumerable: true, - get: function get() { - return _defaultschema.Paragraph; - } -}); -Object.defineProperty(exports, "Heading", { - enumerable: true, - get: function get() { - return _defaultschema.Heading; - } -}); -Object.defineProperty(exports, "CodeBlock", { - enumerable: true, - get: function get() { - return _defaultschema.CodeBlock; - } -}); -Object.defineProperty(exports, "Image", { - enumerable: true, - get: function get() { - return _defaultschema.Image; - } -}); -Object.defineProperty(exports, "HardBreak", { - enumerable: true, - get: function get() { - return _defaultschema.HardBreak; - } -}); -Object.defineProperty(exports, "CodeMark", { - enumerable: true, - get: function get() { - return _defaultschema.CodeMark; - } -}); -Object.defineProperty(exports, "EmMark", { - enumerable: true, - get: function get() { - return _defaultschema.EmMark; - } -}); -Object.defineProperty(exports, "StrongMark", { - enumerable: true, - get: function get() { - return _defaultschema.StrongMark; - } -}); -Object.defineProperty(exports, "LinkMark", { - enumerable: true, - get: function get() { - return _defaultschema.LinkMark; - } -}); +},{"../model":27,"./index":33}],33:[function(require,module,exports){ +// !! This module implements a way to register and access parsers from +// various input formats to ProseMirror's [document format](#Node). To +// load the actual parsers, you need to import parser modules like +// `parse/dom` or `parse/markdown`, which will then register +// themselves here, as well as export special-purpose parsing +// functions. +// +// These are the parses in the distribution: +// +// **`"json"`** +// : The top-level module defines a single parser `"json"`, which +// uses `Node.fromJSON` to parse JSON data. +// +// **`"dom"`** +// : Parses [DOM +// nodes](https://developer.mozilla.org/en-US/docs/Web/API/Node). +// Defined in `parse/dom`. See `fromDOM`. +// +// **`"html"`** +// : Parses strings of HTML content. Defined in `parse/dom`. +// +// **`"markdown"`** +// : Parses strings of +// [CommonMark](http://commonmark.org/)-formatted text. Defined in +// `parse/markdown`. See `fromMarkdown`. +// +// **`"text"`** +// : Simply splits a string of text on blank lines and creates a +// document containing those lines as paragraphs. Defined in +// `parse/text`. See `fromText`. -var _pos = require("./pos"); +"use strict"; -Object.defineProperty(exports, "Pos", { - enumerable: true, - get: function get() { - return _pos.Pos; - } +Object.defineProperty(exports, "__esModule", { + value: true }); +exports.parseFrom = parseFrom; +exports.knownSource = knownSource; +exports.defineSource = defineSource; +var parsers = Object.create(null); -var _diff = require("./diff"); +// :: (Schema, any, string, ?Object) → Node +// Parse document `value` from the format named by `format`. If +// `options` is given, it is passed along to the parser function. -Object.defineProperty(exports, "findDiffStart", { - enumerable: true, - get: function get() { - return _diff.findDiffStart; - } +function parseFrom(schema, value, format, options) { + var converter = parsers[format]; + if (!converter) throw new Error("Source format " + format + " not defined"); + return converter(schema, value, options); +} + +// :: (string) → bool +// Query whether a parser for the named format has been registered. + +function knownSource(format) { + return !!parsers[format]; +} + +// :: (string, (Schema, any, ?Object) → Node) +// Register a parser function for `format`. + +function defineSource(format, func) { + parsers[format] = func; +} + +defineSource("json", function (schema, json) { + return schema.nodeFromJSON(json); }); -Object.defineProperty(exports, "findDiffEnd", { - enumerable: true, - get: function get() { - return _diff.findDiffEnd; - } + +},{}],34:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true }); +exports.fromText = fromText; -},{"./defaultschema":42,"./diff":43,"./fragment":44,"./mark":46,"./node":47,"./pos":48,"./schema":49}],46:[function(require,module,exports){ -// ;; A mark is a piece of information that can be attached to a node, -// such as it being emphasized, in code font, or a link. It has a type -// and optionally a set of attributes that provide further information -// (such as the target of the link). Marks are created through a -// `Schema`, which controls which types exist and which -// attributes they have. +var _index = require("./index"); + +// FIXME is it meaningful to try and attach text-parsing information +// to node types? + +// :: (Schema, string) → Node +// Convert a string into a simple ProseMirror document. + +function fromText(schema, text) { + var blocks = text.trim().split(/\n{2,}/); + var nodes = []; + for (var i = 0; i < blocks.length; i++) { + var spans = []; + var parts = blocks[i].split("\n"); + for (var j = 0; j < parts.length; j++) { + if (j) spans.push(schema.node("hard_break")); + if (parts[j]) spans.push(schema.text(parts[j])); + } + nodes.push(schema.node("paragraph", null, spans)); + } + if (!nodes.length) nodes.push(schema.node("paragraph")); + return schema.node("doc", null, nodes); +} + +(0, _index.defineSource)("text", fromText); + +},{"./index":33}],35:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -9418,966 +10379,887 @@ var _createClass = (function () { }; })(); +exports.toDOM = toDOM; +exports.renderNodeToDOM = renderNodeToDOM; +exports.toHTML = toHTML; + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Mark = (function () { - function Mark(type, attrs) { - _classCallCheck(this, Mark); +var _model = require("../model"); - // :: MarkType - // The type of this mark. - this.type = type; - // :: Object - // The attributes associated with this mark. - this.attrs = attrs; +var _index = require("./index"); + +// ;; #toc=false Object used to to expose relevant values and methods +// to DOM serializer functions. + +var DOMSerializer = (function () { + function DOMSerializer(options) { + _classCallCheck(this, DOMSerializer); + + // :: Object The options passed to the serializer. + this.options = options || {}; + // :: DOMDocument The DOM document in which we are working. + this.doc = this.options.document || window.document; } - // :: () → Object - // Convert this mark to a JSON-serializeable representation. + // :: (Node, ?Object) → DOMFragment + // Serialize the content of the given node to a DOM fragment. When not + // in the browser, the `document` option, containing a DOM document, + // should be passed so that the serialize can create nodes. + // + // To define rendering behavior for your own [node](#NodeType) and + // [mark](#MarkType) types, give them a `serializeDOM` method. This + // method is passed a `Node` and a `DOMSerializer`, and should return + // the [DOM + // node](https://developer.mozilla.org/en-US/docs/Web/API/Node) that + // represents this node and its content. For marks, that should be an + // inline wrapping node like `` or ``. + // + // Individual attributes can also define serialization behavior. If an + // `Attribute` object has a `serializeDOM` method, that will be called + // with the DOM node representing the node that the attribute applies + // to and the atttribute's value, so that it can set additional DOM + // attributes on the DOM node. - _createClass(Mark, [{ - key: "toJSON", - value: function toJSON() { - if (this.type.instance) return this.type.name; - var obj = { _: this.type.name }; - for (var attr in this.attrs) { - obj[attr] = this.attrs[attr]; - }return obj; - } + // :: (string, ?Object, ...union) → DOMNode + // Create a DOM node of the given type, with (optionally) the given + // attributes and content. Content elements may be strings (for text + // nodes) or other DOM nodes. - // :: ([Mark]) → [Mark] - // Given a set of marks, create a new set which contains this one as - // well, in the right position. If this mark or another of its type - // is already in the set, the set itself is returned. + _createClass(DOMSerializer, [{ + key: "elt", + value: function elt(type, attrs) { + var result = this.doc.createElement(type); + if (attrs) for (var _name in attrs) { + if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name]) result.setAttribute(_name, attrs[_name]); + } + + for (var _len = arguments.length, content = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + content[_key - 2] = arguments[_key]; + } + + for (var i = 0; i < content.length; i++) { + result.appendChild(typeof content[i] == "string" ? this.doc.createTextNode(content[i]) : content[i]); + }return result; + } }, { - key: "addToSet", - value: function addToSet(set) { - for (var i = 0; i < set.length; i++) { - var other = set[i]; - if (other.type == this.type) { - if (this.eq(other)) return set;else return set.slice(0, i).concat(this).concat(set.slice(i + 1)); - } - if (other.type.rank > this.type.rank) return set.slice(0, i).concat(this).concat(set.slice(i)); + key: "renderNode", + value: function renderNode(node, offset) { + var dom = node.type.serializeDOM(node, this); + for (var attr in node.type.attrs) { + var desc = node.type.attrs[attr]; + if (desc.serializeDOM) desc.serializeDOM(dom, node.attrs[attr], this, node); } - return set.concat(this); + if (this.options.onRender) dom = this.options.onRender(node, dom, offset) || dom; + return dom; } - - // :: ([Mark]) → [Mark] - // Remove this mark from the given set, returning a new set. If this - // mark is not in the set, the set itself is returned. }, { - key: "removeFromSet", - value: function removeFromSet(set) { - for (var i = 0; i < set.length; i++) if (this.eq(set[i])) return set.slice(0, i).concat(set.slice(i + 1)); - return set; + key: "renderContent", + value: function renderContent(node, where) { + if (!where) where = this.doc.createDocumentFragment(); + if (!node.isTextblock) this.renderBlocksInto(node, where);else if (this.options.renderInlineFlat) this.renderInlineFlatInto(node, where);else this.renderInlineInto(node, where); + return where; } - - // :: ([Mark]) → bool - // Test whether this mark is in the given set of marks. }, { - key: "isInSet", - value: function isInSet(set) { - for (var i = 0; i < set.length; i++) { - if (this.eq(set[i])) return true; - }return false; + key: "renderBlocksInto", + value: function renderBlocksInto(parent, where) { + for (var i = parent.iter(), child = undefined; child = i.next().value;) { + if (this.options.path) this.options.path.push(i.offset - child.width); + where.appendChild(this.renderNode(child, i.offset - child.width)); + if (this.options.path) this.options.path.pop(); + } + } + }, { + key: "renderInlineInto", + value: function renderInlineInto(parent, where) { + var _this = this; + + var top = where; + var active = []; + parent.forEach(function (node, offset) { + var keep = 0; + for (; keep < Math.min(active.length, node.marks.length); ++keep) if (!node.marks[keep].eq(active[keep])) break; + while (keep < active.length) { + active.pop(); + top = top.parentNode; + } + while (active.length < node.marks.length) { + var add = node.marks[active.length]; + active.push(add); + top = top.appendChild(_this.renderMark(add)); + } + top.appendChild(_this.renderNode(node, offset)); + }); } + }, { + key: "renderInlineFlatInto", + value: function renderInlineFlatInto(parent, where) { + var _this2 = this; - // :: (Mark) → bool - // Test whether this mark has the same type and attributes as - // another mark. + parent.forEach(function (node, start) { + var dom = _this2.renderNode(node, start); + dom = _this2.wrapInlineFlat(dom, node.marks); + dom = _this2.options.renderInlineFlat(node, dom, start) || dom; + where.appendChild(dom); + }); + } }, { - key: "eq", - value: function eq(other) { - if (this == other) return true; - if (this.type != other.type) return false; - for (var attr in this.attrs) { - if (other.attrs[attr] != this.attrs[attr]) return false; - }return true; + key: "renderMark", + value: function renderMark(mark) { + var dom = mark.type.serializeDOM(mark, this); + for (var attr in mark.type.attrs) { + var desc = mark.type.attrs[attr]; + if (desc.serializeDOM) desc.serializeDOM(dom, mark.attrs[attr], this); + } + return dom; } - - // :: ([Mark], [Mark]) → bool - // Test whether two sets of marks are identical. - }], [{ - key: "sameSet", - value: function sameSet(a, b) { - if (a == b) return true; - if (a.length != b.length) return false; - for (var i = 0; i < a.length; i++) { - if (!a[i].eq(b[i])) return false; - }return true; + }, { + key: "wrapInlineFlat", + value: function wrapInlineFlat(dom, marks) { + for (var i = marks.length - 1; i >= 0; i--) { + var wrap = this.renderMark(marks[i]); + wrap.appendChild(dom); + dom = wrap; + } + return dom; } - // :: (?union) → [Mark] - // Create a properly sorted mark set from null, a single mark, or an - // unsorted array of marks. + // :: (Node, string, ?Object) → DOMNode + // Render the content of ProseMirror node into a DOM node with the + // given tag name and attributes. }, { - key: "setFrom", - value: function setFrom(marks) { - if (!marks || marks.length == 0) return empty; - if (marks instanceof Mark) return [marks]; - var copy = marks.slice(); - copy.sort(function (a, b) { - return a.type.rank - b.type.rank; - }); - return copy; + key: "renderAs", + value: function renderAs(node, tagName, tagAttrs) { + return this.renderContent(node, this.elt(tagName, tagAttrs)); } }]); - return Mark; + return DOMSerializer; })(); -exports.Mark = Mark; - -var empty = []; - -},{}],47:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); +function toDOM(node) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; -var _get = function get(_x8, _x9, _x10) { - var _again = true;_function: while (_again) { - var object = _x8, - property = _x9, - receiver = _x10;_again = false;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 { - _x8 = parent;_x9 = property;_x10 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; + return new DOMSerializer(options).renderContent(node); +} -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; - }; -})(); +(0, _index.defineTarget)("dom", toDOM); -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; -} +// :: (Node, ?Object) → DOMNode +// Serialize a given node to a DOM node. This is useful when you need +// to serialize a part of a document, as opposed to the whole +// document. -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); +function renderNodeToDOM(node, options, offset) { + var serializer = new DOMSerializer(options); + var dom = serializer.renderNode(node, offset); + if (node.isInline) { + dom = serializer.wrapInlineFlat(dom, node.marks); + if (serializer.options.renderInlineFlat) dom = options.renderInlineFlat(node, dom, offset) || dom; } + return dom; } -var _fragment = require("./fragment"); +// :: (Node, ?Object) → string +// Serialize a node as an HTML string. Goes through `toDOM` and then +// serializes the result. Again, you must pass a `document` option +// when not in the browser. -var _mark = require("./mark"); +function toHTML(node, options) { + var serializer = new DOMSerializer(options); + var wrap = serializer.elt("div"); + wrap.appendChild(serializer.renderContent(node)); + return wrap.innerHTML; +} -var _pos = require("./pos"); +(0, _index.defineTarget)("html", toHTML); -var emptyArray = [], - emptyAttrs = Object.create(null); +// Block nodes -// ;; This class represents a node in the tree that makes up a -// ProseMirror document. So a document is an instance of `Node`, with -// children that are also instances of `Node`. -// -// Nodes are persistent data structures. Instead of changing them, you -// create new ones with the content you want. Old ones keep pointing -// at the old document shape. This is made cheaper by sharing -// structure between the old and new data as much as possible, which a -// tree shape like this (without back pointers) makes easy. -// -// **Never** directly mutate the properties of a `Node` object. +function def(cls, method) { + cls.prototype.serializeDOM = method; +} -var Node = (function () { - function Node(type, attrs, content, marks) { - _classCallCheck(this, Node); +def(_model.BlockQuote, function (node, s) { + return s.renderAs(node, "blockquote"); +}); - // :: NodeType - // The type of node that this is. - this.type = type; +_model.BlockQuote.prototype.countCoordsAsChild = function (_, path, dom, coords) { + var childBox = dom.firstChild.getBoundingClientRect(); + if (coords.left < childBox.left - 2) return _model.Pos.from(path); +}; - // :: Object - // An object mapping attribute names to string values. The kind of - // attributes allowed and required are determined by the node - // type. - this.attrs = attrs; +def(_model.BulletList, function (node, s) { + return s.renderAs(node, "ul"); +}); - // :: Fragment - // The node's content. - this.content = content || _fragment.emptyFragment; +def(_model.OrderedList, function (node, s) { + return s.renderAs(node, "ol", { start: node.attrs.order != "1" && node.attrs.order }); +}); - // :: [Mark] - // The marks (things like whether it is emphasized or part of a - // link) associated with this node. - this.marks = marks || emptyArray; +_model.OrderedList.prototype.countCoordsAsChild = _model.BulletList.prototype.countCoordsAsChild = function (_, path, dom, coords) { + for (var i = 0; i < dom.childNodes.length; i++) { + var child = dom.childNodes[i]; + if (!child.hasAttribute("pm-offset")) continue; + var childBox = child.getBoundingClientRect(); + if (coords.left > childBox.left - 2) return null; + if (childBox.top <= coords.top && childBox.bottom >= coords.top) return new _model.Pos(path, i); } +}; - // :: number - // The size of the node's content, which is the maximum offset in - // the node. For nodes that don't contain text, this is also the - // number of child nodes that the node has. - - _createClass(Node, [{ - key: "child", - - // :: (number) → Node - // Retrieve the child at the given offset. Note that this is **not** - // the appropriate way to loop over a node. `child`'s complexity may - // be non-constant for some nodes, and it will return the same node - // multiple times when calling it for different offsets within a - // text node. - value: function child(off) { - return this.content.child(off); - } - - // :: (?number, ?number) → Iterator - // Create an iterator over this node's children, optionally starting - // and ending at a given offset. - }, { - key: "iter", - value: function iter(start, end) { - return this.content.iter(start, end); - } +def(_model.ListItem, function (node, s) { + return s.renderAs(node, "li"); +}); - // :: (?number, ?number) → Iterator - // Create a reverse iterator (iterating from the node's end towards - // its start) over this node's children, optionally starting and - // ending at a given offset. **Note**: if given, `start` should be - // greater than (or equal) to `end`. - }, { - key: "reverseIter", - value: function reverseIter(start, end) { - return this.content.reverseIter(start, end); - } +def(_model.HorizontalRule, function (_, s) { + return s.elt("hr"); +}); - // :: (number) → {start: number, node: Node} - // Find the node that sits before a given offset. Can be used to - // find out which text node covers a given offset. The `start` - // property of the return value is the starting offset of the - // returned node. It is an error to call this with offset 0. - }, { - key: "chunkBefore", - value: function chunkBefore(off) { - return this.content.chunkBefore(off); - } +def(_model.Paragraph, function (node, s) { + return s.renderAs(node, "p"); +}); - // :: (number) → {start: number, node: Node} - // Find the node that sits after a given offset. The `start` - // property of the return value is the starting offset of the - // returned node. It is an error to call this with offset - // corresponding to the end of the node. - }, { - key: "chunkAfter", - value: function chunkAfter(off) { - return this.content.chunkAfter(off); - } +def(_model.Heading, function (node, s) { + return s.renderAs(node, "h" + node.attrs.level); +}); - // :: ((node: Node, start: number, end: number)) - // Call the given function for each child node. The function will be - // given the node, as well as its start and end offsets, as - // arguments. - }, { - key: "forEach", - value: function forEach(f) { - this.content.forEach(f); - } +def(_model.CodeBlock, function (node, s) { + var code = s.renderAs(node, "code"); + if (node.attrs.params != null) code.className = "fence " + node.attrs.params.replace(/(^|\s+)/g, "$&lang-"); + return s.elt("pre", null, code); +}); - // :: string - // Concatenate all the text nodes found in this fragment and its - // children. - }, { - key: "sameMarkup", +// Inline content - // :: (Node) → bool - // Compare the markup (type, attributes, and marks) of this node to - // those of another. Returns `true` if both have the same markup. - value: function sameMarkup(other) { - return this.hasMarkup(other.type, other.attrs, other.marks); - } +def(_model.Text, function (node, s) { + return s.doc.createTextNode(node.text); +}); - // :: (NodeType, ?Object, ?[Mark]) → bool - // Check whether this node's markup correspond to the given type, - // attributes, and marks. - }, { - key: "hasMarkup", - value: function hasMarkup(type, attrs, marks) { - return this.type == type && Node.sameAttrs(this.attrs, attrs || emptyAttrs) && _mark.Mark.sameSet(this.marks, marks || emptyArray); - } - }, { - key: "copy", +def(_model.Image, function (node, s) { + return s.elt("img", { + src: node.attrs.src, + alt: node.attrs.alt, + title: node.attrs.title + }); +}); - // :: (?Fragment) → Node - // Create a new node with the same markup as this node, containing - // the given content (or empty, if no content is given). - value: function copy() { - var content = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; +def(_model.HardBreak, function (_, s) { + return s.elt("br"); +}); - return new this.constructor(this.type, this.attrs, content, this.marks); - } +// Inline styles - // :: ([Mark]) → Node - // Create a copy of this node, with the given set of marks instead - // of the node's own marks. - }, { - key: "mark", - value: function mark(marks) { - return new this.constructor(this.type, this.attrs, this.content, marks); - } +def(_model.EmMark, function (_, s) { + return s.elt("em"); +}); - // :: (number, ?number) → Node - // Create a copy of this node with only the content between the - // given offsets. If `to` is not given, it defaults to the end of - // the node. - }, { - key: "slice", - value: function slice(from, to) { - return this.copy(this.content.slice(from, to)); - } +def(_model.StrongMark, function (_, s) { + return s.elt("strong"); +}); - // :: (number, number, Fragment) → Node - // Create a copy of this node with the content between the given - // offsets replaced by the given fragment. - }, { - key: "splice", - value: function splice(from, to, replace) { - return this.copy(this.content.slice(0, from).append(replace).append(this.content.slice(to))); - } +def(_model.CodeMark, function (_, s) { + return s.elt("code"); +}); - // :: (Fragment, ?number, ?number) → Node - // [Append](#Fragment.append) the given fragment to this node's - // content, and create a new node with the result. - }, { - key: "append", - value: function append(fragment) { - var joinLeft = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; - var joinRight = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; +def(_model.LinkMark, function (mark, s) { + return s.elt("a", { href: mark.attrs.href, + title: mark.attrs.title }); +}); - return this.copy(this.content.append(fragment, joinLeft, joinRight)); - } +},{"../model":27,"./index":36}],36:[function(require,module,exports){ +// !! This module provides a way to register and access functions that +// serialize ProseMirror [documents](#Node) to various formats. To +// load the actual serializers, you need to include submodules of this +// module (or 3rd party serialization modules), which will register +// themselves to this module. +// +// These are the serializers defined: +// +// **`"json"`** +// : Use `Node.toJSON` to serialize the node as JSON. Defined by the +// top-level `serialize` module. +// +// **`"dom"`** +// : Serialize to a [DOM +// fragment](https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment). +// Defined in `serialize/dom`. See `toDOM`. +// +// **`"html"`** +// : Serialize to HTML text. Defined in `serialize/dom`. See `toHTML`. +// +// **`"markdown"`** +// : Serialize to [CommonMark](http://commonmark.org/) marked-up +// text. Defined in `serialize/markdown`. See `toMarkdown`. +// +// **`"text"`** +// : Serialize to plain text. Defined in `serialize/text`. See `toText`. - // :: (number, Node) → Node - // Return a copy of this node with the child at the given offset - // replaced by the given node. **Note**: The offset should not fall - // within a text node. - }, { - key: "replace", - value: function replace(pos, node) { - return this.copy(this.content.replace(pos, node)); - } +"use strict"; - // :: ([number], Node) → Node - // Return a copy of this node with the descendant at `path` replaced - // by the given replacement node. This will copy as many sub-nodes as - // there are elements in `path`. - }, { - key: "replaceDeep", - value: function replaceDeep(path, node) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.serializeTo = serializeTo; +exports.knownTarget = knownTarget; +exports.defineTarget = defineTarget; +var serializers = Object.create(null); - if (depth == path.length) return node; - var pos = path[depth]; - return this.replace(pos, this.child(pos).replaceDeep(path, node, depth + 1)); - } +// :: (Node, string, ?Object) → any +// Serialize the given document to the given format. If `options` is +// given, it will be passed along to the serializer function. - // :: (number, string) → Node - // “Close” this node by making sure that, if it is empty, and is not - // allowed to be so, it has its default content inserted. When depth - // is greater than zero, sub-nodes at the given side (which can be - // `"start"` or `"end"`) are closed too. Returns itself if no work - // is necessary, or a closed copy if something did need to happen. - }, { - key: "close", - value: function close(depth, side) { - if (depth == 0 && this.size == 0 && !this.type.canBeEmpty) return this.copy(this.type.defaultContent()); - var closedContent = undefined; - if (depth > 0 && (closedContent = this.content.close(depth - 1, side)) != this.content) return this.copy(closedContent); - return this; - } +function serializeTo(doc, format, options) { + var converter = serializers[format]; + if (!converter) throw new Error("Target format " + format + " not defined"); + return converter(doc, options); +} - // :: ([number]) → Node - // Get the descendant node at the given path, which is interpreted - // as a series of offsets into successively deeper nodes. - }, { - key: "path", - value: function path(_path) { - for (var i = 0, node = this; i < _path.length; node = node.child(_path[i]), i++) {} - return node; - } +// :: (string) → bool +// Query whether a given serialization format has been registered. - // :: (Pos) → Node - // Get the node after the given position. - }, { - key: "nodeAfter", - value: function nodeAfter(pos) { - return this.path(pos.path).child(pos.offset); - } - }, { - key: "pathNodes", - value: function pathNodes(path) { - var nodes = []; - for (var i = 0, node = this;; i++) { - nodes.push(node); - if (i == path.length) break; - node = node.child(path[i]); - } - return nodes; - } +function knownTarget(format) { + return !!serializers[format]; +} - // :: (Pos, ?bool) → bool - // Checks whether the given position is valid in this node. When - // `requireTextblock` is true, only positions inside textblocks are - // considered valid. - }, { - key: "isValidPos", - value: function isValidPos(pos, requireTextblock) { - for (var i = 0, node = this;; i++) { - if (i == pos.path.length) { - if (requireTextblock && !node.isTextblock) return false; - return pos.offset <= node.size; - } else { - var n = pos.path[i]; - if (n >= node.size) return false; - node = node.child(n); - } - } - } +// :: (string, (Node, ?Object) → any) +// Register a function as the serializer for `format`. + +function defineTarget(format, func) { + serializers[format] = func; +} + +defineTarget("json", function (doc) { + return doc.toJSON(); +}); - // :: (Pos, Pos) → {from: Pos, to: Pos} - // Finds the narrowest sibling range (two positions that both point - // into the same node) that encloses the given positions. - }, { - key: "siblingRange", - value: function siblingRange(from, to) { - for (var i = 0, node = this;; i++) { - if (node.isTextblock) { - var path = from.path.slice(0, i - 1), - offset = from.path[i - 1]; - return { from: new _pos.Pos(path, offset), to: new _pos.Pos(path, offset + 1) }; - } - var fromEnd = i == from.path.length, - toEnd = i == to.path.length; - var left = fromEnd ? from.offset : from.path[i]; - var right = toEnd ? to.offset : to.path[i]; - if (fromEnd || toEnd || left != right) { - var path = from.path.slice(0, i); - return { from: new _pos.Pos(path, left), to: new _pos.Pos(path, right + (toEnd ? 0 : 1)) }; - } - node = node.child(left); - } - } +},{}],37:[function(require,module,exports){ +"use strict"; - // :: (?Pos, ?Pos, (node: Node, path: [number], parent: Node)) - // Iterate over all nodes between the given two positions, calling - // the callback with the node, the path towards it, and its parent - // node, as arguments. `from` and `to` may be `null` to denote - // starting at the start of the node or ending at its end. Note that - // the path passed to the callback is mutated as iteration - // continues, so if you want to preserve it, make a copy. - }, { - key: "nodesBetween", - value: function nodesBetween(from, to, f) { - var path = arguments.length <= 3 || arguments[3] === undefined ? [] : arguments[3]; - var parent = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.toText = toText; - if (f(this, path, parent) === false) return; - this.content.nodesBetween(from, to, f, path, this); - } +var _model = require("../model"); - // :: (?Pos, ?Pos, (node: Node, path: [number], start: number, end: number, parent: Node)) - // Calls the given function for each inline node between the two - // given positions. Pass null for `from` or `to` to start or end at - // the start or end of the node. - }, { - key: "inlineNodesBetween", - value: function inlineNodesBetween(from, to, f) { - this.nodesBetween(from, to, function (node, path, parent) { - if (node.isInline) { - var last = path.length - 1; - f(node, path.slice(0, last), path[last], path[last] + node.width, parent); - } - }); - } +var _index = require("./index"); - // :: (?Pos, ?Pos) → Node - // Returns a copy of this node containing only the content between - // `from` and `to`. You can pass `null` for either of them to start - // or end at the start or end of the node. - }, { - key: "sliceBetween", - value: function sliceBetween(from, to) { - var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; +_model.Block.prototype.serializeText = function (node) { + var accum = ""; + node.forEach(function (child) { + return accum += child.type.serializeText(child); + }); + return accum; +}; - return this.copy(this.content.sliceBetween(from, to, depth)); - } +_model.Textblock.prototype.serializeText = function (node) { + var text = _model.Block.prototype.serializeText(node); + return text && text + "\n\n"; +}; - // :: (Pos) → [Mark] - // Get the marks of the node before the given position or, if that - // position is at the start of a non-empty node, those of the node - // after it. - }, { - key: "marksAt", - value: function marksAt(pos) { - var parent = this.path(pos.path); - if (!parent.isTextblock || !parent.size) return emptyArray; - return parent.chunkBefore(pos.offset || 1).node.marks; - } +_model.Inline.prototype.serializeText = function () { + return ""; +}; - // :: (?Pos, ?Pos, MarkType) → bool - // Test whether a mark of the given type occurs in this document - // between the two given positions. - }, { - key: "rangeHasMark", - value: function rangeHasMark(from, to, type) { - var found = false; - this.nodesBetween(from, to, function (node) { - if (type.isInSet(node.marks)) found = true; - }); - return found; - } +_model.HardBreak.prototype.serializeText = function () { + return "\n"; +}; - // :: bool - // True when this is a block (non-inline node) - }, { - key: "toString", +_model.Text.prototype.serializeText = function (node) { + return node.text; +}; - // :: () → string - // Return a string representation of this node for debugging - // purposes. - value: function toString() { - var name = this.type.name; - if (this.content.size) name += "(" + this.content.toString() + ")"; - return wrapMarks(this.marks, name); - } +// :: (Node) → string +// Serialize a node as a plain text string. - // :: () → Object - // Return a JSON-serializeable representation of this node. - }, { - key: "toJSON", - value: function toJSON() { - var obj = { type: this.type.name }; - for (var _ in this.attrs) { - obj.attrs = this.attrs; - break; - } - if (this.size) obj.content = this.content.toJSON(); - if (this.marks.length) obj.marks = this.marks.map(function (n) { - return n.toJSON(); - }); - return obj; - } +function toText(doc) { + return doc.type.serializeText(doc).trim(); +} - // This is a hack to be able to treat a node object as an iterator result - }, { - key: "size", - get: function get() { - return this.content.size; - } +(0, _index.defineTarget)("text", toText); - // :: number - // The width of this node. Always 1 for non-text nodes, and the - // length of the text for text nodes. - }, { - key: "width", - get: function get() { - return 1; - } - }, { - key: "textContent", - get: function get() { - return this.content.textContent; - } +},{"../model":27,"./index":36}],38:[function(require,module,exports){ +"use strict"; - // :: ?Node - // Returns this node's first child, or `null` if there are no - // children. - }, { - key: "firstChild", - get: function get() { - return this.content.firstChild; - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.canLift = canLift; +exports.canWrap = canWrap; - // :: ?Node - // Returns this node's last child, or `null` if there are no - // children. - }, { - key: "lastChild", - get: function get() { - return this.content.lastChild; - } - }, { - key: "isBlock", - get: function get() { - return this.type.isBlock; - } +var _model = require("../model"); - // :: bool - // True when this is a textblock node, a block node with inline - // content. - }, { - key: "isTextblock", - get: function get() { - return this.type.isTextblock; - } +var _transform = require("./transform"); - // :: bool - // True when this is an inline node (a text node or a node that can - // appear among text). - }, { - key: "isInline", - get: function get() { - return this.type.isInline; - } +var _step = require("./step"); - // :: bool - // True when this is a text node. - }, { - key: "isText", - get: function get() { - return this.type.isText; +var _tree = require("./tree"); + +var _map = require("./map"); + +// !! **`ancestor`** +// : Change the stack of nodes that wrap the part of the document +// between `from` and `to`, which must point into the same parent +// node. +// +// The set of ancestors to replace is determined by the `depth` +// property of the step's parameter. If this is greater than +// zero, `from` and `to` must point at the start and end of a +// stack of nodes, of that depth, since this step will not split +// nodes. +// +// The set of new ancestors to wrap with is determined by the +// `types` and `attrs` properties of the parameter. The first +// should be an array of `NodeType`s, and the second, optionally, +// an array of attribute objects. + +_step.Step.define("ancestor", { + apply: function apply(doc, step) { + var from = step.from, + to = step.to; + if (!(0, _tree.isFlatRange)(from, to)) return null; + var toParent = from.path, + start = from.offset, + end = to.offset; + var _step$param = step.param; + var _step$param$depth = _step$param.depth; + var depth = _step$param$depth === undefined ? 0 : _step$param$depth; + var _step$param$types = _step$param.types; + var types = _step$param$types === undefined ? [] : _step$param$types; + var _step$param$attrs = _step$param.attrs; + var attrs = _step$param$attrs === undefined ? [] : _step$param$attrs; + + var inner = doc.path(from.path); + for (var i = 0; i < depth; i++) { + if (start > 0 || end < doc.path(toParent).size || toParent.length == 0) return null; + start = toParent[toParent.length - 1]; + end = start + 1; + toParent = toParent.slice(0, toParent.length - 1); } - }, { - key: "value", - get: function get() { - return this; + if (depth == 0 && types.length == 0) return null; + + var parent = doc.path(toParent), + parentSize = parent.size, + newParent = undefined; + if (parent.type.locked) return null; + if (types.length) { + var _ret = (function () { + var lastWrapper = types[types.length - 1]; + var content = inner.content.slice(from.offset, to.offset); + if (!parent.type.canContainType(types[0]) || content.some(function (n) { + return !lastWrapper.canContain(n); + }) || !inner.size && !lastWrapper.canBeEmpty || lastWrapper.locked) return { + v: null + }; + var node = null; + for (var i = types.length - 1; i >= 0; i--) { + node = types[i].create(attrs[i], node || content); + }newParent = parent.splice(start, end, _model.Fragment.from(node)); + })(); + + if (typeof _ret === "object") return _ret.v; + } else { + if (!parent.type.canContainFragment(inner.content) || !inner.size && start == 0 && end == parent.size && !parent.type.canBeEmpty) return null; + newParent = parent.splice(start, end, inner.content); } + var copy = doc.replaceDeep(toParent, newParent); - // :: (Schema, Object) → Node - // Deserialize a node from its JSON representation. - }], [{ - key: "sameAttrs", - value: function sameAttrs(a, b) { - if (a == b) return true; - for (var prop in a) { - if (a[prop] !== b[prop]) return false; - }return true; + var toInner = toParent.slice(); + for (var i = 0; i < types.length; i++) { + toInner.push(i ? 0 : start); + }var startOfInner = new _model.Pos(toInner, types.length ? 0 : start); + var replaced = null; + var insertedSize = types.length ? 1 : to.offset - from.offset; + if (depth != types.length || depth > 1 || types.length > 1) { + var posBefore = new _model.Pos(toParent, start); + var posAfter1 = new _model.Pos(toParent, end), + posAfter2 = new _model.Pos(toParent, start + insertedSize); + var endOfInner = new _model.Pos(toInner, startOfInner.offset + (to.offset - from.offset)); + replaced = [new _map.ReplacedRange(posBefore, from, posBefore, startOfInner), new _map.ReplacedRange(to, posAfter1, endOfInner, posAfter2, posAfter1, posAfter2)]; } - }, { - key: "fromJSON", - value: function fromJSON(schema, json) { - var type = schema.nodeType(json.type); - var content = json.text != null ? json.text : _fragment.Fragment.fromJSON(schema, json.content); - return type.create(json.attrs, content, json.marks && json.marks.map(schema.markFromJSON)); + var moved = [new _map.MovedRange(from, to.offset - from.offset, startOfInner)]; + if (end - start != insertedSize) moved.push(new _map.MovedRange(new _model.Pos(toParent, end), parentSize - end, new _model.Pos(toParent, start + insertedSize))); + return new _step.StepResult(copy, new _map.PosMap(moved, replaced)); + }, + invert: function invert(step, oldDoc, map) { + var types = [], + attrs = []; + if (step.param.depth) for (var i = 0; i < step.param.depth; i++) { + var _parent = oldDoc.path(step.from.path.slice(0, step.from.path.length - i)); + types.unshift(_parent.type); + attrs.unshift(_parent.attrs); } - }]); + var newFrom = map.map(step.from).pos; + var newTo = step.from.cmp(step.to) ? map.map(step.to, -1).pos : newFrom; + return new _step.Step("ancestor", newFrom, newTo, null, { depth: step.param.types ? step.param.types.length : 0, + types: types, attrs: attrs }); + }, + paramToJSON: function paramToJSON(param) { + return { depth: param.depth, + types: param.types && param.types.map(function (t) { + return t.name; + }), + attrs: param.attrs }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return { depth: json.depth, + types: json.types && json.types.map(function (n) { + return schema.nodeType(n); + }), + attrs: json.attrs }; + } +}); - return Node; -})(); +function canBeLifted(doc, range) { + var content = [doc.path(range.from.path)], + unwrap = false; + for (;;) { + var parentDepth = -1; -exports.Node = Node; + var _loop = function _loop(_node, i) { + if (!content.some(function (inner) { + return !_node.type.canContainContent(inner.type); + })) parentDepth = i; + _node = _node.child(range.from.path[i]); + node = _node; + }; -if (typeof Symbol != "undefined") { - // :: () → Iterator - // A fragment is iterable, in the ES6 sense. - Node.prototype[Symbol.iterator] = function () { - return this.iter(); - }; + for (var node = doc, i = 0; i < range.from.path.length; i++) { + _loop(node, i); + } + if (parentDepth > -1) return { path: range.from.path.slice(0, parentDepth), unwrap: unwrap }; + if (unwrap || !content[0].isBlock) return null; + content = content[0].content.slice(range.from.offset, range.to.offset); + unwrap = true; + } } -// ;; #forward=Node +// :: (Node, Pos, ?Pos) → bool +// Tells you whether the given positions' [sibling +// range](#Node.siblingRange), or any of its ancestor nodes, can be +// lifted out of a parent. -var TextNode = (function (_Node) { - _inherits(TextNode, _Node); +function canLift(doc, from, to) { + var range = doc.siblingRange(from, to || from); + var found = canBeLifted(doc, range); + if (found) return { found: found, range: range }; +} - function TextNode(type, attrs, content, marks) { - _classCallCheck(this, TextNode); +// :: (Pos, ?Pos) → Transform +// Lift the nearest liftable ancestor of the [sibling +// range](#Node.siblingRange) of the given positions out of its +// parent (or do nothing if no such node exists). +_transform.Transform.prototype.lift = function (from) { + var to = arguments.length <= 1 || arguments[1] === undefined ? from : arguments[1]; + return (function () { + var can = canLift(this.doc, from, to); + if (!can) return this; + var found = can.found; + var range = can.range; - _get(Object.getPrototypeOf(TextNode.prototype), "constructor", this).call(this, type, attrs, null, marks); - // :: ?string - // For text nodes, this contains the node's text content. - this.text = content; - } + var depth = range.from.path.length - found.path.length; + var rangeNode = found.unwrap && this.doc.path(range.from.path); - _createClass(TextNode, [{ - key: "toString", - value: function toString() { - return wrapMarks(this.marks, JSON.stringify(this.text)); - } - }, { - key: "mark", - value: function mark(marks) { - return new TextNode(this.type, this.attrs, this.text, marks); - } - }, { - key: "toJSON", - value: function toJSON() { - var base = _get(Object.getPrototypeOf(TextNode.prototype), "toJSON", this).call(this); - base.text = this.text; - return base; + for (var d = 0, pos = range.to;; d++) { + if (pos.offset < this.doc.path(pos.path).size) { + this.split(pos, depth - d); + break; + } + if (d == depth - 1) break; + pos = pos.shorten(null, 1); } - }, { - key: "textContent", - get: function get() { - return this.text; + for (var d = 0, pos = range.from;; d++) { + if (pos.offset > 0) { + this.split(pos, depth - d); + var cut = range.from.path.length - depth, + path = pos.path.slice(0, cut).concat(pos.path[cut] + 1); + while (path.length < range.from.path.length) path.push(0); + range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, range.to.offset - range.from.offset) }; + break; + } + if (d == depth - 1) break; + pos = pos.shorten(); } - }, { - key: "width", - get: function get() { - return this.text.length; + if (found.unwrap) { + for (var i = range.to.offset - 1; i > range.from.offset; i--) { + this.join(new _model.Pos(range.from.path, i)); + }var size = 0; + for (var i = rangeNode.iter(range.from.offset, range.to.offset), child = undefined; child = i.next().value;) { + size += child.size; + }var path = range.from.path.concat(range.from.offset); + range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, size) }; + ++depth; } - }]); + this.step("ancestor", range.from, range.to, null, { depth: depth }); + return this; + }).apply(this, arguments); +}; - return TextNode; -})(Node); +// :: (Node, Pos, ?Pos, NodeType) → bool +// Determines whether the [sibling range](#Node.siblingRange) of the +// given positions can be wrapped in the given node type. -exports.TextNode = TextNode; +function canWrap(doc, from, to, type) { + var range = doc.siblingRange(from, to || from); + if (range.from.offset == range.to.offset) return null; + var parent = doc.path(range.from.path); + var around = parent.type.findConnection(type); + var inside = type.findConnection(parent.child(range.from.offset).type); + if (around && inside) return { range: range, around: around, inside: inside }; +} + +// :: (Pos, ?Pos, NodeType, ?Object) → Transform +// Wrap the [sibling range](#Node.siblingRange) of the given positions +// in a node of the given type, with the given attributes (if +// possible). +_transform.Transform.prototype.wrap = function (from, to, type, wrapAttrs) { + var can = canWrap(this.doc, from, to, type); + if (!can) return this; + var range = can.range; + var around = can.around; + var inside = can.inside; + + var types = around.concat(type).concat(inside); + var attrs = around.map(function () { + return null; + }).concat(wrapAttrs).concat(inside.map(function () { + return null; + })); + this.step("ancestor", range.from, range.to, null, { types: types, attrs: attrs }); + if (inside.length) { + var toInner = range.from.path.slice(); + for (var i = 0; i < around.length + inside.length + 1; i++) { + toInner.push(i ? 0 : range.from.offset); + }for (var i = range.to.offset - 1 - range.from.offset; i > 0; i--) { + this.split(new _model.Pos(toInner, i), inside.length); + } + } + return this; +}; + +// :: (Pos, ?Pos, NodeType, ?Object) → Transform +// Set the type of all textblocks (partly) between `from` and `to` to +// the given node type with the given attributes. +_transform.Transform.prototype.setBlockType = function (from, to, type, attrs) { + var _this = this; -function wrapMarks(marks, str) { - for (var i = marks.length - 1; i >= 0; i--) { - str = marks[i].type.name + "(" + str + ")"; - }return str; -} + this.doc.nodesBetween(from, to || from, function (node, path) { + if (node.isTextblock && !node.hasMarkup(type, attrs)) { + path = path.slice(); + // Ensure all markup that isn't allowed in the new node type is cleared + _this.clearMarkup(new _model.Pos(path, 0), new _model.Pos(path, node.size), type); + _this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, _this.doc.path(path).size), null, { depth: 1, types: [type], attrs: [attrs] }); + return false; + } + }); + return this; +}; -},{"./fragment":44,"./mark":46,"./pos":48}],48:[function(require,module,exports){ -// ;; Instances of the `Pos` class represent positions in a document. -// A position an array of integers that describe a path to the target -// node (see `Node.path`) and an integer offset into that target node. +// :: (Pos, NodeType, ?Object) → Transform +// Change the type and attributes of the node after `pos`. +_transform.Transform.prototype.setNodeType = function (pos, type, attrs) { + var node = this.doc.nodeAfter(pos); + var path = pos.toPath(); + this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, node.size), null, { depth: 1, types: [type], attrs: [attrs] }); + return this; +}; +},{"../model":27,"./map":41,"./step":45,"./transform":46,"./tree":47}],39:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -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; - }; -})(); +require("./mark"); -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); +require("./split"); + +require("./replace"); + +// !! This module defines a way to transform documents. Transforming +// happens in `Step`s, which are atomic, well-defined modifications to +// a document. [Applying](`Step.apply`) a step produces a new document +// and a [position map](#PosMap) that maps positions in the old +// document to position in the new document. Steps can be +// [inverted](#Step.invert) to create a step that undoes their effect, +// and chained together in a convenience object called a `Transform`. +// +// This module does not depend on the browser API being available +// (i.e. you can load it into any JavaScript environment). +// +// These are the types of steps defined: +var _transform = require("./transform"); + +Object.defineProperty(exports, "Transform", { + enumerable: true, + get: function get() { + return _transform.Transform; } -} +}); -var Pos = (function () { - // :: (path: [number], number) +var _step = require("./step"); - function Pos(path, offset) { - _classCallCheck(this, Pos); +Object.defineProperty(exports, "Step", { + enumerable: true, + get: function get() { + return _step.Step; + } +}); +Object.defineProperty(exports, "StepResult", { + enumerable: true, + get: function get() { + return _step.StepResult; + } +}); - // :: [number] The path to the target node. - this.path = path; - // :: number The offset into the target node. - this.offset = offset; +var _ancestor = require("./ancestor"); + +Object.defineProperty(exports, "canLift", { + enumerable: true, + get: function get() { + return _ancestor.canLift; + } +}); +Object.defineProperty(exports, "canWrap", { + enumerable: true, + get: function get() { + return _ancestor.canWrap; } +}); - // ;; Return a string representation of the path of the form - // `"0/2:10"`, where the numbers before the colon are the path, and - // the number after it is the offset. +var _join = require("./join"); - _createClass(Pos, [{ - key: "toString", - value: function toString() { - return this.path.join("/") + ":" + this.offset; - } +Object.defineProperty(exports, "joinPoint", { + enumerable: true, + get: function get() { + return _join.joinPoint; + } +}); +Object.defineProperty(exports, "joinableBlocks", { + enumerable: true, + get: function get() { + return _join.joinableBlocks; + } +}); - // :: number - // The length of the position's path. - }, { - key: "max", +var _map = require("./map"); - // :: (Pos) → Pos - // Return the greater of two positions. - value: function max(other) { - return this.cmp(other) > 0 ? this : other; - } +Object.defineProperty(exports, "PosMap", { + enumerable: true, + get: function get() { + return _map.PosMap; + } +}); +Object.defineProperty(exports, "MapResult", { + enumerable: true, + get: function get() { + return _map.MapResult; + } +}); +Object.defineProperty(exports, "Remapping", { + enumerable: true, + get: function get() { + return _map.Remapping; + } +}); - // :: (Pos) → Pos - // Return the lesser of two positions. - }, { - key: "mmin", - value: function mmin(other) { - return this.cmp(other) < 0 ? this : other; - } +},{"./ancestor":38,"./join":40,"./map":41,"./mark":42,"./replace":43,"./split":44,"./step":45,"./transform":46}],40:[function(require,module,exports){ +"use strict"; - // :: ([number], [number]) → bool - // Compares two paths and returns true when they are the same. - }, { - key: "cmp", +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.joinableBlocks = joinableBlocks; +exports.joinPoint = joinPoint; - // :: (Pos) → number - // Compares this position to another position, and returns a number. - // Of this result number, only the sign is significant. It is - // negative if this position is less than the other one, zero if - // they are the same, and positive if this position is greater. - value: function cmp(other) { - if (other == this) return 0; - return Pos.cmp(this.path, this.offset, other.path, other.offset); - } - }, { - key: "shorten", +var _model = require("../model"); - // :: (?number, ?number) → Pos - // Create a position pointing into a parent of this position's - // target. When `to` is given, it determines the new length of the - // path. By default, the path becomes one shorter. The `offset` - // parameter can be used to determine where in this parent the - // position points. By default, it points before the old target. You - // can pass a negative or positive integer to move it backward or - // forward (**note**: this method performs no bounds checking). - value: function shorten() { - var to = arguments.length <= 0 || arguments[0] === undefined ? null : arguments[0]; - var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; +var _transform = require("./transform"); - if (to >= this.depth) return this; - return Pos.shorten(this.path, to, offset); - } +var _step = require("./step"); - // :: (number) → Pos - // Create a position with an offset moved relative to this - // position's offset. For example moving `0/1:10` by `-2` yields - // `0/1:8`. - }, { - key: "move", - value: function move(by) { - return new Pos(this.path, this.offset + by); - } +var _map = require("./map"); - // :: (?number) → [number] - // Convert this position to an array of numbers (including its - // offset). Optionally pass an argument to adjust the value of the - // offset. - }, { - key: "toPath", - value: function toPath() { - var move = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; +// !! **`join`** +// : Join two block elements together. `from` and `to` must point at +// the end of the first and start of the second element (so that +// the intention is preserved even when the positions are mapped). - return this.path.concat(this.offset + move); - } - }, { - key: "extend", - value: function extend(pos) { - var path = this.path.slice(), - add = this.offset; - for (var i = 0; i < pos.path.length; i++) { - path.push(pos.path[i] + add); - add = 0; - } - return new Pos(path, pos.offset + add); - } +_step.Step.define("join", { + apply: function apply(doc, step) { + var before = doc.path(step.from.path); + var after = doc.path(step.to.path); + if (step.from.offset < before.size || step.to.offset > 0 || !before.type.canContainFragment(after.content)) return null; + var pFrom = step.from.path, + pTo = step.to.path; + var last = pFrom.length - 1, + offset = pFrom[last] + 1; + if (pFrom.length != pTo.length || pFrom.length == 0 || offset != pTo[last]) return null; + for (var i = 0; i < last; i++) { + if (pFrom[i] != pTo[i]) return null; + }var targetPath = pFrom.slice(0, last); + var target = doc.path(targetPath), + oldSize = target.size; + if (target.type.locked) return null; + var joined = before.append(after.content); + var copy = doc.replaceDeep(targetPath, target.splice(offset - 1, offset + 1, _model.Fragment.from(joined))); - // :: () → Object - // Convert the position to a JSON-safe representation. - }, { - key: "toJSON", - value: function toJSON() { - return this; - } + var map = new _map.PosMap([new _map.MovedRange(step.to, after.size, step.from), new _map.MovedRange(new _model.Pos(targetPath, offset + 1), oldSize - offset - 1, new _model.Pos(targetPath, offset))], [new _map.ReplacedRange(step.from, step.to, step.from, step.from, step.to.shorten())]); + return new _step.StepResult(copy, map); + }, + invert: function invert(step, oldDoc) { + return new _step.Step("split", null, null, step.from, oldDoc.path(step.to.path).copy()); + } +}); - // :: ([number], ?number) → Pos - // Build a position from an array of numbers (as in - // [`toPath`](#Pos.toPath)), taking the last element of the array as - // offset and optionally moving it by `move`. - }, { - key: "depth", - get: function get() { - return this.path.length; - } - }], [{ - key: "cmp", - value: function cmp(pathA, offsetA, pathB, offsetB) { - var lenA = pathA.length, - lenB = pathB.length; - for (var i = 0, end = Math.min(lenA, lenB); i < end; i++) { - var diff = pathA[i] - pathB[i]; - if (diff != 0) return diff; - } - if (lenA > lenB) return offsetB <= pathA[i] ? 1 : -1;else if (lenB > lenA) return offsetA <= pathB[i] ? -1 : 1;else return offsetA - offsetB; - } - }, { - key: "samePath", - value: function samePath(pathA, pathB) { - if (pathA.length != pathB.length) return false; - for (var i = 0; i < pathA.length; i++) { - if (pathA[i] !== pathB[i]) return false; - }return true; - } - }, { - key: "shorten", - value: function shorten(path) { - var to = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; - var offset = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2]; +// :: (Node, Pos) → bool +// Test whether the blocks before and after a given position can be +// joined. - if (to == null) to = path.length - 1; - return new Pos(path.slice(0, to), path[to] + offset); - } - }, { - key: "from", - value: function from(array) { - var move = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; +function joinableBlocks(doc, pos) { + if (pos.offset == 0) return false; + var parent = doc.path(pos.path); + if (parent.isTextblock || pos.offset == parent.size) return false; + var type = parent.child(pos.offset - 1).type; + return !type.isTextblock && type.contains && type == parent.child(pos.offset).type; +} - if (!array.length) throw new Error("Can't create a pos from an empty array"); - return new Pos(array.slice(0, array.length - 1), array[array.length - 1] + move); - } +// :: (Node, Pos, ?number) → ?Pos +// Find an ancestor of the given position that can be joined to the +// block before (or after if `dir` is positive). Returns the joinable +// point, if any. - // :: (Object) → Pos - // Create a position from a JSON representation. - }, { - key: "fromJSON", - value: function fromJSON(json) { - return new Pos(json.path, json.offset); - } - }]); +function joinPoint(doc, pos) { + var dir = arguments.length <= 2 || arguments[2] === undefined ? -1 : arguments[2]; - return Pos; -})(); + for (;;) { + if (joinableBlocks(doc, pos)) return pos; + if (pos.depth == 0) return null; + pos = pos.shorten(null, dir < 0 ? 0 : 1); + } +} -exports.Pos = Pos; +// :: (Pos) → Transform +// Join the blocks around the given position. +_transform.Transform.prototype.join = function (at) { + var parent = this.doc.path(at.path); + if (at.offset == 0 || at.offset == parent.size || parent.isTextblock) return this; + this.step("join", new _model.Pos(at.path.concat(at.offset - 1), parent.child(at.offset - 1).size), new _model.Pos(at.path.concat(at.offset), 0)); + return this; +}; -},{}],49:[function(require,module,exports){ +},{"../model":27,"./map":41,"./step":45,"./transform":46}],41:[function(require,module,exports){ "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 _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { @@ -10388,985 +11270,1109 @@ var _createClass = (function () { }; })(); -var _get = function get(_x2, _x3, _x4) { - var _again = true;_function: while (_again) { - var object = _x2, - property = _x3, - receiver = _x4;_again = false;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 { - _x2 = parent;_x3 = property;_x4 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -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 _node = require("./node"); - -var _fragment = require("./fragment"); - -var _mark = require("./mark"); +var _model = require("../model"); -var _utilError = require("../util/error"); +// ;; #kind=interface #path=Mappable #toc=false +// There are various things that positions can be mapped through. +// We'll denote those as 'mappable'. This is not an actual class in +// the codebase, only an agreed-on interface. -// ;; #toc=false The exception type used to signal schema-related -// errors. +// :: (pos: Pos, bias: ?number) → MapResult +// #path=Mappable.map +// Map a position through this object. When given, the `bias` +// determines in which direction to move when a chunk of content is +// inserted at or around the mapped position. -var SchemaError = (function (_ProseMirrorError) { - _inherits(SchemaError, _ProseMirrorError); +var MovedRange = (function () { + function MovedRange(start, size) { + var dest = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - function SchemaError() { - _classCallCheck(this, SchemaError); + _classCallCheck(this, MovedRange); - _get(Object.getPrototypeOf(SchemaError.prototype), "constructor", this).apply(this, arguments); + this.start = start; + this.size = size; + this.dest = dest; } - return SchemaError; -})(_utilError.ProseMirrorError); - -exports.SchemaError = SchemaError; - -function findKinds(type, name, schema, override) { - function set(sub, sup) { - if (sub in schema.kinds) { - if (schema.kinds[sub] == sup) return; - SchemaError.raise("Inconsistent superkinds for kind " + sub + ": " + sup + " and " + schema.kinds[sub]); + _createClass(MovedRange, [{ + key: "toString", + value: function toString() { + return "[moved " + this.start + "+" + this.size + " to " + this.dest + "]"; } - if (schema.subKind(sub, sup)) SchemaError.raise("Conflicting kind hierarchy through " + sub + " and " + sup); - schema.kinds[sub] = sup; - } - - for (var cur = type;; cur = Object.getPrototypeOf(cur)) { - var curKind = override != null && cur == type ? override : cur.kind; - if (curKind != null) { - var _$$exec = /^(.*?)(\.)?$/.exec(curKind); + }, { + key: "end", + get: function get() { + return new _model.Pos(this.start.path, this.start.offset + this.size); + } + }]); - var _$$exec2 = _slicedToArray(_$$exec, 3); + return MovedRange; +})(); - var _ = _$$exec2[0]; - var kind = _$$exec2[1]; - var end = _$$exec2[2]; +exports.MovedRange = MovedRange; - if (kind) { - set(name, kind); - name = kind; - } - if (end) { - set(name, null); - return; - } - } - } -} +var Side = function Side(from, to, ref) { + _classCallCheck(this, Side); -// ;; Node types are objects allocated once per `Schema` -// and used to tag `Node` instances with a type. They are -// instances of sub-types of this class, and contain information about -// the node type (its name, its allowed attributes, methods for -// serializing it to various formats, information to guide -// deserialization, and so on). + this.from = from; + this.to = to; + this.ref = ref; +}; -var NodeType = (function () { - function NodeType(name, contains, attrs, schema) { - _classCallCheck(this, NodeType); +var ReplacedRange = (function () { + function ReplacedRange(from, to, newFrom, newTo) { + var ref = arguments.length <= 4 || arguments[4] === undefined ? from : arguments[4]; + var newRef = arguments.length <= 5 || arguments[5] === undefined ? newFrom : arguments[5]; + return (function () { + _classCallCheck(this, ReplacedRange); - // :: string - // The name the node type has in this schema. - this.name = name; - // :: ?string - // The kind of nodes this node may contain. `null` means it's a - // leaf node. - this.contains = contains; - // :: Object - // The attributes allowed on this node type. - this.attrs = attrs; - // :: Schema - // A link back to the `Schema` the node type belongs to. - this.schema = schema; - this.defaultAttrs = getDefaultAttrs(attrs); + this.before = new Side(from, to, ref); + this.after = new Side(newFrom, newTo, newRef); + }).apply(this, arguments); } - // :: Object - // The default set of attributes to associate with a given type. Note - // that schemas may add additional attributes to instances of the - // type. + _createClass(ReplacedRange, [{ + key: "toString", + value: function toString() { + return "[replaced " + this.before.from + "-" + this.before.to + " with " + this.after.from + "-" + this.after.to + "]"; + } + }]); - // :: bool - // True if this is a block type. + return ReplacedRange; +})(); - _createClass(NodeType, [{ - key: "canContainFragment", +exports.ReplacedRange = ReplacedRange; - // :: (Fragment) → bool - // Test whether the content of the given fragment could be contained - // in this node type. - value: function canContainFragment(fragment) { - var _this = this; +var empty = []; - var ok = true; - fragment.forEach(function (n) { - if (!_this.canContain(n)) ok = false; - }); - return ok; - } +function offsetFrom(base, pos) { + if (pos.path.length > base.path.length) { + var path = [pos.path[base.path.length] - base.offset]; + for (var i = base.path.length + 1; i < pos.path.length; i++) { + path.push(pos.path[i]); + }return new _model.Pos(path, pos.offset); + } else { + return new _model.Pos([], pos.offset - base.offset); + } +} - // :: (Node) → bool - // Test whether the given node could be contained in this node type. - }, { - key: "canContain", - value: function canContain(node) { - if (!this.canContainType(node.type)) return false; - for (var i = 0; i < node.marks.length; i++) { - if (!this.canContainMark(node.marks[i])) return false; - }return true; - } +function mapThrough(map, pos, bias, back) { + if (bias === undefined) bias = 1; - // :: (Mark) → bool - // Test whether this node type can contain children with the given - // mark. - }, { - key: "canContainMark", - value: function canContainMark(mark) { - var contains = this.containsMarks; - if (contains === true) return true; - if (contains) for (var i = 0; i < contains.length; i++) { - if (contains[i] == mark.name) return true; - }return false; + for (var i = 0; i < map.replaced.length; i++) { + var range = map.replaced[i], + side = back ? range.after : range.before; + var left = undefined, + right = undefined; + if ((left = pos.cmp(side.from)) >= 0 && (right = pos.cmp(side.to)) <= 0) { + var other = back ? range.before : range.after; + return new MapResult(bias < 0 ? other.from : other.to, !!(left && right), { rangeID: i, offset: offsetFrom(side.ref, pos) }); } + } - // :: (NodeType) → bool - // Test whether this node type can contain nodes of the given node - // type. - }, { - key: "canContainType", - value: function canContainType(type) { - return this.schema.subKind(type.name, this.contains); + for (var i = 0; i < map.moved.length; i++) { + var range = map.moved[i]; + var start = back ? range.dest : range.start; + if (pos.cmp(start) >= 0 && _model.Pos.cmp(pos.path, pos.offset, start.path, start.offset + range.size) <= 0) { + var dest = back ? range.start : range.dest; + var depth = start.depth; + if (pos.depth > depth) { + var offset = dest.offset + (pos.path[depth] - start.offset); + return new MapResult(new _model.Pos(dest.path.concat(offset).concat(pos.path.slice(depth + 1)), pos.offset)); + } else { + return new MapResult(new _model.Pos(dest.path, dest.offset + (pos.offset - start.offset))); + } } + } - // :: (NodeType) → bool - // Test whether the nodes that can be contained in the given node - // type are a sub-type of the nodes that can be contained in this - // type. - }, { - key: "canContainContent", - value: function canContainContent(type) { - return this.schema.subKind(type.contains, this.contains); - } + return new MapResult(pos); +} - // :: (NodeType) → [NodeType] - // Find a set of intermediate node types, possibly empty, that have - // to be inserted between this type and `other` to put a node of - // type `other` into this type. - }, { - key: "findConnection", - value: function findConnection(other) { - // FIXME somehow define an order in which these are tried - if (this.canContainType(other)) return []; +// ;; A position map, holding information about the way positions in +// the pre-step version of a document correspond to positions in the +// post-step version. This class implements `Mappable`. - var seen = Object.create(null); - var active = [{ from: this, via: [] }]; - while (active.length) { - var current = active.shift(); - for (var _name in this.schema.nodes) { - var type = this.schema.nodes[_name]; - if (type.defaultAttrs && !(type.contains in seen) && current.from.canContainType(type)) { - var via = current.via.concat(type); - if (type.canContainType(other)) return via; - active.push({ from: type, via: via }); - seen[type.contains] = true; - } - } - } +var PosMap = (function () { + function PosMap(moved, replaced) { + _classCallCheck(this, PosMap); + + this.moved = moved || empty; + this.replaced = replaced || empty; + } + + // ;; #toc=false The return value of mapping a position. + + _createClass(PosMap, [{ + key: "recover", + value: function recover(offset) { + return this.replaced[offset.rangeID].after.ref.extend(offset.offset); } + + // :: (Pos, ?number) → MapResult + // Map the given position through this map. The `bias` parameter can + // be used to control what happens when the transform inserted + // content at (or around) this position—if `bias` is negative, the a + // position before the inserted content will be returned, if it is + // positive, a position after the insertion is returned. }, { - key: "buildAttrs", - value: function buildAttrs(attrs, content) { - if (!attrs && this.defaultAttrs) return this.defaultAttrs;else return _buildAttrs(this.attrs, attrs, this, content); + key: "map", + value: function map(pos, bias) { + return mapThrough(this, pos, bias, false); } - // :: (?Object, ?Fragment, ?[Mark]) → Node - // Create a `Node` of this type. The given attributes are - // checked and defaulted (you can pass `null` to use the type's - // defaults entirely, if no required attributes exist). `content` - // may be a `Fragment`, a node, an array of nodes, or - // `null`. Similarly `marks` may be `null` to default to the empty - // set of marks. + // :: () → PosMap + // Create an inverted version of this map. The result can be used to + // map positions in the post-step document to the pre-step document. }, { - key: "create", - value: function create(attrs, content, marks) { - return new _node.Node(this, this.buildAttrs(attrs, content), _fragment.Fragment.from(content), _mark.Mark.setFrom(marks)); + key: "invert", + value: function invert() { + return new InvertedPosMap(this); } }, { - key: "createAutoFill", - value: function createAutoFill(attrs, content, marks) { - if ((!content || content.length == 0) && !this.canBeEmpty) content = this.defaultContent(); - return this.create(attrs, content, marks); + key: "toString", + value: function toString() { + return this.moved.concat(this.replaced).join(" "); } + }]); - // :: bool - // Controls whether this node is allowed to be empty. - }, { - key: "isBlock", - get: function get() { - return false; - } + return PosMap; +})(); - // :: bool - // True if this is a textblock type, a block that contains inline - // content. - }, { - key: "isTextblock", - get: function get() { - return false; - } +exports.PosMap = PosMap; - // :: bool - // True if this is an inline type. - }, { - key: "isInline", - get: function get() { - return false; - } +var MapResult = function MapResult(pos) { + var deleted = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + var recover = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - // :: bool - // True if this is the text node type. - }, { - key: "isText", - get: function get() { - return false; - } + _classCallCheck(this, MapResult); - // :: bool - // Controls whether nodes of this type can be selected (as a user - // node selection). - }, { - key: "selectable", - get: function get() { - return true; - } + // :: Pos The mapped version of the position. + this.pos = pos; + // :: bool Tells you whether the position was deleted, that is, + // whether the step removed its surroundings from the document. + this.deleted = deleted; + this.recover = recover; +}; - // :: bool - // Controls whether this node type is locked. - }, { - key: "locked", - get: function get() { - return false; - } +exports.MapResult = MapResult; - // :: string - // Controls the _kind_ of the node, which is used to determine valid - // parent/child relations. Can be a word, which adds that kind to - // the set of kinds of the superclass, a word followed by a dot, to - // ignore the kinds of the superclass and use only that word (along - // with the node's name) as kind, or only a dot, in which case the - // only kind the node has is its own name. - }, { - key: "canBeEmpty", - get: function get() { - return true; - } - }, { - key: "containsMarks", +var InvertedPosMap = (function () { + function InvertedPosMap(map) { + _classCallCheck(this, InvertedPosMap); - // :: union - // The mark types that child nodes of this node may have. `false` - // means no marks, `true` means any mark, and an array of strings - // can be used to explicitly list the allowed mark types. - get: function get() { - return false; - } - }], [{ - key: "compile", - value: function compile(types, schema) { - var result = Object.create(null); - for (var _name2 in types) { - var info = types[_name2]; - var type = info.type || SchemaError.raise("Missing node type for " + _name2); - findKinds(type, _name2, schema, info.kind); - var contains = "contains" in info ? info.contains : type.contains; - var attrs = type.attributes; - if (info.attributes) { - attrs = copyObj(attrs); - for (var aName in info.attributes) attrs[aName] = info.attributes[aName]; - } - result[_name2] = new type(_name2, contains, attrs, schema); - } - for (var _name3 in result) { - var contains = result[_name3].contains; - if (contains && !(contains in schema.kinds)) SchemaError.raise("Node type " + _name3 + " is specified to contain non-existing kind " + contains); - } - if (!result.doc) SchemaError.raise("Every schema needs a 'doc' type"); - if (!result.text) SchemaError.raise("Every schema needs a 'text' type"); + this.inner = map; + } - return result; + _createClass(InvertedPosMap, [{ + key: "recover", + value: function recover(offset) { + return this.inner.replaced[offset.rangeID].before.ref.extend(offset.offset); } - - // :: (string, *) - // Register an element in this type's registry. That is, add `value` - // to the array associated with `name` in the registry stored in - // type's `prototype`. This is mostly used to attach things like - // commands and parsing strategies to node types. See `Schema.registry`. }, { - key: "register", - value: function register(name, value) { - var registry = this.prototype.hasOwnProperty("registry") ? this.prototype.registry : this.prototype.registry = Object.create(null);(registry[name] || (registry[name] = [])).push(value); + key: "map", + value: function map(pos, bias) { + return mapThrough(this.inner, pos, bias, true); } }, { - key: "kind", - get: function get() { - return "."; + key: "invert", + value: function invert() { + return this.inner; + } + }, { + key: "toString", + value: function toString() { + return "-" + this.inner; } }]); - return NodeType; + return InvertedPosMap; })(); -exports.NodeType = NodeType; -NodeType.attributes = {}; +var nullMap = new PosMap(); -// ;; #toc=false Base type for block nodetypes. +exports.nullMap = nullMap; +// ;; A remapping represents a pipeline of zero or more mappings. It +// is a specialized data structured used to manage mapping through a +// series of steps, typically including inverted and non-inverted +// versions of the same step. (This comes up when ‘rebasing’ steps for +// collaboration or history management.) This class implements +// `Mappable`. -var Block = (function (_NodeType) { - _inherits(Block, _NodeType); +var Remapping = (function () { + // :: (?[PosMap], ?[PosMap]) - function Block() { - _classCallCheck(this, Block); + function Remapping() { + var head = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + var tail = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; + var mirror = arguments.length <= 2 || arguments[2] === undefined ? Object.create(null) : arguments[2]; - _get(Object.getPrototypeOf(Block.prototype), "constructor", this).apply(this, arguments); + _classCallCheck(this, Remapping); + + // :: [PosMap] + // The maps in the head of the mapping are applied to input + // positions first, back-to-front. So the map at the end of this + // array (if any) is the very first one applied. + this.head = head; + // The maps in the tail are applied last, front-to-back. + this.tail = tail; + this.mirror = mirror; } - // ;; #toc=false Base type for textblock node types. + // :: (PosMap, ?number) → number + // Add a map to the mapping's front. If this map is the mirror image + // (produced by an inverted step) of another map in this mapping, + // that map's id (as returned by this method or + // [`addToBack`](#Remapping.addToBack)) should be passed as a second + // parameter to register the correspondence. - _createClass(Block, [{ - key: "defaultContent", - value: function defaultContent() { - var inner = this.schema.defaultTextblockType().create(); - var conn = this.findConnection(inner.type); - if (!conn) SchemaError.raise("Can't create default content for " + this.name); - for (var i = conn.length - 1; i >= 0; i--) { - inner = conn[i].create(null, inner); - }return _fragment.Fragment.from(inner); + _createClass(Remapping, [{ + key: "addToFront", + value: function addToFront(map, corr) { + this.head.push(map); + var id = -this.head.length; + if (corr != null) this.mirror[id] = corr; + return id; } + + // :: (PosMap, ?number) → number + // Add a map to the mapping's back. If the map is the mirror image + // of another mapping in this object, the id of that map should be + // passed to register the correspondence. }, { - key: "isBlock", - get: function get() { - return true; + key: "addToBack", + value: function addToBack(map, corr) { + this.tail.push(map); + var id = this.tail.length - 1; + if (corr != null) this.mirror[corr] = id; + return id; } }, { - key: "canBeEmpty", - get: function get() { - return this.contains == null; - } - }], [{ - key: "contains", - get: function get() { - return "block"; + key: "get", + value: function get(id) { + return id < 0 ? this.head[-id - 1] : this.tail[id]; } + + // :: (Pos, ?number) → MapResult + // Map a position through this remapping, optionally passing a bias + // direction. }, { - key: "kind", - get: function get() { - return "block."; + key: "map", + value: function map(pos, bias) { + var deleted = false; + + for (var i = -this.head.length; i < this.tail.length; i++) { + var map = this.get(i); + var result = map.map(pos, bias); + if (result.recover) { + var corr = this.mirror[i]; + if (corr != null) { + i = corr; + pos = this.get(corr).recover(result.recover); + continue; + } + } + if (result.deleted) deleted = true; + pos = result.pos; + } + + return new MapResult(pos, deleted); } }]); - return Block; -})(NodeType); + return Remapping; +})(); -exports.Block = Block; +exports.Remapping = Remapping; + +},{"../model":27}],42:[function(require,module,exports){ +"use strict"; + +var _model = require("../model"); + +var _transform = require("./transform"); + +var _step = require("./step"); + +var _tree = require("./tree"); + +// !! +// **`addMark`** +// : Add the `Mark` given as the step's parameter to all +// inline content between `from` and `to` (when allowed). +// +// **`removeMark`** +// : Remove the `Mark` given as the step's parameter from all inline +// content between `from` and `to`. + +_step.Step.define("addMark", { + apply: function apply(doc, step) { + return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { + if (!node.type.canContainMark(step.param)) return node; + return (0, _tree.copyInline)(node, from, to, function (node) { + return node.mark(step.param.addToSet(node.marks)); + }); + })); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("removeMark", step.from, map.map(step.to).pos, null, step.param); + }, + paramToJSON: function paramToJSON(param) { + return param.toJSON(); + }, + paramFromJSON: function paramFromJSON(schema, json) { + return schema.markFromJSON(json); + } +}); + +// :: (Pos, Pos, Mark) → Transform +// Add the given mark to the inline content between `from` and `to`. +_transform.Transform.prototype.addMark = function (from, to, mark) { + var _this = this; + + var removed = [], + added = [], + removing = null, + adding = null; + this.doc.inlineNodesBetween(from, to, function (_ref, path, start, end, parent) { + var marks = _ref.marks; + + if (mark.isInSet(marks) || !parent.type.canContainMark(mark.type)) { + adding = removing = null; + } else { + var rm = mark.type.isInSet(marks); + if (rm) { + if (removing && removing.param.eq(rm)) { + removing.to = new _model.Pos(path, end); + } else { + removing = new _step.Step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, rm); + removed.push(removing); + } + } else if (removing) { + removing = null; + } + if (adding) { + adding.to = new _model.Pos(path, end); + } else { + adding = new _step.Step("addMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); + added.push(adding); + } + } + }); + removed.forEach(function (s) { + return _this.step(s); + }); + added.forEach(function (s) { + return _this.step(s); + }); + return this; +}; -var Textblock = (function (_Block) { - _inherits(Textblock, _Block); +_step.Step.define("removeMark", { + apply: function apply(doc, step) { + return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { + return (0, _tree.copyInline)(node, from, to, function (node) { + return node.mark(step.param.removeFromSet(node.marks)); + }); + })); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("addMark", step.from, map.map(step.to).pos, null, step.param); + }, + paramToJSON: function paramToJSON(param) { + return param.toJSON(); + }, + paramFromJSON: function paramFromJSON(schema, json) { + return schema.markFromJSON(json); + } +}); - function Textblock() { - _classCallCheck(this, Textblock); +// :: (Pos, Pos, union) → Transform +// Remove the given mark, or all marks of the given type, from inline +// nodes between `from` and `to`. +_transform.Transform.prototype.removeMark = function (from, to) { + var _this2 = this; - _get(Object.getPrototypeOf(Textblock.prototype), "constructor", this).apply(this, arguments); - } + var mark = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; - // ;; #toc=false Base type for inline node types. + var matched = [], + step = 0; + this.doc.inlineNodesBetween(from, to, function (_ref2, path, start, end) { + var marks = _ref2.marks; - _createClass(Textblock, [{ - key: "containsMarks", - get: function get() { - return true; - } - }, { - key: "isTextblock", - get: function get() { - return true; - } - }, { - key: "canBeEmpty", - get: function get() { - return true; + step++; + var toRemove = null; + if (mark instanceof _model.MarkType) { + var found = mark.isInSet(marks); + if (found) toRemove = [found]; + } else if (mark) { + if (mark.isInSet(marks)) toRemove = [mark]; + } else { + toRemove = marks; } - }], [{ - key: "contains", - get: function get() { - return "inline"; + if (toRemove && toRemove.length) { + path = path.slice(); + for (var i = 0; i < toRemove.length; i++) { + var rm = toRemove[i], + found = undefined; + for (var j = 0; j < matched.length; j++) { + var m = matched[j]; + if (m.step == step - 1 && rm.eq(matched[j].style)) found = m; + } + if (found) { + found.to = new _model.Pos(path, end); + found.step = step; + } else { + matched.push({ style: rm, from: new _model.Pos(path, start), to: new _model.Pos(path, end), step: step }); + } + } } - }]); + }); + matched.forEach(function (m) { + return _this2.step("removeMark", m.from, m.to, null, m.style); + }); + return this; +}; - return Textblock; -})(Block); +// :: (Pos, Pos, ?NodeType) → Transform +// Remove all marks and non-text inline nodes, or if `newParent` is +// given, all marks and inline nodes that may not appear as content of +// `newParent`, from the given range. +_transform.Transform.prototype.clearMarkup = function (from, to, newParent) { + var _this3 = this; -exports.Textblock = Textblock; + var delSteps = []; // Must be accumulated and applied in inverse order + this.doc.inlineNodesBetween(from, to, function (_ref3, path, start, end) { + var marks = _ref3.marks; + var type = _ref3.type; -var Inline = (function (_NodeType2) { - _inherits(Inline, _NodeType2); + if (newParent ? !newParent.canContainType(type) : !type.isText) { + path = path.slice(); + var _from = new _model.Pos(path, start); + delSteps.push(new _step.Step("replace", _from, new _model.Pos(path, end), _from)); + return; + } + for (var i = 0; i < marks.length; i++) { + var mark = marks[i]; + if (!newParent || !newParent.canContainMark(mark.type)) { + path = path.slice(); + _this3.step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); + } + } + }); + for (var i = delSteps.length - 1; i >= 0; i--) { + this.step(delSteps[i]); + }return this; +}; - function Inline() { - _classCallCheck(this, Inline); +},{"../model":27,"./step":45,"./transform":46,"./tree":47}],43:[function(require,module,exports){ +"use strict"; - _get(Object.getPrototypeOf(Inline.prototype), "constructor", this).apply(this, arguments); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.replace = replace; - // ;; #toc=false The text node type. +var _model = require("../model"); - _createClass(Inline, [{ - key: "isInline", - get: function get() { - return true; - } - }], [{ - key: "contains", - get: function get() { - return null; - } - }, { - key: "kind", - get: function get() { - return "inline."; - } - }]); +var _transform = require("./transform"); - return Inline; -})(NodeType); +var _step = require("./step"); -exports.Inline = Inline; +var _map = require("./map"); -var Text = (function (_Inline) { - _inherits(Text, _Inline); +var _tree = require("./tree"); - function Text() { - _classCallCheck(this, Text); +// !! **`replace`** - _get(Object.getPrototypeOf(Text.prototype), "constructor", this).apply(this, arguments); - } +// : Delete the part of the document between `from` and `to` and +// optionally replace it with another chunk of content. `pos` must +// point at the ‘root’ at which the cut starts—a position between +// and above `from` and `to`. +// +// When new content is to be inserted, the step's parameter should +// be an object of shape `{content: `[`Fragment`](#Fragment)`, +// openLeft: number, openRight: number}`. The step will insert the +// given content at the root of the cut, and `openLeft` and +// `openRight` indicate how much of the content on both sides +// should be consided ‘open’. +// +// A replace step will try to join open nodes on both sides of the +// cut. That is, nodes in the original document that are partially +// cut off by `from` and `to`, and nodes at the sides of the +// replacement content as specificed by `openLeft` and +// `openRight`. For example, if `openLeft` is 2, the first node of +// the replacement content as well as its first child is +// considered open. Whenever two open nodes with the same +// [markup](#Node.sameMarkup) end up next to each other, they are +// joined. Open nodes that aren't joined are [closed](#Node.close) +// to ensure their content (or lack of it) is valid. - // Attribute descriptors +function findMovedChunks(oldNode, oldPath, newNode, startDepth) { + var moved = []; + var newPath = oldPath.path.slice(0, startDepth); - // ;; Attributes are named strings associated with nodes and marks. - // Each node type or mark type has a fixed set of attributes, which - // instances of this class are used to control. + for (var depth = startDepth;; depth++) { + var joined = depth == oldPath.depth ? 0 : 1; + var cut = depth == oldPath.depth ? oldPath.offset : oldPath.path[depth]; + var afterCut = oldNode.size - cut; + var newOffset = newNode.size - afterCut; - _createClass(Text, [{ - key: "create", - value: function create(attrs, content, marks) { - return new _node.TextNode(this, this.buildAttrs(attrs, content), content, marks); - } - }, { - key: "selectable", - get: function get() { - return false; - } - }, { - key: "isText", - get: function get() { - return true; - } - }]); + var from = oldPath.shorten(depth, joined); + var to = new _model.Pos(newPath, newOffset + joined); + if (from.cmp(to)) moved.push(new _map.MovedRange(from, afterCut - joined, to)); - return Text; -})(Inline); + if (!joined) return moved; -exports.Text = Text; + oldNode = oldNode.child(cut); + newNode = newNode.child(newOffset); + newPath = newPath.concat(newOffset); + } +} -var Attribute = (function () { - // :: (Object) - // Create an attribute. `options` is an object containing the - // settings for the attributes. The following settings are - // supported: - // - // **`default`**: `?string` - // : The default value for this attribute, to choose when no - // explicit value is provided. - // - // **`compute`**: `?(Fragment) → string` - // : A function that computes a default value for the attribute from - // the node's content. - // - // Attributes that have no default or compute property must be - // provided whenever a node or mark of a type that has them is - // created. +function replace(node, from, to, root, repl) { + var depth = arguments.length <= 5 || arguments[5] === undefined ? 0 : arguments[5]; + + if (depth == root.length) { + var before = node.sliceBetween(null, from, depth); + var after = node.sliceBetween(to, null, depth), + result = undefined; + if (!before.type.canContainFragment(repl.content)) return null; + if (repl.content.size) result = before.append(repl.content, from.depth - depth, repl.openLeft).append(after.content, repl.openRight, to.depth - depth);else result = before.append(after.content, from.depth - depth, to.depth - depth); + if (!result.size && !result.type.canBeEmpty) result = result.copy(result.type.defaultContent()); + return { doc: result, moved: findMovedChunks(node, to, result, depth) }; + } else { + var pos = root[depth]; + var result = replace(node.child(pos), from, to, root, repl, depth + 1); + if (!result) return null; + return { doc: node.replace(pos, result.doc), moved: result.moved }; + } +} - function Attribute() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; +var nullRepl = { content: _model.emptyFragment, openLeft: 0, openRight: 0 }; - _classCallCheck(this, Attribute); +_step.Step.define("replace", { + apply: function apply(doc, step) { + var rootPos = step.pos, + root = rootPos.path; + if (step.from.depth < root.length || step.to.depth < root.length) return null; + for (var i = 0; i < root.length; i++) { + if (step.from.path[i] != root[i] || step.to.path[i] != root[i]) return null; + }var result = replace(doc, step.from, step.to, rootPos.path, step.param || nullRepl); + if (!result) return null; + var out = result.doc; + var moved = result.moved; - this["default"] = options["default"]; - this.compute = options.compute; - this.registry = Object.create(null); + var end = moved.length ? moved[moved.length - 1].dest : step.to; + var replaced = new _map.ReplacedRange(step.from, step.to, step.from, end, rootPos, rootPos); + return new _step.StepResult(out, new _map.PosMap(moved, [replaced])); + }, + invert: function invert(step, oldDoc, map) { + var depth = step.pos.depth; + return new _step.Step("replace", step.from, map.map(step.to).pos, step.from.shorten(depth), { + content: oldDoc.path(step.pos.path).content.sliceBetween(step.from, step.to, depth), + openLeft: step.from.depth - depth, + openRight: step.to.depth - depth + }); + }, + paramToJSON: function paramToJSON(param) { + return param && { content: param.content.size && param.content.toJSON(), + openLeft: param.openLeft, openRight: param.openRight }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return json && { content: _model.Fragment.fromJSON(schema, json.content), + openLeft: json.openLeft, openRight: json.openRight }; } +}); - // Marks +function shiftFromStack(stack, depth) { + var shifted = stack[depth] = stack[depth].splice(0, 1, _model.emptyFragment); + for (var i = depth - 1; i >= 0; i--) { + shifted = stack[i] = stack[i].replace(0, shifted); + } +} - // ;; Like nodes, marks (which are associated with nodes to signify - // things like emphasis or being part of a link) are tagged with type - // objects, which are instantiated once per `Schema`. +// FIXME find a not so horribly confusing way to express this +function buildInserted(nodesLeft, source, start, end) { + var sliced = source.sliceBetween(start, end); + var nodesRight = []; + for (var node = sliced, i = 0; i <= start.path.length; i++, node = node.firstChild) { + nodesRight.push(node); + }var same = (0, _tree.samePathDepth)(start, end); + var searchLeft = nodesLeft.length - 1, + searchRight = nodesRight.length - 1; + var result = null; - // :: (string, *) - // Register a value in this attribute's registry. See - // `NodeType.register` and `Schema.registry`. + var inner = nodesRight[searchRight]; + if (inner.isTextblock && inner.size && nodesLeft[searchLeft].isTextblock) { + result = nodesLeft[searchLeft--].copy(inner.content); + --searchRight; + shiftFromStack(nodesRight, searchRight); + } - _createClass(Attribute, [{ - key: "register", - value: function register(name, value) { - ;(this.registry[name] || (this.registry[name] = [])).push(value); + for (;;) { + var node = nodesRight[searchRight], + type = node.type, + matched = null; + var outside = searchRight <= same; + for (var i = searchLeft; i >= 0; i--) { + var left = nodesLeft[i]; + if (outside ? left.type.canContainContent(node.type) : left.type == type) { + matched = i; + break; + } } - }]); - - return Attribute; -})(); - -exports.Attribute = Attribute; + if (matched != null) { + if (!result) { + result = nodesLeft[matched].copy(node.content); + searchLeft = matched - 1; + } else { + while (searchLeft >= matched) { + var wrap = nodesLeft[searchLeft]; + var content = _model.Fragment.from(result); + result = wrap.copy(searchLeft == matched ? content.append(node.content) : content); + searchLeft--; + } + } + } + if (matched != null || node.size == 0) { + if (outside) break; + if (searchRight) shiftFromStack(nodesRight, searchRight - 1); + } + searchRight--; + } -var MarkType = (function () { - function MarkType(name, attrs, rank, schema) { - _classCallCheck(this, MarkType); + var repl = { content: result ? result.content : _model.emptyFragment, + openLeft: start.depth - searchRight, + openRight: end.depth - searchRight }; + return { repl: repl, depth: searchLeft + 1 }; +} - // :: string - // The name of the mark type. - this.name = name; - // :: Object - // The attributes supported by this type of mark. - this.attrs = attrs; - this.rank = rank; - // :: Schema - // The schema that this mark type instance is part of. - this.schema = schema; - var defaults = getDefaultAttrs(this.attrs); - this.instance = defaults && new _mark.Mark(this, defaults); +function moveText(tr, doc, before, after) { + var root = (0, _tree.samePathDepth)(before, after); + var cutAt = after.shorten(null, 1); + while (cutAt.path.length > root && doc.path(cutAt.path).size == 1) cutAt = cutAt.shorten(null, 1); + tr.split(cutAt, cutAt.path.length - root); + var start = after, + end = new _model.Pos(start.path, doc.path(start.path).size); + var parent = doc.path(start.path.slice(0, root)); + var wanted = parent.pathNodes(before.path.slice(root)); + var existing = parent.pathNodes(start.path.slice(root)); + while (wanted.length && existing.length && wanted[0].sameMarkup(existing[0])) { + wanted.shift(); + existing.shift(); + } + if (existing.length || wanted.length) tr.step("ancestor", start, end, null, { + depth: existing.length, + types: wanted.map(function (n) { + return n.type; + }), + attrs: wanted.map(function (n) { + return n.attrs; + }) + }); + for (var i = root; i < before.path.length; i++) { + tr.join(before.shorten(i, 1)); } +} - // :: Object - // The default set of attributes to associate with a mark type. By - // default, this returns an empty object. +// :: (Pos, Pos) → Transform +// Delete the content between the given positions. +_transform.Transform.prototype["delete"] = function (from, to) { + if (from.cmp(to)) this.replace(from, to); + return this; +}; - // :: number - // Mark type ranks are used to determine the order in which mark - // arrays are sorted. (If multiple mark types end up with the same - // rank, they still get a fixed order in the schema, but there's no - // guarantee what it will be.) +// :: (Pos, Pos, Node, Pos, Pos) → Transform +// Replace the part of the document between `from` and `to` with the +// part of the `source` between `start` and `end`. +_transform.Transform.prototype.replace = function (from, to, source, start, end) { + var repl = undefined, + depth = undefined, + doc = this.doc, + maxDepth = (0, _tree.samePathDepth)(from, to); + if (source) { + ; + var _buildInserted = buildInserted(doc.pathNodes(from.path), source, start, end); - _createClass(MarkType, [{ - key: "create", + repl = _buildInserted.repl; + depth = _buildInserted.depth; - // :: (Object) → Mark - // Create a mark of this type. `attrs` may be `null` or an object - // containing only some of the mark's attributes. The others, if - // they have defaults, will be added. - value: function create(attrs) { - if (!attrs && this.instance) return this.instance; - return new _mark.Mark(this, _buildAttrs(this.attrs, attrs, this)); + while (depth > maxDepth) { + if (repl.content.size) repl = { content: _model.Fragment.from(doc.path(from.path.slice(0, depth)).copy(repl.content)), + openLeft: repl.openLeft + 1, openRight: repl.openRight + 1 }; + depth--; } - }, { - key: "removeFromSet", + } else { + repl = nullRepl; + depth = maxDepth; + } + var root = from.shorten(depth), + docAfter = doc, + after = to; + if (repl.content.size || (0, _tree.replaceHasEffect)(doc, from, to)) { + var result = this.step("replace", from, to, root, repl); + docAfter = result.doc; + after = result.map.map(to).pos; + } - // :: ([Mark]) → [Mark] - // When there is a mark of this type in the given set, a new set - // without it is returned. Otherwise, the input set is returned. - value: function removeFromSet(set) { - for (var i = 0; i < set.length; i++) if (set[i].type == this) return set.slice(0, i).concat(set.slice(i + 1)); - return set; - } + // If no text nodes before or after end of replacement, don't glue text + if (!doc.path(to.path).isTextblock) return this; + if (!(repl.content.size ? source.path(end.path).isTextblock : doc.path(from.path).isTextblock)) return this; - // :: ([Mark]) → bool - // Tests whether there is a mark of this type in the given set. - }, { - key: "isInSet", - value: function isInSet(set) { - for (var i = 0; i < set.length; i++) { - if (set[i].type == this) return set[i]; - } - } - }], [{ - key: "getOrder", - value: function getOrder(marks) { - var sorted = []; - for (var _name4 in marks) { - sorted.push({ name: _name4, rank: marks[_name4].type.rank }); - }sorted.sort(function (a, b) { - return a.rank - b.rank; - }); - var ranks = Object.create(null); - for (var i = 0; i < sorted.length; i++) { - ranks[sorted[i].name] = i; - }return ranks; - } - }, { - key: "compile", - value: function compile(marks, schema) { - var order = this.getOrder(marks); - var result = Object.create(null); - for (var _name5 in marks) { - var info = marks[_name5]; - var attrs = info.attributes || info.type.attributes; - result[_name5] = new info.type(_name5, attrs, order[_name5], schema); - } - return result; + var nodesAfter = doc.path(root.path).pathNodes(to.path.slice(depth)).slice(1); + var nodesBefore = undefined; + if (repl.content.size) { + var inserted = repl.content; + nodesBefore = []; + for (var i = 0; i < repl.openRight; i++) { + var last = inserted.child(inserted.size - 1); + nodesBefore.push(last); + inserted = last.content; } - }, { - key: "rank", - get: function get() { - return 50; + } else { + nodesBefore = doc.path(root.path).pathNodes(from.path.slice(depth)).slice(1); + } + + if (nodesBefore.length && (nodesAfter.length != nodesBefore.length || !nodesAfter.every(function (n, i) { + return n.sameMarkup(nodesBefore[i]); + }))) { + var _after$shorten = after.shorten(root.depth); + + var path = _after$shorten.path; + var offset = _after$shorten.offset;var before = undefined; + for (var node = docAfter.path(path), i = 0;; i++) { + if (i == nodesBefore.length) { + before = new _model.Pos(path, offset); + break; + } + path.push(offset - 1); + node = node.child(offset - 1); + offset = node.size; } - }]); + moveText(this, docAfter, before, after); + } + return this; +}; - return MarkType; -})(); +// :: (Pos, Pos, union) → Transform +// Replace the given sibling range (position ponting into the same +// parent) with the given content, which may be a fragment, node, or +// array of nodes. +_transform.Transform.prototype.replaceWith = function (from, to, content) { + if (!(content instanceof _model.Fragment)) content = _model.Fragment.from(content); + if (!_model.Pos.samePath(from.path, to.path)) return this; + this.step("replace", from, to, from, { content: content, openLeft: 0, openRight: 0 }); + return this; +}; -exports.MarkType = MarkType; -MarkType.attributes = {}; +// :: (Pos, union) → Transform +// Insert the given content at the `pos`. +_transform.Transform.prototype.insert = function (pos, content) { + return this.replaceWith(pos, pos, content); +}; -// :: (string, *) -// Register a metadata element for this mark type. See also -// `NodeType.register`. -MarkType.register = NodeType.register; +// :: (Pos, string) → Transform +// Insert the given text at `pos`, inheriting the marks of the +// existing content at that position. +_transform.Transform.prototype.insertText = function (pos, text) { + return this.insert(pos, this.doc.type.schema.text(text, this.doc.marksAt(pos))); +}; -// Schema specifications are data structures that specify a schema -- -// a set of node types, their names, attributes, and nesting behavior. +// :: (Pos, Node) → Transform +// Insert the given node at `pos`, inheriting the marks of the +// existing content at that position. +_transform.Transform.prototype.insertInline = function (pos, node) { + return this.insert(pos, node.mark(this.doc.marksAt(pos))); +}; -function copyObj(obj, f) { - var result = Object.create(null); - for (var prop in obj) { - result[prop] = f ? f(obj[prop]) : obj[prop]; - }return result; -} +},{"../model":27,"./map":41,"./step":45,"./transform":46,"./tree":47}],44:[function(require,module,exports){ +"use strict"; -function ensureWrapped(obj) { - return obj instanceof Function ? { type: obj } : obj; -} +var _model = require("../model"); -function overlayObj(obj, overlay) { - var copy = copyObj(obj); - for (var _name6 in overlay) { - var info = ensureWrapped(overlay[_name6]); - if (info == null) { - delete copy[_name6]; - } else if (info.type) { - copy[_name6] = info; - } else { - var existing = copy[_name6] = copyObj(copy[_name6]); - for (var prop in info) { - existing[prop] = info[prop]; - } - } - } - return copy; -} +var _transform = require("./transform"); -// ;; A schema specification is a blueprint for an actual -// `Schema`. It maps names to node and mark types, along -// with extra information, such as additional attributes and changes -// to node kinds and relations. -// -// A specification consists of an object that maps node names to node -// type constructors and another similar object mapping mark names to -// mark type constructors. -// -// For flexibility and reusability, node and mark type classes do not -// declare their own name. Instead, each schema that includes them can -// assign a name to them, as well as override their -// [kind](#NodeType.kind) and [contained kind](#NodeType.contains), or -// adding extra [attributes](#NodeType.attributes). +var _step = require("./step"); -var SchemaSpec = (function () { - // :: (?Object<{type: NodeType}>, ?Object<{type: MarkType}>) - // Create a schema specification from scratch. The arguments map - // node names to node type constructors and mark names to mark type - // constructors. Their property value should be either the type - // constructors themselves, or objects with a type constructor under - // their `type` property, and optionally these other properties: - // - // **`contains`**`: string` - // : Only valid for `nodes`. The [kind](#NodeType.kind) of the - // nodes that this node can contain in this schema. - // - // **`kind`**`: string` - // : Only valid for `nodes`. Overrides the kind of this node in - // this schema. Same format as `NodeType.kind`. - // - // **`attributes`**`: Object` - // : Extra attributes to attach to this node in this schema. +var _map = require("./map"); - function SchemaSpec(nodes, marks) { - _classCallCheck(this, SchemaSpec); +// !! **`split`** +// : Split a block node at `pos`. The parameter, if given, may be +// `{type, ?attrs}` object giving the node type and optionally the +// attributes of the node created to hold the content after the +// split. - this.nodes = nodes ? copyObj(nodes, ensureWrapped) : Object.create(null); - this.marks = marks ? copyObj(marks, ensureWrapped) : Object.create(null); - } +_step.Step.define("split", { + apply: function apply(doc, step) { + var pos = step.pos; + if (pos.depth == 0) return null; - // For node types where all attrs have a default value (or which don't - // have any attributes), build up a single reusable default attribute - // object, and use it for all nodes that don't specify specific - // attributes. + var _pos$shorten = pos.shorten(); - // :: (?Object, ?Object) → SchemaSpec - // Base a new schema spec on this one by specifying nodes and marks - // to add, change, or remove. - // - // When `nodes` is passed, it should be an object mapping type names - // to either `null`, to delete the type of that name, to a - // `NodeType`, to add or replace the node type of that name, or to - // an object containing [extension - // properties](#SchemaSpec_constructor), to add to the existing - // description of that node type. - // - // Similarly, `marks` can be an object to add, change, or remove - // marks in the schema. + var parentPath = _pos$shorten.path; + var offset = _pos$shorten.offset; - _createClass(SchemaSpec, [{ - key: "update", - value: function update(nodes, marks) { - return new SchemaSpec(nodes ? overlayObj(this.nodes, nodes) : this.nodes, marks ? overlayObj(this.marks, marks) : this.marks); - } + var parent = doc.path(parentPath); + var target = parent.child(offset), + targetSize = target.size; - // :: (?union, string, Attribute) → SchemaSpec - // Create a new schema spec with attributes added to selected node - // types. `filter` can be `null`, to add the attribute to all node - // types, a string, to add it only to the named node type, or a - // predicate function, to add it to node types that pass the - // predicate. - // - // This attribute will be added alongside the node type's [default - // attributes](#NodeType.attributes). - }, { - key: "addAttribute", - value: function addAttribute(filter, attrName, attr) { - var copy = copyObj(this.nodes); - for (var _name7 in copy) { - if (typeof filter == "string" ? filter == _name7 : typeof filter == "function" ? filter(_name7, copy[_name7]) : filter ? filter == copy[_name7] : true) { - var info = copy[_name7] = copyObj(copy[_name7]);(info.attributes || (info.attributes = Object.create(null)))[attrName] = attr; - } - } - return new SchemaSpec(copy, this.marks); - } - }]); + var _ref = step.param || target; - return SchemaSpec; -})(); + var typeAfter = _ref.type; + var attrsAfter = _ref.attrs; -exports.SchemaSpec = SchemaSpec; -function getDefaultAttrs(attrs) { - var defaults = Object.create(null); - for (var attrName in attrs) { - var attr = attrs[attrName]; - if (attr["default"] == null) return null; - defaults[attrName] = attr["default"]; + var splitAt = pos.offset; + if (splitAt == 0 && !target.type.canBeEmpty || target.type.locked || splitAt == target.size && !typeAfter.canBeEmpty) return null; + var newParent = parent.splice(offset, offset + 1, _model.Fragment.from([target.slice(0, splitAt), typeAfter.create(attrsAfter, target.content.slice(splitAt))])); + var copy = doc.replaceDeep(parentPath, newParent); + + var dest = new _model.Pos(parentPath.concat(offset + 1), 0); + var map = new _map.PosMap([new _map.MovedRange(pos, targetSize - pos.offset, dest), new _map.MovedRange(new _model.Pos(parentPath, offset + 1), newParent.size - 2 - offset, new _model.Pos(parentPath, offset + 2))], [new _map.ReplacedRange(pos, pos, pos, dest, pos, pos.shorten(null, 1))]); + return new _step.StepResult(copy, map); + }, + invert: function invert(step, _oldDoc, map) { + return new _step.Step("join", step.pos, map.map(step.pos).pos); + }, + paramToJSON: function paramToJSON(param) { + return param && { type: param.type.name, attrs: param.attrs }; + }, + paramFromJSON: function paramFromJSON(schema, json) { + return json && { type: schema.nodeType(json.type), attrs: json.attrs }; } - return defaults; -} +}); + +// :: (Pos, ?number, ?NodeType, ?Object) → Transform +// Split the node at the given position, and optionally, if `depth` is +// greater than one, any number of nodes above that. By default, the part +// split off will inherit the node type of the original node. This can +// be changed by passing `typeAfter` and `attrsAfter`. +_transform.Transform.prototype.split = function (pos, depth, typeAfter, attrsAfter) { + if (depth === undefined) depth = 1; + + if (depth == 0) return this; + for (var i = 0;; i++) { + this.step("split", null, null, pos, typeAfter && { type: typeAfter, attrs: attrsAfter }); + if (i == depth - 1) return this; + typeAfter = null; + pos = pos.shorten(null, 1); + } +}; + +// :: (Pos, ?number) → Transform +// Split at the given position, _if_ that position isn't already at +// the start or end of a node. If `depth` is greater than one, also do +// so for parent positions above the given position. +_transform.Transform.prototype.splitIfNeeded = function (pos) { + var depth = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; + + for (var off = 0; off < depth; off++) { + var here = pos.shorten(pos.depth - off); + if (here.offset && here.offset < this.doc.path(here.path).size) this.step("split", null, null, here); + } + return this; +}; -function _buildAttrs(attrSpec, attrs, arg1, arg2) { - var built = Object.create(null); - for (var _name8 in attrSpec) { - var value = attrs && attrs[_name8]; - if (value == null) { - var attr = attrSpec[_name8]; - if (attr["default"] != null) value = attr["default"];else if (attr.compute) value = attr.compute(arg1, arg2);else SchemaError.raise("No value supplied for attribute " + _name8); +},{"../model":27,"./map":41,"./step":45,"./transform":46}],45:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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); } - built[_name8] = value; + }return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; + }; +})(); + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } - return built; } -// ;; Each document is based on a single schema, which provides the -// node and mark types that it is made up of (which, in turn, -// determine the structure it is allowed to have). +var _model = require("../model"); -var Schema = (function () { - // :: (SchemaSpec) - // Construct a schema from a specification. +var _map = require("./map"); - function Schema(spec) { - _classCallCheck(this, Schema); +// ;; A step object wraps an atomic operation. It generally applies +// only to the document it was created for, since the positions +// associated with it will only make sense for that document. - // :: SchemaSpec - // The specification on which the schema is based. - this.spec = spec; - this.kinds = Object.create(null); - // :: Object - // An object mapping the schema's node names to node type objects. - this.nodes = NodeType.compile(spec.nodes, this); - // :: Object - // A map from mark names to mark type objects. - this.marks = MarkType.compile(spec.marks, this); - // :: Object - // An object for storing whatever values modules may want to - // compute and cache per schema. (If you want to store something - // in it, try to use property names unlikely to clash.) - this.cached = Object.create(null); +var Step = (function () { + // :: (string, ?Pos, ?Pos, ?Pos, ?any) + // Build a step. The type should name a [defined](Step.define) step + // type, and the shape of the positions and parameter should be + // appropriate for that type. - this.node = this.node.bind(this); - this.text = this.text.bind(this); - this.nodeFromJSON = this.nodeFromJSON.bind(this); - this.markFromJSON = this.markFromJSON.bind(this); - } + function Step(type, from, to, pos) { + var param = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; - // :: (union, ?Object, ?union, ?[Mark]) → Node - // Create a node in this schema. The `type` may be a string or a - // `NodeType` instance. Attributes will be extended - // with defaults, `content` may be a `Fragment`, - // `null`, a `Node`, or an array of nodes. - // - // When creating a text node, `content` should be a string and is - // interpreted as the node's text. - // - // This method is bound to the Schema, meaning you don't have to - // call it as a method, but can pass it to higher-order functions - // and such. + _classCallCheck(this, Step); - _createClass(Schema, [{ - key: "node", - value: function node(type, attrs, content, marks) { - if (typeof type == "string") type = this.nodeType(type);else if (!(type instanceof NodeType)) SchemaError.raise("Invalid node type: " + type);else if (type.schema != this) SchemaError.raise("Node type from different schema used (" + type.name + ")"); + if (!(type in steps)) throw new Error("Unknown step type: " + type); + // :: string + // The type of the step. + this.type = type; + // :: ?Pos + // The start of the step's range, if any. Which of the three + // optional positions associated with a step a given step type + // uses differs. The way each of these positions is mapped when + // the step is mapped over a [position mapping](#PosMap) depends + // on its role. + this.from = from; + // :: ?Pos + // The end of the step's range. + this.to = to; + // :: ?Pos + // The base position for this step. + this.pos = pos; + // :: ?any + // Extra step-type-specific information associated with the step. + this.param = param; + } - return type.create(attrs, content, marks); - } + // ;; #toc=false Objects of this type are returned as the result of + // applying a transform step to a document. - // :: (string, ?[Mark]) → Node - // Create a text node in the schema. This method is bound to the Schema. - }, { - key: "text", - value: function text(_text, marks) { - return this.nodes.text.create(null, _text, _mark.Mark.setFrom(marks)); - } + // :: (Node) → ?StepResult + // Applies this step to the given document, returning a result + // containing the transformed document (the input document is not + // changed) and a `PosMap`. If the step could not meaningfully be + // applied to the given document, this returns `null`. - // :: () → ?NodeType - // Return the default textblock type for this schema, or `null` if - // it does not contain a node type with a `defaultTextblock` - // property. - }, { - key: "defaultTextblockType", - value: function defaultTextblockType() { - var cached = this.cached.defaultTextblockType; - if (cached !== undefined) return cached; - for (var _name9 in this.nodes) { - if (this.nodes[_name9].defaultTextblock) return this.cached.defaultTextblockType = this.nodes[_name9]; - } - return this.cached.defaultTextblockType = null; + _createClass(Step, [{ + key: "apply", + value: function apply(doc) { + return steps[this.type].apply(doc, this); } - // :: (string, ?Object) → Mark - // Create a mark with the named type + // :: (Node, PosMap) → Step + // Create an inverted version of this step. Needs the document as it + // was before the step, as well as `PosMap` created by applying the + // step to that document, as input. }, { - key: "mark", - value: function mark(name, attrs) { - var spec = this.marks[name] || SchemaError.raise("No mark named " + name); - return spec.create(attrs); + key: "invert", + value: function invert(oldDoc, map) { + return steps[this.type].invert(this, oldDoc, map); } - // :: (Object) → Node - // Deserialize a node from its JSON representation. This method is - // bound. + // :: (Mappable) → ?Step + // Map this step through a mappable thing, returning either a + // version of that step with its positions adjusted, or `null` if + // the step was entirely deleted by the mapping. }, { - key: "nodeFromJSON", - value: function nodeFromJSON(json) { - return _node.Node.fromJSON(this, json); - } + key: "map", + value: function map(remapping) { + var allDeleted = true; + var from = null, + to = null, + pos = null; - // :: (Object) → Mark - // Deserialize a mark from its JSON representation. This method is - // bound. - }, { - key: "markFromJSON", - value: function markFromJSON(json) { - if (typeof json == "string") return this.mark(json); - return this.mark(json._, json); + if (this.from) { + var result = remapping.map(this.from, 1); + from = result.pos; + if (!result.deleted) allDeleted = false; + } + if (this.to) { + if (this.to.cmp(this.from) == 0) { + to = from; + } else { + var result = remapping.map(this.to, -1); + to = result.pos.max(from); + if (!result.deleted) allDeleted = false; + } + } + if (this.pos) { + if (from && this.pos.cmp(this.from) == 0) { + pos = from; + } else if (to && this.pos.cmp(this.to) == 0) { + pos = to; + } else { + var result = remapping.map(this.pos, 1); + pos = result.pos; + if (!result.deleted) allDeleted = false; + } + } + return allDeleted ? null : new Step(this.type, from, to, pos, this.param); } - // :: (string) → NodeType - // Get the `NodeType` associated with the given name in - // this schema, or raise an error if it does not exist. + // :: () → Object + // Create a JSON-serializeable representation of this step. }, { - key: "nodeType", - value: function nodeType(name) { - return this.nodes[name] || SchemaError.raise("Unknown node type: " + name); + key: "toJSON", + value: function toJSON() { + var impl = steps[this.type]; + return { + type: this.type, + from: this.from, + to: this.to, + pos: this.pos, + param: impl.paramToJSON ? impl.paramToJSON(this.param) : this.param + }; } - // :: (string, string) → bool - // Test whether a node kind is a sub-kind of another kind. - }, { - key: "subKind", - value: function subKind(sub, sup) { - for (;;) { - if (sub == sup) return true; - sub = this.kinds[sub]; - if (!sub) return false; - } + // :: (Schema, Object) → Step + // Deserialize a step from its JSON representation. + }], [{ + key: "fromJSON", + value: function fromJSON(schema, json) { + var impl = steps[json.type]; + return new Step(json.type, json.from && _model.Pos.fromJSON(json.from), json.to && _model.Pos.fromJSON(json.to), json.pos && _model.Pos.fromJSON(json.pos), impl.paramFromJSON ? impl.paramFromJSON(schema, json.param) : json.param); } - // :: (string, (value: *, source: union)) - // Retrieve all registered items under the given name from this - // schema. The given function will be called with each item and, as - // a second argument, the element—node type, mark type, or - // attribute—that it was associated with. + // :: (string, Object) + // Define a new type of step. Implementation should have the + // following properties: + // + // **`apply`**`(doc: Node, step: Step) → ?StepResult + // : Applies the step to a document. + // **`invert`**`(step: Step, oldDoc: Node, map: PosMap) → Step + // : Create an inverted version of the step. + // **`paramToJSON`**`(param: ?any) → ?Object + // : Serialize this step type's parameter to JSON. + // **`paramFromJSON`**`(schema: Schema, json: ?Object) → ?any + // : Deserialize this step type's parameter from JSON. }, { - key: "registry", - value: function registry(name, f) { - var attrsSeen = []; - for (var i = 0; i < 2; i++) { - var obj = i ? this.marks : this.nodes; - for (var tname in obj) { - var type = obj[tname]; - if (type.constructor.prototype.hasOwnProperty("registry")) { - var reg = type.registry[name]; - if (reg) for (var j = 0; j < reg.length; j++) { - f(reg[j], type); - } - } - for (var aname in type.attrs) { - var attr = type.attrs[aname], - reg = attr.registry[name]; - if (reg && attrsSeen.indexOf(attr) == -1) { - attrsSeen.push(attr); - for (var j = 0; j < reg.length; j++) { - f(reg[j], attr); - } - } - } - } - } + key: "define", + value: function define(type, implementation) { + steps[type] = implementation; } }]); - return Schema; + return Step; })(); -exports.Schema = Schema; +exports.Step = Step; -},{"../util/error":66,"./fragment":44,"./mark":46,"./node":47}],50:[function(require,module,exports){ +var StepResult = function StepResult(doc) { + var map = arguments.length <= 1 || arguments[1] === undefined ? _map.nullMap : arguments[1]; + + _classCallCheck(this, StepResult); + + // :: Node The transformed document. + this.doc = doc; + // :: PosMap + // The position map that describes the correspondence between the + // old and the new document. + this.map = map; +}; + +exports.StepResult = StepResult; + +var steps = Object.create(null); + +},{"../model":27,"./map":41}],46:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -11383,2949 +12389,2024 @@ var _createClass = (function () { }; })(); -exports.fromDOM = fromDOM; -exports.fromHTML = fromHTML; - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _model = require("../model"); - -var _index = require("./index"); - -// :: (Schema, DOMNode, ?Object) → Node -// Parse document from the content of a DOM node. To pass an explicit -// parent document (for example, when not in a browser window -// environment, where we simply use the global document), pass it as -// the `document` property of `options`. - -function fromDOM(schema, dom, options) { - if (!options) options = {}; - var context = new DOMParseState(schema, options.topNode || schema.node("doc"), options); - var start = options.from ? dom.childNodes[options.from] : dom.firstChild; - var end = options.to != null && dom.childNodes[options.to] || null; - context.addAll(start, end, true); - var doc = undefined; - while (context.stack.length) doc = context.leave(); - return doc; -} - -// ;; #path=DOMParseSpec #kind=interface #toc=false -// To define the way [node](#NodeType) and [mark](#MarkType) types are -// parsed, you can associate one or more DOM parsing specifications to -// them using the [`register`](#NodeType.register) method with the -// `parseDOM` property name. Each of them defines a parsing strategy -// for a certain type of DOM node. -// -// Note that `Attribute`s may also contain a `parseDOM` property, -// which should _not_ be a `DOMParseSpec`, but simply a function that -// computes the attribute's value from a DOM node. - -// :: ?string #path=DOMParseSpec.tag -// The (lower-case) tag name for which to activate this parser. When -// not given, it is activated for all nodes. +var _step2 = require("./step"); -// :: ?number #path=DOMParseSpec.rank -// The precedence of this parsing strategy. Should be a number between -// 0 and 100, which determines when this parser gets a chance relative -// to others that apply to the node (low ranks go first). Defaults to -// 50. +var _map = require("./map"); -// :: union #path=DOMParseSpec.parse -// The function that, given a DOM node, parses it, updating the parse -// state. It should return (the exact value) `false` when it wants to -// indicate that it was not able to parse this node. This function is -// called in such a way that `this` is bound to the type that the -// parse spec was associated with. -// -// When this is set to the string `"block"`, the content of the DOM -// node is parsed as the content in a node of the type that this spec -// was associated with. +// ;; A change to a document often consists of a series of +// [steps](#Step). This class provides a convenience abstraction to +// build up and track such an array of steps. A `Transform` object +// implements `Mappable`. // -// When set to the string `"mark"`, the content of the DOM node is -// parsed with an instance of the mark that this spec was associated -// with added to their marks. - -(0, _index.defineSource)("dom", fromDOM); - -// :: (Schema, string, ?Object) → Node -// Parses the HTML into a DOM, and then calls through to `fromDOM`. - -function fromHTML(schema, html, options) { - var wrap = (options && options.document || window.document).createElement("div"); - wrap.innerHTML = html; - return fromDOM(schema, wrap, options); -} - -(0, _index.defineSource)("html", fromHTML); - -var blockElements = { - address: true, article: true, aside: true, blockquote: true, canvas: true, - dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true, - footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true, - h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true, - output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true -}; - -var noMarks = []; +// The high-level transforming methods return the `Transform` object +// itself, so that they can be chained. -// ;; #toc=false A state object used to track context during a parse, -// and to expose methods to custom parsing functions. +var Transform = (function () { + // :: (Node) + // Create a transformation that starts with the given document. -var DOMParseState = (function () { - function DOMParseState(schema, topNode, options) { - _classCallCheck(this, DOMParseState); + function Transform(doc) { + _classCallCheck(this, Transform); - // :: Object The options passed to this parse. - this.options = options || {}; - // :: Schema The schema that we are parsing into. - this.schema = schema; - this.stack = []; - this.marks = noMarks; - this.closing = false; - this.enter(topNode.type, topNode.attrs); - this.nodeInfo = nodeInfo(schema); + // :: [Step] + // The accumulated steps. + this.steps = []; + // :: [Node] + // The individual document versions. Always has a length one more + // than `steps`, since it also includes the original starting + // document. + this.docs = [doc]; + // :: [PosMap] + // The position maps produced by the steps. Has the same length as + // `steps`. + this.maps = []; } - _createClass(DOMParseState, [{ - key: "parseAttrs", - value: function parseAttrs(dom, type, attrs) { - for (var attr in type.attrs) { - var desc = type.attrs[attr]; - if (desc.parseDOM && (!attrs || !Object.prototype.hasOwnProperty.call(attrs, attr))) { - var value = desc.parseDOM(dom, this.options, desc, type); - if (value != null) { - if (!attrs) attrs = {}; - attrs[attr] = value; - } - } - } - return attrs; - } - }, { - key: "addDOM", - value: function addDOM(dom) { - if (dom.nodeType == 3) { - // FIXME define a coherent strategy for dealing with trailing, leading, and multiple spaces (this isn't one) - var value = dom.nodeValue; - var _top = this.top, - last = undefined; - if (/\S/.test(value) || _top.type.isTextblock) { - value = value.replace(/\s+/g, " "); - if (/^\s/.test(value) && (last = _top.content[_top.content.length - 1]) && last.type.name == "text" && /\s$/.test(last.text)) value = value.slice(1); - if (value) this.insert(this.schema.text(value, this.marks)); - } - } else if (dom.nodeType != 1 || dom.hasAttribute("pm-ignore")) { - // Ignore non-text non-element nodes - } else if (!this.parseNodeType(dom)) { - this.addAll(dom.firstChild, null); - var _name = dom.nodeName.toLowerCase(); - if (blockElements.hasOwnProperty(_name) && this.top.type == this.schema.defaultTextblockType()) this.closing = true; - } - } - }, { - key: "tryParsers", - value: function tryParsers(parsers, dom) { - if (parsers) for (var i = 0; i < parsers.length; i++) { - var parser = parsers[i]; - if (parser.parse.call(parser.type, dom, this) !== false) return true; - } - } - }, { - key: "parseNodeType", - value: function parseNodeType(dom) { - return this.tryParsers(this.nodeInfo[dom.nodeName.toLowerCase()], dom) || this.tryParsers(this.nodeInfo._, dom); - } - }, { - key: "addAll", - value: function addAll(from, to, sync) { - var stack = sync && this.stack.slice(); - for (var dom = from; dom != to; dom = dom.nextSibling) { - this.addDOM(dom); - if (sync && blockElements.hasOwnProperty(dom.nodeName.toLowerCase())) this.sync(stack); - } - } - }, { - key: "doClose", - value: function doClose() { - if (!this.closing || this.stack.length < 2) return; - var left = this.leave(); - this.enter(left.type, left.attrs); - this.closing = false; - } - }, { - key: "insert", - value: function insert(node) { - if (this.top.type.canContain(node)) { - this.doClose(); - } else { - for (var i = this.stack.length - 1; i >= 0; i--) { - var route = this.stack[i].type.findConnection(node.type); - if (!route) continue; - if (i == this.stack.length - 1) { - this.doClose(); - } else { - while (this.stack.length > i + 1) this.leave(); - } - for (var j = 0; j < route.length; j++) { - this.enter(route[j]); - }if (this.marks.length) this.marks = noMarks; - break; - } + // :: Node + // The current version of the transformed document. + + _createClass(Transform, [{ + key: "step", + + // :: (Step) → ?StepResult + // Add a step to this transformation. If the step can be + // [applied](#Step.apply) to the current document, the result of + // applying it is returned, and an element is added to the + // [`steps`](#Transform.steps), [`docs`](#Transform.docs), and + // [`maps`](#Transform.maps) arrays. + value: function step(_step, from, to, pos, param) { + if (typeof _step == "string") _step = new _step2.Step(_step, from, to, pos, param); + var result = _step.apply(this.doc); + if (result) { + this.steps.push(_step); + this.maps.push(result.map); + this.docs.push(result.doc); } - this.top.content.push(node); - return node; + return result; } - // :: (DOMNode, NodeType, ?Object, [Node]) → Node - // Insert a node of the given type, with the given content, based on - // `dom`, at the current position in the document. - }, { - key: "insertFrom", - value: function insertFrom(dom, type, attrs, content) { - return this.insert(type.createAutoFill(this.parseAttrs(dom, type, attrs), content, this.marks)); - } - }, { - key: "enter", - value: function enter(type, attrs) { - if (this.marks.length) this.marks = noMarks; - this.stack.push({ type: type, attrs: attrs, content: [] }); - } - }, { - key: "enterFrom", - value: function enterFrom(dom, type, attrs) { - this.enter(type, this.parseAttrs(dom, type, attrs)); - } - }, { - key: "leave", - value: function leave() { - var top = this.stack.pop(); - var node = top.type.createAutoFill(top.attrs, top.content); - if (this.stack.length) this.insert(node); - return node; - } + // :: (Pos, ?number) → MapResult + // Map a position through the whole transformation (all the position + // maps in [`maps`](#Transform.maps)), and return the result. }, { - key: "sync", - value: function sync(stack) { - while (this.stack.length > stack.length) this.leave(); - for (;;) { - var n = this.stack.length - 1, - one = this.stack[n], - two = stack[n]; - if (one.type == two.type && _model.Node.sameAttrs(one.attrs, two.attrs)) break; - this.leave(); - } - while (stack.length > this.stack.length) { - var add = stack[this.stack.length]; - this.enter(add.type, add.attrs); + key: "map", + value: function map(pos, bias) { + var deleted = false; + for (var i = 0; i < this.maps.length; i++) { + var result = this.maps[i].map(pos, bias); + pos = result.pos; + if (result.deleted) deleted = true; } - if (this.marks.length) this.marks = noMarks; - this.closing = false; + return new _map.MapResult(pos, deleted); } - - // :: (DOMNode, NodeType, ?Object) - // Parse the contents of `dom` as children of a node of the given - // type. }, { - key: "wrapIn", - value: function wrapIn(dom, type, attrs) { - this.enterFrom(dom, type, attrs); - this.addAll(dom.firstChild, null, true); - this.leave(); + key: "doc", + get: function get() { + return this.docs[this.docs.length - 1]; } - // :: (DOMNode, Mark) - // Parse the contents of `dom`, with `mark` added to the set of - // current marks. - }, { - key: "wrapMark", - value: function wrapMark(dom, mark) { - var old = this.marks; - this.marks = (mark.instance || mark).addToSet(old); - this.addAll(dom.firstChild, null); - this.marks = old; - } + // :: Node + // The original input document. }, { - key: "top", + key: "before", get: function get() { - return this.stack[this.stack.length - 1]; + return this.docs[0]; } }]); - return DOMParseState; + return Transform; })(); -function nodeInfo(schema) { - return schema.cached.parseDOMNodes || (schema.cached.parseDOMNodes = summarizeNodeInfo(schema)); +exports.Transform = Transform; + +},{"./map":41,"./step":45}],47:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.copyStructure = copyStructure; +exports.copyInline = copyInline; +exports.isFlatRange = isFlatRange; +exports.replaceHasEffect = replaceHasEffect; +exports.samePathDepth = samePathDepth; + +var _model = require("../model"); + +function copyStructure(node, from, to, f) { + var depth = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4]; + + if (node.isTextblock) { + return f(node, from ? from.offset : 0, to ? to.offset : node.size); + } else { + if (!node.size) return node; + var start = from ? from.path[depth] : 0; + var end = to ? to.path[depth] + 1 : node.size; + var content = node.content.toArray(0, start); + for (var iter = node.iter(start, end), child = undefined; child = iter.next().value;) { + var passFrom = iter.offset - child.width == start ? from : null; + var passTo = iter.offset == end ? to : null; + content.push(copyStructure(child, passFrom, passTo, f, depth + 1)); + } + return node.copy(_model.Fragment.fromArray(content.concat(node.content.toArray(end)))); + } } -function summarizeNodeInfo(schema) { - var tags = Object.create(null); - tags._ = []; - schema.registry("parseDOM", function (info, type) { - var tag = info.tag || "_"; - var parse = info.parse; - if (parse == "block") parse = function (dom, state) { - state.wrapIn(dom, this); - };else if (parse == "mark") parse = function (dom, state) { - state.wrapMark(dom, this); - };(tags[tag] || (tags[tag] = [])).push({ - type: type, parse: parse, - rank: info.rank == null ? 50 : info.rank - }); - }); - for (var tag in tags) { - tags[tag].sort(function (a, b) { - return a.rank - b.rank; - }); - }return tags; +function copyInline(node, from, to, f) { + return node.splice(from, to, node.content.slice(from, to).map(f)); } -_model.Paragraph.register("parseDOM", { tag: "p", parse: "block" }); +function isFlatRange(from, to) { + if (from.path.length != to.path.length) return false; + for (var i = 0; i < from.path.length; i++) { + if (from.path[i] != to.path[i]) return false; + }return from.offset <= to.offset; +} -_model.BlockQuote.register("parseDOM", { tag: "blockquote", parse: "block" }); +function canBeJoined(node, offset, depth) { + if (!depth || offset == 0 || offset == node.size) return false; + var left = node.child(offset - 1), + right = node.child(offset); + return left.sameMarkup(right); +} -var _loop = function _loop(i) { - _model.Heading.register("parseDOM", { - tag: "h" + i, - parse: function parse(dom, state) { - state.wrapIn(dom, this, { level: i }); +function replaceHasEffect(doc, from, to) { + for (var depth = 0, node = doc;; depth++) { + var fromEnd = depth == from.depth, + toEnd = depth == to.depth; + if (fromEnd || toEnd || from.path[depth] != to.path[depth]) { + var gapStart = undefined, + gapEnd = undefined; + if (fromEnd) { + gapStart = from.offset; + } else { + gapStart = from.path[depth] + 1; + for (var i = depth + 1, n = node.child(gapStart - 1); i <= from.path.length; i++) { + if (i == from.path.length) { + if (from.offset < n.size) return true; + } else { + if (from.path[i] + 1 < n.size) return true; + n = n.child(from.path[i]); + } + } + } + if (toEnd) { + gapEnd = to.offset; + } else { + gapEnd = to.path[depth]; + for (var i = depth + 1; i <= to.path.length; i++) { + if ((i == to.path.length ? to.offset : to.path[i]) > 0) return true; + } + } + if (gapStart != gapEnd) return true; + return canBeJoined(node, gapStart, Math.min(from.depth, to.depth) - depth); + } else { + node = node.child(from.path[depth]); } - }); -}; + } +} -for (var i = 1; i <= 6; i++) { - _loop(i); -}_model.HorizontalRule.register("parseDOM", { tag: "hr", parse: "block" }); +function samePathDepth(a, b) { + for (var i = 0;; i++) { + if (i == a.path.length || i == b.path.length || a.path[i] != b.path[i]) return i; + } +} -_model.CodeBlock.register("parseDOM", { tag: "pre", parse: function parse(dom, state) { - var params = dom.firstChild && /^code$/i.test(dom.firstChild.nodeName) && dom.firstChild.getAttribute("class"); - if (params && /fence/.test(params)) { - var found = [], - re = /(?:^|\s)lang-(\S+)/g, - m = undefined; - while (m = re.test(params)) found.push(m[1]); - params = found.join(" "); +},{"../model":27}],48:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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(_x, _x2, _x3) { + var _again = true;_function: while (_again) { + var object = _x, + property = _x2, + receiver = _x3;_again = false;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 { + _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; + } + } else if ("value" in desc) { + return desc.value; } else { - params = null; + var getter = desc.get;if (getter === undefined) { + return undefined; + }return getter.call(receiver); } - var text = dom.textContent; - state.insertFrom(dom, this, { params: params }, text ? [state.schema.text(text)] : []); - } }); - -_model.BulletList.register("parseDOM", { tag: "ul", parse: "block" }); + } +}; -_model.OrderedList.register("parseDOM", { tag: "ol", parse: function parse(dom, state) { - var attrs = { order: dom.getAttribute("start") || 1 }; - state.wrapIn(dom, this, attrs); - } }); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -_model.ListItem.register("parseDOM", { tag: "li", parse: "block" }); +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; +} -_model.HardBreak.register("parseDOM", { tag: "br", parse: function parse(dom, state) { - state.insertFrom(dom, this); - } }); +var ProseMirrorError = (function (_Error) { + _inherits(ProseMirrorError, _Error); -_model.Image.register("parseDOM", { tag: "img", parse: function parse(dom, state) { - state.insertFrom(dom, this, { - src: dom.getAttribute("src"), - title: dom.getAttribute("title") || null, - alt: dom.getAttribute("alt") || null - }); - } }); + function ProseMirrorError(message) { + _classCallCheck(this, ProseMirrorError); -// Inline style tokens + _get(Object.getPrototypeOf(ProseMirrorError.prototype), "constructor", this).call(this, message); + if (this.message != message) { + this.message = message; + if (Error.captureStackTrace) Error.captureStackTrace(this, this.name);else this.stack = new Error(message).stack; + } + } -_model.LinkMark.register("parseDOM", { tag: "a", parse: function parse(dom, state) { - var href = dom.getAttribute("href"); - if (!href) return false; - state.wrapMark(dom, this.create({ href: href, title: dom.getAttribute("title") })); - } }); + _createClass(ProseMirrorError, [{ + key: "name", + get: function get() { + return this.constructor.name || functionName(this.constructor) || "ProseMirrorError"; + } + }], [{ + key: "raise", + value: function raise(message) { + throw new this(message); + } + }]); -_model.EmMark.register("parseDOM", { tag: "i", parse: "mark" }); -_model.EmMark.register("parseDOM", { tag: "em", parse: "mark" }); + return ProseMirrorError; +})(Error); -_model.StrongMark.register("parseDOM", { tag: "b", parse: "mark" }); -_model.StrongMark.register("parseDOM", { tag: "strong", parse: "mark" }); +exports.ProseMirrorError = ProseMirrorError; -_model.CodeMark.register("parseDOM", { tag: "code", parse: "mark" }); +function functionName(f) { + var match = /^function (\w+)/.exec(f.toString()); + return match && match[1]; +} -},{"../model":45,"./index":51}],51:[function(require,module,exports){ -// !! This module implements a way to register and access parsers from -// various input formats to ProseMirror's [document format](#Node). To -// load the actual parsers, you need to import parser modules like -// `parse/dom` or `parse/markdown`, which will then register -// themselves here, as well as export special-purpose parsing -// functions. -// -// These are the parses in the distribution: -// -// **`"json"`** -// : The top-level module defines a single parser `"json"`, which -// uses `Node.fromJSON` to parse JSON data. -// -// **`"dom"`** -// : Parses [DOM -// nodes](https://developer.mozilla.org/en-US/docs/Web/API/Node). -// Defined in `parse/dom`. See `fromDOM`. -// -// **`"html"`** -// : Parses strings of HTML content. Defined in `parse/dom`. -// -// **`"markdown"`** -// : Parses strings of -// [CommonMark](http://commonmark.org/)-formatted text. Defined in -// `parse/markdown`. See `fromMarkdown`. -// -// **`"text"`** -// : Simply splits a string of text on blank lines and creates a -// document containing those lines as paragraphs. Defined in -// `parse/text`. See `fromText`. +},{}],49:[function(require,module,exports){ +// ;; #path=EventMixin #kind=interface +// A set of methods for objects that emit events. Added by calling +// `eventMixin` on a constructor. "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseFrom = parseFrom; -exports.knownSource = knownSource; -exports.defineSource = defineSource; -var parsers = Object.create(null); +exports.eventMixin = eventMixin; +var methods = { + // :: (type: string, handler: (...args: [any])) #path=EventMixin.on + // Register an event handler for the given event type. + on: function on(type, f) { + var map = this._handlers || (this._handlers = {}); + var arr = map[type] || (map[type] = []); + arr.push(f); + }, -// :: (Schema, any, string, ?Object) → Node -// Parse document `value` from the format named by `format`. If -// `options` is given, it is passed along to the parser function. + // :: (type: string, handler: (...args: [any])) #path=EventMixin.off + // Unregister an event handler for the given event type. + off: function off(type, f) { + var arr = this._handlers && this._handlers[type]; + if (arr) for (var i = 0; i < arr.length; ++i) { + if (arr[i] == f) { + arr.splice(i, 1);break; + } + } + }, -function parseFrom(schema, value, format, options) { - var converter = parsers[format]; - if (!converter) throw new Error("Source format " + format + " not defined"); - return converter(schema, value, options); -} + // :: (type: string, ...args: [any]) #path=EventMixin.signal + // Signal an event of the given type, passing any number of + // arguments. Will call the handlers for the event, passing them the + // arguments. + signal: function signal(type) { + var arr = this._handlers && this._handlers[type]; -// :: (string) → bool -// Query whether a parser for the named format has been registered. + for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + values[_key - 1] = arguments[_key]; + } -function knownSource(format) { - return !!parsers[format]; -} + if (arr) for (var i = 0; i < arr.length; ++i) { + arr[i].apply(arr, values); + } + }, -// :: (string, (Schema, any, ?Object) → Node) -// Register a parser function for `format`. + // :: (type: string, ...args: [any]) #path=EventMixin.signalHandleable + // Signal a handleable event of the given type. All handlers for the + // event will be called with the given arguments, until one of them + // returns something that is not the value `false`. When that + // happens, the return value of that handler is returned. If that + // does not happen, `false` is returned. + signalHandleable: function signalHandleable(type) { + var arr = this._handlers && this._handlers[type]; + if (arr) { + for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + values[_key2 - 1] = arguments[_key2]; + } -function defineSource(format, func) { - parsers[format] = func; -} + for (var i = 0; i < arr.length; ++i) { + var result = arr[i].apply(arr, values); + if (result !== false) return result; + } + }return false; + }, -defineSource("json", function (schema, json) { - return schema.nodeFromJSON(json); -}); + // :: (type: string) → bool #path=EventMixin.hasHandler + // Query whether there are any handlers for this event type. + hasHandler: function hasHandler(type) { + var arr = this._handlers && this._handlers[type]; + return arr && arr.length > 0; + } +}; -},{}],52:[function(require,module,exports){ +// :: (()) +// Add the methods in the `EventMixin` interface to the prototype +// object of the given constructor. + +function eventMixin(ctor) { + var proto = ctor.prototype; + for (var prop in methods) if (methods.hasOwnProperty(prop)) proto[prop] = methods[prop]; +} + +},{}],50:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.fromText = fromText; -var _index = require("./index"); +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; + }; +})(); -// FIXME is it meaningful to try and attach text-parsing information -// to node types? +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} -// :: (Schema, string) → Node -// Convert a string into a simple ProseMirror document. +var Map = window.Map || (function () { + function _class() { + _classCallCheck(this, _class); -function fromText(schema, text) { - var blocks = text.trim().split(/\n{2,}/); - var nodes = []; - for (var i = 0; i < blocks.length; i++) { - var spans = []; - var parts = blocks[i].split("\n"); - for (var j = 0; j < parts.length; j++) { - if (j) spans.push(schema.node("hard_break")); - if (parts[j]) spans.push(schema.text(parts[j])); + this.content = []; + } + + _createClass(_class, [{ + key: "set", + value: function set(key, value) { + var found = this.find(key); + if (found > -1) this.content[found + 1] = value;else this.content.push(key, value); + } + }, { + key: "get", + value: function get(key) { + var found = this.find(key); + return found == -1 ? undefined : this.content[found + 1]; + } + }, { + key: "has", + value: function has(key) { + return this.find(key) > -1; + } + }, { + key: "find", + value: function find(key) { + for (var i = 0; i < this.content.length; i += 2) { + if (this.content[i] === key) return i; + } } - nodes.push(schema.node("paragraph", null, spans)); - } - if (!nodes.length) nodes.push(schema.node("paragraph")); - return schema.node("doc", null, nodes); -} + }, { + key: "clear", + value: function clear() { + this.content.length = 0; + } + }, { + key: "size", + get: function get() { + return this.content.length / 2; + } + }]); -(0, _index.defineSource)("text", fromText); + return _class; +})(); +exports.Map = Map; -},{"./index":51}],53:[function(require,module,exports){ +},{}],51:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports["default"] = sortedInsert; -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; - }; -})(); +function sortedInsert(array, elt, compare) { + var i = 0; + for (; i < array.length; i++) if (compare(array[i], elt) > 0) break; + array.splice(i, 0, elt); +} -exports.toDOM = toDOM; -exports.renderNodeToDOM = renderNodeToDOM; -exports.toHTML = toHTML; +module.exports = exports["default"]; -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} +},{}],52:[function(require,module,exports){ +"use strict"; -var _model = require("../model"); +var _gitProsemirrorDistEdit = require("../../../git/prosemirror/dist/edit"); -var _index = require("./index"); +var _gitProsemirrorDistDom = require("../../../git/prosemirror/dist/dom"); -// ;; #toc=false Object used to to expose relevant values and methods -// to DOM serializer functions. +require("../../../git/prosemirror/dist/menu/tooltipmenu"); -var DOMSerializer = (function () { - function DOMSerializer(options) { - _classCallCheck(this, DOMSerializer); +require("../../../git/prosemirror/dist/menu/menubar"); - // :: Object The options passed to the serializer. - this.options = options || {}; - // :: DOMDocument The DOM document in which we are working. - this.doc = this.options.document || window.document; - } +require("../../../git/prosemirror/dist/inputrules/autoinput"); - // :: (Node, ?Object) → DOMFragment - // Serialize the content of the given node to a DOM fragment. When not - // in the browser, the `document` option, containing a DOM document, - // should be passed so that the serialize can create nodes. - // - // To define rendering behavior for your own [node](#NodeType) and - // [mark](#MarkType) types, give them a `serializeDOM` method. This - // method is passed a `Node` and a `DOMSerializer`, and should return - // the [DOM - // node](https://developer.mozilla.org/en-US/docs/Web/API/Node) that - // represents this node and its content. For marks, that should be an - // inline wrapping node like `` or ``. - // - // Individual attributes can also define serialization behavior. If an - // `Attribute` object has a `serializeDOM` method, that will be called - // with the DOM node representing the node that the attribute applies - // to and the atttribute's value, so that it can set additional DOM - // attributes on the DOM node. +var _gitProsemirrorDistModel = require("../../../git/prosemirror/dist/model"); - // :: (string, ?Object, ...union) → DOMNode - // Create a DOM node of the given type, with (optionally) the given - // attributes and content. Content elements may be strings (for text - // nodes) or other DOM nodes. +var _widgets = require("./widgets"); - _createClass(DOMSerializer, [{ - key: "elt", - value: function elt(type, attrs) { - var result = this.doc.createElement(type); - if (attrs) for (var _name in attrs) { - if (_name == "style") result.style.cssText = attrs[_name];else if (attrs[_name]) result.setAttribute(_name, attrs[_name]); - } +var widgetsSpec = new _gitProsemirrorDistModel.SchemaSpec({ + doc: _gitProsemirrorDistModel.Doc, + blockquote: _gitProsemirrorDistModel.BlockQuote, + ordered_list: _gitProsemirrorDistModel.OrderedList, + bullet_list: _gitProsemirrorDistModel.BulletList, + list_item: _gitProsemirrorDistModel.ListItem, + horizontal_rule: _gitProsemirrorDistModel.HorizontalRule, - for (var _len = arguments.length, content = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - content[_key - 2] = arguments[_key]; - } + paragraph: _gitProsemirrorDistModel.Paragraph, + heading: _gitProsemirrorDistModel.Heading, - for (var i = 0; i < content.length; i++) { - result.appendChild(typeof content[i] == "string" ? this.doc.createTextNode(content[i]) : content[i]); - }return result; - } - }, { - key: "renderNode", - value: function renderNode(node, offset) { - var dom = node.type.serializeDOM(node, this); - for (var attr in node.type.attrs) { - var desc = node.type.attrs[attr]; - if (desc.serializeDOM) desc.serializeDOM(dom, node.attrs[attr], this, node); - } - if (this.options.onRender) dom = this.options.onRender(node, dom, offset) || dom; - return dom; - } - }, { - key: "renderContent", - value: function renderContent(node, where) { - if (!where) where = this.doc.createDocumentFragment(); - if (!node.isTextblock) this.renderBlocksInto(node, where);else if (this.options.renderInlineFlat) this.renderInlineFlatInto(node, where);else this.renderInlineInto(node, where); - return where; - } - }, { - key: "renderBlocksInto", - value: function renderBlocksInto(parent, where) { - for (var i = parent.iter(), child = undefined; child = i.next().value;) { - if (this.options.path) this.options.path.push(i.offset - child.width); - where.appendChild(this.renderNode(child, i.offset - child.width)); - if (this.options.path) this.options.path.pop(); - } - } - }, { - key: "renderInlineInto", - value: function renderInlineInto(parent, where) { - var _this = this; + text: _gitProsemirrorDistModel.Text, + image: _widgets.Image, + hard_break: _gitProsemirrorDistModel.HardBreak, - var top = where; - var active = []; - parent.forEach(function (node, offset) { - var keep = 0; - for (; keep < Math.min(active.length, node.marks.length); ++keep) if (!node.marks[keep].eq(active[keep])) break; - while (keep < active.length) { - active.pop(); - top = top.parentNode; - } - while (active.length < node.marks.length) { - var add = node.marks[active.length]; - active.push(add); - top = top.appendChild(_this.renderMark(add)); - } - top.appendChild(_this.renderNode(node, offset)); - }); - } - }, { - key: "renderInlineFlatInto", - value: function renderInlineFlatInto(parent, where) { - var _this2 = this; + input: _widgets.Input, + textfield: _widgets.TextField, + textarea: _widgets.TextArea, + checkbox: _widgets.CheckBox, + radiobutton: _widgets.RadioButton, + select: _widgets.Select, + inlinemath: _widgets.InlineMath, + blockmath: _widgets.BlockMath, + iframe: _widgets.IFrame, + carryforward: _widgets.CarryForward, + choice: _widgets.Choice, + multiplechoice: _widgets.MultipleChoice, + scale: _widgets.Scale, + checkitem: _widgets.CheckItem, + checklist: _widgets.CheckList, + spreadsheet: _widgets.SpreadSheet, + widget: _widgets.Widget +}, { + em: _gitProsemirrorDistModel.EmMark, + strong: _gitProsemirrorDistModel.StrongMark, + link: _gitProsemirrorDistModel.LinkMark, + code: _gitProsemirrorDistModel.CodeMark +}); - parent.forEach(function (node, start) { - var dom = _this2.renderNode(node, start); - dom = _this2.wrapInlineFlat(dom, node.marks); - dom = _this2.options.renderInlineFlat(node, dom, start) || dom; - where.appendChild(dom); - }); - } - }, { - key: "renderMark", - value: function renderMark(mark) { - var dom = mark.type.serializeDOM(mark, this); - for (var attr in mark.type.attrs) { - var desc = mark.type.attrs[attr]; - if (desc.serializeDOM) desc.serializeDOM(dom, mark.attrs[attr], this); - } - return dom; - } - }, { - key: "wrapInlineFlat", - value: function wrapInlineFlat(dom, marks) { - for (var i = marks.length - 1; i >= 0; i--) { - var wrap = this.renderMark(marks[i]); - wrap.appendChild(dom); - dom = wrap; - } - return dom; - } +var widgetSchema = new _gitProsemirrorDistModel.Schema(widgetsSpec); - // :: (Node, string, ?Object) → DOMNode - // Render the content of ProseMirror node into a DOM node with the - // given tag name and attributes. - }, { - key: "renderAs", - value: function renderAs(node, tagName, tagAttrs) { - return this.renderContent(node, this.elt(tagName, tagAttrs)); - } - }]); +var pm = window.pm = new _gitProsemirrorDistEdit.ProseMirror({ + place: document.querySelector("#editor"), + menuBar: true, + doc: document.querySelector("#content").innerHTML, + docFormat: "html", + schema: widgetSchema, + autoInput: true +}); - return DOMSerializer; -})(); +(0, _gitProsemirrorDistDom.insertCSS)("\n\t\t\ndiv.ProseMirror-select-menu {\n position: absolute;\n background: #EEE;\n color: black;\n padding: 2px 2px;\n z-index: 15;\n}\n\ndiv.ProseMirror-select-menu div {\n cursor: pointer;\n padding: 0 1em 0 2px;\n}\n\ndiv.ProseMirror-select-menu div:hover {\n background: white;\n}\n\ndiv.ProseMirror-menu form {\n\tbackground: #EEE;\n\twidth: 300px;\n\tborder: 1px solid #AAA\n}\n\ndiv.ProseMirror-menu form select {\n\tbackground: white;\n}\n\ndiv.ProseMirror-menubar-sliding {\n -webkit-transition: right 0.2s ease-out;\n -moz-transition: right 0.2s ease-out;\n transition: right 0.2s ease-out;\n position: relative;\n left: 100%;\n width: 100%;\n box-sizing: -moz-border-box;\n box-sizing: border-box;\n padding-left: 16px;\n background: white;\n}\n\n\n"); -function toDOM(node) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; +},{"../../../git/prosemirror/dist/dom":1,"../../../git/prosemirror/dist/edit":9,"../../../git/prosemirror/dist/inputrules/autoinput":16,"../../../git/prosemirror/dist/menu/menubar":20,"../../../git/prosemirror/dist/menu/tooltipmenu":22,"../../../git/prosemirror/dist/model":27,"./widgets":60}],53:[function(require,module,exports){ +"use strict"; - return new DOMSerializer(options).renderContent(node); -} +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.defParser = defParser; +exports.defParamsClick = defParamsClick; -(0, _index.defineTarget)("dom", toDOM); +var _gitProsemirrorDistMenuMenu = require("../../../../git/prosemirror/dist/menu/menu"); -// :: (Node, ?Object) → DOMNode -// Serialize a given node to a DOM node. This is useful when you need -// to serialize a part of a document, as opposed to the whole -// document. +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -function renderNodeToDOM(node, options, offset) { - var serializer = new DOMSerializer(options); - var dom = serializer.renderNode(node, offset); - if (node.isInline) { - dom = serializer.wrapInlineFlat(dom, node.marks); - if (serializer.options.renderInlineFlat) dom = options.renderInlineFlat(node, dom, offset) || dom; - } - return dom; -} +var _gitProsemirrorDistEditSelection = require("../../../../git/prosemirror/dist/edit/selection"); -// :: (Node, ?Object) → string -// Serialize a node as an HTML string. Goes through `toDOM` and then -// serializes the result. Again, you must pass a `document` option -// when not in the browser. +var andScroll = { scrollIntoView: true }; + +exports.andScroll = andScroll; +MathJax.Hub.Queue(function () { + MathJax.Hub.Config({ + tex2jax: { + displayMath: [["\\[", "\\]"]], + inlineMath: [["\\(", "\\)"]], + processEscapes: true + }, + displayAlign: "left" + }); +}); -function toHTML(node, options) { - var serializer = new DOMSerializer(options); - var wrap = serializer.elt("div"); - wrap.appendChild(serializer.renderContent(node)); - return wrap.innerHTML; +function defParser(type, tag, cls) { + type.register("parseDOM", { + tag: tag, + rank: 25, + parse: function parse(dom, context, type, attrs) { + var contains = dom.classList.contains(cls); + if (!contains) return false; + context.insertFrom(dom, type, attrs); + } + }); } -(0, _index.defineTarget)("html", toHTML); +function selectClickedNode(pm, e) { + var pos = (0, _gitProsemirrorDistEditSelection.selectableNodeAbove)(pm, e.target, { left: e.clientX, top: e.clientY }, true); + if (!pos) return pm.sel.pollForUpdate(); -// Block nodes + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; -function def(cls, method) { - cls.prototype.serializeDOM = method; + if (node && pos.depth >= from.depth && pos.shorten(from.depth).cmp(from) == 0) { + if (from.depth == 0) return pm.sel.pollForUpdate(); + pos = from.shorten(); + } + + pm.setNodeSelection(pos); + pm.focus(); + e.preventDefault(); } -def(_model.BlockQuote, function (node, s) { - return s.renderAs(node, "blockquote"); -}); +function defParamsClick(type) { + type.prototype.handleClick = function (pm, e, path, node) { + var menu = pm.mod.menuBar.menu; + var cmd = pm.commands["insert" + type.name]; + if (menu && cmd) { + selectClickedNode(pm, e); + menu.enter((0, _gitProsemirrorDistMenuMenu.readParams)(cmd)); + return true; + } else return false; + }; +} -_model.BlockQuote.prototype.countCoordsAsChild = function (_, path, dom, coords) { - var childBox = dom.firstChild.getBoundingClientRect(); - if (coords.left < childBox.left - 2) return _model.Pos.from(path); -}; +},{"../../../../git/prosemirror/dist/edit/selection":15,"../../../../git/prosemirror/dist/menu/menu":19,"../../../../git/prosemirror/dist/model":27}],54:[function(require,module,exports){ +"use strict"; -def(_model.BulletList, function (node, s) { - return s.renderAs(node, "ul"); +Object.defineProperty(exports, "__esModule", { + value: true }); -def(_model.OrderedList, function (node, s) { - return s.renderAs(node, "ol", { start: node.attrs.order != "1" && node.attrs.order }); -}); +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -_model.OrderedList.prototype.countCoordsAsChild = _model.BulletList.prototype.countCoordsAsChild = function (_, path, dom, coords) { - for (var i = 0; i < dom.childNodes.length; i++) { - var child = dom.childNodes[i]; - if (!child.hasAttribute("pm-offset")) continue; - var childBox = child.getBoundingClientRect(); - if (coords.left > childBox.left - 2) return null; - if (childBox.top <= coords.top && childBox.bottom >= coords.top) return new _model.Pos(path, i); - } -}; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -def(_model.ListItem, function (node, s) { - return s.renderAs(node, "li"); -}); +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; } -def(_model.HorizontalRule, function (_, s) { - return s.elt("hr"); -}); +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -def(_model.Paragraph, function (node, s) { - return s.renderAs(node, "p"); -}); +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -def(_model.Heading, function (node, s) { - return s.renderAs(node, "h" + node.attrs.level); -}); +var _utils = require("../utils"); -def(_model.CodeBlock, function (node, s) { - var code = s.renderAs(node, "code"); - if (node.attrs.params != null) code.className = "fence " + node.attrs.params.replace(/(^|\s+)/g, "$&lang-"); - return s.elt("pre", null, code); -}); +var BlockMath = (function (_Block) { + _inherits(BlockMath, _Block); -// Inline content + function BlockMath() { + _classCallCheck(this, BlockMath); -def(_model.Text, function (node, s) { - return s.doc.createTextNode(node.text); -}); + _get(Object.getPrototypeOf(BlockMath.prototype), "constructor", this).apply(this, arguments); + } -def(_model.Image, function (node, s) { - return s.elt("img", { - src: node.attrs.src, - alt: node.attrs.alt, - title: node.attrs.title - }); -}); + return BlockMath; +})(_gitProsemirrorDistModel.Block); -def(_model.HardBreak, function (_, s) { - return s.elt("br"); -}); +exports.BlockMath = BlockMath; -// Inline styles +BlockMath.attributes = { + tex: new _gitProsemirrorDistModel.Attribute({ "default": "" }) +}; -def(_model.EmMark, function (_, s) { - return s.elt("em"); -}); +(0, _utils.defParser)(BlockMath, "div", "widgets-blockmath"); -def(_model.StrongMark, function (_, s) { - return s.elt("strong"); -}); +BlockMath.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _gitProsemirrorDistDom.elt)("div", { "class": "widgets-blockmath" }, "\\[" + node.attrs.tex + "\\]"); + // wait until node is attached to document to render + MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); + } + return node.rendered; +}; -def(_model.CodeMark, function (_, s) { - return s.elt("code"); -}); +BlockMath.register("command", { + name: "insertBlockMath", + label: "BlockMath", + run: function run(pm, tex) { + return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); + }, + params: [{ label: "Latex Expression", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -def(_model.LinkMark, function (mark, s) { - return s.elt("a", { href: mark.attrs.href, - title: mark.attrs.title }); + if (node) return [node.attrs.tex]; + } }); -},{"../model":45,"./index":54}],54:[function(require,module,exports){ -// !! This module provides a way to register and access functions that -// serialize ProseMirror [documents](#Node) to various formats. To -// load the actual serializers, you need to include submodules of this -// module (or 3rd party serialization modules), which will register -// themselves to this module. -// -// These are the serializers defined: -// -// **`"json"`** -// : Use `Node.toJSON` to serialize the node as JSON. Defined by the -// top-level `serialize` module. -// -// **`"dom"`** -// : Serialize to a [DOM -// fragment](https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment). -// Defined in `serialize/dom`. See `toDOM`. -// -// **`"html"`** -// : Serialize to HTML text. Defined in `serialize/dom`. See `toHTML`. -// -// **`"markdown"`** -// : Serialize to [CommonMark](http://commonmark.org/) marked-up -// text. Defined in `serialize/markdown`. See `toMarkdown`. -// -// **`"text"`** -// : Serialize to plain text. Defined in `serialize/text`. See `toText`. +(0, _utils.defParamsClick)(BlockMath); +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-blockmath {}\n\n"); + +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],55:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -exports.serializeTo = serializeTo; -exports.knownTarget = knownTarget; -exports.defineTarget = defineTarget; -var serializers = Object.create(null); -// :: (Node, string, ?Object) → any -// Serialize the given document to the given format. If `options` is -// given, it will be passed along to the serializer function. +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -function serializeTo(doc, format, options) { - var converter = serializers[format]; - if (!converter) throw new Error("Target format " + format + " not defined"); - return converter(doc, options); -} +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -// :: (string) → bool -// Query whether a given serialization format has been registered. +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; } -function knownTarget(format) { - return !!serializers[format]; -} +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -// :: (string, (Node, ?Object) → any) -// Register a function as the serializer for `format`. +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -function defineTarget(format, func) { - serializers[format] = func; -} +var _utils = require("../utils"); -defineTarget("json", function (doc) { - return doc.toJSON(); -}); +var carryOptions = []; -},{}],55:[function(require,module,exports){ -"use strict"; +function getCarryOptions(names) { + return names.map(function (w) { + return { value: w, label: w }; + }); +} -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.toText = toText; +var CarryForward = (function (_Inline) { + _inherits(CarryForward, _Inline); -var _model = require("../model"); + function CarryForward() { + _classCallCheck(this, CarryForward); -var _index = require("./index"); + _get(Object.getPrototypeOf(CarryForward.prototype), "constructor", this).apply(this, arguments); + } -_model.Block.prototype.serializeText = function (node) { - var accum = ""; - node.forEach(function (child) { - return accum += child.type.serializeText(child); - }); - return accum; -}; + return CarryForward; +})(_gitProsemirrorDistModel.Inline); -_model.Textblock.prototype.serializeText = function (node) { - var text = _model.Block.prototype.serializeText(node); - return text && text + "\n\n"; -}; +exports.CarryForward = CarryForward; -_model.Inline.prototype.serializeText = function () { - return ""; +CarryForward.attributes = { + name: new _gitProsemirrorDistModel.Attribute() }; -_model.HardBreak.prototype.serializeText = function () { - return "\n"; -}; +(0, _utils.defParser)(CarryForward, "thinkspace", "widgets-carryforward"); -_model.Text.prototype.serializeText = function (node) { - return node.text; +CarryForward.prototype.serializeDOM = function (node) { + return (0, _gitProsemirrorDistDom.elt)("thinkspace", { "class": "widgets-carryforward", name: node.attrs.name }, (0, _gitProsemirrorDistDom.elt)("img", { src: "forward.png", width: 16, height: 16, title: "Carry forward " + node.attrs.name })); }; -// :: (Node) → string -// Serialize a node as a plain text string. - -function toText(doc) { - return doc.type.serializeText(doc).trim(); -} - -(0, _index.defineTarget)("text", toText); - -},{"../model":45,"./index":54}],56:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.canLift = canLift; -exports.canWrap = canWrap; - -var _model = require("../model"); +CarryForward.register("command", { + name: "insertCarryForward", + label: "CarryForward", + run: function run(pm, name) { + return pm.tr.replaceSelection(this.create({ name: name })).apply(_utils.andScroll); + }, + params: [{ label: "Input name", type: "select", options: carryOptions }], + prefillParams: function prefillParams(pm) { + pm.commands.insertCarryForward.spec.params[0].options = getCarryOptions(["test1", "test2"]); + var node = pm.selection.node; -var _transform = require("./transform"); + if (node) { + return [node.attrs.name]; + } + } +}); -var _step = require("./step"); +(0, _utils.defParamsClick)(CarryForward); -var _tree = require("./tree"); +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-carryforward {}\n\n"); -var _map = require("./map"); +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],56:[function(require,module,exports){ +"use strict"; -// !! **`ancestor`** -// : Change the stack of nodes that wrap the part of the document -// between `from` and `to`, which must point into the same parent -// node. -// -// The set of ancestors to replace is determined by the `depth` -// property of the step's parameter. If this is greater than -// zero, `from` and `to` must point at the start and end of a -// stack of nodes, of that depth, since this step will not split -// nodes. -// -// The set of new ancestors to wrap with is determined by the -// `types` and `attrs` properties of the parameter. The first -// should be an array of `NodeType`s, and the second, optionally, -// an array of attribute objects. +Object.defineProperty(exports, "__esModule", { + value: true +}); -_step.Step.define("ancestor", { - apply: function apply(doc, step) { - var from = step.from, - to = step.to; - if (!(0, _tree.isFlatRange)(from, to)) return null; - var toParent = from.path, - start = from.offset, - end = to.offset; - var _step$param = step.param; - var _step$param$depth = _step$param.depth; - var depth = _step$param$depth === undefined ? 0 : _step$param$depth; - var _step$param$types = _step$param.types; - var types = _step$param$types === undefined ? [] : _step$param$types; - var _step$param$attrs = _step$param.attrs; - var attrs = _step$param$attrs === undefined ? [] : _step$param$attrs; +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - var inner = doc.path(from.path); - for (var i = 0; i < depth; i++) { - if (start > 0 || end < doc.path(toParent).size || toParent.length == 0) return null; - start = toParent[toParent.length - 1]; - end = start + 1; - toParent = toParent.slice(0, toParent.length - 1); - } - if (depth == 0 && types.length == 0) return null; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var parent = doc.path(toParent), - parentSize = parent.size, - newParent = undefined; - if (parent.type.locked) return null; - if (types.length) { - var _ret = (function () { - var lastWrapper = types[types.length - 1]; - var content = inner.content.slice(from.offset, to.offset); - if (!parent.type.canContainType(types[0]) || content.some(function (n) { - return !lastWrapper.canContain(n); - }) || !inner.size && !lastWrapper.canBeEmpty || lastWrapper.locked) return { - v: null - }; - var node = null; - for (var i = types.length - 1; i >= 0; i--) { - node = types[i].create(attrs[i], node || content); - }newParent = parent.splice(start, end, _model.Fragment.from(node)); - })(); +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; } - if (typeof _ret === "object") return _ret.v; - } else { - if (!parent.type.canContainFragment(inner.content) || !inner.size && start == 0 && end == parent.size && !parent.type.canBeEmpty) return null; - newParent = parent.splice(start, end, inner.content); - } - var copy = doc.replaceDeep(toParent, newParent); +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - var toInner = toParent.slice(); - for (var i = 0; i < types.length; i++) { - toInner.push(i ? 0 : start); - }var startOfInner = new _model.Pos(toInner, types.length ? 0 : start); - var replaced = null; - var insertedSize = types.length ? 1 : to.offset - from.offset; - if (depth != types.length || depth > 1 || types.length > 1) { - var posBefore = new _model.Pos(toParent, start); - var posAfter1 = new _model.Pos(toParent, end), - posAfter2 = new _model.Pos(toParent, start + insertedSize); - var endOfInner = new _model.Pos(toInner, startOfInner.offset + (to.offset - from.offset)); - replaced = [new _map.ReplacedRange(posBefore, from, posBefore, startOfInner), new _map.ReplacedRange(to, posAfter1, endOfInner, posAfter2, posAfter1, posAfter2)]; - } - var moved = [new _map.MovedRange(from, to.offset - from.offset, startOfInner)]; - if (end - start != insertedSize) moved.push(new _map.MovedRange(new _model.Pos(toParent, end), parentSize - end, new _model.Pos(toParent, start + insertedSize))); - return new _step.StepResult(copy, new _map.PosMap(moved, replaced)); - }, - invert: function invert(step, oldDoc, map) { - var types = [], - attrs = []; - if (step.param.depth) for (var i = 0; i < step.param.depth; i++) { - var _parent = oldDoc.path(step.from.path.slice(0, step.from.path.length - i)); - types.unshift(_parent.type); - attrs.unshift(_parent.attrs); - } - var newFrom = map.map(step.from).pos; - var newTo = step.from.cmp(step.to) ? map.map(step.to, -1).pos : newFrom; - return new _step.Step("ancestor", newFrom, newTo, null, { depth: step.param.types ? step.param.types.length : 0, - types: types, attrs: attrs }); - }, - paramToJSON: function paramToJSON(param) { - return { depth: param.depth, - types: param.types && param.types.map(function (t) { - return t.name; - }), - attrs: param.attrs }; - }, - paramFromJSON: function paramFromJSON(schema, json) { - return { depth: json.depth, - types: json.types && json.types.map(function (n) { - return schema.nodeType(n); - }), - attrs: json.attrs }; - } -}); +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -function canBeLifted(doc, range) { - var content = [doc.path(range.from.path)], - unwrap = false; - for (;;) { - var parentDepth = -1; +var _input = require("./input"); - var _loop = function _loop(_node, i) { - if (!content.some(function (inner) { - return !_node.type.canContainContent(inner.type); - })) parentDepth = i; - _node = _node.child(range.from.path[i]); - node = _node; - }; +var _utils = require("../utils"); - for (var node = doc, i = 0; i < range.from.path.length; i++) { - _loop(node, i); - } - if (parentDepth > -1) return { path: range.from.path.slice(0, parentDepth), unwrap: unwrap }; - if (unwrap || !content[0].isBlock) return null; - content = content[0].content.slice(range.from.offset, range.to.offset); - unwrap = true; - } -} +var CheckBox = (function (_Input) { + _inherits(CheckBox, _Input); -// :: (Node, Pos, ?Pos) → bool -// Tells you whether the given positions' [sibling -// range](#Node.siblingRange), or any of its ancestor nodes, can be -// lifted out of a parent. + function CheckBox() { + _classCallCheck(this, CheckBox); -function canLift(doc, from, to) { - var range = doc.siblingRange(from, to || from); - var found = canBeLifted(doc, range); - if (found) return { found: found, range: range }; -} + _get(Object.getPrototypeOf(CheckBox.prototype), "constructor", this).apply(this, arguments); + } -// :: (Pos, ?Pos) → Transform -// Lift the nearest liftable ancestor of the [sibling -// range](#Node.siblingRange) of the given positions out of its -// parent (or do nothing if no such node exists). -_transform.Transform.prototype.lift = function (from) { - var to = arguments.length <= 1 || arguments[1] === undefined ? from : arguments[1]; - return (function () { - var can = canLift(this.doc, from, to); - if (!can) return this; - var found = can.found; - var range = can.range; + return CheckBox; +})(_input.Input); - var depth = range.from.path.length - found.path.length; - var rangeNode = found.unwrap && this.doc.path(range.from.path); +exports.CheckBox = CheckBox; - for (var d = 0, pos = range.to;; d++) { - if (pos.offset < this.doc.path(pos.path).size) { - this.split(pos, depth - d); - break; - } - if (d == depth - 1) break; - pos = pos.shorten(null, 1); - } - for (var d = 0, pos = range.from;; d++) { - if (pos.offset > 0) { - this.split(pos, depth - d); - var cut = range.from.path.length - depth, - path = pos.path.slice(0, cut).concat(pos.path[cut] + 1); - while (path.length < range.from.path.length) path.push(0); - range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, range.to.offset - range.from.offset) }; - break; - } - if (d == depth - 1) break; - pos = pos.shorten(); - } - if (found.unwrap) { - for (var i = range.to.offset - 1; i > range.from.offset; i--) { - this.join(new _model.Pos(range.from.path, i)); - }var size = 0; - for (var i = rangeNode.iter(range.from.offset, range.to.offset), child = undefined; child = i.next().value;) { - size += child.size; - }var path = range.from.path.concat(range.from.offset); - range = { from: new _model.Pos(path, 0), to: new _model.Pos(path, size) }; - ++depth; - } - this.step("ancestor", range.from, range.to, null, { depth: depth }); - return this; - }).apply(this, arguments); +CheckBox.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + type: new _gitProsemirrorDistModel.Attribute({ "default": "checkbox" }), + value: new _gitProsemirrorDistModel.Attribute({ "default": 1 }), + "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-checkbox" }) }; -// :: (Node, Pos, ?Pos, NodeType) → bool -// Determines whether the [sibling range](#Node.siblingRange) of the -// given positions can be wrapped in the given node type. - -function canWrap(doc, from, to, type) { - var range = doc.siblingRange(from, to || from); - if (range.from.offset == range.to.offset) return null; - var parent = doc.path(range.from.path); - var around = parent.type.findConnection(type); - var inside = type.findConnection(parent.child(range.from.offset).type); - if (around && inside) return { range: range, around: around, inside: inside }; -} +(0, _utils.defParser)(CheckBox, "input", "widgets-checkbox"); -// :: (Pos, ?Pos, NodeType, ?Object) → Transform -// Wrap the [sibling range](#Node.siblingRange) of the given positions -// in a node of the given type, with the given attributes (if -// possible). -_transform.Transform.prototype.wrap = function (from, to, type, wrapAttrs) { - var can = canWrap(this.doc, from, to, type); - if (!can) return this; - var range = can.range; - var around = can.around; - var inside = can.inside; +// Checkbox inherits serializer from input - var types = around.concat(type).concat(inside); - var attrs = around.map(function () { - return null; - }).concat(wrapAttrs).concat(inside.map(function () { - return null; - })); - this.step("ancestor", range.from, range.to, null, { types: types, attrs: attrs }); - if (inside.length) { - var toInner = range.from.path.slice(); - for (var i = 0; i < around.length + inside.length + 1; i++) { - toInner.push(i ? 0 : range.from.offset); - }for (var i = range.to.offset - 1 - range.from.offset; i > 0; i--) { - this.split(new _model.Pos(toInner, i), inside.length); - } - } - return this; -}; +CheckBox.register("command", { + name: "insertCheckBox", + label: "CheckBox", + run: function run(pm, name, label, loc) { + return pm.tr.replaceSelection(this.create({ name: name, label: label, loc: loc })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -// :: (Pos, ?Pos, NodeType, ?Object) → Transform -// Set the type of all textblocks (partly) between `from` and `to` to -// the given node type with the given attributes. -_transform.Transform.prototype.setBlockType = function (from, to, type, attrs) { - var _this = this; + if (node) return [node.attrs.name, node.attrs.label, node.attrs.loc]; + } +}); - this.doc.nodesBetween(from, to || from, function (node, path) { - if (node.isTextblock && !node.hasMarkup(type, attrs)) { - path = path.slice(); - // Ensure all markup that isn't allowed in the new node type is cleared - _this.clearMarkup(new _model.Pos(path, 0), new _model.Pos(path, node.size), type); - _this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, _this.doc.path(path).size), null, { depth: 1, types: [type], attrs: [attrs] }); - return false; - } - }); - return this; -}; +(0, _utils.defParamsClick)(CheckBox); -// :: (Pos, NodeType, ?Object) → Transform -// Change the type and attributes of the node after `pos`. -_transform.Transform.prototype.setNodeType = function (pos, type, attrs) { - var node = this.doc.nodeAfter(pos); - var path = pos.toPath(); - this.step("ancestor", new _model.Pos(path, 0), new _model.Pos(path, node.size), null, { depth: 1, types: [type], attrs: [attrs] }); - return this; -}; +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-checkbox {}\n\n"); -},{"../model":45,"./map":59,"./step":63,"./transform":64,"./tree":65}],57:[function(require,module,exports){ +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],57:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -require("./mark"); +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; }; })(); -require("./split"); +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -require("./replace"); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -// !! This module defines a way to transform documents. Transforming -// happens in `Step`s, which are atomic, well-defined modifications to -// a document. [Applying](`Step.apply`) a step produces a new document -// and a [position map](#PosMap) that maps positions in the old -// document to position in the new document. Steps can be -// [inverted](#Step.invert) to create a step that undoes their effect, -// and chained together in a convenience object called a `Transform`. -// -// This module does not depend on the browser API being available -// (i.e. you can load it into any JavaScript environment). -// -// These are the types of steps defined: -var _transform = require("./transform"); +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; } -Object.defineProperty(exports, "Transform", { - enumerable: true, - get: function get() { - return _transform.Transform; - } -}); +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -var _step = require("./step"); +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -Object.defineProperty(exports, "Step", { - enumerable: true, - get: function get() { - return _step.Step; - } -}); -Object.defineProperty(exports, "StepResult", { - enumerable: true, - get: function get() { - return _step.StepResult; - } -}); +var _utils = require("../utils"); -var _ancestor = require("./ancestor"); +var CheckItem = (function (_Paragraph) { + _inherits(CheckItem, _Paragraph); -Object.defineProperty(exports, "canLift", { - enumerable: true, - get: function get() { - return _ancestor.canLift; - } -}); -Object.defineProperty(exports, "canWrap", { - enumerable: true, - get: function get() { - return _ancestor.canWrap; + function CheckItem() { + _classCallCheck(this, CheckItem); + + _get(Object.getPrototypeOf(CheckItem.prototype), "constructor", this).apply(this, arguments); } -}); -var _join = require("./join"); + _createClass(CheckItem, [{ + key: "create", + value: function create(attrs, content, marks) { + if (attrs.value > 0) content = [this.schema.node("checkbox", attrs)]; + return _get(Object.getPrototypeOf(CheckItem.prototype), "create", this).call(this, attrs, content, marks); + } + }], [{ + key: "kind", + get: function get() { + return "."; + } + }]); -Object.defineProperty(exports, "joinPoint", { - enumerable: true, - get: function get() { - return _join.joinPoint; - } -}); -Object.defineProperty(exports, "joinableBlocks", { - enumerable: true, - get: function get() { - return _join.joinableBlocks; - } -}); + return CheckItem; +})(_gitProsemirrorDistModel.Paragraph); -var _map = require("./map"); +exports.CheckItem = CheckItem; -Object.defineProperty(exports, "PosMap", { - enumerable: true, - get: function get() { - return _map.PosMap; - } -}); -Object.defineProperty(exports, "MapResult", { - enumerable: true, - get: function get() { - return _map.MapResult; - } -}); -Object.defineProperty(exports, "Remapping", { - enumerable: true, - get: function get() { - return _map.Remapping; +CheckItem.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + value: new _gitProsemirrorDistModel.Attribute() +}; + +var CheckList = (function (_Block) { + _inherits(CheckList, _Block); + + function CheckList() { + _classCallCheck(this, CheckList); + + _get(Object.getPrototypeOf(CheckList.prototype), "constructor", this).apply(this, arguments); } + + _createClass(CheckList, null, [{ + key: "contains", + get: function get() { + return "checkitem"; + } + }]); + + return CheckList; +})(_gitProsemirrorDistModel.Block); + +exports.CheckList = CheckList; + +CheckList.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + layout: new _gitProsemirrorDistModel.Attribute({ "default": "vertical" }) +}; + +(0, _utils.defParser)(CheckItem, "div", "widgets-checkitem"); +(0, _utils.defParser)(CheckList, "div", "widgets-checklist"); + +CheckItem.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "p", { + name: node.attrs.name + "-" + node.attrs.value, + value: node.attrs.value, + "class": "widgets-checkitem" + }); +}; + +CheckList.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "div", { + name: node.attrs.name, + layout: node.attrs.layout, + "class": "widgets-checklist" + }); +}; + +CheckItem.register("command", { + name: "splitCheckitem", + label: "Split the current checkitem", + run: function run(pm) { + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to; + + if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + console.log(grandParent.type.name); + if (grandParent.type.name != "checklist") return false; + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" }); -},{"./ancestor":56,"./join":58,"./map":59,"./mark":60,"./replace":61,"./split":62,"./step":63,"./transform":64}],58:[function(require,module,exports){ -"use strict"; +CheckList.register("command", { + name: "insertCheckList", + label: "CheckList", + run: function run(pm, name, layout) { + var chkitem = pm.schema.nodes.checkitem.create({ name: name, value: 0 }); + return pm.tr.replaceSelection(this.create({ name: name + "-0", layout: layout }, chkitem)).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Layout (vertical, horizontal)", type: "select", options: [{ value: "horizontal", label: "horizontal" }, { value: "vertical", label: "vertical" }] }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -Object.defineProperty(exports, "__esModule", { - value: true + if (node) return [node.attrs.name, node.attrs.layout]; + } }); -exports.joinableBlocks = joinableBlocks; -exports.joinPoint = joinPoint; -var _model = require("../model"); +CheckItem.register("command", { + name: "splitCheckItem", + label: "Split the current checkitem", + run: function run(pm) { + var _pm$selection2 = pm.selection; + var node = _pm$selection2.node; + var from = _pm$selection2.from; + var to = _pm$selection2.to; -var _transform = require("./transform"); + if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.checkitem, { + name: grandParent.attrs.name + "-" + grandParent.size, + value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" +}); -var _step = require("./step"); +CheckItem.register("command", { + name: "deleteCheckItem", + label: "delete this checkitem or checklist", + run: function run(pm) { + var _pm$selection3 = pm.selection; + var head = _pm$selection3.head; + var empty = _pm$selection3.empty; -var _map = require("./map"); + if (!empty || head.offset > 1) return false; + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + }var mc = pm.doc.path(cut.path).child(cut.offset); + // if top choice, delete whole question if only one choice + if (mc.type.name == "checkitem") { + return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); + } else { + // don't delete question if more than one choice + if (mc.size == 1) { + return pm.tr["delete"](cut, cut.move(1)).apply(_utils.andScroll); + } else return false; + } + }, + key: ["Backspace(50)", "Mod-Backspace(50)"] +}); -// !! **`join`** -// : Join two block elements together. `from` and `to` must point at -// the end of the first and start of the second element (so that -// the intention is preserved even when the positions are mapped). +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-checkitem {}\n.widgets-checklist {}\n\n"); -_step.Step.define("join", { - apply: function apply(doc, step) { - var before = doc.path(step.from.path); - var after = doc.path(step.to.path); - if (step.from.offset < before.size || step.to.offset > 0 || !before.type.canContainFragment(after.content)) return null; - var pFrom = step.from.path, - pTo = step.to.path; - var last = pFrom.length - 1, - offset = pFrom[last] + 1; - if (pFrom.length != pTo.length || pFrom.length == 0 || offset != pTo[last]) return null; - for (var i = 0; i < last; i++) { - if (pFrom[i] != pTo[i]) return null; - }var targetPath = pFrom.slice(0, last); - var target = doc.path(targetPath), - oldSize = target.size; - if (target.type.locked) return null; - var joined = before.append(after.content); - var copy = doc.replaceDeep(targetPath, target.splice(offset - 1, offset + 1, _model.Fragment.from(joined))); +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],58:[function(require,module,exports){ +"use strict"; - var map = new _map.PosMap([new _map.MovedRange(step.to, after.size, step.from), new _map.MovedRange(new _model.Pos(targetPath, offset + 1), oldSize - offset - 1, new _model.Pos(targetPath, offset))], [new _map.ReplacedRange(step.from, step.to, step.from, step.from, step.to.shorten())]); - return new _step.StepResult(copy, map); - }, - invert: function invert(step, oldDoc) { - return new _step.Step("split", null, null, step.from, oldDoc.path(step.to.path).copy()); - } +Object.defineProperty(exports, "__esModule", { + value: true }); -// :: (Node, Pos) → bool -// Test whether the blocks before and after a given position can be -// joined. +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -function joinableBlocks(doc, pos) { - if (pos.offset == 0) return false; - var parent = doc.path(pos.path); - if (parent.isTextblock || pos.offset == parent.size) return false; - var type = parent.child(pos.offset - 1).type; - return !type.isTextblock && type.contains && type == parent.child(pos.offset).type; -} +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -// :: (Node, Pos, ?number) → ?Pos -// Find an ancestor of the given position that can be joined to the -// block before (or after if `dir` is positive). Returns the joinable -// point, if any. +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; } -function joinPoint(doc, pos) { - var dir = arguments.length <= 2 || arguments[2] === undefined ? -1 : arguments[2]; +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - for (;;) { - if (joinableBlocks(doc, pos)) return pos; - if (pos.depth == 0) return null; - pos = pos.shorten(null, dir < 0 ? 0 : 1); - } -} +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -// :: (Pos) → Transform -// Join the blocks around the given position. -_transform.Transform.prototype.join = function (at) { - var parent = this.doc.path(at.path); - if (at.offset == 0 || at.offset == parent.size || parent.isTextblock) return this; - this.step("join", new _model.Pos(at.path.concat(at.offset - 1), parent.child(at.offset - 1).size), new _model.Pos(at.path.concat(at.offset), 0)); - return this; -}; +var _utils = require("../utils"); -},{"../model":45,"./map":59,"./step":63,"./transform":64}],59:[function(require,module,exports){ -"use strict"; +var IFrame = (function (_Block) { + _inherits(IFrame, _Block); -Object.defineProperty(exports, "__esModule", { - value: true -}); + function IFrame() { + _classCallCheck(this, IFrame); -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; - }; -})(); + _get(Object.getPrototypeOf(IFrame.prototype), "constructor", this).apply(this, arguments); + } -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} + return IFrame; +})(_gitProsemirrorDistModel.Block); -var _model = require("../model"); +exports.IFrame = IFrame; -// ;; #kind=interface #path=Mappable #toc=false -// There are various things that positions can be mapped through. -// We'll denote those as 'mappable'. This is not an actual class in -// the codebase, only an agreed-on interface. +IFrame.attributes = { + src: new _gitProsemirrorDistModel.Attribute({ "default": "" }), + width: new _gitProsemirrorDistModel.Attribute({ "default": 200 }), + height: new _gitProsemirrorDistModel.Attribute({ "default": 200 }) +}; -// :: (pos: Pos, bias: ?number) → MapResult -// #path=Mappable.map -// Map a position through this object. When given, the `bias` -// determines in which direction to move when a chunk of content is -// inserted at or around the mapped position. +(0, _utils.defParser)(IFrame, "iframe", "widgets-iframe"); -var MovedRange = (function () { - function MovedRange(start, size) { - var dest = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; +IFrame.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "iframe", { + src: node.attrs.src, + width: node.attrs.width, + height: node.attrs.height, + content: "text/html;charset=UTF-8", + "class": "iframe", + frameborder: "1", + allowfullscreen: "1" + }); +}; - _classCallCheck(this, MovedRange); +IFrame.register("command", { + name: "insertIFrame", + label: "show websites, youTube, GoogleMaps,...", + run: function run(pm, src, width, height) { + return pm.tr.replaceSelection(this.create({ src: src, width: width, height: height })).apply(_utils.andScroll); + }, + params: [{ label: "Link (website, youTube, Google Maps ...)", type: "text" }, { label: "Width in pixels", type: "text", "default": 200 }, { label: "Height in pixels", type: "text", "default": 200 }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; - this.start = start; - this.size = size; - this.dest = dest; - } + if (node) return [node.attrs.src, node.attrs.width, node.attrs.height]; + } +}); - _createClass(MovedRange, [{ - key: "toString", - value: function toString() { - return "[moved " + this.start + "+" + this.size + " to " + this.dest + "]"; - } - }, { - key: "end", - get: function get() { - return new _model.Pos(this.start.path, this.start.offset + this.size); - } - }]); +(0, _utils.defParamsClick)(IFrame); - return MovedRange; -})(); +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-iframe {}\n\n"); -exports.MovedRange = MovedRange; +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],59:[function(require,module,exports){ +"use strict"; -var Side = function Side(from, to, ref) { - _classCallCheck(this, Side); +Object.defineProperty(exports, "__esModule", { + value: true +}); - this.from = from; - this.to = to; - this.ref = ref; -}; +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -var ReplacedRange = (function () { - function ReplacedRange(from, to, newFrom, newTo) { - var ref = arguments.length <= 4 || arguments[4] === undefined ? from : arguments[4]; - var newRef = arguments.length <= 5 || arguments[5] === undefined ? newFrom : arguments[5]; - return (function () { - _classCallCheck(this, ReplacedRange); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - this.before = new Side(from, to, ref); - this.after = new Side(newFrom, newTo, newRef); - }).apply(this, arguments); - } +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; } - _createClass(ReplacedRange, [{ - key: "toString", - value: function toString() { - return "[replaced " + this.before.from + "-" + this.before.to + " with " + this.after.from + "-" + this.after.to + "]"; - } - }]); +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - return ReplacedRange; -})(); +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -exports.ReplacedRange = ReplacedRange; +var _utils = require("../utils"); -var empty = []; +var Image = (function (_Inline) { + _inherits(Image, _Inline); -function offsetFrom(base, pos) { - if (pos.path.length > base.path.length) { - var path = [pos.path[base.path.length] - base.offset]; - for (var i = base.path.length + 1; i < pos.path.length; i++) { - path.push(pos.path[i]); - }return new _model.Pos(path, pos.offset); - } else { - return new _model.Pos([], pos.offset - base.offset); + function Image() { + _classCallCheck(this, Image); + + _get(Object.getPrototypeOf(Image.prototype), "constructor", this).apply(this, arguments); } -} -function mapThrough(map, pos, bias, back) { - if (bias === undefined) bias = 1; + return Image; +})(_gitProsemirrorDistModel.Inline); - for (var i = 0; i < map.replaced.length; i++) { - var range = map.replaced[i], - side = back ? range.after : range.before; - var left = undefined, - right = undefined; - if ((left = pos.cmp(side.from)) >= 0 && (right = pos.cmp(side.to)) <= 0) { - var other = back ? range.before : range.after; - return new MapResult(bias < 0 ? other.from : other.to, !!(left && right), { rangeID: i, offset: offsetFrom(side.ref, pos) }); - } - } +exports.Image = Image; - for (var i = 0; i < map.moved.length; i++) { - var range = map.moved[i]; - var start = back ? range.dest : range.start; - if (pos.cmp(start) >= 0 && _model.Pos.cmp(pos.path, pos.offset, start.path, start.offset + range.size) <= 0) { - var dest = back ? range.start : range.dest; - var depth = start.depth; - if (pos.depth > depth) { - var offset = dest.offset + (pos.path[depth] - start.offset); - return new MapResult(new _model.Pos(dest.path.concat(offset).concat(pos.path.slice(depth + 1)), pos.offset)); - } else { - return new MapResult(new _model.Pos(dest.path, dest.offset + (pos.offset - start.offset))); - } - } - } +Image.attributes = { + src: new _gitProsemirrorDistModel.Attribute(), + alt: new _gitProsemirrorDistModel.Attribute({ "default": "" }), + title: new _gitProsemirrorDistModel.Attribute({ "default": "" }), + "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-img" }) +}; - return new MapResult(pos); -} +(0, _utils.defParser)(Image, "img", "widgets-img"); -// ;; A position map, holding information about the way positions in -// the pre-step version of a document correspond to positions in the -// post-step version. This class implements `Mappable`. +Image.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "img", node.attrs); +}; -var PosMap = (function () { - function PosMap(moved, replaced) { - _classCallCheck(this, PosMap); +Image.register("command", { + name: "insertImage", + label: "Insert image", + run: function run(pm, src, alt, title) { + return pm.tr.replaceSelection(this.create({ src: src, title: title, alt: alt })).apply(_utils.andScroll); + }, + params: [{ label: "Image URL", type: "text" }, { label: "Description / alternative text", type: "text", "default": "" }, { label: "Title", type: "text", "default": "" }], + select: function select(pm) { + return pm.doc.path(pm.selection.from.path).type.canContainType(this); + }, + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; - this.moved = moved || empty; - this.replaced = replaced || empty; + if (node && node.type == this) return [node.attrs.src, node.attrs.alt, node.attrs.title]; } +}); - // ;; #toc=false The return value of mapping a position. +(0, _utils.defParamsClick)(Image); - _createClass(PosMap, [{ - key: "recover", - value: function recover(offset) { - return this.replaced[offset.rangeID].after.ref.extend(offset.offset); - } +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-image {}\n\n"); - // :: (Pos, ?number) → MapResult - // Map the given position through this map. The `bias` parameter can - // be used to control what happens when the transform inserted - // content at (or around) this position—if `bias` is negative, the a - // position before the inserted content will be returned, if it is - // positive, a position after the insertion is returned. - }, { - key: "map", - value: function map(pos, bias) { - return mapThrough(this, pos, bias, false); - } +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],60:[function(require,module,exports){ +"use strict"; - // :: () → PosMap - // Create an inverted version of this map. The result can be used to - // map positions in the post-step document to the pre-step document. - }, { - key: "invert", - value: function invert() { - return new InvertedPosMap(this); - } - }, { - key: "toString", - value: function toString() { - return this.moved.concat(this.replaced).join(" "); - } - }]); +Object.defineProperty(exports, "__esModule", { + value: true +}); - return PosMap; -})(); +var _blockmath = require("./blockmath"); -exports.PosMap = PosMap; +Object.defineProperty(exports, "BlockMath", { + enumerable: true, + get: function get() { + return _blockmath.BlockMath; + } +}); -var MapResult = function MapResult(pos) { - var deleted = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - var recover = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; +var _checkbox = require("./checkbox"); - _classCallCheck(this, MapResult); +Object.defineProperty(exports, "CheckBox", { + enumerable: true, + get: function get() { + return _checkbox.CheckBox; + } +}); - // :: Pos The mapped version of the position. - this.pos = pos; - // :: bool Tells you whether the position was deleted, that is, - // whether the step removed its surroundings from the document. - this.deleted = deleted; - this.recover = recover; -}; +var _checklist = require("./checklist"); -exports.MapResult = MapResult; +Object.defineProperty(exports, "CheckList", { + enumerable: true, + get: function get() { + return _checklist.CheckList; + } +}); +Object.defineProperty(exports, "CheckItem", { + enumerable: true, + get: function get() { + return _checklist.CheckItem; + } +}); -var InvertedPosMap = (function () { - function InvertedPosMap(map) { - _classCallCheck(this, InvertedPosMap); +var _iframe = require("./iframe"); - this.inner = map; +Object.defineProperty(exports, "IFrame", { + enumerable: true, + get: function get() { + return _iframe.IFrame; } +}); - _createClass(InvertedPosMap, [{ - key: "recover", - value: function recover(offset) { - return this.inner.replaced[offset.rangeID].before.ref.extend(offset.offset); - } - }, { - key: "map", - value: function map(pos, bias) { - return mapThrough(this.inner, pos, bias, true); - } - }, { - key: "invert", - value: function invert() { - return this.inner; - } - }, { - key: "toString", - value: function toString() { - return "-" + this.inner; - } - }]); +var _inlinemath = require("./inlinemath"); - return InvertedPosMap; -})(); +Object.defineProperty(exports, "InlineMath", { + enumerable: true, + get: function get() { + return _inlinemath.InlineMath; + } +}); -var nullMap = new PosMap(); +var _input = require("./input"); -exports.nullMap = nullMap; -// ;; A remapping represents a pipeline of zero or more mappings. It -// is a specialized data structured used to manage mapping through a -// series of steps, typically including inverted and non-inverted -// versions of the same step. (This comes up when ‘rebasing’ steps for -// collaboration or history management.) This class implements -// `Mappable`. +Object.defineProperty(exports, "Input", { + enumerable: true, + get: function get() { + return _input.Input; + } +}); -var Remapping = (function () { - // :: (?[PosMap], ?[PosMap]) +var _multiplechoice = require("./multiplechoice"); - function Remapping() { - var head = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - var tail = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1]; - var mirror = arguments.length <= 2 || arguments[2] === undefined ? Object.create(null) : arguments[2]; +Object.defineProperty(exports, "MultipleChoice", { + enumerable: true, + get: function get() { + return _multiplechoice.MultipleChoice; + } +}); +Object.defineProperty(exports, "Choice", { + enumerable: true, + get: function get() { + return _multiplechoice.Choice; + } +}); - _classCallCheck(this, Remapping); +var _radiobutton = require("./radiobutton"); - // :: [PosMap] - // The maps in the head of the mapping are applied to input - // positions first, back-to-front. So the map at the end of this - // array (if any) is the very first one applied. - this.head = head; - // The maps in the tail are applied last, front-to-back. - this.tail = tail; - this.mirror = mirror; +Object.defineProperty(exports, "RadioButton", { + enumerable: true, + get: function get() { + return _radiobutton.RadioButton; } +}); - // :: (PosMap, ?number) → number - // Add a map to the mapping's front. If this map is the mirror image - // (produced by an inverted step) of another map in this mapping, - // that map's id (as returned by this method or - // [`addToBack`](#Remapping.addToBack)) should be passed as a second - // parameter to register the correspondence. - - _createClass(Remapping, [{ - key: "addToFront", - value: function addToFront(map, corr) { - this.head.push(map); - var id = -this.head.length; - if (corr != null) this.mirror[id] = corr; - return id; - } +var _scale = require("./scale"); - // :: (PosMap, ?number) → number - // Add a map to the mapping's back. If the map is the mirror image - // of another mapping in this object, the id of that map should be - // passed to register the correspondence. - }, { - key: "addToBack", - value: function addToBack(map, corr) { - this.tail.push(map); - var id = this.tail.length - 1; - if (corr != null) this.mirror[corr] = id; - return id; - } - }, { - key: "get", - value: function get(id) { - return id < 0 ? this.head[-id - 1] : this.tail[id]; - } +Object.defineProperty(exports, "Scale", { + enumerable: true, + get: function get() { + return _scale.Scale; + } +}); - // :: (Pos, ?number) → MapResult - // Map a position through this remapping, optionally passing a bias - // direction. - }, { - key: "map", - value: function map(pos, bias) { - var deleted = false; +var _select = require("./select"); - for (var i = -this.head.length; i < this.tail.length; i++) { - var map = this.get(i); - var result = map.map(pos, bias); - if (result.recover) { - var corr = this.mirror[i]; - if (corr != null) { - i = corr; - pos = this.get(corr).recover(result.recover); - continue; - } - } - if (result.deleted) deleted = true; - pos = result.pos; - } +Object.defineProperty(exports, "Select", { + enumerable: true, + get: function get() { + return _select.Select; + } +}); - return new MapResult(pos, deleted); - } - }]); +var _textarea = require("./textarea"); - return Remapping; -})(); +Object.defineProperty(exports, "TextArea", { + enumerable: true, + get: function get() { + return _textarea.TextArea; + } +}); -exports.Remapping = Remapping; +var _textfield = require("./textfield"); -},{"../model":45}],60:[function(require,module,exports){ -"use strict"; +Object.defineProperty(exports, "TextField", { + enumerable: true, + get: function get() { + return _textfield.TextField; + } +}); -var _model = require("../model"); +var _image = require("./image"); -var _transform = require("./transform"); +Object.defineProperty(exports, "Image", { + enumerable: true, + get: function get() { + return _image.Image; + } +}); -var _step = require("./step"); +var _spreadsheet = require("./spreadsheet"); -var _tree = require("./tree"); +Object.defineProperty(exports, "SpreadSheet", { + enumerable: true, + get: function get() { + return _spreadsheet.SpreadSheet; + } +}); -// !! -// **`addMark`** -// : Add the `Mark` given as the step's parameter to all -// inline content between `from` and `to` (when allowed). -// -// **`removeMark`** -// : Remove the `Mark` given as the step's parameter from all inline -// content between `from` and `to`. +var _carryforward = require("./carryforward"); -_step.Step.define("addMark", { - apply: function apply(doc, step) { - return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { - if (!node.type.canContainMark(step.param)) return node; - return (0, _tree.copyInline)(node, from, to, function (node) { - return node.mark(step.param.addToSet(node.marks)); - }); - })); - }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("removeMark", step.from, map.map(step.to).pos, null, step.param); - }, - paramToJSON: function paramToJSON(param) { - return param.toJSON(); - }, - paramFromJSON: function paramFromJSON(schema, json) { - return schema.markFromJSON(json); +Object.defineProperty(exports, "CarryForward", { + enumerable: true, + get: function get() { + return _carryforward.CarryForward; } }); -// :: (Pos, Pos, Mark) → Transform -// Add the given mark to the inline content between `from` and `to`. -_transform.Transform.prototype.addMark = function (from, to, mark) { - var _this = this; +var _widget = require("./widget"); - var removed = [], - added = [], - removing = null, - adding = null; - this.doc.inlineNodesBetween(from, to, function (_ref, path, start, end, parent) { - var marks = _ref.marks; +Object.defineProperty(exports, "Widget", { + enumerable: true, + get: function get() { + return _widget.Widget; + } +}); - if (mark.isInSet(marks) || !parent.type.canContainMark(mark.type)) { - adding = removing = null; - } else { - var rm = mark.type.isInSet(marks); - if (rm) { - if (removing && removing.param.eq(rm)) { - removing.to = new _model.Pos(path, end); - } else { - removing = new _step.Step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, rm); - removed.push(removing); - } - } else if (removing) { - removing = null; - } - if (adding) { - adding.to = new _model.Pos(path, end); - } else { - adding = new _step.Step("addMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); - added.push(adding); - } - } - }); - removed.forEach(function (s) { - return _this.step(s); - }); - added.forEach(function (s) { - return _this.step(s); - }); - return this; -}; +},{"./blockmath":54,"./carryforward":55,"./checkbox":56,"./checklist":57,"./iframe":58,"./image":59,"./inlinemath":61,"./input":62,"./multiplechoice":63,"./radiobutton":64,"./scale":65,"./select":66,"./spreadsheet":67,"./textarea":68,"./textfield":69,"./widget":70}],61:[function(require,module,exports){ +"use strict"; -_step.Step.define("removeMark", { - apply: function apply(doc, step) { - return new _step.StepResult((0, _tree.copyStructure)(doc, step.from, step.to, function (node, from, to) { - return (0, _tree.copyInline)(node, from, to, function (node) { - return node.mark(step.param.removeFromSet(node.marks)); - }); - })); - }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("addMark", step.from, map.map(step.to).pos, null, step.param); - }, - paramToJSON: function paramToJSON(param) { - return param.toJSON(); - }, - paramFromJSON: function paramFromJSON(schema, json) { - return schema.markFromJSON(json); - } +Object.defineProperty(exports, "__esModule", { + value: true }); -// :: (Pos, Pos, union) → Transform -// Remove the given mark, or all marks of the given type, from inline -// nodes between `from` and `to`. -_transform.Transform.prototype.removeMark = function (from, to) { - var _this2 = this; +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - var mark = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var matched = [], - step = 0; - this.doc.inlineNodesBetween(from, to, function (_ref2, path, start, end) { - var marks = _ref2.marks; +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; } - step++; - var toRemove = null; - if (mark instanceof _model.MarkType) { - var found = mark.isInSet(marks); - if (found) toRemove = [found]; - } else if (mark) { - if (mark.isInSet(marks)) toRemove = [mark]; - } else { - toRemove = marks; - } - if (toRemove && toRemove.length) { - path = path.slice(); - for (var i = 0; i < toRemove.length; i++) { - var rm = toRemove[i], - found = undefined; - for (var j = 0; j < matched.length; j++) { - var m = matched[j]; - if (m.step == step - 1 && rm.eq(matched[j].style)) found = m; - } - if (found) { - found.to = new _model.Pos(path, end); - found.step = step; - } else { - matched.push({ style: rm, from: new _model.Pos(path, start), to: new _model.Pos(path, end), step: step }); - } - } - } - }); - matched.forEach(function (m) { - return _this2.step("removeMark", m.from, m.to, null, m.style); - }); - return this; -}; +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -// :: (Pos, Pos, ?NodeType) → Transform -// Remove all marks and non-text inline nodes, or if `newParent` is -// given, all marks and inline nodes that may not appear as content of -// `newParent`, from the given range. -_transform.Transform.prototype.clearMarkup = function (from, to, newParent) { - var _this3 = this; +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - var delSteps = []; // Must be accumulated and applied in inverse order - this.doc.inlineNodesBetween(from, to, function (_ref3, path, start, end) { - var marks = _ref3.marks; - var type = _ref3.type; +var _utils = require("../utils"); - if (newParent ? !newParent.canContainType(type) : !type.isText) { - path = path.slice(); - var _from = new _model.Pos(path, start); - delSteps.push(new _step.Step("replace", _from, new _model.Pos(path, end), _from)); - return; - } - for (var i = 0; i < marks.length; i++) { - var mark = marks[i]; - if (!newParent || !newParent.canContainMark(mark.type)) { - path = path.slice(); - _this3.step("removeMark", new _model.Pos(path, start), new _model.Pos(path, end), null, mark); - } - } - }); - for (var i = delSteps.length - 1; i >= 0; i--) { - this.step(delSteps[i]); - }return this; -}; +var InlineMath = (function (_Inline) { + _inherits(InlineMath, _Inline); -},{"../model":45,"./step":63,"./transform":64,"./tree":65}],61:[function(require,module,exports){ -"use strict"; + function InlineMath() { + _classCallCheck(this, InlineMath); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.replace = replace; + _get(Object.getPrototypeOf(InlineMath.prototype), "constructor", this).apply(this, arguments); + } -var _model = require("../model"); + return InlineMath; +})(_gitProsemirrorDistModel.Inline); -var _transform = require("./transform"); +exports.InlineMath = InlineMath; -var _step = require("./step"); +InlineMath.attributes = { + tex: new _gitProsemirrorDistModel.Attribute({ "default": "" }) +}; -var _map = require("./map"); +(0, _utils.defParser)(InlineMath, "span", "widgets-inlinemath"); -var _tree = require("./tree"); +InlineMath.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-inlinemath" }, " \\(" + node.attrs.tex + "\\) "); + // wait until node is attached to document to render + MathJax.Hub.Queue(["Delay", MathJax.Callback, 100], ["Typeset", MathJax.Hub, node.rendered]); + } + return node.rendered; +}; -// !! **`replace`** +InlineMath.register("command", { + name: "insertInlineMath", + label: "InlineMath", + run: function run(pm, tex) { + return pm.tr.replaceSelection(this.create({ tex: tex })).apply(_utils.andScroll); + }, + params: [{ label: "Latex Expression", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -// : Delete the part of the document between `from` and `to` and -// optionally replace it with another chunk of content. `pos` must -// point at the ‘root’ at which the cut starts—a position between -// and above `from` and `to`. -// -// When new content is to be inserted, the step's parameter should -// be an object of shape `{content: `[`Fragment`](#Fragment)`, -// openLeft: number, openRight: number}`. The step will insert the -// given content at the root of the cut, and `openLeft` and -// `openRight` indicate how much of the content on both sides -// should be consided ‘open’. -// -// A replace step will try to join open nodes on both sides of the -// cut. That is, nodes in the original document that are partially -// cut off by `from` and `to`, and nodes at the sides of the -// replacement content as specificed by `openLeft` and -// `openRight`. For example, if `openLeft` is 2, the first node of -// the replacement content as well as its first child is -// considered open. Whenever two open nodes with the same -// [markup](#Node.sameMarkup) end up next to each other, they are -// joined. Open nodes that aren't joined are [closed](#Node.close) -// to ensure their content (or lack of it) is valid. + if (node) return [node.attrs.tex]; + } +}); -function findMovedChunks(oldNode, oldPath, newNode, startDepth) { - var moved = []; - var newPath = oldPath.path.slice(0, startDepth); +(0, _utils.defParamsClick)(InlineMath); - for (var depth = startDepth;; depth++) { - var joined = depth == oldPath.depth ? 0 : 1; - var cut = depth == oldPath.depth ? oldPath.offset : oldPath.path[depth]; - var afterCut = oldNode.size - cut; - var newOffset = newNode.size - afterCut; +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-inlinemath {}\n\n"); - var from = oldPath.shorten(depth, joined); - var to = new _model.Pos(newPath, newOffset + joined); - if (from.cmp(to)) moved.push(new _map.MovedRange(from, afterCut - joined, to)); +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],62:[function(require,module,exports){ +"use strict"; - if (!joined) return moved; +Object.defineProperty(exports, "__esModule", { + value: true +}); - oldNode = oldNode.child(cut); - newNode = newNode.child(newOffset); - newPath = newPath.concat(newOffset); - } -} +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -function replace(node, from, to, root, repl) { - var depth = arguments.length <= 5 || arguments[5] === undefined ? 0 : arguments[5]; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (depth == root.length) { - var before = node.sliceBetween(null, from, depth); - var after = node.sliceBetween(to, null, depth), - result = undefined; - if (!before.type.canContainFragment(repl.content)) return null; - if (repl.content.size) result = before.append(repl.content, from.depth - depth, repl.openLeft).append(after.content, repl.openRight, to.depth - depth);else result = before.append(after.content, from.depth - depth, to.depth - depth); - if (!result.size && !result.type.canBeEmpty) result = result.copy(result.type.defaultContent()); - return { doc: result, moved: findMovedChunks(node, to, result, depth) }; - } else { - var pos = root[depth]; - var result = replace(node.child(pos), from, to, root, repl, depth + 1); - if (!result) return null; - return { doc: node.replace(pos, result.doc), moved: result.moved }; - } -} +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 nullRepl = { content: _model.emptyFragment, openLeft: 0, openRight: 0 }; +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -_step.Step.define("replace", { - apply: function apply(doc, step) { - var rootPos = step.pos, - root = rootPos.path; - if (step.from.depth < root.length || step.to.depth < root.length) return null; - for (var i = 0; i < root.length; i++) { - if (step.from.path[i] != root[i] || step.to.path[i] != root[i]) return null; - }var result = replace(doc, step.from, step.to, rootPos.path, step.param || nullRepl); - if (!result) return null; - var out = result.doc; - var moved = result.moved; +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - var end = moved.length ? moved[moved.length - 1].dest : step.to; - var replaced = new _map.ReplacedRange(step.from, step.to, step.from, end, rootPos, rootPos); - return new _step.StepResult(out, new _map.PosMap(moved, [replaced])); - }, - invert: function invert(step, oldDoc, map) { - var depth = step.pos.depth; - return new _step.Step("replace", step.from, map.map(step.to).pos, step.from.shorten(depth), { - content: oldDoc.path(step.pos.path).content.sliceBetween(step.from, step.to, depth), - openLeft: step.from.depth - depth, - openRight: step.to.depth - depth - }); - }, - paramToJSON: function paramToJSON(param) { - return param && { content: param.content.size && param.content.toJSON(), - openLeft: param.openLeft, openRight: param.openRight }; - }, - paramFromJSON: function paramFromJSON(schema, json) { - return json && { content: _model.Fragment.fromJSON(schema, json.content), - openLeft: json.openLeft, openRight: json.openRight }; - } -}); +var _utils = require("../utils"); -function shiftFromStack(stack, depth) { - var shifted = stack[depth] = stack[depth].splice(0, 1, _model.emptyFragment); - for (var i = depth - 1; i >= 0; i--) { - shifted = stack[i] = stack[i].replace(0, shifted); - } -} +var Input = (function (_Inline) { + _inherits(Input, _Inline); -// FIXME find a not so horribly confusing way to express this -function buildInserted(nodesLeft, source, start, end) { - var sliced = source.sliceBetween(start, end); - var nodesRight = []; - for (var node = sliced, i = 0; i <= start.path.length; i++, node = node.firstChild) { - nodesRight.push(node); - }var same = (0, _tree.samePathDepth)(start, end); - var searchLeft = nodesLeft.length - 1, - searchRight = nodesRight.length - 1; - var result = null; + function Input() { + _classCallCheck(this, Input); - var inner = nodesRight[searchRight]; - if (inner.isTextblock && inner.size && nodesLeft[searchLeft].isTextblock) { - result = nodesLeft[searchLeft--].copy(inner.content); - --searchRight; - shiftFromStack(nodesRight, searchRight); - } + _get(Object.getPrototypeOf(Input.prototype), "constructor", this).apply(this, arguments); + } - for (;;) { - var node = nodesRight[searchRight], - type = node.type, - matched = null; - var outside = searchRight <= same; - for (var i = searchLeft; i >= 0; i--) { - var left = nodesLeft[i]; - if (outside ? left.type.canContainContent(node.type) : left.type == type) { - matched = i; - break; - } - } - if (matched != null) { - if (!result) { - result = nodesLeft[matched].copy(node.content); - searchLeft = matched - 1; - } else { - while (searchLeft >= matched) { - var wrap = nodesLeft[searchLeft]; - var content = _model.Fragment.from(result); - result = wrap.copy(searchLeft == matched ? content.append(node.content) : content); - searchLeft--; - } - } - } - if (matched != null || node.size == 0) { - if (outside) break; - if (searchRight) shiftFromStack(nodesRight, searchRight - 1); - } - searchRight--; - } + return Input; +})(_gitProsemirrorDistModel.Inline); - var repl = { content: result ? result.content : _model.emptyFragment, - openLeft: start.depth - searchRight, - openRight: end.depth - searchRight }; - return { repl: repl, depth: searchLeft + 1 }; -} +exports.Input = Input; -function moveText(tr, doc, before, after) { - var root = (0, _tree.samePathDepth)(before, after); - var cutAt = after.shorten(null, 1); - while (cutAt.path.length > root && doc.path(cutAt.path).size == 1) cutAt = cutAt.shorten(null, 1); - tr.split(cutAt, cutAt.path.length - root); - var start = after, - end = new _model.Pos(start.path, doc.path(start.path).size); - var parent = doc.path(start.path.slice(0, root)); - var wanted = parent.pathNodes(before.path.slice(root)); - var existing = parent.pathNodes(start.path.slice(root)); - while (wanted.length && existing.length && wanted[0].sameMarkup(existing[0])) { - wanted.shift(); - existing.shift(); - } - if (existing.length || wanted.length) tr.step("ancestor", start, end, null, { - depth: existing.length, - types: wanted.map(function (n) { - return n.type; - }), - attrs: wanted.map(function (n) { - return n.attrs; - }) - }); - for (var i = root; i < before.path.length; i++) { - tr.join(before.shorten(i, 1)); - } -} +Input.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + type: new _gitProsemirrorDistModel.Attribute({ "default": "text" }), + value: new _gitProsemirrorDistModel.Attribute() +}; -// :: (Pos, Pos) → Transform -// Delete the content between the given positions. -_transform.Transform.prototype["delete"] = function (from, to) { - if (from.cmp(to)) this.replace(from, to); - return this; +(0, _utils.defParser)(Input, "widgets-input"); + +Input.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "input", node.attrs); }; -// :: (Pos, Pos, Node, Pos, Pos) → Transform -// Replace the part of the document between `from` and `to` with the -// part of the `source` between `start` and `end`. -_transform.Transform.prototype.replace = function (from, to, source, start, end) { - var repl = undefined, - depth = undefined, - doc = this.doc, - maxDepth = (0, _tree.samePathDepth)(from, to); - if (source) { - ; - var _buildInserted = buildInserted(doc.pathNodes(from.path), source, start, end); +(0, _gitProsemirrorDistDom.insertCSS)("\n\t\t\n.widgets-input {}\n\n"); - repl = _buildInserted.repl; - depth = _buildInserted.depth; +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],63:[function(require,module,exports){ +"use strict"; - while (depth > maxDepth) { - if (repl.content.size) repl = { content: _model.Fragment.from(doc.path(from.path.slice(0, depth)).copy(repl.content)), - openLeft: repl.openLeft + 1, openRight: repl.openRight + 1 }; - depth--; - } - } else { - repl = nullRepl; - depth = maxDepth; - } - var root = from.shorten(depth), - docAfter = doc, - after = to; - if (repl.content.size || (0, _tree.replaceHasEffect)(doc, from, to)) { - var result = this.step("replace", from, to, root, repl); - docAfter = result.doc; - after = result.map.map(to).pos; - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - // If no text nodes before or after end of replacement, don't glue text - if (!doc.path(to.path).isTextblock) return this; - if (!(repl.content.size ? source.path(end.path).isTextblock : doc.path(from.path).isTextblock)) return this; +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 nodesAfter = doc.path(root.path).pathNodes(to.path.slice(depth)).slice(1); - var nodesBefore = undefined; - if (repl.content.size) { - var inserted = repl.content; - nodesBefore = []; - for (var i = 0; i < repl.openRight; i++) { - var last = inserted.child(inserted.size - 1); - nodesBefore.push(last); - inserted = last.content; - } - } else { - nodesBefore = doc.path(root.path).pathNodes(from.path.slice(depth)).slice(1); - } +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - if (nodesBefore.length && (nodesAfter.length != nodesBefore.length || !nodesAfter.every(function (n, i) { - return n.sameMarkup(nodesBefore[i]); - }))) { - var _after$shorten = after.shorten(root.depth); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var path = _after$shorten.path; - var offset = _after$shorten.offset;var before = undefined; - for (var node = docAfter.path(path), i = 0;; i++) { - if (i == nodesBefore.length) { - before = new _model.Pos(path, offset); - break; - } - path.push(offset - 1); - node = node.child(offset - 1); - offset = node.size; - } - moveText(this, docAfter, before, after); +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 _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); + +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Choice = (function (_Paragraph) { + _inherits(Choice, _Paragraph); + + function Choice() { + _classCallCheck(this, Choice); + + _get(Object.getPrototypeOf(Choice.prototype), "constructor", this).apply(this, arguments); } - return this; -}; -// :: (Pos, Pos, union) → Transform -// Replace the given sibling range (position ponting into the same -// parent) with the given content, which may be a fragment, node, or -// array of nodes. -_transform.Transform.prototype.replaceWith = function (from, to, content) { - if (!(content instanceof _model.Fragment)) content = _model.Fragment.from(content); - if (!_model.Pos.samePath(from.path, to.path)) return this; - this.step("replace", from, to, from, { content: content, openLeft: 0, openRight: 0 }); - return this; -}; + _createClass(Choice, [{ + key: "create", + value: function create(attrs, content, marks) { + if (attrs.value > 0) content = [this.schema.node("radiobutton", attrs)]; + return _get(Object.getPrototypeOf(Choice.prototype), "create", this).call(this, attrs, content, marks); + } + }], [{ + key: "kind", + get: function get() { + return "."; + } + }]); -// :: (Pos, union) → Transform -// Insert the given content at the `pos`. -_transform.Transform.prototype.insert = function (pos, content) { - return this.replaceWith(pos, pos, content); -}; + return Choice; +})(_gitProsemirrorDistModel.Paragraph); -// :: (Pos, string) → Transform -// Insert the given text at `pos`, inheriting the marks of the -// existing content at that position. -_transform.Transform.prototype.insertText = function (pos, text) { - return this.insert(pos, this.doc.type.schema.text(text, this.doc.marksAt(pos))); -}; +exports.Choice = Choice; -// :: (Pos, Node) → Transform -// Insert the given node at `pos`, inheriting the marks of the -// existing content at that position. -_transform.Transform.prototype.insertInline = function (pos, node) { - return this.insert(pos, node.mark(this.doc.marksAt(pos))); +Choice.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + value: new _gitProsemirrorDistModel.Attribute() }; -},{"../model":45,"./map":59,"./step":63,"./transform":64,"./tree":65}],62:[function(require,module,exports){ -"use strict"; +var MultipleChoice = (function (_Block) { + _inherits(MultipleChoice, _Block); -var _model = require("../model"); + function MultipleChoice() { + _classCallCheck(this, MultipleChoice); -var _transform = require("./transform"); + _get(Object.getPrototypeOf(MultipleChoice.prototype), "constructor", this).apply(this, arguments); + } -var _step = require("./step"); + _createClass(MultipleChoice, null, [{ + key: "contains", + get: function get() { + return "choice"; + } + }]); -var _map = require("./map"); + return MultipleChoice; +})(_gitProsemirrorDistModel.Block); -// !! **`split`** -// : Split a block node at `pos`. The parameter, if given, may be -// `{type, ?attrs}` object giving the node type and optionally the -// attributes of the node created to hold the content after the -// split. +exports.MultipleChoice = MultipleChoice; -_step.Step.define("split", { - apply: function apply(doc, step) { - var pos = step.pos; - if (pos.depth == 0) return null; +MultipleChoice.attributes = { + name: new _gitProsemirrorDistModel.Attribute() +}; - var _pos$shorten = pos.shorten(); +(0, _utils.defParser)(Choice, "p", "widgets-choice"); +(0, _utils.defParser)(MultipleChoice, "div", "widgets-multiplechoice"); - var parentPath = _pos$shorten.path; - var offset = _pos$shorten.offset; +Choice.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "p", { name: node.attrs.name, value: node.attrs.value, "class": "widgets-choice" }); +}; - var parent = doc.path(parentPath); - var target = parent.child(offset), - targetSize = target.size; +MultipleChoice.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "div", { name: node.attrs.name, "class": "widgets-multiplechoice" }); +}; - var _ref = step.param || target; +Choice.register("command", { + name: "splitChoice", + label: "Split the current choice", + run: function run(pm) { + var _pm$selection = pm.selection; + var node = _pm$selection.node; + var from = _pm$selection.from; + var to = _pm$selection.to; - var typeAfter = _ref.type; - var attrsAfter = _ref.attrs; + if (node && node.isBlock || from.path.length < 2 || !_gitProsemirrorDistModel.Pos.samePath(from.path, to.path)) return false; + var toParent = from.shorten(), + grandParent = pm.doc.path(toParent.path); + if (grandParent.type.name != "multiplechoice") return false; + return pm.tr["delete"](from, to).split(from, 1, pm.schema.nodes.choice, { name: grandParent.attrs.name, value: grandParent.size }).apply(_utils.andScroll); + }, + key: "Enter(50)" +}); - var splitAt = pos.offset; - if (splitAt == 0 && !target.type.canBeEmpty || target.type.locked || splitAt == target.size && !typeAfter.canBeEmpty) return null; - var newParent = parent.splice(offset, offset + 1, _model.Fragment.from([target.slice(0, splitAt), typeAfter.create(attrsAfter, target.content.slice(splitAt))])); - var copy = doc.replaceDeep(parentPath, newParent); +Choice.register("command", { + name: "deleteChoice", + label: "delete this choice or multiplechoice", + run: function run(pm) { + var _pm$selection2 = pm.selection; + var head = _pm$selection2.head; + var empty = _pm$selection2.empty; - var dest = new _model.Pos(parentPath.concat(offset + 1), 0); - var map = new _map.PosMap([new _map.MovedRange(pos, targetSize - pos.offset, dest), new _map.MovedRange(new _model.Pos(parentPath, offset + 1), newParent.size - 2 - offset, new _model.Pos(parentPath, offset + 2))], [new _map.ReplacedRange(pos, pos, pos, dest, pos, pos.shorten(null, 1))]); - return new _step.StepResult(copy, map); + if (!empty || head.offset > 1) return false; + // Find the node before this one + var before = undefined, + cut = undefined; + for (var i = head.path.length - 1; !before && i >= 0; i--) { + if (head.path[i] > 0) { + cut = head.shorten(i); + before = pm.doc.path(cut.path).child(cut.offset - 1); + } + }var mc = pm.doc.path(cut.path).child(cut.offset); + // if top choice, delete whole question if only one choice + if (mc.type.name == "choice") { + return pm.tr["delete"](cut, cut.move(1)).apply(); + } else { + // don't delete question if more than one choice + if (mc.size == 1) { + return pm.tr["delete"](cut, cut.move(1)).apply(); + } else return false; + } }, - invert: function invert(step, _oldDoc, map) { - return new _step.Step("join", step.pos, map.map(step.pos).pos); + key: ["Backspace(50)", "Mod-Backspace(50)"] +}); + +MultipleChoice.register("command", { + name: "insertMultipleChoice", + label: "MultipleChoice", + run: function run(pm, name) { + var from = pm.selection.from; + + var choice = pm.schema.node("choice", { name: name, value: 0 }); + pm.tr.replaceSelection(this.create({ name: name }, choice)).apply(_utils.andScroll); + //find path of next sibling + /* let len = from.path.length-1 + let sib = from.path[len] + let pfrom = from.path.splice(0,len).concat(sib+1) + pm.setTextSelection(from) + */ + return true; }, - paramToJSON: function paramToJSON(param) { - return param && { type: param.type.name, attrs: param.attrs }; + select: function select(pm) { + console.log("select"); + return pm.doc.path(pm.selection.from.path).type.canContainType(this); }, - paramFromJSON: function paramFromJSON(schema, json) { - return json && { type: schema.nodeType(json.type), attrs: json.attrs }; + params: [{ label: "Name", type: "text" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; + + if (node) return [node.attrs.name]; } }); -// :: (Pos, ?number, ?NodeType, ?Object) → Transform -// Split the node at the given position, and optionally, if `depth` is -// greater than one, any number of nodes above that. By default, the part -// split off will inherit the node type of the original node. This can -// be changed by passing `typeAfter` and `attrsAfter`. -_transform.Transform.prototype.split = function (pos, depth, typeAfter, attrsAfter) { - if (depth === undefined) depth = 1; +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-choice {}\n.widgets-multiplechoice {}\n\n"); - if (depth == 0) return this; - for (var i = 0;; i++) { - this.step("split", null, null, pos, typeAfter && { type: typeAfter, attrs: attrsAfter }); - if (i == depth - 1) return this; - typeAfter = null; - pos = pos.shorten(null, 1); - } -}; +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],64:[function(require,module,exports){ +"use strict"; -// :: (Pos, ?number) → Transform -// Split at the given position, _if_ that position isn't already at -// the start or end of a node. If `depth` is greater than one, also do -// so for parent positions above the given position. -_transform.Transform.prototype.splitIfNeeded = function (pos) { - var depth = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; +Object.defineProperty(exports, "__esModule", { + value: true +}); - for (var off = 0; off < depth; off++) { - var here = pos.shorten(pos.depth - off); - if (here.offset && here.offset < this.doc.path(here.path).size) this.step("split", null, null, here); - } - return this; +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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 _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); + +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var _input = require("./input"); + +var RadioButton = (function (_Input) { + _inherits(RadioButton, _Input); + + function RadioButton() { + _classCallCheck(this, RadioButton); + + _get(Object.getPrototypeOf(RadioButton.prototype), "constructor", this).apply(this, arguments); + } + + return RadioButton; +})(_input.Input); + +exports.RadioButton = RadioButton; + +RadioButton.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + type: new _gitProsemirrorDistModel.Attribute({ "default": "radio" }), + value: new _gitProsemirrorDistModel.Attribute(), + "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-radiobutton" }) }; -},{"../model":45,"./map":59,"./step":63,"./transform":64}],63:[function(require,module,exports){ +(0, _utils.defParser)(RadioButton, "input", "widgets-radiobutton"); + +// inherits serializer from input + +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-radiobutton {}\n\n"); + +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],65:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -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(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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 _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); + +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); + +var _utils = require("../utils"); + +var Scale = (function (_Block) { + _inherits(Scale, _Block); + + function Scale() { + _classCallCheck(this, Scale); + + _get(Object.getPrototypeOf(Scale.prototype), "constructor", this).apply(this, arguments); + } -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} + return Scale; +})(_gitProsemirrorDistModel.Block); -var _model = require("../model"); +exports.Scale = Scale; -var _map = require("./map"); +Scale.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + startvalue: new _gitProsemirrorDistModel.Attribute({ "default": "1" }), + startlabel: new _gitProsemirrorDistModel.Attribute({ "default": "low" }), + endvalue: new _gitProsemirrorDistModel.Attribute({ "default": "10" }), + endlabel: new _gitProsemirrorDistModel.Attribute({ "default": "high" }) +}; -// ;; A step object wraps an atomic operation. It generally applies -// only to the document it was created for, since the positions -// associated with it will only make sense for that document. +(0, _utils.defParser)(Scale, "div", "scale"); -var Step = (function () { - // :: (string, ?Pos, ?Pos, ?Pos, ?any) - // Build a step. The type should name a [defined](Step.define) step - // type, and the shape of the positions and parameter should be - // appropriate for that type. +Scale.prototype.serializeDOM = function (node) { + var dom = (0, _gitProsemirrorDistDom.elt)("div", { "class": "widgets-scale" }); + dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", null, node.attrs.startlabel + " ")); + var startVal = Number(node.attrs.startvalue); + var endVal = Number(node.attrs.endvalue); + if (startVal < endVal) for (var i = startVal; i <= endVal; i++) { + dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _gitProsemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); + } else for (var i = startVal; i >= endVal; i--) { + dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", { "class": "widgets-scaleitem" }, (0, _gitProsemirrorDistDom.elt)("input", { name: node.attrs.name, type: "radio", value: i }), i.toString())); + } + dom.appendChild((0, _gitProsemirrorDistDom.elt)("span", null, " " + node.attrs.endlabel)); + return dom; +}; - function Step(type, from, to, pos) { - var param = arguments.length <= 4 || arguments[4] === undefined ? null : arguments[4]; +Scale.register("command", { + name: "insertScale", + label: "Scale", + run: function run(pm, name, startvalue, startlabel, endvalue, endlabel) { + return pm.tr.replaceSelection(this.create({ name: name, startvalue: startvalue, startlabel: startlabel, endvalue: endvalue, endlabel: endlabel })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Start value", type: "text", "default": 1 }, { label: "Start label", type: "text", "default": "min" }, { label: "End value", type: "text", "default": 10 }, { label: "End label", type: "text", "default": "max" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; - _classCallCheck(this, Step); + if (node) return [node.attrs.name, node.attrs.startvalue, node.attrs.startlabel, node.attrs.endvalue, node.attrs.endlabel]; + } +}); - if (!(type in steps)) throw new Error("Unknown step type: " + type); - // :: string - // The type of the step. - this.type = type; - // :: ?Pos - // The start of the step's range, if any. Which of the three - // optional positions associated with a step a given step type - // uses differs. The way each of these positions is mapped when - // the step is mapped over a [position mapping](#PosMap) depends - // on its role. - this.from = from; - // :: ?Pos - // The end of the step's range. - this.to = to; - // :: ?Pos - // The base position for this step. - this.pos = pos; - // :: ?any - // Extra step-type-specific information associated with the step. - this.param = param; - } +(0, _utils.defParamsClick)(Scale); - // ;; #toc=false Objects of this type are returned as the result of - // applying a transform step to a document. +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-scaleitem {}\t\t\n.widgets-scale {}\n\n"); - // :: (Node) → ?StepResult - // Applies this step to the given document, returning a result - // containing the transformed document (the input document is not - // changed) and a `PosMap`. If the step could not meaningfully be - // applied to the given document, this returns `null`. +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],66:[function(require,module,exports){ +"use strict"; - _createClass(Step, [{ - key: "apply", - value: function apply(doc) { - return steps[this.type].apply(doc, this); - } +Object.defineProperty(exports, "__esModule", { + value: true +}); - // :: (Node, PosMap) → Step - // Create an inverted version of this step. Needs the document as it - // was before the step, as well as `PosMap` created by applying the - // step to that document, as input. - }, { - key: "invert", - value: function invert(oldDoc, map) { - return steps[this.type].invert(this, oldDoc, map); - } +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - // :: (Mappable) → ?Step - // Map this step through a mappable thing, returning either a - // version of that step with its positions adjusted, or `null` if - // the step was entirely deleted by the mapping. - }, { - key: "map", - value: function map(remapping) { - var allDeleted = true; - var from = null, - to = null, - pos = null; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (this.from) { - var result = remapping.map(this.from, 1); - from = result.pos; - if (!result.deleted) allDeleted = false; - } - if (this.to) { - if (this.to.cmp(this.from) == 0) { - to = from; - } else { - var result = remapping.map(this.to, -1); - to = result.pos.max(from); - if (!result.deleted) allDeleted = false; - } - } - if (this.pos) { - if (from && this.pos.cmp(this.from) == 0) { - pos = from; - } else if (to && this.pos.cmp(this.to) == 0) { - pos = to; - } else { - var result = remapping.map(this.pos, 1); - pos = result.pos; - if (!result.deleted) allDeleted = false; - } - } - return allDeleted ? null : new Step(this.type, from, to, pos, this.param); - } +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; } - // :: () → Object - // Create a JSON-serializeable representation of this step. - }, { - key: "toJSON", - value: function toJSON() { - var impl = steps[this.type]; - return { - type: this.type, - from: this.from, - to: this.to, - pos: this.pos, - param: impl.paramToJSON ? impl.paramToJSON(this.param) : this.param - }; - } +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - // :: (Schema, Object) → Step - // Deserialize a step from its JSON representation. - }], [{ - key: "fromJSON", - value: function fromJSON(schema, json) { - var impl = steps[json.type]; - return new Step(json.type, json.from && _model.Pos.fromJSON(json.from), json.to && _model.Pos.fromJSON(json.to), json.pos && _model.Pos.fromJSON(json.pos), impl.paramFromJSON ? impl.paramFromJSON(schema, json.param) : json.param); - } +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - // :: (string, Object) - // Define a new type of step. Implementation should have the - // following properties: - // - // **`apply`**`(doc: Node, step: Step) → ?StepResult - // : Applies the step to a document. - // **`invert`**`(step: Step, oldDoc: Node, map: PosMap) → Step - // : Create an inverted version of the step. - // **`paramToJSON`**`(param: ?any) → ?Object - // : Serialize this step type's parameter to JSON. - // **`paramFromJSON`**`(schema: Schema, json: ?Object) → ?any - // : Deserialize this step type's parameter from JSON. - }, { - key: "define", - value: function define(type, implementation) { - steps[type] = implementation; - } - }]); +var _utils = require("../utils"); - return Step; -})(); +var Select = (function (_Inline) { + _inherits(Select, _Inline); -exports.Step = Step; + function Select() { + _classCallCheck(this, Select); -var StepResult = function StepResult(doc) { - var map = arguments.length <= 1 || arguments[1] === undefined ? _map.nullMap : arguments[1]; + _get(Object.getPrototypeOf(Select.prototype), "constructor", this).apply(this, arguments); + } - _classCallCheck(this, StepResult); + return Select; +})(_gitProsemirrorDistModel.Inline); - // :: Node The transformed document. - this.doc = doc; - // :: PosMap - // The position map that describes the correspondence between the - // old and the new document. - this.map = map; +exports.Select = Select; + +Select.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + options: new _gitProsemirrorDistModel.Attribute(), + multiple: new _gitProsemirrorDistModel.Attribute({ "default": "single" }) }; -exports.StepResult = StepResult; +(0, _utils.defParser)(Select, "select", "widgets-select"); -var steps = Object.create(null); +Select.prototype.serializeDOM = function (node) { + var selection = node.attrs.multiple == "multiple"; + var select = (0, _gitProsemirrorDistDom.elt)("select", { name: node.attrs.name, "class": "widgets-select", size: 1, multiple: selection }); + node.attrs.options.split(",").map(function (option) { + select.appendChild((0, _gitProsemirrorDistDom.elt)("option", { value: option.trim() }, option)); + }); + return select; +}; -},{"../model":45,"./map":59}],64:[function(require,module,exports){ -"use strict"; +Select.register("command", { + name: "insertSelect", + label: "Select", + run: function run(pm, name, options, multiple) { + return pm.tr.replaceSelection(this.create({ name: name, options: options, multiple: multiple })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Options (comma separated)", type: "text" }, { label: "Selection (single or multiple)", type: "select", options: [{ value: "multiple", label: "multiple" }, { value: "single", label: "single" }] }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -Object.defineProperty(exports, "__esModule", { - value: true + if (node) { + return [node.attrs.name, node.attrs.options, node.attrs.multiple]; + } + } }); -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; - }; -})(); - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -var _step2 = require("./step"); +(0, _utils.defParamsClick)(Select); -var _map = require("./map"); +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-select {}\n\n"); -// ;; A change to a document often consists of a series of -// [steps](#Step). This class provides a convenience abstraction to -// build up and track such an array of steps. A `Transform` object -// implements `Mappable`. -// -// The high-level transforming methods return the `Transform` object -// itself, so that they can be chained. +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],67:[function(require,module,exports){ +"use strict"; -var Transform = (function () { - // :: (Node) - // Create a transformation that starts with the given document. +Object.defineProperty(exports, "__esModule", { + value: true +}); - function Transform(doc) { - _classCallCheck(this, Transform); +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - // :: [Step] - // The accumulated steps. - this.steps = []; - // :: [Node] - // The individual document versions. Always has a length one more - // than `steps`, since it also includes the original starting - // document. - this.docs = [doc]; - // :: [PosMap] - // The position maps produced by the steps. Has the same length as - // `steps`. - this.maps = []; - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // :: Node - // The current version of the transformed document. +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; } - _createClass(Transform, [{ - key: "step", +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - // :: (Step) → ?StepResult - // Add a step to this transformation. If the step can be - // [applied](#Step.apply) to the current document, the result of - // applying it is returned, and an element is added to the - // [`steps`](#Transform.steps), [`docs`](#Transform.docs), and - // [`maps`](#Transform.maps) arrays. - value: function step(_step, from, to, pos, param) { - if (typeof _step == "string") _step = new _step2.Step(_step, from, to, pos, param); - var result = _step.apply(this.doc); - if (result) { - this.steps.push(_step); - this.maps.push(result.map); - this.docs.push(result.doc); - } - return result; - } +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - // :: (Pos, ?number) → MapResult - // Map a position through the whole transformation (all the position - // maps in [`maps`](#Transform.maps)), and return the result. - }, { - key: "map", - value: function map(pos, bias) { - var deleted = false; - for (var i = 0; i < this.maps.length; i++) { - var result = this.maps[i].map(pos, bias); - pos = result.pos; - if (result.deleted) deleted = true; - } - return new _map.MapResult(pos, deleted); - } - }, { - key: "doc", - get: function get() { - return this.docs[this.docs.length - 1]; - } +var _utils = require("../utils"); - // :: Node - // The original input document. - }, { - key: "before", - get: function get() { - return this.docs[0]; - } - }]); +var SpreadSheet = (function (_Block) { + _inherits(SpreadSheet, _Block); - return Transform; -})(); + function SpreadSheet() { + _classCallCheck(this, SpreadSheet); -exports.Transform = Transform; + _get(Object.getPrototypeOf(SpreadSheet.prototype), "constructor", this).apply(this, arguments); + } -},{"./map":59,"./step":63}],65:[function(require,module,exports){ -"use strict"; + return SpreadSheet; +})(_gitProsemirrorDistModel.Block); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.copyStructure = copyStructure; -exports.copyInline = copyInline; -exports.isFlatRange = isFlatRange; -exports.replaceHasEffect = replaceHasEffect; -exports.samePathDepth = samePathDepth; +exports.SpreadSheet = SpreadSheet; -var _model = require("../model"); +SpreadSheet.attributes = { + data: new _gitProsemirrorDistModel.Attribute({ "default": "" }) +}; -function copyStructure(node, from, to, f) { - var depth = arguments.length <= 4 || arguments[4] === undefined ? 0 : arguments[4]; +(0, _utils.defParser)(SpreadSheet, "div", "widgets-spreadsheet"); - if (node.isTextblock) { - return f(node, from ? from.offset : 0, to ? to.offset : node.size); - } else { - if (!node.size) return node; - var start = from ? from.path[depth] : 0; - var end = to ? to.path[depth] + 1 : node.size; - var content = node.content.toArray(0, start); - for (var iter = node.iter(start, end), child = undefined; child = iter.next().value;) { - var passFrom = iter.offset - child.width == start ? from : null; - var passTo = iter.offset == end ? to : null; - content.push(copyStructure(child, passFrom, passTo, f, depth + 1)); - } - return node.copy(_model.Fragment.fromArray(content.concat(node.content.toArray(end)))); - } -} +SpreadSheet.prototype.serializeDOM = function (node) { + if (node.rendered) { + node.rendered = node.rendered.cloneNode(true); + } else { + node.rendered = (0, _gitProsemirrorDistDom.elt)("div", { + id: "spreadsheet", + "class": "widgets-spreadsheet" + }); + // wait until node is attached to document to render + window.setTimeout(function () { + var data = [["", "Ford", "Volvo", "Toyota", "Honda"], ["2014", 10, 11, 12, 13], ["2015", 20, 11, 14, 13], ["2016", 30, 15, 12, 13]]; -function copyInline(node, from, to, f) { - return node.splice(from, to, node.content.slice(from, to).map(f)); -} + var container = document.getElementById('spreadsheet'); + var hot = new Handsontable(container, { + data: data, + minSpareRows: 1, + rowHeaders: true, + colHeaders: true, + contextMenu: true + }); + }, 100); + } + return node.rendered; +}; -function isFlatRange(from, to) { - if (from.path.length != to.path.length) return false; - for (var i = 0; i < from.path.length; i++) { - if (from.path[i] != to.path[i]) return false; - }return from.offset <= to.offset; -} +SpreadSheet.register("command", { + name: "insertSpreadSheet", + label: "SpreadSheet", + run: function run(pm, data) { + return pm.tr.replaceSelection(this.create({ data: data })).apply(_utils.andScroll); + }, + params: [{ label: "Link to data csv (fixed for demo)", type: "text", "default": "cars.csv" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -function canBeJoined(node, offset, depth) { - if (!depth || offset == 0 || offset == node.size) return false; - var left = node.child(offset - 1), - right = node.child(offset); - return left.sameMarkup(right); -} + if (node) return [node.attrs.data]; + } +}); -function replaceHasEffect(doc, from, to) { - for (var depth = 0, node = doc;; depth++) { - var fromEnd = depth == from.depth, - toEnd = depth == to.depth; - if (fromEnd || toEnd || from.path[depth] != to.path[depth]) { - var gapStart = undefined, - gapEnd = undefined; - if (fromEnd) { - gapStart = from.offset; - } else { - gapStart = from.path[depth] + 1; - for (var i = depth + 1, n = node.child(gapStart - 1); i <= from.path.length; i++) { - if (i == from.path.length) { - if (from.offset < n.size) return true; - } else { - if (from.path[i] + 1 < n.size) return true; - n = n.child(from.path[i]); - } - } - } - if (toEnd) { - gapEnd = to.offset; - } else { - gapEnd = to.path[depth]; - for (var i = depth + 1; i <= to.path.length; i++) { - if ((i == to.path.length ? to.offset : to.path[i]) > 0) return true; - } - } - if (gapStart != gapEnd) return true; - return canBeJoined(node, gapStart, Math.min(from.depth, to.depth) - depth); - } else { - node = node.child(from.path[depth]); - } - } -} +(0, _utils.defParamsClick)(SpreadSheet); -function samePathDepth(a, b) { - for (var i = 0;; i++) { - if (i == a.path.length || i == b.path.length || a.path[i] != b.path[i]) return i; - } -} +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-spreadsheet {}\n\n"); -},{"../model":45}],66:[function(require,module,exports){ +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],68:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -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(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -var _get = function get(_x, _x2, _x3) { - var _again = true;_function: while (_again) { - var object = _x, - property = _x2, - receiver = _x3;_again = false;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 { - _x = parent;_x2 = property;_x3 = receiver;_again = true;desc = parent = undefined;continue _function; - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get;if (getter === undefined) { - return undefined; - }return getter.call(receiver); - } - } -}; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} +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; } -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 _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); -var ProseMirrorError = (function (_Error) { - _inherits(ProseMirrorError, _Error); +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - function ProseMirrorError(message) { - _classCallCheck(this, ProseMirrorError); +var _utils = require("../utils"); + +var TextArea = (function (_Block) { + _inherits(TextArea, _Block); + + function TextArea() { + _classCallCheck(this, TextArea); + + _get(Object.getPrototypeOf(TextArea.prototype), "constructor", this).apply(this, arguments); + } + + return TextArea; +})(_gitProsemirrorDistModel.Block); + +exports.TextArea = TextArea; + +TextArea.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + rows: new _gitProsemirrorDistModel.Attribute(), + cols: new _gitProsemirrorDistModel.Attribute(), + "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-textarea" }) +}; - _get(Object.getPrototypeOf(ProseMirrorError.prototype), "constructor", this).call(this, message); - if (this.message != message) { - this.message = message; - if (Error.captureStackTrace) Error.captureStackTrace(this, this.name);else this.stack = new Error(message).stack; - } - } +(0, _utils.defParser)(TextArea, "input", "widgets-textarea"); - _createClass(ProseMirrorError, [{ - key: "name", - get: function get() { - return this.constructor.name || functionName(this.constructor) || "ProseMirrorError"; - } - }], [{ - key: "raise", - value: function raise(message) { - throw new this(message); - } - }]); +TextArea.prototype.serializeDOM = function (node, s) { + return s.renderAs(node, "textarea", node.attrs); +}; - return ProseMirrorError; -})(Error); +TextArea.register("command", { + name: "insertTextArea", + label: "TextArea", + run: function run(pm, name, rows, cols) { + return pm.tr.replaceSelection(this.create({ name: name, rows: rows, cols: cols })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Rows", type: "text", "default": "4" }, { label: "Columns", type: "text", "default": "20" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -exports.ProseMirrorError = ProseMirrorError; + if (node) return [node.attrs.name, node.attrs.rows, node.attrs.cols]; + } +}); -function functionName(f) { - var match = /^function (\w+)/.exec(f.toString()); - return match && match[1]; -} +(0, _utils.defParamsClick)(TextArea); -},{}],67:[function(require,module,exports){ -// ;; #path=EventMixin #kind=interface -// A set of methods for objects that emit events. Added by calling -// `eventMixin` on a constructor. +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-textarea {}\n\n"); +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53}],69:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -exports.eventMixin = eventMixin; -var methods = { - // :: (type: string, handler: (...args: [any])) #path=EventMixin.on - // Register an event handler for the given event type. - on: function on(type, f) { - var map = this._handlers || (this._handlers = {}); - var arr = map[type] || (map[type] = []); - arr.push(f); - }, - // :: (type: string, handler: (...args: [any])) #path=EventMixin.off - // Unregister an event handler for the given event type. - off: function off(type, f) { - var arr = this._handlers && this._handlers[type]; - if (arr) for (var i = 0; i < arr.length; ++i) { - if (arr[i] == f) { - arr.splice(i, 1);break; - } - } - }, +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - // :: (type: string, ...args: [any]) #path=EventMixin.signal - // Signal an event of the given type, passing any number of - // arguments. Will call the handlers for the event, passing them the - // arguments. - signal: function signal(type) { - var arr = this._handlers && this._handlers[type]; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - values[_key - 1] = arguments[_key]; - } +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; } - if (arr) for (var i = 0; i < arr.length; ++i) { - arr[i].apply(arr, values); - } - }, +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - // :: (type: string, ...args: [any]) #path=EventMixin.signalHandleable - // Signal a handleable event of the given type. All handlers for the - // event will be called with the given arguments, until one of them - // returns something that is not the value `false`. When that - // happens, the return value of that handler is returned. If that - // does not happen, `false` is returned. - signalHandleable: function signalHandleable(type) { - var arr = this._handlers && this._handlers[type]; - if (arr) { - for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - values[_key2 - 1] = arguments[_key2]; - } +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); - for (var i = 0; i < arr.length; ++i) { - var result = arr[i].apply(arr, values); - if (result !== false) return result; - } - }return false; - }, +var _input = require("./input"); - // :: (type: string) → bool #path=EventMixin.hasHandler - // Query whether there are any handlers for this event type. - hasHandler: function hasHandler(type) { - var arr = this._handlers && this._handlers[type]; - return arr && arr.length > 0; - } +var _utils = require("../utils"); + +var TextField = (function (_Input) { + _inherits(TextField, _Input); + + function TextField() { + _classCallCheck(this, TextField); + + _get(Object.getPrototypeOf(TextField.prototype), "constructor", this).apply(this, arguments); + } + + return TextField; +})(_input.Input); + +exports.TextField = TextField; + +TextField.attributes = { + name: new _gitProsemirrorDistModel.Attribute(), + type: new _gitProsemirrorDistModel.Attribute({ "default": "text" }), + size: new _gitProsemirrorDistModel.Attribute({ "default": "20" }), + "class": new _gitProsemirrorDistModel.Attribute({ "default": "widgets-textfield" }) }; -// :: (()) -// Add the methods in the `EventMixin` interface to the prototype -// object of the given constructor. +(0, _utils.defParser)(TextField, "input", "widgets-textfield"); -function eventMixin(ctor) { - var proto = ctor.prototype; - for (var prop in methods) if (methods.hasOwnProperty(prop)) proto[prop] = methods[prop]; -} +// serializer inherits from input + +TextField.register("command", { + name: "insertTextField", + label: "TextField", + run: function run(pm, name, size) { + return pm.tr.replaceSelection(this.create({ name: name, size: size })).apply(_utils.andScroll); + }, + params: [{ label: "Name", type: "text" }, { label: "Size", type: "text", "default": "20" }], + prefillParams: function prefillParams(pm) { + var node = pm.selection.node; -},{}],68:[function(require,module,exports){ + if (node) return [node.attrs.name, node.attrs.size]; + } +}); + +(0, _utils.defParamsClick)(TextField); + +(0, _gitProsemirrorDistDom.insertCSS)("\n\n.widgets-textfield {}\n\n"); + +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/model":27,"../utils":53,"./input":62}],70:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); -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(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; 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 { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Map = window.Map || (function () { - function _class() { - _classCallCheck(this, _class); +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; } - this.content = []; - } +var _gitProsemirrorDistMenuMenu = require("../../../../git/prosemirror/dist/menu/menu"); - _createClass(_class, [{ - key: "set", - value: function set(key, value) { - var found = this.find(key); - if (found > -1) this.content[found + 1] = value;else this.content.push(key, value); - } - }, { - key: "get", - value: function get(key) { - var found = this.find(key); - return found == -1 ? undefined : this.content[found + 1]; - } - }, { - key: "has", - value: function has(key) { - return this.find(key) > -1; - } - }, { - key: "find", - value: function find(key) { - for (var i = 0; i < this.content.length; i += 2) { - if (this.content[i] === key) return i; - } - } - }, { - key: "clear", - value: function clear() { - this.content.length = 0; - } - }, { - key: "size", - get: function get() { - return this.content.length / 2; - } - }]); +var _gitProsemirrorDistModel = require("../../../../git/prosemirror/dist/model"); - return _class; -})(); -exports.Map = Map; +var _gitProsemirrorDistDom = require("../../../../git/prosemirror/dist/dom"); -},{}],69:[function(require,module,exports){ -"use strict"; +var widgets = ["Image", "TextField", "TextArea", "CheckBox", "Select", "CarryForward", "IFrame", "InlineMath", "BlockMath", "SpreadSheet", "MultipleChoice", "Scale", "CheckList"]; -Object.defineProperty(exports, "__esModule", { - value: true +var insertWidget = widgets.map(function (w) { + return { + value: "insert" + w, + display: function display() { + return (0, _gitProsemirrorDistDom.elt)("span", null, w); + } + }; }); -exports["default"] = sortedInsert; -function sortedInsert(array, elt, compare) { - var i = 0; - for (; i < array.length; i++) if (compare(array[i], elt) > 0) break; - array.splice(i, 0, elt); -} +var Widget = (function (_Textblock) { + _inherits(Widget, _Textblock); -module.exports = exports["default"]; + function Widget() { + _classCallCheck(this, Widget); + + _get(Object.getPrototypeOf(Widget.prototype), "constructor", this).apply(this, arguments); + } + + return Widget; +})(_gitProsemirrorDistModel.Textblock); + +exports.Widget = Widget; + +Widget.register("command", { + name: "insertWidget", + label: "Insert...", + select: function select(pm) { + return true; + }, + params: [{ name: "Widget type", type: "select", options: insertWidget, defaultLabel: "Insert..." }], + run: function run(pm, type) { + var menu = pm.mod.menuBar.menu; + var cmd = pm.commands[type]; + if (menu && cmd) menu.enter((0, _gitProsemirrorDistMenuMenu.readParams)(cmd)); + }, + display: "select", + menuGroup: "block", + menuRank: 99 +}); -},{}]},{},[1]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvbWFpbi5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3V0aWxzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9ibG9ja21hdGguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2NoZWNrYm94LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2xpc3QuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2lmcmFtZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaW1hZ2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9pbmxpbmVtYXRoLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvbXVsdGlwbGVjaG9pY2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3JhZGlvYnV0dG9uLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9zY2FsZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2VsZWN0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9zcHJlYWRzaGVldC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvdGV4dGFyZWEuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRmaWVsZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvd2lkZ2V0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb20vaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2FwdHVyZWtleXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2hhci5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jb21tYW5kcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jc3MuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvZG9tY2hhbmdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L2RyYXcuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvaGlzdG9yeS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9rZXlzLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L21haW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvb3B0aW9ucy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9yYW5nZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2lucHV0cnVsZXMvYXV0b2lucHV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2lucHV0cnVsZXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvaWNvbnMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdG9vbHRpcG1lbnUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdXBkYXRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kZWZhdWx0c2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kaWZmLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9mcmFnbWVudC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL21hcmsuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL25vZGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL3Bvcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvc2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS9kb20uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3BhcnNlL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvZG9tLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3NlcmlhbGl6ZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vYW5jZXN0b3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL2pvaW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXJrLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vcmVwbGFjZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3NwbGl0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vc3RlcC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyYW5zZm9ybS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyZWUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXJyb3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXZlbnQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvbWFwLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC91dGlsL3NvcnRlZGluc2VydC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O21DQ0EwQiw2QkFBNkI7O2tDQUMvQiw0QkFBNEI7O1FBQzdDLHlDQUF5Qzs7UUFDekMscUNBQXFDOztRQUNyQyw2Q0FBNkM7O29DQUljLDhCQUE4Qjs7dUJBSTdCLFdBQVc7O0FBRzlFLElBQU0sV0FBVyxHQUFHLHFDQUFlO0FBQ2xDLElBQUcsMkJBQUs7QUFDUixXQUFVLGtDQUFZO0FBQ3RCLGFBQVksbUNBQWE7QUFDekIsWUFBVyxrQ0FBWTtBQUN2QixVQUFTLGdDQUFVO0FBQ25CLGdCQUFlLHNDQUFnQjs7QUFFL0IsVUFBUyxpQ0FBVztBQUNwQixRQUFPLCtCQUFTOztBQUVoQixLQUFJLDRCQUFNO0FBQ1Ys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QUUsUUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLEFBQUMsSUFBSTtBQUFFLFdBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUEsQ0FBRSxJQUFJLENBQUEsQUFBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7QUFBRSxZQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxBQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU07T0FBRTtLQUFFLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFBRSxRQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUFFLFNBQVM7QUFBRSxVQUFJO0FBQUUsWUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7T0FBRSxTQUFTO0FBQUUsWUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7T0FBRTtLQUFFLEFBQUMsT0FBTyxJQUFJLENBQUM7R0FBRSxBQUFDLE9BQU8sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQUUsUUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxHQUFHLENBQUM7S0FBRSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFBRSxhQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FBRSxNQUFNO0FBQUUsWUFBTSxJQUFJLFNB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RUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLO0FBQ3JGLElBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxLQUFLO0FBQzVGLElBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxRQUFRO0FBQ3hGLElBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSztBQUMvRCxLQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVE7QUFDL0QsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDbkcsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVE7QUFDOUYsT0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUTtDQUNqRixDQUFDOztBQUVGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztBQUU1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNCLFVBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakQ7QUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdCLFVBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3RDO0FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QixVQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUNuRDs7Ozs7Ozs7Ozs7O0FBWUQsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFO0FBQ3RCLE1BQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO01BQzlCLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEIsTUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUM7O0FBRW5ELE1BQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3hELE1BQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksTUFBTSxFQUFFLElBQUksR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQzNELE1BQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3pELE1BQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFLElBQUksR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzlELFNBQU8sSUFBSSxDQUFDO0NBQ2I7Ozs7O0FBS0QsU0FBUyxhQUFhLENBQUMsSUFBSSxFQUFFO0FBQzNCLE1BQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFNBQU8sSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQztDQUM1RTs7Ozs7Ozs7OztBQVVELFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO0FBQzlCLE1BQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO01BQzlCLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFJLEdBQUcsR0FBRyxTQUFTO01BQ2YsSUFBSSxHQUFHLFNBQVM7TUFDaEIsS0FBSyxHQUFHLFNBQVM7TUFDakIsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUNwQixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsUUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFFBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN0TixVQUFJLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQztLQUN0QyxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUcsR0FBRyxDQUFDLENBQUM7R0FDOUQ7QUFDRCxNQUFJLEdBQUcsRUFBRSxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFJLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUNwQyxNQUFJLEdBQUcsRUFBRSxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUN0QyxTQUFPLE1BQU0sQ0FBQztDQUNmOzs7OztBQUtELElBQUksTUFBTSxHQUFHLENBQUMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7O0FBZXhCLFdBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDN0IsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBRTlCLFFBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUM3QixRQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsUUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDbEMsVUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ2xHO0dBQ0Y7Ozs7O0FBS0QsY0FBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLE9BQUcsRUFBRSxZQUFZO0FBQ2pCLFNBQUssRUFBRSxTQUFTLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQ3pDLFVBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUQsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEMsWUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxZQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMvQyxZQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFlBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsQ0FBQztPQUNuSDtLQUNGOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxlQUFlO0FBQ3BCLFNBQUssRUFBRSxTQUFTLGFBQWEsQ0FBQyxPQUFPLEVBQUU7QUFDckMsVUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM1RCxXQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsWUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLFlBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEMsWUFBSSxHQUFHLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ2pHO0tBQ0Y7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGFBQWE7QUFDbEIsU0FBSyxFQUFFLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRTtBQUNoQyxXQUFLLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDakMsWUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUM7T0FDN0csT0FBTyxJQUFJLENBQUM7S0FDZDs7Ozs7OztHQU9GLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLFNBQUssRUFBRSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ25DLGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDakY7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLE1BQU0sQ0FBQztDQUNmLENBQUEsRUFBRyxDQUFDOztBQUVMLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOzs7QUNwTHhCLFlBQVksQ0FBQzs7QUFFYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFBRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxTQUFTLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBRSxRQUFJLE1BQU0sR0FBRyxHQUFHO1FBQUUsUUFBUSxHQUFHLEdBQUc7UUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsV0FBRyxHQUFHLE1BQU0sQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQUU7R0FBRTtDQUFFLENBQUM7O0FBRXJwQixJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxBQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxBQUFDLE9BQU8sV0FBVyxDQUFDO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUV0akIsU0FBUyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUU7QUFBRSxTQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUFFOztBQUVqRyxTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQUUsTUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQztHQUFFLEFBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxBQUFDLElBQUksVUFBVSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7Q0FBRTs7QUFFOWUsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtBQUFFLE1BQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFBLEFBQUMsRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQztHQUFFO0NBQUU7O0FBRXpKLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7O0FBRXpDLElBQUksaUJBQWlCLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7O0FBRXhELElBQUksa0JBQWtCLEdBQUcsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7QUFFbkUsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztBQUV0QyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O0FBRTFDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFN0IsSUFBSSxjQUFjLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7O0FBRWxELE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzs7QUFFekIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7O0FBRXpDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7QUFFcEMsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztBQUV6QyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFaEMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDOztBQUVwQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7O0FBRXRDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFaEMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0FBVTlCLElBQUksV0FBVyxHQUFHLENBQUMsWUFBWTs7Ozs7O0FBTTdCLFdBQVMsV0FBVyxDQUFDLElBQUksRUFBRTtBQUN6QixtQkFBZSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQzs7QUFFbkMsUUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFDOzs7QUFHdkQsUUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzFCLFFBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHaEcsUUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFBLENBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQzs7O0FBR3hFLFFBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQSxDQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUUsUUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztBQUVoQyxRQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUU3SCxRQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQSxDQUFFLElBQUksQ0FBQyxNQUFN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QUMsTUFBTSxDQUFDLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLE1BQU07QUFBRSxVQUFFLEdBQUcsTUFBTSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsQUFBQyxTQUFTLFNBQVMsQ0FBQztPQUFFO0tBQUUsTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFBRSxhQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FBRSxNQUFNO0FBQUUsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsQUFBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FBRTtHQUFFO0NBQUUsQ0FBQzs7QUFFbHBCLElBQUksWUFBWSxHQUFHLENBQUMsWUFBWTtBQUFFLFdBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUFFLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQUUsVUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxBQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUFFO0dB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QSxFQUFHLENBQUM7O0FBRXRqQixJQUFJLElBQUksR0FBRyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUFFLE1BQUksTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLFNBQVMsRUFBRSxPQUFPLE1BQU0sRUFBRTtBQUFFLFFBQUksTUFBTSxHQUFHLEVBQUU7UUFBRSxRQUFRLEdBQUcsR0FBRztRQUFFLFFBQVEsR0FBRyxHQUFHLENBQUMsQUFBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEFBQUMsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxBQUFDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUFFLFVBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLE1BQU07QUFBRSxVQUFFLEdBQUcsTUFBTSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsQUFBQyxTQUFTLFNBQVMsQ0FBQztPQUFFO0tBQUUsTUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFBRSxhQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FBRSxNQUFNO0FBQUUsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsQUFBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FBRTtHQUFFO0NBQUUsQ0FB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QUFJLEtBQUssQ0FBQyxBQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUFFO0dBQUUsQUFBQyxPQUFPLFVBQVUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFBRSxRQUFJLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEFBQUMsSUFBSSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEFBQUMsT0FBTyxXQUFXLENBQUM7R0FBRSxDQUFDO0NBQUUsQ0FBQSxFQUFHLENBQUM7O0FBRXRqQixTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQUUsTUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQztHQUFFLEFBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxBQUFDLElBQUksVUFBVSxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7Q0FBRTs7QUFFOWUsU0FBUyxlQUFlLENBQUMs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SSxJQUFJLEdBQUcsRUFBRSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEFBQUMsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLEFBQUMsSUFBSTtBQUFFLFdBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUEsQ0FBRSxJQUFJLENBQUEsQUFBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUU7QUFBRSxZQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxBQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU07T0FBRTtLQUFFLENBQUMsT0FBTyxHQUFHLEVBQUU7QUFBRSxRQUFFLEdBQUcsSUFBSSxDQUFDLEFBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUFFLFNBQVM7QUFBRSxVQUFJO0FBQUUsWUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7T0FBRSxTQUFTO0FBQUUsWUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7T0FBRTtLQUFFLEFBQUMsT0FBTyxJQUFJLENBQUM7R0FBRSxBQUFDLE9BQU8sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQUUsUUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxHQUFHLENBQUM7S0FBRSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFBRSxhQUFPLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FBRSxNQUFNO0FBQUUsWUFBTSxJQUFJLFNBQVMsQ0FB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QUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7QUFDekcsZUFBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7T0FDckM7O0FBRUQsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkMsY0FBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDdEcsT0FBTyxNQUFNLENBQUM7S0FDaEI7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsU0FBSyxFQUFFLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7QUFDdkMsVUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLFdBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDaEMsWUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQzdFO0FBQ0QsVUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFN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LE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztHQUNyRTtBQUNELFFBQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUN6QyxRQUFJLEtBQUssR0FBRyxFQUFFO1FBQ1YsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLFFBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9ELFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxXQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixXQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5QjtBQUNELFFBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNyQyxRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUN4RSxXQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxD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LE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO0FBQzdDLFlBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixjQUFNO09BQ1A7QUFDRCxVQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU07QUFDMUIsU0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzVCO0FBQ0QsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsVUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNsQixZQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsWUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUs7WUFDcEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxlQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsYUFBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFN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QyxNQUFNLEdBQUcsQ0FBQztRQUN2QixNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixRQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3hGLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0IsVUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0tBQ3JDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLFFBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQzFCLFFBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDcEMsUUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUMsUUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUU1RyxRQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxF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QyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakosU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7QUNsRkYsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxBQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxBQUFDLE9BQU8sV0FBVyxDQUFDO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUV0akIsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtBQUFFLE1BQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFBLEFBQUMsRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQztHQUFFO0NBQUU7O0FBRXpKLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQWFqQyxJQUFJLFVBQVUsR0FBRyxDQUFDLFlBQVk7QUFDNUIsV0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtBQUMvQixRQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJGLG1CQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDOztBQUVsQyxRQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixRQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixRQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztHQUNsQjs7QUFFRCxjQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEIsT0FBRyxFQUFFLFVBQVU7QUFDZixTQUFLLEVBQUUsU0FBUyxRQUFRLEdBQUc7QUFDekIsYUFBTyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7S0FDNUU7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLEtBQUs7QUFDVixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZFO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxVQUFVLENBQUM7Q0FDbkIsQ0FBQSxFQUFHLENBQUM7O0FBRUwsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7O0FBRWhDLElBQUksSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFO0FBQ3RDLGlCQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztBQUU1QixNQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixNQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNiLE1BQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQ2hCLENBQUM7O0FBRUYsSUFBSSxhQUFhLEdBQUcsQ0FBQyxZQUFZO0FBQy9CLFdBQVMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtBQUMvQyxRQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEYsUUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFGLFdBQU8sQ0FBQyxZQUFZO0FBQ2xCLHFCQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDOztBQUVyQyxVQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdEMsVUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQy9DLENBQUEsQ0FBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0dBQzNCOztBQUVELGNBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUMzQixPQUFHLEVBQUUsVUFBVTtBQUNmLFNBQUssRUFBRSxTQUFTLFFBQVEsR0FBRztBQUN6QixhQUFPLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7S0FDeEg7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLGFBQWEsQ0FBQztDQUN0QixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQzs7QUFFdEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDOztBQUVmLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDN0IsTUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN0QyxRQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsU0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNELFVBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDMUMsTUFBTTtBQUNMLFdBQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUNyRDtDQUNGOztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUN4QyxNQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQzs7QUFFakMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQzdDLFFBQUksSUFBSSxHQUFHLFNBQVM7UUFDaEIsS0FBSyxHQUFHLFNBQVMsQ0FBQztBQUN0QixRQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLElBQUssQ0FBQyxFQUFFO0FBQ3ZFLFVBQUksS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDOUMsYUFBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEtBQUssQ0FBQSxBQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDOUg7R0FDRjs7QUFFRCxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsUUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixRQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQzVDLFFBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzNHLFVBQUksSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDM0MsVUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN4QixVQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFO0FBQ3JCLFlBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBLEFBQUMsQ0FBQztBQUM1RCxlQUFPLElBQUksU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7T0FDOUcsTUFBTTtBQUNMLGVBQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUEsQUFBQyxDQUFDLENBQUMsQ0FBQztPQUM1RjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUMzQjs7Ozs7O0FBTUQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxZQUFZO0FBQ3hCLFdBQVMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDL0IsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBRTlCLFFBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQztBQUM1QixRQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUM7R0FDbkM7Ozs7QUFJRCxjQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDcEIsT0FBRyxFQUFFLFNBQVM7QUFDZCxTQUFLLEVBQUUsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQzlCLGFBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3RFOzs7Ozs7OztHQVFGLEVBQUU7QUFDRCxPQUFHLEVBQUUsS0FBSztBQUNWLFNBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQzdCLGFBQU8sVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzNDOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLFNBQUssRUFBRSxTQUFTLE1BQU0sR0FBRztBQUN2QixhQUFPLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2pDO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxVQUFVO0FBQ2YsU0FBSyxFQUFFLFNBQVMsUUFBUSxHQUFHO0FBQ3pCLGFBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNuRDtHQUNGLENBQUMsQ0FBQyxDQUFDOztBQUVKLFNBQU8sTUFBTSxDQUFDO0NBQ2YsQ0FBQSxFQUFHLENBQUM7O0FBRUwsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0FBRXhCLElBQUksU0FBUyxHQUFHLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUN0QyxNQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsTUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV4RixpQkFBZSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzs7O0FBR2pDLE1BQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDOzs7QUFHZixNQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUN2QixNQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUN4QixDQUFDOztBQUVGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztBQUU5QixJQUFJLGNBQWMsR0FBRyxDQUFDLFlBQVk7QUFDaEMsV0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFO0FBQzNCLG1CQUFlLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDOztBQUV0QyxRQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztHQUNsQjs7QUFFRCxjQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDNUIsT0FBRyxFQUFFLFNBQVM7QUFDZCxTQUFLLEVBQUUsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQzlCLGFBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM3RTtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsS0FBSztBQUNWLFNBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQzdCLGFBQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNoRDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLFNBQUssRUFBRSxTQUFTLE1BQU0sR0FBRztBQUN2QixhQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkI7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFVBQVU7QUFDZixTQUFLLEVBQUUsU0FBUyxRQUFRLEdBQUc7QUFDekIsYUFBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUN6QjtHQUNGLENBQUMsQ0FBQyxDQUFDOztBQUVKLFNBQU8sY0FBYyxDQUFDO0NBQ3ZCLENBQUEsRUFBRyxDQUFDOztBQUVMLElBQUksT0FBTyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7O0FBRTNCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7Ozs7OztBQVExQixJQUFJLFNBQVMsR0FBRyxDQUFDLFlBQVk7OztBQUczQixXQUFTLFNBQVMsR0FBRztBQUNuQixRQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsUUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFFBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXRHLG1CQUFlLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7QUFNakMsUUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7O0FBRWpCLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0dBQ3RCOzs7Ozs7Ozs7QUFTRCxjQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDdkIsT0FBRyxFQUFFLFlBQVk7QUFDakIsU0FBSyxFQUFFLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDcEMsVUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsVUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUMzQixVQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDekMsYUFBTyxFQUFFLENBQUM7S0FDWDs7Ozs7O0dBTUYsRUFBRTtBQUNELE9BQUcsRUFBRSxXQUFXO0FBQ2hCLFNBQUssRUFBRSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQ25DLFVBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLFVBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM5QixVQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekMsYUFBTyxFQUFFLENBQUM7S0FDWDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsS0FBSztBQUNWLFNBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUU7QUFDdEIsYUFBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNwRDs7Ozs7R0FLRixFQUFFO0FBQ0QsT0FBRyxFQUFFLEtBQUs7QUFDVixTQUFLLEVBQUUsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtBQUM3QixVQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7O0FBRXBCLFdBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekQsWUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixZQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7QUFDbEIsY0FBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixjQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDaEIsYUFBQyxHQUFHLElBQUksQ0FBQztBQUNULGVBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0MscUJBQVM7V0FDVjtTQUNGO0FBQ0QsWUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDbkMsV0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7T0FDbEI7O0FBRUQsYUFBTyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDcEM7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFNBQVMsQ0FBQztDQUNsQixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzs7O0FDbFU5QixZQUFZLENBQUM7O0FBRWIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRXhDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFOUIsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztBQVc5QixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7QUFDM0IsT0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDL0IsV0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQSxDQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUN0RyxVQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELGFBQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQSxDQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsSUFBSSxFQUFFO0FBQzNELGVBQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztPQUNuRCxDQUFDLENBQUM7S0FDSixDQUFDLENBQUMsQ0FBQztHQUNMO0FBQ0QsUUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQzFDLFdBQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3hGO0FBQ0QsYUFBVyxFQUFFLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUN2QyxXQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztHQUN2QjtBQUNELGVBQWEsRUFBRSxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQ2xELFdBQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNsQztDQUNGLENBQUMsQ0FBQzs7OztBQUlILFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQ2pFLE1BQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7QUFFakIsTUFBSSxPQUFPLEdBQUcsRUFBRTtNQUNaLEtBQUssR0FBRyxFQUFFO01BQ1YsUUFBUSxHQUFHLElBQUk7TUFDZixNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLE1BQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDOUUsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7QUFFdkIsUUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2pFLFlBQU0sR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO0tBQzFCLE1BQU07QUFDTCxVQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxVQUFJLEVBQUUsRUFBRTtBQUNOLFlBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JDLGtCQUFRLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDekMsTUFBTTtBQUNMLGtCQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLGlCQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hCO09BQ0YsTUFBTSxJQUFJLFFBQVEsRUFBRTtBQUNuQixnQkFBUSxHQUFHLElBQUksQ0FBQztPQUNqQjtBQUNELFVBQUksTUFBTSxFQUFFO0FBQ1YsY0FBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO09BQ3ZDLE1BQU07QUFDTCxjQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZHLGFBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7T0FDcEI7S0FDRjtHQUNGLENBQUMsQ0FBQztBQUNILFNBQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDM0IsV0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3RCLENBQUMsQ0FBQztBQUNILE9BQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDekIsV0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3RCLENBQUMsQ0FBQztBQUNILFNBQU8sSUFBSSxDQUFDO0NBQ2IsQ0FBQzs7QUFFRixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7QUFDOUIsT0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDL0IsV0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQSxDQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUN0RyxhQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUEsQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLElBQUksRUFBRTtBQUMzRCxlQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7T0FDeEQsQ0FBQyxDQUFDO0tBQ0osQ0FBQyxDQUFDLENBQUM7R0FDTDtBQUNELFFBQU0sRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRTtBQUMxQyxXQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUNyRjtBQUNELGFBQVcsRUFBRSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDdkMsV0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDdkI7QUFDRCxlQUFhLEVBQUUsU0FBUyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUNsRCxXQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDbEM7Q0FDRixDQUFDLENBQUM7Ozs7O0FBS0gsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUM5RCxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRWxCLE1BQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFckYsTUFBSSxPQUFPLEdBQUcsRUFBRTtNQUNaLElBQUksR0FBRyxDQUFDLENBQUM7QUFDYixNQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDdkUsUUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7QUFFeEIsUUFBSSxFQUFFLENBQUM7QUFDUCxRQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDcEIsUUFBSSxJQUFJLFlBQVksTUFBTSxDQUFDLFFBQVEsRUFBRTtBQUNuQyxVQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFVBQUksS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQy9CLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFDZixVQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDNUMsTUFBTTtBQUNMLGNBQVEsR0FBRyxLQUFLLENBQUM7S0FDbEI7QUFDRCxRQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQy9CLFVBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEMsWUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoQixLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQ3RCLGFBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLGNBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixjQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQzlEO0FBQ0QsWUFBSSxLQUFLLEVBQUU7QUFDVCxlQUFLLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsZUFBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDbkIsTUFBTTtBQUNMLGlCQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMzRztPQUNGO0tBQ0Y7R0FDRixDQUFDLENBQUM7QUFDSCxTQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQzNCLFdBQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDL0QsQ0FBQyxDQUFDO0FBQ0gsU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7Ozs7QUFNRixVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtBQUMxRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRWxCLE1BQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDdkUsUUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN4QixRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDOztBQUV0QixRQUFJLFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQzlELFVBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsVUFBSSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxjQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRixhQUFPO0tBQ1I7QUFDRCxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxVQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsVUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3RELFlBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEIsY0FBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUMv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QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLElBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzFDLE1BQUksS0FBSyxHQUFHLEtBQUs7TUFDYixHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEUsTUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRCxNQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkQsTUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFNBQU8sTUFBTSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUUsVUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2YsWUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQ2xCO0FBQ0QsTUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcs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QyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDalMsV0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0dBQ3hDO0FBQ0QsUUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQzFDLFdBQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hFO0FBQ0QsYUFBVyxFQUFFLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtBQUN2QyxXQUFPLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQy9EO0FBQ0QsZUFBYSxFQUFFLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbEQsV0FBTyxJ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LFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQUFBQyxPQUFPLFdBQVcsQ0FBQztHQUFFLENBQUM7Q0FBRSxDQUFBLEVBQUcsQ0FBQzs7QUFFdGpCLElBQUksSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQUUsTUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsU0FBUyxFQUFFLE9BQU8sTUFBTSxFQUFFO0FBQUUsUUFBSSxNQUFNLEdBQUcsRUFBRTtRQUFFLFFBQVEsR0FBRyxHQUFHO1FBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxBQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQUFBQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEFBQUMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQUUsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsTUFBTTtBQUFFLFVBQUUsR0FBRyxNQUFNLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxBQUFDLFNBQVMsU0FBUyxDQUFDO09BQUU7S0FBRSxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUFFLGFBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztLQUFFLE1BQU07QUFBRSxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FB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QUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDaEM7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLE1BQU0sQ0FBQztDQUNmLENBQUEsRUFBRyxDQUFDO0FBQ0wsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7OztBQ3ZEbEIsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQztBQUNILE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUM7O0FBRWxDLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLE1BQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLFNBQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNO0FBQ3BFLE9BQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6Qjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJpbXBvcnQge1Byb3NlTWlycm9yfSBmcm9tIFwiLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9lZGl0XCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS90b29sdGlwbWVudVwiXHJcbmltcG9ydCBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyXCJcclxuaW1wb3J0IFwiLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2F1dG9pbnB1dFwiXHJcbiAgXHJcbmltcG9ydCB7RG9jLCBUZXh0YmxvY2ssIEJsb2NrUXVvdGUsIE9yZGVyZWRMaXN0LCBCdWxsZXRMaXN0LCBMaXN0SXRlbSwgSG9yaXpvbnRhbFJ1bGUsXHJcblx0UGFyYWdyYXBoLCBIZWFkaW5nLCBUZXh0LCBIYXJkQnJlYWssXHJcblx0RW1NYXJrLCBTdHJvbmdNYXJrLCBMaW5rTWFyaywgQ29kZU1hcmssIFNjaGVtYSwgU2NoZW1hU3BlY30gZnJvbSBcIi4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5cclxuaW1wb3J0IHtJbnB1dCwgVGV4dEZpZWxkLCBUZXh0QXJlYSwgQ2hlY2tCb3gsIFJhZGlvQnV0dG9uLCBTZWxlY3QsIFxyXG5cdElGcmFtZSwgSW5saW5lTWF0aCwgQmxvY2tNYXRoLCBJbWFnZSwgU3ByZWFkU2hlZXQsXHJcblx0Q2hvaWNlLCBNdWx0aXBsZUNob2ljZSwgU2NhbGUsIENoZWNrSXRlbSwgQ2hlY2tMaXN0LCBXaWRnZXR9IGZyb20gXCIuL3dpZGdldHNcIlxyXG5cclxuXHJcbmNvbnN0IHdpZGdldHNTcGVjID0gbmV3IFNjaGVtYVNwZWMoe1xyXG5cdGRvYzogRG9jLFxyXG5cdGJsb2NrcXVvdGU6IEJsb2NrUXVvdGUsXHJcblx0b3JkZXJlZF9saXN0OiBPcmRlcmVkTGlzdCxcclxuXHRidWxsZXRfbGlzdDogQnVsbGV0TGlzdCxcclxuXHRsaXN0X2l0ZW06IExpc3RJdGVtLFxyXG5cdGhvcml6b250YWxfcnVsZTogSG9yaXpvbnRhbFJ1bGUsXHJcblxyXG5cdHBhcmFncmFwaDogUGFyYWdyYXBoLFxyXG5cdGhlYWRpbmc6IEhlYWRpbmcsXHJcblxyXG5cdHRleHQ6IFRleHQsXHJcblx0aW1hZ2U6IEltYWdlLFxyXG5cdGhhcmRfYnJlYWs6IEhhcmRCcmVhayxcclxuXHRcclxuXHRpbnB1dDogSW5wdXQsXHJcblx0dGV4dGZpZWxkOiBUZXh0RmllbGQsXHJcblx0dGV4dGFyZWE6IFRleHRBcmVhLFxyXG5cdGNoZWNrYm94OiBDaGVja0JveCxcclxuXHRyYWRpb2J1dHRvbjogUmFkaW9CdXR0b24sXHJcblx0c2VsZWN0OiBTZWxlY3QsXHJcblx0aW5saW5lbWF0aDogSW5saW5lTWF0aCxcclxuXHRibG9ja21hdGg6IEJsb2NrTWF0aCxcclxuXHRpZnJhbWU6IElGcmFtZSxcclxuXHRjaG9pY2U6IENob2ljZSxcclxuXHRtdWx0aXBsZWNob2ljZTogTXVsdGlwbGVDaG9pY2UsXHJcblx0c2NhbGU6IFNjYWxlLFxyXG5cdGNoZWNraXRlbTogQ2hlY2tJdGVtLFxyXG5cdGNoZWNrbGlzdDogQ2hlY2tMaXN0LFxyXG5cdHNwcmVhZHNoZWV0OiBTcHJlYWRTaGVldCxcclxuXHR3aWRnZXQ6IFdpZGdldFxyXG59LCB7XHJcblx0ZW06IEVtTWFyayxcclxuXHRzdHJvbmc6IFN0cm9uZ01hcmssXHJcblx0bGluazogTGlua01hcmssXHJcblx0Y29kZTogQ29kZU1hcmtcclxufSlcclxuXHJcbmNvbnN0IHdpZGdldFNjaGVtYSA9IG5ldyBTY2hlbWEod2lkZ2V0c1NwZWMpXHJcblxyXG5sZXQgcG0gPSB3aW5kb3cucG0gPSBuZXcgUHJvc2VNaXJyb3Ioe1xyXG4gIHBsYWNlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VkaXRvclwiKSxcclxuICBtZW51QmFyOiB0cnVlLFxyXG4gIGRvYzogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjb250ZW50XCIpLmlubmVySFRNTCxcclxuICBkb2NGb3JtYXQ6IFwiaHRtbFwiLFxyXG4gIHNjaGVtYTogd2lkZ2V0U2NoZW1hLFxyXG4gIGF1dG9JbnB1dDogdHJ1ZVxyXG59KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHRcdFxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBiYWNrZ3JvdW5kOiAjRUVFO1xyXG4gIGNvbG9yOiBibGFjaztcclxuICBwYWRkaW5nOiAycHggMnB4O1xyXG4gIHotaW5kZXg6IDE1O1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2IHtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgcGFkZGluZzogMCAxZW0gMCAycHg7XHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSBkaXY6aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3ItbWVudSBmb3JtIHtcclxuXHRiYWNrZ3JvdW5kOiAjRUVFO1xyXG5cdHdpZHRoOiAzMDBweDtcclxuXHRib3JkZXI6IDFweCBzb2xpZCAjQUFBXHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1tZW51IGZvcm0gc2VsZWN0IHtcclxuXHRiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLW1lbnViYXItc2xpZGluZyB7XHJcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiByaWdodCAwLjJzIGVhc2Utb3V0O1xyXG4gIC1tb3otdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICB0cmFuc2l0aW9uOiByaWdodCAwLjJzIGVhc2Utb3V0O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBsZWZ0OiAxMDAlO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IC1tb3otYm9yZGVyLWJveDtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIHBhZGRpbmctbGVmdDogMTZweDtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuXHJcbmApXHJcblxyXG4iLCJpbXBvcnQge3JlYWRQYXJhbXN9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudVwiXHJcbmltcG9ydCB7UG9zfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7c2VsZWN0YWJsZU5vZGVBYm92ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb25cIlxyXG5cclxuZXhwb3J0IGNvbnN0IGFuZFNjcm9sbCA9IHtzY3JvbGxJbnRvVmlldzogdHJ1ZX1cclxuXHJcbk1hdGhKYXguSHViLlF1ZXVlKGZ1bmN0aW9uICgpIHtcclxuICAgIE1hdGhKYXguSHViLkNvbmZpZyh7XHJcbiAgICBcdHRleDJqYXg6IHtcclxuICAgICAgICBcdGRpc3BsYXlNYXRoOiBbIFtcIlxcXFxbXCIsXCJcXFxcXVwiXSBdLCBcclxuICAgICAgICBcdGlubGluZU1hdGg6IFsgW1wiXFxcXChcIixcIlxcXFwpXCJdIF0sXHJcbiAgICAgICAgXHRwcm9jZXNzRXNjYXBlczogdHJ1ZVxyXG4gICAgXHR9LFxyXG4gICAgXHRkaXNwbGF5QWxpZ246XCJsZWZ0XCJcclxuXHR9KVxyXG59KVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZlBhcnNlcih0eXBlLHRhZyxjbHMpIHtcclxuXHR0eXBlLnJlZ2lzdGVyKFwicGFyc2VET01cIiwge1xyXG5cdFx0dGFnOiB0YWcsXHJcblx0XHRyYW5rOiAyNSxcclxuXHRcdHBhcnNlOiAoZG9tLCBjb250ZXh0LCB0eXBlLCBhdHRycykgPT4ge1xyXG5cdFx0XHRsZXQgY29udGFpbnMgPSBkb20uY2xhc3NMaXN0LmNvbnRhaW5zKGNscylcclxuXHRcdFx0aWYgKCFjb250YWlucykgcmV0dXJuIGZhbHNlXHJcblx0XHRcdGNvbnRleHQuaW5zZXJ0RnJvbShkb20sIHR5cGUsIGF0dHJzKVxyXG5cdFx0fVxyXG5cdH0pXHRcclxufVxyXG5cclxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUocG0sIGUpIHtcclxuXHQgIGxldCBwb3MgPSBzZWxlY3RhYmxlTm9kZUFib3ZlKHBtLCBlLnRhcmdldCwge2xlZnQ6IGUuY2xpZW50WCwgdG9wOiBlLmNsaWVudFl9LCB0cnVlKVxyXG5cdCAgaWYgKCFwb3MpIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpXHJcblxyXG5cdCAgbGV0IHtub2RlLCBmcm9tfSA9IHBtLnNlbGVjdGlvblxyXG5cdCAgaWYgKG5vZGUgJiYgcG9zLmRlcHRoID49IGZyb20uZGVwdGggJiYgcG9zLnNob3J0ZW4oZnJvbS5kZXB0aCkuY21wKGZyb20pID09IDApIHtcclxuXHQgICAgaWYgKGZyb20uZGVwdGggPT0gMCkgcmV0dXJuIHBtLnNlbC5wb2xsRm9yVXBkYXRlKClcclxuXHQgICAgcG9zID0gZnJvbS5zaG9ydGVuKClcclxuXHQgIH1cclxuXHJcblx0ICBwbS5zZXROb2RlU2VsZWN0aW9uKHBvcylcclxuXHQgIHBtLmZvY3VzKClcclxuXHQgIGUucHJldmVudERlZmF1bHQoKVxyXG5cdH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZQYXJhbXNDbGljayh0eXBlKSB7XHJcblx0dHlwZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSAocG0sIGUsIHBhdGgsIG5vZGUpID0+IHtcclxuXHRcdGxldCBtZW51ID0gcG0ubW9kLm1lbnVCYXIubWVudVxyXG5cdFx0bGV0IGNtZCA9IHBtLmNvbW1hbmRzW1wiaW5zZXJ0XCIrdHlwZS5uYW1lXVxyXG5cdFx0aWYgKG1lbnUgJiYgY21kKSB7XHJcblx0XHRcdHNlbGVjdENsaWNrZWROb2RlKHBtLGUpXHJcblx0XHRcdG1lbnUuZW50ZXIocmVhZFBhcmFtcyhjbWQpKVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0gZWxzZVxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7QmxvY2ssIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCxpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEJsb2NrTWF0aCBleHRlbmRzIEJsb2NrIHt9XHJcblxyXG5CbG9ja01hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoQmxvY2tNYXRoLFwiZGl2XCIsXCJ3aWRnZXRzLWJsb2NrbWF0aFwiKVxyXG5cclxuQmxvY2tNYXRoLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRpZiAobm9kZS5yZW5kZXJlZCkge1xyXG5cdFx0bm9kZS5yZW5kZXJlZCA9IG5vZGUucmVuZGVyZWQuY2xvbmVOb2RlKHRydWUpXHJcblx0fSBlbHNlIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBlbHQoXCJkaXZcIiwge2NsYXNzOiBcIndpZGdldHMtYmxvY2ttYXRoXCJ9LCBcIlxcXFxbXCIrbm9kZS5hdHRycy50ZXgrXCJcXFxcXVwiKTtcclxuXHRcdC8vIHdhaXQgdW50aWwgbm9kZSBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCB0byByZW5kZXJcclxuXHRcdE1hdGhKYXguSHViLlF1ZXVlKFtcIkRlbGF5XCIsTWF0aEpheC5DYWxsYmFjaywxMDBdLFtcIlR5cGVzZXRcIixNYXRoSmF4Lkh1Yixub2RlLnJlbmRlcmVkXSlcclxuXHR9XHJcblx0cmV0dXJuIG5vZGUucmVuZGVyZWQ7IFxyXG59XHJcblxyXG5CbG9ja01hdGgucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydEJsb2NrTWF0aFwiLFxyXG5cdGxhYmVsOiBcIkJsb2NrTWF0aFwiLFxyXG5cdHJ1bihwbSwgdGV4KSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHt0ZXh9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTGF0ZXggRXhwcmVzc2lvblwiLCB0eXBlOiBcInRleHRcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG4gICAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICAgIGlmIChub2RlKVxyXG4gICAgICAgIHJldHVybiBbbm9kZS5hdHRycy50ZXhdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhCbG9ja01hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtYmxvY2ttYXRoIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge0lucHV0fSBmcm9tIFwiLi9pbnB1dFwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrQm94IGV4dGVuZHMgSW5wdXQge31cclxuXHJcbkNoZWNrQm94LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiY2hlY2tib3hcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAxfSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1jaGVja2JveFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrQm94LFwiaW5wdXRcIixcIndpZGdldHMtY2hlY2tib3hcIilcclxuXHJcbi8vIENoZWNrYm94IGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbkNoZWNrQm94LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0JveFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrQm94XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBsYWJlbCwgbG9jKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLCBsYWJlbCwgbG9jfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGFiZWwsIG5vZGUuYXR0cnMubG9jXVxyXG5cdH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKENoZWNrQm94KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNrYm94IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgQ2hlY2tJdGVtIGV4dGVuZHMgUGFyYWdyYXBoIHtcclxuXHRzdGF0aWMgZ2V0IGtpbmQoKSB7IHJldHVybiBcIi5cIiB9XHJcblxyXG5cdGNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpIHtcclxuXHRcdGlmIChhdHRycy52YWx1ZSA+IDApIGNvbnRlbnQgPSBbdGhpcy5zY2hlbWEubm9kZShcImNoZWNrYm94XCIsYXR0cnMpXVxyXG5cdFx0cmV0dXJuIHN1cGVyLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpXHJcblx0fVxyXG59XHJcblxyXG5DaGVja0l0ZW0uYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0dmFsdWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrTGlzdCBleHRlbmRzIEJsb2NrIHtcclxuXHRzdGF0aWMgZ2V0IGNvbnRhaW5zKCkgeyByZXR1cm4gXCJjaGVja2l0ZW1cIiB9XHJcbn1cclxuXHJcbkNoZWNrTGlzdC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRsYXlvdXQ6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwidmVydGljYWxcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihDaGVja0l0ZW0sXCJkaXZcIixcIndpZGdldHMtY2hlY2tpdGVtXCIpXHJcbmRlZlBhcnNlcihDaGVja0xpc3QsXCJkaXZcIixcIndpZGdldHMtY2hlY2tsaXN0XCIpXHJcblxyXG5DaGVja0l0ZW0ucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLHMpID0+IHMucmVuZGVyQXMobm9kZSxcInBcIiwge1xyXG5cdG5hbWU6IG5vZGUuYXR0cnMubmFtZStcIi1cIitub2RlLmF0dHJzLnZhbHVlLCBcclxuXHR2YWx1ZTogbm9kZS5hdHRycy52YWx1ZSxcclxuXHRjbGFzczogXCJ3aWRnZXRzLWNoZWNraXRlbVwiXHJcbn0pXHJcblxyXG5DaGVja0xpc3QucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLHMpID0+IHMucmVuZGVyQXMobm9kZSxcImRpdlwiLHtcclxuXHRuYW1lOiBub2RlLmF0dHJzLm5hbWUsXHJcblx0bGF5b3V0OiBub2RlLmF0dHJzLmxheW91dCxcclxuXHRjbGFzczogXCJ3aWRnZXRzLWNoZWNrbGlzdFwiXHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHQgIG5hbWU6IFwic3BsaXRDaGVja2l0ZW1cIixcclxuXHQgIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNoZWNraXRlbVwiLFxyXG5cdCAgcnVuKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZSwgZnJvbSwgdG99ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcblx0ICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcblx0ICAgIGNvbnNvbGUubG9nKGdyYW5kUGFyZW50LnR5cGUubmFtZSlcclxuXHQgICAgaWYgKGdyYW5kUGFyZW50LnR5cGUubmFtZSAhPSBcImNoZWNrbGlzdFwiKSByZXR1cm4gZmFsc2VcclxuXHQgICAgcmV0dXJuIHBtLnRyLmRlbGV0ZShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMSwgcG0uc2NoZW1hLm5vZGVzLmNoZWNraXRlbSwge25hbWU6IGdyYW5kUGFyZW50LmF0dHJzLm5hbWUsIHZhbHVlOiBncmFuZFBhcmVudC5zaXplfSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG5cdCAgfSxcclxuXHQgIGtleTogXCJFbnRlcig1MClcIlxyXG5cdH0pXHJcblxyXG5cclxuQ2hlY2tMaXN0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0xpc3RcIixcclxuXHRsYWJlbDogXCJDaGVja0xpc3RcIixcclxuXHRydW4ocG0sIG5hbWUsIGxheW91dCkge1xyXG5cdFx0bGV0IGNoa2l0ZW0gPSBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLmNyZWF0ZSh7bmFtZTpuYW1lLCB2YWx1ZTogMH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcblx0XHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZTpuYW1lK1wiLTBcIiwgbGF5b3V0OmxheW91dH0sY2hraXRlbSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJMYXlvdXQgKHZlcnRpY2FsLCBob3Jpem9udGFsKVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBbXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcImhvcml6b250YWxcIiwgbGFiZWw6IFwiaG9yaXpvbnRhbFwifSxcclxuICAgICBcdCAgICB7dmFsdWU6IFwidmVydGljYWxcIiwgbGFiZWw6IFwidmVydGljYWxcIn1cclxuICAgICBcdCAgXX1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLmxheW91dF1cclxuXHQgfVxyXG59KVxyXG5cclxuQ2hlY2tJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJzcGxpdENoZWNrSXRlbVwiLFxyXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNoZWNraXRlbVwiLFxyXG4gIHJ1bihwbSkge1xyXG4gICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcbiAgICBsZXQgdG9QYXJlbnQgPSBmcm9tLnNob3J0ZW4oKSwgZ3JhbmRQYXJlbnQgPSBwbS5kb2MucGF0aCh0b1BhcmVudC5wYXRoKVxyXG4gICAgcmV0dXJuIHBtLnRyLmRlbGV0ZShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMSwgcG0uc2NoZW1hLm5vZGVzLmNoZWNraXRlbSwge1xyXG4gICAgXHRuYW1lOiBncmFuZFBhcmVudC5hdHRycy5uYW1lK1wiLVwiK2dyYW5kUGFyZW50LnNpemUsIFxyXG4gICAgXHR2YWx1ZTogZ3JhbmRQYXJlbnQuc2l6ZX0pLmFwcGx5KGFuZFNjcm9sbClcclxuICB9LFxyXG4gIGtleTogXCJFbnRlcig1MClcIlxyXG59KVxyXG5cclxuQ2hlY2tJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJkZWxldGVDaGVja0l0ZW1cIixcclxuICBsYWJlbDogXCJkZWxldGUgdGhpcyBjaGVja2l0ZW0gb3IgY2hlY2tsaXN0XCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge2hlYWQsIGVtcHR5fSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDEpIHJldHVybiBmYWxzZVxyXG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmVcclxuICAgIGxldCBiZWZvcmUsIGN1dFxyXG4gICAgZm9yIChsZXQgaSA9IGhlYWQucGF0aC5sZW5ndGggLSAxOyAhYmVmb3JlICYmIGkgPj0gMDsgaS0tKSBpZiAoaGVhZC5wYXRoW2ldID4gMCkge1xyXG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSlcclxuICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKVxyXG4gICAgfVxyXG5cdGxldCBtYyA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKS5jaGlsZChjdXQub2Zmc2V0KVxyXG4gICAgLy8gaWYgdG9wIGNob2ljZSwgZGVsZXRlIHdob2xlIHF1ZXN0aW9uIGlmIG9ubHkgb25lIGNob2ljZVxyXG4gICAgaWYgKG1jLnR5cGUubmFtZSA9PSBcImNoZWNraXRlbVwiKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5kZWxldGUoY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gICAgfSBlbHNlIHtcclxuICAgIFx0Ly8gZG9uJ3QgZGVsZXRlIHF1ZXN0aW9uIGlmIG1vcmUgdGhhbiBvbmUgY2hvaWNlXHJcbiAgICBcdGlmIChtYy5zaXplID09IDEpIHtcclxuICAgICBcdFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsY3V0Lm1vdmUoMSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICAgIFx0fSBlbHNlXHJcbiAgICBcdFx0cmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAga2V5OiBbXCJCYWNrc3BhY2UoNTApXCIsIFwiTW9kLUJhY2tzcGFjZSg1MClcIl1cclxufSlcclxuXHJcblxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNraXRlbSB7fVxyXG4ud2lkZ2V0cy1jaGVja2xpc3Qge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBJRnJhbWUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuSUZyYW1lLmF0dHJpYnV0ZXMgPSB7XHJcblx0c3JjOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OlwiXCJ9KSxcclxuXHR3aWR0aDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogMjAwfSksXHJcblx0aGVpZ2h0OiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAyMDB9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoSUZyYW1lLCBcImlmcmFtZVwiLCBcIndpZGdldHMtaWZyYW1lXCIpXHJcblxyXG5JRnJhbWUucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaWZyYW1lXCIseyBcclxuXHRzcmM6IG5vZGUuYXR0cnMuc3JjLFxyXG5cdHdpZHRoOiBub2RlLmF0dHJzLndpZHRoLFxyXG5cdGhlaWdodDogbm9kZS5hdHRycy5oZWlnaHQsXHJcblx0Y29udGVudDogXCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiLFxyXG5cdGNsYXNzOiBcImlmcmFtZVwiLFxyXG5cdGZyYW1lYm9yZGVyOiBcIjFcIixcclxuXHRhbGxvd2Z1bGxzY3JlZW46IFwiMVwiXHJcbn0pXHJcblxyXG5JRnJhbWUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydElGcmFtZVwiLFxyXG5cdGxhYmVsOiBcInNob3cgd2Vic2l0ZXMsIHlvdVR1YmUsIEdvb2dsZU1hcHMsLi4uXCIsXHJcblx0cnVuKHBtLCBzcmMsIHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgd2lkdGgsIGhlaWdodH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJMaW5rICh3ZWJzaXRlLCB5b3VUdWJlLCBHb29nbGUgTWFwcyAuLi4pXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiV2lkdGggaW4gcGl4ZWxzXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAyMDAgfSxcclxuICAgICBcdHsgbGFiZWw6IFwiSGVpZ2h0IGluIHBpeGVsc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogMjAwIH0sXHJcblx0XSxcclxuICBcdHByZWZpbGxQYXJhbXMocG0pIHtcclxuICAgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgICBpZiAobm9kZSlcclxuICAgICAgICByZXR1cm4gW25vZGUuYXR0cnMuc3JjLCBub2RlLmF0dHJzLndpZHRoLCBub2RlLmF0dHJzLmhlaWdodF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElGcmFtZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1pZnJhbWUge31cclxuXHJcbmApIiwiaW1wb3J0IHtJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCxpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlIGV4dGVuZHMgSW5saW5lIHt9XHJcbkltYWdlLmF0dHJpYnV0ZXMgPSB7XHJcbiAgc3JjOiBuZXcgQXR0cmlidXRlLFxyXG4gIGFsdDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJcIn0pLFxyXG4gIHRpdGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSksXHJcbiAgY2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1pbWdcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbWFnZSwgXCJpbWdcIiwgXCJ3aWRnZXRzLWltZ1wiKVxyXG5cclxuSW1hZ2UucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaW1nXCIsIG5vZGUuYXR0cnMpXHJcblxyXG5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiaW5zZXJ0SW1hZ2VcIixcclxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcclxuICBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xyXG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgdGl0bGUsIGFsdH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBwYXJhbXM6IFtcclxuICAgIHtsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAge2xhYmVsOiBcIkRlc2NyaXB0aW9uIC8gYWx0ZXJuYXRpdmUgdGV4dFwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJcIn0sXHJcbiAgICB7bGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiXCJ9XHJcbiAgXSxcclxuICBzZWxlY3QocG0pIHtcclxuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcbiAgfSxcclxuICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcylcclxuICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soSW1hZ2UpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW1hZ2Uge31cclxuXHJcbmApIiwiZXhwb3J0IHtCbG9ja01hdGh9IGZyb20gXCIuL2Jsb2NrbWF0aFwiXHJcbmV4cG9ydCB7Q2hlY2tCb3h9IGZyb20gXCIuL2NoZWNrYm94XCJcclxuZXhwb3J0IHtDaGVja0xpc3QsIENoZWNrSXRlbX0gZnJvbSBcIi4vY2hlY2tsaXN0XCJcclxuZXhwb3J0IHtJRnJhbWV9IGZyb20gXCIuL2lmcmFtZVwiXHJcbmV4cG9ydCB7SW5saW5lTWF0aH0gZnJvbSBcIi4vaW5saW5lbWF0aFwiXHJcbmV4cG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuZXhwb3J0IHtNdWx0aXBsZUNob2ljZSwgQ2hvaWNlfSBmcm9tIFwiLi9tdWx0aXBsZWNob2ljZVwiXHJcbmV4cG9ydCB7UmFkaW9CdXR0b259IGZyb20gXCIuL3JhZGlvYnV0dG9uXCJcclxuZXhwb3J0IHtTY2FsZX0gZnJvbSBcIi4vc2NhbGVcIlxyXG5leHBvcnQge1NlbGVjdH0gZnJvbSBcIi4vc2VsZWN0XCJcclxuZXhwb3J0IHtUZXh0QXJlYX0gZnJvbSBcIi4vdGV4dGFyZWFcIlxyXG5leHBvcnQge1RleHRGaWVsZH0gZnJvbSBcIi4vdGV4dGZpZWxkXCJcclxuZXhwb3J0IHtJbWFnZX0gZnJvbSBcIi4vaW1hZ2VcIlxyXG5leHBvcnQge1NwcmVhZFNoZWV0fSBmcm9tIFwiLi9zcHJlYWRzaGVldFwiXHJcbmV4cG9ydCB7V2lkZ2V0fSBmcm9tIFwiLi93aWRnZXRcIlxyXG4iLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElubGluZU1hdGggZXh0ZW5kcyBJbmxpbmUge31cclxuXHJcbklubGluZU1hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59IFxyXG5cclxuZGVmUGFyc2VyKElubGluZU1hdGgsIFwic3BhblwiLCBcIndpZGdldHMtaW5saW5lbWF0aFwiKVxyXG5cclxuSW5saW5lTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwic3BhblwiLCB7Y2xhc3M6IFwid2lkZ2V0cy1pbmxpbmVtYXRoXCJ9LCBcIiBcXFxcKFwiK25vZGUuYXR0cnMudGV4K1wiXFxcXCkgXCIpXHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkO1xyXG59XHJcblxyXG5cclxuSW5saW5lTWF0aC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0SW5saW5lTWF0aFwiLFxyXG5cdGxhYmVsOiBcIklubGluZU1hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCIgfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnRleF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElubGluZU1hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW5saW5lbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlcn0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dCBleHRlbmRzIElubGluZSB7fVxyXG5cclxuSW5wdXQuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0dHlwZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJ0ZXh0XCJ9KSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoSW5wdXQsXCJ3aWRnZXRzLWlucHV0XCIpXHJcblxyXG5JbnB1dC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiaW5wdXRcIixub2RlLmF0dHJzKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHRcdFxyXG4ud2lkZ2V0cy1pbnB1dCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBQYXJhZ3JhcGgsIEF0dHJpYnV0ZSwgUG9zfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZSBleHRlbmRzIFBhcmFncmFwaCB7XHJcblx0c3RhdGljIGdldCBraW5kKCkgeyByZXR1cm4gXCIuXCIgfVxyXG5cclxuXHRjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XHJcblx0XHRpZiAoYXR0cnMudmFsdWUgPiAwKSBjb250ZW50ID0gW3RoaXMuc2NoZW1hLm5vZGUoXCJyYWRpb2J1dHRvblwiLGF0dHJzKV1cclxuXHRcdHJldHVybiBzdXBlci5jcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKVxyXG5cdH1cclxufVxyXG5cclxuQ2hvaWNlLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKClcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlQ2hvaWNlIGV4dGVuZHMgQmxvY2sge1xyXG5cdHN0YXRpYyBnZXQgY29udGFpbnMoKSB7IHJldHVybiBcImNob2ljZVwifVxyXG59XHJcblxyXG5NdWx0aXBsZUNob2ljZS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5cclxuZGVmUGFyc2VyKENob2ljZSxcInBcIixcIndpZGdldHMtY2hvaWNlXCIpXHJcbmRlZlBhcnNlcihNdWx0aXBsZUNob2ljZSxcImRpdlwiLFwid2lkZ2V0cy1tdWx0aXBsZWNob2ljZVwiKVxyXG5cclxuQ2hvaWNlLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJwXCIsIHtuYW1lOiBub2RlLmF0dHJzLm5hbWUsIHZhbHVlOiBub2RlLmF0dHJzLnZhbHVlLCBjbGFzczogXCJ3aWRnZXRzLWNob2ljZVwifSlcclxuXHJcbk11bHRpcGxlQ2hvaWNlLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJkaXZcIix7bmFtZTogbm9kZS5hdHRycy5uYW1lLCBjbGFzczogXCJ3aWRnZXRzLW11bHRpcGxlY2hvaWNlXCJ9KVxyXG5cclxuQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJzcGxpdENob2ljZVwiLFxyXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGNob2ljZVwiLFxyXG4gIHJ1bihwbSkge1xyXG4gICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8IGZyb20ucGF0aC5sZW5ndGggPCAyIHx8ICFQb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgbGV0IHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aClcclxuICAgIGlmIChncmFuZFBhcmVudC50eXBlLm5hbWUgIT0gXCJtdWx0aXBsZWNob2ljZVwiKSByZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBwbS50ci5kZWxldGUoZnJvbSwgdG8pLnNwbGl0KGZyb20sIDEsIHBtLnNjaGVtYS5ub2Rlcy5jaG9pY2UsIHtuYW1lOiBncmFuZFBhcmVudC5hdHRycy5uYW1lLCB2YWx1ZTogZ3JhbmRQYXJlbnQuc2l6ZX0pLmFwcGx5KGFuZFNjcm9sbClcclxuICB9LFxyXG4gIGtleTogXCJFbnRlcig1MClcIlxyXG59KVxyXG5cclxuQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcbiAgbmFtZTogXCJkZWxldGVDaG9pY2VcIixcclxuICBsYWJlbDogXCJkZWxldGUgdGhpcyBjaG9pY2Ugb3IgbXVsdGlwbGVjaG9pY2VcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7aGVhZCwgZW1wdHl9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMSkgcmV0dXJuIGZhbHNlXHJcbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxyXG4gICAgbGV0IGJlZm9yZSwgY3V0XHJcbiAgICBmb3IgKGxldCBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XHJcbiAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKVxyXG4gICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpXHJcbiAgICB9XHJcblx0bGV0IG1jID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQpXHJcbiAgICAvLyBpZiB0b3AgY2hvaWNlLCBkZWxldGUgd2hvbGUgcXVlc3Rpb24gaWYgb25seSBvbmUgY2hvaWNlXHJcbiAgICBpZiAobWMudHlwZS5uYW1lID09IFwiY2hvaWNlXCIpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsIGN1dC5tb3ZlKDEpKS5hcHBseSgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgXHQvLyBkb24ndCBkZWxldGUgcXVlc3Rpb24gaWYgbW9yZSB0aGFuIG9uZSBjaG9pY2VcclxuICAgIFx0aWYgKG1jLnNpemUgPT0gMSkge1xyXG4gICAgIFx0XHRyZXR1cm4gcG0udHIuZGVsZXRlKGN1dCxjdXQubW92ZSgxKSkuYXBwbHkoKVxyXG4gICAgXHR9IGVsc2VcclxuICAgIFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSxcclxuICBrZXk6IFtcIkJhY2tzcGFjZSg1MClcIiwgXCJNb2QtQmFja3NwYWNlKDUwKVwiXVxyXG59KVxyXG5cclxuTXVsdGlwbGVDaG9pY2UucmVnaXN0ZXIoXCJjb21tYW5kXCIse1xyXG5cdG5hbWU6IFwiaW5zZXJ0TXVsdGlwbGVDaG9pY2VcIixcclxuXHRsYWJlbDogXCJNdWx0aXBsZUNob2ljZVwiLFxyXG5cdHJ1bihwbSwgbmFtZSkge1xyXG4gICAgXHRsZXQge2Zyb20sIHRvLCBoZWFkfSA9IHBtLnNlbGVjdGlvblxyXG5cdFx0bGV0IGNob2ljZSA9IHBtLnNjaGVtYS5ub2RlKFwiY2hvaWNlXCIse25hbWU6IG5hbWUsIHZhbHVlOiAwfSlcclxuXHRcdGxldCB0ciA9IHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWU6IG5hbWV9LCBjaG9pY2UpKS5hcHBseShhbmRTY3JvbGwpXHJcblx0XHQvL2ZpbmQgcGF0aCBvZiBuZXh0IHNpYmxpbmdcclxuXHRcdGxldCBsZW4gPSBmcm9tLnBhdGgubGVuZ3RoLTFcclxuXHRcdGxldCBzaWIgPSBmcm9tLnBhdGhbbGVuXSsxXHJcblx0XHRwbS5zZXRUZXh0U2VsZWN0aW9uKG5ldyBQb3MoZnJvbS5wYXRoLnNwbGljZSgwLGxlbikuY29uY2F0KHNpYiksMCkpXHJcblx0XHRyZXR1cm4gdHJcclxuXHR9LFxyXG5cdHNlbGVjdChwbSkge1xyXG5cdFx0Y29uc29sZS5sb2coXCJzZWxlY3RcIilcclxuXHRcdHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcblx0fSxcclxuXHRwYXJhbXM6IFtcclxuXHRcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtY2hvaWNlIHt9XHJcbi53aWRnZXRzLW11bHRpcGxlY2hvaWNlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlcn0gZnJvbSBcIi4uL3V0aWxzXCJcclxuaW1wb3J0IHtJbnB1dH0gZnJvbSBcIi4vaW5wdXRcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZGlvQnV0dG9uIGV4dGVuZHMgSW5wdXQge31cclxuXHJcblJhZGlvQnV0dG9uLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwicmFkaW9cIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1yYWRpb2J1dHRvblwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFJhZGlvQnV0dG9uLFwiaW5wdXRcIixcIndpZGdldHMtcmFkaW9idXR0b25cIilcclxuXHJcbi8vIGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1yYWRpb2J1dHRvbiB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU2NhbGUuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0c3RhcnR2YWx1ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIxXCJ9KSxcclxuXHRzdGFydGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImxvd1wifSksXHJcblx0ZW5kdmFsdWU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMTBcIn0pLFxyXG5cdGVuZGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImhpZ2hcIn0pLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2NhbGUsXCJkaXZcIixcInNjYWxlXCIpXHJcblxyXG5TY2FsZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IGRvbSA9IGVsdChcImRpdlwiLHtjbGFzczogXCJ3aWRnZXRzLXNjYWxlXCJ9KVxyXG5cdGRvbS5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIG51bGwsIG5vZGUuYXR0cnMuc3RhcnRsYWJlbCtcIiBcIikpXHJcblx0bGV0IHN0YXJ0VmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSlcclxuXHRsZXQgZW5kVmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuZW5kdmFsdWUpXHJcblx0aWYgKHN0YXJ0VmFsIDwgZW5kVmFsKVxyXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0VmFsOyBpIDw9IGVuZFZhbDsgaSsrKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRlbHNlXHJcblx0XHRmb3IgKGxldCBpID0gc3RhcnRWYWw7IGkgPj0gIGVuZFZhbDsgaS0tKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRkb20uYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBudWxsLCBcIiBcIitub2RlLmF0dHJzLmVuZGxhYmVsKSlcclxuXHRyZXR1cm4gZG9tXHJcbn1cclxuXHJcblNjYWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydFNjYWxlXCIsXHJcblx0bGFiZWw6IFwiU2NhbGVcIixcclxuXHRydW4ocG0sIG5hbWUsIHN0YXJ0dmFsdWUsIHN0YXJ0bGFiZWwsIGVuZHZhbHVlLCBlbmRsYWJlbCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxzdGFydHZhbHVlLHN0YXJ0bGFiZWwsZW5kdmFsdWUsZW5kbGFiZWx9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlN0YXJ0IHZhbHVlXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAxfSxcclxuICAgICBcdHsgbGFiZWw6IFwiU3RhcnQgbGFiZWxcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwibWluXCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJFbmQgdmFsdWVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDEwfSxcclxuICAgICBcdHsgbGFiZWw6IFwiRW5kIGxhYmVsXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiBcIm1heFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSwgbm9kZS5hdHRycy5zdGFydGxhYmVsLCBub2RlLmF0dHJzLmVuZHZhbHVlLCBub2RlLmF0dHJzLmVuZGxhYmVsXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTY2FsZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zY2FsZWl0ZW0ge31cdFx0XHJcbi53aWRnZXRzLXNjYWxlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIElubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFNlbGVjdCBleHRlbmRzIElubGluZSB7fVxyXG5cclxuU2VsZWN0LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdG9wdGlvbnM6IG5ldyBBdHRyaWJ1dGUoKSxcclxuICAgIG11bHRpcGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInNpbmdsZVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFNlbGVjdCxcInNlbGVjdFwiLFwid2lkZ2V0cy1zZWxlY3RcIilcclxuXHJcblNlbGVjdC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IHNlbGVjdGlvbiA9IG5vZGUuYXR0cnMubXVsdGlwbGUgPT0gXCJtdWx0aXBsZVwiXHJcblx0bGV0IHNlbGVjdCA9IGVsdChcInNlbGVjdFwiLHtuYW1lOiBub2RlLmF0dHJzLm5hbWUsIGNsYXNzOiBcIndpZGdldHMtc2VsZWN0XCIsIHNpemU6IDEsIG11bHRpcGxlOiBzZWxlY3Rpb259KVxyXG5cdG5vZGUuYXR0cnMub3B0aW9ucy5zcGxpdChcIixcIikubWFwKGZ1bmN0aW9uKG9wdGlvbikge1xyXG5cdFx0c2VsZWN0LmFwcGVuZENoaWxkKGVsdChcIm9wdGlvblwiLCB7dmFsdWU6IG9wdGlvbi50cmltKCl9LCBvcHRpb24pKVxyXG5cdH0pXHJcblx0cmV0dXJuIHNlbGVjdFxyXG59XHJcblxyXG5TZWxlY3QucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydFNlbGVjdFwiLFxyXG5cdGxhYmVsOiBcIlNlbGVjdFwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgb3B0aW9ucywgbXVsdGlwbGUpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWUsb3B0aW9ucyxtdWx0aXBsZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICAgXHR7IGxhYmVsOiBcIk9wdGlvbnMgKGNvbW1hIHNlcGFyYXRlZClcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJTZWxlY3Rpb24gKHNpbmdsZSBvciBtdWx0aXBsZSlcIiwgdHlwZTogXCJzZWxlY3RcIiwgb3B0aW9uczogW1xyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJtdWx0aXBsZVwiLCBsYWJlbDpcIm11bHRpcGxlXCJ9LFxyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJzaW5nbGVcIiwgbGFiZWw6XCJzaW5nbGVcIn1cclxuICAgICBcdF19XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuXHQgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG5cdCAgICBpZiAobm9kZSkge1xyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLm9wdGlvbnMsIG5vZGUuYXR0cnMubXVsdGlwbGVdXHJcblx0ICAgIH1cclxuXHQgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soU2VsZWN0KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLXNlbGVjdCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBTcHJlYWRTaGVldCBleHRlbmRzIEJsb2NrIHt9XHJcblxyXG5TcHJlYWRTaGVldC5hdHRyaWJ1dGVzID0ge1xyXG5cdGRhdGE6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoU3ByZWFkU2hlZXQsXCJkaXZcIixcIndpZGdldHMtc3ByZWFkc2hlZXRcIilcclxuXHJcblNwcmVhZFNoZWV0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRpZiAobm9kZS5yZW5kZXJlZCkge1xyXG5cdFx0bm9kZS5yZW5kZXJlZCA9IG5vZGUucmVuZGVyZWQuY2xvbmVOb2RlKHRydWUpXHJcblx0fSBlbHNlIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBlbHQoXCJkaXZcIiwge1xyXG5cdFx0XHRpZDogXCJzcHJlYWRzaGVldFwiLCBcclxuXHRcdFx0Y2xhc3M6IFwid2lkZ2V0cy1zcHJlYWRzaGVldFwiXHJcblx0XHR9KTtcclxuXHRcdC8vIHdhaXQgdW50aWwgbm9kZSBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCB0byByZW5kZXJcclxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRsZXQgZGF0YSA9IFtcclxuXHQgICAgICAgICAgICBbXCJcIiwgXCJGb3JkXCIsIFwiVm9sdm9cIiwgXCJUb3lvdGFcIiwgXCJIb25kYVwiXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE0XCIsIDEwLCAxMSwgMTIsIDEzXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE1XCIsIDIwLCAxMSwgMTQsIDEzXSxcclxuXHQgICAgICAgICAgICBbXCIyMDE2XCIsIDMwLCAxNSwgMTIsIDEzXVxyXG5cdCAgICAgICAgXTtcclxuXHRcclxuXHQgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ByZWFkc2hlZXQnKTtcclxuXHQgICAgICAgIGxldCBob3QgPSBuZXcgSGFuZHNvbnRhYmxlKGNvbnRhaW5lciwge1xyXG5cdCAgICAgICAgXHRkYXRhOiBkYXRhLFxyXG5cdCAgICAgICAgICAgIG1pblNwYXJlUm93czogMSxcclxuXHQgICAgICAgICAgICByb3dIZWFkZXJzOiB0cnVlLFxyXG5cdCAgICAgICAgICAgIGNvbEhlYWRlcnM6IHRydWUsXHJcblx0ICAgICAgICAgICAgY29udGV4dE1lbnU6IHRydWVcclxuXHQgICAgICAgIH0pO1xyXG5cdFx0fSwgMTAwKVxyXG5cdH1cclxuXHRyZXR1cm4gbm9kZS5yZW5kZXJlZDsgXHJcbn1cclxuXHJcblNwcmVhZFNoZWV0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRTcHJlYWRTaGVldFwiLFxyXG5cdGxhYmVsOiBcIlNwcmVhZFNoZWV0XCIsXHJcblx0cnVuKHBtLCBkYXRhKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtkYXRhfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxpbmsgdG8gZGF0YSBjc3YgKGZpeGVkIGZvciBkZW1vKVwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJjYXJzLmNzdlwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLmRhdGFdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTcHJlYWRTaGVldClcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zcHJlYWRzaGVldCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRBcmVhIGV4dGVuZHMgQmxvY2sge31cclxuXHJcblRleHRBcmVhLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHJvd3M6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRjb2xzOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0YXJlYVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFRleHRBcmVhLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGFyZWFcIilcclxuXHJcblRleHRBcmVhLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJ0ZXh0YXJlYVwiLG5vZGUuYXR0cnMpXHJcblxyXG5UZXh0QXJlYS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEFyZWFcIixcclxuXHRsYWJlbDogXCJUZXh0QXJlYVwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgcm93cywgY29scykge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxyb3dzLGNvbHN9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlJvd3NcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiNFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiQ29sdW1uc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMucm93cywgbm9kZS5hdHRycy5jb2xzXVxyXG5cdCB9XHJcbn0pIFxyXG5cclxuZGVmUGFyYW1zQ2xpY2soVGV4dEFyZWEpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGFyZWEge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkIGV4dGVuZHMgSW5wdXQge31cclxuXHJcblRleHRGaWVsZC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInRleHRcIn0pLFxyXG5cdHNpemU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMjBcIn0pLFxyXG5cdGNsYXNzOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIndpZGdldHMtdGV4dGZpZWxkXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoVGV4dEZpZWxkLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGZpZWxkXCIpXHJcblxyXG4vLyBzZXJpYWxpemVyIGluaGVyaXRzIGZyb20gaW5wdXRcclxuXHJcblRleHRGaWVsZC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEZpZWxkXCIsXHJcblx0bGFiZWw6IFwiVGV4dEZpZWxkXCIsXHJcblx0cnVuKHBtLCBuYW1lLCBzaXplKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLHNpemV9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlNpemVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiMjBcIiB9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuIFx0ICAgIGlmIChub2RlKVxyXG5cdCAgICAgIHJldHVybiBbbm9kZS5hdHRycy5uYW1lLCBub2RlLmF0dHJzLnNpemUgXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhUZXh0RmllbGQpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGZpZWxkIHt9XHJcblxyXG5gKSIsImltcG9ydCB7cmVhZFBhcmFtc30gZnJvbSBcIi4uLy4uLy4uL3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtUZXh0YmxvY2t9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHR9IGZyb20gXCIuLi8uLi8uLi9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcblxyXG5jb25zdCB3aWRnZXRzID0gW1wiSW1hZ2VcIiwgXCJUZXh0RmllbGRcIiwgXCJUZXh0QXJlYVwiLCBcIkNoZWNrQm94XCIsIFwiU2VsZWN0XCIsIFxyXG4gICAgICAgICAgICAgICAgIFwiSUZyYW1lXCIsIFwiSW5saW5lTWF0aFwiLCBcIkJsb2NrTWF0aFwiLCBcIlNwcmVhZFNoZWV0XCIsXHJcbiAgICAgICAgICAgICAgICAgXCJNdWx0aXBsZUNob2ljZVwiLCBcIlNjYWxlXCIsIFwiQ2hlY2tMaXN0XCJdXHJcblxyXG4gY29uc3QgaW5zZXJ0V2lkZ2V0ID0gd2lkZ2V0cy5tYXAodyA9PiAoe1xyXG4gXHR2YWx1ZTogXCJpbnNlcnRcIit3LFxyXG4gXHRkaXNwbGF5OiAoKSA9PiB7IHJldHVybiBlbHQoXCJzcGFuXCIsbnVsbCwgdyl9XHJcbiB9KSlcclxuXHJcbmV4cG9ydCBjbGFzcyBXaWRnZXQgZXh0ZW5kcyBUZXh0YmxvY2sge31cclxuIFxyXG5XaWRnZXQucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydFdpZGdldFwiLFxyXG5cdGxhYmVsOiBcIkluc2VydC4uLlwiLFxyXG5cdHNlbGVjdChwbSkge3JldHVybiB0cnVlfSxcclxuXHRwYXJhbXM6IFtcclxuXHQgICAgIHtuYW1lOiBcIldpZGdldCB0eXBlXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGluc2VydFdpZGdldCwgZGVmYXVsdExhYmVsOiBcIkluc2VydC4uLlwifVxyXG5cdF0sXHJcblx0cnVuKHBtLCB0eXBlKSB7XHJcblx0XHRsZXQgbWVudSA9IHBtLm1vZC5tZW51QmFyLm1lbnVcclxuXHRcdGxldCBjbWQgPSBwbS5jb21tYW5kc1t0eXBlXVxyXG5cdFx0aWYgKG1lbnUgJiYgY21kKSBtZW51LmVudGVyKHJlYWRQYXJhbXMoY21kKSlcclxuXHR9LFxyXG5cdGRpc3BsYXk6IFwic2VsZWN0XCIsXHJcblx0bWVudUdyb3VwOiBcImJsb2NrXCIsXHJcblx0bWVudVJhbms6IDk5XHJcbn0pXHJcblxyXG4gXHJcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5lbHQgPSBlbHQ7XG5leHBvcnRzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZTtcbmV4cG9ydHMucm1DbGFzcyA9IHJtQ2xhc3M7XG5leHBvcnRzLmFkZENsYXNzID0gYWRkQ2xhc3M7XG5leHBvcnRzLmNvbnRhaW5zID0gY29udGFpbnM7XG5leHBvcnRzLmluc2VydENTUyA9IGluc2VydENTUztcblxuZnVuY3Rpb24gZWx0KHRhZywgYXR0cnMpIHtcbiAgdmFyIHJlc3VsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgaWYgKGF0dHJzKSBmb3IgKHZhciBfbmFtZSBpbiBhdHRycykge1xuICAgIGlmIChfbmFtZSA9PSBcInN0eWxlXCIpIHJlc3VsdC5zdHlsZS5jc3NUZXh0ID0gYXR0cnNbX25hbWVdO2Vsc2UgaWYgKGF0dHJzW19uYW1lXSAhPSBudWxsKSByZXN1bHQuc2V0QXR0cmlidXRlKF9uYW1lLCBhdHRyc1tfbmFtZV0pO1xuICB9XG5cbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBhZGQoYXJnc1tpXSwgcmVzdWx0KTtcbiAgfXJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFkZCh2YWx1ZSwgdGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIikgdmFsdWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZCh2YWx1ZVtpXSwgdGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKHZhbHVlKTtcbiAgfVxufVxuXG52YXIgcmVxRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmKSB7XG4gIGlmIChyZXFGcmFtZSkgcmVxRnJhbWUoZik7ZWxzZSBzZXRUaW1lb3V0KGYsIDEwKTtcbn1cblxudmFyIGllX3VwdG8xMCA9IC9NU0lFIFxcZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbnZhciBpZV8xMXVwID0gL1RyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG52YXIgYnJvd3NlciA9IHtcbiAgbWFjOiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSksXG4gIGllX3VwdG8xMDogaWVfdXB0bzEwLFxuICBpZV8xMXVwOiBpZV8xMXVwLFxuICBpZTogaWVfdXB0bzEwIHx8IGllXzExdXAsXG4gIGdlY2tvOiAvZ2Vja29cXC9cXGQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG59O1xuXG5leHBvcnRzLmJyb3dzZXIgPSBicm93c2VyO1xuZnVuY3Rpb24gY2xhc3NUZXN0KGNscykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgY2xzICsgXCIoPzokfFxcXFxzKVxcXFxzKlwiKTtcbn1cblxuZnVuY3Rpb24gcm1DbGFzcyhub2RlLCBjbHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZTtcbiAgdmFyIG1hdGNoID0gY2xhc3NUZXN0KGNscykuZXhlYyhjdXJyZW50KTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIGFmdGVyID0gY3VycmVudC5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSBjdXJyZW50LnNsaWNlKDAsIG1hdGNoLmluZGV4KSArIChhZnRlciA/IG1hdGNoWzFdICsgYWZ0ZXIgOiBcIlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHtcbiAgdmFyIGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZTtcbiAgaWYgKCFjbGFzc1Rlc3QoY2xzKS50ZXN0KGN1cnJlbnQpKSBub2RlLmNsYXNzTmFtZSArPSAoY3VycmVudCA/IFwiIFwiIDogXCJcIikgKyBjbHM7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgLy8gQW5kcm9pZCBicm93c2VyIGFuZCBJRSB3aWxsIHJldHVybiBmYWxzZSBpZiBjaGlsZCBpcyBhIHRleHQgbm9kZS5cbiAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZTtcbiAgcmV0dXJuIGNoaWxkICYmIHBhcmVudC5jb250YWlucyhjaGlsZCk7XG59XG5cbmZ1bmN0aW9uIGluc2VydENTUyhjc3MpIHtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcbiAgZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoc3R5bGUsIGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbmZ1bmN0aW9uIG5vdGhpbmcoKSB7fVxuXG5mdW5jdGlvbiBlbnN1cmVTZWxlY3Rpb24ocG0pIHtcbiAgaWYgKHBtLnNlbGVjdGlvbi5ub2RlKSB7XG4gICAgdmFyIGZvdW5kID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbk5lYXIpKHBtLmRvYywgcG0uc2VsZWN0aW9uLmZyb20sIDEsIHRydWUpO1xuICAgIGlmIChmb3VuZCkgKDAsIF9zZWxlY3Rpb24uc2V0RE9NU2VsZWN0aW9uVG9Qb3MpKHBtLCBmb3VuZC5oZWFkKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIEEgYmFja2Ryb3Aga2V5bWFwIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzIHRoYXRcbi8vIGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLlxuXG52YXIga2V5cyA9IHtcbiAgXCJFc2NcIjogbm90aGluZyxcbiAgXCJFbnRlclwiOiBub3RoaW5nLFxuICBcIk1vZC1FbnRlclwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LUVudGVyXCI6IG5vdGhpbmcsXG4gIFwiQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLUJcIjogbm90aGluZyxcbiAgXCJNb2QtSVwiOiBub3RoaW5nLFxuICBcIk1vZC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJNb2QtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtTW9kLUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1EZWxldGVcIjogbm90aGluZyxcbiAgXCJNb2QtWlwiOiBub3RoaW5nLFxuICBcIk1vZC1ZXCI6IG5vdGhpbmcsXG4gIFwiU2hpZnQtTW9kLVpcIjogbm90aGluZyxcbiAgXCJDdHJsLURcIjogbm90aGluZyxcbiAgXCJDdHJsLUhcIjogbm90aGluZyxcbiAgXCJDdHJsLUFsdC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJBbHQtRFwiOiBub3RoaW5nLFxuICBcIkFsdC1EZWxldGVcIjogbm90aGluZyxcbiAgXCJBbHQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG5cbiAgXCJNb2QtQVwiOiBlbnN1cmVTZWxlY3Rpb25cbn07W1wiTGVmdFwiLCBcIlJpZ2h0XCIsIFwiVXBcIiwgXCJEb3duXCIsIFwiSG9tZVwiLCBcIkVuZFwiLCBcIlBhZ2VVcFwiLCBcIlBhZ2VEb3duXCJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBrZXlzW2tleV0gPSBrZXlzW1wiU2hpZnQtXCIgKyBrZXldID0ga2V5c1tcIk1vZC1cIiArIGtleV0gPSBrZXlzW1wiU2hpZnQtTW9kLVwiICsga2V5XSA9IGtleXNbXCJBbHQtXCIgKyBrZXldID0ga2V5c1tcIlNoaWZ0LUFsdC1cIiArIGtleV0gPSBlbnN1cmVTZWxlY3Rpb247XG59KTtbXCJMZWZ0XCIsIFwiTW9kLUxlZnRcIiwgXCJSaWdodFwiLCBcIk1vZC1SaWdodFwiLCBcIlVwXCIsIFwiRG93blwiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGRlbGV0ZSBrZXlzW2tleV07XG59KTtcblxuaWYgKF9kb20uYnJvd3Nlci5tYWMpIGtleXNbXCJDdHJsLUZcIl0gPSBrZXlzW1wiQ3RybC1CXCJdID0ga2V5c1tcIkN0cmwtUFwiXSA9IGtleXNbXCJDdHJsLU5cIl0gPSBrZXlzW1wiQWx0LUZcIl0gPSBrZXlzW1wiQWx0LUJcIl0gPSBrZXlzW1wiQ3RybC1BXCJdID0ga2V5c1tcIkN0cmwtRVwiXSA9IGtleXNbXCJDdHJsLVZcIl0gPSBrZXlzW1wiZ29QYWdlVXBcIl0gPSBlbnN1cmVTZWxlY3Rpb247XG5cbnZhciBjYXB0dXJlS2V5cyA9IG5ldyBfa2V5cy5LZXltYXAoa2V5cyk7XG5leHBvcnRzLmNhcHR1cmVLZXlzID0gY2FwdHVyZUtleXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlzV29yZENoYXIgPSBpc1dvcmRDaGFyO1xuZXhwb3J0cy5jaGFyQ2F0ZWdvcnkgPSBjaGFyQ2F0ZWdvcnk7XG5leHBvcnRzLmlzRXh0ZW5kaW5nQ2hhciA9IGlzRXh0ZW5kaW5nQ2hhcjtcbnZhciBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciA9IC9bXFx1MDBkZlxcdTA1ODdcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUzMDQwLVxcdTMwOWZcXHUzMGEwLVxcdTMwZmZcXHUzNDAwLVxcdTRkYjVcXHU0ZTAwLVxcdTlmY2NcXHVhYzAwLVxcdWQ3YWZdLztcblxuLy8gRXh0ZW5kaW5nIHVuaWNvZGUgY2hhcmFjdGVycy4gQSBzZXJpZXMgb2YgYSBub24tZXh0ZW5kaW5nIGNoYXIgK1xuLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhclxuLy8gYXMgZWRpdGluZyBhbmQgbWVhc3VyaW5nIGlzIGNvbmNlcm5lZC4gVGhpcyBpcyBub3QgZnVsbHkgY29ycmVjdCxcbi8vIHNpbmNlIHNvbWUgc2NyaXB0cy9mb250cy9icm93c2VycyBhbHNvIHRyZWF0IG90aGVyIGNvbmZpZ3VyYXRpb25zXG4vLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLlxudmFyIGV4dGVuZGluZ0NoYXIgPSAvW1xcdTAzMDAtXFx1MDM2ZlxcdTA0ODMtXFx1MDQ4OVxcdTA1OTEtXFx1MDViZFxcdTA1YmZcXHUwNWMxXFx1MDVjMlxcdTA1YzRcXHUwNWM1XFx1MDVjN1xcdTA2MTAtXFx1MDYxYVxcdTA2NGItXFx1MDY1ZVxcdTA2NzBcXHUwNmQ2LVxcdTA2ZGNcXHUwNmRlLVxcdTA2ZTRcXHUwNmU3XFx1MDZlOFxcdTA2ZWEtXFx1MDZlZFxcdTA3MTFcXHUwNzMwLVxcdTA3NGFcXHUwN2E2LVxcdTA3YjBcXHUwN2ViLVxcdTA3ZjNcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwOTAwLVxcdTA5MDJcXHUwOTNjXFx1MDk0MS1cXHUwOTQ4XFx1MDk0ZFxcdTA5NTEtXFx1MDk1NVxcdTA5NjJcXHUwOTYzXFx1MDk4MVxcdTA5YmNcXHUwOWJlXFx1MDljMS1cXHUwOWM0XFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTBhMDFcXHUwYTAyXFx1MGEzY1xcdTBhNDFcXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE3MFxcdTBhNzFcXHUwYTc1XFx1MGE4MVxcdTBhODJcXHUwYWJjXFx1MGFjMS1cXHUwYWM1XFx1MGFjN1xcdTBhYzhcXHUwYWNkXFx1MGFlMlxcdTBhZTNcXHUwYjAxXFx1MGIzY1xcdTBiM2VcXHUwYjNmXFx1MGI0MS1cXHUwYjQ0XFx1MGI0ZFxcdTBiNTZcXHUwYjU3XFx1MGI2MlxcdTBiNjNcXHUwYjgyXFx1MGJiZVxcdTBiYzBcXHUwYmNkXFx1MGJkN1xcdTBjM2UtXFx1MGM0MFxcdTBjNDYtXFx1MGM0OFxcdTBjNGEtXFx1MGM0ZFxcdTBjNTVcXHUwYzU2XFx1MGM2MlxcdTBjNjNcXHUwY2JjXFx1MGNiZlxcdTBjYzJcXHUwY2M2XFx1MGNjY1xcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGQzZVxcdTBkNDEtXFx1MGQ0NFxcdTBkNGRcXHUwZDU3XFx1MGQ2MlxcdTBkNjNcXHUwZGNhXFx1MGRjZlxcdTBkZDItXFx1MGRkNFxcdTBkZDZcXHUwZGRmXFx1MGUzMVxcdTBlMzQtXFx1MGUzYVxcdTBlNDctXFx1MGU0ZVxcdTBlYjFcXHUwZWI0LVxcdTBlYjlcXHUwZWJiXFx1MGViY1xcdTBlYzgtXFx1MGVjZFxcdTBmMThcXHUwZjE5XFx1MGYzNVxcdTBmMzdcXHUwZjM5XFx1MGY3MS1cXHUwZjdlXFx1MGY4MC1cXHUwZjg0XFx1MGY4NlxcdTBmODdcXHUwZjkwLVxcdTBmOTdcXHUwZjk5LVxcdTBmYmNcXHUwZmM2XFx1MTAyZC1cXHUxMDMwXFx1MTAzMi1cXHUxMDM3XFx1MTAzOVxcdTEwM2FcXHUxMDNkXFx1MTAzZVxcdTEwNThcXHUxMDU5XFx1MTA1ZS1cXHUxMDYwXFx1MTA3MS1cXHUxMDc0XFx1MTA4MlxcdTEwODVcXHUxMDg2XFx1MTA4ZFxcdTEwOWRcXHUxMzVmXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3YjctXFx1MTdiZFxcdTE3YzZcXHUxN2M5LVxcdTE3ZDNcXHUxN2RkXFx1MTgwYi1cXHUxODBkXFx1MThhOVxcdTE5MjAtXFx1MTkyMlxcdTE5MjdcXHUxOTI4XFx1MTkzMlxcdTE5MzktXFx1MTkzYlxcdTFhMTdcXHUxYTE4XFx1MWE1NlxcdTFhNTgtXFx1MWE1ZVxcdTFhNjBcXHUxYTYyXFx1MWE2NS1cXHUxYTZjXFx1MWE3My1cXHUxYTdjXFx1MWE3ZlxcdTFiMDAtXFx1MWIwM1xcdTFiMzRcXHUxYjM2LVxcdTFiM2FcXHUxYjNjXFx1MWI0MlxcdTFiNmItXFx1MWI3M1xcdTFiODBcXHUxYjgxXFx1MWJhMi1cXHUxYmE1XFx1MWJhOFxcdTFiYTlcXHUxYzJjLVxcdTFjMzNcXHUxYzM2XFx1MWMzN1xcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlMFxcdTFjZTItXFx1MWNlOFxcdTFjZWRcXHUxZGMwLVxcdTFkZTZcXHUxZGZkLVxcdTFkZmZcXHUyMDBjXFx1MjAwZFxcdTIwZDAtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkZTAtXFx1MmRmZlxcdTMwMmEtXFx1MzAyZlxcdTMwOTlcXHUzMDlhXFx1YTY2Zi1cXHVhNjcyXFx1YTY3Y1xcdWE2N2RcXHVhNmYwXFx1YTZmMVxcdWE4MDJcXHVhODA2XFx1YTgwYlxcdWE4MjVcXHVhODI2XFx1YThjNFxcdWE4ZTAtXFx1YThmMVxcdWE5MjYtXFx1YTkyZFxcdWE5NDctXFx1YTk1MVxcdWE5ODAtXFx1YTk4MlxcdWE5YjNcXHVhOWI2LVxcdWE5YjlcXHVhOWJjXFx1YWEyOS1cXHVhYTJlXFx1YWEzMVxcdWFhMzJcXHVhYTM1XFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWFiMFxcdWFhYjItXFx1YWFiNFxcdWFhYjdcXHVhYWI4XFx1YWFiZVxcdWFhYmZcXHVhYWMxXFx1YWJlNVxcdWFiZThcXHVhYmVkXFx1ZGMwMC1cXHVkZmZmXFx1ZmIxZVxcdWZlMDAtXFx1ZmUwZlxcdWZlMjAtXFx1ZmUyNlxcdWZmOWVcXHVmZjlmXS87XG5cbmZ1bmN0aW9uIGlzV29yZENoYXIoY2gpIHtcbiAgcmV0dXJuICgvXFx3Ly50ZXN0KGNoKSB8fCBpc0V4dGVuZGluZ0NoYXIoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpXG4gICk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjYXRlZ29yeSBvZiBhIGdpdmVuIGNoYXJhY3Rlci4gRWl0aGVyIGEgXCJzcGFjZVwiLFxuICogYSBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgcGFydCBvZiBhIHdvcmQgKFwid29yZFwiKSwgb3IgYW55dGhpbmcgZWxzZSAoXCJvdGhlclwiKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNoIFRoZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY2hhckNhdGVnb3J5KGNoKSB7XG4gIHJldHVybiAoL1xccy8udGVzdChjaCkgPyBcInNwYWNlXCIgOiBpc1dvcmRDaGFyKGNoKSA/IFwid29yZFwiIDogXCJvdGhlclwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjaCkge1xuICByZXR1cm4gY2guY2hhckNvZGVBdCgwKSA+PSA3NjggJiYgZXh0ZW5kaW5nQ2hhci50ZXN0KGNoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zbGljZWRUb0FycmF5ID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0pKCk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kZWZpbmVQYXJhbUhhbmRsZXIgPSBkZWZpbmVQYXJhbUhhbmRsZXI7XG5leHBvcnRzLmluaXRDb21tYW5kcyA9IGluaXRDb21tYW5kcztcbmV4cG9ydHMuZGVmYXVsdEtleW1hcCA9IGRlZmF1bHRLZXltYXA7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0ID0gcmVxdWlyZShcIi4uL3V0aWwvc29ydGVkaW5zZXJ0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbFNvcnRlZGluc2VydCk7XG5cbnZhciBfY2hhciA9IHJlcXVpcmUoXCIuL2NoYXJcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG52YXIgcGFyYW1IYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbnZhciBlbXB0eSA9IFtdO1xuXG4vLyBGSVhNRSBkb2N1bWVudCBpbmRpdmlkdWFsIGNvbW1hbmRzXG5cbi8vIDs7IEEgY29tbWFuZCBpcyBhIG5hbWVkIHBpZWNlIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYm91bmQgdG9cbi8vIGEga2V5LCBzaG93biBpbiB0aGUgbWVudSwgb3Igb3RoZXJ3aXNlIGV4cG9zZWQgdG8gdGhlIHVzZXIuXG4vL1xuLy8gVGhlIGNvbW1hbmRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGVkaXRvciBhcmUgZ2F0aGVyZWQgZnJvbSB0aGVcbi8vIFtyZWdpc3RyaWVzXSgjcmVnaXN0cmllcykgZ2l2ZW4gdG8gdGhlIGVkaXRvciwgYW5kIHRoZSBub2RlIGFuZFxuLy8gbWFyayB0eXBlcyBpbiBpdHMgW3NjaGVtYV0oI1NjaGVtYS5yZWdpc3RyeSkuIFVzZSB0aGVcbi8vIFtgcmVnaXN0ZXJgXSgjTm9kZVR5cGUucmVnaXN0ZXIpIG1ldGhvZCB3aXRoIGBcImNvbW1hbmRcImAgYXMgdGhlXG4vLyBuYW1lIGFuZCBhIGBDb21tYW5kU3BlY2AgYXMgdmFsdWUgdG8gZGVmaW5lIGEgbmV3IGNvbW1hbmQuXG5cbnZhciBDb21tYW5kID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29tbWFuZChzcGVjLCBzZWxmKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbW1hbmQpO1xuXG4gICAgLy8gOjogc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgIHRoaXMubmFtZSA9IHNwZWMubmFtZTtcbiAgICBpZiAoIXRoaXMubmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIGRlZmluZSBhIGNvbW1hbmQgd2l0aG91dCBhIG5hbWVcIik7XG4gICAgLy8gOjogQ29tbWFuZFNwZWMgVGhlIGNvbW1hbmQncyBzcGVjaWZ5aW5nIG9iamVjdC5cbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gIH1cblxuICAvLyA7OyAjcGF0aD1Db21tYW5kU3BlYyAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuICAvLyBDb21tYW5kcyBhcmUgZGVmaW5lZCB1c2luZyBvYmplY3RzIHRoYXQgc3BlY2lmeSB2YXJpb3VzIGFzcGVjdHMgb2ZcbiAgLy8gdGhlIGNvbW1hbmQuIFRoZSBvbmx5IHByb3BlcnRpZXMgdGhhdCBfbXVzdF8gYXBwZWFyIGluIGEgY29tbWFuZFxuICAvLyBzcGVjIGFyZSBbYG5hbWVgXSgjQ29tbWFuZFNwZWMubmFtZSkgYW5kIFtgcnVuYF0oI0NvbW1hbmRTcGVjLnJ1bikuXG4gIC8vIFlvdSBzaG91bGQgcHJvYmFibHkgYWxzbyBnaXZlIHlvdXIgY29tbWFuZHMgYSBgbGFiZWxgLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kU3BlYy5uYW1lXG4gIC8vIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLCB3aGljaCB3aWxsIGJlIGl0cyBrZXkgaW5cbiAgLy8gYFByb3NlTWlycm9yLmNvbW1hbmRzYCwgYW5kIHRoZSB0aGluZyBwYXNzZWQgdG9cbiAgLy8gW2BleGVjQ29tbWFuZGBdKCNQcm9zZU1pcnJvci5leGVjQ29tbWFuZCkuXG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRTcGVjLmxhYmVsXG4gIC8vIEEgdXNlci1mYWNpbmcgbGFiZWwgZm9yIHRoZSBjb21tYW5kLiBUaGlzIHdpbGwgYmUgdXNlZCwgYW1vbmcgb3RoZXJcbiAgLy8gdGhpbmdzLiBhcyB0aGUgdG9vbHRpcCB0aXRsZSBmb3IgdGhlIGNvbW1hbmQncyBtZW51IGl0ZW0uIElmIHRoZXJlXG4gIC8vIGlzIG5vIGBsYWJlbGAsIHRoZSBjb21tYW5kJ3MgYG5hbWVgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLlxuXG4gIC8vIDo6IChwbTogUHJvc2VNaXJyb3IsIC4uLnBhcmFtczogW2FueV0pIOKGkiA/Ym9vbCAjcGF0aD1Db21tYW5kU3BlYy5ydW5cbiAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgdGhlIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGhhc1xuICAvLyBbcGFyYW1ldGVyc10oI0NvbW1hbmRTcGVjLnBhcmFtcyksIHRoZWlyIHZhbHVlcyBhcmUgcGFzc2VkIGFzXG4gIC8vIGFyZ3VtZW50cy4gRm9yIGNvbW1hbmRzIFtyZWdpc3RlcmVkXSgjTm9kZVR5cGUucmVnaXN0ZXIpIG9uIG5vZGUgb3JcbiAgLy8gbWFyayB0eXBlcywgYHRoaXNgIHdpbGwgYmUgYm91bmQgdG8gdGhlIG5vZGUgb3IgbWFyayB0eXBlIHdoZW4gdGhpc1xuICAvLyBmdW5jdGlvbiBpcyByYW4uIFNob3VsZCByZXR1cm4gYGZhbHNlYCB3aGVuIHRoZSBjb21tYW5kIGNvdWxkIG5vdFxuICAvLyBiZSBleGVjdXRlZC5cblxuICAvLyA6OiBbQ29tbWFuZFBhcmFtXSAjcGF0aD1Db21tYW5kU3BlYy5wYXJhbXNcbiAgLy8gVGhlIHBhcmFtZXRlcnMgdGhhdCB0aGlzIGNvbW1hbmQgZXhwZWN0cy5cblxuICAvLyA6OiAocG06IFByb3NlTWlycm9yKSDihpIgYm9vbCAjcGF0aD1Db21tYW5kU3BlYy5zZWxlY3RcbiAgLy8gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gW3NlbGVjdF0oI0NvbW1hbmQuc2VsZWN0KSB0aGUgY29tbWFuZC4gYHRoaXNgXG4gIC8vIHdpbGwgYWdhaW4gYmUgYm91bmQgdG8gYSBub2RlIG9yIG1hcmsgdHlwZSwgd2hlbiBhdmFpbGFibGUuXG5cbiAgLy8gOjogKHBtOiBQcm9zZU1pcnJvcikg4oaSIGJvb2wgI3BhdGg9Q29tbWFuZFNwZWMuYWN0aXZlXG4gIC8vIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb21tYW5kIGlzXG4gIC8vIFthY3RpdmVdKCNDb21tYW5kLmFjdGl2ZSkuIGB0aGlzYCByZWZlcnMgdG8gdGhlIGFzc29jaWF0ZWQgbm9kZSBvclxuICAvLyBtYXJrIHR5cGUuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMua2V5XG4gIC8vIFRoZSBkZWZhdWx0IGtleSBiaW5kaW5nIG9yIGJpbmRpbmdzIGZvciB0aGlzIGNvbW1hbmQuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMucGNLZXlcbiAgLy8gRGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBzcGVjaWZpYyB0byBub24tTWFjIHBsYXRmb3Jtcy5cblxuICAvLyA6OiB1bmlvbjxzdHJpbmcsIFtzdHJpbmddPiAjcGF0aD1Db21tYW5kU3BlYy5tYWNLZXlcbiAgLy8gRGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBzcGVjaWZpYyB0byB0aGUgTWFjIHBsYXRmb3JtLlxuXG4gIC8vIEZJWE1FIGRvY3VtZW50IG1lbnUgYW5kIGljb24gcHJvcGVydGllc1xuXG4gIC8vIDs7ICNwYXRoPUNvbW1hbmRQYXJhbSAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuICAvLyBUaGUgcGFyYW1ldGVycyB0aGF0IGEgY29tbWFuZCBjYW4gdGFrZSBhcmUgc3BlY2lmaWVkIHVzaW5nIG9iamVjdHNcbiAgLy8gd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRQYXJhbS5sYWJlbFxuICAvLyBUaGUgdXNlci1mYWNpbmcgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLiBTaG93biB0byB0aGUgdXNlciB3aGVuXG4gIC8vIHByb21wdGluZyBmb3IgdGhpcyBwYXJhbWV0ZXIuXG5cbiAgLy8gOjogc3RyaW5nICNwYXRoPUNvbW1hbmRQYXJhbS50eXBlXG4gIC8vIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuIFN1cHBvcnRlZCB0eXBlcyBhcmUgYFwidGV4dFwiYCBhbmQgYFwic2VsZWN0XCJgLlxuXG4gIC8vIDo6IGFueSAjcGF0aD1Db21tYW5kUGFyYW0uZGVmYXVsdFxuICAvLyBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuXG5cbiAgLy8gOjogKHN0cmluZywgKHBtOiBQcm9zZU1pcnJvciwgY21kOiBDb21tYW5kLCBjYWxsYmFjazogKD9bYW55XSkpKVxuICAvLyBSZWdpc3RlciBhIHBhcmFtZXRlciBoYW5kbGVyLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQgcHJvbXB0cyB0aGVcbiAgLy8gdXNlciB0byBlbnRlciB2YWx1ZXMgZm9yIGEgY29tbWFuZCdzIFtwYXJhbWV0ZXJzXSgjQ29tbWFuZFBhcmFtKSwgYW5kXG4gIC8vIGNhbGxzIGEgY2FsbGJhY2sgd2l0aCB0aGUgdmFsdWVzIHJlY2VpdmVkLiBTZWUgYWxzbyB0aGVcbiAgLy8gW2Bjb21tYW5kUGFyYW1IYW5kbGVyYCBvcHRpb25dKCNjb21tYW5kUGFyYW1IYW5kbGVyKS5cblxuICAvLyA6OiAoUHJvc2VNaXJyb3IsID9bYW55XSkg4oaSID9ib29sXG4gIC8vIEV4ZWN1dGUgdGhpcyBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCB0YWtlc1xuICAvLyBbcGFyYW1ldGVyc10oI0NvbW1hbmQucGFyYW1zKSwgdGhleSBjYW4gYmUgcGFzc2VkIGFzIHNlY29uZFxuICAvLyBhcmd1bWVudCBoZXJlLCBvciBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIGEgW3BhcmFtZXRlclxuICAvLyBoYW5kbGVyXSgjZGVmaW5lUGFyYW1IYW5kbGVyKSB3aWxsIGJlIGNhbGxlZCB0byBwcm9tcHQgdGhlIHVzZXJcbiAgLy8gZm9yIHZhbHVlcy5cbiAgLy9cbiAgLy8gUmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNvbW1hbmQgc3BlYydzIFtgcnVuYFxuICAvLyBtZXRob2RdKCNDb21tYW5kU3BlYy5ydW4pLCBvciBgZmFsc2VgIGlmIHRoZSBjb21tYW5kIGNvdWxkIG5vdCBiZVxuICAvLyByYW4uXG5cbiAgX2NyZWF0ZUNsYXNzKENvbW1hbmQsIFt7XG4gICAga2V5OiBcImV4ZWNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhlYyhwbSwgcGFyYW1zKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgcnVuID0gdGhpcy5zcGVjLnJ1bjtcbiAgICAgIGlmICghdGhpcy5wYXJhbXMubGVuZ3RoKSByZXR1cm4gcnVuLmNhbGwodGhpcy5zZWxmLCBwbSk7XG4gICAgICBpZiAocGFyYW1zKSByZXR1cm4gcnVuLmNhbGwuYXBwbHkocnVuLCBbdGhpcy5zZWxmLCBwbV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwYXJhbXMpKSk7XG4gICAgICB2YXIgaGFuZGxlciA9IGdldFBhcmFtSGFuZGxlcihwbSk7XG4gICAgICBpZiAoIWhhbmRsZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhbmRsZXIocG0sIHRoaXMsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtcykgcnVuLmNhbGwuYXBwbHkocnVuLCBbX3RoaXMuc2VsZiwgcG1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyYW1zKSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFByb3NlTWlycm9yKSDihpIgYm9vbFxuICAgIC8vIEFzayB0aGlzIGNvbW1hbmQgd2hldGhlciBpdCBpcyBjdXJyZW50bHkgcmVsZXZhbnQsIGdpdmVuIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24uIElmIHRoZSBjb21tYW5kIGRvZXMgbm90IGRlZmluZSBhXG4gICAgLy8gW2BzZWxlY3RgXSgjQ29tbWFuZFNwZWMuc2VsZWN0KSBtZXRob2QsIHRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZS5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgZiA9IHRoaXMuc3BlYy5zZWxlY3Q7XG4gICAgICByZXR1cm4gZiA/IGYuY2FsbCh0aGlzLnNlbGYsIHBtKSA6IHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKFByb3NlTWlycm9yKSDihpIgYm9vbFxuICAgIC8vIEFzayB0aGlzIGNvbW1hbmQgd2hldGhlciBpdCBpcyDigJxhY3RpdmXigJ0uIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG9cbiAgICAvLyBzdHlsZSBpbmxpbmUgbWFyayBpY29ucyAoc3VjaCBhcyBzdHJvbmcpIGRpZmZlcmVudGx5IHdoZW4gdGhlXG4gICAgLy8gc2VsZWN0aW9uIGNvbnRhaW5zIHN1Y2ggbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGl2ZShwbSkge1xuICAgICAgdmFyIGYgPSB0aGlzLnNwZWMuYWN0aXZlO1xuICAgICAgcmV0dXJuIGYgPyBmLmNhbGwodGhpcy5zZWxmLCBwbSkgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBbQ29tbWFuZFBhcmFtXVxuICAgIC8vIEdldCB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBjb21tYW5kIGV4cGVjdHMuXG4gIH0sIHtcbiAgICBrZXk6IFwicGFyYW1zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGVjLnBhcmFtcyB8fCBlbXB0eTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBHZXQgdGhlIGxhYmVsIGZvciB0aGlzIGNvbW1hbmQuXG4gIH0sIHtcbiAgICBrZXk6IFwibGFiZWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwZWMubGFiZWwgfHwgdGhpcy5uYW1lO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb21tYW5kO1xufSkoKTtcblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcblxuZnVuY3Rpb24gZGVmaW5lUGFyYW1IYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgcGFyYW1IYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmFtSGFuZGxlcihwbSkge1xuICB2YXIgb3B0aW9uID0gcG0ub3B0aW9ucy5jb21tYW5kUGFyYW1IYW5kbGVyO1xuICBpZiAob3B0aW9uICYmIHBhcmFtSGFuZGxlcnNbb3B0aW9uXSkgcmV0dXJuIHBhcmFtSGFuZGxlcnNbb3B0aW9uXTtcbn1cblxuZnVuY3Rpb24gaW5pdENvbW1hbmRzKHBtKSB7XG4gIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwbS5yZWdpc3RyeShcImNvbW1hbmRcIiwgZnVuY3Rpb24gKHNwZWMsIHR5cGUpIHtcbiAgICByZXN1bHRbc3BlYy5uYW1lXSA9IG5ldyBDb21tYW5kKHNwZWMsIHR5cGUpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEtleW1hcChwbSkge1xuICB2YXIgYmluZGluZ3MgPSB7fTtcbiAgZnVuY3Rpb24gYWRkKGNvbW1hbmQsIGtleSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChjb21tYW5kLCBrZXlbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5KSB7XG4gICAgICB2YXIgX2QkJGV4ZWMgPSAvXiguKz8pKD86XFwoKFxcZCspXFwpKT8kLy5leGVjKGtleSk7XG5cbiAgICAgIHZhciBfZCQkZXhlYzIgPSBfc2xpY2VkVG9BcnJheShfZCQkZXhlYywgMyk7XG5cbiAgICAgIHZhciBfID0gX2QkJGV4ZWMyWzBdO1xuICAgICAgdmFyIF9uYW1lID0gX2QkJGV4ZWMyWzFdO1xuICAgICAgdmFyIF9kJCRleGVjMiQyID0gX2QkJGV4ZWMyWzJdO1xuICAgICAgdmFyIHJhbmsgPSBfZCQkZXhlYzIkMiA9PT0gdW5kZWZpbmVkID8gNTAgOiBfZCQkZXhlYzIkMjtcblxuICAgICAgKDAsIF91dGlsU29ydGVkaW5zZXJ0MltcImRlZmF1bHRcIl0pKGJpbmRpbmdzW19uYW1lXSB8fCAoYmluZGluZ3NbX25hbWVdID0gW10pLCB7IGNvbW1hbmQ6IGNvbW1hbmQsIHJhbms6IHJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfbmFtZTIgaW4gcG0uY29tbWFuZHMpIHtcbiAgICB2YXIgY21kID0gcG0uY29tbWFuZHNbX25hbWUyXTtcbiAgICBhZGQoX25hbWUyLCBjbWQuc3BlYy5rZXkpO1xuICAgIGFkZChfbmFtZTIsIF9kb20uYnJvd3Nlci5tYWMgPyBjbWQuc3BlYy5tYWNLZXkgOiBjbWQuc3BlYy5wY0tleSk7XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gYmluZGluZ3MpIHtcbiAgICBiaW5kaW5nc1trZXldID0gYmluZGluZ3Nba2V5XS5tYXAoZnVuY3Rpb24gKGIpIHtcbiAgICAgIHJldHVybiBiLmNvbW1hbmQ7XG4gICAgfSk7XG4gIH1yZXR1cm4gbmV3IF9rZXlzLktleW1hcChiaW5kaW5ncyk7XG59XG5cbnZhciBhbmRTY3JvbGwgPSB7IHNjcm9sbEludG9WaWV3OiB0cnVlIH07XG5cbl9tb2RlbC5IYXJkQnJlYWsucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJpbnNlcnRIYXJkQnJlYWtcIixcbiAgbGFiZWw6IFwiSW5zZXJ0IGhhcmQgYnJlYWtcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbiA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcblxuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jaykgcmV0dXJuIGZhbHNlO2Vsc2UgaWYgKHBtLmRvYy5wYXRoKGZyb20ucGF0aCkudHlwZS5pc0NvZGUpIHJldHVybiBwbS50ci50eXBlVGV4dChcIlxcblwiKS5hcHBseShhbmRTY3JvbGwpO2Vsc2UgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoKSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBbXCJNb2QtRW50ZXJcIiwgXCJTaGlmdC1FbnRlclwiXVxufSk7XG5cbmZ1bmN0aW9uIG1hcmtBY3RpdmUocG0sIHR5cGUpIHtcbiAgdmFyIHNlbCA9IHBtLnNlbGVjdGlvbjtcbiAgaWYgKHNlbC5lbXB0eSkgcmV0dXJuIHR5cGUuaXNJblNldChwbS5hY3RpdmVNYXJrcygpKTtlbHNlIHJldHVybiBwbS5kb2MucmFuZ2VIYXNNYXJrKHNlbC5mcm9tLCBzZWwudG8sIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBjYW5BZGRJbmxpbmUocG0sIHR5cGUpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yLnRvO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMi5lbXB0eTtcblxuICBpZiAoZW1wdHkpIHJldHVybiAhdHlwZS5pc0luU2V0KHBtLmFjdGl2ZU1hcmtzKCkpICYmIHBtLmRvYy5wYXRoKGZyb20ucGF0aCkudHlwZS5jYW5Db250YWluTWFyayh0eXBlKTtcbiAgdmFyIGNhbiA9IGZhbHNlO1xuICBwbS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChjYW4gfHwgbm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS50eXBlLmNhbkNvbnRhaW5NYXJrKHR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgIXR5cGUuaXNJblNldChub2RlLm1hcmtzKSkgY2FuID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBjYW47XG59XG5cbmZ1bmN0aW9uIG1hcmtBcHBsaWVzKHBtLCB0eXBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMyA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMy5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMy50bztcblxuICB2YXIgcmVsZXZhbnQgPSBmYWxzZTtcbiAgcG0uZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgaWYgKG5vZGUudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmVsZXZhbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZWxldmFudDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrQ29tbWFuZHModHlwZSwgbmFtZSwgbGFiZWxOYW1lLCBzcGVjKSB7XG4gIGlmICghbGFiZWxOYW1lKSBsYWJlbE5hbWUgPSBuYW1lO1xuICB2YXIgY2FwID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gIHR5cGUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgICBuYW1lOiBcInNldFwiICsgY2FwLFxuICAgIGxhYmVsOiBcIlNldCBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICByZXR1cm4gY2FuQWRkSW5saW5lKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIGljb246IHsgZnJvbTogbmFtZSB9XG4gIH0pO1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogXCJ1bnNldFwiICsgY2FwLFxuICAgIGxhYmVsOiBcIlJlbW92ZSBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCBmYWxzZSk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIG1hcmtBY3RpdmUocG0sIHRoaXMpO1xuICAgIH0sXG4gICAgaWNvbjogeyBmcm9tOiBuYW1lIH1cbiAgfSk7XG4gIHZhciBjb21tYW5kID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgbGFiZWw6IFwiVG9nZ2xlIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICBwbS5zZXRNYXJrKHRoaXMsIG51bGwpO1xuICAgIH0sXG4gICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUocG0pIHtcbiAgICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICByZXR1cm4gbWFya0FwcGxpZXMocG0sIHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgcHJvcCBpbiBzcGVjKSB7XG4gICAgY29tbWFuZFtwcm9wXSA9IHNwZWNbcHJvcF07XG4gIH10eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCBjb21tYW5kKTtcbn1cblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLlN0cm9uZ01hcmssIFwic3Ryb25nXCIsIG51bGwsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjAsXG4gIGljb246IHtcbiAgICB3aWR0aDogODA1LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMzE3IDg2OXE0MiAxOCA4MCAxOCAyMTQgMCAyMTQtMTkxIDAtNjUtMjMtMTAyLTE1LTI1LTM1LTQydC0zOC0yNi00Ni0xNC00OC02LTU0LTFxLTQxIDAtNTcgNSAwIDMwLTAgOTB0LTAgOTBxMCA0LTAgMzh0LTAgNTUgMiA0NyA2IDM4ek0zMDkgNDQycTI0IDQgNjIgNCA0NiAwIDgxLTd0NjItMjUgNDItNTEgMTQtODFxMC00MC0xNi03MHQtNDUtNDYtNjEtMjQtNzAtOHEtMjggMC03NCA3IDAgMjggMiA4NnQyIDg2cTAgMTUtMCA0NXQtMCA0NXEwIDI2IDAgMzl6TTAgOTUwbDEtNTNxOC0yIDQ4LTl0NjAtMTVxNC02IDctMTV0NC0xOSAzLTE4IDEtMjEgMC0xOXYtMzdxMC01NjEtMTItNTg1LTItNC0xMi04dC0yNS02LTI4LTQtMjctMi0xNy0xbC0yLTQ3cTU2LTEgMTk0LTZ0MjEzLTVxMTMgMCAzOSAwdDM4IDBxNDAgMCA3OCA3dDczIDI0IDYxIDQwIDQyIDU5IDE2IDc4cTAgMjktOSA1NHQtMjIgNDEtMzYgMzItNDEgMjUtNDggMjJxODggMjAgMTQ2IDc2dDU4IDE0MXEwIDU3LTIwIDEwMnQtNTMgNzQtNzggNDgtOTMgMjctMTAwIDhxLTI1IDAtNzUtMXQtNzUtMXEtNjAgMC0xNzUgNnQtMTMyIDZ6XCJcbiAgfSxcbiAga2V5OiBcIk1vZC1CXCJcbn0pO1xuXG5nZW5lcmF0ZU1hcmtDb21tYW5kcyhfbW9kZWwuRW1NYXJrLCBcImVtXCIsIFwiZW1waGFzaXNcIiwge1xuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAyMSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA1ODUsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk0wIDk0OWw5LTQ4cTMtMSA0Ni0xMnQ2My0yMXExNi0yMCAyMy01NyAwLTQgMzUtMTY1dDY1LTMxMCAyOS0xNjl2LTE0cS0xMy03LTMxLTEwdC0zOS00LTMzLTNsMTAtNThxMTggMSA2OCAzdDg1IDQgNjggMXEyNyAwIDU2LTF0NjktNCA1Ni0zcS0yIDIyLTEwIDUwLTE3IDUtNTggMTZ0LTYyIDE5cS00IDEwLTggMjR0LTUgMjItNCAyNi0zIDI0cS0xNSA4NC01MCAyMzl0LTQ0IDIwM3EtMSA1LTcgMzN0LTExIDUxLTkgNDctMyAzMmwwIDEwcTkgMiAxMDUgMTctMSAyNS05IDU2LTYgMC0xOCAwdC0xOCAwcS0xNiAwLTQ5LTV0LTQ5LTVxLTc4LTEtMTE3LTEtMjkgMC04MSA1dC02OSA2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtSVwiXG59KTtcblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLkNvZGVNYXJrLCBcImNvZGVcIiwgbnVsbCwge1xuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAyMixcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA4OTYsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk02MDggMTkybC05NiA5NiAyMjQgMjI0LTIyNCAyMjQgOTYgOTYgMjg4LTMyMC0yODgtMzIwek0yODggMTkybC0yODggMzIwIDI4OCAzMjAgOTYtOTYtMjI0LTIyNCAyMjQtMjI0LTk2LTk2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtYFwiXG59KTtcblxuX21vZGVsLkxpbmtNYXJrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwidW5saW5rXCIsXG4gIGxhYmVsOiBcIlVubGlua1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHBtLnNldE1hcmsodGhpcywgZmFsc2UpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgfSxcbiAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJpbmxpbmVcIiwgbWVudVJhbms6IDMwLFxuICBpY29uOiB7IGZyb206IFwibGlua1wiIH1cbn0pO1xuXG5fbW9kZWwuTGlua01hcmsucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaW5rXCIsXG4gIGxhYmVsOiBcIkFkZCBsaW5rXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtLCBocmVmLCB0aXRsZSkge1xuICAgIHBtLnNldE1hcmsodGhpcywgdHJ1ZSwgeyBocmVmOiBocmVmLCB0aXRsZTogdGl0bGUgfSk7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiVGFyZ2V0XCIsIHR5cGU6IFwidGV4dFwiIH0sIHsgbGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH1dLFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBtYXJrQXBwbGllcyhwbSwgdGhpcykgJiYgIW1hcmtBY3RpdmUocG0sIHRoaXMpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAzMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA5NTEsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk04MzIgNjk0cTAtMjItMTYtMzhsLTExOC0xMThxLTE2LTE2LTM4LTE2LTI0IDAtNDEgMTggMSAxIDEwIDEwdDEyIDEyIDggMTAgNyAxNCAyIDE1cTAgMjItMTYgMzh0LTM4IDE2cS04IDAtMTUtMnQtMTQtNy0xMC04LTEyLTEyLTEwLTEwcS0xOCAxNy0xOCA0MSAwIDIyIDE2IDM4bDExNyAxMThxMTUgMTUgMzggMTUgMjIgMCAzOC0xNGw4NC04M3ExNi0xNiAxNi0zOHpNNDMwIDI5MnEwLTIyLTE2LTM4bC0xMTctMTE4cS0xNi0xNi0zOC0xNi0yMiAwLTM4IDE1bC04NCA4M3EtMTYgMTYtMTYgMzggMCAyMiAxNiAzOGwxMTggMTE4cTE1IDE1IDM4IDE1IDI0IDAgNDEtMTctMS0xLTEwLTEwdC0xMi0xMi04LTEwLTctMTQtMi0xNXEwLTIyIDE2LTM4dDM4LTE2cTggMCAxNSAydDE0IDcgMTAgOCAxMiAxMiAxMCAxMHExOC0xNyAxOC00MXpNOTQxIDY5NHEwIDY4LTQ4IDExNmwtODQgODNxLTQ3IDQ3LTExNiA0Ny02OSAwLTExNi00OGwtMTE3LTExOHEtNDctNDctNDctMTE2IDAtNzAgNTAtMTE5bC01MC01MHEtNDkgNTAtMTE4IDUwLTY4IDAtMTE2LTQ4bC0xMTgtMTE4cS00OC00OC00OC0xMTZ0NDgtMTE2bDg0LTgzcTQ3LTQ3IDExNi00NyA2OSAwIDExNiA0OGwxMTcgMTE4cTQ3IDQ3IDQ3IDExNiAwIDcwLTUwIDExOWw1MCA1MHE0OS01MCAxMTgtNTAgNjggMCAxMTYgNDhsMTE4IDExOHE0OCA0OCA0OCAxMTZ6XCJcbiAgfVxufSk7XG5cbl9tb2RlbC5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImluc2VydEltYWdlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBpbWFnZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSwgc3JjLCBhbHQsIHRpdGxlKSB7XG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoeyBzcmM6IHNyYywgdGl0bGU6IHRpdGxlLCBhbHQ6IGFsdCB9KSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAgcGFyYW1zOiBbeyBsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCIgfSwgeyBsYWJlbDogXCJEZXNjcmlwdGlvbiAvIGFsdGVybmF0aXZlIHRleHRcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH0sIHsgbGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIFwiZGVmYXVsdFwiOiBcIlwiIH1dLFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiA0MCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDk3LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMzY1IDMyOXEwIDQ1LTMyIDc3dC03NyAzMi03Ny0zMi0zMi03NyAzMi03NyA3Ny0zMiA3NyAzMiAzMiA3N3pNOTUwIDU0OHYyNTZoLTgwNHYtMTA5bDE4Mi0xODIgOTEgOTEgMjkyLTI5MnpNMTAwNSAxNDZoLTkxNHEtNyAwLTEyIDV0LTUgMTJ2Njk0cTAgNyA1IDEydDEyIDVoOTE0cTcgMCAxMi01dDUtMTJ2LTY5NHEwLTctNS0xMnQtMTItNXpNMTA5NyAxNjR2Njk0cTAgMzctMjYgNjR0LTY0IDI2aC05MTRxLTM3IDAtNjQtMjZ0LTI2LTY0di02OTRxMC0zNyAyNi02NHQ2NC0yNmg5MTRxMzcgMCA2NCAyNnQyNiA2NHpcIlxuICB9LFxuICBwcmVmaWxsUGFyYW1zOiBmdW5jdGlvbiBwcmVmaWxsUGFyYW1zKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcblxuICAgIGlmIChub2RlICYmIG5vZGUudHlwZSA9PSB0aGlzKSByZXR1cm4gW25vZGUuYXR0cnMuc3JjLCBub2RlLmF0dHJzLmFsdCwgbm9kZS5hdHRycy50aXRsZV07XG4gIH1cbn0pO1xuXG4vKipcbiAqIEdldCBhbiBvZmZzZXQgbW92aW5nIGJhY2t3YXJkIGZyb20gYSBjdXJyZW50IG9mZnNldCBpbnNpZGUgYSBub2RlLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gcGFyZW50IFRoZSBwYXJlbnQgbm9kZS5cbiAqIEBwYXJhbSAge2ludH0gICAgb2Zmc2V0IE9mZnNldCB0byBtb3ZlIGZyb20gaW5zaWRlIHRoZSBub2RlLlxuICogQHBhcmFtICB7c3RyaW5nfSBieSAgICAgU2l6ZSB0byBkZWxldGUgYnkuIEVpdGhlciBcImNoYXJcIiBvciBcIndvcmRcIi5cbiAqL1xuZnVuY3Rpb24gbW92ZUJhY2t3YXJkKHBhcmVudCwgb2Zmc2V0LCBieSkge1xuICBpZiAoYnkgIT0gXCJjaGFyXCIgJiYgYnkgIT0gXCJ3b3JkXCIpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbW90aW9uIHVuaXQ6IFwiICsgYnkpO1xuXG4gIHZhciBjYXQgPSBudWxsLFxuICAgICAgY291bnRlZCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAob2Zmc2V0ID09IDApIHJldHVybiBvZmZzZXQ7XG5cbiAgICB2YXIgX3BhcmVudCRjaHVua0JlZm9yZSA9IHBhcmVudC5jaHVua0JlZm9yZShvZmZzZXQpO1xuXG4gICAgdmFyIHN0YXJ0ID0gX3BhcmVudCRjaHVua0JlZm9yZS5zdGFydDtcbiAgICB2YXIgbm9kZSA9IF9wYXJlbnQkY2h1bmtCZWZvcmUubm9kZTtcblxuICAgIGlmICghbm9kZS5pc1RleHQpIHJldHVybiBjYXQgPyBvZmZzZXQgOiBvZmZzZXQgLSAxO1xuXG4gICAgaWYgKGJ5ID09IFwiY2hhclwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgaWYgKCEoMCwgX2NoYXIuaXNFeHRlbmRpbmdDaGFyKShub2RlLnRleHQuY2hhckF0KGkgLSAxKSkpIHJldHVybiBvZmZzZXQgLSAxO1xuICAgICAgICBvZmZzZXQtLTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5ID09IFwid29yZFwiKSB7XG4gICAgICAvLyBXb3JrIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gYmFja3dhcmRzIHRocm91Z2ggdGV4dCBvZiBhIHNpbmd1bGFyXG4gICAgICAvLyBjaGFyYWN0ZXIgY2F0ZWdvcnkgKGUuZy4gXCJjYXRcIiBvZiBcIiMhKlwiKSB1bnRpbCByZWFjaGluZyBhIGNoYXJhY3RlciBpbiBhXG4gICAgICAvLyBkaWZmZXJlbnQgY2F0ZWdvcnkgKGkuZS4gdGhlIGVuZCBvZiB0aGUgd29yZCkuXG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgdmFyIG5leHRDaGFyQ2F0ID0gKDAsIF9jaGFyLmNoYXJDYXRlZ29yeSkobm9kZS50ZXh0LmNoYXJBdChpIC0gMSkpO1xuICAgICAgICBpZiAoY2F0ID09IG51bGwgfHwgY291bnRlZCA9PSAxICYmIGNhdCA9PSBcInNwYWNlXCIpIGNhdCA9IG5leHRDaGFyQ2F0O2Vsc2UgaWYgKGNhdCAhPSBuZXh0Q2hhckNhdCkgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIGNvdW50ZWQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlU2VsZWN0aW9uXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSB0aGUgc2VsZWN0aW9uXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24oKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFtcIkJhY2tzcGFjZSgxMClcIiwgXCJEZWxldGUoMTApXCIsIFwiTW9kLUJhY2tzcGFjZSgxMClcIiwgXCJNb2QtRGVsZXRlKDEwKVwiXSxcbiAgbWFjS2V5OiBbXCJDdHJsLUgoMTApXCIsIFwiQWx0LUJhY2tzcGFjZSgxMClcIiwgXCJDdHJsLUQoMTApXCIsIFwiQ3RybC1BbHQtQmFja3NwYWNlKDEwKVwiLCBcIkFsdC1EZWxldGUoMTApXCIsIFwiQWx0LUQoMTApXCJdXG59KTtcblxuZnVuY3Rpb24gZGVsZXRlQmFycmllcihwbSwgY3V0KSB7XG4gIHZhciBhcm91bmQgPSBwbS5kb2MucGF0aChjdXQucGF0aCk7XG4gIHZhciBiZWZvcmUgPSBhcm91bmQuY2hpbGQoY3V0Lm9mZnNldCAtIDEpLFxuICAgICAgYWZ0ZXIgPSBhcm91bmQuY2hpbGQoY3V0Lm9mZnNldCk7XG4gIGlmIChiZWZvcmUudHlwZS5jYW5Db250YWluQ29udGVudChhZnRlci50eXBlKSAmJiBwbS50ci5qb2luKGN1dCkuYXBwbHkoYW5kU2Nyb2xsKSAhPT0gZmFsc2UpIHJldHVybjtcblxuICB2YXIgY29ubiA9IHVuZGVmaW5lZDtcbiAgaWYgKGFmdGVyLmlzVGV4dGJsb2NrICYmIChjb25uID0gYmVmb3JlLnR5cGUuZmluZENvbm5lY3Rpb24oYWZ0ZXIudHlwZSkpKSB7XG4gICAgdmFyIHRyID0gcG0udHIsXG4gICAgICAgIGVuZCA9IGN1dC5tb3ZlKDEpO1xuICAgIHRyLnN0ZXAoXCJhbmNlc3RvclwiLCBjdXQsIGVuZCwgbnVsbCwgeyB0eXBlczogW2JlZm9yZS50eXBlXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbm4pKSxcbiAgICAgIGF0dHJzOiBbYmVmb3JlLmF0dHJzXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNvbm4ubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KSkpIH0pO1xuICAgIHRyLmpvaW4oZW5kKTtcbiAgICB0ci5qb2luKGN1dCk7XG4gICAgaWYgKHRyLmFwcGx5KGFuZFNjcm9sbCkgIT09IGZhbHNlKSByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsQWZ0ZXIgPSAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBjdXQsIDEpO1xuICByZXR1cm4gcG0udHIubGlmdChzZWxBZnRlci5mcm9tLCBzZWxBZnRlci50bykuYXBwbHkoYW5kU2Nyb2xsKTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiam9pbkJhY2t3YXJkXCIsXG4gIGxhYmVsOiBcIkpvaW4gd2l0aCB0aGUgYmxvY2sgYWJvdmVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjQgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNC5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb240LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYmVmb3JlIHRoaXMgb25lXG4gICAgdmFyIGJlZm9yZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3V0ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBoZWFkLnBhdGgubGVuZ3RoIC0gMTsgIWJlZm9yZSAmJiBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGhlYWQucGF0aFtpXSA+IDApIHtcbiAgICAgICAgY3V0ID0gaGVhZC5zaG9ydGVuKGkpO1xuICAgICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUgdGhpcywgdHJ5IHRvIGxpZnRcbiAgICBpZiAoIWJlZm9yZSkgcmV0dXJuIHBtLnRyLmxpZnQoaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcblxuICAgIC8vIElmIHRoZSBub2RlIGRvZXNuJ3QgYWxsb3cgY2hpbGRyZW4sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUudHlwZS5jb250YWlucyA9PSBudWxsKSByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oY3V0Lm1vdmUoLTEpLCBjdXQpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBBcHBseSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICByZXR1cm4gZGVsZXRlQmFycmllcihwbSwgY3V0KTtcbiAgfSxcbiAga2V5OiBbXCJCYWNrc3BhY2UoMzApXCIsIFwiTW9kLUJhY2tzcGFjZSgzMClcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJkZWxldGVDaGFyQmVmb3JlXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uNSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb241LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjUuZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IDApIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZnJvbSA9IG1vdmVCYWNrd2FyZChwbS5kb2MucGF0aChoZWFkLnBhdGgpLCBoZWFkLm9mZnNldCwgXCJjaGFyXCIpO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShuZXcgX21vZGVsLlBvcyhoZWFkLnBhdGgsIGZyb20pLCBoZWFkKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiQmFja3NwYWNlKDYwKVwiLFxuICBtYWNLZXk6IFwiQ3RybC1IKDQwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlV29yZEJlZm9yZVwiLFxuICBsYWJlbDogXCJEZWxldGUgdGhlIHdvcmQgYmVmb3JlIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjYgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNi5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb242LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGZyb20gPSBtb3ZlQmFja3dhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwid29yZFwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCBmcm9tKSwgaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIk1vZC1CYWNrc3BhY2UoNDApXCIsXG4gIG1hY0tleTogXCJBbHQtQmFja3NwYWNlKDQwKVwiXG59KTtcblxuZnVuY3Rpb24gbW92ZUZvcndhcmQocGFyZW50LCBvZmZzZXQsIGJ5KSB7XG4gIGlmIChieSAhPSBcImNoYXJcIiAmJiBieSAhPSBcIndvcmRcIikgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBtb3Rpb24gdW5pdDogXCIgKyBieSk7XG5cbiAgdmFyIGNhdCA9IG51bGwsXG4gICAgICBjb3VudGVkID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGlmIChvZmZzZXQgPT0gcGFyZW50LnNpemUpIHJldHVybiBvZmZzZXQ7XG5cbiAgICB2YXIgX3BhcmVudCRjaHVua0FmdGVyID0gcGFyZW50LmNodW5rQWZ0ZXIob2Zmc2V0KTtcblxuICAgIHZhciBzdGFydCA9IF9wYXJlbnQkY2h1bmtBZnRlci5zdGFydDtcbiAgICB2YXIgbm9kZSA9IF9wYXJlbnQkY2h1bmtBZnRlci5ub2RlO1xuXG4gICAgaWYgKCFub2RlLmlzVGV4dCkgcmV0dXJuIGNhdCA/IG9mZnNldCA6IG9mZnNldCArIDE7XG5cbiAgICBpZiAoYnkgPT0gXCJjaGFyXCIpIHtcbiAgICAgIGZvciAodmFyIGkgPSBvZmZzZXQgLSBzdGFydDsgaSA8IG5vZGUudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoISgwLCBfY2hhci5pc0V4dGVuZGluZ0NoYXIpKG5vZGUudGV4dC5jaGFyQXQoaSArIDEpKSkgcmV0dXJuIG9mZnNldCArIDE7XG4gICAgICAgIG9mZnNldCsrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnkgPT0gXCJ3b3JkXCIpIHtcbiAgICAgIGZvciAodmFyIGkgPSBvZmZzZXQgLSBzdGFydDsgaSA8IG5vZGUudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV4dENoYXJDYXQgPSAoMCwgX2NoYXIuY2hhckNhdGVnb3J5KShub2RlLnRleHQuY2hhckF0KGkpKTtcbiAgICAgICAgaWYgKGNhdCA9PSBudWxsIHx8IGNvdW50ZWQgPT0gMSAmJiBjYXQgPT0gXCJzcGFjZVwiKSBjYXQgPSBuZXh0Q2hhckNhdDtlbHNlIGlmIChjYXQgIT0gbmV4dENoYXJDYXQpIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCsrO1xuICAgICAgICBjb3VudGVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5Gb3J3YXJkXCIsXG4gIGxhYmVsOiBcIkpvaW4gd2l0aCB0aGUgYmxvY2sgYmVsb3dcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjcgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNy5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb243LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA8IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRmluZCB0aGUgbm9kZSBhZnRlciB0aGlzIG9uZVxuICAgIHZhciBhZnRlciA9IHVuZGVmaW5lZCxcbiAgICAgICAgY3V0ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSBoZWFkLnBhdGgubGVuZ3RoIC0gMTsgIWFmdGVyICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSwgMSk7XG4gICAgICB2YXIgX3BhcmVudCA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKTtcbiAgICAgIGlmIChjdXQub2Zmc2V0IDwgX3BhcmVudC5zaXplKSBhZnRlciA9IF9wYXJlbnQuY2hpbGQoY3V0Lm9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBhZnRlciB0aGlzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICBpZiAoIWFmdGVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBkb2Vzbid0IGFsbG93IGNoaWxkcmVuLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIudHlwZS5jb250YWlucyA9PSBudWxsKSByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKTtcblxuICAgIC8vIEFwcGx5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIHJldHVybiBkZWxldGVCYXJyaWVyKHBtLCBjdXQpO1xuICB9LFxuICBrZXk6IFtcIkRlbGV0ZSgzMClcIiwgXCJNb2QtRGVsZXRlKDMwKVwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZUNoYXJBZnRlclwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uOCA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb244LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjguZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0byA9IG1vdmVGb3J3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcImNoYXJcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGhlYWQsIG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgdG8pKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiRGVsZXRlKDYwKVwiLFxuICBtYWNLZXk6IFwiQ3RybC1EKDYwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlV29yZEFmdGVyXCIsXG4gIGxhYmVsOiBcIkRlbGV0ZSBhIGNoYXJhY3RlciBhZnRlciB0aGUgY3Vyc29yXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb245ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjkuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uOS5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPT0gcG0uZG9jLnBhdGgoaGVhZC5wYXRoKS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHRvID0gbW92ZUZvcndhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwid29yZFwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oaGVhZCwgbmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCB0bykpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtRGVsZXRlKDQwKVwiLFxuICBtYWNLZXk6IFtcIkN0cmwtQWx0LUJhY2tzcGFjZSg0MClcIiwgXCJBbHQtRGVsZXRlKDQwKVwiLCBcIkFsdC1EKDQwKVwiXVxufSk7XG5cbmZ1bmN0aW9uIGpvaW5Qb2ludEFib3ZlKHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMTAgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjEwLm5vZGU7XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEwLmZyb207XG5cbiAgaWYgKG5vZGUpIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luYWJsZUJsb2NrcykocG0uZG9jLCBmcm9tKSA/IGZyb20gOiBudWxsO2Vsc2UgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmpvaW5Qb2ludCkocG0uZG9jLCBmcm9tLCAtMSk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5VcFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggYWJvdmUgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuICAgIHZhciBwb2ludCA9IGpvaW5Qb2ludEFib3ZlKHBtKTtcbiAgICBpZiAoIXBvaW50KSByZXR1cm4gZmFsc2U7XG4gICAgcG0udHIuam9pbihwb2ludCkuYXBwbHkoKTtcbiAgICBpZiAobm9kZSkgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb2ludC5tb3ZlKC0xKSk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIGpvaW5Qb2ludEFib3ZlKHBtKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA4MCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA4MDAsIGhlaWdodDogOTAwLFxuICAgIHBhdGg6IFwiTTAgNzVoODAwdjEyNWgtODAweiBNMCA4MjVoODAwdi0xMjVoLTgwMHogTTI1MCA0MDBoMTAwdi0xMDBoMTAwdjEwMGgxMDB2MTAwaC0xMDB2MTAwaC0xMDB2LTEwMGgtMTAwelwiXG4gIH0sXG4gIGtleTogXCJBbHQtVXBcIlxufSk7XG5cbmZ1bmN0aW9uIGpvaW5Qb2ludEJlbG93KHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMTEgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjExLm5vZGU7XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xMS50bztcblxuICBpZiAobm9kZSkgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmpvaW5hYmxlQmxvY2tzKShwbS5kb2MsIHRvKSA/IHRvIDogbnVsbDtlbHNlIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luUG9pbnQpKHBtLmRvYywgdG8sIDEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luRG93blwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggYmVsb3cgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuICAgIHZhciBwb2ludCA9IGpvaW5Qb2ludEJlbG93KHBtKTtcbiAgICBpZiAoIXBvaW50KSByZXR1cm4gZmFsc2U7XG4gICAgcG0udHIuam9pbihwb2ludCkuYXBwbHkoKTtcbiAgICBpZiAobm9kZSkgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb2ludC5tb3ZlKC0xKSk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIGpvaW5Qb2ludEJlbG93KHBtKTtcbiAgfSxcbiAga2V5OiBcIkFsdC1Eb3duXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaWZ0XCIsXG4gIGxhYmVsOiBcIkxpZnQgb3V0IG9mIGVuY2xvc2luZyBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTIgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTIuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTIudG87XG5cbiAgICByZXR1cm4gcG0udHIubGlmdChmcm9tLCB0bykuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjEzID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEzLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjEzLnRvO1xuXG4gICAgcmV0dXJuICgwLCBfdHJhbnNmb3JtLmNhbkxpZnQpKHBtLmRvYywgZnJvbSwgdG8pO1xuICB9LFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDc1LFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDEwMjQsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk0yMTkgMzEwdjMyOXEwIDctNSAxMnQtMTIgNXEtOCAwLTEzLTVsLTE2NC0xNjRxLTUtNS01LTEzdDUtMTNsMTY0LTE2NHE1LTUgMTMtNSA3IDAgMTIgNXQ1IDEyek0xMDI0IDc0OXYxMDlxMCA3LTUgMTJ0LTEyIDVoLTk4N3EtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDk4N3E3IDAgMTIgNXQ1IDEyek0xMDI0IDUzMHYxMDlxMCA3LTUgMTJ0LTEyIDVoLTYyMXEtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDYyMXE3IDAgMTIgNXQ1IDEyek0xMDI0IDMxMHYxMDlxMCA3LTUgMTJ0LTEyIDVoLTYyMXEtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDYyMXE3IDAgMTIgNXQ1IDEyek0xMDI0IDkxdjEwOXEwIDctNSAxMnQtMTIgNWgtOTg3cS03IDAtMTItNXQtNS0xMnYtMTA5cTAtNyA1LTEydDEyLTVoOTg3cTcgMCAxMiA1dDUgMTJ6XCJcbiAgfSxcbiAga2V5OiBcIkFsdC1MZWZ0XCJcbn0pO1xuXG5mdW5jdGlvbiBpc0F0VG9wT2ZMaXN0SXRlbShkb2MsIGZyb20sIHRvLCBsaXN0VHlwZSkge1xuICByZXR1cm4gX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ucGF0aC5sZW5ndGggPj0gMiAmJiBmcm9tLnBhdGhbZnJvbS5wYXRoLmxlbmd0aCAtIDFdID09IDAgJiYgbGlzdFR5cGUuY2FuQ29udGFpbihkb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZnJvbS5wYXRoLmxlbmd0aCAtIDEpKSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDb21tYW5kKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgaXNMaXN0LCBzcGVjKSB7XG4gIHZhciBjb21tYW5kID0ge1xuICAgIG5hbWU6IFwid3JhcFwiICsgbmFtZSxcbiAgICBsYWJlbDogXCJXcmFwIGluIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjE0ID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTQuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNC50bztcbiAgICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE0LmhlYWQ7dmFyIGRvSm9pbiA9IGZhbHNlO1xuICAgICAgaWYgKGlzTGlzdCAmJiBoZWFkICYmIGlzQXRUb3BPZkxpc3RJdGVtKHBtLmRvYywgZnJvbSwgdG8sIHRoaXMpKSB7XG4gICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAoZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAyXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRvSm9pbiA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgdHIgPSBwbS50ci53cmFwKGZyb20sIHRvLCB0aGlzKTtcbiAgICAgIGlmIChkb0pvaW4pIHRyLmpvaW4oZnJvbS5zaG9ydGVuKGZyb20uZGVwdGggLSAyKSk7XG4gICAgICByZXR1cm4gdHIuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjE1ID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTUuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNS50bztcbiAgICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE1LmhlYWQ7XG5cbiAgICAgIGlmIChpc0xpc3QgJiYgaGVhZCAmJiBpc0F0VG9wT2ZMaXN0SXRlbShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKSAmJiBmcm9tLnBhdGhbZnJvbS5wYXRoLmxlbmd0aCAtIDJdID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiAoMCwgX3RyYW5zZm9ybS5jYW5XcmFwKShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIGtleSBpbiBzcGVjKSB7XG4gICAgY29tbWFuZFtrZXldID0gc3BlY1trZXldO1xuICB9dHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwgY29tbWFuZCk7XG59XG5cbndyYXBDb21tYW5kKF9tb2RlbC5CdWxsZXRMaXN0LCBcIkJ1bGxldExpc3RcIiwgXCJidWxsZXQgbGlzdFwiLCB0cnVlLCB7XG4gIG1lbnVHcm91cDogXCJibG9ja1wiLCBtZW51UmFuazogNDAsXG4gIGljb246IHtcbiAgICB3aWR0aDogNzY4LCBoZWlnaHQ6IDg5NixcbiAgICBwYXRoOiBcIk0wIDUxMmgxMjh2LTEyOGgtMTI4djEyOHpNMCAyNTZoMTI4di0xMjhoLTEyOHYxMjh6TTAgNzY4aDEyOHYtMTI4aC0xMjh2MTI4ek0yNTYgNTEyaDUxMnYtMTI4aC01MTJ2MTI4ek0yNTYgMjU2aDUxMnYtMTI4aC01MTJ2MTI4ek0yNTYgNzY4aDUxMnYtMTI4aC01MTJ2MTI4elwiXG4gIH0sXG4gIGtleTogW1wiQWx0LVJpZ2h0ICcqJ1wiLCBcIkFsdC1SaWdodCAnLSdcIl1cbn0pO1xuXG53cmFwQ29tbWFuZChfbW9kZWwuT3JkZXJlZExpc3QsIFwiT3JkZXJlZExpc3RcIiwgXCJvcmRlcmVkIGxpc3RcIiwgdHJ1ZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQxLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDc2OCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMzIwIDUxMmg0NDh2LTEyOGgtNDQ4djEyOHpNMzIwIDc2OGg0NDh2LTEyOGgtNDQ4djEyOHpNMzIwIDEyOHYxMjhoNDQ4di0xMjhoLTQ0OHpNNzkgMzg0aDc4di0yNTZoLTM2bC04NSAyM3Y1MGw0My0ydjE4NXpNMTg5IDU5MGMwLTM2LTEyLTc4LTk2LTc4LTMzIDAtNjQgNi04MyAxNmwxIDY2YzIxLTEwIDQyLTE1IDY3LTE1czMyIDExIDMyIDI4YzAgMjYtMzAgNTgtMTEwIDExMnY1MGgxOTJ2LTY3bC05MSAyYzQ5LTMwIDg3LTY2IDg3LTExM2wxLTF6XCJcbiAgfSxcbiAga2V5OiBcIkFsdC1SaWdodCAnMSdcIlxufSk7XG5cbndyYXBDb21tYW5kKF9tb2RlbC5CbG9ja1F1b3RlLCBcIkJsb2NrUXVvdGVcIiwgXCJibG9jayBxdW90ZVwiLCBmYWxzZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQ1LFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDY0MCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMCA0NDh2MjU2aDI1NnYtMjU2aC0xMjhjMCAwIDAtMTI4IDEyOC0xMjh2LTEyOGMwIDAtMjU2IDAtMjU2IDI1NnpNNjQwIDMyMHYtMTI4YzAgMC0yNTYgMC0yNTYgMjU2djI1NmgyNTZ2LTI1NmgtMTI4YzAgMCAwLTEyOCAxMjgtMTI4elwiXG4gIH0sXG4gIGtleTogW1wiQWx0LVJpZ2h0ICc+J1wiLCBcIkFsdC1SaWdodCAnXFxcIidcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJuZXdsaW5lSW5Db2RlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBuZXdsaW5lXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xNiA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xNi5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNi50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xNi5ub2RlO3ZhciBibG9jayA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIW5vZGUgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIChibG9jayA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCkpLnR5cGUuaXNDb2RlICYmIHRvLm9mZnNldCA8IGJsb2NrLnNpemUpIHJldHVybiBwbS50ci50eXBlVGV4dChcIlxcblwiKS5hcHBseShhbmRTY3JvbGwpO2Vsc2UgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMTApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJjcmVhdGVQYXJhZ3JhcGhOZWFyXCIsXG4gIGxhYmVsOiBcIkNyZWF0ZSBhIHBhcmFncmFwaCBuZWFyIHRoZSBzZWxlY3RlZCBsZWFmIGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xNyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xNy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xNy50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xNy5ub2RlO1xuXG4gICAgaWYgKCFub2RlIHx8ICFub2RlLmlzQmxvY2sgfHwgbm9kZS50eXBlLmNvbnRhaW5zKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNpZGUgPSBmcm9tLm9mZnNldCA/IHRvIDogZnJvbTtcbiAgICBwbS50ci5pbnNlcnQoc2lkZSwgcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhzaWRlLnRvUGF0aCgpLCAwKSk7XG4gIH0sXG4gIGtleTogXCJFbnRlcigyMClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImxpZnRFbXB0eUJsb2NrXCIsXG4gIGxhYmVsOiBcIk1vdmUgY3VycmVudCBibG9jayB1cFwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTggPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uMTguaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMTguZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMCB8fCBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGVhZC5kZXB0aCA+IDEpIHtcbiAgICAgIHZhciBzaG9ydGVyID0gaGVhZC5zaG9ydGVuKCk7XG4gICAgICBpZiAoc2hvcnRlci5vZmZzZXQgPiAwICYmIHNob3J0ZXIub2Zmc2V0IDwgcG0uZG9jLnBhdGgoc2hvcnRlci5wYXRoKS5zaXplIC0gMSAmJiBwbS50ci5zcGxpdChzaG9ydGVyKS5hcHBseSgpICE9PSBmYWxzZSkgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcG0udHIubGlmdChoZWFkKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMzApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzcGxpdEJsb2NrXCIsXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xOSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xOS5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xOS50bztcbiAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xOS5ub2RlO3ZhciBibG9jayA9IHBtLmRvYy5wYXRoKHRvLnBhdGgpO1xuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jaykge1xuICAgICAgaWYgKCFmcm9tLm9mZnNldCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHBtLnRyLnNwbGl0KGZyb20pLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0eXBlID0gdG8ub2Zmc2V0ID09IGJsb2NrLnNpemUgPyBwbS5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSA6IG51bGw7XG4gICAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0oZnJvbSwgdG8pLnNwbGl0KGZyb20sIDEsIHR5cGUpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfVxuICB9LFxuICBrZXk6IFwiRW50ZXIoNjApXCJcbn0pO1xuXG5fbW9kZWwuTGlzdEl0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzcGxpdExpc3RJdGVtXCIsXG4gIGxhYmVsOiBcIlNwbGl0IHRoZSBjdXJyZW50IGxpc3QgaXRlbVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMjAgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjAuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjAudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjAubm9kZTtcblxuICAgIGlmIChub2RlICYmIG5vZGUuaXNCbG9jayB8fCBmcm9tLnBhdGgubGVuZ3RoIDwgMiB8fCAhX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksXG4gICAgICAgIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aCk7XG4gICAgaWYgKGdyYW5kUGFyZW50LnR5cGUgIT0gdGhpcykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBuZXh0VHlwZSA9IHRvLm9mZnNldCA9PSBncmFuZFBhcmVudC5jaGlsZCh0b1BhcmVudC5vZmZzZXQpLnNpemUgPyBwbS5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSA6IG51bGw7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGZyb20sIHRvKS5zcGxpdChmcm9tLCAyLCBuZXh0VHlwZSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDUwKVwiXG59KTtcblxuZnVuY3Rpb24gYWxyZWFkeUhhc0Jsb2NrVHlwZShkb2MsIGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0byB8fCBmcm9tLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlLmlzVGV4dGJsb2NrKSB7XG4gICAgICBpZiAobm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnMpKSBmb3VuZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBibG9ja1R5cGVDb21tYW5kKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgYXR0cnMsIGtleSkge1xuICBpZiAoIWF0dHJzKSBhdHRycyA9IHt9O1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBsYWJlbDogXCJDaGFuZ2UgdG8gXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHZhciBfcG0kc2VsZWN0aW9uMjEgPSBwbS5zZWxlY3Rpb247XG4gICAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yMS5mcm9tO1xuICAgICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIxLnRvO1xuXG4gICAgICByZXR1cm4gcG0udHIuc2V0QmxvY2tUeXBlKGZyb20sIHRvLCB0aGlzLCBhdHRycykuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjIyID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjIuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMi50bztcbiAgICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjIyLm5vZGU7XG5cbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodGhpcywgYXR0cnMpO2Vsc2UgcmV0dXJuICFhbHJlYWR5SGFzQmxvY2tUeXBlKHBtLmRvYywgZnJvbSwgdG8sIHRoaXMsIGF0dHJzKTtcbiAgICB9LFxuICAgIGtleToga2V5XG4gIH0pO1xufVxuXG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VIMVwiLCBcImhlYWRpbmcgMVwiLCB7IGxldmVsOiAxIH0sIFwiTW9kLUggJzEnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDJcIiwgXCJoZWFkaW5nIDJcIiwgeyBsZXZlbDogMiB9LCBcIk1vZC1IICcyJ1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUgzXCIsIFwiaGVhZGluZyAzXCIsIHsgbGV2ZWw6IDMgfSwgXCJNb2QtSCAnMydcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VINFwiLCBcImhlYWRpbmcgNFwiLCB7IGxldmVsOiA0IH0sIFwiTW9kLUggJzQnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDVcIiwgXCJoZWFkaW5nIDVcIiwgeyBsZXZlbDogNSB9LCBcIk1vZC1IICc1J1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUg2XCIsIFwiaGVhZGluZyA2XCIsIHsgbGV2ZWw6IDYgfSwgXCJNb2QtSCAnNidcIik7XG5cbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLlBhcmFncmFwaCwgXCJtYWtlUGFyYWdyYXBoXCIsIFwicGFyYWdyYXBoXCIsIG51bGwsIFwiTW9kLVBcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5Db2RlQmxvY2ssIFwibWFrZUNvZGVCbG9ja1wiLCBcImNvZGUgYmxvY2tcIiwgbnVsbCwgXCJNb2QtXFxcXFwiKTtcblxuX21vZGVsLkhvcml6b250YWxSdWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiaW5zZXJ0SG9yaXpvbnRhbFJ1bGVcIixcbiAgbGFiZWw6IFwiSW5zZXJ0IGhvcml6b250YWwgcnVsZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtU3BhY2VcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInVuZG9cIixcbiAgbGFiZWw6IFwiVW5kbyBsYXN0IGNoYW5nZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHBtLnNjcm9sbEludG9WaWV3KCk7cmV0dXJuIHBtLmhpc3RvcnkudW5kbygpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBwbS5oaXN0b3J5LmNhblVuZG8oKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImhpc3RvcnlcIiwgbWVudVJhbms6IDEwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDEwMjQsIGhlaWdodDogMTAyNCxcbiAgICBwYXRoOiBcIk03NjEgMTAyNGMxMTMtMjA2IDEzMi01MjAtMzEzLTUwOXYyNTNsLTM4NC0zODQgMzg0LTM4NHYyNDhjNTM0LTEzIDU5NCA0NzIgMzEzIDc3NXpcIlxuICB9LFxuICBrZXk6IFwiTW9kLVpcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInJlZG9cIixcbiAgbGFiZWw6IFwiUmVkbyBsYXN0IHVuZG9uZSBjaGFuZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO3JldHVybiBwbS5oaXN0b3J5LnJlZG8oKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uaGlzdG9yeS5jYW5SZWRvKCk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJoaXN0b3J5XCIsIG1lbnVSYW5rOiAyMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNTc2IDI0OHYtMjQ4bDM4NCAzODQtMzg0IDM4NHYtMjUzYy00NDYtMTAtNDI3IDMwMy0zMTMgNTA5LTI4MC0zMDMtMjIxLTc4OSAzMTMtNzc1elwiXG4gIH0sXG4gIGtleTogW1wiTW9kLVlcIiwgXCJTaGlmdC1Nb2QtWlwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInRleHRibG9ja1R5cGVcIixcbiAgbGFiZWw6IFwiQ2hhbmdlIGJsb2NrIHR5cGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0sIHR5cGUpIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjIzID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIzLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIzLnRvO1xuXG4gICAgcmV0dXJuIHBtLnRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgdHlwZS50eXBlLCB0eXBlLmF0dHJzKS5hcHBseSgpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHZhciBub2RlID0gcG0uc2VsZWN0aW9uLm5vZGU7XG5cbiAgICByZXR1cm4gIW5vZGUgfHwgbm9kZS5pc1RleHRibG9jaztcbiAgfSxcbiAgcGFyYW1zOiBbeyBsYWJlbDogXCJUeXBlXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGxpc3RUZXh0YmxvY2tUeXBlcywgXCJkZWZhdWx0XCI6IGN1cnJlbnRUZXh0YmxvY2tUeXBlLCBkZWZhdWx0TGFiZWw6IFwiVHlwZS4uLlwiIH1dLFxuICBkaXNwbGF5OiBcInNlbGVjdFwiLFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDEwXG59KTtcblxuX21vZGVsLlBhcmFncmFwaC5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbeyBsYWJlbDogXCJOb3JtYWxcIiwgcmFuazogMTAgfV07XG5fbW9kZWwuQ29kZUJsb2NrLnByb3RvdHlwZS50ZXh0YmxvY2tUeXBlcyA9IFt7IGxhYmVsOiBcIkNvZGVcIiwgcmFuazogMjAgfV07XG5fbW9kZWwuSGVhZGluZy5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbMSwgMiwgMywgNCwgNSwgNl0ubWFwKGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiB7IGxhYmVsOiBcIkhlYWQgXCIgKyBuLCBhdHRyczogeyBsZXZlbDogbiB9LCByYW5rOiAzMCArIG4gfTtcbn0pO1xuXG5mdW5jdGlvbiBsaXN0VGV4dGJsb2NrVHlwZXMocG0pIHtcbiAgdmFyIGNhY2hlZCA9IHBtLnNjaGVtYS5jYWNoZWQudGV4dGJsb2NrVHlwZXM7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgdmFyIGZvdW5kID0gW107XG4gIGZvciAodmFyIF9uYW1lMyBpbiBwbS5zY2hlbWEubm9kZXMpIHtcbiAgICB2YXIgdHlwZSA9IHBtLnNjaGVtYS5ub2Rlc1tfbmFtZTNdO1xuICAgIGlmICghdHlwZS50ZXh0YmxvY2tUeXBlcykgY29udGludWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLnRleHRibG9ja1R5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5mbyA9IHR5cGUudGV4dGJsb2NrVHlwZXNbaV07XG4gICAgICAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkoZm91bmQsIHsgbGFiZWw6IGluZm8ubGFiZWwsIHZhbHVlOiB7IHR5cGU6IHR5cGUsIGF0dHJzOiBpbmZvLmF0dHJzIH0sIHJhbms6IGluZm8ucmFuayB9LCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5yYW5rIC0gYi5yYW5rO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwbS5zY2hlbWEuY2FjaGVkLnRleHRibG9ja1R5cGVzID0gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGN1cnJlbnRUZXh0YmxvY2tUeXBlKHBtKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjQgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI0LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNC50bztcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjQubm9kZTtcblxuICBpZiAoIW5vZGUgfHwgbm9kZS5pc0lubGluZSkge1xuICAgIGlmICghX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gbnVsbDtcbiAgICBub2RlID0gcG0uZG9jLnBhdGgoZnJvbS5wYXRoKTtcbiAgfSBlbHNlIGlmICghbm9kZS5pc1RleHRibG9jaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciB0eXBlcyA9IGxpc3RUZXh0YmxvY2tUeXBlcyhwbSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHAgPSB0eXBlc1tpXSxcbiAgICAgICAgdmFsID0gdHAudmFsdWU7XG4gICAgaWYgKG5vZGUuaGFzTWFya3VwKHZhbC50eXBlLCB2YWwuYXR0cnMpKSByZXR1cm4gdHA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKSB7XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb24sXG4gICAgICBpID0gMDtcbiAgaWYgKHNlbC5ub2RlKSByZXR1cm4gISFzZWwuZnJvbS5kZXB0aCAmJiBzZWwuZnJvbS5zaG9ydGVuKCk7XG4gIGZvciAoOyBpIDwgc2VsLmhlYWQuZGVwdGggJiYgaSA8IHNlbC5hbmNob3IuZGVwdGg7IGkrKykgaWYgKHNlbC5oZWFkLnBhdGhbaV0gIT0gc2VsLmFuY2hvci5wYXRoW2ldKSBicmVhaztcbiAgcmV0dXJuIGkgPT0gMCA/IGZhbHNlIDogc2VsLmhlYWQuc2hvcnRlbihpIC0gMSk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdFBhcmVudEJsb2NrXCIsXG4gIGxhYmVsOiBcIlNlbGVjdCBwYXJlbnQgbm9kZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBub2RlID0gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKTtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICBwbS5zZXROb2RlU2VsZWN0aW9uKG5vZGUpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBub2RlQWJvdmVTZWxlY3Rpb24ocG0pO1xuICB9LFxuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDkwLFxuICBpY29uOiB7IHRleHQ6IFwi4qyaXCIsIHN0eWxlOiBcImZvbnQtd2VpZ2h0OiBib2xkOyB2ZXJ0aWNhbC1hbGlnbjogMjAlXCIgfSxcbiAga2V5OiBcIkVzY1wiXG59KTtcblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHBtLCBkaXIpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yNSA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjUuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI1LnRvO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yNS5ub2RlO1xuXG4gIHZhciBzaWRlID0gZGlyID4gMCA/IHRvIDogZnJvbTtcbiAgcmV0dXJuICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25Gcm9tKShwbS5kb2MsIG5vZGUgJiYgbm9kZS5pc0Jsb2NrID8gc2lkZSA6IHNpZGUuc2hvcnRlbihudWxsLCBkaXIgPiAwID8gMSA6IDApLCBkaXIpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RCbG9ja0hvcml6b250YWxseShwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjYgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24yNi5lbXB0eTtcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjYubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjYuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI2LnRvO1xuXG4gIGlmICghZW1wdHkgJiYgIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZSAmJiBub2RlLmlzSW5saW5lKSB7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihkaXIgPiAwID8gdG8gOiBmcm9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwYXJlbnQgPSB1bmRlZmluZWQ7XG4gIGlmICghbm9kZSAmJiAocGFyZW50ID0gcG0uZG9jLnBhdGgoZnJvbS5wYXRoKSkgJiYgKGRpciA+IDAgPyBmcm9tLm9mZnNldCA8IHBhcmVudC5zaXplIDogZnJvbS5vZmZzZXQpKSB7XG4gICAgdmFyIF9yZWYgPSBkaXIgPiAwID8gcGFyZW50LmNodW5rQWZ0ZXIoZnJvbS5vZmZzZXQpIDogcGFyZW50LmNodW5rQmVmb3JlKGZyb20ub2Zmc2V0KTtcblxuICAgIHZhciBuZXh0Tm9kZSA9IF9yZWYubm9kZTtcbiAgICB2YXIgc3RhcnQgPSBfcmVmLnN0YXJ0O1xuXG4gICAgaWYgKG5leHROb2RlLnR5cGUuc2VsZWN0YWJsZSAmJiBzdGFydCA9PSBmcm9tLm9mZnNldCAtIChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICBwbS5zZXROb2RlU2VsZWN0aW9uKGRpciA8IDAgPyBmcm9tLm1vdmUoLTEpIDogZnJvbSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2socG0sIGRpcik7XG4gIGlmIChuZXh0ICYmIChuZXh0IGluc3RhbmNlb2YgX3NlbGVjdGlvbi5Ob2RlU2VsZWN0aW9uIHx8IG5vZGUpKSB7XG4gICAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KG5leHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tMZWZ0XCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgdG8gdGhlIGxlZnRcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrSG9yaXpvbnRhbGx5KHBtLCAtMSk7XG4gICAgaWYgKGRvbmUpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogW1wiTGVmdFwiLCBcIk1vZC1MZWZ0XCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tSaWdodFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIHRvIHRoZSByaWdodFwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBkb25lID0gc2VsZWN0QmxvY2tIb3Jpem9udGFsbHkocG0sIDEpO1xuICAgIGlmIChkb25lKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFtcIlJpZ2h0XCIsIFwiTW9kLVJpZ2h0XCJdXG59KTtcblxuZnVuY3Rpb24gc2VsZWN0QmxvY2tWZXJ0aWNhbGx5KHBtLCBkaXIpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yNyA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjI3LmVtcHR5O1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yNy5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yNy5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjcudG87XG5cbiAgaWYgKCFlbXB0eSAmJiAhbm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsZWF2aW5nVGV4dGJsb2NrID0gdHJ1ZTtcbiAgaWYgKCFub2RlIHx8IG5vZGUuaXNJbmxpbmUpIGxlYXZpbmdUZXh0YmxvY2sgPSAoMCwgX3NlbGVjdGlvbi52ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jaykocG0sIGRpciA+IDAgPyB0byA6IGZyb20sIGRpcik7XG5cbiAgaWYgKGxlYXZpbmdUZXh0YmxvY2spIHtcbiAgICB2YXIgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayhwbSwgZGlyKTtcbiAgICBpZiAobmV4dCAmJiBuZXh0IGluc3RhbmNlb2YgX3NlbGVjdGlvbi5Ob2RlU2VsZWN0aW9uKSB7XG4gICAgICBwbS5zZXRTZWxlY3Rpb25EaXJlY3QobmV4dCk7XG4gICAgICBpZiAoIW5vZGUpIHBtLnNlbC5sYXN0Tm9uTm9kZVBvcyA9IGZyb207XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICBpZiAobm9kZS5pc0lubGluZSkge1xuICAgICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgZnJvbSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBwbS5zZWwubGFzdE5vbk5vZGVQb3M7XG4gIHZhciBiZXlvbmQgPSAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBkaXIgPCAwID8gZnJvbSA6IHRvLCBkaXIpO1xuICBpZiAobGFzdCAmJiBiZXlvbmQgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChsYXN0LnBhdGgsIGJleW9uZC5mcm9tLnBhdGgpKSB7XG4gICAgKDAsIF9zZWxlY3Rpb24uc2V0RE9NU2VsZWN0aW9uVG9Qb3MpKHBtLCBsYXN0KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KGJleW9uZCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RCbG9ja1VwXCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgYWJvdmVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgLTEpO1xuICAgIGlmIChkb25lICE9PSBmYWxzZSkgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfSxcbiAga2V5OiBcIlVwXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RCbG9ja0Rvd25cIixcbiAgbGFiZWw6IFwiTW92ZSB0aGUgc2VsZWN0aW9uIG9udG8gb3Igb3V0IG9mIHRoZSBibG9jayBiZWxvd1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBkb25lID0gc2VsZWN0QmxvY2tWZXJ0aWNhbGx5KHBtLCAxKTtcbiAgICBpZiAoZG9uZSAhPT0gZmFsc2UpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogXCJEb3duXCJcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3Ige1xcbiAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCB7XFxuICBwYWRkaW5nOiA0cHggOHB4IDRweCAxNHB4O1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWRyb3AtdGFyZ2V0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiAxcHg7XFxuICBiYWNrZ3JvdW5kOiAjNjY2O1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgdWwudGlnaHQgcCwgLlByb3NlTWlycm9yLWNvbnRlbnQgb2wudGlnaHQgcCB7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IHVsLCAuUHJvc2VNaXJyb3ItY29udGVudCBvbCB7XFxuICBwYWRkaW5nLWxlZnQ6IDMwcHg7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGJsb2NrcXVvdGUge1xcbiAgcGFkZGluZy1sZWZ0OiAxZW07XFxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNlZWU7XFxuICBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBwcmUge1xcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcXG4gIG91dGxpbmU6IDJweCBzb2xpZCAjOGNmO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBwOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgxOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgyOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGgzOmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg0OmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg1OmZpcnN0LWNoaWxkLFxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGg2OmZpcnN0LWNoaWxkIHtcXG4gIG1hcmdpbi10b3A6IC4zZW07XFxufVxcblxcbi8qIEFkZCBzcGFjZSBhcm91bmQgdGhlIGhyIHRvIG1ha2UgY2xpY2tpbmcgaXQgZWFzaWVyICovXFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgaHIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgaGVpZ2h0OiA2cHg7XFxuICBib3JkZXI6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGhyOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMTBweDtcXG4gIHJpZ2h0OiAxMHB4O1xcbiAgdG9wOiAycHg7XFxuICBib3JkZXItdG9wOiAycHggc29saWQgc2lsdmVyO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBpbWcge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4vKiBNYWtlIHN1cmUgbGkgc2VsZWN0aW9ucyB3cmFwIGFyb3VuZCBtYXJrZXJzICovXFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgbGkge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIERvbid0IGRvIHdlaXJkIHN0dWZmIHdpdGggbWFya2VyIGNsaWNrcyAqL1xcbn1cXG4uUHJvc2VNaXJyb3ItY29udGVudCBsaSA+ICoge1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxufVxcblxcbmxpLlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZSB7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGU6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBsZWZ0OiAtMzJweDtcXG4gIHJpZ2h0OiAtMnB4OyB0b3A6IC0ycHg7IGJvdHRvbTogLTJweDtcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4Y2Y7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hcHBseURPTUNoYW5nZSA9IGFwcGx5RE9NQ2hhbmdlO1xuZXhwb3J0cy50ZXh0Q29udGV4dCA9IHRleHRDb250ZXh0O1xuZXhwb3J0cy50ZXh0SW5Db250ZXh0ID0gdGV4dEluQ29udGV4dDtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9wYXJzZURvbSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9kb21cIik7XG5cbnZhciBfdHJhbnNmb3JtVHJlZSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm0vdHJlZVwiKTtcblxudmFyIF9zZWxlY3Rpb24gPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbmZ1bmN0aW9uIGlzQXRFbmQobm9kZSwgcG9zLCBkZXB0aCkge1xuICBmb3IgKHZhciBpID0gZGVwdGggfHwgMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG4gPSBwb3MucGF0aFtkZXB0aF07XG4gICAgaWYgKG4gPCBub2RlLnNpemUgLSAxKSByZXR1cm4gZmFsc2U7XG4gICAgbm9kZSA9IG5vZGUuY2hpbGQobik7XG4gIH1cbiAgcmV0dXJuIHBvcy5vZmZzZXQgPT0gbm9kZS5zaXplO1xufVxuZnVuY3Rpb24gaXNBdFN0YXJ0KHBvcywgZGVwdGgpIHtcbiAgaWYgKHBvcy5vZmZzZXQgPiAwKSByZXR1cm4gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZXB0aCB8fCAwOyBpIDwgcG9zLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocG9zLnBhdGhbZGVwdGhdID4gMCkgcmV0dXJuIGZhbHNlO1xuICB9cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTmVhclNlbGVjdGlvbihwbSkge1xuICB2YXIgZG9tID0gcG0uY29udGVudCxcbiAgICAgIG5vZGUgPSBwbS5kb2M7XG4gIHZhciBfcG0kc2VsZWN0aW9uID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbi50bztcblxuICBmb3IgKHZhciBkZXB0aCA9IDA7OyBkZXB0aCsrKSB7XG4gICAgdmFyIHRvTm9kZSA9IG5vZGUuY2hpbGQodG8ucGF0aFtkZXB0aF0pO1xuICAgIHZhciBmcm9tU3RhcnQgPSBpc0F0U3RhcnQoZnJvbSwgZGVwdGggKyAxKTtcbiAgICB2YXIgdG9FbmQgPSBpc0F0RW5kKHRvTm9kZSwgdG8sIGRlcHRoICsgMSk7XG4gICAgaWYgKGZyb21TdGFydCB8fCB0b0VuZCB8fCBmcm9tLnBhdGhbZGVwdGhdICE9IHRvLnBhdGhbZGVwdGhdIHx8IHRvTm9kZS5pc1RleHRibG9jaykge1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gZGVwdGggPT0gZnJvbS5kZXB0aCA/IGZyb20ub2Zmc2V0IDogZnJvbS5wYXRoW2RlcHRoXTtcbiAgICAgIGlmIChmcm9tU3RhcnQgJiYgc3RhcnRPZmZzZXQgPiAwKSBzdGFydE9mZnNldC0tO1xuICAgICAgdmFyIGVuZE9mZnNldCA9IGRlcHRoID09IHRvLmRlcHRoID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtkZXB0aF0gKyAxO1xuICAgICAgaWYgKHRvRW5kICYmIGVuZE9mZnNldCA8IG5vZGUuc2l6ZSAtIDEpIGVuZE9mZnNldCsrO1xuICAgICAgdmFyIHBhcnNlZCA9ICgwLCBfcGFyc2VEb20uZnJvbURPTSkocG0uc2NoZW1hLCBkb20sIHsgdG9wTm9kZTogbm9kZS5jb3B5KCksXG4gICAgICAgIGZyb206IHN0YXJ0T2Zmc2V0LFxuICAgICAgICB0bzogZG9tLmNoaWxkTm9kZXMubGVuZ3RoIC0gKG5vZGUuc2l6ZSAtIGVuZE9mZnNldCkgfSk7XG4gICAgICBwYXJzZWQgPSBwYXJzZWQuY29weShub2RlLmNvbnRlbnQuc2xpY2UoMCwgc3RhcnRPZmZzZXQpLmFwcGVuZChwYXJzZWQuY29udGVudCkuYXBwZW5kKG5vZGUuY29udGVudC5zbGljZShlbmRPZmZzZXQpKSk7XG4gICAgICBmb3IgKHZhciBpID0gZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgd3JhcCA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBpKSk7XG4gICAgICAgIHBhcnNlZCA9IHdyYXAucmVwbGFjZShmcm9tLnBhdGhbaV0sIHBhcnNlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICBub2RlID0gdG9Ob2RlO1xuICAgIGRvbSA9ICgwLCBfc2VsZWN0aW9uLmZpbmRCeVBhdGgpKGRvbSwgZnJvbS5wYXRoW2RlcHRoXSwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5RE9NQ2hhbmdlKHBtKSB7XG4gIHZhciB1cGRhdGVkID0gcGFyc2VOZWFyU2VsZWN0aW9uKHBtKTtcbiAgdmFyIGNoYW5nZVN0YXJ0ID0gKDAsIF9tb2RlbC5maW5kRGlmZlN0YXJ0KShwbS5kb2MuY29udGVudCwgdXBkYXRlZC5jb250ZW50KTtcbiAgaWYgKGNoYW5nZVN0YXJ0KSB7XG4gICAgdmFyIGNoYW5nZUVuZCA9IGZpbmREaWZmRW5kQ29uc3RyYWluZWQocG0uZG9jLmNvbnRlbnQsIHVwZGF0ZWQuY29udGVudCwgY2hhbmdlU3RhcnQpO1xuICAgIC8vIE1hcmsgbm9kZXMgdG91Y2hlZCBieSB0aGlzIGNoYW5nZSBhcyAndG8gYmUgcmVkcmF3bidcbiAgICBwbS5tYXJrUmFuZ2VEaXJ0eShwbS5kb2Muc2libGluZ1JhbmdlKGNoYW5nZVN0YXJ0LCBjaGFuZ2VFbmQuYSkpO1xuXG4gICAgcG0udHIucmVwbGFjZShjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmEsIHVwZGF0ZWQsIGNoYW5nZVN0YXJ0LCBjaGFuZ2VFbmQuYikuYXBwbHkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0QnkoZmlyc3QsIHNlY29uZCwgcG9zKSB7XG4gIHZhciBzYW1lID0gKDAsIF90cmFuc2Zvcm1UcmVlLnNhbWVQYXRoRGVwdGgpKGZpcnN0LCBzZWNvbmQpO1xuICB2YXIgZmlyc3RFbmQgPSBzYW1lID09IGZpcnN0LmRlcHRoLFxuICAgICAgc2Vjb25kRW5kID0gc2FtZSA9PSBzZWNvbmQuZGVwdGg7XG4gIHZhciBvZmYgPSAoc2Vjb25kRW5kID8gc2Vjb25kLm9mZnNldCA6IHNlY29uZC5wYXRoW3NhbWVdKSAtIChmaXJzdEVuZCA/IGZpcnN0Lm9mZnNldCA6IGZpcnN0LnBhdGhbc2FtZV0pO1xuICB2YXIgc2hvcnRlciA9IGZpcnN0RW5kID8gcG9zLm1vdmUob2ZmKSA6IHBvcy5zaG9ydGVuKHNhbWUsIG9mZik7XG4gIGlmIChzZWNvbmRFbmQpIHJldHVybiBzaG9ydGVyO2Vsc2UgcmV0dXJuIHNob3J0ZXIuZXh0ZW5kKG5ldyBfbW9kZWwuUG9zKHNlY29uZC5wYXRoLnNsaWNlKHNhbWUpLCBzZWNvbmQub2Zmc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGZpbmREaWZmRW5kQ29uc3RyYWluZWQoYSwgYiwgc3RhcnQpIHtcbiAgdmFyIGVuZCA9ICgwLCBfbW9kZWwuZmluZERpZmZFbmQpKGEsIGIpO1xuICBpZiAoIWVuZCkgcmV0dXJuIGVuZDtcbiAgaWYgKGVuZC5hLmNtcChzdGFydCkgPCAwKSByZXR1cm4geyBhOiBzdGFydCwgYjogb2Zmc2V0QnkoZW5kLmEsIHN0YXJ0LCBlbmQuYikgfTtcbiAgaWYgKGVuZC5iLmNtcChzdGFydCkgPCAwKSByZXR1cm4geyBhOiBvZmZzZXRCeShlbmQuYiwgc3RhcnQsIGVuZC5hKSwgYjogc3RhcnQgfTtcbiAgcmV0dXJuIGVuZDtcbn1cblxuLy8gVGV4dC1vbmx5IHF1ZXJpZXMgZm9yIGNvbXBvc2l0aW9uIGV2ZW50c1xuXG5mdW5jdGlvbiB0ZXh0Q29udGV4dChkYXRhKSB7XG4gIHZhciByYW5nZSA9IGdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XG4gIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLFxuICAgICAgZW5kID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xuICBpZiAoc3RhcnQgPT0gZW5kICYmIHN0YXJ0Lm5vZGVUeXBlID09IDMpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGFydC5ub2RlVmFsdWUsXG4gICAgICAgIGxlYWQgPSByYW5nZS5zdGFydE9mZnNldCxcbiAgICAgICAgX2VuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICBpZiAoZGF0YSAmJiBfZW5kID49IGRhdGEubGVuZ3RoICYmIHZhbHVlLnNsaWNlKF9lbmQgLSBkYXRhLmxlbmd0aCwgX2VuZCkgPT0gZGF0YSkgbGVhZCA9IF9lbmQgLSBkYXRhLmxlbmd0aDtcbiAgICByZXR1cm4geyBpbnNpZGU6IHN0YXJ0LCBsZWFkOiBsZWFkLCB0cmFpbDogdmFsdWUubGVuZ3RoIC0gX2VuZCB9O1xuICB9XG5cbiAgdmFyIHNpemVCZWZvcmUgPSBudWxsLFxuICAgICAgc2l6ZUFmdGVyID0gbnVsbDtcbiAgdmFyIGJlZm9yZSA9IHN0YXJ0LmNoaWxkTm9kZXNbcmFuZ2Uuc3RhcnRPZmZzZXQgLSAxXSB8fCBub2RlQmVmb3JlKHN0YXJ0KTtcbiAgd2hpbGUgKGJlZm9yZS5sYXN0Q2hpbGQpIGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQ7XG4gIGlmIChiZWZvcmUgJiYgYmVmb3JlLm5vZGVUeXBlID09IDMpIHtcbiAgICB2YXIgdmFsdWUgPSBiZWZvcmUubm9kZVZhbHVlO1xuICAgIHNpemVCZWZvcmUgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGRhdGEgJiYgdmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gZGF0YS5sZW5ndGgpID09IGRhdGEpIHNpemVCZWZvcmUgLT0gZGF0YS5sZW5ndGg7XG4gIH1cbiAgdmFyIGFmdGVyID0gZW5kLmNoaWxkTm9kZXNbcmFuZ2UuZW5kT2Zmc2V0XSB8fCBub2RlQWZ0ZXIoZW5kKTtcbiAgd2hpbGUgKGFmdGVyLmZpcnN0Q2hpbGQpIGFmdGVyID0gYWZ0ZXIuZmlyc3RDaGlsZDtcbiAgaWYgKGFmdGVyICYmIGFmdGVyLm5vZGVUeXBlID09IDMpIHNpemVBZnRlciA9IGFmdGVyLm5vZGVWYWx1ZS5sZW5ndGg7XG5cbiAgcmV0dXJuIHsgYmVmb3JlOiBiZWZvcmUsIHNpemVCZWZvcmU6IHNpemVCZWZvcmUsXG4gICAgYWZ0ZXI6IGFmdGVyLCBzaXplQWZ0ZXI6IHNpemVBZnRlciB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0SW5Db250ZXh0KGNvbnRleHQsIGRlZmx0KSB7XG4gIGlmIChjb250ZXh0Lmluc2lkZSkge1xuICAgIHZhciBfdmFsID0gY29udGV4dC5pbnNpZGUubm9kZVZhbHVlO1xuICAgIHJldHVybiBfdmFsLnNsaWNlKGNvbnRleHQubGVhZCwgX3ZhbC5sZW5ndGggLSBjb250ZXh0LnRyYWlsKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmVmb3JlID0gY29udGV4dC5iZWZvcmUsXG4gICAgICAgIGFmdGVyID0gY29udGV4dC5hZnRlcixcbiAgICAgICAgdmFsID0gXCJcIjtcbiAgICBpZiAoIWJlZm9yZSkgcmV0dXJuIGRlZmx0O1xuICAgIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMykgdmFsID0gYmVmb3JlLm5vZGVWYWx1ZS5zbGljZShjb250ZXh0LnNpemVCZWZvcmUpO1xuICAgIHZhciBzY2FuID0gc2NhblRleHQoYmVmb3JlLCBhZnRlcik7XG4gICAgaWYgKHNjYW4gPT0gbnVsbCkgcmV0dXJuIGRlZmx0O1xuICAgIHZhbCArPSBzY2FuO1xuICAgIGlmIChhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICB2YXIgdmFsQWZ0ZXIgPSBhZnRlci5ub2RlVmFsdWU7XG4gICAgICB2YWwgKz0gdmFsQWZ0ZXIuc2xpY2UoMCwgdmFsQWZ0ZXIubGVuZ3RoIC0gY29udGV4dC5zaXplQWZ0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVBZnRlcihub2RlKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgaWYgKG5leHQpIHtcbiAgICAgIHdoaWxlIChuZXh0LmZpcnN0Q2hpbGQpIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50RWxlbWVudCkpIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVCZWZvcmUobm9kZSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByZXYgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICBpZiAocHJldikge1xuICAgICAgd2hpbGUgKHByZXYubGFzdENoaWxkKSBwcmV2ID0gcHJldi5sYXN0Q2hpbGQ7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50RWxlbWVudCkpIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjYW5UZXh0KHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRleHQgPSBcIlwiLFxuICAgICAgY3VyID0gbm9kZUFmdGVyKHN0YXJ0KTtcbiAgZm9yICg7Oykge1xuICAgIGlmIChjdXIgPT0gZW5kKSByZXR1cm4gdGV4dDtcbiAgICBpZiAoIWN1cikgcmV0dXJuIG51bGw7XG4gICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAzKSB0ZXh0ICs9IGN1ci5ub2RlVmFsdWU7XG4gICAgY3VyID0gY3VyLmZpcnN0Q2hpbGQgfHwgbm9kZUFmdGVyKGN1cik7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZHJhdyA9IGRyYXc7XG5leHBvcnRzLnJlZHJhdyA9IHJlZHJhdztcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9zZXJpYWxpemVEb20gPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL2RvbVwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX21haW4gPSByZXF1aXJlKFwiLi9tYWluXCIpO1xuXG4vLyBGSVhNRSBjbGVhbiB1cCB0aHJlYWRpbmcgb2YgcGF0aCBhbmQgb2Zmc2V0LCBtYXliZSByZW1vdmUgZnJvbSBET00gcmVuZGVyZXIgZW50aXJlbHlcblxuZnVuY3Rpb24gb3B0aW9ucyhwYXRoLCByYW5nZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIobm9kZSwgZG9tLCBvZmZzZXQpIHtcbiAgICAgIGlmICghbm9kZS5pc1RleHQgJiYgbm9kZS50eXBlLmNvbnRhaW5zID09IG51bGwpIHtcbiAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZS5pc0Jsb2NrKSBkb20uc2V0QXR0cmlidXRlKFwicG0tbGVhZlwiLCBcInRydWVcIik7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5pc0Jsb2NrICYmIG9mZnNldCAhPSBudWxsKSBkb20uc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICBpZiAobm9kZS5pc1RleHRibG9jaykgYWRqdXN0VHJhaWxpbmdIYWNrcyhkb20sIG5vZGUpO1xuXG4gICAgICByZXR1cm4gZG9tO1xuICAgIH0sXG4gICAgcmVuZGVySW5saW5lRmxhdDogZnVuY3Rpb24gcmVuZGVySW5saW5lRmxhdChub2RlLCBkb20sIG9mZnNldCkge1xuICAgICAgcmFuZ2VzLmFkdmFuY2VUbyhuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQpKTtcbiAgICAgIHZhciBlbmQgPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQgKyBub2RlLndpZHRoKTtcbiAgICAgIHZhciBuZXh0Q3V0ID0gcmFuZ2VzLm5leHRDaGFuZ2VCZWZvcmUoZW5kKTtcblxuICAgICAgdmFyIGlubmVyID0gZG9tLFxuICAgICAgICAgIHdyYXBwZWQgPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5uZXIgPSBpbm5lci5maXJzdENoaWxkO1xuICAgICAgfWlmIChkb20ubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICBkb20gPSAoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCBkb20pO1xuICAgICAgICBpZiAoIW5leHRDdXQpIHdyYXBwZWQgPSBkb207XG4gICAgICB9XG4gICAgICBpZiAoIXdyYXBwZWQgJiYgKG5leHRDdXQgfHwgcmFuZ2VzLmN1cnJlbnQubGVuZ3RoKSkge1xuICAgICAgICB3cmFwcGVkID0gaW5uZXIgPT0gZG9tID8gZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgaW5uZXIpIDogaW5uZXIucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCgoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCBpbm5lcikpO1xuICAgICAgfVxuXG4gICAgICBkb20uc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICBpZiAobm9kZS50eXBlLmNvbnRhaW5zID09IG51bGwpIGRvbS5zZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIsIG5vZGUuaXNUZXh0ID8gbm9kZS53aWR0aCA6IFwidHJ1ZVwiKTtcblxuICAgICAgdmFyIGlubGluZU9mZnNldCA9IDA7XG4gICAgICB3aGlsZSAobmV4dEN1dCkge1xuICAgICAgICB2YXIgc2l6ZSA9IG5leHRDdXQgLSBvZmZzZXQ7XG4gICAgICAgIHZhciBzcGxpdCA9IHNwbGl0U3Bhbih3cmFwcGVkLCBzaXplKTtcbiAgICAgICAgaWYgKHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkgc3BsaXQuY2xhc3NOYW1lID0gcmFuZ2VzLmN1cnJlbnQuam9pbihcIiBcIik7XG4gICAgICAgIHNwbGl0LnNldEF0dHJpYnV0ZShcInBtLWlubmVyLW9mZnNldFwiLCBpbmxpbmVPZmZzZXQpO1xuICAgICAgICBpbmxpbmVPZmZzZXQgKz0gc2l6ZTtcbiAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHJhbmdlcy5hZHZhbmNlVG8obmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KSk7XG4gICAgICAgIGlmICghKG5leHRDdXQgPSByYW5nZXMubmV4dENoYW5nZUJlZm9yZShlbmQpKSkgd3JhcHBlZC5zZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIiwgaW5saW5lT2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkgd3JhcHBlZC5jbGFzc05hbWUgPSByYW5nZXMuY3VycmVudC5qb2luKFwiIFwiKTtcbiAgICAgIHJldHVybiBkb207XG4gICAgfSxcbiAgICBkb2N1bWVudDogZG9jdW1lbnQsIHBhdGg6IHBhdGhcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3BsaXRTcGFuKHNwYW4sIGF0KSB7XG4gIHZhciB0ZXh0Tm9kZSA9IHNwYW4uZmlyc3RDaGlsZCxcbiAgICAgIHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gIHZhciBuZXdOb2RlID0gc3Bhbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgoMCwgX2RvbS5lbHQpKFwic3BhblwiLCBudWxsLCB0ZXh0LnNsaWNlKDAsIGF0KSksIHNwYW4pO1xuICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSB0ZXh0LnNsaWNlKGF0KTtcbiAgcmV0dXJuIG5ld05vZGU7XG59XG5cbmZ1bmN0aW9uIGRyYXcocG0sIGRvYykge1xuICBwbS5jb250ZW50LnRleHRDb250ZW50ID0gXCJcIjtcbiAgcG0uY29udGVudC5hcHBlbmRDaGlsZCgoMCwgX3NlcmlhbGl6ZURvbS50b0RPTSkoZG9jLCBvcHRpb25zKFtdLCBwbS5yYW5nZXMuYWN0aXZlUmFuZ2VUcmFja2VyKCkpKSk7XG59XG5cbmZ1bmN0aW9uIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKSB7XG4gIHZhciBuZWVkcyA9IG5vZGUuc2l6ZSA9PSAwIHx8IG5vZGUubGFzdENoaWxkLnR5cGUuaXNCUiA/IFwiYnJcIiA6ICFub2RlLmxhc3RDaGlsZC5pc1RleHQgJiYgbm9kZS5sYXN0Q2hpbGQudHlwZS5jb250YWlucyA9PSBudWxsID8gXCJ0ZXh0XCIgOiBudWxsO1xuICB2YXIgbGFzdCA9IGRvbS5sYXN0Q2hpbGQ7XG4gIHZhciBoYXMgPSAhbGFzdCB8fCBsYXN0Lm5vZGVUeXBlICE9IDEgfHwgIWxhc3QuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpID8gbnVsbCA6IGxhc3Qubm9kZU5hbWUgPT0gXCJCUlwiID8gXCJiclwiIDogXCJ0ZXh0XCI7XG4gIGlmIChuZWVkcyAhPSBoYXMpIHtcbiAgICBpZiAoaGFzKSBkb20ucmVtb3ZlQ2hpbGQobGFzdCk7XG4gICAgaWYgKG5lZWRzKSBkb20uYXBwZW5kQ2hpbGQobmVlZHMgPT0gXCJiclwiID8gKDAsIF9kb20uZWx0KShcImJyXCIsIHsgXCJwbS1pZ25vcmVcIjogXCJ0cmFpbGluZy1icmVha1wiIH0pIDogKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcInBtLWlnbm9yZVwiOiBcImN1cnNvci10ZXh0XCIgfSwgXCJcIikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlSW4oaXRlciwgbm9kZSkge1xuICB2YXIgY29weSA9IGl0ZXIuY29weSgpO1xuICBmb3IgKHZhciBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBjb3B5Lm5leHQoKS52YWx1ZTspIHtcbiAgICBpZiAoY2hpbGQgPT0gbm9kZSkgcmV0dXJuIGNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmVQYXN0KGRvbSkge1xuICB2YXIgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tKTtcbiAgcmV0dXJuIG5leHQ7XG59XG5cbmZ1bmN0aW9uIHJlZHJhdyhwbSwgZGlydHksIGRvYywgcHJldikge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMoW10sIHBtLnJhbmdlcy5hY3RpdmVSYW5nZVRyYWNrZXIoKSk7XG5cbiAgZnVuY3Rpb24gc2Nhbihkb20sIG5vZGUsIHByZXYpIHtcbiAgICB2YXIgaU5vZGUgPSBub2RlLml0ZXIoKSxcbiAgICAgICAgaVByZXYgPSBwcmV2Lml0ZXIoKSxcbiAgICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgIHZhciBkb21Qb3MgPSBkb20uZmlyc3RDaGlsZDtcblxuICAgIGZvciAodmFyIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGlOb2RlLm5leHQoKS52YWx1ZTspIHtcbiAgICAgIHZhciBvZmZzZXQgPSBpTm9kZS5vZmZzZXQgLSBjaGlsZC53aWR0aCxcbiAgICAgICAgICBtYXRjaGluZyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXVzZURPTSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghbm9kZS5pc1RleHRibG9jaykgb3B0cy5wYXRoLnB1c2gob2Zmc2V0KTtcblxuICAgICAgaWYgKHBDaGlsZCA9PSBjaGlsZCkge1xuICAgICAgICBtYXRjaGluZyA9IHBDaGlsZDtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmcgPSBmaW5kTm9kZUluKGlQcmV2LCBjaGlsZCkpIHtcbiAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBtYXRjaGluZykge1xuICAgICAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICAgICAgICBkb21Qb3MgPSBtb3ZlUGFzdChkb21Qb3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGluZyAmJiAhZGlydHkuZ2V0KG1hdGNoaW5nKSkge1xuICAgICAgICByZXVzZURPTSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHBDaGlsZCAmJiAhY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAocENoaWxkKSAmJiBkaXJ0eS5nZXQocENoaWxkKSAhPSBfbWFpbi5ESVJUWV9SRURSQVcpIHtcbiAgICAgICAgcmV1c2VET00gPSB0cnVlO1xuICAgICAgICB2YXIgY29udGVudE5vZGUgPSBkb21Qb3M7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICB2YXIgZmlyc3QgPSBjb250ZW50Tm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgIGlmICghZmlyc3QgfHwgIWZpcnN0Lmhhc0F0dHJpYnV0ZSB8fCBmaXJzdC5oYXNBdHRyaWJ1dGUoXCJwbS1pZ25vcmVcIikgfHwgZmlyc3QuaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSBicmVhaztcbiAgICAgICAgICBjb250ZW50Tm9kZSA9IGZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHNjYW4oY29udGVudE5vZGUsIGNoaWxkLCBwQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlbmRlcmVkID0gKDAsIF9zZXJpYWxpemVEb20ucmVuZGVyTm9kZVRvRE9NKShjaGlsZCwgb3B0cywgb2Zmc2V0KTtcbiAgICAgICAgZG9tLmluc2VydEJlZm9yZShyZW5kZXJlZCwgZG9tUG9zKTtcbiAgICAgICAgcmV1c2VET00gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldXNlRE9NKSB7XG4gICAgICAgIGRvbVBvcy5zZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIiwgb2Zmc2V0KTtcbiAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICBwQ2hpbGQgPSBpUHJldi5uZXh0KCkudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIG9wdHMucGF0aC5wb3AoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAocENoaWxkKSB7XG4gICAgICBkb21Qb3MgPSBtb3ZlUGFzdChkb21Qb3MpO1xuICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykgYWRqdXN0VHJhaWxpbmdIYWNrcyhkb20sIG5vZGUpO1xuICB9XG4gIHNjYW4ocG0uY29udGVudCwgZG9jLCBwcmV2KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBJbnZlcnRlZFN0ZXAgPSBmdW5jdGlvbiBJbnZlcnRlZFN0ZXAoc3RlcCwgdmVyc2lvbiwgaWQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludmVydGVkU3RlcCk7XG5cbiAgdGhpcy5zdGVwID0gc3RlcDtcbiAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgdGhpcy5pZCA9IGlkO1xufTtcblxudmFyIEJyYW5jaFJlbWFwcGluZyA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJyYW5jaFJlbWFwcGluZyhicmFuY2gpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnJhbmNoUmVtYXBwaW5nKTtcblxuICAgIHRoaXMuYnJhbmNoID0gYnJhbmNoO1xuICAgIHRoaXMucmVtYXAgPSBuZXcgX3RyYW5zZm9ybS5SZW1hcHBpbmcoKTtcbiAgICB0aGlzLnZlcnNpb24gPSBicmFuY2gudmVyc2lvbjtcbiAgICB0aGlzLm1pcnJvckJ1ZmZlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQnJhbmNoUmVtYXBwaW5nLCBbe1xuICAgIGtleTogXCJtb3ZlVG9WZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVUb1ZlcnNpb24odmVyc2lvbikge1xuICAgICAgd2hpbGUgKHRoaXMudmVyc2lvbiA+IHZlcnNpb24pIHRoaXMuYWRkTmV4dE1hcCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGROZXh0TWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZE5leHRNYXAoKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmJyYW5jaC5taXJyb3JbdGhpcy52ZXJzaW9uXTtcbiAgICAgIHZhciBtYXBPZmZzZXQgPSB0aGlzLmJyYW5jaC5tYXBzLmxlbmd0aCAtICh0aGlzLmJyYW5jaC52ZXJzaW9uIC0gdGhpcy52ZXJzaW9uKSAtIDE7XG4gICAgICB2YXIgaWQgPSB0aGlzLnJlbWFwLmFkZFRvRnJvbnQodGhpcy5icmFuY2gubWFwc1ttYXBPZmZzZXRdLCB0aGlzLm1pcnJvckJ1ZmZlclt0aGlzLnZlcnNpb25dKTtcbiAgICAgIC0tdGhpcy52ZXJzaW9uO1xuICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHRoaXMubWlycm9yQnVmZmVyW2ZvdW5kXSA9IGlkO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtb3ZlUGFzdFN0ZXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZVBhc3RTdGVwKHJlc3VsdCkge1xuICAgICAgdmFyIGlkID0gdGhpcy5hZGROZXh0TWFwKCk7XG4gICAgICBpZiAocmVzdWx0KSB0aGlzLnJlbWFwLmFkZFRvQmFjayhyZXN1bHQubWFwLCBpZCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJyYW5jaFJlbWFwcGluZztcbn0pKCk7XG5cbnZhciB3b3JrVGltZSA9IDEwMCxcbiAgICBwYXVzZVRpbWUgPSAxNTA7XG5cbnZhciBDb21wcmVzc2lvbldvcmtlciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXByZXNzaW9uV29ya2VyKGRvYywgYnJhbmNoLCBjYWxsYmFjaykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wcmVzc2lvbldvcmtlcik7XG5cbiAgICB0aGlzLmJyYW5jaCA9IGJyYW5jaDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5yZW1hcCA9IG5ldyBCcmFuY2hSZW1hcHBpbmcoYnJhbmNoKTtcblxuICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5tYXBzID0gW107XG4gICAgdGhpcy52ZXJzaW9uID0gdGhpcy5zdGFydFZlcnNpb24gPSBicmFuY2gudmVyc2lvbjtcblxuICAgIHRoaXMuaSA9IGJyYW5jaC5ldmVudHMubGVuZ3RoO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcHJlc3Npb25Xb3JrZXIsIFt7XG4gICAga2V5OiBcIndvcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd29yaygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgdmFyIGVuZFRpbWUgPSBEYXRlLm5vdygpICsgd29ya1RpbWU7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMuaSA9PSAwKSByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgdmFyIF9ldmVudCA9IHRoaXMuYnJhbmNoLmV2ZW50c1stLXRoaXMuaV0sXG4gICAgICAgICAgICBvdXRFdmVudCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50Lmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgdmFyIF9ldmVudCRqID0gX2V2ZW50W2pdO1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50JGouc3RlcDtcbiAgICAgICAgICB2YXIgc3RlcFZlcnNpb24gPSBfZXZlbnQkai52ZXJzaW9uO1xuICAgICAgICAgIHZhciBzdGVwSUQgPSBfZXZlbnQkai5pZDtcblxuICAgICAgICAgIHRoaXMucmVtYXAubW92ZVRvVmVyc2lvbihzdGVwVmVyc2lvbik7XG5cbiAgICAgICAgICB2YXIgbWFwcGVkU3RlcCA9IHN0ZXAubWFwKHRoaXMucmVtYXAucmVtYXApO1xuICAgICAgICAgIGlmIChtYXBwZWRTdGVwICYmIGlzRGVsU3RlcChzdGVwKSkge1xuICAgICAgICAgICAgdmFyIGV4dHJhID0gMCxcbiAgICAgICAgICAgICAgICBzdGFydCA9IHN0ZXAuZnJvbTtcbiAgICAgICAgICAgIHdoaWxlIChqID4gMCkge1xuICAgICAgICAgICAgICB2YXIgbmV4dCA9IF9ldmVudFtqIC0gMV07XG4gICAgICAgICAgICAgIGlmIChuZXh0LnZlcnNpb24gIT0gc3RlcFZlcnNpb24gLSAxIHx8ICFpc0RlbFN0ZXAobmV4dC5zdGVwKSB8fCBzdGFydC5jbXAobmV4dC5zdGVwLnRvKSkgYnJlYWs7XG4gICAgICAgICAgICAgIGV4dHJhICs9IG5leHQuc3RlcC50by5vZmZzZXQgLSBuZXh0LnN0ZXAuZnJvbS5vZmZzZXQ7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dC5zdGVwLmZyb207XG4gICAgICAgICAgICAgIHN0ZXBWZXJzaW9uLS07XG4gICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgICAgdGhpcy5yZW1hcC5hZGROZXh0TWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0cmEgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciBfc3RhcnQgPSBtYXBwZWRTdGVwLmZyb20ubW92ZSgtZXh0cmEpO1xuICAgICAgICAgICAgICBtYXBwZWRTdGVwID0gbmV3IF90cmFuc2Zvcm0uU3RlcChcInJlcGxhY2VcIiwgX3N0YXJ0LCBtYXBwZWRTdGVwLnRvLCBfc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbWFwcGVkU3RlcCAmJiBtYXBwZWRTdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmRvYyA9IHJlc3VsdC5kb2M7XG4gICAgICAgICAgICB0aGlzLm1hcHMucHVzaChyZXN1bHQubWFwLmludmVydCgpKTtcbiAgICAgICAgICAgIG91dEV2ZW50LnB1c2gobmV3IEludmVydGVkU3RlcChtYXBwZWRTdGVwLCB0aGlzLnZlcnNpb24sIHN0ZXBJRCkpO1xuICAgICAgICAgICAgdGhpcy52ZXJzaW9uLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVtYXAubW92ZVBhc3RTdGVwKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dEV2ZW50Lmxlbmd0aCkge1xuICAgICAgICAgIG91dEV2ZW50LnJldmVyc2UoKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKG91dEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMud29yaygpO1xuICAgICAgICAgIH0sIHBhdXNlVGltZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmlzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5pc2goKSB7XG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgIHRoaXMuZXZlbnRzLnJldmVyc2UoKTtcbiAgICAgIHRoaXMubWFwcy5yZXZlcnNlKCk7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFwcy5jb25jYXQodGhpcy5icmFuY2gubWFwcy5zbGljZSh0aGlzLmJyYW5jaC5tYXBzLmxlbmd0aCAtICh0aGlzLmJyYW5jaC52ZXJzaW9uIC0gdGhpcy5zdGFydFZlcnNpb24pKSksIHRoaXMuZXZlbnRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWJvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWJvcnQoKSB7XG4gICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb21wcmVzc2lvbldvcmtlcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIGlzRGVsU3RlcChzdGVwKSB7XG4gIHJldHVybiBzdGVwLnR5cGUgPT0gXCJyZXBsYWNlXCIgJiYgc3RlcC5mcm9tLm9mZnNldCA8IHN0ZXAudG8ub2Zmc2V0ICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgoc3RlcC5mcm9tLnBhdGgsIHN0ZXAudG8ucGF0aCkgJiYgKCFzdGVwLnBhcmFtIHx8IHN0ZXAucGFyYW0uY29udGVudC5zaXplID09IDApO1xufVxuXG52YXIgY29tcHJlc3NTdGVwQ291bnQgPSAxNTA7XG5cbnZhciBCcmFuY2ggPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCcmFuY2gobWF4RGVwdGgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnJhbmNoKTtcblxuICAgIHRoaXMubWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICB0aGlzLnZlcnNpb24gPSAwO1xuICAgIHRoaXMubmV4dFN0ZXBJRCA9IDE7XG5cbiAgICB0aGlzLm1hcHMgPSBbXTtcbiAgICB0aGlzLm1pcnJvciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICB0aGlzLmNvbXByZXNzaW5nID0gbnVsbDtcbiAgICB0aGlzLmNvbXByZXNzVGltZW91dCA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQnJhbmNoLCBbe1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcihmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlIHx8ICF0aGlzLmVtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5tYXBzLmxlbmd0aCA9IHRoaXMuZXZlbnRzLmxlbmd0aCA9IHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICAgICAgdGhpcy5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmV3RXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV3RXZlbnQoKSB7XG4gICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcbiAgICAgIHRoaXMuZXZlbnRzLnB1c2goW10pO1xuICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCA+IHRoaXMubWF4RGVwdGgpIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZE1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNYXAobWFwKSB7XG4gICAgICBpZiAoIXRoaXMuZW1wdHkoKSkge1xuICAgICAgICB0aGlzLm1hcHMucHVzaChtYXApO1xuICAgICAgICB0aGlzLnZlcnNpb24rKztcbiAgICAgICAgdGhpcy5zdGVwc1NpbmNlQ29tcHJlc3MrKztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzLmxlbmd0aCA9PSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRTdGVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFN0ZXAoc3RlcCwgbWFwLCBpZCkge1xuICAgICAgdGhpcy5hZGRNYXAobWFwKTtcbiAgICAgIGlmIChpZCA9PSBudWxsKSBpZCA9IHRoaXMubmV4dFN0ZXBJRCsrO1xuICAgICAgdGhpcy5ldmVudHNbdGhpcy5ldmVudHMubGVuZ3RoIC0gMV0ucHVzaChuZXcgSW52ZXJ0ZWRTdGVwKHN0ZXAsIHRoaXMudmVyc2lvbiwgaWQpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIGlkcykge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybS5zdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaW52ZXJ0ZWQgPSB0cmFuc2Zvcm0uc3RlcHNbaV0uaW52ZXJ0KHRyYW5zZm9ybS5kb2NzW2ldLCB0cmFuc2Zvcm0ubWFwc1tpXSk7XG4gICAgICAgIHRoaXMuYWRkU3RlcChpbnZlcnRlZCwgdHJhbnNmb3JtLm1hcHNbaV0sIGlkcyAmJiBpZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BFdmVudChkb2MsIGFsbG93Q29sbGFwc2luZykge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKTtcbiAgICAgIGlmICghZXZlbnQpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgcmVtYXAgPSBuZXcgQnJhbmNoUmVtYXBwaW5nKHRoaXMpLFxuICAgICAgICAgIGNvbGxhcHNpbmcgPSBhbGxvd0NvbGxhcHNpbmc7XG4gICAgICB2YXIgdHIgPSBuZXcgX3RyYW5zZm9ybS5UcmFuc2Zvcm0oZG9jKTtcbiAgICAgIHZhciBpZHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IGV2ZW50Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBpbnZlcnRlZFN0ZXAgPSBldmVudFtpXSxcbiAgICAgICAgICAgIHN0ZXAgPSBpbnZlcnRlZFN0ZXAuc3RlcDtcbiAgICAgICAgaWYgKCFjb2xsYXBzaW5nIHx8IGludmVydGVkU3RlcC52ZXJzaW9uICE9IHJlbWFwLnZlcnNpb24pIHtcbiAgICAgICAgICBjb2xsYXBzaW5nID0gZmFsc2U7XG4gICAgICAgICAgcmVtYXAubW92ZVRvVmVyc2lvbihpbnZlcnRlZFN0ZXAudmVyc2lvbik7XG5cbiAgICAgICAgICBzdGVwID0gc3RlcC5tYXAocmVtYXAucmVtYXApO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBzdGVwICYmIHRyLnN0ZXAoc3RlcCk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgaWRzLnB1c2goaW52ZXJ0ZWRTdGVwLmlkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZE1hcChyZXN1bHQubWFwKSkgdGhpcy5taXJyb3JbdGhpcy52ZXJzaW9uXSA9IGludmVydGVkU3RlcC52ZXJzaW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpID4gMCkgcmVtYXAubW92ZVBhc3RTdGVwKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52ZXJzaW9uLS07XG4gICAgICAgICAgZGVsZXRlIHRoaXMubWlycm9yW3RoaXMudmVyc2lvbl07XG4gICAgICAgICAgdGhpcy5tYXBzLnBvcCgpO1xuICAgICAgICAgIHRyLnN0ZXAoc3RlcCk7XG4gICAgICAgICAgaWRzLnB1c2goaW52ZXJ0ZWRTdGVwLmlkKTtcbiAgICAgICAgICAtLXJlbWFwLnZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVtcHR5KCkpIHRoaXMuY2xlYXIodHJ1ZSk7XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm06IHRyLCBpZHM6IGlkcyB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFZlcnNpb24oKSB7XG4gICAgICByZXR1cm4geyBpZDogdGhpcy5uZXh0U3RlcElELCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmluZFZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZFZlcnNpb24odmVyc2lvbikge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMuZXZlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBfZXZlbnQyID0gdGhpcy5ldmVudHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSBfZXZlbnQyLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBfZXZlbnQyW2pdO1xuICAgICAgICAgIGlmIChzdGVwLmlkID09IHZlcnNpb24uaWQpIHJldHVybiB7IGV2ZW50OiBpLCBzdGVwOiBqIH07ZWxzZSBpZiAoc3RlcC5pZCA8IHZlcnNpb24uaWQpIHJldHVybiB7IGV2ZW50OiBpLCBzdGVwOiBqICsgMSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYmFzZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmVtcHR5KCkpIHJldHVybjtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuXG4gICAgICB2YXIgc3RhcnRWZXJzaW9uID0gdGhpcy52ZXJzaW9uIC0gcG9zaXRpb25zLmxlbmd0aDtcblxuICAgICAgLy8gVXBkYXRlIGFuZCBjbGVhbiB1cCB0aGUgZXZlbnRzXG4gICAgICBvdXQ6IGZvciAodmFyIGkgPSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX2V2ZW50MyA9IHRoaXMuZXZlbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50My5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50M1tqXTtcbiAgICAgICAgICBpZiAoc3RlcC52ZXJzaW9uIDw9IHN0YXJ0VmVyc2lvbikgYnJlYWsgb3V0O1xuICAgICAgICAgIHZhciBvZmYgPSBwb3NpdGlvbnNbc3RlcC52ZXJzaW9uIC0gc3RhcnRWZXJzaW9uIC0gMV07XG4gICAgICAgICAgaWYgKG9mZiA9PSAtMSkge1xuICAgICAgICAgICAgX2V2ZW50My5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGludiA9IHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHNbb2ZmXS5pbnZlcnQocmViYXNlZFRyYW5zZm9ybS5kb2NzW29mZl0sIHJlYmFzZWRUcmFuc2Zvcm0ubWFwc1tvZmZdKTtcbiAgICAgICAgICAgIF9ldmVudDNbal0gPSBuZXcgSW52ZXJ0ZWRTdGVwKGludiwgc3RhcnRWZXJzaW9uICsgbmV3TWFwcy5sZW5ndGggKyBvZmYgKyAxLCBzdGVwLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3luYyB0aGUgYXJyYXkgb2YgbWFwc1xuICAgICAgaWYgKHRoaXMubWFwcy5sZW5ndGggPiBwb3NpdGlvbnMubGVuZ3RoKSB0aGlzLm1hcHMgPSB0aGlzLm1hcHMuc2xpY2UoMCwgdGhpcy5tYXBzLmxlbmd0aCAtIHBvc2l0aW9ucy5sZW5ndGgpLmNvbmNhdChuZXdNYXBzKS5jb25jYXQocmViYXNlZFRyYW5zZm9ybS5tYXBzKTtlbHNlIHRoaXMubWFwcyA9IHJlYmFzZWRUcmFuc2Zvcm0ubWFwcy5zbGljZSgpO1xuXG4gICAgICB0aGlzLnZlcnNpb24gPSBzdGFydFZlcnNpb24gKyBuZXdNYXBzLmxlbmd0aCArIHJlYmFzZWRUcmFuc2Zvcm0ubWFwcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzICs9IG5ld01hcHMubGVuZ3RoICsgcmViYXNlZFRyYW5zZm9ybS5zdGVwcy5sZW5ndGggLSBwb3NpdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhYm9ydENvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0Q29tcHJlc3Npb24oKSB7XG4gICAgICBpZiAodGhpcy5jb21wcmVzc2luZykge1xuICAgICAgICB0aGlzLmNvbXByZXNzaW5nLmFib3J0KCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZWVkc0NvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lZWRzQ29tcHJlc3Npb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGVwc1NpbmNlQ29tcHJlc3MgPiBjb21wcmVzc1N0ZXBDb3VudCAmJiAhdGhpcy5jb21wcmVzc2luZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydENvbXByZXNzaW9uKGRvYykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSBuZXcgQ29tcHJlc3Npb25Xb3JrZXIoZG9jLCB0aGlzLCBmdW5jdGlvbiAobWFwcywgZXZlbnRzKSB7XG4gICAgICAgIF90aGlzMi5tYXBzID0gbWFwcztcbiAgICAgICAgX3RoaXMyLmV2ZW50cyA9IGV2ZW50cztcbiAgICAgICAgX3RoaXMyLm1pcnJvciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIF90aGlzMi5jb21wcmVzc2luZyA9IG51bGw7XG4gICAgICAgIF90aGlzMi5zdGVwc1NpbmNlQ29tcHJlc3MgPSAwO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbXByZXNzaW5nLndvcmsoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQnJhbmNoO1xufSkoKTtcblxudmFyIGNvbXByZXNzRGVsYXkgPSA3NTA7XG5cbnZhciBIaXN0b3J5ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGlzdG9yeShwbSkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhpc3RvcnkpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuXG4gICAgdGhpcy5kb25lID0gbmV3IEJyYW5jaChwbS5vcHRpb25zLmhpc3RvcnlEZXB0aCk7XG4gICAgdGhpcy51bmRvbmUgPSBuZXcgQnJhbmNoKHBtLm9wdGlvbnMuaGlzdG9yeURlcHRoKTtcblxuICAgIHRoaXMubGFzdEFkZGVkQXQgPSAwO1xuICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gZmFsc2U7XG5cbiAgICB0aGlzLmFsbG93Q29sbGFwc2luZyA9IHRydWU7XG5cbiAgICBwbS5vbihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAodHJhbnNmb3JtLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gX3RoaXMzLnJlY29yZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEhpc3RvcnksIFt7XG4gICAga2V5OiBcInJlY29yZFRyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWNvcmRUcmFuc2Zvcm0odHJhbnNmb3JtLCBvcHRpb25zKSB7XG4gICAgICBpZiAodGhpcy5pZ25vcmVUcmFuc2Zvcm0pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbnMuYWRkVG9IaXN0b3J5ID09IGZhbHNlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgbWFwID0gdHJhbnNmb3JtLm1hcHNbaV07XG4gICAgICAgICAgdGhpcy5kb25lLmFkZE1hcChtYXApO1xuICAgICAgICAgIHRoaXMudW5kb25lLmFkZE1hcChtYXApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVuZG9uZS5jbGVhcigpO1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKG5vdyA+IHRoaXMubGFzdEFkZGVkQXQgKyB0aGlzLnBtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkpIHRoaXMuZG9uZS5uZXdFdmVudCgpO1xuXG4gICAgICAgIHRoaXMuZG9uZS5hZGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgdGhpcy5sYXN0QWRkZWRBdCA9IG5vdztcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5kbygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNoaWZ0KHRoaXMuZG9uZSwgdGhpcy51bmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZG8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaGlmdCh0aGlzLnVuZG9uZSwgdGhpcy5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuVW5kb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5VbmRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9uZS5ldmVudHMubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuUmVkb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5SZWRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5kb25lLmV2ZW50cy5sZW5ndGggPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaGlmdChmcm9tLCB0bykge1xuICAgICAgdmFyIGV2ZW50ID0gZnJvbS5wb3BFdmVudCh0aGlzLnBtLmRvYywgdGhpcy5hbGxvd0NvbGxhcHNpbmcpO1xuICAgICAgaWYgKCFldmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IGV2ZW50LnRyYW5zZm9ybTtcbiAgICAgIHZhciBpZHMgPSBldmVudC5pZHM7XG5cbiAgICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gdHJ1ZTtcbiAgICAgIHRoaXMucG0uYXBwbHkodHJhbnNmb3JtKTtcbiAgICAgIHRoaXMuaWdub3JlVHJhbnNmb3JtID0gZmFsc2U7XG5cbiAgICAgIGlmICghdHJhbnNmb3JtLnN0ZXBzLmxlbmd0aCkgcmV0dXJuIHRoaXMuc2hpZnQoZnJvbSwgdG8pO1xuXG4gICAgICBpZiAodG8pIHtcbiAgICAgICAgdG8ubmV3RXZlbnQoKTtcbiAgICAgICAgdG8uYWRkVHJhbnNmb3JtKHRyYW5zZm9ybSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdEFkZGVkQXQgPSAwO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWZXJzaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9uZS5nZXRWZXJzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhY2tUb1ZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmFja1RvVmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmRvbmUuZmluZFZlcnNpb24odmVyc2lvbik7XG4gICAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLmRvbmUuZXZlbnRzW2ZvdW5kLmV2ZW50XTtcbiAgICAgIHZhciBjb21iaW5lZCA9IHRoaXMuZG9uZS5ldmVudHMuc2xpY2UoZm91bmQuZXZlbnQgKyAxKS5yZWR1Y2UoZnVuY3Rpb24gKGNvbWIsIGFycikge1xuICAgICAgICByZXR1cm4gY29tYi5jb25jYXQoYXJyKTtcbiAgICAgIH0sIGV2ZW50LnNsaWNlKGZvdW5kLnN0ZXApKTtcbiAgICAgIHRoaXMuZG9uZS5ldmVudHMubGVuZ3RoID0gZm91bmQuZXZlbnQgKyAoKGV2ZW50Lmxlbmd0aCA9IGZvdW5kLnN0ZXApID8gMSA6IDApO1xuICAgICAgdGhpcy5kb25lLmV2ZW50cy5wdXNoKGNvbWJpbmVkKTtcblxuICAgICAgdGhpcy5zaGlmdCh0aGlzLmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWJhc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKSB7XG4gICAgICB0aGlzLmRvbmUucmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpO1xuICAgICAgdGhpcy51bmRvbmUucmViYXNlZChuZXdNYXBzLCByZWJhc2VkVHJhbnNmb3JtLCBwb3NpdGlvbnMpO1xuICAgICAgdGhpcy5tYXliZVNjaGVkdWxlQ29tcHJlc3Npb24oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1heWJlU2NoZWR1bGVDb21wcmVzc2lvbigpIHtcbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uRm9yQnJhbmNoKHRoaXMuZG9uZSk7XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaCh0aGlzLnVuZG9uZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2goYnJhbmNoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgd2luZG93LmNsZWFyVGltZW91dChicmFuY2guY29tcHJlc3NUaW1lb3V0KTtcbiAgICAgIGlmIChicmFuY2gubmVlZHNDb21wcmVzc2lvbigpKSBicmFuY2guY29tcHJlc3NUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYnJhbmNoLm5lZWRzQ29tcHJlc3Npb24oKSkgYnJhbmNoLnN0YXJ0Q29tcHJlc3Npb24oX3RoaXM0LnBtLmRvYyk7XG4gICAgICB9LCBjb21wcmVzc0RlbGF5KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSGlzdG9yeTtcbn0pKCk7XG5cbmV4cG9ydHMuSGlzdG9yeSA9IEhpc3Rvcnk7IiwiLy8gISEgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUHJvc2VNaXJyb3IgZWRpdG9yLiBJdCBjb250YWluc1xuLy8gZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIGVkaXRpbmcsIHNlbGVjdGlvbiwgYW5kIGludGVncmF0aW9uIHdpdGhcbi8vIHRoZSBicm93c2VyLiBgUHJvc2VNaXJyb3JgIGlzIHRoZSBjbGFzcyB5b3UnbGwgd2FudCB0byBpbnN0YW50aWF0ZVxuLy8gYW5kIGludGVyYWN0IHdpdGggd2hlbiB1c2luZyB0aGUgZWRpdG9yLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9tYWluID0gcmVxdWlyZShcIi4vbWFpblwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvc2VNaXJyb3JcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21haW4uUHJvc2VNaXJyb3I7XG4gIH1cbn0pO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZpbmVPcHRpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wdGlvbnMuZGVmaW5lT3B0aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlZ2lzdHJ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcHRpb25zLlJlZ2lzdHJ5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRSZWdpc3RyeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnk7XG4gIH1cbn0pO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmFuZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3NlbGVjdGlvbi5SYW5nZTtcbiAgfVxufSk7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktleW1hcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5LZXltYXA7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwia2V5TmFtZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5rZXlOYW1lO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImtleU5hbWVzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9rZXlzLmtleU5hbWVzO1xuICB9XG59KTtcblxudmFyIF9yYW5nZSA9IHJlcXVpcmUoXCIuL3JhbmdlXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXJrZWRSYW5nZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcmFuZ2UuTWFya2VkUmFuZ2U7XG4gIH1cbn0pO1xuXG52YXIgX2NvbW1hbmRzID0gcmVxdWlyZShcIi4vY29tbWFuZHNcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmluZUNvbW1hbmRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbW1hbmRzLmRlZmluZUNvbW1hbmQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmaW5lUGFyYW1IYW5kbGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb21tYW5kcy5kZWZpbmVQYXJhbUhhbmRsZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29tbWFuZFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29tbWFuZHMuQ29tbWFuZDtcbiAgfVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kaXNwYXRjaEtleSA9IGRpc3BhdGNoS2V5O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3BhcnNlRG9tID0gcmVxdWlyZShcIi4uL3BhcnNlL2RvbVwiKTtcblxudmFyIF9wYXJzZVRleHQgPSByZXF1aXJlKFwiLi4vcGFyc2UvdGV4dFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZURvbSA9IHJlcXVpcmUoXCIuLi9zZXJpYWxpemUvZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZVRleHQgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL3RleHRcIik7XG5cbnZhciBfcGFyc2UgPSByZXF1aXJlKFwiLi4vcGFyc2VcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbnZhciBfY2FwdHVyZWtleXMgPSByZXF1aXJlKFwiLi9jYXB0dXJla2V5c1wiKTtcblxudmFyIF9kb21jaGFuZ2UgPSByZXF1aXJlKFwiLi9kb21jaGFuZ2VcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG52YXIgc3RvcFNlcSA9IG51bGw7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIERPTSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIGVkaXRvciwgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICogdG8gaW52b2tlIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuICovXG52YXIgaGFuZGxlcnMgPSB7fTtcblxudmFyIElucHV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5wdXQocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0KTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMua2V5U2VxID0gbnVsbDtcblxuICAgIC8vIFdoZW4gdGhlIHVzZXIgaXMgY3JlYXRpbmcgYSBjb21wb3NlZCBjaGFyYWN0ZXIsXG4gICAgLy8gdGhpcyBpcyBzZXQgdG8gYSBDb21wb3NpbmcgaW5zdGFuY2UuXG4gICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgIHRoaXMuc2hpZnRLZXkgPSB0aGlzLnVwZGF0aW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnNraXBJbnB1dCA9IDA7XG5cbiAgICB0aGlzLmRyYWdnaW5nRnJvbSA9IGZhbHNlO1xuXG4gICAgdGhpcy5rZXltYXBzID0gW107XG4gICAgdGhpcy5kZWZhdWx0S2V5bWFwID0gbnVsbDtcblxuICAgIHRoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuXG4gICAgdGhpcy5kcm9wVGFyZ2V0ID0gcG0ud3JhcHBlci5hcHBlbmRDaGlsZCgoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWRyb3AtdGFyZ2V0XCIgfSkpO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gKF9ldmVudCkge1xuICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1tfZXZlbnRdO1xuICAgICAgcG0uY29udGVudC5hZGRFdmVudExpc3RlbmVyKF9ldmVudCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIocG0sIGUpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9ldmVudCBpbiBoYW5kbGVycykge1xuICAgICAgX2xvb3AoX2V2ZW50KTtcbiAgICB9XG5cbiAgICBwbS5vbihcInNlbGVjdGlvbkNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEga2V5IHByZXNzIHRvIHRoZSBpbnRlcm5hbCBrZXltYXBzLCB3aGljaCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0XG4gICAqIERPTSBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtICB7UHJvc2VNaXJyb3J9ICAgcG0gVGhlIGVkaXRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgbmFtZSBUaGUgbmFtZSBvZiB0aGUga2V5IHByZXNzZWQuXG4gICAqIEBwYXJhbSAge0tleWJvYXJkRXZlbnR9IGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBJZiB0aGUga2V5IG5hbWUgaGFzIGEgbWFwcGluZyBhbmQgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgKFwiaGFuZGxlZFwiKSxcbiAgICogICAgICAgICAgICAgICAgICBpZiB0aGUga2V5IG5hbWUgbmVlZHMgdG8gYmUgY29tYmluZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGUgbmV4dCBrZXkgKFwibXVsdGlcIiksXG4gICAqICAgICAgICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gbWFwcGluZyAoXCJub3RoaW5nXCIpLlxuICAgKi9cblxuICBfY3JlYXRlQ2xhc3MoSW5wdXQsIFt7XG4gICAga2V5OiBcIm1heWJlQWJvcnRDb21wb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZUFib3J0Q29tcG9zaXRpb24oKSB7XG4gICAgICBpZiAodGhpcy5jb21wb3NpbmcgJiYgIXRoaXMudXBkYXRpbmdDb21wb3NpdGlvbikge1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcuZmluaXNoZWQpIHtcbiAgICAgICAgICBmaW5pc2hDb21wb3NpbmcodGhpcy5wbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVG9nZ2xlIHNlbGVjdGlvbiB0byBmb3JjZSBlbmQgb2YgY29tcG9zaXRpb25cbiAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5za2lwSW5wdXQrKztcbiAgICAgICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnB1dDtcbn0pKCk7XG5cbmV4cG9ydHMuSW5wdXQgPSBJbnB1dDtcblxuZnVuY3Rpb24gZGlzcGF0Y2hLZXkocG0sIG5hbWUsIGUpIHtcbiAgdmFyIHNlcSA9IHBtLmlucHV0LmtleVNlcTtcbiAgLy8gSWYgdGhlIHByZXZpb3VzIGtleSBzaG91bGQgYmUgdXNlZCBpbiBzZXF1ZW5jZSB3aXRoIHRoaXMgb25lLCBtb2RpZnkgdGhlIG5hbWUgYWNjb3JkaW5nbHkuXG4gIGlmIChzZXEpIHtcbiAgICBpZiAoKDAsIF9rZXlzLmlzTW9kaWZpZXJLZXkpKG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoc3RvcFNlcSk7XG4gICAgc3RvcFNlcSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBtLmlucHV0LmtleVNlcSA9PSBzZXEpIHBtLmlucHV0LmtleVNlcSA9IG51bGw7XG4gICAgfSwgNTApO1xuICAgIG5hbWUgPSBzZXEgKyBcIiBcIiArIG5hbWU7XG4gIH1cblxuICB2YXIgaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKGJvdW5kKSB7XG4gICAgaWYgKGJvdW5kID09PSBmYWxzZSkgcmV0dXJuIFwibm90aGluZ1wiO1xuICAgIGlmIChib3VuZCA9PSBcIi4uLlwiKSByZXR1cm4gXCJtdWx0aVwiO1xuICAgIGlmIChib3VuZCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmQpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgcmVzdWx0ID09PSBmYWxzZSAmJiBpIDwgYm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gaGFuZGxlKGJvdW5kW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib3VuZCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXN1bHQgPSBwbS5leGVjQ29tbWFuZChib3VuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGJvdW5kKHBtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCA9PSBmYWxzZSA/IGZhbHNlIDogXCJoYW5kbGVkXCI7XG4gIH07XG5cbiAgdmFyIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgZm9yICh2YXIgaSA9IDA7ICFyZXN1bHQgJiYgaSA8IHBtLmlucHV0LmtleW1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHQgPSBoYW5kbGUocG0uaW5wdXQua2V5bWFwc1tpXS5tYXAubG9va3VwKG5hbWUsIHBtKSk7XG4gIH1pZiAoIXJlc3VsdCkgcmVzdWx0ID0gaGFuZGxlKHBtLmJhc2VLZXltYXAubG9va3VwKG5hbWUsIHBtKSkgfHwgaGFuZGxlKF9jYXB0dXJla2V5cy5jYXB0dXJlS2V5cy5sb29rdXAobmFtZSkpO1xuXG4gIC8vIElmIHRoZSBrZXkgc2hvdWxkIGJlIHVzZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGUgbmV4dCBrZXksIHN0b3JlIHRoZSBrZXluYW1lIGludGVybmFsbHkuXG4gIGlmIChyZXN1bHQgPT0gXCJtdWx0aVwiKSBwbS5pbnB1dC5rZXlTZXEgPSBuYW1lO1xuXG4gIGlmIChyZXN1bHQgPT0gXCJoYW5kbGVkXCIgfHwgcmVzdWx0ID09IFwibXVsdGlcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGlmIChzZXEgJiYgIXJlc3VsdCAmJiAvXFwnJC8udGVzdChuYW1lKSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gISFyZXN1bHQ7XG59XG5cbmhhbmRsZXJzLmtleWRvd24gPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKGUua2V5Q29kZSA9PSAxNikgcG0uaW5wdXQuc2hpZnRLZXkgPSB0cnVlO1xuICBpZiAocG0uaW5wdXQuY29tcG9zaW5nKSByZXR1cm47XG4gIHZhciBuYW1lID0gKDAsIF9rZXlzLmtleU5hbWUpKGUpO1xuICBpZiAobmFtZSAmJiBkaXNwYXRjaEtleShwbSwgbmFtZSwgZSkpIHJldHVybjtcbiAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbn07XG5cbmhhbmRsZXJzLmtleXVwID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT0gMTYpIHBtLmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBpbnB1dFRleHQocG0sIHJhbmdlLCB0ZXh0KSB7XG4gIGlmIChyYW5nZS5lbXB0eSAmJiAhdGV4dCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbWFya3MgPSBwbS5pbnB1dC5zdG9yZWRNYXJrcyB8fCBwbS5kb2MubWFya3NBdChyYW5nZS5mcm9tKTtcbiAgdmFyIHRyID0gcG0udHI7XG4gIHRyLnJlcGxhY2VXaXRoKHJhbmdlLmZyb20sIHJhbmdlLnRvLCBwbS5zY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpLmFwcGx5KCk7XG4gIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyN0ZXh0SW5wdXRcbiAgLy8gRmlyZWQgd2hlbiB0aGUgdXNlciB0eXBlcyB0ZXh0IGludG8gdGhlIGVkaXRvci5cbiAgcG0uc2lnbmFsKFwidGV4dElucHV0XCIsIHRleHQpO1xufVxuXG5oYW5kbGVycy5rZXlwcmVzcyA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAocG0uaW5wdXQuY29tcG9zaW5nIHx8ICFlLmNoYXJDb2RlIHx8IGUuY3RybEtleSAmJiAhZS5hbHRLZXkgfHwgX2RvbS5icm93c2VyLm1hYyAmJiBlLm1ldGFLZXkpIHJldHVybjtcbiAgdmFyIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShlLmNoYXJDb2RlKTtcbiAgaWYgKGRpc3BhdGNoS2V5KHBtLCBcIidcIiArIGNoICsgXCInXCIsIGUpKSByZXR1cm47XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIGlmIChzZWwubm9kZSAmJiBzZWwubm9kZS5jb250YWlucyA9PSBudWxsKSB7XG4gICAgcG0udHJbXCJkZWxldGVcIl0oc2VsLmZyb20sIHNlbC50bykuYXBwbHkoKTtcbiAgICBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIH1cbiAgaW5wdXRUZXh0KHBtLCBzZWwsIGNoKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufTtcblxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUocG0sIGUpIHtcbiAgdmFyIHBvcyA9ICgwLCBfc2VsZWN0aW9uLnNlbGVjdGFibGVOb2RlQWJvdmUpKHBtLCBlLnRhcmdldCwgeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0sIHRydWUpO1xuICBpZiAoIXBvcykgcmV0dXJuIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG5cbiAgdmFyIF9wbSRzZWxlY3Rpb24gPSBwbS5zZWxlY3Rpb247XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbi5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24uZnJvbTtcblxuICBpZiAobm9kZSAmJiBwb3MuZGVwdGggPj0gZnJvbS5kZXB0aCAmJiBwb3Muc2hvcnRlbihmcm9tLmRlcHRoKS5jbXAoZnJvbSkgPT0gMCkge1xuICAgIGlmIChmcm9tLmRlcHRoID09IDApIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuICAgIHBvcyA9IGZyb20uc2hvcnRlbigpO1xuICB9XG5cbiAgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb3MpO1xuICBwbS5mb2N1cygpO1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5cbnZhciBsYXN0Q2xpY2sgPSAwO1xuXG5oYW5kbGVycy5tb3VzZWRvd24gPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKGUuY3RybEtleSkgcmV0dXJuIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKTtcblxuICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpLFxuICAgICAgbXVsdGkgPSBub3cgLSBsYXN0Q2xpY2sgPCA1MDA7XG4gIGxhc3RDbGljayA9IG5vdztcbiAgaWYgKHBtLmlucHV0LnNoaWZ0S2V5IHx8IG11bHRpKSByZXR1cm47XG5cbiAgdmFyIHggPSBlLmNsaWVudFgsXG4gICAgICB5ID0gZS5jbGllbnRZLFxuICAgICAgbW92ZWQgPSBmYWxzZTtcbiAgdmFyIHVwID0gZnVuY3Rpb24gdXAoKSB7XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdXApO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gICAgaWYgKCgwLCBfc2VsZWN0aW9uLmhhbmRsZU5vZGVDbGljaykocG0sIGUpKSByZXR1cm47XG5cbiAgICB2YXIgcG9zID0gIW1vdmVkICYmICgwLCBfc2VsZWN0aW9uLnNlbGVjdGFibGVOb2RlQWJvdmUpKHBtLCBlLnRhcmdldCwgeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICAgIGlmIChwb3MpIHtcbiAgICAgIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9zKTtcbiAgICAgIHBtLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgbW92ZSA9IGZ1bmN0aW9uIG1vdmUoZSkge1xuICAgIGlmICghbW92ZWQgJiYgKE1hdGguYWJzKHggLSBlLmNsaWVudFgpID4gNCB8fCBNYXRoLmFicyh5IC0gZS5jbGllbnRZKSA+IDQpKSBtb3ZlZCA9IHRydWU7XG4gICAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbiAgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdXApO1xuICBhZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xufTtcblxuaGFuZGxlcnMudG91Y2hkb3duID0gZnVuY3Rpb24gKHBtKSB7XG4gIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG59O1xuXG4vKipcbiAqIEEgY2xhc3MgdG8gdHJhY2sgc3RhdGUgd2hpbGUgY3JlYXRpbmcgYSBjb21wb3NlZCBjaGFyYWN0ZXIuXG4gKi9cblxudmFyIENvbXBvc2luZyA9IGZ1bmN0aW9uIENvbXBvc2luZyhwbSwgZGF0YSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcG9zaW5nKTtcblxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gIHRoaXMuY29udGV4dCA9ICgwLCBfZG9tY2hhbmdlLnRleHRDb250ZXh0KShkYXRhKTtcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5lbmREYXRhID0gbnVsbDtcbiAgdmFyIHJhbmdlID0gcG0uc2VsZWN0aW9uO1xuICBpZiAoZGF0YSkge1xuICAgIHZhciBwYXRoID0gcmFuZ2UuaGVhZC5wYXRoLFxuICAgICAgICBsaW5lID0gcG0uZG9jLnBhdGgocGF0aCkudGV4dENvbnRlbnQ7XG4gICAgdmFyIGZvdW5kID0gbGluZS5pbmRleE9mKGRhdGEsIHJhbmdlLmhlYWQub2Zmc2V0IC0gZGF0YS5sZW5ndGgpO1xuICAgIGlmIChmb3VuZCA+IC0xICYmIGZvdW5kIDw9IHJhbmdlLmhlYWQub2Zmc2V0ICsgZGF0YS5sZW5ndGgpIHJhbmdlID0gbmV3IF9zZWxlY3Rpb24uVGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBmb3VuZCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGZvdW5kICsgZGF0YS5sZW5ndGgpKTtcbiAgfVxuICB0aGlzLnJhbmdlID0gcmFuZ2U7XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChwbS5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKSkgcmV0dXJuO1xuXG4gIHBtLmZsdXNoKCk7XG4gIHBtLmlucHV0LmNvbXBvc2luZyA9IG5ldyBDb21wb3NpbmcocG0sIGUuZGF0YSk7XG4gIHZhciBhYm92ZSA9IHBtLnNlbGVjdGlvbi5oZWFkLnNob3J0ZW4oKTtcbiAgcG0ubWFya1JhbmdlRGlydHkoeyBmcm9tOiBhYm92ZSwgdG86IGFib3ZlLm1vdmUoMSkgfSk7XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbnVwZGF0ZSA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgaWYgKGluZm8gJiYgaW5mby5kYXRhICE9IGUuZGF0YSkge1xuICAgIGluZm8uZGF0YSA9IGUuZGF0YTtcbiAgICBwbS5pbnB1dC51cGRhdGluZ0NvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICBpbnB1dFRleHQocG0sIGluZm8ucmFuZ2UsIGluZm8uZGF0YSk7XG4gICAgcG0uaW5wdXQudXBkYXRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgIGluZm8ucmFuZ2UgPSBuZXcgX3NlbGVjdGlvbi5UZXh0U2VsZWN0aW9uKGluZm8ucmFuZ2UuZnJvbSwgaW5mby5yYW5nZS5mcm9tLm1vdmUoaW5mby5kYXRhLmxlbmd0aCkpO1xuICB9XG59O1xuXG5oYW5kbGVycy5jb21wb3NpdGlvbmVuZCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgaWYgKGluZm8pIHtcbiAgICBwbS5pbnB1dC5jb21wb3NpbmcuZmluaXNoZWQgPSB0cnVlO1xuICAgIHBtLmlucHV0LmNvbXBvc2luZy5lbmREYXRhID0gZS5kYXRhO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBtLmlucHV0LmNvbXBvc2luZyA9PSBpbmZvKSBmaW5pc2hDb21wb3NpbmcocG0pO1xuICAgIH0sIDIwKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluaXNoQ29tcG9zaW5nKHBtKSB7XG4gIHZhciBpbmZvID0gcG0uaW5wdXQuY29tcG9zaW5nO1xuICB2YXIgdGV4dCA9ICgwLCBfZG9tY2hhbmdlLnRleHRJbkNvbnRleHQpKGluZm8uY29udGV4dCwgaW5mby5lbmREYXRhKTtcbiAgdmFyIHJhbmdlID0gKDAsIF9zZWxlY3Rpb24ucmFuZ2VGcm9tRE9NTG9vc2UpKHBtKTtcbiAgcG0uZW5zdXJlT3BlcmF0aW9uKCk7XG4gIHBtLmlucHV0LmNvbXBvc2luZyA9IG51bGw7XG4gIGlmICh0ZXh0ICE9IGluZm8uZGF0YSkgaW5wdXRUZXh0KHBtLCBpbmZvLnJhbmdlLCB0ZXh0KTtcbiAgaWYgKHJhbmdlICYmICFyYW5nZS5lcShwbS5zZWwucmFuZ2UpKSBwbS5zZXRTZWxlY3Rpb25EaXJlY3QocmFuZ2UpO1xufVxuXG5oYW5kbGVycy5pbnB1dCA9IGZ1bmN0aW9uIChwbSkge1xuICBpZiAocG0uaW5wdXQuc2tpcElucHV0KSByZXR1cm4gLS1wbS5pbnB1dC5za2lwSW5wdXQ7XG5cbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZykge1xuICAgIGlmIChwbS5pbnB1dC5jb21wb3NpbmcuZmluaXNoZWQpIGZpbmlzaENvbXBvc2luZyhwbSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG0uc2VsLnN0b3BQb2xsaW5nRm9yVXBkYXRlKCk7XG4gICgwLCBfZG9tY2hhbmdlLmFwcGx5RE9NQ2hhbmdlKShwbSk7XG4gIHBtLnNjcm9sbEludG9WaWV3KCk7XG59O1xuXG52YXIgbGFzdENvcGllZCA9IG51bGw7XG5cbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIF9wbSRzZWxlY3Rpb24yID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yLnRvO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMi5lbXB0eTtcblxuICBpZiAoZW1wdHkpIHJldHVybjtcbiAgdmFyIGZyYWdtZW50ID0gcG0uc2VsZWN0ZWREb2M7XG4gIGxhc3RDb3BpZWQgPSB7IGRvYzogcG0uZG9jLCBmcm9tOiBmcm9tLCB0bzogdG8sXG4gICAgaHRtbDogKDAsIF9zZXJpYWxpemVEb20udG9IVE1MKShmcmFnbWVudCksXG4gICAgdGV4dDogKDAsIF9zZXJpYWxpemVUZXh0LnRvVGV4dCkoZnJhZ21lbnQpIH07XG5cbiAgaWYgKGUuY2xpcGJvYXJkRGF0YSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLmNsaXBib2FyZERhdGEuY2xlYXJEYXRhKCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgbGFzdENvcGllZC5odG1sKTtcbiAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgbGFzdENvcGllZC50ZXh0KTtcbiAgICBpZiAoZS50eXBlID09IFwiY3V0XCIgJiYgIWVtcHR5KSBwbS50cltcImRlbGV0ZVwiXShmcm9tLCB0bykuYXBwbHkoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMucGFzdGUgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKCFlLmNsaXBib2FyZERhdGEpIHJldHVybjtcbiAgdmFyIHNlbCA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIHR4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgdmFyIGh0bWwgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKTtcbiAgaWYgKGh0bWwgfHwgdHh0KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBkb2MgPSB1bmRlZmluZWQsXG4gICAgICAgIGZyb20gPSB1bmRlZmluZWQsXG4gICAgICAgIHRvID0gdW5kZWZpbmVkO1xuICAgIGlmIChwbS5pbnB1dC5zaGlmdEtleSAmJiB0eHQpIHtcbiAgICAgIGRvYyA9ICgwLCBfcGFyc2VUZXh0LmZyb21UZXh0KShwbS5zY2hlbWEsIHR4dCk7XG4gICAgfSBlbHNlIGlmIChsYXN0Q29waWVkICYmIChsYXN0Q29waWVkLmh0bWwgPT0gaHRtbCB8fCBsYXN0Q29waWVkLnRleHQgPT0gdHh0KSkge1xuICAgICAgO3ZhciBfbGFzdENvcGllZCA9IGxhc3RDb3BpZWQ7XG4gICAgICBkb2MgPSBfbGFzdENvcGllZC5kb2M7XG4gICAgICBmcm9tID0gX2xhc3RDb3BpZWQuZnJvbTtcbiAgICAgIHRvID0gX2xhc3RDb3BpZWQudG87XG4gICAgfSBlbHNlIGlmIChodG1sKSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlRG9tLmZyb21IVE1MKShwbS5zY2hlbWEsIGh0bWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlLnBhcnNlRnJvbSkocG0uc2NoZW1hLCB0eHQsICgwLCBfcGFyc2Uua25vd25Tb3VyY2UpKFwibWFya2Rvd25cIikgPyBcIm1hcmtkb3duXCIgOiBcInRleHRcIik7XG4gICAgfVxuICAgIHBtLnRyLnJlcGxhY2Uoc2VsLmZyb20sIHNlbC50bywgZG9jLCBmcm9tIHx8ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25BdFN0YXJ0KShkb2MpLmZyb20sIHRvIHx8ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25BdEVuZCkoZG9jKS50bykuYXBwbHkoKTtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO1xuICB9XG59O1xuXG5oYW5kbGVycy5kcmFnc3RhcnQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKCFlLmRhdGFUcmFuc2ZlcikgcmV0dXJuO1xuXG4gIHZhciBmcmFnbWVudCA9IHBtLnNlbGVjdGVkRG9jO1xuXG4gIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgKDAsIF9zZXJpYWxpemVEb20udG9IVE1MKShmcmFnbWVudCkpO1xuICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9wbGFpblwiLCAoMCwgX3NlcmlhbGl6ZVRleHQudG9UZXh0KShmcmFnbWVudCkpO1xuICBwbS5pbnB1dC5kcmFnZ2luZ0Zyb20gPSB0cnVlO1xufTtcblxuaGFuZGxlcnMuZHJhZ2VuZCA9IGZ1bmN0aW9uIChwbSkge1xuICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwbS5pbnB1dC5kcmFnZ2luRnJvbSA9IGZhbHNlO1xuICB9LCA1MCk7XG59O1xuXG5oYW5kbGVycy5kcmFnb3ZlciA9IGhhbmRsZXJzLmRyYWdlbnRlciA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHZhciBjdXJzb3JQb3MgPSBwbS5wb3NBdENvb3Jkcyh7IGxlZnQ6IGUuY2xpZW50WCwgdG9wOiBlLmNsaWVudFkgfSk7XG4gIGlmICghY3Vyc29yUG9zKSByZXR1cm47XG4gIHZhciBjb29yZHMgPSAoMCwgX3NlbGVjdGlvbi5jb29yZHNBdFBvcykocG0sIGN1cnNvclBvcyk7XG4gIHZhciByZWN0ID0gcG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29vcmRzLnRvcCAtPSByZWN0LnRvcDtcbiAgY29vcmRzLnJpZ2h0IC09IHJlY3QubGVmdDtcbiAgY29vcmRzLmJvdHRvbSAtPSByZWN0LnRvcDtcbiAgY29vcmRzLmxlZnQgLT0gcmVjdC5sZWZ0O1xuICB2YXIgdGFyZ2V0ID0gcG0uaW5wdXQuZHJvcFRhcmdldDtcbiAgdGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gIHRhcmdldC5zdHlsZS5sZWZ0ID0gY29vcmRzLmxlZnQgLSAxICsgXCJweFwiO1xuICB0YXJnZXQuc3R5bGUudG9wID0gY29vcmRzLnRvcCArIFwicHhcIjtcbiAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGNvb3Jkcy5ib3R0b20gLSBjb29yZHMudG9wICsgXCJweFwiO1xufTtcblxuaGFuZGxlcnMuZHJhZ2xlYXZlID0gZnVuY3Rpb24gKHBtKSB7XG4gIHJldHVybiBwbS5pbnB1dC5kcm9wVGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xufTtcblxuaGFuZGxlcnMuZHJvcCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBwbS5pbnB1dC5kcm9wVGFyZ2V0LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXG4gIGlmICghZS5kYXRhVHJhbnNmZXIpIHJldHVybjtcblxuICB2YXIgaHRtbCA9IHVuZGVmaW5lZCxcbiAgICAgIHR4dCA9IHVuZGVmaW5lZCxcbiAgICAgIGRvYyA9IHVuZGVmaW5lZDtcbiAgaWYgKGh0bWwgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9odG1sXCIpKSBkb2MgPSAoMCwgX3BhcnNlRG9tLmZyb21IVE1MKShwbS5zY2hlbWEsIGh0bWwsIHsgZG9jdW1lbnQ6IGRvY3VtZW50IH0pO2Vsc2UgaWYgKHR4dCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpKSBkb2MgPSAoMCwgX3BhcnNlLnBhcnNlRnJvbSkocG0uc2NoZW1hLCB0eHQsICgwLCBfcGFyc2Uua25vd25Tb3VyY2UpKFwibWFya2Rvd25cIikgPyBcIm1hcmtkb3duXCIgOiBcInRleHRcIik7XG5cbiAgaWYgKGRvYykge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgaW5zZXJ0UG9zID0gcG0ucG9zQXRDb29yZHMoeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICAgIGlmICghaW5zZXJ0UG9zKSByZXR1cm47XG4gICAgdmFyIHRyID0gcG0udHI7XG4gICAgaWYgKHBtLmlucHV0LmRyYWdnaW5nRnJvbSAmJiAhZS5jdHJsS2V5KSB7XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgIGluc2VydFBvcyA9IHRyLm1hcChpbnNlcnRQb3MpLnBvcztcbiAgICB9XG4gICAgdHIucmVwbGFjZShpbnNlcnRQb3MsIGluc2VydFBvcywgZG9jLCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKS5mcm9tLCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRFbmQpKGRvYykudG8pLmFwcGx5KCk7XG4gICAgcG0uc2V0VGV4dFNlbGVjdGlvbihpbnNlcnRQb3MsIHRyLm1hcChpbnNlcnRQb3MpLnBvcyk7XG4gICAgcG0uZm9jdXMoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuZm9jdXMgPSBmdW5jdGlvbiAocG0pIHtcbiAgKDAsIF9kb20uYWRkQ2xhc3MpKHBtLndyYXBwZXIsIFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZvY3VzXG4gIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBnYWlucyBmb2N1cy5cbiAgcG0uc2lnbmFsKFwiZm9jdXNcIik7XG59O1xuXG5oYW5kbGVycy5ibHVyID0gZnVuY3Rpb24gKHBtKSB7XG4gICgwLCBfZG9tLnJtQ2xhc3MpKHBtLndyYXBwZXIsIFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2JsdXJcbiAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGxvc2VzIGZvY3VzLlxuICBwbS5zaWduYWwoXCJibHVyXCIpO1xufTsiLCIvLyBGcm9tIENvZGVNaXJyb3IsIHNob3VsZCBiZSBmYWN0b3JlZCBpbnRvIGl0cyBvd24gTlBNIG1vZHVsZVxuXG4vLyBkZWNsYXJlX2dsb2JhbDogbmF2aWdhdG9yXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLmtleU5hbWUgPSBrZXlOYW1lO1xuZXhwb3J0cy5pc01vZGlmaWVyS2V5ID0gaXNNb2RpZmllcktleTtcbmV4cG9ydHMubm9ybWFsaXplS2V5TmFtZSA9IG5vcm1hbGl6ZUtleU5hbWU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgOiBmYWxzZTtcblxuLy8gOjogT2JqZWN0PHN0cmluZz5cbi8vIEEgbWFwIGZyb20ga2V5IGNvZGVzIHRvIGtleSBuYW1lcy5cbnZhciBrZXlOYW1lcyA9IHtcbiAgMzogXCJFbnRlclwiLCA4OiBcIkJhY2tzcGFjZVwiLCA5OiBcIlRhYlwiLCAxMzogXCJFbnRlclwiLCAxNjogXCJTaGlmdFwiLCAxNzogXCJDdHJsXCIsIDE4OiBcIkFsdFwiLFxuICAxOTogXCJQYXVzZVwiLCAyMDogXCJDYXBzTG9ja1wiLCAyNzogXCJFc2NcIiwgMzI6IFwiU3BhY2VcIiwgMzM6IFwiUGFnZVVwXCIsIDM0OiBcIlBhZ2VEb3duXCIsIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsIDM3OiBcIkxlZnRcIiwgMzg6IFwiVXBcIiwgMzk6IFwiUmlnaHRcIiwgNDA6IFwiRG93blwiLCA0NDogXCJQcmludFNjcm5cIiwgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLCA1OTogXCI7XCIsIDYxOiBcIj1cIiwgOTE6IFwiTW9kXCIsIDkyOiBcIk1vZFwiLCA5MzogXCJNb2RcIixcbiAgMTA2OiBcIipcIiwgMTA3OiBcIj1cIiwgMTA5OiBcIi1cIiwgMTEwOiBcIi5cIiwgMTExOiBcIi9cIiwgMTI3OiBcIkRlbGV0ZVwiLFxuICAxNzM6IFwiLVwiLCAxODY6IFwiO1wiLCAxODc6IFwiPVwiLCAxODg6IFwiLFwiLCAxODk6IFwiLVwiLCAxOTA6IFwiLlwiLCAxOTE6IFwiL1wiLCAxOTI6IFwiYFwiLCAyMTk6IFwiW1wiLCAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLCAyMjI6IFwiJ1wiLCA2MzIzMjogXCJVcFwiLCA2MzIzMzogXCJEb3duXCIsIDYzMjM0OiBcIkxlZnRcIiwgNjMyMzU6IFwiUmlnaHRcIiwgNjMyNzI6IFwiRGVsZXRlXCIsXG4gIDYzMjczOiBcIkhvbWVcIiwgNjMyNzU6IFwiRW5kXCIsIDYzMjc2OiBcIlBhZ2VVcFwiLCA2MzI3NzogXCJQYWdlRG93blwiLCA2MzMwMjogXCJJbnNlcnRcIlxufTtcblxuZXhwb3J0cy5rZXlOYW1lcyA9IGtleU5hbWVzO1xuLy8gTnVtYmVyIGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICBrZXlOYW1lc1tpICsgNDhdID0ga2V5TmFtZXNbaSArIDk2XSA9IFN0cmluZyhpKTtcbn0gLy8gQWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBrZXlOYW1lc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG59IC8vIEZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAga2V5TmFtZXNbaSArIDExMV0gPSBrZXlOYW1lc1tpICsgNjMyMzVdID0gXCJGXCIgKyBpO1xufSAvLyA6OiAoS2V5Ym9hcmRFdmVudCkg4oaSID9zdHJpbmdcbi8vIEZpbmQgYSBuYW1lIGZvciB0aGUgZ2l2ZW4ga2V5ZG93biBldmVudC4gSWYgdGhlIGtleWNvZGUgaW4gdGhlXG4vLyBldmVudCBpcyBub3Qga25vd24sIHRoaXMgd2lsbCByZXR1cm4gYG51bGxgLiBPdGhlcndpc2UsIGl0IHdpbGxcbi8vIHJldHVybiBhIHN0cmluZyBsaWtlIGBcIlNoaWZ0LUNtZC1DdHJsLUFsdC1Ib21lXCJgLiBUaGUgcGFydHMgYmVmb3JlXG4vLyB0aGUgZGFzaGVzIGdpdmUgdGhlIG1vZGlmaWVycyAoYWx3YXlzIGluIHRoYXQgb3JkZXIsIGlmIHByZXNlbnQpLFxuLy8gYW5kIHRoZSBsYXN0IHdvcmQgZ2l2ZXMgdGhlIGtleSBuYW1lLCB3aGljaCBvbmUgb2YgdGhlIG5hbWVzIGluXG4vLyBga2V5TmFtZXNgLlxuLy9cbi8vIFRoZSBjb252ZW50aW9uIGZvciBrZXlwcmVzcyBldmVudHMgaXMgdG8gdXNlIHRoZSBwcmVzc2VkIGNoYXJhY3RlclxuLy8gYmV0d2VlbiBzaW5nbGUgcXVvdGVzLiBEdWUgdG8gbGltaXRhdGlvbnMgaW4gdGhlIGJyb3dzZXIgQVBJLFxuLy8ga2V5cHJlc3MgZXZlbnRzIGNhbiBub3QgaGF2ZSBtb2RpZmllcnMuXG5cbmZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgdmFyIGJhc2UgPSBrZXlOYW1lc1tldmVudC5rZXlDb2RlXSxcbiAgICAgIG5hbWUgPSBiYXNlO1xuICBpZiAobmFtZSA9PSBudWxsIHx8IGV2ZW50LmFsdEdyYXBoS2V5KSByZXR1cm4gbnVsbDtcblxuICBpZiAoZXZlbnQuYWx0S2V5ICYmIGJhc2UgIT0gXCJBbHRcIikgbmFtZSA9IFwiQWx0LVwiICsgbmFtZTtcbiAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgYmFzZSAhPSBcIkN0cmxcIikgbmFtZSA9IFwiQ3RybC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5tZXRhS2V5ICYmIGJhc2UgIT0gXCJDbWRcIikgbmFtZSA9IFwiQ21kLVwiICsgbmFtZTtcbiAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGJhc2UgIT0gXCJTaGlmdFwiKSBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLyA6OiAoc3RyaW5nKSDihpIgYm9vbFxuLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBrZXkgbmFtZSByZWZlcnMgdG8gYSBtb2RpZmllciBrZXkuXG5cbmZ1bmN0aW9uIGlzTW9kaWZpZXJLZXkobmFtZSkge1xuICBuYW1lID0gL1teLV0qJC8uZXhlYyhuYW1lKVswXTtcbiAgcmV0dXJuIG5hbWUgPT0gXCJDdHJsXCIgfHwgbmFtZSA9PSBcIkFsdFwiIHx8IG5hbWUgPT0gXCJTaGlmdFwiIHx8IG5hbWUgPT0gXCJNb2RcIjtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIHN0cmluZ1xuLy8gTm9ybWFsaXplIGEgc2xvcHB5IGtleSBuYW1lLCB3aGljaCBtYXkgaGF2ZSBtb2RpZmllcnMgaW4gdGhlIHdyb25nXG4vLyBvcmRlciBvciB1c2Ugc2hvcnRoYW5kcyBmb3IgbW9kaWZpZXJzLCB0byBhIHByb3Blcmx5IGZvcm1lZCBrZXlcbi8vIG5hbWUuIFVzZWQgdG8gbm9ybWFsaXplIG5hbWVzIHByb3ZpZGVkIGluIGtleW1hcHMuXG4vL1xuLy8gTm90ZSB0aGF0IHRoZSBtb2RpZmllciBgbW9kYCBpcyBhIHNob3J0aGFuZCBmb3IgYENtZGAgb24gTWFjLCBhbmRcbi8vIGBDdHJsYCBvbiBvdGhlciBwbGF0Zm9ybXMuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJz8kKS8pLFxuICAgICAgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gIHZhciBhbHQgPSB1bmRlZmluZWQsXG4gICAgICBjdHJsID0gdW5kZWZpbmVkLFxuICAgICAgc2hpZnQgPSB1bmRlZmluZWQsXG4gICAgICBjbWQgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgdmFyIG1vZCA9IHBhcnRzW2ldO1xuICAgIGlmICgvXihjbWR8bWV0YXxtKSQvaS50ZXN0KG1vZCkpIGNtZCA9IHRydWU7ZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSBhbHQgPSB0cnVlO2Vsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpIGN0cmwgPSB0cnVlO2Vsc2UgaWYgKC9ecyhoaWZ0KSQvaS50ZXN0KG1vZCkpIHNoaWZ0ID0gdHJ1ZTtlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgIGlmIChtYWMpIGNtZCA9IHRydWU7ZWxzZSBjdHJsID0gdHJ1ZTtcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgfVxuICBpZiAoYWx0KSByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgaWYgKGN0cmwpIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgaWYgKGNtZCkgcmVzdWx0ID0gXCJDbWQtXCIgKyByZXN1bHQ7XG4gIGlmIChzaGlmdCkgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gOzsgQSBrZXltYXAgYmluZHMgYSBzZXQgb2YgW2tleSBuYW1lc10oI2tleU5hbWUpIHRvIGNvbW1hbmRzIG5hbWVzXG4vLyBvciBmdW5jdGlvbnMuXG5cbnZhciBLZXltYXAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0LCA/T2JqZWN0KVxuICAvLyBDb25zdHJ1Y3QgYSBrZXltYXAgdXNpbmcgdGhlIGJpbmRpbmdzIGluIGBrZXlzYCwgd2hvc2UgcHJvcGVydGllc1xuICAvLyBzaG91bGQgYmUgW2tleSBuYW1lc10oI2tleU5hbWUpIG9yIHNwYWNlLXNlcGFyYXRlZCBzZXF1ZW5jZXMgb2ZcbiAgLy8ga2V5IG5hbWVzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBiaW5kaW5nIHdpbGwgYmUgZm9yIGFcbiAgLy8gbXVsdGktc3Ryb2tlIGtleSBjb21iaW5hdGlvbi5cbiAgLy9cbiAgLy8gV2hlbiBgb3B0aW9uc2AgaGFzIGEgcHJvcGVydHkgYGNhbGxgLCB0aGlzIHdpbGwgYmUgYSBwcm9ncmFtbWF0aWNcbiAgLy8ga2V5bWFwLCBtZWFuaW5nIHRoYXQgaW5zdGVhZCBvZiBsb29raW5nIGtleXMgdXAgaW4gaXRzIHNldCBvZlxuICAvLyBiaW5kaW5ncywgaXQgd2lsbCBwYXNzIHRoZSBrZXkgbmFtZSB0byBgb3B0aW9ucy5jYWxsYCwgYW5kIHVzZVxuICAvLyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoYXQgY2FsbHMgYXMgdGhlIHJlc29sdmVkIGJpbmRpbmcuXG4gIC8vXG4gIC8vIGBvcHRpb25zLm5hbWVgIGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIGtleW1hcCBhIG5hbWUsIG1ha2luZyBpdFxuICAvLyBlYXNpZXIgdG8gW3JlbW92ZV0oI1Byb3NlTWlycm9yLnJlbW92ZUtleW1hcCkgZnJvbSBhbiBlZGl0b3IuXG5cbiAgZnVuY3Rpb24gS2V5bWFwKGtleXMsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgS2V5bWFwKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5iaW5kaW5ncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGtleXMpIGZvciAodmFyIGtleW5hbWUgaW4ga2V5cykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrZXlzLCBrZXluYW1lKSkgdGhpcy5hZGRCaW5kaW5nKGtleW5hbWUsIGtleXNba2V5bmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSlcbiAgLy8gQWRkIGEgYmluZGluZyBmb3IgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UuXG5cbiAgX2NyZWF0ZUNsYXNzKEtleW1hcCwgW3tcbiAgICBrZXk6IFwiYWRkQmluZGluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRCaW5kaW5nKGtleW5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIga2V5cyA9IGtleW5hbWUuc3BsaXQoLyArKD8hXFwnJCkvKS5tYXAobm9ybWFsaXplS2V5TmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIF9uYW1lID0ga2V5cy5zbGljZSgwLCBpICsgMSkuam9pbihcIiBcIik7XG4gICAgICAgIHZhciB2YWwgPSBpID09IGtleXMubGVuZ3RoIC0gMSA/IHZhbHVlIDogXCIuLi5cIjtcbiAgICAgICAgdmFyIHByZXYgPSB0aGlzLmJpbmRpbmdzW19uYW1lXTtcbiAgICAgICAgaWYgKCFwcmV2KSB0aGlzLmJpbmRpbmdzW19uYW1lXSA9IHZhbDtlbHNlIGlmIChwcmV2ICE9IHZhbCkgdGhyb3cgbmV3IEVycm9yKFwiSW5jb25zaXN0ZW50IGJpbmRpbmdzIGZvciBcIiArIF9uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nKVxuICAgIC8vIFJlbW92ZSB0aGUgYmluZGluZyBmb3IgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlQmluZGluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVCaW5kaW5nKGtleW5hbWUpIHtcbiAgICAgIHZhciBrZXlzID0ga2V5bmFtZS5zcGxpdCgvICsoPyFcXCckKS8pLm1hcChub3JtYWxpemVLZXlOYW1lKTtcbiAgICAgIGZvciAodmFyIGkgPSBrZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBfbmFtZTIgPSBrZXlzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5iaW5kaW5nc1tfbmFtZTJdO1xuICAgICAgICBpZiAodmFsID09IFwiLi4uXCIgJiYgIXRoaXMudW51c2VkTXVsdGkoX25hbWUyKSkgYnJlYWs7ZWxzZSBpZiAodmFsKSBkZWxldGUgdGhpcy5iaW5kaW5nc1tfbmFtZTJdO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnVzZWRNdWx0aVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnVzZWRNdWx0aShuYW1lKSB7XG4gICAgICBmb3IgKHZhciBiaW5kaW5nIGluIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgaWYgKGJpbmRpbmcubGVuZ3RoID4gbmFtZSAmJiBiaW5kaW5nLmluZGV4T2YobmFtZSkgPT0gMCAmJiBiaW5kaW5nLmNoYXJBdChuYW1lLmxlbmd0aCkgPT0gXCIgXCIpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/YW55KSDihpIgYW55XG4gICAgLy8gTG9va3MgdXAgdGhlIGdpdmVuIGtleSBvciBrZXkgc2VxdWVuY2UgaW4gdGhpcyBrZXltYXAuIFJldHVybnNcbiAgICAvLyB0aGUgdmFsdWUgdGhlIGtleSBpcyBib3VuZCB0byAod2hpY2ggbWF5IGJlIHVuZGVmaW5lZCBpZiBpdCBpc1xuICAgIC8vIG5vdCBib3VuZCksIG9yIHRoZSBzdHJpbmcgYFwiLi4uXCJgIGlmIHRoZSBrZXkgaXMgYSBwcmVmaXggb2YgYVxuICAgIC8vIG11bHRpLWtleSBzZXF1ZW5jZSB0aGF0IGlzIGJvdW5kIGJ5IHRoaXMga2V5bWFwLlxuICB9LCB7XG4gICAga2V5OiBcImxvb2t1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb29rdXAoa2V5LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNhbGwgPyB0aGlzLm9wdGlvbnMuY2FsbChrZXksIGNvbnRleHQpIDogdGhpcy5iaW5kaW5nc1trZXldO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBLZXltYXA7XG59KSgpO1xuXG5leHBvcnRzLktleW1hcCA9IEtleW1hcDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3g0LCBfeDUsIF94NikgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDQsIHByb3BlcnR5ID0gX3g1LCByZWNlaXZlciA9IF94NjsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDQgPSBwYXJlbnQ7IF94NSA9IHByb3BlcnR5OyBfeDYgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5yZXF1aXJlKFwiLi9jc3NcIik7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4uL3RyYW5zZm9ybVwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0ID0gcmVxdWlyZShcIi4uL3V0aWwvc29ydGVkaW5zZXJ0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdXRpbFNvcnRlZGluc2VydCk7XG5cbnZhciBfdXRpbE1hcCA9IHJlcXVpcmUoXCIuLi91dGlsL21hcFwiKTtcblxudmFyIF91dGlsRXZlbnQgPSByZXF1aXJlKFwiLi4vdXRpbC9ldmVudFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3NlcmlhbGl6ZVRleHQgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL3RleHRcIik7XG5cbnJlcXVpcmUoXCIuLi9wYXJzZS90ZXh0XCIpO1xuXG52YXIgX3BhcnNlID0gcmVxdWlyZShcIi4uL3BhcnNlXCIpO1xuXG52YXIgX3NlcmlhbGl6ZSA9IHJlcXVpcmUoXCIuLi9zZXJpYWxpemVcIik7XG5cbnZhciBfb3B0aW9ucyA9IHJlcXVpcmUoXCIuL29wdGlvbnNcIik7XG5cbnZhciBfc2VsZWN0aW9uMiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9kcmF3ID0gcmVxdWlyZShcIi4vZHJhd1wiKTtcblxudmFyIF9pbnB1dCA9IHJlcXVpcmUoXCIuL2lucHV0XCIpO1xuXG52YXIgX2hpc3RvcnkgPSByZXF1aXJlKFwiLi9oaXN0b3J5XCIpO1xuXG52YXIgX2NvbW1hbmRzID0gcmVxdWlyZShcIi4vY29tbWFuZHNcIik7XG5cbnZhciBfcmFuZ2UgPSByZXF1aXJlKFwiLi9yYW5nZVwiKTtcblxudmFyIF9rZXlzID0gcmVxdWlyZShcIi4va2V5c1wiKTtcblxuLy8gOzsgVGhpcyBpcyB0aGUgY2xhc3MgdXNlZCB0byByZXByZXNlbnQgaW5zdGFuY2VzIG9mIHRoZSBlZGl0b3IuIEFcbi8vIFByb3NlTWlycm9yIGVkaXRvciBob2xkcyBhIFtkb2N1bWVudF0oI05vZGUpIGFuZCBhXG4vLyBbc2VsZWN0aW9uXSgjU2VsZWN0aW9uKSwgYW5kIGRpc3BsYXlzIGFuIGVkaXRhYmxlIHN1cmZhY2Vcbi8vIHJlcHJlc2VudGluZyB0aGF0IGRvY3VtZW50IGluIHRoZSBicm93c2VyIGRvY3VtZW50LlxuLy9cbi8vIENvbnRhaW5zIGV2ZW50IG1ldGhvZHMgKGBvbmAsIGV0YykgZnJvbSB0aGUgW2V2ZW50XG4vLyBtaXhpbl0oI0V2ZW50TWl4aW4pLlxuXG52YXIgUHJvc2VNaXJyb3IgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0KVxuICAvLyBDb25zdHJ1Y3QgYSBuZXcgZWRpdG9yIGZyb20gYSBzZXQgb2YgW29wdGlvbnNdKCNlZGl0X29wdGlvbnMpXG4gIC8vIGFuZCwgaWYgaXQgaGFzIGEgW2BwbGFjZWBdKCNwbGFjZSkgb3B0aW9uLCBhZGQgaXQgdG8gdGhlXG4gIC8vIGRvY3VtZW50LlxuXG4gIGZ1bmN0aW9uIFByb3NlTWlycm9yKG9wdHMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvc2VNaXJyb3IpO1xuXG4gICAgb3B0cyA9IHRoaXMub3B0aW9ucyA9ICgwLCBfb3B0aW9ucy5wYXJzZU9wdGlvbnMpKG9wdHMpO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIFRoZSBzY2hlbWEgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQuXG4gICAgdGhpcy5zY2hlbWEgPSBvcHRzLnNjaGVtYTtcbiAgICBpZiAob3B0cy5kb2MgPT0gbnVsbCkgb3B0cy5kb2MgPSB0aGlzLnNjaGVtYS5ub2RlKFwiZG9jXCIsIG51bGwsIFt0aGlzLnNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIpXSk7XG4gICAgLy8gOjogRE9NTm9kZVxuICAgIC8vIFRoZSBlZGl0YWJsZSBET00gbm9kZSBjb250YWluaW5nIHRoZSBkb2N1bWVudC5cbiAgICB0aGlzLmNvbnRlbnQgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWNvbnRlbnRcIiB9KTtcbiAgICAvLyA6OiBET01Ob2RlXG4gICAgLy8gVGhlIG91dGVyIERPTSBlbGVtZW50IG9mIHRoZSBlZGl0b3IuXG4gICAgdGhpcy53cmFwcGVyID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvclwiIH0sIHRoaXMuY29udGVudCk7XG4gICAgdGhpcy53cmFwcGVyLlByb3NlTWlycm9yID0gdGhpcztcblxuICAgIGlmIChvcHRzLnBsYWNlICYmIG9wdHMucGxhY2UuYXBwZW5kQ2hpbGQpIG9wdHMucGxhY2UuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyKTtlbHNlIGlmIChvcHRzLnBsYWNlKSBvcHRzLnBsYWNlKHRoaXMud3JhcHBlcik7XG5cbiAgICB0aGlzLnNldERvY0lubmVyKG9wdHMuZG9jRm9ybWF0ID8gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHRoaXMuc2NoZW1hLCBvcHRzLmRvYywgb3B0cy5kb2NGb3JtYXQpIDogb3B0cy5kb2MpO1xuICAgICgwLCBfZHJhdy5kcmF3KSh0aGlzLCB0aGlzLmRvYyk7XG4gICAgdGhpcy5jb250ZW50LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgaWYgKG9wdHMubGFiZWwpIHRoaXMuY29udGVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG9wdHMubGFiZWwpO1xuXG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gQSBuYW1lc3BhY2Ugd2hlcmUgbW9kdWxlcyBjYW4gc3RvcmUgcmVmZXJlbmNlcyB0byB0aGVtc2VsdmVzXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yIGluc3RhbmNlLlxuICAgIHRoaXMubW9kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XG4gICAgdGhpcy5kaXJ0eU5vZGVzID0gbmV3IF91dGlsTWFwLk1hcCgpOyAvLyBNYXBzIG5vZGUgb2JqZWN0IHRvIDEgKHJlLXNjYW4gY29udGVudCkgb3IgMiAocmVkcmF3IGVudGlyZWx5KVxuICAgIHRoaXMuZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuc2VsID0gbmV3IF9zZWxlY3Rpb24yLlNlbGVjdGlvblN0YXRlKHRoaXMpO1xuICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmlucHV0ID0gbmV3IF9pbnB1dC5JbnB1dCh0aGlzKTtcblxuICAgIC8vIDo6IE9iamVjdDxDb21tYW5kPlxuICAgIC8vIFRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvci5cbiAgICB0aGlzLmNvbW1hbmRzID0gKDAsIF9jb21tYW5kcy5pbml0Q29tbWFuZHMpKHRoaXMpO1xuICAgIHRoaXMuY29tbWFuZEtleXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgKDAsIF9vcHRpb25zLmluaXRPcHRpb25zKSh0aGlzKTtcbiAgfVxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSlcbiAgLy8gVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW29wdGlvbl0oI2VkaXRfb3B0aW9ucykuXG5cbiAgX2NyZWF0ZUNsYXNzKFByb3NlTWlycm9yLCBbe1xuICAgIGtleTogXCJzZXRPcHRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICAoMCwgX29wdGlvbnMuc2V0T3B0aW9uKSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIGFueVxuICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW29wdGlvbl0oI2VkaXRfb3B0aW9ucykuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0T3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9wdGlvbihuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zW25hbWVdO1xuICAgIH1cblxuICAgIC8vIDo6IFNlbGVjdGlvblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4dFNlbGVjdGlvblwiLFxuXG4gICAgLy8gOjogKFBvcywgP1BvcylcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byBhIFt0ZXh0IHNlbGVjdGlvbl0oI1RleHRTZWxlY3Rpb24pIGZyb21cbiAgICAvLyBgYW5jaG9yYCB0byBgaGVhZGAsIG9yLCBpZiBgaGVhZGAgaXMgbnVsbCwgYSBjdXJzb3Igc2VsZWN0aW9uIGF0XG4gICAgLy8gYGFuY2hvcmAuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbihuZXcgX3NlbGVjdGlvbjIuVGV4dFNlbGVjdGlvbihhbmNob3IsIGhlYWQpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKVxuICAgIC8vIFNldCB0aGUgc2VsZWN0aW9uIHRvIGEgbm9kZSBzZWxlY3Rpb24gb24gdGhlIG5vZGUgYWZ0ZXIgYHBvc2AuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Tm9kZVNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXROb2RlU2VsZWN0aW9uKHBvcykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhwb3MsIGZhbHNlKTtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgICAgIGlmIChwb3Mub2Zmc2V0ID49IHBhcmVudC5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2V0IGEgbm9kZSBzZWxlY3Rpb24gYXQgdGhlIGVuZCBvZiBhIG5vZGVcIik7XG4gICAgICB2YXIgbm9kZSA9IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0KTtcbiAgICAgIGlmICghbm9kZS50eXBlLnNlbGVjdGFibGUpIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzZWxlY3QgYSBub24tc2VsZWN0YWJsZSBub2RlXCIpO1xuICAgICAgdGhpcy5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKTtcbiAgICAgIHRoaXMuc2VsLnNldEFuZFNpZ25hbChuZXcgX3NlbGVjdGlvbjIuTm9kZVNlbGVjdGlvbihwb3MsIHBvcy5tb3ZlKDEpLCBub2RlKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFNlbGVjdGlvbilcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uIG9iamVjdC5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIF9zZWxlY3Rpb24yLlRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24uaGVhZCwgdHJ1ZSk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uLmVtcHR5KSB0aGlzLmNoZWNrUG9zKHNlbGVjdGlvbi5hbmNob3IsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24udG8sIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRGlyZWN0KHNlbGVjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFNlbGVjdGlvbkRpcmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb25EaXJlY3Qoc2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgdGhpcy5pbnB1dC5tYXliZUFib3J0Q29tcG9zaXRpb24oKTtcbiAgICAgIGlmICghc2VsZWN0aW9uLmVxKHRoaXMuc2VsLnJhbmdlKSkgdGhpcy5zZWwuc2V0QW5kU2lnbmFsKHNlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKGFueSwgP3N0cmluZylcbiAgICAvLyBSZXBsYWNlIHRoZSBlZGl0b3IncyBkb2N1bWVudC4gV2hlbiBgZm9ybWF0YCBpcyBnaXZlbiwgaXQgc2hvdWxkXG4gICAgLy8gYmUgYSBbcGFyc2FibGUgZm9ybWF0XSgjcGFyc2UpLCBhbmQgYHZhbHVlYCBzaG91bGQgc29tZXRoaW5nIGluXG4gICAgLy8gdGhhdCBmb3JtYXQuIElmIG5vdCwgYHZhbHVlYCBzaG91bGQgYmUgYSBgTm9kZWAuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb250ZW50KHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXQpIHZhbHVlID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHRoaXMuc2NoZW1hLCB2YWx1ZSwgZm9ybWF0KTtcbiAgICAgIHRoaXMuc2V0RG9jKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3N0cmluZykg4oaSIGFueVxuICAgIC8vIEdldCB0aGUgZWRpdG9yJ3MgY29udGVudCBpbiBhIGdpdmVuIGZvcm1hdC4gV2hlbiBgZm9ybWF0YCBpcyBub3RcbiAgICAvLyBnaXZlbiwgYSBgTm9kZWAgaXMgcmV0dXJuZWQuIElmIGl0IGlzIGdpdmVuLCBpdCBzaG91bGQgYmUgYW5cbiAgICAvLyBleGlzdGluZyBbc2VyaWFsaXphdGlvbiBmb3JtYXRdKCNzZXJpYWxpemUpLlxuICB9LCB7XG4gICAga2V5OiBcImdldENvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29udGVudChmb3JtYXQpIHtcbiAgICAgIHJldHVybiBmb3JtYXQgPyAoMCwgX3NlcmlhbGl6ZS5zZXJpYWxpemVUbykodGhpcy5kb2MsIGZvcm1hdCkgOiB0aGlzLmRvYztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RG9jSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RG9jSW5uZXIoZG9jKSB7XG4gICAgICBpZiAoZG9jLnR5cGUgIT0gdGhpcy5zY2hlbWEubm9kZXMuZG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2V0IGEgZG9jdW1lbnQgd2l0aCBhIGRpZmZlcmVudCBzY2hlbWFcIik7XG4gICAgICAvLyA6OiBOb2RlIFRoZSBjdXJyZW50IGRvY3VtZW50LlxuICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICB0aGlzLnJhbmdlcyA9IG5ldyBfcmFuZ2UuUmFuZ2VTdG9yZSh0aGlzKTtcbiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBfaGlzdG9yeS5IaXN0b3J5KHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlLCA/U2VsZWN0aW9uKVxuICAgIC8vIFNldCB0aGUgZWRpdG9yJ3MgY29udGVudCwgYW5kIG9wdGlvbmFsbHkgaW5jbHVkZSBhIG5ldyBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RG9jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvYyhkb2MsIHNlbCkge1xuICAgICAgaWYgKCFzZWwpIHNlbCA9ICgwLCBfc2VsZWN0aW9uMi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKTtcbiAgICAgIC8vIDo6IChkb2M6IE5vZGUsIHNlbGVjdGlvbjogU2VsZWN0aW9uKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjYmVmb3JlU2V0RG9jXG4gICAgICAvLyBGaXJlZCB3aGVuIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLnNldERvYykgaXMgY2FsbGVkLCBiZWZvcmVcbiAgICAgIC8vIHRoZSBkb2N1bWVudCBpcyBhY3R1YWxseSB1cGRhdGVkLlxuICAgICAgdGhpcy5zaWduYWwoXCJiZWZvcmVTZXREb2NcIiwgZG9jLCBzZWwpO1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuc2V0RG9jSW5uZXIoZG9jKTtcbiAgICAgIHRoaXMuc2VsLnNldChzZWwsIHRydWUpO1xuICAgICAgLy8gOjogKGRvYzogTm9kZSwgc2VsZWN0aW9uOiBTZWxlY3Rpb24pICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNzZXREb2NcbiAgICAgIC8vIEZpcmVkIHdoZW4gW2BzZXREb2NgXSgjUHJvc2VNaXJyb3Iuc2V0RG9jKSBpcyBjYWxsZWQsIGFmdGVyXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgaXMgdXBkYXRlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwic2V0RG9jXCIsIGRvYywgc2VsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlRG9jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZURvYyhkb2MsIG1hcHBpbmcsIHNlbGVjdGlvbikge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICB0aGlzLnJhbmdlcy50cmFuc2Zvcm0obWFwcGluZyk7XG4gICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgIHRoaXMuc2VsLnNldEFuZFNpZ25hbChzZWxlY3Rpb24gfHwgdGhpcy5zZWwucmFuZ2UubWFwKGRvYywgbWFwcGluZykpO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2NoYW5nZVxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZG9jdW1lbnQgaGFzIGNoYW5nZWQuIFNlZVxuICAgICAgLy8gW2BzZXREb2NgXSgjUHJvc2VNaXJyb3IuZXZlbnRfc2V0RG9jKSBhbmRcbiAgICAgIC8vIFtgdHJhbnNmb3JtYF0oI1Byb3NlTWlycm9yLmV2ZW50X3RyYW5zZm9ybSkgZm9yIG1vcmUgc3BlY2lmaWNcbiAgICAgIC8vIGNoYW5nZS1yZWxhdGVkIGV2ZW50cy5cbiAgICAgIHRoaXMuc2lnbmFsKFwiY2hhbmdlXCIpO1xuICAgIH1cblxuICAgIC8vIDo6IEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIENyZWF0ZSBhbiBlZGl0b3ItIGFuZCBzZWxlY3Rpb24tYXdhcmUgYFRyYW5zZm9ybWAgZm9yIHRoaXMgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5XCIsXG5cbiAgICAvLyA6OiAoVHJhbnNmb3JtLCA/T2JqZWN0KSDihpIgP1RyYW5zZm9ybVxuICAgIC8vIEFwcGx5IGEgdHJhbnNmb3JtYXRpb24gKHdoaWNoIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSB3aXRoIHRoZVxuICAgIC8vIFtgdHJgIGdldHRlcl0oI1Byb3NlTWlycm9yLnRyKSkgdG8gdGhlIGRvY3VtZW50IGluIHRoZSBlZGl0b3IuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6XG4gICAgLy9cbiAgICAvLyAqKmBzZWxlY3Rpb25gKipgOiA/U2VsZWN0aW9uYFxuICAgIC8vICAgOiBBIG5ldyBzZWxlY3Rpb24gdG8gc2V0IGFmdGVyIHRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBhcHBsaWVkLlxuICAgIC8vXG4gICAgLy8gKipgc2Nyb2xsSW50b1ZpZXdgKio6ID9ib29sXG4gICAgLy8gICA6IFdoZW4gdHJ1ZSwgc2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3IG9uIHRoZSBuZXh0XG4gICAgLy8gICAgIFtyZWRyYXddKCNQcm9zZU1pcnJvci5mbHVzaCkuXG4gICAgLy9cbiAgICAvLyBSZXR1cm5zIHRoZSB0cmFuc2Zvcm0sIG9yIGBmYWxzZWAgaWYgdGhlcmUgd2VyZSBubyBzdGVwcyBpbiBpdC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHkodHJhbnNmb3JtKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IG51bGxPcHRpb25zIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAodHJhbnNmb3JtLmRvYyA9PSB0aGlzLmRvYykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRyYW5zZm9ybS5kb2NzWzBdICE9IHRoaXMuZG9jICYmICgwLCBfbW9kZWwuZmluZERpZmZTdGFydCkodHJhbnNmb3JtLmRvY3NbMF0sIHRoaXMuZG9jKSkgdGhyb3cgbmV3IEVycm9yKFwiQXBwbHlpbmcgYSB0cmFuc2Zvcm0gdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBjdXJyZW50IGRvY3VtZW50XCIpO1xuXG4gICAgICB0aGlzLnVwZGF0ZURvYyh0cmFuc2Zvcm0uZG9jLCB0cmFuc2Zvcm0sIG9wdGlvbnMuc2VsZWN0aW9uKTtcbiAgICAgIC8vIDo6IChUcmFuc2Zvcm0sIE9iamVjdCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI3RyYW5zZm9ybVxuICAgICAgLy8gU2lnbmFscyB0aGF0IGEgKG5vbi1lbXB0eSkgdHJhbnNmb3JtYXRpb24gaGFzIGJlZW4gYXBsaWVkIHRvXG4gICAgICAvLyB0aGUgZWRpdG9yLiBQYXNzZXMgdGhlIGBUcmFuc2Zvcm1gIGFuZCB0aGUgb3B0aW9ucyBnaXZlbiB0b1xuICAgICAgLy8gW2BhcHBseWBdKCNQcm9zZU1pcnJvci5hcHBseSkgYXMgYXJndW1lbnRzIHRvIHRoZSBoYW5kbGVyLlxuICAgICAgdGhpcy5zaWduYWwoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLnNjcm9sbEludG9WaWV3KSB0aGlzLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9ib29sKVxuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudCxcbiAgICAvLyBhbmQgdGhyb3cgYW4gZXJyb3Igb3RoZXJ3aXNlLiBXaGVuIGB0ZXh0YmxvY2tgIGlzIHRydWUsIHRoZSBwb3NpdGlvblxuICAgIC8vIG11c3QgYWxzbyBmYWxsIHdpdGhpbiBhIHRleHRibG9jayBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImNoZWNrUG9zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrUG9zKHBvcywgdGV4dGJsb2NrKSB7XG4gICAgICBpZiAoIXRoaXMuZG9jLmlzVmFsaWRQb3MocG9zLCB0ZXh0YmxvY2spKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3NpdGlvbiBcIiArIHBvcyArIFwiIGlzIG5vdCB2YWxpZCBpbiBjdXJyZW50IGRvY3VtZW50XCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnN1cmVPcGVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5zdXJlT3BlcmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uIHx8IHRoaXMuc3RhcnRPcGVyYXRpb24oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRPcGVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRPcGVyYXRpb24oKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNlbC5iZWZvcmVTdGFydE9wKCk7XG4gICAgICB0aGlzLm9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24odGhpcyk7XG4gICAgICBpZiAoIXRoaXMuZmx1c2hTY2hlZHVsZWQpIHtcbiAgICAgICAgKDAsIF9kb20ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMuZmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICBfdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb247XG4gICAgfVxuXG4gICAgLy8gOjogKClcbiAgICAvLyBGbHVzaCBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIHRoZSBET00uIFdoZW4gdGhlIGRvY3VtZW50LFxuICAgIC8vIHNlbGVjdGlvbiwgb3IgbWFya2VkIHJhbmdlcyBpbiBhbiBlZGl0b3IgY2hhbmdlLCB0aGUgRE9NIGlzbid0XG4gICAgLy8gdXBkYXRlZCBpbW1lZGlhdGVseSwgYnV0IHJhdGhlciBzY2hlZHVsZWQgdG8gYmUgdXBkYXRlZCB0aGUgbmV4dFxuICAgIC8vIHRpbWUgdGhlIGJyb3dzZXIgcmVkcmF3cyB0aGUgc2NyZWVuLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0b1xuICAgIC8vIGZvcmNlIHRoaXMgdG8gaGFwcGVuIGltbWVkaWF0ZWx5LiBJdCBjYW4gYmUgdXNlZnVsIHdoZW4geW91LCBmb3JcbiAgICAvLyBleGFtcGxlLCB3YW50IHRvIG1lYXN1cmUgd2hlcmUgb24gdGhlIHNjcmVlbiBhIHBhcnQgb2YgdGhlXG4gICAgLy8gZG9jdW1lbnQgZW5kcyB1cCwgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hhbmdpbmcgdGhlIGRvY3VtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImZsdXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMud3JhcHBlcikgfHwgIXRoaXMub3BlcmF0aW9uKSByZXR1cm47XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hpbmdcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBpcyBhYm91dCB0byBbZmx1c2hdKCNQcm9zZU1pcnJvci5mbHVzaClcbiAgICAgIC8vIGFuIHVwZGF0ZSB0byB0aGUgRE9NLlxuICAgICAgdGhpcy5zaWduYWwoXCJmbHVzaGluZ1wiKTtcbiAgICAgIHZhciBvcCA9IHRoaXMub3BlcmF0aW9uO1xuICAgICAgaWYgKCFvcCkgcmV0dXJuO1xuICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5hY2N1cmF0ZVNlbGVjdGlvbiA9IHRydWU7XG5cbiAgICAgIHZhciBkb2NDaGFuZ2VkID0gb3AuZG9jICE9IHRoaXMuZG9jIHx8IHRoaXMuZGlydHlOb2Rlcy5zaXplLFxuICAgICAgICAgIHJlZHJhd24gPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5pbnB1dC5jb21wb3NpbmcgJiYgKGRvY0NoYW5nZWQgfHwgb3AuY29tcG9zaW5nQXRTdGFydCkpIHtcbiAgICAgICAgKDAsIF9kcmF3LnJlZHJhdykodGhpcywgdGhpcy5kaXJ0eU5vZGVzLCB0aGlzLmRvYywgb3AuZG9jKTtcbiAgICAgICAgdGhpcy5kaXJ0eU5vZGVzLmNsZWFyKCk7XG4gICAgICAgIHJlZHJhd24gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHJlZHJhd24gfHwgIW9wLnNlbC5lcSh0aGlzLnNlbC5yYW5nZSkpICYmICF0aGlzLmlucHV0LmNvbXBvc2luZykgdGhpcy5zZWwudG9ET00ob3AuZm9jdXMpO1xuXG4gICAgICBpZiAob3Auc2Nyb2xsSW50b1ZpZXcgIT09IGZhbHNlKSAoMCwgX3NlbGVjdGlvbjIuc2Nyb2xsSW50b1ZpZXcpKHRoaXMsIG9wLnNjcm9sbEludG9WaWV3KTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNkcmF3XG4gICAgICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgcmVkcmV3IGl0cyBkb2N1bWVudCBpbiB0aGUgRE9NLlxuICAgICAgaWYgKGRvY0NoYW5nZWQpIHRoaXMuc2lnbmFsKFwiZHJhd1wiKTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNmbHVzaFxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGhhcyBmaW5pc2hlZFxuICAgICAgLy8gW2ZsdXNoaW5nXSgjUHJvc2VNaXJyb3IuZmx1c2gpIGFuIHVwZGF0ZSB0byB0aGUgRE9NLiBJZiB5b3VcbiAgICAgIC8vIG5lZWQgdG8gcmVzcG9uZCB0byB0aGlzIHdpdGggYSBET00gdXBkYXRlIG9mIHlvdXIgb3duLCB1c2UgdGhpc1xuICAgICAgLy8gZXZlbnQgdG8gcmVhZCBsYXlvdXQgZnJvbSB0aGUgRE9NLCBhbmRcbiAgICAgIC8vIFtgZmx1c2hlZGBdKCNQcm9zZU1pcnJvci5ldmVudF9mbHVzaGVkKSB0byB1cGRhdGUgdGhlIERPTS5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hcIik7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hlZFxuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIGhhcyBmaW5pc2hlZFxuICAgICAgLy8gW2ZsdXNoaW5nXSgjUHJvc2VNaXJyb3IuZmx1c2gpIGFuIHVwZGF0ZSB0byB0aGUgRE9NLCBhZnRlclxuICAgICAgLy8gW2BmbHVzaGBdKCNQcm9zZU1pcnJvci5ldmVudF9mbHVzaCkgaGFzIGZpcmVkLlxuICAgICAgdGhpcy5zaWduYWwoXCJmbHVzaGVkXCIpO1xuICAgICAgdGhpcy5hY2N1cmF0ZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChLZXltYXAsID9udW1iZXIpXG4gICAgLy8gQWRkIGEgW2tleW1hcF0oI0tleW1hcCkgdG8gdGhlIGVkaXRvci4gS2V5bWFwcyBhZGRlZCBpbiB0aGlzIHdheVxuICAgIC8vIGFyZSBxdWVyaWVkIGJlZm9yZSB0aGUgW2Jhc2Uga2V5bWFwXSgja2V5bWFwKS5cbiAgICAvLyBUaGUgYHJhbmtgIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZW4gdGhleSBhcmUgcXVlcmllZFxuICAgIC8vIHJlbGF0aXZlIHRvIG90aGVyIG1hcHMgYWRkZWQgbGlrZSB0aGlzLiBNYXBzIHdpdGggYSBsb3dlciByYW5rXG4gICAgLy8gZ2V0IHF1ZXJpZWQgZmlyc3QuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkS2V5bWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEtleW1hcChtYXApIHtcbiAgICAgIHZhciByYW5rID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gNTAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKSh0aGlzLmlucHV0LmtleW1hcHMsIHsgbWFwOiBtYXAsIHJhbms6IHJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6ICh1bmlvbjxzdHJpbmcsIEtleW1hcD4pXG4gICAgLy8gUmVtb3ZlIHRoZSBnaXZlbiBrZXltYXAsIG9yIHRoZSBrZXltYXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgZnJvbVxuICAgIC8vIHRoZSBlZGl0b3IuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlS2V5bWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUtleW1hcChtYXApIHtcbiAgICAgIHZhciBtYXBzID0gdGhpcy5pbnB1dC5rZXltYXBzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChtYXBzW2ldLm1hcCA9PSBtYXAgfHwgbWFwc1tpXS5tYXAub3B0aW9ucy5uYW1lID09IG1hcCkge1xuICAgICAgICAgIG1hcHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtSYW5nZVwiLFxuXG4gICAgLy8gOjogKFBvcywgUG9zLCA/T2JqZWN0KSDihpIgTWFya2VkUmFuZ2VcbiAgICAvLyBDcmVhdGUgYSBtYXJrZWQgcmFuZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLiBNYXJrZWQgcmFuZ2VzXG4gICAgLy8g4oCcdHJhY2vigJ0gdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoZXkgcG9pbnQgdG/igJRhcyB0aGUgZG9jdW1lbnRcbiAgICAvLyBjaGFuZ2VzLCB0aGV5IGFyZSB1cGRhdGVkIHRvIG1vdmUsIGdyb3csIGFuZCBzaHJpbmsgYWxvbmcgd2l0aFxuICAgIC8vIHRoZWlyIGNvbnRlbnQuXG4gICAgLy9cbiAgICAvLyBgb3B0aW9uc2AgbWF5IGJlIGFuIG9iamVjdCBjb250YWluaW5nIHRoZXNlIHByb3BlcnRpZXM6XG4gICAgLy9cbiAgICAvLyAqKmBpbmNsdXNpdmVMZWZ0YCoqYDogYm9vbCA9IGZhbHNlYFxuICAgIC8vICAgOiBXaGV0aGVyIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJhbmdlIGlzIGluY2x1c2l2ZS4gV2hlbiBpdCBpcyxcbiAgICAvLyAgICAgY29udGVudCBpbnNlcnRlZCBhdCB0aGF0IHBvaW50IHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIHJhbmdlLlxuICAgIC8vICAgICBXaGVuIG5vdCwgaXQgd2lsbCBiZSBvdXRzaWRlIG9mIHRoZSByYW5nZS5cbiAgICAvL1xuICAgIC8vICoqYGluY2x1c2l2ZVJpZ2h0YCoqYDogYm9vbCA9IGZhbHNlYFxuICAgIC8vICAgOiBXaGV0aGVyIHRoZSByaWdodCBzaWRlIG9mIHRoZSByYW5nZSBpcyBpbmNsdXNpdmUuXG4gICAgLy9cbiAgICAvLyAqKmByZW1vdmVXaGVuRW1wdHlgKipgOiBib29sID0gdHJ1ZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgcmFuZ2Ugc2hvdWxkIGJlIGZvcmdvdHRlbiB3aGVuIGl0IGJlY29tZXMgZW1wdHlcbiAgICAvLyAgICAgKGJlY2F1c2UgYWxsIG9mIGl0cyBjb250ZW50IHdhcyBkZWxldGVkKS5cbiAgICAvL1xuICAgIC8vICoqYGNsYXNzTmFtZWAqKjogc3RyaW5nXG4gICAgLy8gICA6IEEgQ1NTIGNsYXNzIHRvIGFkZCB0byB0aGUgaW5saW5lIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoaXNcbiAgICAvLyAgICAgcmFuZ2UuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcmtSYW5nZShmcm9tLCB0bywgb3B0aW9ucykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhmcm9tKTtcbiAgICAgIHRoaXMuY2hlY2tQb3ModG8pO1xuICAgICAgdmFyIHJhbmdlID0gbmV3IF9yYW5nZS5NYXJrZWRSYW5nZShmcm9tLCB0bywgb3B0aW9ucyk7XG4gICAgICB0aGlzLnJhbmdlcy5hZGRSYW5nZShyYW5nZSk7XG4gICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmtlZFJhbmdlKVxuICAgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gcmFuZ2UgZnJvbSB0aGUgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVJhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJhbmdlKHJhbmdlKSB7XG4gICAgICB0aGlzLnJhbmdlcy5yZW1vdmVSYW5nZShyYW5nZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmtUeXBlLCA/Ym9vbCwgP09iamVjdClcbiAgICAvLyBTZXQgKHdoZW4gYHRvYCBpcyB0cnVlKSwgdW5zZXQgKGB0b2AgaXMgZmFsc2UpLCBvciB0b2dnbGUgKGB0b2BcbiAgICAvLyBpcyBudWxsKSB0aGUgZ2l2ZW4gbWFyayB0eXBlIG9uIHRoZSBzZWxlY3Rpb24uIFdoZW4gdGhlcmUgaXMgYVxuICAgIC8vIG5vbi1lbXB0eSBzZWxlY3Rpb24sIHRoZSBtYXJrcyBvZiB0aGUgc2VsZWN0aW9uIGFyZSB1cGRhdGVkLiBXaGVuXG4gICAgLy8gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSwgdGhlIHNldCBvZiBbYWN0aXZlXG4gICAgLy8gbWFya3NdKCNQcm9zZU1pcnJvci5hY3RpdmVNYXJrcykgaXMgdXBkYXRlZC5cbiAgfSwge1xuICAgIGtleTogXCJzZXRNYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE1hcmsodHlwZSwgdG8sIGF0dHJzKSB7XG4gICAgICB2YXIgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICBpZiAoc2VsLmVtcHR5KSB7XG4gICAgICAgIHZhciBtYXJrcyA9IHRoaXMuYWN0aXZlTWFya3MoKTtcbiAgICAgICAgaWYgKHRvID09IG51bGwpIHRvID0gIXR5cGUuaXNJblNldChtYXJrcyk7XG4gICAgICAgIGlmICh0byAmJiAhdGhpcy5kb2MucGF0aChzZWwuaGVhZC5wYXRoKS50eXBlLmNhbkNvbnRhaW5NYXJrKHR5cGUpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW5wdXQuc3RvcmVkTWFya3MgPSB0byA/IHR5cGUuY3JlYXRlKGF0dHJzKS5hZGRUb1NldChtYXJrcykgOiB0eXBlLnJlbW92ZUZyb21TZXQobWFya3MpO1xuICAgICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjYWN0aXZlTWFya0NoYW5nZVxuICAgICAgICAvLyBGaXJlZCB3aGVuIHRoZSBzZXQgb2YgW2FjdGl2ZSBtYXJrc10oI1Byb3NlTWlycm9yLmFjdGl2ZU1hcmtzKSBjaGFuZ2VzLlxuICAgICAgICB0aGlzLnNpZ25hbChcImFjdGl2ZU1hcmtDaGFuZ2VcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodG8gIT0gbnVsbCA/IHRvIDogIXRoaXMuZG9jLnJhbmdlSGFzTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKSkgdGhpcy5hcHBseSh0aGlzLnRyLmFkZE1hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZS5jcmVhdGUoYXR0cnMpKSk7ZWxzZSB0aGlzLmFwcGx5KHRoaXMudHIucmVtb3ZlTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIFtNYXJrXVxuICAgIC8vIEdldCB0aGUgbWFya3MgYXQgdGhlIGN1cnNvci4gQnkgZGVmYXVsdCwgdGhpcyB5aWVsZHMgdGhlIG1hcmtzXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IGF0IHRoZSBjdXJzb3IsIGFzIHBlciBgTm9kZS5tYXJrc0F0YC5cbiAgICAvLyBCdXQgYHNldE1hcmtgIG1heSBoYXZlIGJlZW4gdXNlZCB0byBjaGFuZ2UgdGhlIHNldCBvZiBhY3RpdmVcbiAgICAvLyBtYXJrcywgaW4gd2hpY2ggY2FzZSB0aGF0IHNldCBpcyByZXR1cm5lZC5cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVNYXJrc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3RpdmVNYXJrcygpIHtcbiAgICAgIHZhciBoZWFkO1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuc3RvcmVkTWFya3MgfHwgKChoZWFkID0gdGhpcy5zZWxlY3Rpb24uaGVhZCkgPyB0aGlzLmRvYy5tYXJrc0F0KGhlYWQpIDogW10pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpXG4gICAgLy8gR2l2ZSB0aGUgZWRpdG9yIGZvY3VzLlxuICB9LCB7XG4gICAga2V5OiBcImZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMub3BlcmF0aW9uKSB0aGlzLm9wZXJhdGlvbi5mb2N1cyA9IHRydWU7ZWxzZSB0aGlzLnNlbC50b0RPTSh0cnVlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgYm9vbFxuICAgIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzRm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzRm9jdXMoKSB7XG4gICAgICBpZiAodGhpcy5zZWwucmFuZ2UgaW5zdGFuY2VvZiBfc2VsZWN0aW9uMi5Ob2RlU2VsZWN0aW9uKSByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmNvbnRlbnQ7ZWxzZSByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLmhhc0ZvY3VzKSh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHNlbGVjdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJwb3NBdENvb3Jkc1wiLFxuXG4gICAgLy8gOjogKHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSkg4oaSID9Qb3NcbiAgICAvLyBJZiB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgKHdoaWNoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgdG9wXG4gICAgLy8gbGVmdCBjb3JuZXIgb2YgdGhlIHdpbmRvd+KAlG5vdCB0aGUgcGFnZSkgZmFsbCB3aXRoaW4gdGhlIGVkaXRhYmxlXG4gICAgLy8gY29udGVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXRcbiAgICAvLyBjb3JyZXNwb25kcyB0byB0aG9zZSBjb29yZGluYXRlcy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9zQXRDb29yZHMoY29vcmRzKSB7XG4gICAgICByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLnBvc0F0Q29vcmRzKSh0aGlzLCBjb29yZHMpO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MpIOKGkiB7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgYm90dG9tOiBudW1iZXJ9XG4gICAgLy8gRmluZCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIChyZWxhdGl2ZSB0byB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlXG4gICAgLy8gd2luZG93KSBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiY29vcmRzQXRQb3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29vcmRzQXRQb3MocG9zKSB7XG4gICAgICB0aGlzLmNoZWNrUG9zKHBvcyk7XG4gICAgICByZXR1cm4gKDAsIF9zZWxlY3Rpb24yLmNvb3Jkc0F0UG9zKSh0aGlzLCBwb3MpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zKVxuICAgIC8vIFNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG9yIHRoZSBjdXJzb3IgcG9zaXRpb24gaWYgYHBvc2AgaXNuJ3RcbiAgICAvLyBnaXZlbiwgaW50byB2aWV3LlxuICB9LCB7XG4gICAga2V5OiBcInNjcm9sbEludG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgdmFyIHBvcyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIGlmIChwb3MpIHRoaXMuY2hlY2tQb3MocG9zKTtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLm9wZXJhdGlvbi5zY3JvbGxJbnRvVmlldyA9IHBvcztcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/W2FueV0pIOKGkiBib29sXG4gICAgLy8gRXhlY3V0ZSB0aGUgbmFtZWQgW2NvbW1hbmRdKCNDb21tYW5kKS4gSWYgdGhlIGNvbW1hbmQgdGFrZXNcbiAgICAvLyBwYXJhbWV0ZXJzIGFuZCB0aGV5IGFyZSBub3QgcGFzc2VkIGhlcmUsIHRoZSB1c2VyIHdpbGwgYmVcbiAgICAvLyBwcm9tcHRlZCBmb3IgdGhlbS5cbiAgfSwge1xuICAgIGtleTogXCJleGVjQ29tbWFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGVjQ29tbWFuZChuYW1lLCBwYXJhbXMpIHtcbiAgICAgIHZhciBjbWQgPSB0aGlzLmNvbW1hbmRzW25hbWVdO1xuICAgICAgcmV0dXJuICEhKGNtZCAmJiBjbWQuZXhlYyh0aGlzLCBwYXJhbXMpICE9PSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSID9zdHJpbmdcbiAgICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGtleSB0aGF0IGlzIGJvdW5kIHRvIHRoZSBnaXZlbiBjb21tYW5kLCBpZlxuICAgIC8vIGFueS5cbiAgfSwge1xuICAgIGtleTogXCJrZXlGb3JDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGtleUZvckNvbW1hbmQobmFtZSkge1xuICAgICAgdmFyIGNhY2hlZCA9IHRoaXMuY29tbWFuZEtleXNbbmFtZV07XG4gICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICAgIHZhciBjbWQgPSB0aGlzLmNvbW1hbmRzW25hbWVdLFxuICAgICAgICAgIGtleW1hcCA9IHRoaXMuYmFzZUtleW1hcDtcbiAgICAgIGlmICghY21kKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IG51bGw7XG4gICAgICB2YXIga2V5ID0gY21kLnNwZWMua2V5IHx8IChfZG9tLmJyb3dzZXIubWFjID8gY21kLnNwZWMubWFjS2V5IDogY21kLnNwZWMucGNLZXkpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBrZXkgPSAoMCwgX2tleXMubm9ybWFsaXplS2V5TmFtZSkoQXJyYXkuaXNBcnJheShrZXkpID8ga2V5WzBdIDoga2V5KTtcbiAgICAgICAgdmFyIGRlZmx0ID0ga2V5bWFwLmJpbmRpbmdzW2tleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmx0KSA/IGRlZmx0LmluZGV4T2YobmFtZSkgPiAtMSA6IGRlZmx0ID09IG5hbWUpIHJldHVybiB0aGlzLmNvbW1hbmRLZXlzW25hbWVdID0ga2V5O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2tleSBpbiBrZXltYXAuYmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGJvdW5kID0ga2V5bWFwLmJpbmRpbmdzW19rZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShib3VuZCkgPyBib3VuZC5pbmRleE9mKG5hbWUpID4gLTEgOiBib3VuZCA9PSBuYW1lKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IF9rZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdHJ5KG5hbWUsIGYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNjaGVtYS5yZWdpc3RyeShuYW1lLCBmKTtcbiAgICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyaWVzLmZvckVhY2goZnVuY3Rpb24gKHJlZykge1xuICAgICAgICB2YXIgYXJyYXkgPSByZWcucmVnaXN0cnlbbmFtZV07XG4gICAgICAgIGlmIChhcnJheSkgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgZihhcnJheVtpXSwgX3RoaXMyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXJrUmFuZ2VEaXJ0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrUmFuZ2VEaXJ0eShyYW5nZSkge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHZhciBkaXJ0eSA9IHRoaXMuZGlydHlOb2RlcztcbiAgICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSxcbiAgICAgICAgICB0byA9IHJhbmdlLnRvO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwLCBub2RlID0gdGhpcy5kb2M7OyBkZXB0aCsrKSB7XG4gICAgICAgIHZhciBmcm9tRW5kID0gZGVwdGggPT0gZnJvbS5kZXB0aCxcbiAgICAgICAgICAgIHRvRW5kID0gZGVwdGggPT0gdG8uZGVwdGg7XG4gICAgICAgIGlmICghZnJvbUVuZCAmJiAhdG9FbmQgJiYgZnJvbS5wYXRoW2RlcHRoXSA9PSB0by5wYXRoW2RlcHRoXSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQoZnJvbS5wYXRoW2RlcHRoXSk7XG4gICAgICAgICAgaWYgKCFkaXJ0eS5oYXMoY2hpbGQpKSBkaXJ0eS5zZXQoY2hpbGQsIERJUlRZX1JFU0NBTik7XG4gICAgICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGZyb21FbmQgPyBmcm9tLm9mZnNldCA6IGZyb20ucGF0aFtkZXB0aF07XG4gICAgICAgICAgICB2YXIgZW5kID0gdG9FbmQgPyB0by5vZmZzZXQgOiB0by5wYXRoW2RlcHRoXSArIDE7XG4gICAgICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgICAgICAgICBub2RlLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBjU3RhcnQsIGNFbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0YXJ0IDwgZW5kICYmIGNFbmQgPiBzdGFydCkgZGlydHkuc2V0KGNoaWxkLCBESVJUWV9SRURSQVcpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBub2RlLml0ZXIoc3RhcnQsIGVuZCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICAgICAgICAgIGRpcnR5LnNldChjaGlsZCwgRElSVFlfUkVEUkFXKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMuYWNjdXJhdGVTZWxlY3Rpb24pIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWwucmFuZ2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IEVkaXRvclRyYW5zZm9ybSh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmFzZUtleW1hcFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5rZXltYXAgfHwgdGhpcy5kZWZhdWx0S2V5bWFwIHx8ICh0aGlzLmRlZmF1bHRLZXltYXAgPSAoMCwgX2NvbW1hbmRzLmRlZmF1bHRLZXltYXApKHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0ZWREb2NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZUJldHdlZW4oc2VsLmZyb20sIHNlbC50byk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIHN0cmluZ1xuICAgIC8vIEdldCB0aGUgdGV4dCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGVkVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuICgwLCBfc2VyaWFsaXplVGV4dC50b1RleHQpKHRoaXMuc2VsZWN0ZWREb2MpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQcm9zZU1pcnJvcjtcbn0pKCk7XG5cbmV4cG9ydHMuUHJvc2VNaXJyb3IgPSBQcm9zZU1pcnJvcjtcbnZhciBESVJUWV9SRVNDQU4gPSAxLFxuICAgIERJUlRZX1JFRFJBVyA9IDI7XG5cbmV4cG9ydHMuRElSVFlfUkVTQ0FOID0gRElSVFlfUkVTQ0FOO1xuZXhwb3J0cy5ESVJUWV9SRURSQVcgPSBESVJUWV9SRURSQVc7XG52YXIgbnVsbE9wdGlvbnMgPSB7fTtcblxuKDAsIF91dGlsRXZlbnQuZXZlbnRNaXhpbikoUHJvc2VNaXJyb3IpO1xuXG52YXIgT3BlcmF0aW9uID0gZnVuY3Rpb24gT3BlcmF0aW9uKHBtKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcGVyYXRpb24pO1xuXG4gIHRoaXMuZG9jID0gcG0uZG9jO1xuICB0aGlzLnNlbCA9IHBtLnNlbC5yYW5nZTtcbiAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IGZhbHNlO1xuICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gIHRoaXMuY29tcG9zaW5nQXRTdGFydCA9ICEhcG0uaW5wdXQuY29tcG9zaW5nO1xufVxuXG4vLyA7OyAjdG9jPWZhbHNlIEEgc2VsZWN0aW9uLWF3YXJlIGV4dGVuc2lvbiBvZiBgVHJhbnNmb3JtYC4gVXNlXG4vLyBgUHJvc2VNaXJyb3IudHJgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbjtcblxudmFyIEVkaXRvclRyYW5zZm9ybSA9IChmdW5jdGlvbiAoX1RyYW5zZm9ybSkge1xuICBfaW5oZXJpdHMoRWRpdG9yVHJhbnNmb3JtLCBfVHJhbnNmb3JtKTtcblxuICBmdW5jdGlvbiBFZGl0b3JUcmFuc2Zvcm0ocG0pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWRpdG9yVHJhbnNmb3JtKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEVkaXRvclRyYW5zZm9ybS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgcG0uZG9jKTtcbiAgICB0aGlzLnBtID0gcG07XG4gIH1cblxuICAvLyA6OiAoP09iamVjdCkg4oaSID9FZGl0b3JUcmFuc2Zvcm1cbiAgLy8gQXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLiBSZXR1cm5zIHRoZSB0cmFuc2Zvcm0sIG9yIGBmYWxzZWAgaXQgaXNcbiAgLy8gd2FzIGVtcHR5LlxuXG4gIF9jcmVhdGVDbGFzcyhFZGl0b3JUcmFuc2Zvcm0sIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnBtLmFwcGx5KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIDo6IFNlbGVjdGlvblxuICAgIC8vIEdldCB0aGUgZWRpdG9yJ3MgY3VycmVudCBzZWxlY3Rpb24sIFttYXBwZWRdKCNTZWxlY3Rpb24ubWFwKVxuICAgIC8vIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNmb3JtLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VTZWxlY3Rpb25cIixcblxuICAgIC8vIDo6ICg/Tm9kZSwgP2Jvb2wpIOKGkiBFZGl0b3JUcmFuc2Zvcm1cbiAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbm9kZSwgb3IgZGVsZXRlIGl0IGlmIGBub2RlYFxuICAgIC8vIGlzIG51bGwuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXMgdHJ1ZSBhbmQgdGhlIG5vZGUgaXMgYW4gaW5saW5lXG4gICAgLy8gbm9kZSwgaXQgaW5oZXJpdHMgdGhlIG1hcmtzIGZyb20gdGhlIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlU2VsZWN0aW9uKG5vZGUsIGluaGVyaXRNYXJrcykge1xuICAgICAgdmFyIF9zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHZhciBlbXB0eSA9IF9zZWxlY3Rpb24uZW1wdHk7XG4gICAgICB2YXIgZnJvbSA9IF9zZWxlY3Rpb24uZnJvbTtcbiAgICAgIHZhciB0byA9IF9zZWxlY3Rpb24udG87XG4gICAgICB2YXIgc2VsTm9kZSA9IF9zZWxlY3Rpb24ubm9kZTt2YXIgcGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pc0lubGluZSAmJiBpbmhlcml0TWFya3MgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBtYXJrcyA9IGVtcHR5ID8gdGhpcy5wbS5pbnB1dC5zdG9yZWRNYXJrcyA6IHRoaXMuZG9jLm1hcmtzQXQoZnJvbSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnR5cGUuY3JlYXRlKG5vZGUuYXR0cnMsIG5vZGUudGV4dCwgbWFya3MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsTm9kZSAmJiBzZWxOb2RlLmlzVGV4dGJsb2NrICYmIG5vZGUgJiYgbm9kZS5pc0lubGluZSkge1xuICAgICAgICAvLyBQdXR0aW5nIGlubGluZSBzdHVmZiBvbnRvIGEgc2VsZWN0ZWQgdGV4dGJsb2NrIHB1dHMgaXQgaW5zaWRlXG4gICAgICAgIGZyb20gPSBuZXcgX21vZGVsLlBvcyhmcm9tLnRvUGF0aCgpLCAwKTtcbiAgICAgICAgdG8gPSBuZXcgX21vZGVsLlBvcyhmcm9tLnBhdGgsIHNlbE5vZGUuc2l6ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNlbE5vZGUpIHtcbiAgICAgICAgLy8gVGhpcyBub2RlIGNhbiBub3Qgc2ltcGx5IGJlIHJlbW92ZWQvcmVwbGFjZWQuIFJlbW92ZSBpdHMgcGFyZW50IGFzIHdlbGxcbiAgICAgICAgd2hpbGUgKGZyb20uZGVwdGggJiYgZnJvbS5vZmZzZXQgPT0gMCAmJiAocGFyZW50ID0gdGhpcy5kb2MucGF0aChmcm9tLnBhdGgpKSAmJiBmcm9tLm9mZnNldCA9PSBwYXJlbnQuc2l6ZSAtIDEgJiYgIXBhcmVudC50eXBlLmNhbkJlRW1wdHkgJiYgIShub2RlICYmIHBhcmVudC50eXBlLmNhbkNvbnRhaW4obm9kZSkpKSB7XG4gICAgICAgICAgZnJvbSA9IGZyb20uc2hvcnRlbigpO1xuICAgICAgICAgIHRvID0gdG8uc2hvcnRlbihudWxsLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlICYmIG5vZGUuaXNCbG9jayAmJiB0aGlzLmRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBmcm9tLmRlcHRoIC0gMSkpLnR5cGUuY2FuQ29udGFpbihub2RlKSkge1xuICAgICAgICAvLyBJbnNlcnRpbmcgYSBibG9jayBub2RlIGludG8gYSB0ZXh0YmxvY2suIFRyeSB0byBpbnNlcnQgaXQgYWJvdmUgYnkgc3BsaXR0aW5nIHRoZSB0ZXh0YmxvY2tcbiAgICAgICAgdGhpc1tcImRlbGV0ZVwiXShmcm9tLCB0byk7XG4gICAgICAgIHZhciBfcGFyZW50ID0gdGhpcy5kb2MucGF0aChmcm9tLnBhdGgpO1xuICAgICAgICBpZiAoZnJvbS5vZmZzZXQgJiYgZnJvbS5vZmZzZXQgIT0gX3BhcmVudC5zaXplKSB0aGlzLnNwbGl0KGZyb20pO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQoZnJvbS5zaG9ydGVuKG51bGwsIGZyb20ub2Zmc2V0ID8gMSA6IDApLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUpIHJldHVybiB0aGlzLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBub2RlKTtlbHNlIHJldHVybiB0aGlzW1wiZGVsZXRlXCJdKGZyb20sIHRvKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gRGVsZXRlIHRoZSBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlU2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZVNlbGVjdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggYSB0ZXh0IG5vZGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICB9LCB7XG4gICAga2V5OiBcInR5cGVUZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHR5cGVUZXh0KHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5wbS5zY2hlbWEudGV4dCh0ZXh0KSwgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoID8gdGhpcy5wbS5zZWxlY3Rpb24ubWFwKHRoaXMpIDogdGhpcy5wbS5zZWxlY3Rpb247XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVkaXRvclRyYW5zZm9ybTtcbn0pKF90cmFuc2Zvcm0uVHJhbnNmb3JtKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLmRlZmluZU9wdGlvbiA9IGRlZmluZU9wdGlvbjtcbmV4cG9ydHMucGFyc2VPcHRpb25zID0gcGFyc2VPcHRpb25zO1xuZXhwb3J0cy5pbml0T3B0aW9ucyA9IGluaXRPcHRpb25zO1xuZXhwb3J0cy5zZXRPcHRpb24gPSBzZXRPcHRpb247XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbi8vIDs7IEEgcmVnaXN0cnkgaXMgYSBuYW1lc3BhY2UgZm9yIFtjb21tYW5kc10oI0NvbW1hbmRzKSwgaW5wdXRcbi8vIHJ1bGVzLCBhbmQgc28gb24uIFRoZXkgcHJvdmlkZSBhIHdheSB0byBkZWZpbmUgY29tbWFuZHMgYW5kIHN1Y2ggaW5cbi8vIGEgc2NvcGVkIHdheSwgd2l0aG91dCBoYXZpbmcgdGhlbSBzaG93IHVwIG9uIGFsbCB5b3VyIGVkaXRvcnMgYnlcbi8vIGRlZmF1bHQgYWxsIG9mIGEgc3VkZGVuLiBTZWUgYWxzbyB0aGUgW2ByZWdpc3RyaWVzYFxuLy8gb3B0aW9uXSgjcmVnaXN0cmllcykuXG5cbnZhciBSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChzdHJpbmcpXG4gIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RyeSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXG4gIGZ1bmN0aW9uIFJlZ2lzdHJ5KG5hbWUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVnaXN0cnkpO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIDo6IFJlZ2lzdHJ5XG4gIC8vIFRoZSByZWdpc3RyeSBpbiB3aGljaCBidWlsdC1pbiBjb21tYW5kcyBhbmQgaW5wdXQgcnVsZXMgYXJlXG4gIC8vIHJlZ2lzdGVyZWQuIFRoZSBkZWZhdWx0IGNvbnRlbnQgb2YgdGhlIGByZWdpc3RyaWVzYCBvcHRpb24uXG5cbiAgLy8gOjogKHN0cmluZywgKilcbiAgLy8gUmVnaXN0ZXIgYSBuZXcgaXRlbSBpbiB0aGlzIHJlZ2lzdHJ5LlxuXG4gIF9jcmVhdGVDbGFzcyhSZWdpc3RyeSwgW3tcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIDsodGhpcy5yZWdpc3RyeVtuYW1lXSB8fCAodGhpcy5yZWdpc3RyeVtuYW1lXSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ2lzdHJ5O1xufSkoKTtcblxuZXhwb3J0cy5SZWdpc3RyeSA9IFJlZ2lzdHJ5O1xudmFyIGRlZmF1bHRSZWdpc3RyeSA9IG5ldyBSZWdpc3RyeShcImRlZmF1bHRcIik7XG5cbmV4cG9ydHMuZGVmYXVsdFJlZ2lzdHJ5ID0gZGVmYXVsdFJlZ2lzdHJ5O1xuXG52YXIgT3B0aW9uID0gZnVuY3Rpb24gT3B0aW9uKGRlZmF1bHRWYWx1ZSwgdXBkYXRlLCB1cGRhdGVPbkluaXQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9wdGlvbik7XG5cbiAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuICB0aGlzLnVwZGF0ZU9uSW5pdCA9IHVwZGF0ZU9uSW5pdCAhPT0gZmFsc2U7XG59O1xuXG52YXIgb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChzdHJpbmcsIGFueSwgKHBtOiBQcm9zZU1pcnJvciwgbmV3VmFsdWU6IGFueSwgb2xkVmFsdWU6IGFueSwgaW5pdDogYm9vbCksIGJvb2wpXG4vLyBEZWZpbmUgYSBuZXcgb3B0aW9uLiBUaGUgYHVwZGF0ZWAgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuLy8gb3B0aW9uJ3Mgb2xkIGFuZCBuZXcgdmFsdWUgZXZlcnkgdGltZSB0aGUgb3B0aW9uIGlzXG4vLyBbY2hhbmdlZF0oI1Byb3NlTWlycm9yLnNldE9wdGlvbikuIFdoZW4gYHVwZGF0ZU9uSW5pdGAgaXMgdHJ1ZSwgaXRcbi8vIGlzIGFsc28gY2FsbGVkIG9uIGVkaXRvciBpbml0LCB3aXRoIG51bGwgYXMgdGhlIG9sZCB2YWx1ZSwgYW5kIGEgZm91cnRoXG4vLyBhcmd1bWVudCBvZiB0cnVlLlxuXG5mdW5jdGlvbiBkZWZpbmVPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlLCB1cGRhdGUsIHVwZGF0ZU9uSW5pdCkge1xuICBvcHRpb25zW25hbWVdID0gbmV3IE9wdGlvbihkZWZhdWx0VmFsdWUsIHVwZGF0ZSwgdXBkYXRlT25Jbml0KTtcbn1cblxuLy8gOjogU2NoZW1hICNwYXRoPXNjaGVtYSAja2luZD1vcHRpb25cbi8vIFRoZSBbc2NoZW1hXSgjU2NoZW1hKSB0aGF0IHRoZSBlZGl0b3IncyBkb2N1bWVudCBzaG91bGQgdXNlLlxuZGVmaW5lT3B0aW9uKFwic2NoZW1hXCIsIF9tb2RlbC5kZWZhdWx0U2NoZW1hLCBmYWxzZSk7XG5cbi8vIDo6IGFueSAjcGF0aD1kb2MgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgc3RhcnRpbmcgZG9jdW1lbnQuIFVzdWFsbHkgYSBgTm9kZWAsIGJ1dCBjYW4gYmUgaW4gYW5vdGhlclxuLy8gZm9ybWF0IHdoZW4gdGhlIGBkb2NGb3JtYXRgIG9wdGlvbiBpcyBhbHNvIHNwZWNpZmllZC5cbmRlZmluZU9wdGlvbihcImRvY1wiLCBudWxsLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIHJldHVybiBwbS5zZXREb2ModmFsdWUpO1xufSwgZmFsc2UpO1xuXG4vLyA6OiA/c3RyaW5nICNwYXRoPWRvY0Zvcm1hdCAja2luZD1vcHRpb25cbi8vIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGBkb2NgIG9wdGlvbiBpcyBnaXZlbi4gRGVmYXVsdHMgdG8gYG51bGxgXG4vLyAoYSByYXcgYE5vZGVgKS5cbmRlZmluZU9wdGlvbihcImRvY0Zvcm1hdFwiLCBudWxsKTtcblxuLy8gOjogP3VuaW9uPERPTU5vZGUsIChET01Ob2RlKT4gI3BhdGg9cGxhY2UgI2tpbmQ9b3B0aW9uXG4vLyBEZXRlcm1pbmVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGVkaXRvciBpbiB0aGUgcGFnZS4gV2hlbiBgbnVsbGAsXG4vLyB0aGUgZWRpdG9yIGlzIG5vdCBwbGFjZWQuIFdoZW4gYSBET00gbm9kZSBpcyBnaXZlbiwgdGhlIGVkaXRvciBpc1xuLy8gYXBwZW5kZWQgdG8gdGhhdCBub2RlLiBXaGVuIGEgZnVuY3Rpb24gaXMgZ2l2ZW4sIGl0IGlzIGNhbGxlZFxuLy8gd2l0aCB0aGUgZWRpdG9yJ3Mgd3JhcHBpbmcgRE9NIG5vZGUsIGFuZCBpcyBleHBlY3RlZCB0byBwbGFjZSBpdFxuLy8gaW50byB0aGUgZG9jdW1lbnQuXG5kZWZpbmVPcHRpb24oXCJwbGFjZVwiLCBudWxsKTtcblxuLy8gOjogS2V5bWFwICNwYXRoPWtleW1hcCAja2luZD1vcHRpb25cbi8vIFRoZSBiYXNlIFtrZXltYXBdKCNLZXltYXApLiBXaGVuIG5vdCBnaXZlbiwgYSBkZWZhdWx0IGtleW1hcCBpc1xuLy8gc3ludGhlc2l6ZWQgZnJvbSB0aGUgZGVmYXVsdCBrZXkgYmluZGluZ3MgcHJvdmlkZWQgYnkgdGhlXG4vLyBbY29tbWFuZHNdKCNDb21tYW5kKSB0aGF0IGFyZSBpbiBzY29wZSBmb3IgdGhlIGVkaXRvci5cbmRlZmluZU9wdGlvbihcImtleW1hcFwiLCBudWxsKTtcblxuLy8gOjogW1JlZ2lzdHJ5XVxuLy8gVGhlIHNldCBvZiBbcmVnaXN0cmllc10oI1JlZ2lzdHJ5KSB0aGUgZWRpdG9yIHNob3VsZCBsb2FkIGl0ZW1zXG4vLyBmcm9tLlxuZGVmaW5lT3B0aW9uKFwicmVnaXN0cmllc1wiLCBbZGVmYXVsdFJlZ2lzdHJ5XSwgZmFsc2UpO1xuXG4vLyA6OiBudW1iZXIgI3BhdGg9aGlzdG9yeURlcHRoICNraW5kPW9wdGlvblxuLy8gVGhlIGFtb3VudCBvZiBoaXN0b3J5IGV2ZW50cyB0aGF0IGFyZSBjb2xsZWN0ZWQgYmVmb3JlIHRoZSBvbGRlc3Rcbi8vIGV2ZW50cyBhcmUgZGlzY2FyZGVkLiBEZWZhdWx0cyB0byAxMDAuXG5kZWZpbmVPcHRpb24oXCJoaXN0b3J5RGVwdGhcIiwgMTAwKTtcblxuLy8gOjogbnVtYmVyICNwYXRoPWhpc3RvcnlFdmVudERlbGF5ICNraW5kPW9wdGlvblxuLy8gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdGhhdCBtdXN0IHBhc3MgYmV0d2VlbiBjaGFuZ2VzIHRvXG4vLyBzdGFydCBhIG5ldyBoaXN0b3J5IGV2ZW50LiBEZWZhdWx0cyB0byA1MDAuXG5kZWZpbmVPcHRpb24oXCJoaXN0b3J5RXZlbnREZWxheVwiLCA1MDApO1xuXG4vLyA6OiBzdHJpbmcgI3BhdGg9Y29tbWFuZFBhcmFtSGFuZGxlciAja2luZD1vcHRpb25cbi8vIFRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIHVzZWQgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBbY29tbWFuZFxuLy8gcGFyYW1ldGVyc10oI0NvbW1hbmRQYXJhbSkuIE9ubHkgcmVsZXZhbnQgd2hlbiBtdWx0aXBsZSBzdWNoXG4vLyBoYW5kbGVycyBhcmUgbG9hZGVkLCBhbmQgeW91IHdhbnQgdG8gY2hvb3NlIGJldHdlZW4gdGhlbS5cbmRlZmluZU9wdGlvbihcImNvbW1hbmRQYXJhbUhhbmRsZXJcIiwgXCJkZWZhdWx0XCIpO1xuXG4vLyA6OiA/c3RyaW5nICNwYXRoPWxhYmVsICNraW5kPW9wdGlvblxuLy8gVGhlIGxhYmVsIG9mIHRoZSBlZGl0b3IuIFdoZW4gc2V0LCB0aGUgZWRpdGFibGUgRE9NIG5vZGUgZ2V0cyBhblxuLy8gYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSB3aXRoIHRoaXMgdmFsdWUuXG5kZWZpbmVPcHRpb24oXCJsYWJlbFwiLCBudWxsKTtcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9iaikge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGdpdmVuID0gb2JqID8gW29ial0uY29uY2F0KG9iai51c2UgfHwgW10pIDogW107XG4gIG91dGVyOiBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2l2ZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvcHQgaW4gZ2l2ZW5baV0pIHtcbiAgICAgICAgcmVzdWx0W29wdF0gPSBnaXZlbltpXVtvcHRdO1xuICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0W29wdF0gPSBvcHRpb25zW29wdF0uZGVmYXVsdFZhbHVlO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGluaXRPcHRpb25zKHBtKSB7XG4gIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgdmFyIGRlc2MgPSBvcHRpb25zW29wdF07XG4gICAgaWYgKGRlc2MudXBkYXRlICYmIGRlc2MudXBkYXRlT25Jbml0KSBkZXNjLnVwZGF0ZShwbSwgcG0ub3B0aW9uc1tvcHRdLCBudWxsLCB0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRPcHRpb24ocG0sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBkZXNjID0gb3B0aW9uc1tuYW1lXTtcbiAgaWYgKGRlc2MudXBkYXRlID09PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKFwiT3B0aW9uICdcIiArIG5hbWUgKyBcIicgY2FuIG5vdCBiZSBjaGFuZ2VkXCIpO1xuICB2YXIgb2xkID0gcG0ub3B0aW9uc1tuYW1lXTtcbiAgcG0ub3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICBpZiAoZGVzYy51cGRhdGUpIGRlc2MudXBkYXRlKHBtLCB2YWx1ZSwgb2xkLCBmYWxzZSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF91dGlsRXZlbnQgPSByZXF1aXJlKFwiLi4vdXRpbC9ldmVudFwiKTtcblxuLy8gOzsgQSBbbWFya2VkIHJhbmdlXSgjUHJvc2VNaXJyb3IubWFya1JhbmdlKS4gSW5jbHVkZXMgdGhlIG1ldGhvZHNcbi8vIGZyb20gdGhlIFtldmVudCBtaXhpbl0oI0V2ZW50TWl4aW4pLlxuXG52YXIgTWFya2VkUmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXJrZWRSYW5nZShmcm9tLCB0bywgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXJrZWRSYW5nZSk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgY3VycmVudCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UuIFVwZGF0ZWQgd2hlbmV2ZXIgdGhlXG4gICAgLy8gZWRpdG9yJ3MgZG9jdW1lbnQgaXMgY2hhbmdlZC4gU2V0IHRvIGBudWxsYCB3aGVuIHRoZSBtYXJrZWRcbiAgICAvLyByYW5nZSBpcyBbcmVtb3ZlZF0oI1Byb3NlTWlycm9yLnJlbW92ZVJhbmdlKS5cbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgY3VycmVudCBlbmQgcG9zaXRpb24gb2YgdGhlIHJhbmdlLiBVcGRhdGVkIHdoZW5ldmVyIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGlzIGNoYW5nZWQuIFNldCB0byBgbnVsbGAgd2hlbiB0aGUgbWFya2VkXG4gICAgLy8gcmFuZ2UgaXMgW3JlbW92ZWRdKCNQcm9zZU1pcnJvci5yZW1vdmVSYW5nZSkuXG4gICAgdGhpcy50byA9IHRvO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hcmtlZFJhbmdlLCBbe1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgLy8gOjogKGZyb206IFBvcywgdG86IFBvcykgI3BhdGg9TWFya2VkUmFuZ2UjZXZlbnRzI3JlbW92ZWRcbiAgICAgIC8vIFNpZ25hbGxlZCB3aGVuIHRoZSBtYXJrZWQgcmFuZ2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlZGl0b3IuXG4gICAgICB0aGlzLnNpZ25hbChcInJlbW92ZWRcIiwgdGhpcy5mcm9tLCB0aGlzLnRvLm1heCh0aGlzLmZyb20pKTtcbiAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrZWRSYW5nZTtcbn0pKCk7XG5cbmV4cG9ydHMuTWFya2VkUmFuZ2UgPSBNYXJrZWRSYW5nZTtcblxuKDAsIF91dGlsRXZlbnQuZXZlbnRNaXhpbikoTWFya2VkUmFuZ2UpO1xuXG52YXIgUmFuZ2VTb3J0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVNvcnRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFuZ2VTb3J0ZXIpO1xuXG4gICAgdGhpcy5zb3J0ZWQgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYW5nZVNvcnRlciwgW3tcbiAgICBrZXk6IFwiZmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kKGF0KSB7XG4gICAgICB2YXIgbWluID0gMCxcbiAgICAgICAgICBtYXggPSB0aGlzLnNvcnRlZC5sZW5ndGg7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChtYXggPCBtaW4gKyAxMCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSBtaW47IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVkW2ldLmF0LmNtcChhdCkgPj0gMCkgcmV0dXJuIGk7XG4gICAgICAgICAgfXJldHVybiBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pZCA9IG1pbiArIG1heCA+PiAxO1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRbbWlkXS5hdC5jbXAoYXQpID4gMCkgbWF4ID0gbWlkO2Vsc2UgbWluID0gbWlkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0KG9iaikge1xuICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKHRoaXMuZmluZChvYmouYXQpLCAwLCBvYmopO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKGF0LCByYW5nZSkge1xuICAgICAgdmFyIHBvcyA9IHRoaXMuZmluZChhdCk7XG4gICAgICBmb3IgKHZhciBkaXN0ID0gMDs7IGRpc3QrKykge1xuICAgICAgICB2YXIgbGVmdFBvcyA9IHBvcyAtIGRpc3QgLSAxLFxuICAgICAgICAgICAgcmlnaHRQb3MgPSBwb3MgKyBkaXN0O1xuICAgICAgICBpZiAobGVmdFBvcyA+PSAwICYmIHRoaXMuc29ydGVkW2xlZnRQb3NdLnJhbmdlID09IHJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKGxlZnRQb3MsIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFBvcyA8IHRoaXMuc29ydGVkLmxlbmd0aCAmJiB0aGlzLnNvcnRlZFtyaWdodFBvc10ucmFuZ2UgPT0gcmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLnNvcnRlZC5zcGxpY2UocmlnaHRQb3MsIDEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzb3J0KCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VyID0gdGhpcy5zb3J0ZWRbaV07XG4gICAgICAgIHZhciBhdCA9IGN1ci5hdCA9IGN1ci50eXBlID09IFwib3BlblwiID8gY3VyLnJhbmdlLmZyb20gOiBjdXIucmFuZ2UudG87XG4gICAgICAgIHZhciBwb3MgPSBpO1xuICAgICAgICB3aGlsZSAocG9zID4gMCAmJiB0aGlzLnNvcnRlZFtwb3MgLSAxXS5hdC5jbXAoYXQpID4gMCkge1xuICAgICAgICAgIHRoaXMuc29ydGVkW3Bvc10gPSB0aGlzLnNvcnRlZFtwb3MgLSAxXTtcbiAgICAgICAgICB0aGlzLnNvcnRlZFstLXBvc10gPSBjdXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VTb3J0ZXI7XG59KSgpO1xuXG52YXIgUmFuZ2VTdG9yZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJhbmdlU3RvcmUocG0pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFuZ2VTdG9yZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICB0aGlzLnNvcnRlZCA9IG5ldyBSYW5nZVNvcnRlcigpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJhbmdlU3RvcmUsIFt7XG4gICAga2V5OiBcImFkZFJhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlKSB7XG4gICAgICB0aGlzLnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgIHRoaXMuc29ydGVkLmluc2VydCh7IHR5cGU6IFwib3BlblwiLCBhdDogcmFuZ2UuZnJvbSwgcmFuZ2U6IHJhbmdlIH0pO1xuICAgICAgdGhpcy5zb3J0ZWQuaW5zZXJ0KHsgdHlwZTogXCJjbG9zZVwiLCBhdDogcmFuZ2UudG8sIHJhbmdlOiByYW5nZSB9KTtcbiAgICAgIHRoaXMucG0ubWFya1JhbmdlRGlydHkocmFuZ2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSYW5nZShyYW5nZSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5yYW5nZXMuaW5kZXhPZihyYW5nZSk7XG4gICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICB0aGlzLnJhbmdlcy5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICB0aGlzLnNvcnRlZC5yZW1vdmUocmFuZ2UuZnJvbSwgcmFuZ2UpO1xuICAgICAgICB0aGlzLnNvcnRlZC5yZW1vdmUocmFuZ2UudG8sIHJhbmdlKTtcbiAgICAgICAgdGhpcy5wbS5tYXJrUmFuZ2VEaXJ0eShyYW5nZSk7XG4gICAgICAgIHJhbmdlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNmb3JtKG1hcHBpbmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5yYW5nZXNbaV07XG4gICAgICAgIHJhbmdlLmZyb20gPSBtYXBwaW5nLm1hcChyYW5nZS5mcm9tLCByYW5nZS5vcHRpb25zLmluY2x1c2l2ZUxlZnQgPyAtMSA6IDEpLnBvcztcbiAgICAgICAgcmFuZ2UudG8gPSBtYXBwaW5nLm1hcChyYW5nZS50bywgcmFuZ2Uub3B0aW9ucy5pbmNsdXNpdmVSaWdodCA/IDEgOiAtMSkucG9zO1xuICAgICAgICB2YXIgZGlmZiA9IHJhbmdlLmZyb20uY21wKHJhbmdlLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlLm9wdGlvbnMucmVtb3ZlV2hlbkVtcHR5ICE9PSBmYWxzZSAmJiBkaWZmID49IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVJhbmdlKHJhbmdlKTtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDApIHtcbiAgICAgICAgICByYW5nZS50byA9IHJhbmdlLmZyb207XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc29ydGVkLnJlc29ydCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVSYW5nZVRyYWNrZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aXZlUmFuZ2VUcmFja2VyKCkge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZVRyYWNrZXIodGhpcy5zb3J0ZWQuc29ydGVkKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VTdG9yZTtcbn0pKCk7XG5cbmV4cG9ydHMuUmFuZ2VTdG9yZSA9IFJhbmdlU3RvcmU7XG5cbnZhciBSYW5nZVRyYWNrZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVRyYWNrZXIoc29ydGVkKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlVHJhY2tlcik7XG5cbiAgICB0aGlzLnNvcnRlZCA9IHNvcnRlZDtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5jdXJyZW50ID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VUcmFja2VyLCBbe1xuICAgIGtleTogXCJhZHZhbmNlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZVRvKHBvcykge1xuICAgICAgdmFyIG5leHQgPSB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLnNvcnRlZC5sZW5ndGggJiYgKG5leHQgPSB0aGlzLnNvcnRlZFt0aGlzLnBvc10pLmF0LmNtcChwb3MpIDw9IDApIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IG5leHQucmFuZ2Uub3B0aW9ucy5jbGFzc05hbWU7XG4gICAgICAgIGlmICghY2xhc3NOYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5leHQudHlwZSA9PSBcIm9wZW5cIikgdGhpcy5jdXJyZW50LnB1c2goY2xhc3NOYW1lKTtlbHNlIHRoaXMuY3VycmVudC5zcGxpY2UodGhpcy5jdXJyZW50LmluZGV4T2YoY2xhc3NOYW1lKSwgMSk7XG4gICAgICAgIHRoaXMucG9zKys7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRDaGFuZ2VCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dENoYW5nZUJlZm9yZShwb3MpIHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID09IHRoaXMuc29ydGVkLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5zb3J0ZWRbdGhpcy5wb3NdO1xuICAgICAgICBpZiAoIW5leHQucmFuZ2Uub3B0aW9ucy5jbGFzc05hbWUpIHRoaXMucG9zKys7ZWxzZSBpZiAobmV4dC5hdC5jbXAocG9zKSA+PSAwKSByZXR1cm4gbnVsbDtlbHNlIHJldHVybiBuZXh0LmF0Lm9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmFuZ2VUcmFja2VyO1xufSkoKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5wb3NGcm9tRE9NID0gcG9zRnJvbURPTTtcbmV4cG9ydHMucmFuZ2VGcm9tRE9NTG9vc2UgPSByYW5nZUZyb21ET01Mb29zZTtcbmV4cG9ydHMuZmluZEJ5UGF0aCA9IGZpbmRCeVBhdGg7XG5leHBvcnRzLnJlc29sdmVQYXRoID0gcmVzb2x2ZVBhdGg7XG5leHBvcnRzLmhhc0ZvY3VzID0gaGFzRm9jdXM7XG5leHBvcnRzLnBvc0F0Q29vcmRzID0gcG9zQXRDb29yZHM7XG5leHBvcnRzLmNvb3Jkc0F0UG9zID0gY29vcmRzQXRQb3M7XG5leHBvcnRzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25Gcm9tID0gZmluZFNlbGVjdGlvbkZyb207XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25OZWFyID0gZmluZFNlbGVjdGlvbk5lYXI7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25BdFN0YXJ0ID0gZmluZFNlbGVjdGlvbkF0U3RhcnQ7XG5leHBvcnRzLmZpbmRTZWxlY3Rpb25BdEVuZCA9IGZpbmRTZWxlY3Rpb25BdEVuZDtcbmV4cG9ydHMuc2VsZWN0YWJsZU5vZGVBYm92ZSA9IHNlbGVjdGFibGVOb2RlQWJvdmU7XG5leHBvcnRzLmhhbmRsZU5vZGVDbGljayA9IGhhbmRsZU5vZGVDbGljaztcbmV4cG9ydHMudmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2sgPSB2ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jaztcbmV4cG9ydHMuc2V0RE9NU2VsZWN0aW9uVG9Qb3MgPSBzZXRET01TZWxlY3Rpb25Ub1BvcztcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIFNlbGVjdGlvblN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2VsZWN0aW9uU3RhdGUocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlbGVjdGlvblN0YXRlKTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMucmFuZ2UgPSBmaW5kU2VsZWN0aW9uQXRTdGFydChwbS5kb2MpO1xuICAgIHRoaXMubGFzdE5vbk5vZGVQb3MgPSBudWxsO1xuXG4gICAgdGhpcy5wb2xsU3RhdGUgPSBudWxsO1xuICAgIHRoaXMucG9sbFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSB0aGlzLmxhc3RIZWFkTm9kZSA9IHRoaXMubGFzdEFuY2hvck9mZnNldCA9IHRoaXMubGFzdEhlYWRPZmZzZXQgPSBudWxsO1xuICAgIHRoaXMubGFzdE5vZGUgPSBudWxsO1xuXG4gICAgcG0uY29udGVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlY2VpdmVkRm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhTZWxlY3Rpb25TdGF0ZSwgW3tcbiAgICBrZXk6IFwic2V0QW5kU2lnbmFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEFuZFNpZ25hbChyYW5nZSwgY2xlYXJMYXN0KSB7XG4gICAgICB0aGlzLnNldChyYW5nZSwgY2xlYXJMYXN0KTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNzZWxlY3Rpb25DaGFuZ2VcbiAgICAgIC8vIEluZGljYXRlcyB0aGF0IHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICB0aGlzLnBtLnNpZ25hbChcInNlbGVjdGlvbkNoYW5nZVwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChyYW5nZSwgY2xlYXJMYXN0KSB7XG4gICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICBpZiAoIXJhbmdlLm5vZGUpIHRoaXMubGFzdE5vbk5vZGVQb3MgPSBudWxsO1xuICAgICAgaWYgKGNsZWFyTGFzdCAhPT0gZmFsc2UpIHRoaXMubGFzdEFuY2hvck5vZGUgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb2xsRm9yVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvbGxGb3JVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMucG0uaW5wdXQuY29tcG9zaW5nKSByZXR1cm47XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wb2xsVGltZW91dCk7XG4gICAgICB0aGlzLnBvbGxTdGF0ZSA9IFwidXBkYXRlXCI7XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgICAgY2hlY2sgPSBmdW5jdGlvbiBjaGVjaygpIHtcbiAgICAgICAgaWYgKF90aGlzMi5wbS5pbnB1dC5jb21wb3NpbmcpIHtcbiAgICAgICAgICAvLyBBYm9ydFxuICAgICAgICB9IGVsc2UgaWYgKF90aGlzMi5wbS5vcGVyYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzMi5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIDIwKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFfdGhpczIucmVhZFVwZGF0ZSgpICYmICsrbiA9PSAxKSB7XG4gICAgICAgICAgICBfdGhpczIucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCA1MCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMi5zdG9wUG9sbGluZ0ZvclVwZGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgMjApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wUG9sbGluZ0ZvclVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wUG9sbGluZ0ZvclVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBvbGxTdGF0ZSA9PSBcInVwZGF0ZVwiKSB7XG4gICAgICAgIHRoaXMucG9sbFN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2xsVG9TeW5jKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRvbUNoYW5nZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZG9tQ2hhbmdlZCgpIHtcbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSAhPSB0aGlzLmxhc3RBbmNob3JOb2RlIHx8IHNlbC5hbmNob3JPZmZzZXQgIT0gdGhpcy5sYXN0QW5jaG9yT2Zmc2V0IHx8IHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0SGVhZE5vZGUgfHwgc2VsLmZvY3VzT2Zmc2V0ICE9IHRoaXMubGFzdEhlYWRPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3JlRE9NU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcmVET01TdGF0ZSgpIHtcbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTt0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgICAgdGhpcy5sYXN0SGVhZE5vZGUgPSBzZWwuZm9jdXNOb2RlO3RoaXMubGFzdEhlYWRPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlYWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBtLmlucHV0LmNvbXBvc2luZyB8fCAhaGFzRm9jdXModGhpcy5wbSkgfHwgIXRoaXMuZG9tQ2hhbmdlZCgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKSxcbiAgICAgICAgICBkb2MgPSB0aGlzLnBtLmRvYztcbiAgICAgIHZhciBhbmNob3IgPSBwb3NGcm9tRE9NSW5uZXIodGhpcy5wbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgdmFyIGhlYWQgPSBwb3NGcm9tRE9NSW5uZXIodGhpcy5wbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgIHZhciBuZXdTZWwgPSBmaW5kU2VsZWN0aW9uTmVhcihkb2MsIGhlYWQsIHRoaXMucmFuZ2UuaGVhZCAmJiB0aGlzLnJhbmdlLmhlYWQuY21wKGhlYWQpIDwgMCA/IC0xIDogMSk7XG4gICAgICBpZiAobmV3U2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBkb2MucGF0aChhbmNob3IucGF0aCkuaXNUZXh0YmxvY2spIG5ld1NlbCA9IG5ldyBUZXh0U2VsZWN0aW9uKGFuY2hvciwgbmV3U2VsLmhlYWQpO1xuICAgICAgdGhpcy5zZXRBbmRTaWduYWwobmV3U2VsKTtcbiAgICAgIGlmIChuZXdTZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uIHx8IG5ld1NlbC5oZWFkLmNtcChoZWFkKSB8fCBuZXdTZWwuYW5jaG9yLmNtcChhbmNob3IpKSB7XG4gICAgICAgIHRoaXMudG9ET00oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xlYXJOb2RlKCk7XG4gICAgICAgIHRoaXMuc3RvcmVET01TdGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBvbGxUb1N5bmNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9sbFRvU3luYygpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUpIHJldHVybjtcbiAgICAgIHRoaXMucG9sbFN0YXRlID0gXCJzeW5jXCI7XG4gICAgICB2YXIgc3luYyA9IGZ1bmN0aW9uIHN5bmMoKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IF90aGlzMy5wbS5jb250ZW50KSB7XG4gICAgICAgICAgX3RoaXMzLnBvbGxTdGF0ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFfdGhpczMucG0ub3BlcmF0aW9uICYmICFfdGhpczMucG0uaW5wdXQuY29tcG9zaW5nKSBfdGhpczMuc3luY0RPTSgpO1xuICAgICAgICAgIF90aGlzMy5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoc3luYywgMjAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KHN5bmMsIDIwMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN5bmNET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3luY0RPTSgpIHtcbiAgICAgIGlmICghdGhpcy5wbS5pbnB1dC5jb21wb3NpbmcgJiYgaGFzRm9jdXModGhpcy5wbSkgJiYgdGhpcy5kb21DaGFuZ2VkKCkpIHRoaXMudG9ET00oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9ET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9ET00odGFrZUZvY3VzKSB7XG4gICAgICBpZiAodGhpcy5yYW5nZSBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pIHRoaXMubm9kZVRvRE9NKHRha2VGb2N1cyk7ZWxzZSB0aGlzLnJhbmdlVG9ET00odGFrZUZvY3VzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZVRvRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVUb0RPTSh0YWtlRm9jdXMpIHtcbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIGlmICh0YWtlRm9jdXMpIHRoaXMucG0uY29udGVudC5mb2N1cygpO1xuICAgICAgdmFyIHBvcyA9IHRoaXMucmFuZ2UuZnJvbSxcbiAgICAgICAgICBub2RlID0gdGhpcy5yYW5nZS5ub2RlO1xuICAgICAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHRoaXMucG0uY29udGVudCwgcG9zLnRvUGF0aCgpKTtcbiAgICAgIGlmIChkb20gPT0gdGhpcy5sYXN0Tm9kZSkgcmV0dXJuO1xuICAgICAgdGhpcy5jbGVhck5vZGUoKTtcbiAgICAgIGFkZE5vZGVTZWxlY3Rpb24obm9kZSwgZG9tKTtcbiAgICAgIHRoaXMubGFzdE5vZGUgPSBkb207XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhck5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5sYXN0Tm9kZSkge1xuICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odGhpcy5sYXN0Tm9kZSk7XG4gICAgICAgIHRoaXMubGFzdE5vZGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFuZ2VUb0RPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByYW5nZVRvRE9NKHRha2VGb2N1cykge1xuICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmICghdGhpcy5jbGVhck5vZGUoKSAmJiAhaGFzRm9jdXModGhpcy5wbSkpIHtcbiAgICAgICAgaWYgKCF0YWtlRm9jdXMpIHJldHVybjtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkyMTQ0NFxuICAgICAgICBlbHNlIGlmIChfZG9tLmJyb3dzZXIuZ2Vja28pIHRoaXMucG0uY29udGVudC5mb2N1cygpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRvbUNoYW5nZWQoKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnBtLmNvbnRlbnQ7XG4gICAgICB2YXIgYW5jaG9yID0gRE9NRnJvbVBvcyhjb250ZW50LCB0aGlzLnJhbmdlLmFuY2hvcik7XG4gICAgICB2YXIgaGVhZCA9IERPTUZyb21Qb3MoY29udGVudCwgdGhpcy5yYW5nZS5oZWFkKTtcblxuICAgICAgaWYgKHNlbC5leHRlbmQpIHtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UuYW5jaG9yLmNtcCh0aGlzLnJhbmdlLmhlYWQpID4gMCkge1xuICAgICAgICAgIHZhciB0bXAgPSBhbmNob3I7YW5jaG9yID0gaGVhZDtoZWFkID0gdG1wO1xuICAgICAgICB9XG4gICAgICAgIHJhbmdlLnNldEVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgfVxuICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIGlmIChzZWwuZXh0ZW5kKSBzZWwuZXh0ZW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgdGhpcy5zdG9yZURPTVN0YXRlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlY2VpdmVkRm9jdXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjZWl2ZWRGb2N1cygpIHtcbiAgICAgIGlmICghdGhpcy5wb2xsU3RhdGUpIHRoaXMucG9sbFRvU3luYygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiZWZvcmVTdGFydE9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJlZm9yZVN0YXJ0T3AoKSB7XG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUgPT0gXCJ1cGRhdGVcIiAmJiB0aGlzLnJlYWRVcGRhdGUoKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wb2xsVGltZW91dCk7XG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmdGb3JVcGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZWxlY3Rpb25TdGF0ZTtcbn0pKCk7XG5cbmV4cG9ydHMuU2VsZWN0aW9uU3RhdGUgPSBTZWxlY3Rpb25TdGF0ZTtcblxuZnVuY3Rpb24gY2xlYXJOb2RlU2VsZWN0aW9uKGRvbSkge1xuICBkb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbn1cblxuZnVuY3Rpb24gYWRkTm9kZVNlbGVjdGlvbihfbm9kZSwgZG9tKSB7XG4gIGRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xufVxuXG5mdW5jdGlvbiB3aW5kb3dSZWN0KCkge1xuICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgdG9wOiAwLCBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCB9O1xufVxuXG4vLyA7OyBBbiBlZGl0b3Igc2VsZWN0aW9uLiBDYW4gYmUgb25lIG9mIHR3byBzZWxlY3Rpb24gdHlwZXM6XG4vLyBgVGV4dFNlbGVjdGlvbmAgYW5kIGBOb2RlU2VsZWN0aW9uYC4gQm90aCBoYXZlIHRoZSBwcm9wZXJ0aWVzXG4vLyBsaXN0ZWQgaGVyZSwgYnV0IGFsc28gY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIChzdWNoIGFzIHRoZVxuLy8gc2VsZWN0ZWQgW25vZGVdKCNOb2RlU2VsZWN0aW9uLm5vZGUpIG9yIHRoZVxuLy8gW2hlYWRdKCNUZXh0U2VsZWN0aW9uLmhlYWQpIGFuZCBbYW5jaG9yXSgjVGV4dFNlbGVjdGlvbi5hbmNob3IpKS5cblxudmFyIFNlbGVjdGlvbiA9IGZ1bmN0aW9uIFNlbGVjdGlvbigpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlbGVjdGlvbik7XG59O1xuXG5leHBvcnRzLlNlbGVjdGlvbiA9IFNlbGVjdGlvbjtcblxuLy8gOjogUG9zICNwYXRoPVNlbGVjdGlvbi5wcm90b3R5cGUuZnJvbVxuLy8gVGhlIHN0YXJ0IG9mIHRoZSBzZWxlY3Rpb24uXG5cbi8vIDo6IFBvcyAjcGF0aD1TZWxlY3Rpb24ucHJvdG90eXBlLnRvXG4vLyBUaGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24uXG5cbi8vIDo6IGJvb2wgI3BhdGg9U2VsZWN0aW9uLmVtcHR5XG4vLyBUcnVlIGlmIHRoZSBzZWxlY3Rpb24gaXMgYW4gZW1wdHkgdGV4dCBzZWxlY3Rpb24gKGhlYWQgYW4gYW5jaG9yXG4vLyBhcmUgdGhlIHNhbWUpLlxuXG4vLyA6OiAob3RoZXI6IFNlbGVjdGlvbikg4oaSIGJvb2wgI3BhdGg9U2VsZWN0aW9uLmVxXG4vLyBUZXN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyB0aGUgc2FtZSBhcyBhbm90aGVyIHNlbGVjdGlvbi5cblxuLy8gOjogKGRvYzogTm9kZSwgbWFwcGluZzogTWFwcGFibGUpIOKGkiBTZWxlY3Rpb24gI3BhdGg9U2VsZWN0aW9uLm1hcFxuLy8gTWFwIHRoaXMgc2VsZWN0aW9uIHRocm91Z2ggYSBbbWFwcGFibGVdKCNNYXBwYWJsZSkgdGhpbmcuIGBkb2NgXG4vLyBzaG91bGQgYmUgdGhlIG5ldyBkb2N1bWVudCwgdG8gd2hpY2ggd2UgYXJlIG1hcHBpbmcuXG5cbi8vIDs7ICN0b2M9ZmFsc2UgQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvclxuLy8gc2VsZWN0aW9uLCB3aXRoIGEgaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZVxuLy8gc2lkZSksIGJvdGggb2Ygd2hpY2ggcG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYVxuLy8gcmVndWxhciBjdXJzb3IgcG9zaXRpb24pLlxuXG52YXIgVGV4dFNlbGVjdGlvbiA9IChmdW5jdGlvbiAoX1NlbGVjdGlvbikge1xuICBfaW5oZXJpdHMoVGV4dFNlbGVjdGlvbiwgX1NlbGVjdGlvbik7XG5cbiAgLy8gOjogKFBvcywgP1BvcylcbiAgLy8gQ29uc3RydWN0IGEgdGV4dCBzZWxlY3Rpb24uIFdoZW4gYGhlYWRgIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHNcbiAgLy8gdG8gYGFuY2hvcmAuXG5cbiAgZnVuY3Rpb24gVGV4dFNlbGVjdGlvbihhbmNob3IsIGhlYWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dFNlbGVjdGlvbik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0U2VsZWN0aW9uLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICAvLyA6OiBQb3NcbiAgICAvLyBUaGUgc2VsZWN0aW9uJ3MgaW1tb2JpbGUgc2lkZSAoZG9lcyBub3QgbW92ZSB3aGVuIHByZXNzaW5nXG4gICAgLy8gc2hpZnQtYXJyb3cpLlxuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIC8vIDo6IFBvc1xuICAgIC8vIFRoZSBzZWxlY3Rpb24ncyBtb2JpbGUgc2lkZSAodGhlIHNpZGUgdGhhdCBtb3ZlcyB3aGVuIHByZXNzaW5nXG4gICAgLy8gc2hpZnQtYXJyb3cpLlxuICAgIHRoaXMuaGVhZCA9IGhlYWQgfHwgYW5jaG9yO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBBIG5vZGUgc2VsZWN0aW9uIGlzIGEgc2VsZWN0aW9uIHRoYXQgcG9pbnRzIGF0IGFcbiAgLy8gc2luZ2xlIG5vZGUuIEFsbCBub2RlcyBtYXJrZWQgW3NlbGVjdGFibGVdKCNOb2RlVHlwZS5zZWxlY3RhYmxlKVxuICAvLyBjYW4gYmUgdGhlIHRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGFuIG9iamVjdCwgYGZyb21gXG4gIC8vIGFuZCBgdG9gIHBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRTZWxlY3Rpb24sIFt7XG4gICAga2V5OiBcImVxXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFvdGhlci5oZWFkLmNtcCh0aGlzLmhlYWQpICYmICFvdGhlci5hbmNob3IuY21wKHRoaXMuYW5jaG9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgIHZhciBoZWFkID0gbWFwcGluZy5tYXAodGhpcy5oZWFkKS5wb3M7XG4gICAgICBpZiAoIWRvYy5wYXRoKGhlYWQucGF0aCkuaXNUZXh0YmxvY2spIHJldHVybiBmaW5kU2VsZWN0aW9uTmVhcihkb2MsIGhlYWQpO1xuICAgICAgdmFyIGFuY2hvciA9IG1hcHBpbmcubWFwKHRoaXMuYW5jaG9yKS5wb3M7XG4gICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnBhdGgoYW5jaG9yLnBhdGgpLmlzVGV4dGJsb2NrID8gYW5jaG9yIDogaGVhZCwgaGVhZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludmVydGVkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmNob3IuY21wKHRoaXMuaGVhZCkgPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZlcnRlZCA/IHRoaXMuaGVhZCA6IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0ZWQgPyB0aGlzLmFuY2hvciA6IHRoaXMuaGVhZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFuY2hvci5jbXAodGhpcy5oZWFkKSA9PSAwO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0U2VsZWN0aW9uO1xufSkoU2VsZWN0aW9uKTtcblxuZXhwb3J0cy5UZXh0U2VsZWN0aW9uID0gVGV4dFNlbGVjdGlvbjtcblxudmFyIE5vZGVTZWxlY3Rpb24gPSAoZnVuY3Rpb24gKF9TZWxlY3Rpb24yKSB7XG4gIF9pbmhlcml0cyhOb2RlU2VsZWN0aW9uLCBfU2VsZWN0aW9uMik7XG5cbiAgLy8gOjogKFBvcywgUG9zLCBOb2RlKVxuICAvLyBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgLy8gYXJndW1lbnRzLiBVc2UgYFByb3NlTWlycm9yLnNldE5vZGVTZWxlY3Rpb25gIGZvciBhbiBlYXNpZXIsXG4gIC8vIGVycm9yLWNoZWNraW5nIHdheSB0byBjcmVhdGUgYSBub2RlIHNlbGVjdGlvbi5cblxuICBmdW5jdGlvbiBOb2RlU2VsZWN0aW9uKGZyb20sIHRvLCBub2RlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGVTZWxlY3Rpb24pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTm9kZVNlbGVjdGlvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB0aGlzLnRvID0gdG87XG4gICAgLy8gOjogTm9kZSBUaGUgc2VsZWN0ZWQgbm9kZS5cbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGVTZWxlY3Rpb24sIFt7XG4gICAga2V5OiBcImVxXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmICF0aGlzLmZyb20uY21wKG90aGVyLmZyb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgdmFyIGZyb20gPSBtYXBwaW5nLm1hcCh0aGlzLmZyb20sIDEpLnBvcztcbiAgICAgIHZhciB0byA9IG1hcHBpbmcubWFwKHRoaXMudG8sIC0xKS5wb3M7XG4gICAgICBpZiAoX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ub2Zmc2V0ID09IHRvLm9mZnNldCAtIDEpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb2Mubm9kZUFmdGVyKGZyb20pO1xuICAgICAgICBpZiAobm9kZS50eXBlLnNlbGVjdGFibGUpIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihmcm9tLCB0bywgbm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBmcm9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZVNlbGVjdGlvbjtcbn0pKFNlbGVjdGlvbik7XG5cbmV4cG9ydHMuTm9kZVNlbGVjdGlvbiA9IE5vZGVTZWxlY3Rpb247XG5cbmZ1bmN0aW9uIHBhdGhGcm9tRE9NKHBtLCBub2RlKSB7XG4gIHZhciBwYXRoID0gW107XG4gIGZvciAoOyBub2RlICE9IHBtLmNvbnRlbnQ7KSB7XG4gICAgdmFyIGF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiKTtcbiAgICBpZiAoYXR0cikgcGF0aC51bnNoaWZ0KCthdHRyKTtcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5mdW5jdGlvbiB3aWR0aEZyb21ET00oZG9tKSB7XG4gIHZhciBhdHRyID0gZG9tLmdldEF0dHJpYnV0ZShcInBtLWxlYWZcIik7XG4gIHJldHVybiBhdHRyICYmIGF0dHIgIT0gXCJ0cnVlXCIgPyArYXR0ciA6IDE7XG59XG5cbmZ1bmN0aW9uIHBvc0Zyb21ET01Jbm5lcihwbSwgZG9tLCBkb21PZmZzZXQsIGxvb3NlKSB7XG4gIGlmICghbG9vc2UgJiYgcG0ub3BlcmF0aW9uICYmIHBtLmRvYyAhPSBwbS5vcGVyYXRpb24uZG9jKSB0aHJvdyBuZXcgRXJyb3IoXCJGZXRjaGluZyBhIHBvc2l0aW9uIGZyb20gYW4gb3V0ZGF0ZWQgRE9NIHN0cnVjdHVyZVwiKTtcblxuICB2YXIgZXh0cmFPZmZzZXQgPSAwLFxuICAgICAgdGFnID0gdW5kZWZpbmVkO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGFkanVzdCA9IDA7XG4gICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICBleHRyYU9mZnNldCArPSBkb21PZmZzZXQ7XG4gICAgfSBlbHNlIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpIHx8IGRvbSA9PSBwbS5jb250ZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHRhZyA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpIHtcbiAgICAgIGV4dHJhT2Zmc2V0ICs9ICt0YWc7XG4gICAgICBhZGp1c3QgPSAtMTtcbiAgICB9IGVsc2UgaWYgKGRvbU9mZnNldCAmJiBkb21PZmZzZXQgPT0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBhZGp1c3QgPSAxO1xuICAgIH1cblxuICAgIHZhciBfcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgZG9tT2Zmc2V0ID0gYWRqdXN0IDwgMCA/IDAgOiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKF9wYXJlbnQuY2hpbGROb2RlcywgZG9tKSArIGFkanVzdDtcbiAgICBkb20gPSBfcGFyZW50O1xuICB9XG5cbiAgdmFyIHBhdGggPSBwYXRoRnJvbURPTShwbSwgZG9tKTtcbiAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpKSByZXR1cm4gX21vZGVsLlBvcy5mcm9tKHBhdGgsIGV4dHJhT2Zmc2V0ICsgKGRvbU9mZnNldCA/IDEgOiAwKSk7XG5cbiAgdmFyIG9mZnNldCA9IDA7XG4gIGZvciAodmFyIGkgPSBkb21PZmZzZXQgLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBjaGlsZCA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICBpZiAobG9vc2UpIGV4dHJhT2Zmc2V0ICs9IGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh0YWcgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIG9mZnNldCA9ICt0YWcgKyB3aWR0aEZyb21ET00oY2hpbGQpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChsb29zZSAmJiAhY2hpbGQuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpKSB7XG4gICAgICBleHRyYU9mZnNldCArPSBjaGlsZC50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQgKyBleHRyYU9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHBvc0Zyb21ET00ocG0sIG5vZGUsIG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID09IG51bGwpIHtcbiAgICBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBub2RlKTtcbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBwb3NGcm9tRE9NSW5uZXIocG0sIG5vZGUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlRnJvbURPTUxvb3NlKHBtKSB7XG4gIGlmICghaGFzRm9jdXMocG0pKSByZXR1cm4gbnVsbDtcbiAgdmFyIHNlbCA9IGdldFNlbGVjdGlvbigpO1xuICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24ocG9zRnJvbURPTUlubmVyKHBtLCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgdHJ1ZSksIHBvc0Zyb21ET01Jbm5lcihwbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCB0cnVlKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRCeVBhdGgobm9kZSwgbiwgZnJvbUVuZCkge1xuICBmb3IgKHZhciBjaCA9IGZyb21FbmQgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuZmlyc3RDaGlsZDsgY2g7IGNoID0gZnJvbUVuZCA/IGNoLnByZXZpb3VzU2libGluZyA6IGNoLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoLm5vZGVUeXBlICE9IDEpIGNvbnRpbnVlO1xuICAgIHZhciBvZmZzZXQgPSBjaC5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIik7XG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIHZhciBmb3VuZCA9IGZpbmRCeVBhdGgoY2gsIG4pO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfSBlbHNlIGlmICgrb2Zmc2V0ID09IG4pIHtcbiAgICAgIHJldHVybiBjaDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGFyZW50LCBwYXRoKSB7XG4gIHZhciBub2RlID0gcGFyZW50O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gZmluZEJ5UGF0aChub2RlLCBwYXRoW2ldKTtcbiAgICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byByZXNvbHZlIHBhdGggXCIgKyBwYXRoLmpvaW4oXCIvXCIpKTtcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZmluZEJ5T2Zmc2V0KG5vZGUsIG9mZnNldCwgYWZ0ZXIpIHtcbiAgZnVuY3Rpb24gc2VhcmNoKG5vZGUpIHtcbiAgICBmb3IgKHZhciBjaCA9IG5vZGUuZmlyc3RDaGlsZCwgaSA9IDAsIGF0dHIgPSB1bmRlZmluZWQ7IGNoOyBjaCA9IGNoLm5leHRTaWJsaW5nLCBpKyspIHtcbiAgICAgIGlmIChjaC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICAgIGlmIChhdHRyID0gY2guZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICAgIHZhciBkaWZmID0gb2Zmc2V0IC0gK2F0dHIsXG4gICAgICAgICAgICB3aWR0aCA9IHdpZHRoRnJvbURPTShjaCk7XG4gICAgICAgIGlmIChkaWZmID49IDAgJiYgKGFmdGVyID8gZGlmZiA8PSB3aWR0aCA6IGRpZmYgPCB3aWR0aCkpIHJldHVybiB7IG5vZGU6IGNoLCBvZmZzZXQ6IGksIGlubmVyT2Zmc2V0OiBkaWZmIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gc2VhcmNoKGNoKTtcbiAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlYXJjaChub2RlKTtcbn1cblxuZnVuY3Rpb24gbGVhZkF0KG5vZGUsIG9mZnNldCkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgIGlmICghY2hpbGQpIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIHJldHVybiB7IG5vZGU6IGNoaWxkLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBub2RlT2Zmc2V0ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG5leHRTaWIgPSBjaGlsZC5uZXh0U2libGluZyxcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbmV4dFNpYiB8fCAobmV4dE9mZnNldCA9ICtuZXh0U2liLmdldEF0dHJpYnV0ZShcInBtLWlubmVyLW9mZnNldFwiKSkgPj0gb2Zmc2V0KSBicmVhaztcbiAgICAgICAgY2hpbGQgPSBuZXh0U2liO1xuICAgICAgICBub2RlT2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgICAgIH1cbiAgICAgIG9mZnNldCAtPSBub2RlT2Zmc2V0O1xuICAgIH1cbiAgICBub2RlID0gY2hpbGQ7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgYSBET00gZWxlbWVudCBhdCBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IHBhcmVudCBUaGUgcGFyZW50IERPTSBub2RlLlxuICogQHBhcmFtIHtQb3N9IHBvcyAgICAgVGhlIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqIEByZXR1cm4ge09iamVjdH0gICAgIFRoZSBET00gbm9kZSBhbmQgY2hhcmFjdGVyIG9mZnNldCBpbnNpZGUgdGhlIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIERPTUZyb21Qb3MocGFyZW50LCBwb3MpIHtcbiAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHBhcmVudCwgcG9zLnBhdGgpO1xuICB2YXIgZm91bmQgPSBmaW5kQnlPZmZzZXQoZG9tLCBwb3Mub2Zmc2V0LCB0cnVlKSxcbiAgICAgIGlubmVyID0gdW5kZWZpbmVkO1xuICBpZiAoIWZvdW5kKSByZXR1cm4geyBub2RlOiBkb20sIG9mZnNldDogMCB9O1xuICBpZiAoZm91bmQubm9kZS5nZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpID09IFwidHJ1ZVwiIHx8ICEoaW5uZXIgPSBsZWFmQXQoZm91bmQubm9kZSwgZm91bmQuaW5uZXJPZmZzZXQpKSkgcmV0dXJuIHsgbm9kZTogZm91bmQubm9kZS5wYXJlbnROb2RlLCBvZmZzZXQ6IGZvdW5kLm9mZnNldCArIChmb3VuZC5pbm5lck9mZnNldCA/IDEgOiAwKSB9O2Vsc2UgcmV0dXJuIGlubmVyO1xufVxuXG5mdW5jdGlvbiBoYXNGb2N1cyhwbSkge1xuICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICByZXR1cm4gc2VsLnJhbmdlQ291bnQgJiYgKDAsIF9kb20uY29udGFpbnMpKHBtLmNvbnRlbnQsIHNlbC5hbmNob3JOb2RlKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtICB7UHJvc2VNaXJyb3J9IHBtICAgICBFZGl0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgY29vcmRzIFRoZSB4LCB5IGNvb3JkaW5hdGVzLlxuICogQHJldHVybiB7UG9zfVxuICovXG4vLyBGSVhNRSBmYWlscyBvbiB0aGUgc3BhY2UgYmV0d2VlbiBsaW5lc1xuLy8gRklYTUUgcmVmb3JtdWxhdGUgYXMgc2VsZWN0aW9uQXRDb29yZHM/IFNvIHRoYXQgaXQgY2FuJ3QgcmV0dXJuIG51bGxcblxuZnVuY3Rpb24gcG9zQXRDb29yZHMocG0sIGNvb3Jkcykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY29vcmRzLmxlZnQsIGNvb3Jkcy50b3AgKyAxKTtcbiAgaWYgKCEoMCwgX2RvbS5jb250YWlucykocG0uY29udGVudCwgZWxlbWVudCkpIHJldHVybiBudWxsO1xuXG4gIHZhciBvZmZzZXQgPSB1bmRlZmluZWQ7XG4gIGlmIChlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgZWxlbWVudC5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgIG9mZnNldCA9IG9mZnNldEluVGV4dE5vZGUoZWxlbWVudCwgY29vcmRzKTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXQgPSBvZmZzZXRJbkVsZW1lbnQoZWxlbWVudCwgY29vcmRzKTtcbiAgfVxuXG4gIHJldHVybiBwb3NGcm9tRE9NKHBtLCBlbGVtZW50LCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0UmVjdChub2RlLCBmcm9tLCB0bykge1xuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgcmV0dXJuIHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlIGNoYXJhY3RlciBhdFxuICogdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbiAqXG4gKiBAcGFyYW0gIHtQcm9zZU1pcnJvcn0gcG0gVGhlIGVkaXRvciBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge1Bvc30gICAgICAgICBwb3NcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJvdW5kaW5nIGJveC5cbiAqL1xuXG5mdW5jdGlvbiBjb29yZHNBdFBvcyhwbSwgcG9zKSB7XG4gIHZhciBfRE9NRnJvbVBvcyA9IERPTUZyb21Qb3MocG0uY29udGVudCwgcG9zKTtcblxuICB2YXIgbm9kZSA9IF9ET01Gcm9tUG9zLm5vZGU7XG4gIHZhciBvZmZzZXQgPSBfRE9NRnJvbVBvcy5vZmZzZXQ7XG5cbiAgdmFyIHNpZGUgPSB1bmRlZmluZWQsXG4gICAgICByZWN0ID0gdW5kZWZpbmVkO1xuICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgaWYgKG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgcmVjdCA9IHRleHRSZWN0KG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSk7XG4gICAgICBzaWRlID0gXCJsZWZ0XCI7XG4gICAgfVxuICAgIGlmICgoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpICYmIG9mZnNldCkge1xuICAgICAgcmVjdCA9IHRleHRSZWN0KG5vZGUsIG9mZnNldCAtIDEsIG9mZnNldCk7XG4gICAgICBzaWRlID0gXCJyaWdodFwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICByZWN0ID0gY2hpbGQubm9kZVR5cGUgPT0gMyA/IHRleHRSZWN0KGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKSA6IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc2lkZSA9IFwibGVmdFwiO1xuICAgIH1cbiAgICBpZiAoKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KSAmJiBvZmZzZXQpIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgIHJlY3QgPSBjaGlsZC5ub2RlVHlwZSA9PSAzID8gdGV4dFJlY3QoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpIDogY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBzaWRlID0gXCJyaWdodFwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBzaWRlID0gXCJsZWZ0XCI7XG4gIH1cbiAgdmFyIHggPSByZWN0W3NpZGVdO1xuICByZXR1cm4geyB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QuYm90dG9tLCBsZWZ0OiB4LCByaWdodDogeCB9O1xufVxuXG52YXIgc2Nyb2xsTWFyZ2luID0gNTtcblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcocG0sIHBvcykge1xuICBpZiAoIXBvcykgcG9zID0gcG0uc2VsLnJhbmdlLmhlYWQgfHwgcG0uc2VsLnJhbmdlLmZyb207XG4gIHZhciBjb29yZHMgPSBjb29yZHNBdFBvcyhwbSwgcG9zKTtcbiAgZm9yICh2YXIgX3BhcmVudDIgPSBwbS5jb250ZW50OzsgX3BhcmVudDIgPSBfcGFyZW50Mi5wYXJlbnROb2RlKSB7XG4gICAgdmFyIGF0Qm9keSA9IF9wYXJlbnQyID09IGRvY3VtZW50LmJvZHk7XG4gICAgdmFyIHJlY3QgPSBhdEJvZHkgPyB3aW5kb3dSZWN0KCkgOiBfcGFyZW50Mi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB2YXIgbW92ZVggPSAwLFxuICAgICAgICBtb3ZlWSA9IDA7XG4gICAgaWYgKGNvb3Jkcy50b3AgPCByZWN0LnRvcCkgbW92ZVkgPSAtKHJlY3QudG9wIC0gY29vcmRzLnRvcCArIHNjcm9sbE1hcmdpbik7ZWxzZSBpZiAoY29vcmRzLmJvdHRvbSA+IHJlY3QuYm90dG9tKSBtb3ZlWSA9IGNvb3Jkcy5ib3R0b20gLSByZWN0LmJvdHRvbSArIHNjcm9sbE1hcmdpbjtcbiAgICBpZiAoY29vcmRzLmxlZnQgPCByZWN0LmxlZnQpIG1vdmVYID0gLShyZWN0LmxlZnQgLSBjb29yZHMubGVmdCArIHNjcm9sbE1hcmdpbik7ZWxzZSBpZiAoY29vcmRzLnJpZ2h0ID4gcmVjdC5yaWdodCkgbW92ZVggPSBjb29yZHMucmlnaHQgLSByZWN0LnJpZ2h0ICsgc2Nyb2xsTWFyZ2luO1xuICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgaWYgKGF0Qm9keSkgd2luZG93LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtb3ZlWSkgX3BhcmVudDIuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgaWYgKG1vdmVYKSBfcGFyZW50Mi5zY3JvbGxMZWZ0ICs9IG1vdmVYO1xuICAgIH1cbiAgICBpZiAoYXRCb2R5KSBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMsIHN0cmljdCkge1xuICB2YXIgeSA9IGNvb3Jkcy50b3A7XG4gIHZhciB4ID0gY29vcmRzLmxlZnQ7XG5cbiAgdmFyIG1pblkgPSAxZTgsXG4gICAgICBtaW5YID0gMWU4LFxuICAgICAgb2Zmc2V0ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZWN0ID0gcmVjdHNbaV07XG4gICAgaWYgKCFyZWN0IHx8IHJlY3QudG9wID09IHJlY3QuYm90dG9tKSBjb250aW51ZTtcbiAgICB2YXIgZFggPSB4IDwgcmVjdC5sZWZ0ID8gcmVjdC5sZWZ0IC0geCA6IHggPiByZWN0LnJpZ2h0ID8geCAtIHJlY3QucmlnaHQgOiAwO1xuICAgIGlmIChkWCA+IG1pblgpIGNvbnRpbnVlO1xuICAgIGlmIChkWCA8IG1pblgpIHtcbiAgICAgIG1pblggPSBkWDttaW5ZID0gMWU4O1xuICAgIH1cbiAgICB2YXIgZFkgPSB5IDwgcmVjdC50b3AgPyByZWN0LnRvcCAtIHkgOiB5ID4gcmVjdC5ib3R0b20gPyB5IC0gcmVjdC5ib3R0b20gOiAwO1xuICAgIGlmIChkWSA8IG1pblkpIHtcbiAgICAgIG1pblkgPSBkWTtcbiAgICAgIG9mZnNldCA9IHggPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gaSA6IGkgKyAxO1xuICAgIH1cbiAgfVxuICBpZiAoc3RyaWN0ICYmIChtaW5YIHx8IG1pblkpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5UZXh0Tm9kZSh0ZXh0LCBjb29yZHMsIHN0cmljdCkge1xuICB2YXIgbGVuID0gdGV4dC5ub2RlVmFsdWUubGVuZ3RoO1xuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICB2YXIgcmVjdHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJhbmdlLnNldEVuZCh0ZXh0LCBpICsgMSk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQodGV4dCwgaSk7XG4gICAgcmVjdHMucHVzaChyYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldEluUmVjdHMoY29vcmRzLCByZWN0cywgc3RyaWN0KTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5FbGVtZW50KGVsZW1lbnQsIGNvb3Jkcykge1xuICB2YXIgcmVjdHMgPSBbXTtcbiAgZm9yICh2YXIgY2hpbGQgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgcmVjdHMucHVzaChjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7ZWxzZSByZWN0cy5wdXNoKG51bGwpO1xuICB9XG4gIHJldHVybiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMpO1xufVxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBvZmZzZXQsIGRpciwgdGV4dCkge1xuICB2YXIgbm9kZSA9IGRvYy5wYXRoKHBhdGgpO1xuICBpZiAobm9kZS5pc1RleHRibG9jaykgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCkpO1xuXG4gIGZvciAodmFyIGkgPSBvZmZzZXQgKyAoZGlyID4gMCA/IDAgOiAtMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5zaXplIDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQoaSk7XG4gICAgaWYgKCF0ZXh0ICYmIGNoaWxkLnR5cGUuY29udGFpbnMgPT0gbnVsbCAmJiBjaGlsZC50eXBlLnNlbGVjdGFibGUpIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBpKSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgaSArIDEpLCBjaGlsZCk7XG4gICAgcGF0aC5wdXNoKGkpO1xuICAgIHZhciBpbnNpZGUgPSBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBkaXIgPCAwID8gY2hpbGQuc2l6ZSA6IDAsIGRpciwgdGV4dCk7XG4gICAgaWYgKGluc2lkZSkgcmV0dXJuIGluc2lkZTtcbiAgICBwYXRoLnBvcCgpO1xuICB9XG59XG5cbi8vIEZJWE1FIHdlJ2xsIG5lZWQgc29tZSBhd2FyZW5lc3Mgb2YgYmlkaSBtb3Rpb24gd2hlbiBkZXRlcm1pbmluZyBibG9jayBzdGFydCBhbmQgZW5kXG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25Gcm9tKGRvYywgcG9zLCBkaXIsIHRleHQpIHtcbiAgZm9yICh2YXIgcGF0aCA9IHBvcy5wYXRoLnNsaWNlKCksIG9mZnNldCA9IHBvcy5vZmZzZXQ7Oykge1xuICAgIHZhciBmb3VuZCA9IGZpbmRTZWxlY3Rpb25Jbihkb2MsIHBhdGgsIG9mZnNldCwgZGlyLCB0ZXh0KTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSBicmVhaztcbiAgICBvZmZzZXQgPSBwYXRoLnBvcCgpICsgKGRpciA+IDAgPyAxIDogMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBwb3MsIGJpYXMsIHRleHQpIHtcbiAgaWYgKGJpYXMgPT09IHVuZGVmaW5lZCkgYmlhcyA9IDE7XG5cbiAgdmFyIHJlc3VsdCA9IGZpbmRTZWxlY3Rpb25Gcm9tKGRvYywgcG9zLCBiaWFzLCB0ZXh0KSB8fCBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgLWJpYXMsIHRleHQpO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiU2VhcmNoaW5nIGZvciBzZWxlY3Rpb24gaW4gaW52YWxpZCBkb2N1bWVudCBcIiArIGRvYyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25BdFN0YXJ0KG5vZGUsIHBhdGgsIHRleHQpIHtcbiAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcGF0aCA9IFtdO1xuXG4gIHJldHVybiBmaW5kU2VsZWN0aW9uSW4obm9kZSwgcGF0aC5zbGljZSgpLCAwLCAxLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbkF0RW5kKG5vZGUsIHBhdGgsIHRleHQpIHtcbiAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcGF0aCA9IFtdO1xuXG4gIHJldHVybiBmaW5kU2VsZWN0aW9uSW4obm9kZSwgcGF0aC5zbGljZSgpLCBub2RlLnNpemUsIC0xLCB0ZXh0KTtcbn1cblxuLy8gOzsgI3BhdGg9Tm9kZVR5cGUgI2tpbmQ9Y2xhc3MgI25vQW5jaG9yXG4vLyBZb3UgY2FuIGFkZCBzZXZlcmFsIHByb3BlcnRpZXMgdG8gW25vZGUgdHlwZXNdKCNOb2RlVHlwZSkgdG9cbi8vIGluZmx1ZW5jZSB0aGUgd2F5IHRoZSBlZGl0b3IgaW50ZXJhY3RzIHdpdGggdGhlbS5cblxuLy8gOjogKG5vZGU6IE5vZGUsIHBhdGg6IFtudW1iZXJdLCBkb206IERPTU5vZGUsIGNvb3Jkczoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9KSDihpIgP1Bvc1xuLy8gI3BhdGg9Tm9kZVR5cGUucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZFxuLy8gU3BlY2lmaWVzIHRoYXQsIGlmIHRoaXMgbm9kZSBpcyBjbGlja2VkLCBhIGNoaWxkIG5vZGUgbWlnaHRcbi8vIGFjdHVhbGx5IGJlIG1lYW50LiBUaGlzIGlzIHVzZWQgdG8sIGZvciBleGFtcGxlLCBtYWtlIGNsaWNraW5nIGFcbi8vIGxpc3QgbWFya2VyICh3aGljaCwgaW4gdGhlIERPTSwgaXMgcGFydCBvZiB0aGUgbGlzdCBub2RlKSBzZWxlY3Rcbi8vIHRoZSBsaXN0IGl0ZW0gaXQgYmVsb25ncyB0by4gU2hvdWxkIHJldHVybiBudWxsIGlmIHRoZSBnaXZlblxuLy8gY29vcmRpbmF0ZXMgZG9uJ3QgcmVmZXIgdG8gYSBjaGlsZCBub2RlLCBvciB0aGUgW3Bvc2l0aW9uXSgjUG9zKVxuLy8gYmVmb3JlIHRoZWNoaWxkIG90aGVyd2lzZS5cblxuZnVuY3Rpb24gc2VsZWN0YWJsZU5vZGVBYm92ZShwbSwgZG9tLCBjb29yZHMsIGxpYmVyYWwpIHtcbiAgZm9yICg7IGRvbSAmJiBkb20gIT0gcG0uY29udGVudDsgZG9tID0gZG9tLnBhcmVudE5vZGUpIHtcbiAgICBpZiAoZG9tLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkge1xuICAgICAgdmFyIHBhdGggPSBwYXRoRnJvbURPTShwbSwgZG9tKSxcbiAgICAgICAgICBub2RlID0gcG0uZG9jLnBhdGgocGF0aCk7XG4gICAgICBpZiAobm9kZS50eXBlLmNvdW50Q29vcmRzQXNDaGlsZCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbm9kZS50eXBlLmNvdW50Q29vcmRzQXNDaGlsZChub2RlLCBwYXRoLCBkb20sIGNvb3Jkcyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZWFmIG5vZGVzIGFyZSBpbXBsaWNpdGx5IGNsaWNrYWJsZVxuICAgICAgaWYgKChsaWJlcmFsIHx8IG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSAmJiBub2RlLnR5cGUuc2VsZWN0YWJsZSkgcmV0dXJuIF9tb2RlbC5Qb3MuZnJvbShwYXRoKTtcbiAgICAgIGlmICghbGliZXJhbCkgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8vIDo6IChwbTogUHJvc2VNaXJyb3IsIGV2ZW50OiBNb3VzZUV2ZW50LCBwYXRoOiBbbnVtYmVyXSwgbm9kZTogTm9kZSkg4oaSIGJvb2xcbi8vICNwYXRoPU5vZGVUeXBlLnByb3RvdHlwZS5oYW5kbGVDbGlja1xuLy8gSWYgYSBub2RlIGlzIGRpcmVjdGx5IGNsaWNrZWQgKHRoYXQgaXMsIHRoZSBjbGljayBkaWRuJ3QgbGFuZCBpbiBhXG4vLyBET00gbm9kZSBiZWxvbmdpbmcgdG8gYSBjaGlsZCBub2RlKSwgYW5kIGl0cyB0eXBlIGhhcyBhXG4vLyBgaGFuZGxlQ2xpY2tgIG1ldGhvZCwgdGhhdCBtZXRob2QgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gaGFuZGxlIHRoZVxuLy8gY2xpY2suIFRoZSBtZXRob2QgaXMgY2FsbGVkLCBhbmQgc2hvdWxkIHJldHVybiBgZmFsc2VgIGlmIGl0IGRpZFxuLy8gX25vdF8gaGFuZGxlIHRoZSBjbGljay5cbi8vXG4vLyBUaGUgYGV2ZW50YCBwYXNzZWQgaXMgdGhlIGV2ZW50IGZvciBgXCJtb3VzZWRvd25cImAsIGJ1dCBjYWxsaW5nXG4vLyBgcHJldmVudERlZmF1bHRgIG9uIGl0IGhhcyBubyBlZmZlY3QsIHNpbmNlIHRoaXMgbWV0aG9kIGlzIG9ubHlcbi8vIGNhbGxlZCBhZnRlciBhIGNvcnJlc3BvbmRpbmcgYFwibW91c2V1cFwiYCBoYXMgb2NjdXJyZWQgYW5kXG4vLyBQcm9zZU1pcnJvciBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoaXMgaXMgbm90IGEgZHJhZyBvciBtdWx0aS1jbGlja1xuLy8gZXZlbnQuXG5cbmZ1bmN0aW9uIGhhbmRsZU5vZGVDbGljayhwbSwgZXZlbnQpIHtcbiAgZm9yICh2YXIgZG9tID0gZXZlbnQudGFyZ2V0OyBkb20gJiYgZG9tICE9IHBtLmNvbnRlbnQ7IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSksXG4gICAgICAgICAgbm9kZSA9IHBtLmRvYy5wYXRoKHBhdGgpO1xuICAgICAgcmV0dXJuIG5vZGUudHlwZS5oYW5kbGVDbGljayAmJiBub2RlLnR5cGUuaGFuZGxlQ2xpY2socG0sIGV2ZW50LCBwYXRoLCBub2RlKSAhPT0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZlcnRpY2FsTW90aW9uTGVhdmVzVGV4dGJsb2NrKHBtLCBwb3MsIGRpcikge1xuICB2YXIgZG9tID0gcmVzb2x2ZVBhdGgocG0uY29udGVudCwgcG9zLnBhdGgpO1xuICB2YXIgY29vcmRzID0gY29vcmRzQXRQb3MocG0sIHBvcyk7XG4gIGZvciAodmFyIGNoaWxkID0gZG9tLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9IDEpIGNvbnRpbnVlO1xuICAgIHZhciBib3hlcyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGJveCA9IGJveGVzW2ldO1xuICAgICAgaWYgKGRpciA8IDAgPyBib3guYm90dG9tIDwgY29vcmRzLnRvcCA6IGJveC50b3AgPiBjb29yZHMuYm90dG9tKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzZXRET01TZWxlY3Rpb25Ub1BvcyhwbSwgcG9zKSB7XG4gIHZhciBfRE9NRnJvbVBvczIgPSBET01Gcm9tUG9zKHBtLmNvbnRlbnQsIHBvcyk7XG5cbiAgdmFyIG5vZGUgPSBfRE9NRnJvbVBvczIubm9kZTtcbiAgdmFyIG9mZnNldCA9IF9ET01Gcm9tUG9zMi5vZmZzZXQ7XG5cbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG9mZnNldCk7XG4gIHJhbmdlLnNldFN0YXJ0KG5vZGUsIG9mZnNldCk7XG4gIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9pbnB1dHJ1bGVzID0gcmVxdWlyZShcIi4vaW5wdXRydWxlc1wiKTtcblxuLy8gOjogYm9vbCAjcGF0aD1hdXRvSW5wdXQgI2tpbmQ9b3B0aW9uXG4vLyBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBpbnB1dCBydWxlcyBzdG9yZWQgdW5kZXIgdGhlXG4vLyBgXCJhdXRvSW5wdXRcImAgbmFtZSBpbiB0aGUgZWRpdG9yJ3Ncbi8vIFtgcmVnaXN0cnlgXSgjUHJvc2VNaXJyb3IucmVnaXN0cnkp4oCUYnkgZGVmYXVsdCwgdGhlc2UgYXJlIHRoaW5nc1xuLy8gbGlrZSBzbWFydCBxdW90ZXMsIGFuZCBhdXRvbWF0aWNhbGx5IHdyYXBwaW5nIGEgYmxvY2sgaW4gYSBsaXN0IGlmXG4vLyB5b3Ugc3RhcnQgaXQgd2l0aCBgXCIxLiBcImAuXG4oMCwgX2VkaXQuZGVmaW5lT3B0aW9uKShcImF1dG9JbnB1dFwiLCBmYWxzZSwgZnVuY3Rpb24gKHBtLCB2YWwpIHtcbiAgaWYgKHBtLm1vZC5hdXRvSW5wdXQpIHtcbiAgICBwbS5tb2QuYXV0b0lucHV0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiAoMCwgX2lucHV0cnVsZXMucmVtb3ZlSW5wdXRSdWxlKShwbSwgbmFtZSk7XG4gICAgfSk7XG4gICAgcG0ubW9kLmF1dG9JbnB1dCA9IG51bGw7XG4gIH1cbiAgaWYgKHZhbCkge1xuICAgIHBtLm1vZC5hdXRvSW5wdXQgPSBbXTtcbiAgICBwbS5yZWdpc3RyeShcImF1dG9JbnB1dFwiLCBmdW5jdGlvbiAocnVsZSwgdHlwZSkge1xuICAgICAgcG0ubW9kLmF1dG9JbnB1dC5wdXNoKHJ1bGUubmFtZSk7XG4gICAgICBpZiAocnVsZS5oYW5kbGVyLmJpbmQpIHJ1bGUgPSBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKHJ1bGUubmFtZSwgcnVsZS5tYXRjaCwgcnVsZS5maWx0ZXIsIHJ1bGUuaGFuZGxlci5iaW5kKHR5cGUpKTtcbiAgICAgICgwLCBfaW5wdXRydWxlcy5hZGRJbnB1dFJ1bGUpKHBtLCBydWxlKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiZW1EYXNoXCIsIC8tLSQvLCBcIi1cIiwgXCLigJRcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcIm9wZW5Eb3VibGVRdW90ZVwiLCAvXFxzKFwiKSQvLCAnXCInLCBcIuKAnFwiKSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiY2xvc2VEb3VibGVRdW90ZVwiLCAvXCIkLywgJ1wiJywgXCLigJ1cIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcIm9wZW5TaW5nbGVRdW90ZVwiLCAvXFxzKCcpJC8sIFwiJ1wiLCBcIuKAmFwiKSk7XG5cbl9lZGl0LmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwiY2xvc2VTaW5nbGVRdW90ZVwiLCAvJyQvLCBcIidcIiwgXCLigJlcIikpO1xuXG5fbW9kZWwuQmxvY2tRdW90ZS5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRCbG9ja1F1b3RlXCIsIC9eXFxzKj4gJC8sIFwiIFwiLCBmdW5jdGlvbiAocG0sIF8sIHBvcykge1xuICB3cmFwQW5kSm9pbihwbSwgcG9zLCB0aGlzKTtcbn0pKTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydE9yZGVyZWRMaXN0XCIsIC9eKFxcZCspXFwuICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBtYXRjaCwgcG9zKSB7XG4gIHZhciBvcmRlciA9ICttYXRjaFsxXTtcbiAgd3JhcEFuZEpvaW4ocG0sIHBvcywgdGhpcywgeyBvcmRlcjogb3JkZXIgfHwgbnVsbCB9LCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnNpemUgKyAobm9kZS5hdHRycy5vcmRlciB8fCAxKSA9PSBvcmRlcjtcbiAgfSk7XG59KSk7XG5cbl9tb2RlbC5CdWxsZXRMaXN0LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydEJ1bGxldExpc3RcIiwgL15cXHMqKFstKypdKSAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICB2YXIgYnVsbGV0ID0gbWF0Y2hbMV07XG4gIHdyYXBBbmRKb2luKHBtLCBwb3MsIHRoaXMsIG51bGwsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuYXR0cnMuYnVsbGV0ID09IGJ1bGxldDtcbiAgfSk7XG59KSk7XG5cbl9tb2RlbC5Db2RlQmxvY2sucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0Q29kZUJsb2NrXCIsIC9eYGBgJC8sIFwiYFwiLCBmdW5jdGlvbiAocG0sIF8sIHBvcykge1xuICBzZXRBcyhwbSwgcG9zLCB0aGlzLCB7IHBhcmFtczogXCJcIiB9KTtcbn0pKTtcblxuX21vZGVsLkhlYWRpbmcucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0SGVhZGluZ1wiLCAvXigjezEsNn0pICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBtYXRjaCwgcG9zKSB7XG4gIHNldEFzKHBtLCBwb3MsIHRoaXMsIHsgbGV2ZWw6IG1hdGNoWzFdLmxlbmd0aCB9KTtcbn0pKTtcblxuZnVuY3Rpb24gd3JhcEFuZEpvaW4ocG0sIHBvcywgdHlwZSkge1xuICB2YXIgYXR0cnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzNdO1xuICB2YXIgcHJlZGljYXRlID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICB2YXIgYmVmb3JlID0gcG9zLnNob3J0ZW4oKTtcbiAgdmFyIHNpYmxpbmcgPSBiZWZvcmUub2Zmc2V0ID4gMCAmJiBwbS5kb2MucGF0aChiZWZvcmUucGF0aCkuY2hpbGQoYmVmb3JlLm9mZnNldCAtIDEpO1xuICB2YXIgam9pbiA9IHNpYmxpbmcgJiYgc2libGluZy50eXBlLm5hbWUgPT0gdHlwZSAmJiAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUoc2libGluZykpO1xuICB2YXIgdHIgPSBwbS50ci53cmFwKHBvcywgcG9zLCB0eXBlLCBhdHRycyk7XG4gIHZhciBkZWxQb3MgPSB0ci5tYXAocG9zKS5wb3M7XG4gIHRyW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKGRlbFBvcy5wYXRoLCAwKSwgZGVsUG9zKTtcbiAgaWYgKGpvaW4pIHRyLmpvaW4oYmVmb3JlKTtcbiAgdHIuYXBwbHkoKTtcbn1cblxuZnVuY3Rpb24gc2V0QXMocG0sIHBvcywgdHlwZSwgYXR0cnMpIHtcbiAgcG0udHIuc2V0QmxvY2tUeXBlKHBvcywgcG9zLCB0eXBlLCBhdHRycylbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MocG9zLnBhdGgsIDApLCBwb3MpLmFwcGx5KCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5hZGRJbnB1dFJ1bGUgPSBhZGRJbnB1dFJ1bGU7XG5leHBvcnRzLnJlbW92ZUlucHV0UnVsZSA9IHJlbW92ZUlucHV0UnVsZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbi8vIDo6IChQcm9zZU1pcnJvciwgSW5wdXRSdWxlKVxuLy8gQWRkIHRoZSBnaXZlbiBbaW5wdXQgcnVsZV0oI0lucHV0UnVsZSkgdG8gYW4gZWRpdG9yLiBGcm9tIG5vdyBvbixcbi8vIHdoZW5ldmVyIHRoZSBydWxlJ3MgcGF0dGVybiBpcyB0eXBlZCwgaXRzIGhhbmRsZXIgaXMgYWN0aXZhdGVkLlxuLy9cbi8vIE5vdGUgdGhhdCB0aGUgZWZmZWN0IG9mIGFuIGlucHV0IHJ1bGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHByZXNzaW5nXG4vLyBCYWNrc3BhY2UgcmlnaHQgYWZ0ZXIgaXQgaGFwcGVucy5cblxuZnVuY3Rpb24gYWRkSW5wdXRSdWxlKHBtLCBydWxlKSB7XG4gIGlmICghcG0ubW9kLmludGVycHJldElucHV0KSBwbS5tb2QuaW50ZXJwcmV0SW5wdXQgPSBuZXcgSW5wdXRSdWxlcyhwbSk7XG4gIHBtLm1vZC5pbnRlcnByZXRJbnB1dC5hZGRSdWxlKHJ1bGUpO1xufVxuXG4vLyA6OiAoUHJvc2VNaXJyb3IsIHN0cmluZylcbi8vIFJlbW92ZSB0aGUgaW5wdXQgcnVsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIChhZGRlZCBlYXJsaWVyIHdpdGhcbi8vIGBhZGRJbnB1dFJ1bGVgKSBmcm9tIHRoZSBlZGl0b3IuXG5cbmZ1bmN0aW9uIHJlbW92ZUlucHV0UnVsZShwbSwgbmFtZSkge1xuICB2YXIgaWkgPSBwbS5tb2QuaW50ZXJwcmV0SW5wdXQ7XG4gIGlmICghaWkpIHJldHVybjtcbiAgaWkucmVtb3ZlUnVsZShuYW1lKTtcbiAgaWYgKGlpLnJ1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgaWkudW5yZWdpc3RlcigpO1xuICAgIHBtLm1vZC5pbnRlcnByZXRJbnB1dCA9IG51bGw7XG4gIH1cbn1cblxuLy8gOzsgSW5wdXQgcnVsZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVzY3JpYmluZyBhIHBpZWNlIG9mIHRleHRcbi8vIHRoYXQsIHdoZW4gdHlwZWQsIGNhdXNlcyBzb21ldGhpbmcgdG8gaGFwcGVuLiBUaGlzIG1pZ2h0IGJlXG4vLyBjaGFuZ2luZyB0d28gZGFzaGVzIGludG8gYW4gZW1kYXNoLCB3cmFwcGluZyBhIHBhcmFncmFwaCBzdGFydGluZ1xuLy8gd2l0aCBgXCI+IFwiYCBpbnRvIGEgYmxvY2txdW90ZSwgb3Igc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudC5cblxudmFyIElucHV0UnVsZSA9XG4vLyA6OiAoc3RyaW5nLCBSZWdFeHAsID9zdHJpbmcsIHVuaW9uPHN0cmluZywgKFByb3NlTWlycm9yLCBbc3RyaW5nXSwgUG9zKT4pXG4vLyBDcmVhdGUgYW4gaW5wdXQgcnVsZS4gSXRzIG5hbWUgaXMgdXNlZCB0byBpZGVudGlmeSBpdCAodG8gZGlzYWJsZVxuLy8gaXQpLiBUaGUgcnVsZSBhcHBsaWVzIHdoZW4gdGhlIHVzZXIgdHlwZWQgc29tZXRoaW5nIGFuZCB0aGUgdGV4dFxuLy8gZGlyZWN0bHkgaW4gZnJvbnQgb2YgdGhlIGN1cnNvciBtYXRjaGVzIGBtYXRjaGAsIHdoaWNoIHNob3VsZFxuLy8gcHJvYmFibHkgZW5kIHdpdGggYCRgLiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGZpbHRlciwgd2hpY2hcbi8vIHNob3VsZCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCBhbHdheXMgYXBwZWFycyBhdCB0aGUgZW5kIG9mXG4vLyB0aGUgbWF0Y2gsIGFuZCB3aWxsIGJlIHVzZWQgdG8gb25seSBhcHBseSB0aGUgcnVsZSB3aGVuIHRoZXJlJ3Ncbi8vIGFuIGFjdHVhbCBjaGFuY2Ugb2YgaXQgc3VjY2VlZGluZy5cbi8vXG4vLyBUaGUgYGhhbmRsZXJgIGNhbiBiZSBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSB0aGUgbWF0Y2hlZCB0ZXh0XG4vLyB3aWxsIHNpbXBseSBiZSByZXBsYWNlZCBieSB0aGF0IHN0cmluZywgb3IgYSBmdW5jdGlvbiwgd2hpY2ggd2lsbFxuLy8gYmUgY2FsbGVkIHdpdGggdGhlIG1hdGNoIGFycmF5IHByb2R1Y2VkIGJ5XG4vLyBbYFJlZ0V4cC5leGVjYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwL2V4ZWMpLFxuLy8gYW5kIHNob3VsZCBwcm9kdWNlIHRoZSBlZmZlY3Qgb2YgdGhlIHJ1bGUuXG5mdW5jdGlvbiBJbnB1dFJ1bGUobmFtZSwgbWF0Y2gsIGZpbHRlciwgaGFuZGxlcikge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5wdXRSdWxlKTtcblxuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xufTtcblxuZXhwb3J0cy5JbnB1dFJ1bGUgPSBJbnB1dFJ1bGU7XG5cbnZhciBJbnB1dFJ1bGVzID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW5wdXRSdWxlcyhwbSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5wdXRSdWxlcyk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5ydWxlcyA9IFtdO1xuICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IG51bGw7XG5cbiAgICBwbS5vbihcInNlbGVjdGlvbkNoYW5nZVwiLCB0aGlzLm9uU2VsQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLmNhbmNlbFZlcnNpb24gPSBudWxsO1xuICAgIH0pO1xuICAgIHBtLm9uKFwidGV4dElucHV0XCIsIHRoaXMub25UZXh0SW5wdXQgPSB0aGlzLm9uVGV4dElucHV0LmJpbmQodGhpcykpO1xuICAgIHBtLmFkZEtleW1hcChuZXcgX2VkaXQuS2V5bWFwKHsgQmFja3NwYWNlOiBmdW5jdGlvbiBCYWNrc3BhY2UocG0pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmJhY2tzcGFjZShwbSk7XG4gICAgICB9IH0sIHsgbmFtZTogXCJpbnB1dFJ1bGVzXCIgfSksIDIwKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJbnB1dFJ1bGVzLCBbe1xuICAgIGtleTogXCJ1bnJlZ2lzdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVucmVnaXN0ZXIoKSB7XG4gICAgICB0aGlzLnBtLm9mZihcInNlbGVjdGlvbkNoYW5nZVwiLCB0aGlzLm9uU2VsQ2hhbmdlKTtcbiAgICAgIHRoaXMucG0ub2ZmKFwidGV4dElucHV0XCIsIHRoaXMub25UZXh0SW5wdXQpO1xuICAgICAgdGhpcy5wbS5yZW1vdmVLZXltYXAoXCJpbnB1dFJ1bGVzXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFJ1bGUocnVsZSkge1xuICAgICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJ1bGUobmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bGVzW2ldLm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgIHRoaXMucnVsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uVGV4dElucHV0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVGV4dElucHV0KHRleHQpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFwb3MpIHJldHVybjtcblxuICAgICAgdmFyIHRleHRCZWZvcmUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgaXNDb2RlID0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RDaCA9IHRleHRbdGV4dC5sZW5ndGggLSAxXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBydWxlID0gdGhpcy5ydWxlc1tpXSxcbiAgICAgICAgICAgIG1hdGNoID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocnVsZS5maWx0ZXIgJiYgcnVsZS5maWx0ZXIgIT0gbGFzdENoKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHRleHRCZWZvcmUgPT0gbnVsbCkge1xuICAgICAgICAgIDtcbiAgICAgICAgICB2YXIgX2dldENvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMucG0uZG9jLCBwb3MpO1xuXG4gICAgICAgICAgdGV4dEJlZm9yZSA9IF9nZXRDb250ZXh0LnRleHRCZWZvcmU7XG4gICAgICAgICAgaXNDb2RlID0gX2dldENvbnRleHQuaXNDb2RlO1xuXG4gICAgICAgICAgaWYgKGlzQ29kZSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCA9IHJ1bGUubWF0Y2guZXhlYyh0ZXh0QmVmb3JlKSkge1xuICAgICAgICAgIHZhciBzdGFydFZlcnNpb24gPSB0aGlzLnBtLmhpc3RvcnkuZ2V0VmVyc2lvbigpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5oYW5kbGVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBwb3Mub2Zmc2V0IC0gKG1hdGNoWzFdIHx8IG1hdGNoWzBdKS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBuZXcgX21vZGVsLlBvcyhwb3MucGF0aCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIHZhciBtYXJrcyA9IHRoaXMucG0uZG9jLm1hcmtzQXQocG9zKTtcbiAgICAgICAgICAgIHRoaXMucG0udHJbXCJkZWxldGVcIl0oc3RhcnQsIHBvcykuaW5zZXJ0KHN0YXJ0LCB0aGlzLnBtLnNjaGVtYS50ZXh0KHJ1bGUuaGFuZGxlciwgbWFya3MpKS5hcHBseSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydWxlLmhhbmRsZXIodGhpcy5wbSwgbWF0Y2gsIHBvcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IHN0YXJ0VmVyc2lvbjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmFja3NwYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJhY2tzcGFjZSgpIHtcbiAgICAgIGlmICh0aGlzLmNhbmNlbFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5wbS5oaXN0b3J5LmJhY2tUb1ZlcnNpb24odGhpcy5jYW5jZWxWZXJzaW9uKTtcbiAgICAgICAgdGhpcy5jYW5jZWxWZXJzaW9uID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5wdXRSdWxlcztcbn0pKCk7XG5cbmZ1bmN0aW9uIGdldENvbnRleHQoZG9jLCBwb3MpIHtcbiAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgdmFyIGlzQ29kZSA9IHBhcmVudC50eXBlLmlzQ29kZTtcbiAgdmFyIHRleHRCZWZvcmUgPSBcIlwiO1xuICBmb3IgKHZhciBpID0gcGFyZW50Lml0ZXIoMCwgcG9zLm9mZnNldCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgIGlmIChjaGlsZC5pc1RleHQpIHRleHRCZWZvcmUgKz0gY2hpbGQudGV4dDtlbHNlIHRleHRCZWZvcmUgPSBcIlwiO1xuICAgIGlmIChpLmF0RW5kKCkgJiYgY2hpbGQubWFya3Muc29tZShmdW5jdGlvbiAoc3QpIHtcbiAgICAgIHJldHVybiBzdC50eXBlLmlzQ29kZTtcbiAgICB9KSkgaXNDb2RlID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4geyB0ZXh0QmVmb3JlOiB0ZXh0QmVmb3JlLCBpc0NvZGU6IGlzQ29kZSB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRJY29uID0gZ2V0SWNvbjtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgc3ZnQ29sbGVjdGlvbiA9IG51bGw7XG52YXIgc3ZnQnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG52YXIgU1ZHID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xudmFyIFhMSU5LID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5cbmZ1bmN0aW9uIGdldEljb24obmFtZSwgZGF0YSkge1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIG5vZGUuY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1pY29uXCI7XG4gIGlmIChkYXRhLnBhdGgpIHtcbiAgICBpZiAoIXN2Z0J1aWx0W25hbWVdKSBidWlsZFNWRyhuYW1lLCBkYXRhKTtcbiAgICB2YXIgc3ZnID0gbm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN2Z1wiKSk7XG4gICAgc3ZnLnN0eWxlLndpZHRoID0gZGF0YS53aWR0aCAvIGRhdGEuaGVpZ2h0ICsgXCJlbVwiO1xuICAgIHZhciB1c2UgPSBzdmcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJ1c2VcIikpO1xuICAgIHVzZS5zZXRBdHRyaWJ1dGVOUyhYTElOSywgXCJocmVmXCIsIFwiI3BtLWljb24tXCIgKyBuYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gZGF0YS50ZXh0O1xuICAgIGlmIChkYXRhLmNzcykgbm9kZS5zdHlsZS5jc3NUZXh0ID0gZGF0YS5jc3M7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU1ZHKG5hbWUsIGRhdGEpIHtcbiAgaWYgKCFzdmdDb2xsZWN0aW9uKSB7XG4gICAgc3ZnQ29sbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwic3ZnXCIpO1xuICAgIHN2Z0NvbGxlY3Rpb24uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHN2Z0NvbGxlY3Rpb24sIGRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZCk7XG4gIH1cbiAgdmFyIHN5bSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwic3ltYm9sXCIpO1xuICBzeW0uaWQgPSBcInBtLWljb24tXCIgKyBuYW1lO1xuICBzeW0uc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBcIjAgMCBcIiArIGRhdGEud2lkdGggKyBcIiBcIiArIGRhdGEuaGVpZ2h0KTtcbiAgdmFyIHBhdGggPSBzeW0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJwYXRoXCIpKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGRhdGEucGF0aCk7XG4gIHN2Z0NvbGxlY3Rpb24uYXBwZW5kQ2hpbGQoc3ltKTtcbiAgc3ZnQnVpbHRbbmFtZV0gPSB0cnVlO1xufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuLlByb3NlTWlycm9yLWljb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbGluZS1oZWlnaHQ6IC44O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBhZGRpbmc6IDJweCA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1pY29uLWFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kOiAjNjY2O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItaWNvbiBzdmcge1xcbiAgZmlsbDogY3VycmVudENvbG9yO1xcbiAgaGVpZ2h0OiAxZW07XFxufVxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLnNob3dTZWxlY3RNZW51ID0gc2hvd1NlbGVjdE1lbnU7XG5leHBvcnRzLnJlYWRQYXJhbXMgPSByZWFkUGFyYW1zO1xuZXhwb3J0cy5jb21tYW5kR3JvdXBzID0gY29tbWFuZEdyb3VwcztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfdG9vbHRpcCA9IHJlcXVpcmUoXCIuL3Rvb2x0aXBcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX2ljb25zID0gcmVxdWlyZShcIi4vaWNvbnNcIik7XG5cbnZhciBNZW51ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVudShwbSwgZGlzcGxheSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51KTtcblxuICAgIHRoaXMuZGlzcGxheSA9IGRpc3BsYXk7XG4gICAgdGhpcy5zdGFjayA9IFtdO1xuICAgIHRoaXMucG0gPSBwbTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51LCBbe1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coY29udGVudCwgZGlzcGxheUluZm8pIHtcbiAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuZW50ZXIoY29udGVudCwgZGlzcGxheUluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuZGlzcGxheS5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihjb250ZW50LCBkaXNwbGF5SW5mbykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHBpZWNlcyA9IFtdLFxuICAgICAgICAgIGV4cGxvcmUgPSBmdW5jdGlvbiBleHBsb3JlKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGxvcmUodmFsdWVbaV0pO1xuICAgICAgICAgIH1waWVjZXMucHVzaChzZXBhcmF0b3IpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5zZWxlY3QgfHwgdmFsdWUuc2VsZWN0KF90aGlzLnBtKSkge1xuICAgICAgICAgIHBpZWNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGV4cGxvcmUoY29udGVudCk7XG4gICAgICAvLyBSZW1vdmUgc3VwZXJmbHVvdXMgc2VwYXJhdG9yc1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaWVjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBpZWNlc1tpXSA9PSBzZXBhcmF0b3IgJiYgKGkgPT0gMCB8fCBpID09IHBpZWNlcy5sZW5ndGggLSAxIHx8IHBpZWNlc1tpICsgMV0gPT0gc2VwYXJhdG9yKSkgcGllY2VzLnNwbGljZShpLS0sIDEpO1xuICAgICAgfWlmICghcGllY2VzLmxlbmd0aCkgcmV0dXJuIHRoaXMuZGlzcGxheS5jbGVhcigpO1xuXG4gICAgICB0aGlzLnN0YWNrLnB1c2gocGllY2VzKTtcbiAgICAgIHRoaXMuZHJhdyhkaXNwbGF5SW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRyYXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhdyhkaXNwbGF5SW5mbykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBjdXIgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmVuZGVyZWQgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVcIiB9LCBjdXIubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJJdGVtKGl0ZW0sIF90aGlzMik7XG4gICAgICB9KSk7XG4gICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPiAxKSB0aGlzLmRpc3BsYXkuZW50ZXIocmVuZGVyZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5sZWF2ZSgpO1xuICAgICAgfSwgZGlzcGxheUluZm8pO2Vsc2UgdGhpcy5kaXNwbGF5LnNob3cocmVuZGVyZWQsIGRpc3BsYXlJbmZvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibGVhdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGVhdmUoKSB7XG4gICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB0aGlzLmRyYXcoKTtlbHNlIHRoaXMuZGlzcGxheS5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhY3RpdmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLmxlbmd0aCA+IDE7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lbnU7XG59KSgpO1xuXG5leHBvcnRzLk1lbnUgPSBNZW51O1xuXG52YXIgVG9vbHRpcERpc3BsYXkgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwRGlzcGxheSh0b29sdGlwLCByZXNldEZ1bmMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcERpc3BsYXkpO1xuXG4gICAgdGhpcy50b29sdGlwID0gdG9vbHRpcDtcbiAgICB0aGlzLnJlc2V0RnVuYyA9IHJlc2V0RnVuYztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwRGlzcGxheSwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLnRvb2x0aXAuY2xvc2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBpZiAodGhpcy5yZXNldEZ1bmMpIHRoaXMucmVzZXRGdW5jKCk7ZWxzZSB0aGlzLmNsZWFyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdyhkb20sIGluZm8pIHtcbiAgICAgIHRoaXMudG9vbHRpcC5vcGVuKGRvbSwgaW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyKGRvbSwgYmFjaywgaW5mbykge1xuICAgICAgdmFyIGJ1dHRvbiA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrXCIsIHRpdGxlOiBcIkJhY2tcIiB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBiYWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2hvdygoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXRvb2x0aXAtYmFjay13cmFwcGVyXCIgfSwgZG9tLCBidXR0b24pLCBpbmZvKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcERpc3BsYXk7XG59KSgpO1xuXG5leHBvcnRzLlRvb2x0aXBEaXNwbGF5ID0gVG9vbHRpcERpc3BsYXk7XG5cbmZ1bmN0aW9uIHRpdGxlKHBtLCBjb21tYW5kKSB7XG4gIHZhciBrZXkgPSBwbS5rZXlGb3JDb21tYW5kKGNvbW1hbmQubmFtZSk7XG4gIHJldHVybiBrZXkgPyBjb21tYW5kLmxhYmVsICsgXCIgKFwiICsga2V5ICsgXCIpXCIgOiBjb21tYW5kLmxhYmVsO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJY29uKGNvbW1hbmQsIG1lbnUpIHtcbiAgdmFyIGljb24gPSByZXNvbHZlSWNvbihtZW51LnBtLCBjb21tYW5kKTtcbiAgaWYgKGNvbW1hbmQuYWN0aXZlKG1lbnUucG0pKSBpY29uLmNsYXNzTmFtZSArPSBcIiBQcm9zZU1pcnJvci1pY29uLWFjdGl2ZVwiO1xuICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWljb25cIiwgdGl0bGU6IHRpdGxlKG1lbnUucG0sIGNvbW1hbmQpIH0sIGljb24pO1xuICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghY29tbWFuZC5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICBjb21tYW5kLmV4ZWMobWVudS5wbSk7XG4gICAgICBtZW51LnJlc2V0KCk7XG4gICAgfSBlbHNlIGlmIChjb21tYW5kLnBhcmFtcy5sZW5ndGggPT0gMSAmJiBjb21tYW5kLnBhcmFtc1swXS50eXBlID09IFwic2VsZWN0XCIpIHtcbiAgICAgIHNob3dTZWxlY3RNZW51KG1lbnUucG0sIGNvbW1hbmQsIGRvbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbnUuZW50ZXIocmVhZFBhcmFtcyhjb21tYW5kKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRvbTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUljb24ocG0sIGNvbW1hbmQpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBpY29uID0gY29tbWFuZC5zcGVjLmljb247XG4gICAgaWYgKCFpY29uKSBicmVhaztcbiAgICBpZiAoaWNvbi5mcm9tKSB7XG4gICAgICBjb21tYW5kID0gcG0uY29tbWFuZHNbaWNvbi5mcm9tXTtcbiAgICAgIGlmICghY29tbWFuZCkgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoMCwgX2ljb25zLmdldEljb24pKGNvbW1hbmQubmFtZSwgaWNvbik7XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2ljb25zLmdldEljb24pKFwiZGVmYXVsdFwiLCB7IHRleHQ6IFwi4pyYXCIgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNlbGVjdChpdGVtLCBtZW51KSB7XG4gIHZhciBwYXJhbSA9IGl0ZW0ucGFyYW1zWzBdO1xuICB2YXIgdmFsdWUgPSAhcGFyYW1bXCJkZWZhdWx0XCJdID8gbnVsbCA6IHBhcmFtW1wiZGVmYXVsdFwiXS5jYWxsID8gcGFyYW1bXCJkZWZhdWx0XCJdKG1lbnUucG0pIDogcGFyYW1bXCJkZWZhdWx0XCJdO1xuXG4gIHZhciBkb20gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXNlbGVjdCBQcm9zZU1pcnJvci1zZWxlY3QtY29tbWFuZC1cIiArIGl0ZW0ubmFtZSwgdGl0bGU6IGl0ZW0ubGFiZWwgfSwgIXZhbHVlID8gcGFyYW0uZGVmYXVsdExhYmVsIHx8IFwiU2VsZWN0Li4uXCIgOiB2YWx1ZS5kaXNwbGF5ID8gdmFsdWUuZGlzcGxheSh2YWx1ZSkgOiB2YWx1ZS5sYWJlbCk7XG4gIGRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2hvd1NlbGVjdE1lbnUobWVudS5wbSwgaXRlbSwgZG9tKTtcbiAgfSk7XG4gIHJldHVybiBkb207XG59XG5cbmZ1bmN0aW9uIHNob3dTZWxlY3RNZW51KHBtLCBpdGVtLCBkb20pIHtcbiAgdmFyIHBhcmFtID0gaXRlbS5wYXJhbXNbMF07XG4gIHZhciBvcHRpb25zID0gcGFyYW0ub3B0aW9ucy5jYWxsID8gcGFyYW0ub3B0aW9ucyhwbSkgOiBwYXJhbS5vcHRpb25zO1xuICB2YXIgbWVudSA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnVcIiB9LCBvcHRpb25zLm1hcChmdW5jdGlvbiAobykge1xuICAgIHZhciBkb20gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIG51bGwsIG8uZGlzcGxheSA/IG8uZGlzcGxheShvKSA6IG8ubGFiZWwpO1xuICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpdGVtLmV4ZWMocG0sIFtvLnZhbHVlXSk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9tO1xuICB9KSk7XG4gIHZhciBwb3MgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBib3ggPSBwbS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBtZW51LnN0eWxlLmxlZnQgPSBwb3MubGVmdCAtIGJveC5sZWZ0IC0gMiArIFwicHhcIjtcbiAgbWVudS5zdHlsZS50b3AgPSBwb3MudG9wIC0gYm94LnRvcCAtIDIgKyBcInB4XCI7XG5cbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgZG9uZSA9IHRydWU7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZpbmlzaCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmaW5pc2gpO1xuICAgIHBtLndyYXBwZXIucmVtb3ZlQ2hpbGQobWVudSk7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZpbmlzaCk7XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZmluaXNoKTtcbiAgcG0ud3JhcHBlci5hcHBlbmRDaGlsZChtZW51KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySXRlbShpdGVtLCBtZW51KSB7XG4gIHZhciBkaXNwbGF5ID0gaXRlbS5kaXNwbGF5IHx8IGl0ZW0uc3BlYy5kaXNwbGF5IHx8IFwiaWNvblwiO1xuICBpZiAoZGlzcGxheSA9PSBcImljb25cIikgcmV0dXJuIHJlbmRlckljb24oaXRlbSwgbWVudSk7ZWxzZSBpZiAoZGlzcGxheSA9PSBcInNlbGVjdFwiKSByZXR1cm4gcmVuZGVyU2VsZWN0KGl0ZW0sIG1lbnUpO2Vsc2UgaWYgKCFkaXNwbGF5KSB0aHJvdyBuZXcgRXJyb3IoXCJDb21tYW5kIFwiICsgaXRlbS5uYW1lICsgXCIgY2FuIG5vdCBiZSBzaG93biBpbiBhIG1lbnVcIik7ZWxzZSByZXR1cm4gZGlzcGxheS5jYWxsKGl0ZW0sIG1lbnUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFBhcmFtRm9ybShwbSwgY29tbWFuZCkge1xuICB2YXIgcHJlZmlsbCA9IGNvbW1hbmQuc3BlYy5wcmVmaWxsUGFyYW1zICYmIGNvbW1hbmQuc3BlYy5wcmVmaWxsUGFyYW1zKHBtKTtcbiAgdmFyIGZpZWxkcyA9IGNvbW1hbmQucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICB2YXIgZmllbGQgPSB1bmRlZmluZWQsXG4gICAgICAgIG5hbWUgPSBcImZpZWxkX1wiICsgaTtcbiAgICB2YXIgdmFsID0gcHJlZmlsbCA/IHByZWZpbGxbaV0gOiBwYXJhbVtcImRlZmF1bHRcIl0gfHwgXCJcIjtcbiAgICBpZiAocGFyYW0udHlwZSA9PSBcInRleHRcIikgZmllbGQgPSAoMCwgX2RvbS5lbHQpKFwiaW5wdXRcIiwgeyBuYW1lOiBuYW1lLCB0eXBlOiBcInRleHRcIixcbiAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbS5sYWJlbCxcbiAgICAgIHZhbHVlOiB2YWwsXG4gICAgICBhdXRvY29tcGxldGU6IFwib2ZmXCIgfSk7ZWxzZSBpZiAocGFyYW0udHlwZSA9PSBcInNlbGVjdFwiKSBmaWVsZCA9ICgwLCBfZG9tLmVsdCkoXCJzZWxlY3RcIiwgeyBuYW1lOiBuYW1lIH0sIChwYXJhbS5vcHRpb25zLmNhbGwgPyBwYXJhbS5vcHRpb25zKHBtKSA6IHBhcmFtLm9wdGlvbnMpLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuICgwLCBfZG9tLmVsdCkoXCJvcHRpb25cIiwgeyB2YWx1ZTogby52YWx1ZSwgc2VsZWN0ZWQ6IG8udmFsdWUgPT0gdmFsIH0sIG8ubGFiZWwpO1xuICAgIH0pKTtlbHNlIC8vIEZJWE1FIG1vcmUgdHlwZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHBhcmFtZXRlciB0eXBlOiBcIiArIHBhcmFtLnR5cGUpO1xuICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIG51bGwsIGZpZWxkKTtcbiAgfSk7XG4gIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZm9ybVwiLCBudWxsLCBmaWVsZHMpO1xufVxuXG5mdW5jdGlvbiBnYXRoZXJQYXJhbXMocG0sIGNvbW1hbmQsIGZvcm0pIHtcbiAgdmFyIGJhZCA9IGZhbHNlO1xuICB2YXIgcGFyYW1zID0gY29tbWFuZC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSwgaSkge1xuICAgIHZhciB2YWwgPSBmb3JtLmVsZW1lbnRzW1wiZmllbGRfXCIgKyBpXS52YWx1ZTtcbiAgICBpZiAodmFsKSByZXR1cm4gdmFsO1xuICAgIGlmIChwYXJhbVtcImRlZmF1bHRcIl0gPT0gbnVsbCkgYmFkID0gdHJ1ZTtlbHNlIHJldHVybiBwYXJhbVtcImRlZmF1bHRcIl0uY2FsbCA/IHBhcmFtW1wiZGVmYXVsdFwiXShwbSkgOiBwYXJhbVtcImRlZmF1bHRcIl07XG4gIH0pO1xuICByZXR1cm4gYmFkID8gbnVsbCA6IHBhcmFtcztcbn1cblxuZnVuY3Rpb24gcGFyYW1Gb3JtKHBtLCBjb21tYW5kLCBjYWxsYmFjaykge1xuICB2YXIgZm9ybSA9IGJ1aWxkUGFyYW1Gb3JtKHBtLCBjb21tYW5kKSxcbiAgICAgIGRvbmUgPSBmYWxzZTtcblxuICB2YXIgZmluaXNoID0gZnVuY3Rpb24gZmluaXNoKHJlc3VsdCkge1xuICAgIGlmICghZG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3VibWl0ID0gZnVuY3Rpb24gc3VibWl0KCkge1xuICAgIC8vIEZJWE1FIGVycm9yIG1lc3NhZ2VzXG4gICAgZmluaXNoKGdhdGhlclBhcmFtcyhwbSwgY29tbWFuZCwgZm9ybSkpO1xuICB9O1xuICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgc3VibWl0KCk7XG4gIH0pO1xuICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUua2V5Q29kZSA9PSAyNykge1xuICAgICAgZmluaXNoKG51bGwpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDEzICYmICEoZS5jdHJsS2V5IHx8IGUubWV0YUtleSB8fCBlLnNoaWZ0S2V5KSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0KCk7XG4gICAgfVxuICB9KTtcbiAgLy8gRklYTUUgdG9vIGhhY2t5P1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgdGV4dGFyZWFcIik7XG4gICAgaWYgKGlucHV0KSBpbnB1dC5mb2N1cygpO1xuICB9LCAyMCk7XG5cbiAgcmV0dXJuIGZvcm07XG59XG5cbmZ1bmN0aW9uIHJlYWRQYXJhbXMoY29tbWFuZCkge1xuICByZXR1cm4geyBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KG1lbnUpIHtcbiAgICAgIHJldHVybiBwYXJhbUZvcm0obWVudS5wbSwgY29tbWFuZCwgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBtZW51LnBtLmZvY3VzKCk7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICBjb21tYW5kLmV4ZWMobWVudS5wbSwgcGFyYW1zKTtcbiAgICAgICAgICBtZW51LnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVudS5sZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IH07XG59XG5cbnZhciBzZXBhcmF0b3IgPSB7XG4gIGRpc3BsYXk6IGZ1bmN0aW9uIGRpc3BsYXkoKSB7XG4gICAgcmV0dXJuICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudXNlcGFyYXRvclwiIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjb21tYW5kR3JvdXBzKHBtKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBuYW1lcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBuYW1lc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gbmFtZXMubWFwKGZ1bmN0aW9uIChncm91cCkge1xuICAgIHZhciBmb3VuZCA9IFtdO1xuICAgIGZvciAodmFyIF9uYW1lIGluIHBtLmNvbW1hbmRzKSB7XG4gICAgICB2YXIgY21kID0gcG0uY29tbWFuZHNbX25hbWVdO1xuICAgICAgaWYgKGNtZC5zcGVjLm1lbnVHcm91cCAmJiBjbWQuc3BlYy5tZW51R3JvdXAgPT0gZ3JvdXApICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKShmb3VuZCwgY21kLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gKGEuc3BlYy5tZW51UmFuayB8fCA1MCkgLSAoYi5zcGVjLm1lbnVSYW5rIHx8IDUwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b29sdGlwUGFyYW1IYW5kbGVyKHBtLCBjb21tYW5kLCBjYWxsYmFjaykge1xuICB2YXIgdG9vbHRpcCA9IG5ldyBfdG9vbHRpcC5Ub29sdGlwKHBtLCBcImNlbnRlclwiKTtcbiAgdG9vbHRpcC5vcGVuKHBhcmFtRm9ybShwbSwgY29tbWFuZCwgZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHBtLmZvY3VzKCk7XG4gICAgdG9vbHRpcC5jbG9zZSgpO1xuICAgIGNhbGxiYWNrKHBhcmFtcyk7XG4gIH0pKTtcbn1cblxuKDAsIF9lZGl0LmRlZmluZVBhcmFtSGFuZGxlcikoXCJkZWZhdWx0XCIsIHRvb2x0aXBQYXJhbUhhbmRsZXIpO1xuKDAsIF9lZGl0LmRlZmluZVBhcmFtSGFuZGxlcikoXCJ0b29sdGlwXCIsIHRvb2x0aXBQYXJhbUhhbmRsZXIpO1xuXG4vLyBGSVhNRSBjaGVjayBmb3Igb2Jzb2xldGUgc3R5bGVzXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yLW1lbnUge1xcbiAgbWFyZ2luOiAwIC00cHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG4gIHdoaXRlLXNwYWNlOiBwcmU7XFxufVxcbi5Qcm9zZU1pcnJvci10b29sdGlwIC5Qcm9zZU1pcnJvci1tZW51IHtcXG4gIHdpZHRoOiAtd2Via2l0LWZpdC1jb250ZW50O1xcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrLXdyYXBwZXIge1xcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNXB4OyBsZWZ0OiA1cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5Qcm9zZU1pcnJvci10b29sdGlwLWJhY2s6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIsKrXFxcIjtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnVpY29uIHtcXG4gIG1hcmdpbjogMCA3cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51c2VwYXJhdG9yIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLlByb3NlTWlycm9yLW1lbnVzZXBhcmF0b3I6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIu+4mVxcXCI7XFxuICBvcGFjaXR5OiAwLjU7XFxuICBwYWRkaW5nOiAwIDRweDtcXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdCwgLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM3Nzc7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBmb250LXNpemU6IDkwJTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdCB7XFxuICBwYWRkaW5nOiAxcHggMTJweCAxcHggNHB4O1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIG1hcmdpbjogMCA4cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QtY29tbWFuZC10ZXh0YmxvY2tUeXBlIHtcXG4gIG1pbi13aWR0aDogMy4yZW07XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3Q6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIuKWv1xcXCI7XFxuICBjb2xvcjogIzc3NztcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHJpZ2h0OiA0cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBiYWNrZ3JvdW5kOiAjNDQ0O1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgcGFkZGluZzogMnB4IDJweDtcXG4gIHotaW5kZXg6IDE1O1xcbn1cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2IHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHBhZGRpbmc6IDAgMWVtIDAgMnB4O1xcbn1cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2OmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6ICM3Nzc7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3VwZGF0ZSA9IHJlcXVpcmUoXCIuL3VwZGF0ZVwiKTtcblxudmFyIF9tZW51ID0gcmVxdWlyZShcIi4vbWVudVwiKTtcblxuKDAsIF9lZGl0LmRlZmluZU9wdGlvbikoXCJtZW51QmFyXCIsIGZhbHNlLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIGlmIChwbS5tb2QubWVudUJhcikgcG0ubW9kLm1lbnVCYXIuZGV0YWNoKCk7XG4gIHBtLm1vZC5tZW51QmFyID0gdmFsdWUgPyBuZXcgTWVudUJhcihwbSwgdmFsdWUpIDogbnVsbDtcbn0pO1xuXG52YXIgQmFyRGlzcGxheSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJhckRpc3BsYXkoY29udGFpbmVyLCByZXNldEZ1bmMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFyRGlzcGxheSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnJlc2V0RnVuYyA9IHJlc2V0RnVuYztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCYXJEaXNwbGF5LCBbe1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnJlc2V0RnVuYygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coZG9tKSB7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihkb20sIGJhY2spIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGN1cnJlbnQuc3R5bGUub3BhY2l0eSA9IFwiMC41XCI7XG4gICAgICB9XG4gICAgICB2YXIgYmFja0J1dHRvbiA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrXCIgfSk7XG4gICAgICBiYWNrQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO2Uuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJhY2soKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGFkZGVkID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyLXNsaWRpbmdcIiB9LCBiYWNrQnV0dG9uLCBkb20pO1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoYWRkZWQpO1xuICAgICAgYWRkZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIEZvcmNlIGxheW91dCBmb3IgdHJhbnNpdGlvblxuICAgICAgYWRkZWQuc3R5bGUubGVmdCA9IFwiMFwiO1xuICAgICAgYWRkZWQuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LnBhcmVudE5vZGUpIGN1cnJlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjdXJyZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCYXJEaXNwbGF5O1xufSkoKTtcblxudmFyIE1lbnVCYXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNZW51QmFyKHBtLCBjb25maWcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVCYXIpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuXG4gICAgdGhpcy5tZW51RWx0ID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyLWlubmVyXCIgfSk7XG4gICAgdGhpcy53cmFwcGVyID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51YmFyXCIgfSwgKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51XCIsIHN0eWxlOiBcInZpc2liaWxpdHk6IGhpZmZkZGVuOyB6LWluZGV4OiAxMDBcIiB9LCAoMCwgX2RvbS5lbHQpKFwic3BhblwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51aWNvblwiIH0sICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItaWNvblwiIH0sIFwieFwiKSkpLCB0aGlzLm1lbnVFbHQpO1xuICAgIHBtLndyYXBwZXIuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlciwgcG0ud3JhcHBlci5maXJzdENoaWxkKTtcblxuICAgIHRoaXMudXBkYXRlID0gbmV3IF91cGRhdGUuTWVudVVwZGF0ZShwbSwgXCJzZWxlY3Rpb25DaGFuZ2UgY2hhbmdlIGFjdGl2ZU1hcmtDaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByZXBhcmVVcGRhdGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLm1lbnUgPSBuZXcgX21lbnUuTWVudShwbSwgbmV3IEJhckRpc3BsYXkodGhpcy5tZW51RWx0LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMucmVzZXRNZW51KCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5tZW51SXRlbXMgPSBjb25maWcgJiYgY29uZmlnLml0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJpbmxpbmVcIiwgXCJibG9ja1wiLCBcImhpc3RvcnlcIik7XG4gICAgdGhpcy51cGRhdGUuZm9yY2UoKTtcblxuICAgIHRoaXMuZmxvYXRpbmcgPSBmYWxzZTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5mbG9hdCkge1xuICAgICAgdGhpcy51cGRhdGVGbG9hdCgpO1xuICAgICAgdGhpcy5zY3JvbGxGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoX3RoaXMucG0ud3JhcHBlcikpIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIF90aGlzLnNjcm9sbEZ1bmMpO2Vsc2UgX3RoaXMudXBkYXRlRmxvYXQoKTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnNjcm9sbEZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51QmFyLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdGhpcy51cGRhdGUuZGV0YWNoKCk7XG4gICAgICB0aGlzLndyYXBwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLndyYXBwZXIpO1xuXG4gICAgICBpZiAodGhpcy5zY3JvbGxGdW5jKSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLnNjcm9sbEZ1bmMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmVwYXJlVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHNjcm9sbEN1cnNvciA9IHRoaXMucHJlcGFyZVNjcm9sbEN1cnNvcigpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFfdGhpczIubWVudS5hY3RpdmUpIF90aGlzMi5yZXNldE1lbnUoKTtcbiAgICAgICAgaWYgKHNjcm9sbEN1cnNvcikgc2Nyb2xsQ3Vyc29yKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldE1lbnVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXRNZW51KCkge1xuICAgICAgdGhpcy5tZW51LnNob3codGhpcy5tZW51SXRlbXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVGbG9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVGbG9hdCgpIHtcbiAgICAgIHZhciBlZGl0b3JSZWN0ID0gdGhpcy5wbS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHRoaXMuZmxvYXRpbmcpIHtcbiAgICAgICAgaWYgKGVkaXRvclJlY3QudG9wID49IDAgfHwgZWRpdG9yUmVjdC5ib3R0b20gPCB0aGlzLm1lbnVFbHQub2Zmc2V0SGVpZ2h0ICsgMTApIHtcbiAgICAgICAgICB0aGlzLmZsb2F0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5tZW51RWx0LnN0eWxlLmxlZnQgPSB0aGlzLm1lbnVFbHQuc3R5bGUud2lkdGggPSBcIlwiO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYm9yZGVyID0gKHRoaXMucG0ud3JhcHBlci5vZmZzZXRXaWR0aCAtIHRoaXMucG0ud3JhcHBlci5jbGllbnRXaWR0aCkgLyAyO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gZWRpdG9yUmVjdC5sZWZ0ICsgYm9yZGVyICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5kaXNwbGF5ID0gZWRpdG9yUmVjdC50b3AgPiB3aW5kb3cuaW5uZXJIZWlnaHQgPyBcIm5vbmVcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlZGl0b3JSZWN0LnRvcCA8IDAgJiYgZWRpdG9yUmVjdC5ib3R0b20gPj0gdGhpcy5tZW51RWx0Lm9mZnNldEhlaWdodCArIDEwKSB7XG4gICAgICAgICAgdGhpcy5mbG9hdGluZyA9IHRydWU7XG4gICAgICAgICAgdmFyIG1lbnVSZWN0ID0gdGhpcy5tZW51RWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gbWVudVJlY3QubGVmdCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUud2lkdGggPSBtZW51UmVjdC53aWR0aCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVNjcm9sbEN1cnNvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlU2Nyb2xsQ3Vyc29yKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5mbG9hdGluZykgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMucG0uc2VsZWN0aW9uLmhlYWQ7XG4gICAgICBpZiAoIWhlYWQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGN1cnNvclBvcyA9IHRoaXMucG0uY29vcmRzQXRQb3MoaGVhZCk7XG4gICAgICB2YXIgbWVudVJlY3QgPSB0aGlzLm1lbnVFbHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoY3Vyc29yUG9zLnRvcCA8IG1lbnVSZWN0LmJvdHRvbSAmJiBjdXJzb3JQb3MuYm90dG9tID4gbWVudVJlY3QudG9wKSB7XG4gICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgc2Nyb2xsYWJsZSA9IGZpbmRXcmFwcGluZ1Njcm9sbGFibGUoX3RoaXMzLnBtLndyYXBwZXIpO1xuICAgICAgICAgIGlmIChzY3JvbGxhYmxlKSByZXR1cm4ge1xuICAgICAgICAgICAgICB2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGFibGUuc2Nyb2xsVG9wIC09IG1lbnVSZWN0LmJvdHRvbSAtIGN1cnNvclBvcy50b3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldC52O1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51QmFyO1xufSkoKTtcblxuZnVuY3Rpb24gZmluZFdyYXBwaW5nU2Nyb2xsYWJsZShub2RlKSB7XG4gIGZvciAodmFyIGN1ciA9IG5vZGUucGFyZW50Tm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSkge1xuICAgIGlmIChjdXIuc2Nyb2xsSGVpZ2h0ID4gY3VyLmNsaWVudEhlaWdodCkgcmV0dXJuIGN1cjtcbiAgfVxufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuLlByb3NlTWlycm9yLW1lbnViYXIge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogaW5oZXJpdDtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBpbmhlcml0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1pbm5lciB7XFxuICBjb2xvcjogIzY2NjtcXG4gIHBhZGRpbmc6IDFweCA2cHg7XFxuICB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHNpbHZlcjtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgei1pbmRleDogMTA7XFxuICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGluaGVyaXQ7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgLlByb3NlTWlycm9yLWljb24tYWN0aXZlIHtcXG4gIGJhY2tncm91bmQ6ICNlZWU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXG4uUHJvc2VNaXJyb3ItbWVudWJhciB0ZXh0YXJlYSB7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdIHtcXG4gIHBhZGRpbmc6IDAgNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciBmb3JtIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBhZGRpbmc6IDJweCA0cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIC5Qcm9zZU1pcnJvci1ibG9ja3R5cGUge1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXG4gIG1pbi13aWR0aDogNGVtO1xcbn1cXG4uUHJvc2VNaXJyb3ItbWVudWJhciAuUHJvc2VNaXJyb3ItYmxvY2t0eXBlOmFmdGVyIHtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1zbGlkaW5nIHtcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgLW1vei10cmFuc2l0aW9uOiBsZWZ0IDAuMnMgZWFzZS1vdXQ7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDAuMnMgZWFzZS1vdXQ7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBsZWZ0OiAxMDAlO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3gtc2l6aW5nOiAtbW96LWJvcmRlci1ib3g7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgcGFkZGluZy1sZWZ0OiAxNnB4O1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyLWJhY2sge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgbWFyZ2luLXRvcDogLTFweDtcXG4gIHBhZGRpbmctYm90dG9tOiAycHg7XFxuICB3aWR0aDogMTBweDtcXG4gIGxlZnQ6IDA7XFxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBzaWx2ZXI7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5Qcm9zZU1pcnJvci1tZW51YmFyLWJhY2s6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIsKrXFxcIjtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIHByZWZpeCA9IFwiUHJvc2VNaXJyb3ItdG9vbHRpcFwiO1xuXG52YXIgVG9vbHRpcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRvb2x0aXAocG0sIGRpcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcCk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5kaXIgPSBkaXIgfHwgXCJhYm92ZVwiO1xuICAgIHRoaXMucG9pbnRlciA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogcHJlZml4ICsgXCItcG9pbnRlci1cIiArIHRoaXMuZGlyICsgXCIgXCIgKyBwcmVmaXggKyBcIi1wb2ludGVyXCIgfSkpO1xuICAgIHRoaXMucG9pbnRlcldpZHRoID0gdGhpcy5wb2ludGVySGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLmRvbSA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogcHJlZml4IH0pKTtcbiAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuZG9tLnN0eWxlLm9wYWNpdHkgPT0gXCIwXCIpIF90aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gX3RoaXMucG9pbnRlci5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbiAgICB9KTtcblxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5sYXN0TGVmdCA9IHRoaXMubGFzdFJpZ2h0ID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdGhpcy5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7XG4gICAgICB0aGlzLnBvaW50ZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvaW50ZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNpemUobm9kZSkge1xuICAgICAgdmFyIHdyYXAgPSB0aGlzLnBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7XG4gICAgICAgIFwiY2xhc3NcIjogcHJlZml4LFxuICAgICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IGFic29sdXRlXCJcbiAgICAgIH0sIG5vZGUpKTtcbiAgICAgIHZhciBzaXplID0geyB3aWR0aDogd3JhcC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiB3cmFwLm9mZnNldEhlaWdodCB9O1xuICAgICAgd3JhcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXApO1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9wZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3Blbihub2RlLCBwb3MpIHtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5sYXN0TGVmdCA9IHBvcyA/IHBvcy5sZWZ0IDogdGhpcy5sYXN0TGVmdDtcbiAgICAgIHZhciB0b3AgPSB0aGlzLmxhc3RUb3AgPSBwb3MgPyBwb3MudG9wIDogdGhpcy5sYXN0VG9wO1xuXG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShub2RlKTtcblxuICAgICAgdmFyIGFyb3VuZCA9IHRoaXMucG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgZm9yICh2YXIgY2hpbGQgPSB0aGlzLmRvbS5maXJzdENoaWxkLCBuZXh0ID0gdW5kZWZpbmVkOyBjaGlsZDsgY2hpbGQgPSBuZXh0KSB7XG4gICAgICAgIG5leHQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGNoaWxkICE9IHRoaXMucG9pbnRlcikgdGhpcy5kb20ucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQobm9kZSk7XG5cbiAgICAgIHRoaXMuZG9tLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBvaW50ZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKHRoaXMucG9pbnRlcldpZHRoID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyV2lkdGggPSB0aGlzLnBvaW50ZXIub2Zmc2V0V2lkdGggLSAxO1xuICAgICAgICB0aGlzLnBvaW50ZXJIZWlnaHQgPSB0aGlzLnBvaW50ZXIub2Zmc2V0SGVpZ2h0IC0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kb20uc3R5bGUud2lkdGggPSBzaXplLndpZHRoICsgXCJweFwiO1xuICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyBcInB4XCI7XG5cbiAgICAgIHZhciBtYXJnaW4gPSA1O1xuICAgICAgaWYgKHRoaXMuZGlyID09IFwiYWJvdmVcIiB8fCB0aGlzLmRpciA9PSBcImJlbG93XCIpIHtcbiAgICAgICAgdmFyIHRpcExlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZWZ0IC0gc2l6ZS53aWR0aCAvIDIsIHdpbmRvdy5pbm5lcldpZHRoIC0gc2l6ZS53aWR0aCkpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gdGlwTGVmdCAtIGFyb3VuZC5sZWZ0ICsgXCJweFwiO1xuICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUubGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCAtIHRoaXMucG9pbnRlcldpZHRoIC8gMiArIFwicHhcIjtcbiAgICAgICAgaWYgKHRoaXMuZGlyID09IFwiYWJvdmVcIikge1xuICAgICAgICAgIHZhciB0aXBUb3AgPSB0b3AgLSBhcm91bmQudG9wIC0gbWFyZ2luIC0gdGhpcy5wb2ludGVySGVpZ2h0IC0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdGlwVG9wICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS50b3AgPSB0aXBUb3AgKyBzaXplLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBiZWxvd1xuICAgICAgICAgIHZhciB0aXBUb3AgPSB0b3AgLSBhcm91bmQudG9wICsgbWFyZ2luO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS50b3AgPSB0aXBUb3AgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdGlwVG9wICsgdGhpcy5wb2ludGVySGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyID09IFwibGVmdFwiIHx8IHRoaXMuZGlyID09IFwicmlnaHRcIikge1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS50b3AgPSB0b3AgLSBhcm91bmQudG9wIC0gc2l6ZS5oZWlnaHQgLyAyICsgXCJweFwiO1xuICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdG9wIC0gdGhpcy5wb2ludGVySGVpZ2h0IC8gMiAtIGFyb3VuZC50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBcImxlZnRcIikge1xuICAgICAgICAgIHZhciBwb2ludGVyTGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCAtIG1hcmdpbiAtIHRoaXMucG9pbnRlcldpZHRoO1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCAtIHNpemUud2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCArIFwicHhcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyByaWdodFxuICAgICAgICAgIHZhciBwb2ludGVyTGVmdCA9IGxlZnQgLSBhcm91bmQubGVmdCArIG1hcmdpbjtcbiAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgKyB0aGlzLnBvaW50ZXJXaWR0aCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUubGVmdCA9IHBvaW50ZXJMZWZ0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyID09IFwiY2VudGVyXCIpIHtcbiAgICAgICAgdmFyIF90b3AgPSBNYXRoLm1heChhcm91bmQudG9wLCAwKSxcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWluKGFyb3VuZC5ib3R0b20sIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgICAgIHZhciBmcm9tVG9wID0gKGJvdHRvbSAtIF90b3AgLSBzaXplLmhlaWdodCkgLyAyO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gKGFyb3VuZC53aWR0aCAtIHNpemUud2lkdGgpIC8gMiArIFwicHhcIjtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gX3RvcCAtIGFyb3VuZC50b3AgKyBmcm9tVG9wICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9tKS5vcGFjaXR5O1xuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBvaW50ZXIpLm9wYWNpdHk7XG4gICAgICB0aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5wb2ludGVyLnN0eWxlLm9wYWNpdHkgPSAxO1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5wb2ludGVyLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUb29sdGlwO1xufSkoKTtcblxuZXhwb3J0cy5Ub29sdGlwID0gVG9vbHRpcDtcblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItIGJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuXFxuICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZS1vdXQsIGhlaWdodCAwLjRzIGVhc2Utb3V0LCBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZS1vdXQsIGhlaWdodCAwLjRzIGVhc2Utb3V0LCBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgb3BhY2l0eTogMDtcXG5cXG4gIGJvcmRlci1yYWRpdXM6IDVweDtcXG4gIHBhZGRpbmc6IDNweCA3cHg7XFxuICBtYXJnaW46IDA7XFxuICBiYWNrZ3JvdW5kOiAjNDQ0O1xcbiAgYm9yZGVyLWNvbG9yOiAjNzc3O1xcbiAgY29sb3I6IHdoaXRlO1xcblxcbiAgei1pbmRleDogNTtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlciB7XFxuICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IG5vbmU7XFxuICB3aWR0aDogMDsgaGVpZ2h0OiAwO1xcblxcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICAtbW96LXRyYW5zaXRpb246IGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIHRyYW5zaXRpb246IGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIG9wYWNpdHk6IDA7XFxuXFxuICB6LWluZGV4OiAxMDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1hYm92ZSB7XFxuICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItdG9wOiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1iZWxvdyB7XFxuICBib3JkZXItbGVmdDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1yaWdodCB7XFxuICBib3JkZXItdG9wOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmlnaHQ6IDZweCBzb2xpZCAjNDQ0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1wb2ludGVyLWxlZnQge1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCAjNDQ0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxuLlByb3NlTWlycm9yLXRvb2x0aXAgdGV4dGFyZWEge1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxuICBwYWRkaW5nOiAwIDRweDtcXG59XFxuXFxuXCIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfdXBkYXRlID0gcmVxdWlyZShcIi4vdXBkYXRlXCIpO1xuXG52YXIgX3Rvb2x0aXAgPSByZXF1aXJlKFwiLi90b29sdGlwXCIpO1xuXG52YXIgX21lbnUgPSByZXF1aXJlKFwiLi9tZW51XCIpO1xuXG52YXIgY2xhc3NQcmVmaXggPSBcIlByb3NlTWlycm9yLXRvb2x0aXBtZW51XCI7XG5cbigwLCBfZWRpdC5kZWZpbmVPcHRpb24pKFwidG9vbHRpcE1lbnVcIiwgZmFsc2UsIGZ1bmN0aW9uIChwbSwgdmFsdWUpIHtcbiAgaWYgKHBtLm1vZC50b29sdGlwTWVudSkgcG0ubW9kLnRvb2x0aXBNZW51LmRldGFjaCgpO1xuICBwbS5tb2QudG9vbHRpcE1lbnUgPSB2YWx1ZSA/IG5ldyBUb29sdGlwTWVudShwbSwgdmFsdWUpIDogbnVsbDtcbn0pO1xuXG52YXIgVG9vbHRpcE1lbnUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwTWVudShwbSwgY29uZmlnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb29sdGlwTWVudSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5pbmxpbmVJdGVtcyA9IGNvbmZpZyAmJiBjb25maWcuaW5saW5lSXRlbXMgfHwgKDAsIF9tZW51LmNvbW1hbmRHcm91cHMpKHBtLCBcImlubGluZVwiKTtcbiAgICB0aGlzLmJsb2NrSXRlbXMgPSBjb25maWcgJiYgY29uZmlnLmJsb2NrSXRlbXMgfHwgKDAsIF9tZW51LmNvbW1hbmRHcm91cHMpKHBtLCBcImJsb2NrXCIpO1xuICAgIHRoaXMuc2hvd0xpbmtzID0gY29uZmlnID8gY29uZmlnLnNob3dMaW5rcyAhPT0gZmFsc2UgOiB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRCbG9ja01lbnUgPSBjb25maWcgJiYgY29uZmlnLnNlbGVjdGVkQmxvY2tNZW51O1xuICAgIHRoaXMudXBkYXRlID0gbmV3IF91cGRhdGUuTWVudVVwZGF0ZShwbSwgXCJjaGFuZ2Ugc2VsZWN0aW9uQ2hhbmdlIGJsdXJcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnByZXBhcmVVcGRhdGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMudG9vbHRpcCA9IG5ldyBfdG9vbHRpcC5Ub29sdGlwKHBtLCBcImFib3ZlXCIpO1xuICAgIHRoaXMubWVudSA9IG5ldyBfbWVudS5NZW51KHBtLCBuZXcgX21lbnUuVG9vbHRpcERpc3BsYXkodGhpcy50b29sdGlwLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMudXBkYXRlLmZvcmNlKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBhdCB0aGUgdG9wIGNlbnRlciBvZiB0aGUgY3VycmVudCBET00gc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuXG4gIF9jcmVhdGVDbGFzcyhUb29sdGlwTWVudSwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMudXBkYXRlLmRldGFjaCgpO1xuICAgICAgdGhpcy50b29sdGlwLmRldGFjaCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmVwYXJlVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMubWVudS5hY3RpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbiA9IHRoaXMucG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbi5lbXB0eTtcbiAgICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbi5ub2RlO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uLnRvO3ZhciBsaW5rID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCF0aGlzLnBtLmhhc0ZvY3VzKCkpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLnRvb2x0aXAuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSB0b3BPZk5vZGVTZWxlY3Rpb24oX3RoaXMyLnBtKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhfdGhpczIuYmxvY2tJdGVtcywgY29vcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICAgIH0gZWxzZSBpZiAoIWVtcHR5KSB7XG4gICAgICAgIHZhciBfcmV0MiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IG5vZGUgPyB0b3BPZk5vZGVTZWxlY3Rpb24oX3RoaXMyLnBtKSA6IHRvcENlbnRlck9mU2VsZWN0aW9uKCk7XG4gICAgICAgICAgdmFyIHNob3dCbG9jayA9IF90aGlzMi5zZWxlY3RlZEJsb2NrTWVudSAmJiBfbW9kZWwuUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkgJiYgZnJvbS5vZmZzZXQgPT0gMCAmJiB0by5vZmZzZXQgPT0gX3RoaXMyLnBtLmRvYy5wYXRoKGZyb20ucGF0aCkuc2l6ZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhzaG93QmxvY2sgPyBbX3RoaXMyLmlubGluZUl0ZW1zLCBfdGhpczIuYmxvY2tJdGVtc10gOiBfdGhpczIuaW5saW5lSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQyID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDIudjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEJsb2NrTWVudSAmJiB0aGlzLnBtLmRvYy5wYXRoKGZyb20ucGF0aCkuc2l6ZSA9PSAwKSB7XG4gICAgICAgIHZhciBfcmV0MyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzMi5wbS5jb29yZHNBdFBvcyhmcm9tKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLm1lbnUuc2hvdyhfdGhpczIuYmxvY2tJdGVtcywgY29vcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldDMgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0My52O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dMaW5rcyAmJiAobGluayA9IHRoaXMubGlua1VuZGVyQ3Vyc29yKCkpKSB7XG4gICAgICAgIHZhciBfcmV0NCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIGNvb3JkcyA9IF90aGlzMi5wbS5jb29yZHNBdFBvcyhmcm9tKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnNob3dMaW5rKGxpbmssIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQ0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDQudjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi50b29sdGlwLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxpbmtVbmRlckN1cnNvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaW5rVW5kZXJDdXJzb3IoKSB7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMucG0uc2VsZWN0aW9uLmhlYWQ7XG4gICAgICBpZiAoIWhlYWQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG1hcmtzID0gdGhpcy5wbS5kb2MubWFya3NBdChoZWFkKTtcbiAgICAgIHJldHVybiBtYXJrcy5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBtKSB7XG4gICAgICAgIHJldHVybiBmb3VuZCB8fCBtLnR5cGUubmFtZSA9PSBcImxpbmtcIiAmJiBtO1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3dMaW5rXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3dMaW5rKGxpbmssIHBvcykge1xuICAgICAgdmFyIG5vZGUgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBjbGFzc1ByZWZpeCArIFwiLWxpbmt0ZXh0XCIgfSwgKDAsIF9kb20uZWx0KShcImFcIiwgeyBocmVmOiBsaW5rLmF0dHJzLmhyZWYsIHRpdGxlOiBsaW5rLmF0dHJzLnRpdGxlIH0sIGxpbmsuYXR0cnMuaHJlZikpO1xuICAgICAgdGhpcy50b29sdGlwLm9wZW4obm9kZSwgcG9zKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcE1lbnU7XG59KSgpO1xuXG5mdW5jdGlvbiB0b3BDZW50ZXJPZlNlbGVjdGlvbigpIHtcbiAgdmFyIHJlY3RzID0gd2luZG93LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgdmFyIF9yZWN0cyQwID0gcmVjdHNbMF07XG4gIHZhciBsZWZ0ID0gX3JlY3RzJDAubGVmdDtcbiAgdmFyIHJpZ2h0ID0gX3JlY3RzJDAucmlnaHQ7XG4gIHZhciB0b3AgPSBfcmVjdHMkMC50b3A7dmFyIGkgPSAxO1xuICB3aGlsZSAobGVmdCA9PSByaWdodCAmJiByZWN0cy5sZW5ndGggPiBpKSB7XG4gICAgO3ZhciBfcmVjdHMgPSByZWN0c1tpKytdO1xuICAgIGxlZnQgPSBfcmVjdHMubGVmdDtcbiAgICByaWdodCA9IF9yZWN0cy5yaWdodDtcbiAgICB0b3AgPSBfcmVjdHMudG9wO1xuICB9XG4gIGZvciAoOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVjdHNbaV0udG9wIDwgcmVjdHNbMF0uYm90dG9tIC0gMSAmJiAoXG4gICAgLy8gQ2hyb21lIGJ1ZyB3aGVyZSBib2d1cyByZWN0YW5nbGVzIGFyZSBpbnNlcnRlZCBhdCBzcGFuIGJvdW5kYXJpZXNcbiAgICBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgTWF0aC5hYnMocmVjdHNbaSArIDFdLmxlZnQgLSByZWN0c1tpXS5sZWZ0KSA+IDEpKSB7XG4gICAgICBsZWZ0ID0gTWF0aC5taW4obGVmdCwgcmVjdHNbaV0ubGVmdCk7XG4gICAgICByaWdodCA9IE1hdGgubWF4KHJpZ2h0LCByZWN0c1tpXS5yaWdodCk7XG4gICAgICB0b3AgPSBNYXRoLm1pbih0b3AsIHJlY3RzW2ldLnRvcCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiAobGVmdCArIHJpZ2h0KSAvIDIgfTtcbn1cblxuZnVuY3Rpb24gdG9wT2ZOb2RlU2VsZWN0aW9uKHBtKSB7XG4gIHZhciBzZWxlY3RlZCA9IHBtLmNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG4gIGlmICghc2VsZWN0ZWQpIHJldHVybiB7IGxlZnQ6IDAsIHRvcDogMCB9O1xuICB2YXIgYm94ID0gc2VsZWN0ZWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7IGxlZnQ6IE1hdGgubWluKChib3gubGVmdCArIGJveC5yaWdodCkgLyAyLCBib3gubGVmdCArIDIwKSwgdG9wOiBib3gudG9wIH07XG59XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcG1lbnUtbGlua3RleHQgYSB7XFxuICBjb2xvcjogd2hpdGU7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBwYWRkaW5nOiAwIDVweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXBtZW51LWxpbmt0ZXh0IGE6aG92ZXIge1xcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTUlOX0ZMVVNIX0RFTEFZID0gMjAwO1xudmFyIFVQREFURV9USU1FT1VUID0gMjAwO1xuXG52YXIgTWVudVVwZGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1lbnVVcGRhdGUocG0sIGV2ZW50cywgcHJlcGFyZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudVVwZGF0ZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG4gICAgdGhpcy5wcmVwYXJlID0gcHJlcGFyZTtcblxuICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlSW5mbyA9IG51bGw7XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RGbHVzaCA9IDA7XG5cbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cy5zcGxpdChcIiBcIik7XG4gICAgdGhpcy5vbkV2ZW50ID0gdGhpcy5vbkV2ZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5mb3JjZSA9IHRoaXMuZm9yY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgcmV0dXJuIHBtLm9uKGV2ZW50LCBfdGhpcy5vbkV2ZW50KTtcbiAgICB9KTtcbiAgICBwbS5vbihcImZsdXNoXCIsIHRoaXMub25GbHVzaCA9IHRoaXMub25GbHVzaC5iaW5kKHRoaXMpKTtcbiAgICBwbS5vbihcImZsdXNoZWRcIiwgdGhpcy5vbkZsdXNoZWQgPSB0aGlzLm9uRmx1c2hlZC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZW51VXBkYXRlLCBbe1xuICAgIGtleTogXCJkZXRhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5wbS5vZmYoZXZlbnQsIF90aGlzMi5vbkV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbS5vZmYoXCJmbHVzaFwiLCB0aGlzLm9uRmx1c2gpO1xuICAgICAgdGhpcy5wbS5vZmYoXCJmbHVzaGVkXCIsIHRoaXMub25GbHVzaGVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25GbHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkZsdXNoKCkge1xuICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5tdXN0VXBkYXRlICYmIG5vdyAtIHRoaXMubGFzdEZsdXNoID49IE1JTl9GTFVTSF9ERUxBWSkge1xuICAgICAgICB0aGlzLmxhc3RGbHVzaCA9IG5vdztcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IHRoaXMucHJlcGFyZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkZsdXNoZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25GbHVzaGVkKCkge1xuICAgICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25FdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkV2ZW50KCkge1xuICAgICAgdGhpcy5tdXN0VXBkYXRlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmZvcmNlLCBVUERBVEVfVElNRU9VVCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZvcmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgICAgaWYgKHRoaXMucG0ub3BlcmF0aW9uKSB7XG4gICAgICAgIHRoaXMub25FdmVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEZsdXNoID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHZhciB1cGRhdGUgPSB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lbnVVcGRhdGU7XG59KSgpO1xuXG5leHBvcnRzLk1lbnVVcGRhdGUgPSBNZW51VXBkYXRlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9zY2hlbWEgPSByZXF1aXJlKFwiLi9zY2hlbWFcIik7XG5cbi8vIDs7ICN0b2M9XCJEZWZhdWx0IHNjaGVtYVwiIFRoZSBkZWZhdWx0IHRvcC1sZXZlbCBkb2N1bWVudCBub2RlIHR5cGUuXG5cbnZhciBEb2MgPSAoZnVuY3Rpb24gKF9CbG9jaykge1xuICBfaW5oZXJpdHMoRG9jLCBfQmxvY2spO1xuXG4gIGZ1bmN0aW9uIERvYygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9jKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKERvYy5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGJsb2NrcXVvdGUgbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhEb2MsIG51bGwsIFt7XG4gICAga2V5OiBcImtpbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcIi5cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRG9jO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuRG9jID0gRG9jO1xuXG52YXIgQmxvY2tRdW90ZSA9IChmdW5jdGlvbiAoX0Jsb2NrMikge1xuICBfaW5oZXJpdHMoQmxvY2tRdW90ZSwgX0Jsb2NrMik7XG5cbiAgZnVuY3Rpb24gQmxvY2tRdW90ZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmxvY2tRdW90ZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCbG9ja1F1b3RlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgb3JkZXJlZCBsaXN0IG5vZGUgdHlwZS4gSGFzIGEgc2luZ2xlIGF0dHJpYnV0ZSxcbiAgLy8gYG9yZGVyYCwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIGF0IHdoaWNoIHRoZSBsaXN0IHN0YXJ0c1xuICAvLyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuXG4gIHJldHVybiBCbG9ja1F1b3RlO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuQmxvY2tRdW90ZSA9IEJsb2NrUXVvdGU7XG5cbnZhciBPcmRlcmVkTGlzdCA9IChmdW5jdGlvbiAoX0Jsb2NrMykge1xuICBfaW5oZXJpdHMoT3JkZXJlZExpc3QsIF9CbG9jazMpO1xuXG4gIGZ1bmN0aW9uIE9yZGVyZWRMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcmRlcmVkTGlzdCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihPcmRlcmVkTGlzdC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoT3JkZXJlZExpc3QsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsaXN0X2l0ZW1cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gT3JkZXJlZExpc3Q7XG59KShfc2NoZW1hLkJsb2NrKTtcblxuZXhwb3J0cy5PcmRlcmVkTGlzdCA9IE9yZGVyZWRMaXN0O1xuXG5PcmRlcmVkTGlzdC5hdHRyaWJ1dGVzID0geyBvcmRlcjogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiMVwiIH0pIH07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgYnVsbGV0IGxpc3Qgbm9kZSB0eXBlLlxuXG52YXIgQnVsbGV0TGlzdCA9IChmdW5jdGlvbiAoX0Jsb2NrNCkge1xuICBfaW5oZXJpdHMoQnVsbGV0TGlzdCwgX0Jsb2NrNCk7XG5cbiAgZnVuY3Rpb24gQnVsbGV0TGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQnVsbGV0TGlzdCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCdWxsZXRMaXN0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgbGlzdCBpdGVtIG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoQnVsbGV0TGlzdCwgbnVsbCwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImxpc3RfaXRlbVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCdWxsZXRMaXN0O1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuQnVsbGV0TGlzdCA9IEJ1bGxldExpc3Q7XG5cbnZhciBMaXN0SXRlbSA9IChmdW5jdGlvbiAoX0Jsb2NrNSkge1xuICBfaW5oZXJpdHMoTGlzdEl0ZW0sIF9CbG9jazUpO1xuXG4gIGZ1bmN0aW9uIExpc3RJdGVtKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaXN0SXRlbSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihMaXN0SXRlbS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhvcml6b250YWwgcnVsZSBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKExpc3RJdGVtLCBudWxsLCBbe1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpc3RJdGVtO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuTGlzdEl0ZW0gPSBMaXN0SXRlbTtcblxudmFyIEhvcml6b250YWxSdWxlID0gKGZ1bmN0aW9uIChfQmxvY2s2KSB7XG4gIF9pbmhlcml0cyhIb3Jpem9udGFsUnVsZSwgX0Jsb2NrNik7XG5cbiAgZnVuY3Rpb24gSG9yaXpvbnRhbFJ1bGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhvcml6b250YWxSdWxlKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEhvcml6b250YWxSdWxlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgaGVhZGluZyBub2RlIHR5cGUuIEhhcyBhIHNpbmdsZSBhdHRyaWJ1dGVcbiAgLy8gYGxldmVsYCwgd2hpY2ggaW5kaWNhdGVzIHRoZSBoZWFkaW5nIGxldmVsLCBhbmQgZGVmYXVsdHMgdG8gMS5cblxuICBfY3JlYXRlQ2xhc3MoSG9yaXpvbnRhbFJ1bGUsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSG9yaXpvbnRhbFJ1bGU7XG59KShfc2NoZW1hLkJsb2NrKTtcblxuZXhwb3J0cy5Ib3Jpem9udGFsUnVsZSA9IEhvcml6b250YWxSdWxlO1xuXG52YXIgSGVhZGluZyA9IChmdW5jdGlvbiAoX1RleHRibG9jaykge1xuICBfaW5oZXJpdHMoSGVhZGluZywgX1RleHRibG9jayk7XG5cbiAgZnVuY3Rpb24gSGVhZGluZygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGVhZGluZyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihIZWFkaW5nLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBIZWFkaW5nO1xufSkoX3NjaGVtYS5UZXh0YmxvY2spO1xuXG5leHBvcnRzLkhlYWRpbmcgPSBIZWFkaW5nO1xuXG5IZWFkaW5nLmF0dHJpYnV0ZXMgPSB7IGxldmVsOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCIxXCIgfSkgfTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBjb2RlIGJsb2NrIC8gbGlzdGluZyBub2RlIHR5cGUuIE9ubHlcbi8vIGFsbG93cyB1bm1hcmtlZCB0ZXh0IG5vZGVzIGluc2lkZSBvZiBpdC5cblxudmFyIENvZGVCbG9jayA9IChmdW5jdGlvbiAoX1RleHRibG9jazIpIHtcbiAgX2luaGVyaXRzKENvZGVCbG9jaywgX1RleHRibG9jazIpO1xuXG4gIGZ1bmN0aW9uIENvZGVCbG9jaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29kZUJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKENvZGVCbG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IHBhcmFncmFwaCBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKENvZGVCbG9jaywgW3tcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0NvZGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvZGVCbG9jaztcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5Db2RlQmxvY2sgPSBDb2RlQmxvY2s7XG5cbnZhciBQYXJhZ3JhcGggPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2szKSB7XG4gIF9pbmhlcml0cyhQYXJhZ3JhcGgsIF9UZXh0YmxvY2szKTtcblxuICBmdW5jdGlvbiBQYXJhZ3JhcGgoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcmFncmFwaCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihQYXJhZ3JhcGgucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBpbmxpbmUgaW1hZ2Ugbm9kZSB0eXBlLiBIYXMgdGhlc2VcbiAgLy8gYXR0cmlidXRlczpcbiAgLy9cbiAgLy8gLSAqKmBzcmNgKiogKHJlcXVpcmVkKTogVGhlIFVSTCBvZiB0aGUgaW1hZ2UuXG4gIC8vIC0gKipgYWx0YCoqOiBUaGUgYWx0IHRleHQuXG4gIC8vIC0gKipgdGl0bGVgKio6IFRoZSB0aXRsZSBvZiB0aGUgaW1hZ2UuXG5cbiAgX2NyZWF0ZUNsYXNzKFBhcmFncmFwaCwgW3tcbiAgICBrZXk6IFwiZGVmYXVsdFRleHRibG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhcmFncmFwaDtcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5QYXJhZ3JhcGggPSBQYXJhZ3JhcGg7XG5cbnZhciBJbWFnZSA9IChmdW5jdGlvbiAoX0lubGluZSkge1xuICBfaW5oZXJpdHMoSW1hZ2UsIF9JbmxpbmUpO1xuXG4gIGZ1bmN0aW9uIEltYWdlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbWFnZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihJbWFnZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gSW1hZ2U7XG59KShfc2NoZW1hLklubGluZSk7XG5cbmV4cG9ydHMuSW1hZ2UgPSBJbWFnZTtcblxuSW1hZ2UuYXR0cmlidXRlcyA9IHtcbiAgc3JjOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoKSxcbiAgYWx0OiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KSxcbiAgdGl0bGU6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSh7IFwiZGVmYXVsdFwiOiBcIlwiIH0pXG59O1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhhcmQgYnJlYWsgbm9kZSB0eXBlLlxuXG52YXIgSGFyZEJyZWFrID0gKGZ1bmN0aW9uIChfSW5saW5lMikge1xuICBfaW5oZXJpdHMoSGFyZEJyZWFrLCBfSW5saW5lMik7XG5cbiAgZnVuY3Rpb24gSGFyZEJyZWFrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIYXJkQnJlYWspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSGFyZEJyZWFrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgZW1waGFzaXMgbWFyayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhIYXJkQnJlYWssIFt7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCUlwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhhcmRCcmVhaztcbn0pKF9zY2hlbWEuSW5saW5lKTtcblxuZXhwb3J0cy5IYXJkQnJlYWsgPSBIYXJkQnJlYWs7XG5cbnZhciBFbU1hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZSkge1xuICBfaW5oZXJpdHMoRW1NYXJrLCBfTWFya1R5cGUpO1xuXG4gIGZ1bmN0aW9uIEVtTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1NYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEVtTWFyay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IHN0cm9uZyBtYXJrIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKEVtTWFyaywgbnVsbCwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFbU1hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5FbU1hcmsgPSBFbU1hcms7XG5cbnZhciBTdHJvbmdNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUyKSB7XG4gIF9pbmhlcml0cyhTdHJvbmdNYXJrLCBfTWFya1R5cGUyKTtcblxuICBmdW5jdGlvbiBTdHJvbmdNYXJrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdHJvbmdNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFN0cm9uZ01hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBsaW5rIG1hcmsgdHlwZS4gSGFzIHRoZXNlIGF0dHJpYnV0ZXM6XG4gIC8vXG4gIC8vIC0gKipgaHJlZmAqKiAocmVxdWlyZWQpOiBUaGUgbGluayB0YXJnZXQuXG4gIC8vIC0gKipgdGl0bGVgKio6IFRoZSBsaW5rJ3MgdGl0bGUuXG5cbiAgX2NyZWF0ZUNsYXNzKFN0cm9uZ01hcmssIG51bGwsIFt7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3Ryb25nTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLlN0cm9uZ01hcmsgPSBTdHJvbmdNYXJrO1xuXG52YXIgTGlua01hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZTMpIHtcbiAgX2luaGVyaXRzKExpbmtNYXJrLCBfTWFya1R5cGUzKTtcblxuICBmdW5jdGlvbiBMaW5rTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlua01hcmspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTGlua01hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExpbmtNYXJrLCBudWxsLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gNTM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtNYXJrO1xufSkoX3NjaGVtYS5NYXJrVHlwZSk7XG5cbmV4cG9ydHMuTGlua01hcmsgPSBMaW5rTWFyaztcblxuTGlua01hcmsuYXR0cmlidXRlcyA9IHtcbiAgaHJlZjogbmV3IF9zY2hlbWEuQXR0cmlidXRlKCksXG4gIHRpdGxlOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KVxufTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBjb2RlIGZvbnQgbWFyayB0eXBlLlxuXG52YXIgQ29kZU1hcmsgPSAoZnVuY3Rpb24gKF9NYXJrVHlwZTQpIHtcbiAgX2luaGVyaXRzKENvZGVNYXJrLCBfTWFya1R5cGU0KTtcblxuICBmdW5jdGlvbiBDb2RlTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29kZU1hcmspO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ29kZU1hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOjogU2NoZW1hU3BlY1xuICAvLyBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGRlZmF1bHQgc2NoZW1hLlxuXG4gIF9jcmVhdGVDbGFzcyhDb2RlTWFyaywgW3tcbiAgICBrZXk6IFwiaXNDb2RlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gMTAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2RlTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLkNvZGVNYXJrID0gQ29kZU1hcms7XG52YXIgZGVmYXVsdFNwZWMgPSBuZXcgX3NjaGVtYS5TY2hlbWFTcGVjKHtcbiAgZG9jOiBEb2MsXG4gIGJsb2NrcXVvdGU6IEJsb2NrUXVvdGUsXG4gIG9yZGVyZWRfbGlzdDogT3JkZXJlZExpc3QsXG4gIGJ1bGxldF9saXN0OiBCdWxsZXRMaXN0LFxuICBsaXN0X2l0ZW06IExpc3RJdGVtLFxuICBob3Jpem9udGFsX3J1bGU6IEhvcml6b250YWxSdWxlLFxuXG4gIHBhcmFncmFwaDogUGFyYWdyYXBoLFxuICBoZWFkaW5nOiBIZWFkaW5nLFxuICBjb2RlX2Jsb2NrOiBDb2RlQmxvY2ssXG5cbiAgdGV4dDogX3NjaGVtYS5UZXh0LFxuICBpbWFnZTogSW1hZ2UsXG4gIGhhcmRfYnJlYWs6IEhhcmRCcmVha1xufSwge1xuICBlbTogRW1NYXJrLFxuICBzdHJvbmc6IFN0cm9uZ01hcmssXG4gIGxpbms6IExpbmtNYXJrLFxuICBjb2RlOiBDb2RlTWFya1xufSk7XG5cbi8vIDo6IFNjaGVtYVxuLy8gUHJvc2VNaXJyb3IncyBkZWZhdWx0IGRvY3VtZW50IHNjaGVtYS5cbnZhciBkZWZhdWx0U2NoZW1hID0gbmV3IF9zY2hlbWEuU2NoZW1hKGRlZmF1bHRTcGVjKTtcbmV4cG9ydHMuZGVmYXVsdFNjaGVtYSA9IGRlZmF1bHRTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmZpbmREaWZmU3RhcnQgPSBmaW5kRGlmZlN0YXJ0O1xuZXhwb3J0cy5maW5kRGlmZkVuZCA9IGZpbmREaWZmRW5kO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxuLy8gOjogKE5vZGUsIE5vZGUpIOKGkiA/UG9zXG4vLyBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCBub2RlcyBgYWAgYW5kIGBiYCBkaWZmZXIsIG9yXG4vLyBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuXG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYikge1xuICB2YXIgcGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBpQSA9IGEuaXRlcigpLFxuICAgICAgaUIgPSBiLml0ZXIoKSxcbiAgICAgIG9mZnNldCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoaUEuYXRFbmQoKSB8fCBpQi5hdEVuZCgpKSB7XG4gICAgICBpZiAoYS5zaXplID09IGIuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRBID0gaUEubmV4dCgpLFxuICAgICAgICBjaGlsZEIgPSBpQi5uZXh0KCk7XG4gICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgIG9mZnNldCArPSBjaGlsZEEud2lkdGg7Y29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKSBicmVhaztcblxuICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgY2hpbGRBLnRleHRbal0gPT0gY2hpbGRCLnRleHRbal07IGorKykge1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgIH1icmVhaztcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRBLnNpemUgfHwgY2hpbGRCLnNpemUpIHtcbiAgICAgIHBhdGgucHVzaChvZmZzZXQpO1xuICAgICAgdmFyIGlubmVyID0gZmluZERpZmZTdGFydChjaGlsZEEuY29udGVudCwgY2hpbGRCLmNvbnRlbnQsIHBhdGgpO1xuICAgICAgaWYgKGlubmVyKSByZXR1cm4gaW5uZXI7XG4gICAgICBwYXRoLnBvcCgpO1xuICAgIH1cbiAgICBvZmZzZXQgKz0gY2hpbGRBLndpZHRoO1xuICB9XG4gIHJldHVybiBuZXcgX3Bvcy5Qb3MocGF0aCwgb2Zmc2V0KTtcbn1cblxuLy8gOjogKE5vZGUsIE5vZGUpIOKGkiA/e2E6IFBvcywgYjogUG9zfVxuLy8gRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIG5vZGVzIGBhYFxuLy8gYW5kIGBiYCBkaWZmZXIsIG9yIGBudWxsYCBpZiB0aGV5IGFyZSB0aGUgc2FtZS4gU2luY2UgdGhpcyBwb3NpdGlvblxuLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aCBub2RlcywgYW4gb2JqZWN0IHdpdGggdHdvIHNlcGFyYXRlXG4vLyBwb3NpdGlvbnMgaXMgcmV0dXJuZWQuXG5cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIpIHtcbiAgdmFyIHBhdGhBID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbMl07XG4gIHZhciBwYXRoQiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzNdO1xuXG4gIHZhciBpQSA9IGEucmV2ZXJzZUl0ZXIoKSxcbiAgICAgIGlCID0gYi5yZXZlcnNlSXRlcigpO1xuICB2YXIgb2ZmQSA9IGEuc2l6ZSxcbiAgICAgIG9mZkIgPSBiLnNpemU7XG5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpQS5hdEVuZCgpIHx8IGlCLmF0RW5kKCkpIHtcbiAgICAgIGlmIChhLnNpemUgPT0gYi5zaXplKSByZXR1cm4gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgY2hpbGRBID0gaUEubmV4dCgpLFxuICAgICAgICBjaGlsZEIgPSBpQi5uZXh0KCk7XG4gICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgIG9mZkEgLT0gY2hpbGRBLndpZHRoO29mZkIgLT0gY2hpbGRCLndpZHRoO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKSBicmVhaztcblxuICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICB2YXIgc2FtZSA9IDAsXG4gICAgICAgICAgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgIHNhbWUrKztvZmZBLS07b2ZmQi0tO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG9mZkEgLT0gY2hpbGRBLndpZHRoO29mZkIgLT0gY2hpbGRCLndpZHRoO1xuICAgIGlmIChjaGlsZEEuc2l6ZSB8fCBjaGlsZEIuc2l6ZSkge1xuICAgICAgcGF0aEEucHVzaChvZmZBKTtwYXRoQi5wdXNoKG9mZkIpO1xuICAgICAgdmFyIGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwYXRoQSwgcGF0aEIpO1xuICAgICAgaWYgKGlubmVyKSByZXR1cm4gaW5uZXI7XG4gICAgICBwYXRoQS5wb3AoKTtwYXRoQi5wb3AoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYTogbmV3IF9wb3MuUG9zKHBhdGhBLCBvZmZBKSwgYjogbmV3IF9wb3MuUG9zKHBhdGhCLCBvZmZCKSB9O1xufSIsIi8vIDs7IEEgZnJhZ21lbnQgaXMgYW4gYWJzdHJhY3QgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBhIG5vZGUnc1xuLy8gY29sbGVjdGlvbiBvZiBjaGlsZCBub2Rlcy4gSXQgdHJpZXMgdG8gaGlkZSBjb25zaWRlcmF0aW9ucyBhYm91dFxuLy8gdGhlIGFjdHVhbCB3YXkgaW4gd2hpY2ggdGhlIGNoaWxkIG5vZGVzIGFyZSBzdG9yZWQsIHNvIHRoYXRcbi8vIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgKG5vZGVzIHRoYXQgb25seSBjb250YWluIHNpbXBsZSBub2Rlc1xuLy8gdmVyc3VzIG5vZGVzIHRoYXQgYWxzbyBjb250YWluIHRleHQpIGNhbiBiZSBhcHByb2FjaGVkIHVzaW5nIHRoZVxuLy8gc2FtZSBBUEkuXG4vL1xuLy8gRnJhZ21lbnRzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcy4gVGhhdCBtZWFucyB5b3Ugc2hvdWxkXG4vLyBfbm90XyBtdXRhdGUgdGhlbSBvciB0aGVpciBjb250ZW50LCBidXQgY3JlYXRlIG5ldyBpbnN0YW5jZXNcbi8vIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDE2LCBfeDE3LCBfeDE4KSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94MTYsIHByb3BlcnR5ID0gX3gxNywgcmVjZWl2ZXIgPSBfeDE4OyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94MTYgPSBwYXJlbnQ7IF94MTcgPSBwcm9wZXJ0eTsgX3gxOCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEZyYWdtZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRnJhZ21lbnQoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZyYWdtZW50KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGcmFnbWVudCwgW3tcbiAgICBrZXk6IFwiYXBwZW5kXCIsXG5cbiAgICAvLyA6OiAoRnJhZ21lbnQsIG51bWJlciwgbnVtYmVyKSDihpIgRnJhZ21lbnRcbiAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCB0aGF0IGNvbWJpbmVzIHRoaXMgb25lIHdpdGggYW5vdGhlciBmcmFnbWVudC5cbiAgICAvLyBUYWtlcyBjYXJlIG9mIG1lcmdpbmcgYWRqYWNlbnQgdGV4dCBub2RlcyBhbmQgY2FuIGFsc28gbWVyZ2VcbiAgICAvLyDigJxvcGVu4oCdIG5vZGVzIGF0IHRoZSBib3VuZGFyeS4gYGpvaW5MZWZ0YCBhbmQgYGpvaW5SaWdodGAgZ2l2ZSB0aGVcbiAgICAvLyBkZXB0aCB0byB3aGljaCB0aGUgbGVmdCBhbmQgcmlnaHQgZnJhZ21lbnRzIGFyZSBvcGVuLiBJZiBvcGVuXG4gICAgLy8gbm9kZXMgd2l0aCB0aGUgc2FtZSBtYXJrdXAgYXJlIGZvdW5kIG9uIGJvdGggc2lkZXMsIHRoZXkgYXJlXG4gICAgLy8gam9pbmVkLiBJZiBub3QsIHRoZSBvcGVuIG5vZGVzIGFyZSBbY2xvc2VkXSgjTm9kZS5jbG9zZSkuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZChvdGhlcikge1xuICAgICAgdmFyIGpvaW5MZWZ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhciBqb2luUmlnaHQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICBpZiAoIXRoaXMuc2l6ZSkgcmV0dXJuIGpvaW5SaWdodCA/IG90aGVyLnJlcGxhY2UoMCwgb3RoZXIuZmlyc3RDaGlsZC5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKSA6IG90aGVyO1xuICAgICAgaWYgKCFvdGhlci5zaXplKSByZXR1cm4gam9pbkxlZnQgPyB0aGlzLnJlcGxhY2UodGhpcy5zaXplIC0gMSwgdGhpcy5sYXN0Q2hpbGQuY2xvc2Uoam9pbkxlZnQgLSAxLCBcImVuZFwiKSkgOiB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpO1xuICAgIH1cblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBub2RlcyBmb3VuZCBpbiB0aGlzIGZyYWdtZW50IGFuZCBpdHNcbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuXG4gICAgLy8gOjogKCkg4oaSIHN0cmluZ1xuICAgIC8vIFJldHVybiBhIGRlYnVnZ2luZyBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBmcmFnbWVudC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc3RyID0gXCJcIjtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gc3RyICs9IChzdHIgPyBcIiwgXCIgOiBcIlwiKSArIG4udG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBudW1iZXIsID8oTm9kZSkg4oaSIE5vZGUpIOKGkiBbTm9kZV1cbiAgICAvLyBQcm9kdWNlIGFuIGFycmF5IHdpdGggdGhlIGNoaWxkIG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuXG4gICAgLy8gYm91bmRhcmllcywgb3B0aW9uYWxseSBtYXBwaW5nIGEgZnVuY3Rpb24gb3ZlciB0aGVtLlxuICB9LCB7XG4gICAga2V5OiBcInRvQXJyYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9BcnJheShmcm9tLCB0bywgZikge1xuICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCkgZnJvbSA9IDA7XG4gICAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgdG8gPSB0aGlzLnNpemU7XG5cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoZnJvbSwgdG8pLCBuID0gdW5kZWZpbmVkOyBuID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGYgPyBmKG4pIDogbik7XG4gICAgICB9cmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoKE5vZGUpIOKGkiBOb2RlKSDihpIgRnJhZ21lbnRcbiAgICAvLyBQcm9kdWNlIGEgbmV3IEZyYWdtZW50IGJ5IG1hcHBpbmcgYWxsIHRoaXMgZnJhZ21lbnQncyBjaGlsZHJlblxuICAgIC8vIHRocm91Z2ggYSBmdW5jdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKGYpIHtcbiAgICAgIC8vIEZJWE1FIGpvaW4gdGV4dCBub2Rlcz9cbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkodGhpcy50b0FycmF5KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKChOb2RlKSDihpIgYm9vbCkg4oaSIGJvb2xcbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJuZWQgYHRydWVgIGZvciBhbnkgb2ZcbiAgICAvLyB0aGUgZnJhZ21lbnQncyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJzb21lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNvbWUoZikge1xuICAgICAgZm9yICh2YXIgaXRlciA9IHRoaXMuaXRlcigpLCBuID0gdW5kZWZpbmVkOyBuID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIGlmIChmKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoZGVwdGgsIHNpZGUpIHtcbiAgICAgIHZhciBjaGlsZCA9IHNpZGUgPT0gXCJzdGFydFwiID8gdGhpcy5maXJzdENoaWxkIDogdGhpcy5sYXN0Q2hpbGQ7XG4gICAgICB2YXIgY2xvc2VkID0gY2hpbGQuY2xvc2UoZGVwdGggLSAxLCBzaWRlKTtcbiAgICAgIGlmIChjbG9zZWQgPT0gY2hpbGQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzaWRlID09IFwic3RhcnRcIiA/IDAgOiB0aGlzLnNpemUgLSAxLCBjbG9zZWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub2Rlc0JldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBwYXRoLCBwYXJlbnQpIHtcbiAgICAgIHZhciBtb3JlRnJvbSA9IGZyb20gJiYgZnJvbS5kZXB0aCA+IHBhdGgubGVuZ3RoLFxuICAgICAgICAgIG1vcmVUbyA9IHRvICYmIHRvLmRlcHRoID4gcGF0aC5sZW5ndGg7XG4gICAgICB2YXIgc3RhcnQgPSBtb3JlRnJvbSA/IGZyb20ucGF0aFtwYXRoLmxlbmd0aF0gOiBmcm9tID8gZnJvbS5vZmZzZXQgOiAwO1xuICAgICAgdmFyIGVuZCA9IG1vcmVUbyA/IHRvLnBhdGhbcGF0aC5sZW5ndGhdICsgMSA6IHRvID8gdG8ub2Zmc2V0IDogdGhpcy5zaXplO1xuICAgICAgZm9yICh2YXIgaXRlciA9IHRoaXMuaXRlcihzdGFydCwgZW5kKSwgbm9kZSA9IHVuZGVmaW5lZDsgbm9kZSA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBpdGVyLm9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICAgIHBhdGgucHVzaChzdGFydE9mZnNldCk7XG4gICAgICAgIG5vZGUubm9kZXNCZXR3ZWVuKG1vcmVGcm9tICYmIHN0YXJ0T2Zmc2V0ID09IHN0YXJ0ID8gZnJvbSA6IG51bGwsIG1vcmVUbyAmJiBpdGVyLm9mZnNldCA9PSBlbmQgPyB0byA6IG51bGwsIGYsIHBhdGgsIHBhcmVudCk7XG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MpIOKGkiBGcmFnbWVudFxuICAgIC8vIFNsaWNlIG91dCB0aGUgc3ViLWZyYWdtZW50IGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgLy8gYG51bGxgIGNhbiBiZSBwYXNzZWQgZm9yIGVpdGhlciB0byBpbmRpY2F0ZSB0aGUgc2xpY2Ugc2hvdWxkIGdvXG4gICAgLy8gYWxsIHRoZSB3YXkgdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlQmV0d2Vlbihmcm9tLCB0bykge1xuICAgICAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgdmFyIG1vcmVGcm9tID0gZnJvbSAmJiBmcm9tLmRlcHRoID4gZGVwdGgsXG4gICAgICAgICAgbW9yZVRvID0gdG8gJiYgdG8uZGVwdGggPiBkZXB0aDtcbiAgICAgIHZhciBzdGFydCA9IG1vcmVGcm9tID8gZnJvbS5wYXRoW2RlcHRoXSA6IGZyb20gPyBmcm9tLm9mZnNldCA6IDA7XG4gICAgICB2YXIgZW5kID0gbW9yZVRvID8gdG8ucGF0aFtkZXB0aF0gKyAxIDogdG8gPyB0by5vZmZzZXQgOiB0aGlzLnNpemU7XG4gICAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoc3RhcnQsIGVuZCksIG5vZGUgPSB1bmRlZmluZWQ7IG5vZGUgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgdmFyIHBhc3NGcm9tID0gbW9yZUZyb20gJiYgaXRlci5vZmZzZXQgLSBub2RlLndpZHRoID09IHN0YXJ0ID8gZnJvbSA6IG51bGw7XG4gICAgICAgIHZhciBwYXNzVG8gPSBtb3JlVG8gJiYgaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsO1xuICAgICAgICBpZiAocGFzc0Zyb20gfHwgcGFzc1RvKSBub2RlID0gbm9kZS5zbGljZUJldHdlZW4ocGFzc0Zyb20sIHBhc3NUbywgZGVwdGggKyAxKTtcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub2Rlcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgRnJhZ21lbnRcbiAgICAvLyBEZXNlcmlhbGl6ZSBhIGZyYWdtZW50IGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciB0ZXh0ID0gXCJcIjtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gdGV4dCArPSBuLnRleHRDb250ZW50O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyB0aGlzLmZyb21BcnJheSh2YWx1ZS5tYXAoc2NoZW1hLm5vZGVGcm9tSlNPTikpIDogZW1wdHlGcmFnbWVudDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW05vZGVdKSDihpIgRnJhZ21lbnRcbiAgICAvLyBCdWlsZCBhIGZyYWdtZW50IGZyb20gYW4gYXJyYXkgb2Ygbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbUFycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21BcnJheShhcnJheSkge1xuICAgICAgaWYgKCFhcnJheS5sZW5ndGgpIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgdmFyIGhhc1RleHQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFycmF5W2ldLmlzVGV4dCkgaGFzVGV4dCA9IHRydWU7XG4gICAgICB9cmV0dXJuIG5ldyAoaGFzVGV4dCA/IFRleHRGcmFnbWVudCA6IEZsYXRGcmFnbWVudCkoYXJyYXkpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/dW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBGcmFnbWVudFxuICAgIC8vIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2V0XG4gICAgLy8gb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIC8vIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgLy8gZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20obm9kZXMpIHtcbiAgICAgIGlmICghbm9kZXMpIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgaWYgKG5vZGVzIGluc3RhbmNlb2YgRnJhZ21lbnQpIHJldHVybiBub2RlcztcbiAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheShBcnJheS5pc0FycmF5KG5vZGVzKSA/IG5vZGVzIDogW25vZGVzXSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZyYWdtZW50O1xufSkoKTtcblxuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuXG52YXIgaXRlckVuZCA9IHsgZG9uZTogdHJ1ZSB9O1xuXG52YXIgRmxhdEl0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRmxhdEl0ZXJhdG9yKGFycmF5LCBwb3MsIGVuZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbGF0SXRlcmF0b3IpO1xuXG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIHRoaXMuZW5kID0gZW5kO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZsYXRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksIHRoaXMucG9zLCB0aGlzLmVuZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0RW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0RW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3MgPT0gdGhpcy5lbmQgPyBpdGVyRW5kIDogdGhpcy5hcnJheVt0aGlzLnBvcysrXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZsYXRJdGVyYXRvcjtcbn0pKCk7XG5cbnZhciBSZXZlcnNlRmxhdEl0ZXJhdG9yID0gKGZ1bmN0aW9uIChfRmxhdEl0ZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhSZXZlcnNlRmxhdEl0ZXJhdG9yLCBfRmxhdEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBSZXZlcnNlRmxhdEl0ZXJhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXZlcnNlRmxhdEl0ZXJhdG9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFJldmVyc2VGbGF0SXRlcmF0b3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI2ZvcndhcmQ9RnJhZ21lbnRcblxuICBfY3JlYXRlQ2xhc3MoUmV2ZXJzZUZsYXRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kID8gaXRlckVuZCA6IHRoaXMuYXJyYXlbLS10aGlzLnBvc107XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJldmVyc2VGbGF0SXRlcmF0b3I7XG59KShGbGF0SXRlcmF0b3IpO1xuXG52YXIgRmxhdEZyYWdtZW50ID0gKGZ1bmN0aW9uIChfRnJhZ21lbnQpIHtcbiAgX2luaGVyaXRzKEZsYXRGcmFnbWVudCwgX0ZyYWdtZW50KTtcblxuICBmdW5jdGlvbiBGbGF0RnJhZ21lbnQoY29udGVudCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbGF0RnJhZ21lbnQpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoRmxhdEZyYWdtZW50LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICB9XG5cbiAgLy8gOjogRnJhZ21lbnRcbiAgLy8gQW4gZW1wdHkgZnJhZ21lbnQuIEludGVuZGVkIHRvIGJlIHJldXNlZCB3aGVuZXZlciBhIG5vZGUgZG9lc24ndFxuICAvLyBjb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuICAvLyBlYWNoIGxlYWYgbm9kZSkuXG5cbiAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAvLyBDcmVhdGUgYSBmb3J3YXJkIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYWdtZW50LiBBblxuICAvLyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIG9mZnNldCBjYW4gYmUgZ2l2ZW4gdG8gaGF2ZSB0aGUgaXRlcmF0b3JcbiAgLy8gZ28gb3ZlciBvbmx5IHBhcnQgb2YgdGhlIGNvbnRlbnQuIElmIGFuIGl0ZXJhdGlvbiBib3VuZCBmYWxsc1xuICAvLyB3aXRoaW4gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgdGhhdCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBpc1xuICAvLyB5aWVsZGVkLlxuXG4gIF9jcmVhdGVDbGFzcyhGbGF0RnJhZ21lbnQsIFt7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcigpIHtcbiAgICAgIHZhciBzdGFydCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICByZXR1cm4gbmV3IEZsYXRJdGVyYXRvcih0aGlzLmNvbnRlbnQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgICAvLyBDcmVhdGUgYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYWdtZW50LiBBblxuICAgIC8vIGV4cGxpY2l0IHN0YXJ0IGFuZCBlbmQgb2Zmc2V0IGNhbiBiZSBnaXZlbiB0byBoYXZlIHRoZSBpdGVyYXRvclxuICAgIC8vIGdvIG92ZXIgb25seSBwYXJ0IG9mIHRoZSBjb250ZW50LiAqKk5vdGUqKjogYHN0YXJ0YCBzaG91bGQgYmVcbiAgICAvLyBncmVhdGVyIHRoYW4gYGVuZGAsIHdoZW4gcGFzc2VkLlxuICB9LCB7XG4gICAga2V5OiBcInJldmVyc2VJdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJldmVyc2VJdGVyKCkge1xuICAgICAgdmFyIHN0YXJ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgUmV2ZXJzZUZsYXRJdGVyYXRvcih0aGlzLmNvbnRlbnQsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6IG51bWJlclxuICAgIC8vIFRoZSBtYXhpbXVtIG9mZnNldCBpbiB0aGlzIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImNoaWxkXCIsXG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgY2hpbGQgYXQgdGhlIGdpdmVuIG9mZnNldC4gTWlnaHQgcmV0dXJuIGEgdGV4dCBub2RlIHRoYXRcbiAgICAvLyBzdHJldGNoZXMgYmVmb3JlIGFuZC9vciBhZnRlciB0aGUgb2Zmc2V0LlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGlsZChvZmYpIHtcbiAgICAgIGlmIChvZmYgPCAwIHx8IG9mZiA+PSB0aGlzLmNvbnRlbnQubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZzZXQgXCIgKyBvZmYgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50W29mZl07XG4gICAgfVxuXG4gICAgLy8gOjogKChub2RlOiBOb2RlLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikpXG4gICAgLy8gQ2FsbCB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2ggbm9kZSBpbiB0aGUgZnJhZ21lbnQsIHBhc3NpbmcgaXRcbiAgICAvLyB0aGUgbm9kZSwgaXRzIHN0YXJ0IG9mZnNldCwgYW5kIGl0cyBlbmQgb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChmKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmKHRoaXMuY29udGVudFtpXSwgaSwgaSArIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgZ2l2ZW4gb2Zmc2V0LiBSZXR1cm5zIGFuIG9iamVjdFxuICAgIC8vIGNvbnRhaW5pbmcgdGhlIG5vZGUgYXMgd2VsbCBhcyBpdHMgc3RhcnQgaW5kZXguIE9mZnNldCBzaG91bGQgYmVcbiAgICAvLyBncmVhdGVyIHRoYW4gemVyby5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY2hpbGQob2ZmIC0gMSksIHN0YXJ0OiBvZmYgLSAxIH07XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIHtzdGFydDogbnVtYmVyLCBub2RlOiBOb2RlfVxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldC4gUmV0dXJucyBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIHRoZSBub2RlIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGluZGV4LiBPZmZzZXQgc2hvdWxkIGJlXG4gICAgLy8gbGVzcyB0aGFuIHRoZSBmcmFnbWVudCdzIHNpemUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2h1bmtBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0FmdGVyKG9mZikge1xuICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jaGlsZChvZmYpLCBzdGFydDogb2ZmIH07XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgP251bWJlcikg4oaSIEZyYWdtZW50XG4gICAgLy8gUmV0dXJuIGEgZnJhZ21lbnQgd2l0aCBvbmx5IHRoZSBub2RlcyBiZXR3ZWVuIHRoZSBnaXZlbiBvZmZzZXRzLlxuICAgIC8vIFdoZW4gYHRvYCBpcyBub3QgZ2l2ZW4sIHRoZSBzbGljZSB3aWxsIGdvIHRvIHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoZnJvbSkge1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoZnJvbSA9PSB0bykgcmV0dXJuIGVtcHR5RnJhZ21lbnQ7XG4gICAgICByZXR1cm4gbmV3IEZsYXRGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBOb2RlKSDihpIgRnJhZ21lbnRcbiAgICAvLyBSZXR1cm4gYSBmcmFnbWVudCBpbiB3aGljaCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGlzXG4gICAgLy8gcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuIFRoZSBub2RlLCBhcyB3ZWxsIGFzIHRoZSBvbmUgaXRcbiAgICAvLyByZXBsYWNlcywgc2hvdWxkIG5vdCBiZSB0ZXh0IG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShvZmZzZXQsIG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmlzVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgdG8gcmVwbGFjZSBzaG91bGQgYmUgYSBub24tdGV4dCBub2RlXCIpO1xuICAgICAgdmFyIGNvcHkgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgIGNvcHlbb2Zmc2V0XSA9IG5vZGU7XG4gICAgICByZXR1cm4gbmV3IEZsYXRGcmFnbWVudChjb3B5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpIHtcbiAgICAgIHZhciBsYXN0ID0gdGhpcy5jb250ZW50Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgwLCBsYXN0KTtcbiAgICAgIHZhciBiZWZvcmUgPSB0aGlzLmNvbnRlbnRbbGFzdF0sXG4gICAgICAgICAgYWZ0ZXIgPSBvdGhlci5maXJzdENoaWxkO1xuICAgICAgaWYgKGpvaW5MZWZ0ID4gMCAmJiBqb2luUmlnaHQgPiAwICYmIGJlZm9yZS5zYW1lTWFya3VwKGFmdGVyKSkgY29udGVudC5wdXNoKGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgam9pbkxlZnQgLSAxLCBqb2luUmlnaHQgLSAxKSk7ZWxzZSBjb250ZW50LnB1c2goYmVmb3JlLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIiksIGFmdGVyLmNsb3NlKGpvaW5SaWdodCAtIDEsIFwic3RhcnRcIikpO1xuICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChvdGhlci50b0FycmF5KGFmdGVyLndpZHRoKSkpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudC5cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwibGFzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGbGF0RnJhZ21lbnQ7XG59KShGcmFnbWVudCk7XG5cbnZhciBlbXB0eUZyYWdtZW50ID0gbmV3IEZsYXRGcmFnbWVudChbXSk7XG5cbmV4cG9ydHMuZW1wdHlGcmFnbWVudCA9IGVtcHR5RnJhZ21lbnQ7XG5cbnZhciBUZXh0SXRlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUZXh0SXRlcmF0b3IoZnJhZ21lbnQsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgcG9zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gLTEgOiBhcmd1bWVudHNbM107XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dEl0ZXJhdG9yKTtcblxuICAgIHRoaXMuZnJhZyA9IGZyYWdtZW50O1xuICAgIHRoaXMub2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgdGhpcy5lbmRPZmZzZXQgPSBlbmRPZmZzZXQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dEl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5mcmFnLCB0aGlzLm9mZnNldCwgdGhpcy5lbmRPZmZzZXQsIHRoaXMucG9zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXRFbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXRFbmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLnBvcyA9PSAtMSkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKHN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPT0gdGhpcy5lbmRPZmZzZXQgPyBpdGVyRW5kIDogdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5mcmFnLmNvbnRlbnRbdGhpcy5wb3MrK10sXG4gICAgICAgICAgZW5kID0gdGhpcy5vZmZzZXQgKyBub2RlLndpZHRoO1xuICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKDAsIHRoaXMuZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQpKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgIHdoaWxlIChvZmZzZXQgPCB0aGlzLm9mZnNldCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50W3RoaXMucG9zKytdLFxuICAgICAgICAgICAgZW5kID0gb2Zmc2V0ICsgbm9kZS53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA9PSB0aGlzLm9mZnNldCkgYnJlYWs7XG4gICAgICAgIGlmIChlbmQgPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgIHZhciBzbGljZUVuZCA9IG5vZGUud2lkdGg7XG4gICAgICAgICAgaWYgKGVuZCA+IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgICAgICBzbGljZUVuZCA9IHRoaXMuZW5kT2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgZW5kID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMub2Zmc2V0IC0gb2Zmc2V0LCBzbGljZUVuZCkpO1xuICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dEl0ZXJhdG9yO1xufSkoKTtcblxudmFyIFJldmVyc2VUZXh0SXRlcmF0b3IgPSAoZnVuY3Rpb24gKF9UZXh0SXRlcmF0b3IpIHtcbiAgX2luaGVyaXRzKFJldmVyc2VUZXh0SXRlcmF0b3IsIF9UZXh0SXRlcmF0b3IpO1xuXG4gIGZ1bmN0aW9uIFJldmVyc2VUZXh0SXRlcmF0b3IoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJldmVyc2VUZXh0SXRlcmF0b3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUmV2ZXJzZVRleHRJdGVyYXRvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmV2ZXJzZVRleHRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZHZhbmNlKCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFstLXRoaXMucG9zXSxcbiAgICAgICAgICBlbmQgPSB0aGlzLm9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICBpZiAoZW5kIDwgdGhpcy5lbmRPZmZzZXQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UodGhpcy5lbmRPZmZzZXQgLSBlbmQpKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICB0aGlzLnBvcyA9IHRoaXMuZnJhZy5jb250ZW50Lmxlbmd0aDtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLmZyYWcuc2l6ZTtcbiAgICAgIHdoaWxlIChvZmZzZXQgPiB0aGlzLm9mZnNldCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50Wy0tdGhpcy5wb3NdLFxuICAgICAgICAgICAgZW5kID0gb2Zmc2V0IC0gbm9kZS53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA9PSB0aGlzLm9mZnNldCkgYnJlYWs7XG4gICAgICAgIGlmIChlbmQgPCB0aGlzLm9mZnNldCkge1xuICAgICAgICAgIGlmIChlbmQgPCB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UodGhpcy5lbmRPZmZzZXQgLSBlbmQsIHRoaXMub2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmVuZE9mZnNldDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY29weShub2RlLnRleHQuc2xpY2UoMCwgdGhpcy5vZmZzZXQgLSBlbmQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXZlcnNlVGV4dEl0ZXJhdG9yO1xufSkoVGV4dEl0ZXJhdG9yKTtcblxudmFyIFRleHRGcmFnbWVudCA9IChmdW5jdGlvbiAoX0ZyYWdtZW50Mikge1xuICBfaW5oZXJpdHMoVGV4dEZyYWdtZW50LCBfRnJhZ21lbnQyKTtcblxuICBmdW5jdGlvbiBUZXh0RnJhZ21lbnQoY29udGVudCwgc2l6ZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0RnJhZ21lbnQpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dEZyYWdtZW50LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIHRoaXMuc2l6ZSA9IHNpemUgfHwgMDtcbiAgICBpZiAoc2l6ZSA9PSBudWxsKSBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0RnJhZ21lbnQsIFt7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcigpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBUZXh0SXRlcmF0b3IodGhpcywgZnJvbSwgdG8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXZlcnNlSXRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXZlcnNlSXRlcigpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXZlcnNlVGV4dEl0ZXJhdG9yKHRoaXMsIGZyb20sIHRvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2hpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICBpZiAob2ZmIDwgMCB8fCBvZmYgPj0gdGhpcy5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZzZXQgXCIgKyBvZmYgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgY3VyT2ZmID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgIGN1ck9mZiArPSBjaGlsZC53aWR0aDtcbiAgICAgICAgaWYgKGN1ck9mZiA+IG9mZikgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goZikge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldO1xuICAgICAgICBmKGNoaWxkLCBvZmYsIG9mZiArPSBjaGlsZC53aWR0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQmVmb3JlKG9mZikge1xuICAgICAgaWYgKCFvZmYpIHRocm93IG5ldyBFcnJvcihcIk5vIGNodW5rIGJlZm9yZSBzdGFydCBvZiBub2RlXCIpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGN1ck9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldLFxuICAgICAgICAgICAgZW5kID0gY3VyT2ZmICsgY2hpbGQud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPj0gb2ZmKSByZXR1cm4geyBub2RlOiBjaGlsZCwgc3RhcnQ6IGN1ck9mZiB9O1xuICAgICAgICBjdXJPZmYgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIGlmIChvZmYgPT0gdGhpcy5zaXplKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBhZnRlciBlbmQgb2Ygbm9kZVwiKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXJPZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXSxcbiAgICAgICAgICAgIGVuZCA9IGN1ck9mZiArIGNoaWxkLndpZHRoO1xuICAgICAgICBpZiAoZW5kID4gb2ZmKSByZXR1cm4geyBub2RlOiBjaGlsZCwgc3RhcnQ6IGN1ck9mZiB9O1xuICAgICAgICBjdXJPZmYgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuICAgICAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5zaXplIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoZnJvbSA9PSB0bykgcmV0dXJuIGVtcHR5RnJhZ21lbnQ7XG4gICAgICByZXR1cm4gbmV3IFRleHRGcmFnbWVudCh0aGlzLnRvQXJyYXkoZnJvbSwgdG8pKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVwbGFjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlKG9mZiwgbm9kZSkge1xuICAgICAgaWYgKG5vZGUuaXNUZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCB0byByZXBsYWNlIHNob3VsZCBiZSBhIG5vbi10ZXh0IG5vZGVcIik7XG4gICAgICB2YXIgY3VyTm9kZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIGZvciAodmFyIGN1ck9mZiA9IDA7IGN1ck9mZiA8IG9mZjsgaW5kZXgrKykge1xuICAgICAgICBjdXJOb2RlID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgY3VyT2ZmICs9IGN1ck5vZGUud2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoY3VyTm9kZS5pc1RleHQpIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgcmVwbGFjZSB0ZXh0IGNvbnRlbnQgd2l0aCByZXBsYWNlIG1ldGhvZFwiKTtcbiAgICAgIHZhciBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICByZXR1cm4gbmV3IFRleHRGcmFnbWVudChjb3B5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kSW5uZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kSW5uZXIob3RoZXIsIGpvaW5MZWZ0LCBqb2luUmlnaHQpIHtcbiAgICAgIHZhciBsYXN0ID0gdGhpcy5jb250ZW50Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgwLCBsYXN0KTtcbiAgICAgIHZhciBiZWZvcmUgPSB0aGlzLmNvbnRlbnRbbGFzdF0sXG4gICAgICAgICAgYWZ0ZXIgPSBvdGhlci5maXJzdENoaWxkO1xuICAgICAgdmFyIHNhbWUgPSBiZWZvcmUuc2FtZU1hcmt1cChhZnRlcik7XG4gICAgICBpZiAoc2FtZSAmJiBiZWZvcmUuaXNUZXh0KSBjb250ZW50LnB1c2goYmVmb3JlLmNvcHkoYmVmb3JlLnRleHQgKyBhZnRlci50ZXh0KSk7ZWxzZSBpZiAoc2FtZSAmJiBqb2luTGVmdCA+IDAgJiYgam9pblJpZ2h0ID4gMCkgY29udGVudC5wdXNoKGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgam9pbkxlZnQgLSAxLCBqb2luUmlnaHQgLSAxKSk7ZWxzZSBjb250ZW50LnB1c2goYmVmb3JlLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIiksIGFmdGVyLmNsb3NlKGpvaW5SaWdodCAtIDEsIFwic3RhcnRcIikpO1xuICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChvdGhlci50b0FycmF5KGFmdGVyLndpZHRoKSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA/IHRoaXMuY29udGVudFswXSA6IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxhc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0RnJhZ21lbnQ7XG59KShGcmFnbWVudCk7XG5cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gOjogKCkg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gIC8vIEEgZnJhZ21lbnQgaXMgaXRlcmFibGUsIGluIHRoZSBFUzYgc2Vuc2UuXG4gIEZyYWdtZW50LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLml0ZXIoKTtcbiAgfTtcbiAgRmxhdEl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gVGV4dEl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSIsIi8vICEhXG4vLyBUaGlzIG1vZHVsZSBkZWZpbmVzIFByb3NlTWlycm9yJ3MgZG9jdW1lbnQgbW9kZWwsIHRoZSBkYXRhXG4vLyBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW5kIGluc3BlY3QgY29udGVudCBkb2N1bWVudHMuIEl0XG4vLyBpbmNsdWRlczpcbi8vXG4vLyAqIFRoZSBbbm9kZV0oI05vZGUpIHR5cGUgdGhhdCByZXByZXNlbnRzIGRvY3VtZW50IGVsZW1lbnRzXG4vL1xuLy8gKiBUaGUgW3NjaGVtYV0oI1NjaGVtYSkgdHlwZXMgdXNlZCB0byB0YWcgYW5kIGNvbnN0cmFpbiB0aGVcbi8vICAgZG9jdW1lbnQgc3RydWN0dXJlXG4vL1xuLy8gKiBUaGUgZGF0YSB0eXBlIGZvciBkb2N1bWVudCBbcG9zaXRpb25zXSgjUG9zKVxuLy9cbi8vIFRoaXMgbW9kdWxlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgYnJvd3NlciBBUEkgYmVpbmcgYXZhaWxhYmxlXG4vLyAoaS5lLiB5b3UgY2FuIGxvYWQgaXQgaW50byBhbnkgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCkuXG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX25vZGUgPSByZXF1aXJlKFwiLi9ub2RlXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb2RlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9ub2RlLk5vZGU7XG4gICAgICAgIH1cbn0pO1xuXG52YXIgX2ZyYWdtZW50ID0gcmVxdWlyZShcIi4vZnJhZ21lbnRcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkZyYWdtZW50XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFnbWVudC5GcmFnbWVudDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbXB0eUZyYWdtZW50XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFnbWVudC5lbXB0eUZyYWdtZW50O1xuICAgICAgICB9XG59KTtcblxudmFyIF9tYXJrID0gcmVxdWlyZShcIi4vbWFya1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfbWFyay5NYXJrO1xuICAgICAgICB9XG59KTtcblxudmFyIF9zY2hlbWEgPSByZXF1aXJlKFwiLi9zY2hlbWFcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNjaGVtYVNwZWNcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWFTcGVjO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNjaGVtYVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLlNjaGVtYTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFFcnJvclwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLlNjaGVtYUVycm9yO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vZGVUeXBlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuTm9kZVR5cGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5CbG9jaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUZXh0YmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5UZXh0YmxvY2s7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSW5saW5lXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuSW5saW5lO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRleHRcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5UZXh0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcmtUeXBlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuTWFya1R5cGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQXR0cmlidXRlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuQXR0cmlidXRlO1xuICAgICAgICB9XG59KTtcblxudmFyIF9kZWZhdWx0c2NoZW1hID0gcmVxdWlyZShcIi4vZGVmYXVsdHNjaGVtYVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdFNjaGVtYVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5kZWZhdWx0U2NoZW1hO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRvY1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5Eb2M7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQmxvY2tRdW90ZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5CbG9ja1F1b3RlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk9yZGVyZWRMaXN0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLk9yZGVyZWRMaXN0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJ1bGxldExpc3RcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQnVsbGV0TGlzdDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMaXN0SXRlbVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5MaXN0SXRlbTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIb3Jpem9udGFsUnVsZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5Ib3Jpem9udGFsUnVsZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYXJhZ3JhcGhcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuUGFyYWdyYXBoO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkhlYWRpbmdcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSGVhZGluZztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2RlQmxvY2tcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQ29kZUJsb2NrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkltYWdlXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkltYWdlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkhhcmRCcmVha1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5IYXJkQnJlYWs7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29kZU1hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQ29kZU1hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRW1NYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkVtTWFyaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdHJvbmdNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLlN0cm9uZ01hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua01hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuTGlua01hcms7XG4gICAgICAgIH1cbn0pO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUG9zXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wb3MuUG9zO1xuICAgICAgICB9XG59KTtcblxudmFyIF9kaWZmID0gcmVxdWlyZShcIi4vZGlmZlwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmluZERpZmZTdGFydFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGlmZi5maW5kRGlmZlN0YXJ0O1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmREaWZmRW5kXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWZmLmZpbmREaWZmRW5kO1xuICAgICAgICB9XG59KTsiLCIvLyA7OyBBIG1hcmsgaXMgYSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGUsXG4vLyBzdWNoIGFzIGl0IGJlaW5nIGVtcGhhc2l6ZWQsIGluIGNvZGUgZm9udCwgb3IgYSBsaW5rLiBJdCBoYXMgYSB0eXBlXG4vLyBhbmQgb3B0aW9uYWxseSBhIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBmdXJ0aGVyIGluZm9ybWF0aW9uXG4vLyAoc3VjaCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rKS4gTWFya3MgYXJlIGNyZWF0ZWQgdGhyb3VnaCBhXG4vLyBgU2NoZW1hYCwgd2hpY2ggY29udHJvbHMgd2hpY2ggdHlwZXMgZXhpc3QgYW5kIHdoaWNoXG4vLyBhdHRyaWJ1dGVzIHRoZXkgaGF2ZS5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBNYXJrID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFyayh0eXBlLCBhdHRycykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXJrKTtcblxuICAgIC8vIDo6IE1hcmtUeXBlXG4gICAgLy8gVGhlIHR5cGUgb2YgdGhpcyBtYXJrLlxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gVGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFyay5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gIH1cblxuICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gIC8vIENvbnZlcnQgdGhpcyBtYXJrIHRvIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uLlxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrLCBbe1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgaWYgKHRoaXMudHlwZS5pbnN0YW5jZSkgcmV0dXJuIHRoaXMudHlwZS5uYW1lO1xuICAgICAgdmFyIG9iaiA9IHsgXzogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gdGhpcy5hdHRycykge1xuICAgICAgICBvYmpbYXR0cl0gPSB0aGlzLmF0dHJzW2F0dHJdO1xuICAgICAgfXJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIEdpdmVuIGEgc2V0IG9mIG1hcmtzLCBjcmVhdGUgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIHRoaXMgb25lIGFzXG4gICAgLy8gd2VsbCwgaW4gdGhlIHJpZ2h0IHBvc2l0aW9uLiBJZiB0aGlzIG1hcmsgb3IgYW5vdGhlciBvZiBpdHMgdHlwZVxuICAgIC8vIGlzIGFscmVhZHkgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVG9TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb3RoZXIgPSBzZXRbaV07XG4gICAgICAgIGlmIChvdGhlci50eXBlID09IHRoaXMudHlwZSkge1xuICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIHNldDtlbHNlIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHRoaXMpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIudHlwZS5yYW5rID4gdGhpcy50eXBlLnJhbmspIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHRoaXMpLmNvbmNhdChzZXQuc2xpY2UoaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldC5jb25jYXQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIFJlbW92ZSB0aGlzIG1hcmsgZnJvbSB0aGUgZ2l2ZW4gc2V0LCByZXR1cm5pbmcgYSBuZXcgc2V0LiBJZiB0aGlzXG4gICAgLy8gbWFyayBpcyBub3QgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRnJvbVNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIGlmICh0aGlzLmVxKHNldFtpXSkpIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaXMgaW4gdGhlIGdpdmVuIHNldCBvZiBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJpc0luU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW5TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1yZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcmspIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIC8vIGFub3RoZXIgbWFyay5cbiAgfSwge1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHRoaXMudHlwZSAhPSBvdGhlci50eXBlKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgaWYgKG90aGVyLmF0dHJzW2F0dHJdICE9IHRoaXMuYXR0cnNbYXR0cl0pIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdLCBbTWFya10pIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHR3byBzZXRzIG9mIG1hcmtzIGFyZSBpZGVudGljYWwuXG4gIH1dLCBbe1xuICAgIGtleTogXCJzYW1lU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVTZXQoYSwgYikge1xuICAgICAgaWYgKGEgPT0gYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWFbaV0uZXEoYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPE1hcmssIFtNYXJrXT4pIOKGkiBbTWFya11cbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIC8vIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcInNldEZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RnJvbShtYXJrcykge1xuICAgICAgaWYgKCFtYXJrcyB8fCBtYXJrcy5sZW5ndGggPT0gMCkgcmV0dXJuIGVtcHR5O1xuICAgICAgaWYgKG1hcmtzIGluc3RhbmNlb2YgTWFyaykgcmV0dXJuIFttYXJrc107XG4gICAgICB2YXIgY29weSA9IG1hcmtzLnNsaWNlKCk7XG4gICAgICBjb3B5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbms7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrO1xufSkoKTtcblxuZXhwb3J0cy5NYXJrID0gTWFyaztcblxudmFyIGVtcHR5ID0gW107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94OCwgX3g5LCBfeDEwKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94OCwgcHJvcGVydHkgPSBfeDksIHJlY2VpdmVyID0gX3gxMDsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDggPSBwYXJlbnQ7IF94OSA9IHByb3BlcnR5OyBfeDEwID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2ZyYWdtZW50ID0gcmVxdWlyZShcIi4vZnJhZ21lbnRcIik7XG5cbnZhciBfbWFyayA9IHJlcXVpcmUoXCIuL21hcmtcIik7XG5cbnZhciBfcG9zID0gcmVxdWlyZShcIi4vcG9zXCIpO1xuXG52YXIgZW1wdHlBcnJheSA9IFtdLFxuICAgIGVtcHR5QXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA7OyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHRoZSB0cmVlIHRoYXQgbWFrZXMgdXAgYVxuLy8gUHJvc2VNaXJyb3IgZG9jdW1lbnQuIFNvIGEgZG9jdW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYE5vZGVgLCB3aXRoXG4vLyBjaGlsZHJlbiB0aGF0IGFyZSBhbHNvIGluc3RhbmNlcyBvZiBgTm9kZWAuXG4vL1xuLy8gTm9kZXMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLiBJbnN0ZWFkIG9mIGNoYW5naW5nIHRoZW0sIHlvdVxuLy8gY3JlYXRlIG5ldyBvbmVzIHdpdGggdGhlIGNvbnRlbnQgeW91IHdhbnQuIE9sZCBvbmVzIGtlZXAgcG9pbnRpbmdcbi8vIGF0IHRoZSBvbGQgZG9jdW1lbnQgc2hhcGUuIFRoaXMgaXMgbWFkZSBjaGVhcGVyIGJ5IHNoYXJpbmdcbi8vIHN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBvbGQgYW5kIG5ldyBkYXRhIGFzIG11Y2ggYXMgcG9zc2libGUsIHdoaWNoIGFcbi8vIHRyZWUgc2hhcGUgbGlrZSB0aGlzICh3aXRob3V0IGJhY2sgcG9pbnRlcnMpIG1ha2VzIGVhc3kuXG4vL1xuLy8gKipOZXZlcioqIGRpcmVjdGx5IG11dGF0ZSB0aGUgcHJvcGVydGllcyBvZiBhIGBOb2RlYCBvYmplY3QuXG5cbnZhciBOb2RlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTm9kZSh0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZSk7XG5cbiAgICAvLyA6OiBOb2RlVHlwZVxuICAgIC8vIFRoZSB0eXBlIG9mIG5vZGUgdGhhdCB0aGlzIGlzLlxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAvLyA6OiBPYmplY3RcbiAgICAvLyBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gc3RyaW5nIHZhbHVlcy4gVGhlIGtpbmQgb2ZcbiAgICAvLyBhdHRyaWJ1dGVzIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBub2RlXG4gICAgLy8gdHlwZS5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG5cbiAgICAvLyA6OiBGcmFnbWVudFxuICAgIC8vIFRoZSBub2RlJ3MgY29udGVudC5cbiAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IF9mcmFnbWVudC5lbXB0eUZyYWdtZW50O1xuXG4gICAgLy8gOjogW01hcmtdXG4gICAgLy8gVGhlIG1hcmtzICh0aGluZ3MgbGlrZSB3aGV0aGVyIGl0IGlzIGVtcGhhc2l6ZWQgb3IgcGFydCBvZiBhXG4gICAgLy8gbGluaykgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS5cbiAgICB0aGlzLm1hcmtzID0gbWFya3MgfHwgZW1wdHlBcnJheTtcbiAgfVxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgc2l6ZSBvZiB0aGUgbm9kZSdzIGNvbnRlbnQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIG9mZnNldCBpblxuICAvLyB0aGUgbm9kZS4gRm9yIG5vZGVzIHRoYXQgZG9uJ3QgY29udGFpbiB0ZXh0LCB0aGlzIGlzIGFsc28gdGhlXG4gIC8vIG51bWJlciBvZiBjaGlsZCBub2RlcyB0aGF0IHRoZSBub2RlIGhhcy5cblxuICBfY3JlYXRlQ2xhc3MoTm9kZSwgW3tcbiAgICBrZXk6IFwiY2hpbGRcIixcblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiBOb2RlXG4gICAgLy8gUmV0cmlldmUgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXQuIE5vdGUgdGhhdCB0aGlzIGlzICoqbm90KipcbiAgICAvLyB0aGUgYXBwcm9wcmlhdGUgd2F5IHRvIGxvb3Agb3ZlciBhIG5vZGUuIGBjaGlsZGAncyBjb21wbGV4aXR5IG1heVxuICAgIC8vIGJlIG5vbi1jb25zdGFudCBmb3Igc29tZSBub2RlcywgYW5kIGl0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIG5vZGVcbiAgICAvLyBtdWx0aXBsZSB0aW1lcyB3aGVuIGNhbGxpbmcgaXQgZm9yIGRpZmZlcmVudCBvZmZzZXRzIHdpdGhpbiBhXG4gICAgLy8gdGV4dCBub2RlLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGlsZChvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gICAgLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBub2RlJ3MgY2hpbGRyZW4sIG9wdGlvbmFsbHkgc3RhcnRpbmdcbiAgICAvLyBhbmQgZW5kaW5nIGF0IGEgZ2l2ZW4gb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcIml0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXRlcihzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lml0ZXIoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAgIC8vIENyZWF0ZSBhIHJldmVyc2UgaXRlcmF0b3IgKGl0ZXJhdGluZyBmcm9tIHRoZSBub2RlJ3MgZW5kIHRvd2FyZHNcbiAgICAvLyBpdHMgc3RhcnQpIG92ZXIgdGhpcyBub2RlJ3MgY2hpbGRyZW4sIG9wdGlvbmFsbHkgc3RhcnRpbmcgYW5kXG4gICAgLy8gZW5kaW5nIGF0IGEgZ2l2ZW4gb2Zmc2V0LiAqKk5vdGUqKjogaWYgZ2l2ZW4sIGBzdGFydGAgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIChvciBlcXVhbCkgdG8gYGVuZGAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmV2ZXJzZUl0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV2ZXJzZUl0ZXIoc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5yZXZlcnNlSXRlcihzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSB0aGF0IHNpdHMgYmVmb3JlIGEgZ2l2ZW4gb2Zmc2V0LiBDYW4gYmUgdXNlZCB0b1xuICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHQgbm9kZSBjb3ZlcnMgYSBnaXZlbiBvZmZzZXQuIFRoZSBgc3RhcnRgXG4gICAgLy8gcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIHJldHVybmVkIG5vZGUuIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIG9mZnNldCAwLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQmVmb3JlKG9mZikge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5jaHVua0JlZm9yZShvZmYpO1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIHRoYXQgc2l0cyBhZnRlciBhIGdpdmVuIG9mZnNldC4gVGhlIGBzdGFydGBcbiAgICAvLyBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlXG4gICAgLy8gcmV0dXJuZWQgbm9kZS4gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIHdpdGggb2Zmc2V0XG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2h1bmtBZnRlcihvZmYpO1xuICAgIH1cblxuICAgIC8vIDo6ICgobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpKVxuICAgIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGNoaWxkIG5vZGUuIFRoZSBmdW5jdGlvbiB3aWxsIGJlXG4gICAgLy8gZ2l2ZW4gdGhlIG5vZGUsIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cywgYXNcbiAgICAvLyBhcmd1bWVudHMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGYpIHtcbiAgICAgIHRoaXMuY29udGVudC5mb3JFYWNoKGYpO1xuICAgIH1cblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIENvbmNhdGVuYXRlIGFsbCB0aGUgdGV4dCBub2RlcyBmb3VuZCBpbiB0aGlzIGZyYWdtZW50IGFuZCBpdHNcbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJzYW1lTWFya3VwXCIsXG5cbiAgICAvLyA6OiAoTm9kZSkg4oaSIGJvb2xcbiAgICAvLyBDb21wYXJlIHRoZSBtYXJrdXAgKHR5cGUsIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcykgb2YgdGhpcyBub2RlIHRvXG4gICAgLy8gdGhvc2Ugb2YgYW5vdGhlci4gUmV0dXJucyBgdHJ1ZWAgaWYgYm90aCBoYXZlIHRoZSBzYW1lIG1hcmt1cC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZU1hcmt1cChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTWFya3VwKG90aGVyLnR5cGUsIG90aGVyLmF0dHJzLCBvdGhlci5tYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlLCA/T2JqZWN0LCA/W01hcmtdKSDihpIgYm9vbFxuICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBub2RlJ3MgbWFya3VwIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHR5cGUsXG4gICAgLy8gYXR0cmlidXRlcywgYW5kIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImhhc01hcmt1cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNNYXJrdXAodHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlID09IHR5cGUgJiYgTm9kZS5zYW1lQXR0cnModGhpcy5hdHRycywgYXR0cnMgfHwgZW1wdHlBdHRycykgJiYgX21hcmsuTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IGVtcHR5QXJyYXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG5cbiAgICAvLyA6OiAoP0ZyYWdtZW50KSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIC8vIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIGNvbnRlbnQsIHRoaXMubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLmNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCA/bnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIC8vIGdpdmVuIG9mZnNldHMuIElmIGB0b2AgaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIG5vZGUuXG4gIH0sIHtcbiAgICBrZXk6IFwic2xpY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2UoZnJvbSwgdG8pIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgbnVtYmVyLCBGcmFnbWVudCkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGdpdmVuXG4gICAgLy8gb2Zmc2V0cyByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwic3BsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNwbGljZShmcm9tLCB0bywgcmVwbGFjZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuc2xpY2UoMCwgZnJvbSkuYXBwZW5kKHJlcGxhY2UpLmFwcGVuZCh0aGlzLmNvbnRlbnQuc2xpY2UodG8pKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKEZyYWdtZW50LCA/bnVtYmVyLCA/bnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIFtBcHBlbmRdKCNGcmFnbWVudC5hcHBlbmQpIHRoZSBnaXZlbiBmcmFnbWVudCB0byB0aGlzIG5vZGUnc1xuICAgIC8vIGNvbnRlbnQsIGFuZCBjcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSByZXN1bHQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZChmcmFnbWVudCkge1xuICAgICAgdmFyIGpvaW5MZWZ0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhciBqb2luUmlnaHQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5hcHBlbmQoZnJhZ21lbnQsIGpvaW5MZWZ0LCBqb2luUmlnaHQpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBOb2RlKSDihpIgTm9kZVxuICAgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXRcbiAgICAvLyByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gbm9kZS4gKipOb3RlKio6IFRoZSBvZmZzZXQgc2hvdWxkIG5vdCBmYWxsXG4gICAgLy8gd2l0aGluIGEgdGV4dCBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShwb3MsIG5vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnJlcGxhY2UocG9zLCBub2RlKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFtudW1iZXJdLCBOb2RlKSDihpIgTm9kZVxuICAgIC8vIFJldHVybiBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggdGhlIGRlc2NlbmRhbnQgYXQgYHBhdGhgIHJlcGxhY2VkXG4gICAgLy8gYnkgdGhlIGdpdmVuIHJlcGxhY2VtZW50IG5vZGUuIFRoaXMgd2lsbCBjb3B5IGFzIG1hbnkgc3ViLW5vZGVzIGFzXG4gICAgLy8gdGhlcmUgYXJlIGVsZW1lbnRzIGluIGBwYXRoYC5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlRGVlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlRGVlcChwYXRoLCBub2RlKSB7XG4gICAgICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICBpZiAoZGVwdGggPT0gcGF0aC5sZW5ndGgpIHJldHVybiBub2RlO1xuICAgICAgdmFyIHBvcyA9IHBhdGhbZGVwdGhdO1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShwb3MsIHRoaXMuY2hpbGQocG9zKS5yZXBsYWNlRGVlcChwYXRoLCBub2RlLCBkZXB0aCArIDEpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyLCBzdHJpbmcpIOKGkiBOb2RlXG4gICAgLy8g4oCcQ2xvc2XigJ0gdGhpcyBub2RlIGJ5IG1ha2luZyBzdXJlIHRoYXQsIGlmIGl0IGlzIGVtcHR5LCBhbmQgaXMgbm90XG4gICAgLy8gYWxsb3dlZCB0byBiZSBzbywgaXQgaGFzIGl0cyBkZWZhdWx0IGNvbnRlbnQgaW5zZXJ0ZWQuIFdoZW4gZGVwdGhcbiAgICAvLyBpcyBncmVhdGVyIHRoYW4gemVybywgc3ViLW5vZGVzIGF0IHRoZSBnaXZlbiBzaWRlICh3aGljaCBjYW4gYmVcbiAgICAvLyBgXCJzdGFydFwiYCBvciBgXCJlbmRcImApIGFyZSBjbG9zZWQgdG9vLiBSZXR1cm5zIGl0c2VsZiBpZiBubyB3b3JrXG4gICAgLy8gaXMgbmVjZXNzYXJ5LCBvciBhIGNsb3NlZCBjb3B5IGlmIHNvbWV0aGluZyBkaWQgbmVlZCB0byBoYXBwZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoZGVwdGgsIHNpZGUpIHtcbiAgICAgIGlmIChkZXB0aCA9PSAwICYmIHRoaXMuc2l6ZSA9PSAwICYmICF0aGlzLnR5cGUuY2FuQmVFbXB0eSkgcmV0dXJuIHRoaXMuY29weSh0aGlzLnR5cGUuZGVmYXVsdENvbnRlbnQoKSk7XG4gICAgICB2YXIgY2xvc2VkQ29udGVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXB0aCA+IDAgJiYgKGNsb3NlZENvbnRlbnQgPSB0aGlzLmNvbnRlbnQuY2xvc2UoZGVwdGggLSAxLCBzaWRlKSkgIT0gdGhpcy5jb250ZW50KSByZXR1cm4gdGhpcy5jb3B5KGNsb3NlZENvbnRlbnQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFtudW1iZXJdKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgZGVzY2VuZGFudCBub2RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaCBpcyBpbnRlcnByZXRlZFxuICAgIC8vIGFzIGEgc2VyaWVzIG9mIG9mZnNldHMgaW50byBzdWNjZXNzaXZlbHkgZGVlcGVyIG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcInBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aChfcGF0aCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOyBpIDwgX3BhdGgubGVuZ3RoOyBub2RlID0gbm9kZS5jaGlsZChfcGF0aFtpXSksIGkrKykge31cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MpIOKGkiBOb2RlXG4gICAgLy8gR2V0IHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJub2RlQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZUFmdGVyKHBvcykge1xuICAgICAgcmV0dXJuIHRoaXMucGF0aChwb3MucGF0aCkuY2hpbGQocG9zLm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdGhOb2Rlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRoTm9kZXMocGF0aCkge1xuICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9kZSA9IHRoaXM7OyBpKyspIHtcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGkgPT0gcGF0aC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZChwYXRoW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/Ym9vbCkg4oaSIGJvb2xcbiAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgdmFsaWQgaW4gdGhpcyBub2RlLiBXaGVuXG4gICAgLy8gYHJlcXVpcmVUZXh0YmxvY2tgIGlzIHRydWUsIG9ubHkgcG9zaXRpb25zIGluc2lkZSB0ZXh0YmxvY2tzIGFyZVxuICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFBvc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1ZhbGlkUG9zKHBvcywgcmVxdWlyZVRleHRibG9jaykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIGlmIChpID09IHBvcy5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChyZXF1aXJlVGV4dGJsb2NrICYmICFub2RlLmlzVGV4dGJsb2NrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHBvcy5vZmZzZXQgPD0gbm9kZS5zaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuID0gcG9zLnBhdGhbaV07XG4gICAgICAgICAgaWYgKG4gPj0gbm9kZS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQobik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCBQb3MpIOKGkiB7ZnJvbTogUG9zLCB0bzogUG9zfVxuICAgIC8vIEZpbmRzIHRoZSBuYXJyb3dlc3Qgc2libGluZyByYW5nZSAodHdvIHBvc2l0aW9ucyB0aGF0IGJvdGggcG9pbnRcbiAgICAvLyBpbnRvIHRoZSBzYW1lIG5vZGUpIHRoYXQgZW5jbG9zZXMgdGhlIGdpdmVuIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJzaWJsaW5nUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2libGluZ1JhbmdlKGZyb20sIHRvKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9kZSA9IHRoaXM7OyBpKyspIHtcbiAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IGZyb20ucGF0aC5zbGljZSgwLCBpIC0gMSksXG4gICAgICAgICAgICAgIG9mZnNldCA9IGZyb20ucGF0aFtpIC0gMV07XG4gICAgICAgICAgcmV0dXJuIHsgZnJvbTogbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCksIHRvOiBuZXcgX3Bvcy5Qb3MocGF0aCwgb2Zmc2V0ICsgMSkgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnJvbUVuZCA9IGkgPT0gZnJvbS5wYXRoLmxlbmd0aCxcbiAgICAgICAgICAgIHRvRW5kID0gaSA9PSB0by5wYXRoLmxlbmd0aDtcbiAgICAgICAgdmFyIGxlZnQgPSBmcm9tRW5kID8gZnJvbS5vZmZzZXQgOiBmcm9tLnBhdGhbaV07XG4gICAgICAgIHZhciByaWdodCA9IHRvRW5kID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtpXTtcbiAgICAgICAgaWYgKGZyb21FbmQgfHwgdG9FbmQgfHwgbGVmdCAhPSByaWdodCkge1xuICAgICAgICAgIHZhciBwYXRoID0gZnJvbS5wYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgICAgIHJldHVybiB7IGZyb206IG5ldyBfcG9zLlBvcyhwYXRoLCBsZWZ0KSwgdG86IG5ldyBfcG9zLlBvcyhwYXRoLCByaWdodCArICh0b0VuZCA/IDAgOiAxKSkgfTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5jaGlsZChsZWZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoP1BvcywgP1BvcywgKG5vZGU6IE5vZGUsIHBhdGg6IFtudW1iZXJdLCBwYXJlbnQ6IE5vZGUpKVxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvIHBvc2l0aW9ucywgY2FsbGluZ1xuICAgIC8vIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBub2RlLCB0aGUgcGF0aCB0b3dhcmRzIGl0LCBhbmQgaXRzIHBhcmVudFxuICAgIC8vIG5vZGUsIGFzIGFyZ3VtZW50cy4gYGZyb21gIGFuZCBgdG9gIG1heSBiZSBgbnVsbGAgdG8gZGVub3RlXG4gICAgLy8gc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBub2RlIG9yIGVuZGluZyBhdCBpdHMgZW5kLiBOb3RlIHRoYXRcbiAgICAvLyB0aGUgcGF0aCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGlzIG11dGF0ZWQgYXMgaXRlcmF0aW9uXG4gICAgLy8gY29udGludWVzLCBzbyBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBpdCwgbWFrZSBhIGNvcHkuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZXNCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgdmFyIHBhdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1szXTtcbiAgICAgIHZhciBwYXJlbnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDQgfHwgYXJndW1lbnRzWzRdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzRdO1xuXG4gICAgICBpZiAoZih0aGlzLCBwYXRoLCBwYXJlbnQpID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgdGhpcy5jb250ZW50Lm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgcGF0aCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHBhcmVudDogTm9kZSkpXG4gICAgLy8gQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGlubGluZSBub2RlIGJldHdlZW4gdGhlIHR3b1xuICAgIC8vIGdpdmVuIHBvc2l0aW9ucy4gUGFzcyBudWxsIGZvciBgZnJvbWAgb3IgYHRvYCB0byBzdGFydCBvciBlbmQgYXRcbiAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImlubGluZU5vZGVzQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbmxpbmVOb2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgICAgICAgdmFyIGxhc3QgPSBwYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgZihub2RlLCBwYXRoLnNsaWNlKDAsIGxhc3QpLCBwYXRoW2xhc3RdLCBwYXRoW2xhc3RdICsgbm9kZS53aWR0aCwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MpIOKGkiBOb2RlXG4gICAgLy8gUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBub2RlIGNvbnRhaW5pbmcgb25seSB0aGUgY29udGVudCBiZXR3ZWVuXG4gICAgLy8gYGZyb21gIGFuZCBgdG9gLiBZb3UgY2FuIHBhc3MgYG51bGxgIGZvciBlaXRoZXIgb2YgdGhlbSB0byBzdGFydFxuICAgIC8vIG9yIGVuZCBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZUJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlQmV0d2Vlbihmcm9tLCB0bywgZGVwdGgpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgW01hcmtdXG4gICAgLy8gR2V0IHRoZSBtYXJrcyBvZiB0aGUgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIG9yLCBpZiB0aGF0XG4gICAgLy8gcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRob3NlIG9mIHRoZSBub2RlXG4gICAgLy8gYWZ0ZXIgaXQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya3NBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrc0F0KHBvcykge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGF0aChwb3MucGF0aCk7XG4gICAgICBpZiAoIXBhcmVudC5pc1RleHRibG9jayB8fCAhcGFyZW50LnNpemUpIHJldHVybiBlbXB0eUFycmF5O1xuICAgICAgcmV0dXJuIHBhcmVudC5jaHVua0JlZm9yZShwb3Mub2Zmc2V0IHx8IDEpLm5vZGUubWFya3M7XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIE1hcmtUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciBhIG1hcmsgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIGluIHRoaXMgZG9jdW1lbnRcbiAgICAvLyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICB9LCB7XG4gICAga2V5OiBcInJhbmdlSGFzTWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIGZvciBkZWJ1Z2dpbmdcbiAgICAvLyBwdXJwb3Nlcy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMudHlwZS5uYW1lO1xuICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKSBuYW1lICs9IFwiKFwiICsgdGhpcy5jb250ZW50LnRvU3RyaW5nKCkgKyBcIilcIjtcbiAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHZhciBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICBmb3IgKHZhciBfIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaXplKSBvYmouY29udGVudCA9IHRoaXMuY29udGVudC50b0pTT04oKTtcbiAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aCkgb2JqLm1hcmtzID0gdGhpcy5tYXJrcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIG4udG9KU09OKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gYmUgYWJsZSB0byB0cmVhdCBhIG5vZGUgb2JqZWN0IGFzIGFuIGl0ZXJhdG9yIHJlc3VsdFxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhpcyBub2RlLiBBbHdheXMgMSBmb3Igbm9uLXRleHQgbm9kZXMsIGFuZCB0aGVcbiAgICAvLyBsZW5ndGggb2YgdGhlIHRleHQgZm9yIHRleHQgbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0ZXh0Q29udGVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyA6OiA/Tm9kZVxuICAgIC8vIFJldHVybnMgdGhpcyBub2RlJ3MgZmlyc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJmaXJzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBSZXR1cm5zIHRoaXMgbm9kZSdzIGxhc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICAvLyBjaGlsZHJlbi5cbiAgfSwge1xuICAgIGtleTogXCJsYXN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGFzdENoaWxkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Jsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzQmxvY2s7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dGJsb2NrIG5vZGUsIGEgYmxvY2sgbm9kZSB3aXRoIGlubGluZVxuICAgIC8vIGNvbnRlbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNUZXh0YmxvY2s7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICAvLyBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbmxpbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dCBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5pc1RleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInZhbHVlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyA6OiAoU2NoZW1hLCBPYmplY3QpIOKGkiBOb2RlXG4gICAgLy8gRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH1dLCBbe1xuICAgIGtleTogXCJzYW1lQXR0cnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZUF0dHJzKGEsIGIpIHtcbiAgICAgIGlmIChhID09IGIpIHJldHVybiB0cnVlO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBhKSB7XG4gICAgICAgIGlmIChhW3Byb3BdICE9PSBiW3Byb3BdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZyb21KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgdmFyIHR5cGUgPSBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKTtcbiAgICAgIHZhciBjb250ZW50ID0ganNvbi50ZXh0ICE9IG51bGwgPyBqc29uLnRleHQgOiBfZnJhZ21lbnQuRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIGpzb24ubWFya3MgJiYganNvbi5tYXJrcy5tYXAoc2NoZW1hLm1hcmtGcm9tSlNPTikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSkoKTtcblxuZXhwb3J0cy5Ob2RlID0gTm9kZTtcblxuaWYgKHR5cGVvZiBTeW1ib2wgIT0gXCJ1bmRlZmluZWRcIikge1xuICAvLyA6OiAoKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgLy8gQSBmcmFnbWVudCBpcyBpdGVyYWJsZSwgaW4gdGhlIEVTNiBzZW5zZS5cbiAgTm9kZS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVyKCk7XG4gIH07XG59XG5cbi8vIDs7ICNmb3J3YXJkPU5vZGVcblxudmFyIFRleHROb2RlID0gKGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoVGV4dE5vZGUsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBUZXh0Tm9kZSh0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dE5vZGUpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dE5vZGUucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIHR5cGUsIGF0dHJzLCBudWxsLCBtYXJrcyk7XG4gICAgLy8gOjogP3N0cmluZ1xuICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB0aGlzIGNvbnRhaW5zIHRoZSBub2RlJ3MgdGV4dCBjb250ZW50LlxuICAgIHRoaXMudGV4dCA9IGNvbnRlbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dE5vZGUsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy50ZXh0LCBtYXJrcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgYmFzZSA9IF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHROb2RlLnByb3RvdHlwZSksIFwidG9KU09OXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgICBiYXNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dE5vZGU7XG59KShOb2RlKTtcblxuZXhwb3J0cy5UZXh0Tm9kZSA9IFRleHROb2RlO1xuXG5mdW5jdGlvbiB3cmFwTWFya3MobWFya3MsIHN0cikge1xuICBmb3IgKHZhciBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzdHIgPSBtYXJrc1tpXS50eXBlLm5hbWUgKyBcIihcIiArIHN0ciArIFwiKVwiO1xuICB9cmV0dXJuIHN0cjtcbn0iLCIvLyA7OyBJbnN0YW5jZXMgb2YgdGhlIGBQb3NgIGNsYXNzIHJlcHJlc2VudCBwb3NpdGlvbnMgaW4gYSBkb2N1bWVudC5cbi8vIEEgcG9zaXRpb24gYW4gYXJyYXkgb2YgaW50ZWdlcnMgdGhhdCBkZXNjcmliZSBhIHBhdGggdG8gdGhlIHRhcmdldFxuLy8gbm9kZSAoc2VlIGBOb2RlLnBhdGhgKSBhbmQgYW4gaW50ZWdlciBvZmZzZXQgaW50byB0aGF0IHRhcmdldCBub2RlLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUG9zID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKHBhdGg6IFtudW1iZXJdLCBudW1iZXIpXG5cbiAgZnVuY3Rpb24gUG9zKHBhdGgsIG9mZnNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3MpO1xuXG4gICAgLy8gOjogW251bWJlcl0gVGhlIHBhdGggdG8gdGhlIHRhcmdldCBub2RlLlxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgLy8gOjogbnVtYmVyIFRoZSBvZmZzZXQgaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gIH1cblxuICAvLyA7OyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGggb2YgdGhlIGZvcm1cbiAgLy8gYFwiMC8yOjEwXCJgLCB3aGVyZSB0aGUgbnVtYmVycyBiZWZvcmUgdGhlIGNvbG9uIGFyZSB0aGUgcGF0aCwgYW5kXG4gIC8vIHRoZSBudW1iZXIgYWZ0ZXIgaXQgaXMgdGhlIG9mZnNldC5cblxuICBfY3JlYXRlQ2xhc3MoUG9zLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGguam9pbihcIi9cIikgKyBcIjpcIiArIHRoaXMub2Zmc2V0O1xuICAgIH1cblxuICAgIC8vIDo6IG51bWJlclxuICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBvc2l0aW9uJ3MgcGF0aC5cbiAgfSwge1xuICAgIGtleTogXCJtYXhcIixcblxuICAgIC8vIDo6IChQb3MpIOKGkiBQb3NcbiAgICAvLyBSZXR1cm4gdGhlIGdyZWF0ZXIgb2YgdHdvIHBvc2l0aW9ucy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF4KG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbXAob3RoZXIpID4gMCA/IHRoaXMgOiBvdGhlcjtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgUG9zXG4gICAgLy8gUmV0dXJuIHRoZSBsZXNzZXIgb2YgdHdvIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJtbWluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1taW4ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNtcChvdGhlcikgPCAwID8gdGhpcyA6IG90aGVyO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgW251bWJlcl0pIOKGkiBib29sXG4gICAgLy8gQ29tcGFyZXMgdHdvIHBhdGhzIGFuZCByZXR1cm5zIHRydWUgd2hlbiB0aGV5IGFyZSB0aGUgc2FtZS5cbiAgfSwge1xuICAgIGtleTogXCJjbXBcIixcblxuICAgIC8vIDo6IChQb3MpIOKGkiBudW1iZXJcbiAgICAvLyBDb21wYXJlcyB0aGlzIHBvc2l0aW9uIHRvIGFub3RoZXIgcG9zaXRpb24sIGFuZCByZXR1cm5zIGEgbnVtYmVyLlxuICAgIC8vIE9mIHRoaXMgcmVzdWx0IG51bWJlciwgb25seSB0aGUgc2lnbiBpcyBzaWduaWZpY2FudC4gSXQgaXNcbiAgICAvLyBuZWdhdGl2ZSBpZiB0aGlzIHBvc2l0aW9uIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIgb25lLCB6ZXJvIGlmXG4gICAgLy8gdGhleSBhcmUgdGhlIHNhbWUsIGFuZCBwb3NpdGl2ZSBpZiB0aGlzIHBvc2l0aW9uIGlzIGdyZWF0ZXIuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNtcChvdGhlcikge1xuICAgICAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIFBvcy5jbXAodGhpcy5wYXRoLCB0aGlzLm9mZnNldCwgb3RoZXIucGF0aCwgb3RoZXIub2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvcnRlblwiLFxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBQb3NcbiAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiBwb2ludGluZyBpbnRvIGEgcGFyZW50IG9mIHRoaXMgcG9zaXRpb24nc1xuICAgIC8vIHRhcmdldC4gV2hlbiBgdG9gIGlzIGdpdmVuLCBpdCBkZXRlcm1pbmVzIHRoZSBuZXcgbGVuZ3RoIG9mIHRoZVxuICAgIC8vIHBhdGguIEJ5IGRlZmF1bHQsIHRoZSBwYXRoIGJlY29tZXMgb25lIHNob3J0ZXIuIFRoZSBgb2Zmc2V0YFxuICAgIC8vIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgaW4gdGhpcyBwYXJlbnQgdGhlXG4gICAgLy8gcG9zaXRpb24gcG9pbnRzLiBCeSBkZWZhdWx0LCBpdCBwb2ludHMgYmVmb3JlIHRoZSBvbGQgdGFyZ2V0LiBZb3VcbiAgICAvLyBjYW4gcGFzcyBhIG5lZ2F0aXZlIG9yIHBvc2l0aXZlIGludGVnZXIgdG8gbW92ZSBpdCBiYWNrd2FyZCBvclxuICAgIC8vIGZvcndhcmQgKCoqbm90ZSoqOiB0aGlzIG1ldGhvZCBwZXJmb3JtcyBubyBib3VuZHMgY2hlY2tpbmcpLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG9ydGVuKCkge1xuICAgICAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAodG8gPj0gdGhpcy5kZXB0aCkgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gUG9zLnNob3J0ZW4odGhpcy5wYXRoLCB0bywgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gd2l0aCBhbiBvZmZzZXQgbW92ZWQgcmVsYXRpdmUgdG8gdGhpc1xuICAgIC8vIHBvc2l0aW9uJ3Mgb2Zmc2V0LiBGb3IgZXhhbXBsZSBtb3ZpbmcgYDAvMToxMGAgYnkgYC0yYCB5aWVsZHNcbiAgICAvLyBgMC8xOjhgLlxuICB9LCB7XG4gICAga2V5OiBcIm1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZShieSkge1xuICAgICAgcmV0dXJuIG5ldyBQb3ModGhpcy5wYXRoLCB0aGlzLm9mZnNldCArIGJ5KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlcikg4oaSIFtudW1iZXJdXG4gICAgLy8gQ29udmVydCB0aGlzIHBvc2l0aW9uIHRvIGFuIGFycmF5IG9mIG51bWJlcnMgKGluY2x1ZGluZyBpdHNcbiAgICAvLyBvZmZzZXQpLiBPcHRpb25hbGx5IHBhc3MgYW4gYXJndW1lbnQgdG8gYWRqdXN0IHRoZSB2YWx1ZSBvZiB0aGVcbiAgICAvLyBvZmZzZXQuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9QYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUGF0aCgpIHtcbiAgICAgIHZhciBtb3ZlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcblxuICAgICAgcmV0dXJuIHRoaXMucGF0aC5jb25jYXQodGhpcy5vZmZzZXQgKyBtb3ZlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXh0ZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4dGVuZChwb3MpIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5wYXRoLnNsaWNlKCksXG4gICAgICAgICAgYWRkID0gdGhpcy5vZmZzZXQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdGgucHVzaChwb3MucGF0aFtpXSArIGFkZCk7XG4gICAgICAgIGFkZCA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBvcyhwYXRoLCBwb3Mub2Zmc2V0ICsgYWRkKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gdG8gYSBKU09OLXNhZmUgcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgP251bWJlcikg4oaSIFBvc1xuICAgIC8vIEJ1aWxkIGEgcG9zaXRpb24gZnJvbSBhbiBhcnJheSBvZiBudW1iZXJzIChhcyBpblxuICAgIC8vIFtgdG9QYXRoYF0oI1Bvcy50b1BhdGgpKSwgdGFraW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IGFzXG4gICAgLy8gb2Zmc2V0IGFuZCBvcHRpb25hbGx5IG1vdmluZyBpdCBieSBgbW92ZWAuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVwdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGgubGVuZ3RoO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNtcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbXAocGF0aEEsIG9mZnNldEEsIHBhdGhCLCBvZmZzZXRCKSB7XG4gICAgICB2YXIgbGVuQSA9IHBhdGhBLmxlbmd0aCxcbiAgICAgICAgICBsZW5CID0gcGF0aEIubGVuZ3RoO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGVuZCA9IE1hdGgubWluKGxlbkEsIGxlbkIpOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGRpZmYgPSBwYXRoQVtpXSAtIHBhdGhCW2ldO1xuICAgICAgICBpZiAoZGlmZiAhPSAwKSByZXR1cm4gZGlmZjtcbiAgICAgIH1cbiAgICAgIGlmIChsZW5BID4gbGVuQikgcmV0dXJuIG9mZnNldEIgPD0gcGF0aEFbaV0gPyAxIDogLTE7ZWxzZSBpZiAobGVuQiA+IGxlbkEpIHJldHVybiBvZmZzZXRBIDw9IHBhdGhCW2ldID8gLTEgOiAxO2Vsc2UgcmV0dXJuIG9mZnNldEEgLSBvZmZzZXRCO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzYW1lUGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lUGF0aChwYXRoQSwgcGF0aEIpIHtcbiAgICAgIGlmIChwYXRoQS5sZW5ndGggIT0gcGF0aEIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoQVtpXSAhPT0gcGF0aEJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvcnRlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG9ydGVuKHBhdGgpIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKHRvID09IG51bGwpIHRvID0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgcmV0dXJuIG5ldyBQb3MocGF0aC5zbGljZSgwLCB0byksIHBhdGhbdG9dICsgb2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKGFycmF5KSB7XG4gICAgICB2YXIgbW92ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIGlmICghYXJyYXkubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYSBwb3MgZnJvbSBhbiBlbXB0eSBhcnJheVwiKTtcbiAgICAgIHJldHVybiBuZXcgUG9zKGFycmF5LnNsaWNlKDAsIGFycmF5Lmxlbmd0aCAtIDEpLCBhcnJheVthcnJheS5sZW5ndGggLSAxXSArIG1vdmUpO1xuICAgIH1cblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBQb3NcbiAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihqc29uKSB7XG4gICAgICByZXR1cm4gbmV3IFBvcyhqc29uLnBhdGgsIGpzb24ub2Zmc2V0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9zO1xufSkoKTtcblxuZXhwb3J0cy5Qb3MgPSBQb3M7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KSgpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94MiwgX3gzLCBfeDQpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gyLCBwcm9wZXJ0eSA9IF94MywgcmVjZWl2ZXIgPSBfeDQ7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3gyID0gcGFyZW50OyBfeDMgPSBwcm9wZXJ0eTsgX3g0ID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9ub2RlID0gcmVxdWlyZShcIi4vbm9kZVwiKTtcblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG52YXIgX21hcmsgPSByZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG52YXIgX3V0aWxFcnJvciA9IHJlcXVpcmUoXCIuLi91dGlsL2Vycm9yXCIpO1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBleGNlcHRpb24gdHlwZSB1c2VkIHRvIHNpZ25hbCBzY2hlbWEtcmVsYXRlZFxuLy8gZXJyb3JzLlxuXG52YXIgU2NoZW1hRXJyb3IgPSAoZnVuY3Rpb24gKF9Qcm9zZU1pcnJvckVycm9yKSB7XG4gIF9pbmhlcml0cyhTY2hlbWFFcnJvciwgX1Byb3NlTWlycm9yRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIFNjaGVtYUVycm9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWFFcnJvcik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTY2hlbWFFcnJvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gU2NoZW1hRXJyb3I7XG59KShfdXRpbEVycm9yLlByb3NlTWlycm9yRXJyb3IpO1xuXG5leHBvcnRzLlNjaGVtYUVycm9yID0gU2NoZW1hRXJyb3I7XG5cbmZ1bmN0aW9uIGZpbmRLaW5kcyh0eXBlLCBuYW1lLCBzY2hlbWEsIG92ZXJyaWRlKSB7XG4gIGZ1bmN0aW9uIHNldChzdWIsIHN1cCkge1xuICAgIGlmIChzdWIgaW4gc2NoZW1hLmtpbmRzKSB7XG4gICAgICBpZiAoc2NoZW1hLmtpbmRzW3N1Yl0gPT0gc3VwKSByZXR1cm47XG4gICAgICBTY2hlbWFFcnJvci5yYWlzZShcIkluY29uc2lzdGVudCBzdXBlcmtpbmRzIGZvciBraW5kIFwiICsgc3ViICsgXCI6IFwiICsgc3VwICsgXCIgYW5kIFwiICsgc2NoZW1hLmtpbmRzW3N1Yl0pO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnN1YktpbmQoc3ViLCBzdXApKSBTY2hlbWFFcnJvci5yYWlzZShcIkNvbmZsaWN0aW5nIGtpbmQgaGllcmFyY2h5IHRocm91Z2ggXCIgKyBzdWIgKyBcIiBhbmQgXCIgKyBzdXApO1xuICAgIHNjaGVtYS5raW5kc1tzdWJdID0gc3VwO1xuICB9XG5cbiAgZm9yICh2YXIgY3VyID0gdHlwZTs7IGN1ciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXIpKSB7XG4gICAgdmFyIGN1cktpbmQgPSBvdmVycmlkZSAhPSBudWxsICYmIGN1ciA9PSB0eXBlID8gb3ZlcnJpZGUgOiBjdXIua2luZDtcbiAgICBpZiAoY3VyS2luZCAhPSBudWxsKSB7XG4gICAgICB2YXIgXyQkZXhlYyA9IC9eKC4qPykoXFwuKT8kLy5leGVjKGN1cktpbmQpO1xuXG4gICAgICB2YXIgXyQkZXhlYzIgPSBfc2xpY2VkVG9BcnJheShfJCRleGVjLCAzKTtcblxuICAgICAgdmFyIF8gPSBfJCRleGVjMlswXTtcbiAgICAgIHZhciBraW5kID0gXyQkZXhlYzJbMV07XG4gICAgICB2YXIgZW5kID0gXyQkZXhlYzJbMl07XG5cbiAgICAgIGlmIChraW5kKSB7XG4gICAgICAgIHNldChuYW1lLCBraW5kKTtcbiAgICAgICAgbmFtZSA9IGtpbmQ7XG4gICAgICB9XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIHNldChuYW1lLCBudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyA7OyBOb2RlIHR5cGVzIGFyZSBvYmplY3RzIGFsbG9jYXRlZCBvbmNlIHBlciBgU2NoZW1hYFxuLy8gYW5kIHVzZWQgdG8gdGFnIGBOb2RlYCBpbnN0YW5jZXMgd2l0aCBhIHR5cGUuIFRoZXkgYXJlXG4vLyBpbnN0YW5jZXMgb2Ygc3ViLXR5cGVzIG9mIHRoaXMgY2xhc3MsIGFuZCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0XG4vLyB0aGUgbm9kZSB0eXBlIChpdHMgbmFtZSwgaXRzIGFsbG93ZWQgYXR0cmlidXRlcywgbWV0aG9kcyBmb3Jcbi8vIHNlcmlhbGl6aW5nIGl0IHRvIHZhcmlvdXMgZm9ybWF0cywgaW5mb3JtYXRpb24gdG8gZ3VpZGVcbi8vIGRlc2VyaWFsaXphdGlvbiwgYW5kIHNvIG9uKS5cblxudmFyIE5vZGVUeXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTm9kZVR5cGUobmFtZSwgY29udGFpbnMsIGF0dHJzLCBzY2hlbWEpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm9kZVR5cGUpO1xuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIG5hbWUgdGhlIG5vZGUgdHlwZSBoYXMgaW4gdGhpcyBzY2hlbWEuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAvLyA6OiA/c3RyaW5nXG4gICAgLy8gVGhlIGtpbmQgb2Ygbm9kZXMgdGhpcyBub2RlIG1heSBjb250YWluLiBgbnVsbGAgbWVhbnMgaXQncyBhXG4gICAgLy8gbGVhZiBub2RlLlxuICAgIHRoaXMuY29udGFpbnMgPSBjb250YWlucztcbiAgICAvLyA6OiBPYmplY3Q8QXR0cmlidXRlPlxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlIHR5cGUuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIEEgbGluayBiYWNrIHRvIHRoZSBgU2NoZW1hYCB0aGUgbm9kZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5kZWZhdWx0QXR0cnMgPSBnZXREZWZhdWx0QXR0cnMoYXR0cnMpO1xuICB9XG5cbiAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgLy8gVGhlIGRlZmF1bHQgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggYSBnaXZlbiB0eXBlLiBOb3RlXG4gIC8vIHRoYXQgc2NoZW1hcyBtYXkgYWRkIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBpbnN0YW5jZXMgb2YgdGhlXG4gIC8vIHR5cGUuXG5cbiAgLy8gOjogYm9vbFxuICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBibG9jayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhOb2RlVHlwZSwgW3tcbiAgICBrZXk6IFwiY2FuQ29udGFpbkZyYWdtZW50XCIsXG5cbiAgICAvLyA6OiAoRnJhZ21lbnQpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBmcmFnbWVudCBjb3VsZCBiZSBjb250YWluZWRcbiAgICAvLyBpbiB0aGlzIG5vZGUgdHlwZS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbkZyYWdtZW50KGZyYWdtZW50KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgb2sgPSB0cnVlO1xuICAgICAgZnJhZ21lbnQuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIV90aGlzLmNhbkNvbnRhaW4obikpIG9rID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgY291bGQgYmUgY29udGFpbmVkIGluIHRoaXMgbm9kZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbihub2RlKSB7XG4gICAgICBpZiAoIXRoaXMuY2FuQ29udGFpblR5cGUobm9kZS50eXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLm1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5jYW5Db250YWluTWFyayhub2RlLm1hcmtzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfXJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBjYW4gY29udGFpbiBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlblxuICAgIC8vIG1hcmsuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpbk1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbk1hcmsobWFyaykge1xuICAgICAgdmFyIGNvbnRhaW5zID0gdGhpcy5jb250YWluc01hcmtzO1xuICAgICAgaWYgKGNvbnRhaW5zID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChjb250YWlucykgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250YWlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY29udGFpbnNbaV0gPT0gbWFyay5uYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1yZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBjYW4gY29udGFpbiBub2RlcyBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIC8vIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpblR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpblR5cGUodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnN1YktpbmQodHlwZS5uYW1lLCB0aGlzLmNvbnRhaW5zKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZVR5cGUpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBub2RlcyB0aGF0IGNhbiBiZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIG5vZGVcbiAgICAvLyB0eXBlIGFyZSBhIHN1Yi10eXBlIG9mIHRoZSBub2RlcyB0aGF0IGNhbiBiZSBjb250YWluZWQgaW4gdGhpc1xuICAgIC8vIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQ29udGFpbkNvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuQ29udGFpbkNvbnRlbnQodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnN1YktpbmQodHlwZS5jb250YWlucywgdGhpcy5jb250YWlucyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgW05vZGVUeXBlXVxuICAgIC8vIEZpbmQgYSBzZXQgb2YgaW50ZXJtZWRpYXRlIG5vZGUgdHlwZXMsIHBvc3NpYmx5IGVtcHR5LCB0aGF0IGhhdmVcbiAgICAvLyB0byBiZSBpbnNlcnRlZCBiZXR3ZWVuIHRoaXMgdHlwZSBhbmQgYG90aGVyYCB0byBwdXQgYSBub2RlIG9mXG4gICAgLy8gdHlwZSBgb3RoZXJgIGludG8gdGhpcyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImZpbmRDb25uZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRDb25uZWN0aW9uKG90aGVyKSB7XG4gICAgICAvLyBGSVhNRSBzb21laG93IGRlZmluZSBhbiBvcmRlciBpbiB3aGljaCB0aGVzZSBhcmUgdHJpZWRcbiAgICAgIGlmICh0aGlzLmNhbkNvbnRhaW5UeXBlKG90aGVyKSkgcmV0dXJuIFtdO1xuXG4gICAgICB2YXIgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB2YXIgYWN0aXZlID0gW3sgZnJvbTogdGhpcywgdmlhOiBbXSB9XTtcbiAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gYWN0aXZlLnNoaWZ0KCk7XG4gICAgICAgIGZvciAodmFyIF9uYW1lIGluIHRoaXMuc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnNjaGVtYS5ub2Rlc1tfbmFtZV07XG4gICAgICAgICAgaWYgKHR5cGUuZGVmYXVsdEF0dHJzICYmICEodHlwZS5jb250YWlucyBpbiBzZWVuKSAmJiBjdXJyZW50LmZyb20uY2FuQ29udGFpblR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHZhciB2aWEgPSBjdXJyZW50LnZpYS5jb25jYXQodHlwZSk7XG4gICAgICAgICAgICBpZiAodHlwZS5jYW5Db250YWluVHlwZShvdGhlcikpIHJldHVybiB2aWE7XG4gICAgICAgICAgICBhY3RpdmUucHVzaCh7IGZyb206IHR5cGUsIHZpYTogdmlhIH0pO1xuICAgICAgICAgICAgc2Vlblt0eXBlLmNvbnRhaW5zXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkQXR0cnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRBdHRycyhhdHRycywgY29udGVudCkge1xuICAgICAgaWYgKCFhdHRycyAmJiB0aGlzLmRlZmF1bHRBdHRycykgcmV0dXJuIHRoaXMuZGVmYXVsdEF0dHJzO2Vsc2UgcmV0dXJuIF9idWlsZEF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCB0aGlzLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP09iamVjdCwgP0ZyYWdtZW50LCA/W01hcmtdKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGBOb2RlYCBvZiB0aGlzIHR5cGUuIFRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZVxuICAgIC8vIGNoZWNrZWQgYW5kIGRlZmF1bHRlZCAoeW91IGNhbiBwYXNzIGBudWxsYCB0byB1c2UgdGhlIHR5cGUnc1xuICAgIC8vIGRlZmF1bHRzIGVudGlyZWx5LCBpZiBubyByZXF1aXJlZCBhdHRyaWJ1dGVzIGV4aXN0KS4gYGNvbnRlbnRgXG4gICAgLy8gbWF5IGJlIGEgYEZyYWdtZW50YCwgYSBub2RlLCBhbiBhcnJheSBvZiBub2Rlcywgb3JcbiAgICAvLyBgbnVsbGAuIFNpbWlsYXJseSBgbWFya3NgIG1heSBiZSBgbnVsbGAgdG8gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICAvLyBzZXQgb2YgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgX25vZGUuTm9kZSh0aGlzLCB0aGlzLmJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpLCBfZnJhZ21lbnQuRnJhZ21lbnQuZnJvbShjb250ZW50KSwgX21hcmsuTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUF1dG9GaWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUF1dG9GaWxsKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgaWYgKCghY29udGVudCB8fCBjb250ZW50Lmxlbmd0aCA9PSAwKSAmJiAhdGhpcy5jYW5CZUVtcHR5KSBjb250ZW50ID0gdGhpcy5kZWZhdWx0Q29udGVudCgpO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGFsbG93ZWQgdG8gYmUgZW1wdHkuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIGlmIHRoaXMgaXMgYSB0ZXh0YmxvY2sgdHlwZSwgYSBibG9jayB0aGF0IGNvbnRhaW5zIGlubGluZVxuICAgIC8vIGNvbnRlbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGlubGluZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5saW5lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgaWYgdGhpcyBpcyB0aGUgdGV4dCBub2RlIHR5cGUuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIENvbnRyb2xzIHdoZXRoZXIgbm9kZXMgb2YgdGhpcyB0eXBlIGNhbiBiZSBzZWxlY3RlZCAoYXMgYSB1c2VyXG4gICAgLy8gbm9kZSBzZWxlY3Rpb24pLlxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoaXMgbm9kZSB0eXBlIGlzIGxvY2tlZC5cbiAgfSwge1xuICAgIGtleTogXCJsb2NrZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb250cm9scyB0aGUgX2tpbmRfIG9mIHRoZSBub2RlLCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSB2YWxpZFxuICAgIC8vIHBhcmVudC9jaGlsZCByZWxhdGlvbnMuIENhbiBiZSBhIHdvcmQsIHdoaWNoIGFkZHMgdGhhdCBraW5kIHRvXG4gICAgLy8gdGhlIHNldCBvZiBraW5kcyBvZiB0aGUgc3VwZXJjbGFzcywgYSB3b3JkIGZvbGxvd2VkIGJ5IGEgZG90LCB0b1xuICAgIC8vIGlnbm9yZSB0aGUga2luZHMgb2YgdGhlIHN1cGVyY2xhc3MgYW5kIHVzZSBvbmx5IHRoYXQgd29yZCAoYWxvbmdcbiAgICAvLyB3aXRoIHRoZSBub2RlJ3MgbmFtZSkgYXMga2luZCwgb3Igb25seSBhIGRvdCwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICAvLyBvbmx5IGtpbmQgdGhlIG5vZGUgaGFzIGlzIGl0cyBvd24gbmFtZS5cbiAgfSwge1xuICAgIGtleTogXCJjYW5CZUVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuXG4gICAgLy8gOjogdW5pb248Ym9vbCwgW3N0cmluZ10+XG4gICAgLy8gVGhlIG1hcmsgdHlwZXMgdGhhdCBjaGlsZCBub2RlcyBvZiB0aGlzIG5vZGUgbWF5IGhhdmUuIGBmYWxzZWBcbiAgICAvLyBtZWFucyBubyBtYXJrcywgYHRydWVgIG1lYW5zIGFueSBtYXJrLCBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgIC8vIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgbGlzdCB0aGUgYWxsb3dlZCBtYXJrIHR5cGVzLlxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbXBpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZSh0eXBlcywgc2NoZW1hKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAodmFyIF9uYW1lMiBpbiB0eXBlcykge1xuICAgICAgICB2YXIgaW5mbyA9IHR5cGVzW19uYW1lMl07XG4gICAgICAgIHZhciB0eXBlID0gaW5mby50eXBlIHx8IFNjaGVtYUVycm9yLnJhaXNlKFwiTWlzc2luZyBub2RlIHR5cGUgZm9yIFwiICsgX25hbWUyKTtcbiAgICAgICAgZmluZEtpbmRzKHR5cGUsIF9uYW1lMiwgc2NoZW1hLCBpbmZvLmtpbmQpO1xuICAgICAgICB2YXIgY29udGFpbnMgPSBcImNvbnRhaW5zXCIgaW4gaW5mbyA/IGluZm8uY29udGFpbnMgOiB0eXBlLmNvbnRhaW5zO1xuICAgICAgICB2YXIgYXR0cnMgPSB0eXBlLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChpbmZvLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBhdHRycyA9IGNvcHlPYmooYXR0cnMpO1xuICAgICAgICAgIGZvciAodmFyIGFOYW1lIGluIGluZm8uYXR0cmlidXRlcykgYXR0cnNbYU5hbWVdID0gaW5mby5hdHRyaWJ1dGVzW2FOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbX25hbWUyXSA9IG5ldyB0eXBlKF9uYW1lMiwgY29udGFpbnMsIGF0dHJzLCBzY2hlbWEpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX25hbWUzIGluIHJlc3VsdCkge1xuICAgICAgICB2YXIgY29udGFpbnMgPSByZXN1bHRbX25hbWUzXS5jb250YWlucztcbiAgICAgICAgaWYgKGNvbnRhaW5zICYmICEoY29udGFpbnMgaW4gc2NoZW1hLmtpbmRzKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJOb2RlIHR5cGUgXCIgKyBfbmFtZTMgKyBcIiBpcyBzcGVjaWZpZWQgdG8gY29udGFpbiBub24tZXhpc3Rpbmcga2luZCBcIiArIGNvbnRhaW5zKTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0LmRvYykgU2NoZW1hRXJyb3IucmFpc2UoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAnZG9jJyB0eXBlXCIpO1xuICAgICAgaWYgKCFyZXN1bHQudGV4dCkgU2NoZW1hRXJyb3IucmFpc2UoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAndGV4dCcgdHlwZVwiKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCAqKVxuICAgIC8vIFJlZ2lzdGVyIGFuIGVsZW1lbnQgaW4gdGhpcyB0eXBlJ3MgcmVnaXN0cnkuIFRoYXQgaXMsIGFkZCBgdmFsdWVgXG4gICAgLy8gdG8gdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBgbmFtZWAgaW4gdGhlIHJlZ2lzdHJ5IHN0b3JlZCBpblxuICAgIC8vIHR5cGUncyBgcHJvdG90eXBlYC4gVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBhdHRhY2ggdGhpbmdzIGxpa2VcbiAgICAvLyBjb21tYW5kcyBhbmQgcGFyc2luZyBzdHJhdGVnaWVzIHRvIG5vZGUgdHlwZXMuIFNlZSBgU2NoZW1hLnJlZ2lzdHJ5YC5cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIHJlZ2lzdHJ5ID0gdGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJyZWdpc3RyeVwiKSA/IHRoaXMucHJvdG90eXBlLnJlZ2lzdHJ5IDogdGhpcy5wcm90b3R5cGUucmVnaXN0cnkgPSBPYmplY3QuY3JlYXRlKG51bGwpOyhyZWdpc3RyeVtuYW1lXSB8fCAocmVnaXN0cnlbbmFtZV0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5vZGVUeXBlO1xufSkoKTtcblxuZXhwb3J0cy5Ob2RlVHlwZSA9IE5vZGVUeXBlO1xuTm9kZVR5cGUuYXR0cmlidXRlcyA9IHt9O1xuXG4vLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgYmxvY2sgbm9kZXR5cGVzLlxuXG52YXIgQmxvY2sgPSAoZnVuY3Rpb24gKF9Ob2RlVHlwZSkge1xuICBfaW5oZXJpdHMoQmxvY2ssIF9Ob2RlVHlwZSk7XG5cbiAgZnVuY3Rpb24gQmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEJsb2NrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgQmFzZSB0eXBlIGZvciB0ZXh0YmxvY2sgbm9kZSB0eXBlcy5cblxuICBfY3JlYXRlQ2xhc3MoQmxvY2ssIFt7XG4gICAga2V5OiBcImRlZmF1bHRDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRDb250ZW50KCkge1xuICAgICAgdmFyIGlubmVyID0gdGhpcy5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKS5jcmVhdGUoKTtcbiAgICAgIHZhciBjb25uID0gdGhpcy5maW5kQ29ubmVjdGlvbihpbm5lci50eXBlKTtcbiAgICAgIGlmICghY29ubikgU2NoZW1hRXJyb3IucmFpc2UoXCJDYW4ndCBjcmVhdGUgZGVmYXVsdCBjb250ZW50IGZvciBcIiArIHRoaXMubmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0gY29ubi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpbm5lciA9IGNvbm5baV0uY3JlYXRlKG51bGwsIGlubmVyKTtcbiAgICAgIH1yZXR1cm4gX2ZyYWdtZW50LkZyYWdtZW50LmZyb20oaW5uZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0Jsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnMgPT0gbnVsbDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiYmxvY2suXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJsb2NrO1xufSkoTm9kZVR5cGUpO1xuXG5leHBvcnRzLkJsb2NrID0gQmxvY2s7XG5cbnZhciBUZXh0YmxvY2sgPSAoZnVuY3Rpb24gKF9CbG9jaykge1xuICBfaW5oZXJpdHMoVGV4dGJsb2NrLCBfQmxvY2spO1xuXG4gIGZ1bmN0aW9uIFRleHRibG9jaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dGJsb2NrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHRibG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgaW5saW5lIG5vZGUgdHlwZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRibG9jaywgW3tcbiAgICBrZXk6IFwiY29udGFpbnNNYXJrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImlubGluZVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0YmxvY2s7XG59KShCbG9jayk7XG5cbmV4cG9ydHMuVGV4dGJsb2NrID0gVGV4dGJsb2NrO1xuXG52YXIgSW5saW5lID0gKGZ1bmN0aW9uIChfTm9kZVR5cGUyKSB7XG4gIF9pbmhlcml0cyhJbmxpbmUsIF9Ob2RlVHlwZTIpO1xuXG4gIGZ1bmN0aW9uIElubGluZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW5saW5lKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKElubGluZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSB0ZXh0IG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoSW5saW5lLCBbe1xuICAgIGtleTogXCJpc0lubGluZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpbmxpbmUuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElubGluZTtcbn0pKE5vZGVUeXBlKTtcblxuZXhwb3J0cy5JbmxpbmUgPSBJbmxpbmU7XG5cbnZhciBUZXh0ID0gKGZ1bmN0aW9uIChfSW5saW5lKSB7XG4gIF9pbmhlcml0cyhUZXh0LCBfSW5saW5lKTtcblxuICBmdW5jdGlvbiBUZXh0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHQucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gQXR0cmlidXRlIGRlc2NyaXB0b3JzXG5cbiAgLy8gOzsgQXR0cmlidXRlcyBhcmUgbmFtZWQgc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggbm9kZXMgYW5kIG1hcmtzLlxuICAvLyBFYWNoIG5vZGUgdHlwZSBvciBtYXJrIHR5cGUgaGFzIGEgZml4ZWQgc2V0IG9mIGF0dHJpYnV0ZXMsIHdoaWNoXG4gIC8vIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRvIGNvbnRyb2wuXG5cbiAgX2NyZWF0ZUNsYXNzKFRleHQsIFt7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IF9ub2RlLlRleHROb2RlKHRoaXMsIHRoaXMuYnVpbGRBdHRycyhhdHRycywgY29udGVudCksIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0YWJsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0O1xufSkoSW5saW5lKTtcblxuZXhwb3J0cy5UZXh0ID0gVGV4dDtcblxudmFyIEF0dHJpYnV0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChPYmplY3QpXG4gIC8vIENyZWF0ZSBhbiBhdHRyaWJ1dGUuIGBvcHRpb25zYCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAgLy8gc2V0dGluZ3MgZm9yIHRoZSBhdHRyaWJ1dGVzLiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZVxuICAvLyBzdXBwb3J0ZWQ6XG4gIC8vXG4gIC8vICoqYGRlZmF1bHRgKio6IGA/c3RyaW5nYFxuICAvLyA6IFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSwgdG8gY2hvb3NlIHdoZW4gbm9cbiAgLy8gICBleHBsaWNpdCB2YWx1ZSBpcyBwcm92aWRlZC5cbiAgLy9cbiAgLy8gKipgY29tcHV0ZWAqKjogYD8oRnJhZ21lbnQpIOKGkiBzdHJpbmdgXG4gIC8vIDogQSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBmcm9tXG4gIC8vICAgdGhlIG5vZGUncyBjb250ZW50LlxuICAvL1xuICAvLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBubyBkZWZhdWx0IG9yIGNvbXB1dGUgcHJvcGVydHkgbXVzdCBiZVxuICAvLyBwcm92aWRlZCB3aGVuZXZlciBhIG5vZGUgb3IgbWFyayBvZiBhIHR5cGUgdGhhdCBoYXMgdGhlbSBpc1xuICAvLyBjcmVhdGVkLlxuXG4gIGZ1bmN0aW9uIEF0dHJpYnV0ZSgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEF0dHJpYnV0ZSk7XG5cbiAgICB0aGlzW1wiZGVmYXVsdFwiXSA9IG9wdGlvbnNbXCJkZWZhdWx0XCJdO1xuICAgIHRoaXMuY29tcHV0ZSA9IG9wdGlvbnMuY29tcHV0ZTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIE1hcmtzXG5cbiAgLy8gOzsgTGlrZSBub2RlcywgbWFya3MgKHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9kZXMgdG8gc2lnbmlmeVxuICAvLyB0aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlIHRhZ2dlZCB3aXRoIHR5cGVcbiAgLy8gb2JqZWN0cywgd2hpY2ggYXJlIGluc3RhbnRpYXRlZCBvbmNlIHBlciBgU2NoZW1hYC5cblxuICAvLyA6OiAoc3RyaW5nLCAqKVxuICAvLyBSZWdpc3RlciBhIHZhbHVlIGluIHRoaXMgYXR0cmlidXRlJ3MgcmVnaXN0cnkuIFNlZVxuICAvLyBgTm9kZVR5cGUucmVnaXN0ZXJgIGFuZCBgU2NoZW1hLnJlZ2lzdHJ5YC5cblxuICBfY3JlYXRlQ2xhc3MoQXR0cmlidXRlLCBbe1xuICAgIGtleTogXCJyZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCB2YWx1ZSkge1xuICAgICAgOyh0aGlzLnJlZ2lzdHJ5W25hbWVdIHx8ICh0aGlzLnJlZ2lzdHJ5W25hbWVdID0gW10pKS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQXR0cmlidXRlO1xufSkoKTtcblxuZXhwb3J0cy5BdHRyaWJ1dGUgPSBBdHRyaWJ1dGU7XG5cbnZhciBNYXJrVHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcmtUeXBlKG5hbWUsIGF0dHJzLCByYW5rLCBzY2hlbWEpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFya1R5cGUpO1xuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gICAgLy8gVGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IHRoaXMgdHlwZSBvZiBtYXJrLlxuICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgIC8vIDo6IFNjaGVtYVxuICAgIC8vIFRoZSBzY2hlbWEgdGhhdCB0aGlzIG1hcmsgdHlwZSBpbnN0YW5jZSBpcyBwYXJ0IG9mLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHZhciBkZWZhdWx0cyA9IGdldERlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICB0aGlzLmluc3RhbmNlID0gZGVmYXVsdHMgJiYgbmV3IF9tYXJrLk1hcmsodGhpcywgZGVmYXVsdHMpO1xuICB9XG5cbiAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgLy8gVGhlIGRlZmF1bHQgc2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggYSBtYXJrIHR5cGUuIEJ5XG4gIC8vIGRlZmF1bHQsIHRoaXMgcmV0dXJucyBhbiBlbXB0eSBvYmplY3QuXG5cbiAgLy8gOjogbnVtYmVyXG4gIC8vIE1hcmsgdHlwZSByYW5rcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIG1hcmtcbiAgLy8gYXJyYXlzIGFyZSBzb3J0ZWQuIChJZiBtdWx0aXBsZSBtYXJrIHR5cGVzIGVuZCB1cCB3aXRoIHRoZSBzYW1lXG4gIC8vIHJhbmssIHRoZXkgc3RpbGwgZ2V0IGEgZml4ZWQgb3JkZXIgaW4gdGhlIHNjaGVtYSwgYnV0IHRoZXJlJ3Mgbm9cbiAgLy8gZ3VhcmFudGVlIHdoYXQgaXQgd2lsbCBiZS4pXG5cbiAgX2NyZWF0ZUNsYXNzKE1hcmtUeXBlLCBbe1xuICAgIGtleTogXCJjcmVhdGVcIixcblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBNYXJrXG4gICAgLy8gQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgLy8gdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMpIHtcbiAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5pbnN0YW5jZSkgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gbmV3IF9tYXJrLk1hcmsodGhpcywgX2J1aWxkQXR0cnModGhpcy5hdHRycywgYXR0cnMsIHRoaXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRnJvbVNldFwiLFxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIFtNYXJrXVxuICAgIC8vIFdoZW4gdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LCBhIG5ldyBzZXRcbiAgICAvLyB3aXRob3V0IGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnB1dCBzZXQgaXMgcmV0dXJuZWQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNJblNldChzZXQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKSByZXR1cm4gc2V0W2ldO1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImdldE9yZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE9yZGVyKG1hcmtzKSB7XG4gICAgICB2YXIgc29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBfbmFtZTQgaW4gbWFya3MpIHtcbiAgICAgICAgc29ydGVkLnB1c2goeyBuYW1lOiBfbmFtZTQsIHJhbms6IG1hcmtzW19uYW1lNF0udHlwZS5yYW5rIH0pO1xuICAgICAgfXNvcnRlZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICAgIHZhciByYW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICByYW5rc1tzb3J0ZWRbaV0ubmFtZV0gPSBpO1xuICAgICAgfXJldHVybiByYW5rcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgIHZhciBvcmRlciA9IHRoaXMuZ2V0T3JkZXIobWFya3MpO1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBfbmFtZTUgaW4gbWFya3MpIHtcbiAgICAgICAgdmFyIGluZm8gPSBtYXJrc1tfbmFtZTVdO1xuICAgICAgICB2YXIgYXR0cnMgPSBpbmZvLmF0dHJpYnV0ZXMgfHwgaW5mby50eXBlLmF0dHJpYnV0ZXM7XG4gICAgICAgIHJlc3VsdFtfbmFtZTVdID0gbmV3IGluZm8udHlwZShfbmFtZTUsIGF0dHJzLCBvcmRlcltfbmFtZTVdLCBzY2hlbWEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUwO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNYXJrVHlwZTtcbn0pKCk7XG5cbmV4cG9ydHMuTWFya1R5cGUgPSBNYXJrVHlwZTtcbk1hcmtUeXBlLmF0dHJpYnV0ZXMgPSB7fTtcblxuLy8gOjogKHN0cmluZywgKilcbi8vIFJlZ2lzdGVyIGEgbWV0YWRhdGEgZWxlbWVudCBmb3IgdGhpcyBtYXJrIHR5cGUuIFNlZSBhbHNvXG4vLyBgTm9kZVR5cGUucmVnaXN0ZXJgLlxuTWFya1R5cGUucmVnaXN0ZXIgPSBOb2RlVHlwZS5yZWdpc3RlcjtcblxuLy8gU2NoZW1hIHNwZWNpZmljYXRpb25zIGFyZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBzcGVjaWZ5IGEgc2NoZW1hIC0tXG4vLyBhIHNldCBvZiBub2RlIHR5cGVzLCB0aGVpciBuYW1lcywgYXR0cmlidXRlcywgYW5kIG5lc3RpbmcgYmVoYXZpb3IuXG5cbmZ1bmN0aW9uIGNvcHlPYmoob2JqLCBmKSB7XG4gIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIHJlc3VsdFtwcm9wXSA9IGYgPyBmKG9ialtwcm9wXSkgOiBvYmpbcHJvcF07XG4gIH1yZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXcmFwcGVkKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRnVuY3Rpb24gPyB7IHR5cGU6IG9iaiB9IDogb2JqO1xufVxuXG5mdW5jdGlvbiBvdmVybGF5T2JqKG9iaiwgb3ZlcmxheSkge1xuICB2YXIgY29weSA9IGNvcHlPYmoob2JqKTtcbiAgZm9yICh2YXIgX25hbWU2IGluIG92ZXJsYXkpIHtcbiAgICB2YXIgaW5mbyA9IGVuc3VyZVdyYXBwZWQob3ZlcmxheVtfbmFtZTZdKTtcbiAgICBpZiAoaW5mbyA9PSBudWxsKSB7XG4gICAgICBkZWxldGUgY29weVtfbmFtZTZdO1xuICAgIH0gZWxzZSBpZiAoaW5mby50eXBlKSB7XG4gICAgICBjb3B5W19uYW1lNl0gPSBpbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXhpc3RpbmcgPSBjb3B5W19uYW1lNl0gPSBjb3B5T2JqKGNvcHlbX25hbWU2XSk7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIGluZm8pIHtcbiAgICAgICAgZXhpc3RpbmdbcHJvcF0gPSBpbmZvW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLy8gOzsgQSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBpcyBhIGJsdWVwcmludCBmb3IgYW4gYWN0dWFsXG4vLyBgU2NoZW1hYC4gSXQgbWFwcyBuYW1lcyB0byBub2RlIGFuZCBtYXJrIHR5cGVzLCBhbG9uZ1xuLy8gd2l0aCBleHRyYSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYW5kIGNoYW5nZXNcbi8vIHRvIG5vZGUga2luZHMgYW5kIHJlbGF0aW9ucy5cbi8vXG4vLyBBIHNwZWNpZmljYXRpb24gY29uc2lzdHMgb2YgYW4gb2JqZWN0IHRoYXQgbWFwcyBub2RlIG5hbWVzIHRvIG5vZGVcbi8vIHR5cGUgY29uc3RydWN0b3JzIGFuZCBhbm90aGVyIHNpbWlsYXIgb2JqZWN0IG1hcHBpbmcgbWFyayBuYW1lcyB0b1xuLy8gbWFyayB0eXBlIGNvbnN0cnVjdG9ycy5cbi8vXG4vLyBGb3IgZmxleGliaWxpdHkgYW5kIHJldXNhYmlsaXR5LCBub2RlIGFuZCBtYXJrIHR5cGUgY2xhc3NlcyBkbyBub3Rcbi8vIGRlY2xhcmUgdGhlaXIgb3duIG5hbWUuIEluc3RlYWQsIGVhY2ggc2NoZW1hIHRoYXQgaW5jbHVkZXMgdGhlbSBjYW5cbi8vIGFzc2lnbiBhIG5hbWUgdG8gdGhlbSwgYXMgd2VsbCBhcyBvdmVycmlkZSB0aGVpclxuLy8gW2tpbmRdKCNOb2RlVHlwZS5raW5kKSBhbmQgW2NvbnRhaW5lZCBraW5kXSgjTm9kZVR5cGUuY29udGFpbnMpLCBvclxuLy8gYWRkaW5nIGV4dHJhIFthdHRyaWJ1dGVzXSgjTm9kZVR5cGUuYXR0cmlidXRlcykuXG5cbnZhciBTY2hlbWFTcGVjID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKD9PYmplY3Q8e3R5cGU6IE5vZGVUeXBlfT4sID9PYmplY3Q8e3R5cGU6IE1hcmtUeXBlfT4pXG4gIC8vIENyZWF0ZSBhIHNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gc2NyYXRjaC4gVGhlIGFyZ3VtZW50cyBtYXBcbiAgLy8gbm9kZSBuYW1lcyB0byBub2RlIHR5cGUgY29uc3RydWN0b3JzIGFuZCBtYXJrIG5hbWVzIHRvIG1hcmsgdHlwZVxuICAvLyBjb25zdHJ1Y3RvcnMuIFRoZWlyIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgdGhlIHR5cGVcbiAgLy8gY29uc3RydWN0b3JzIHRoZW1zZWx2ZXMsIG9yIG9iamVjdHMgd2l0aCBhIHR5cGUgY29uc3RydWN0b3IgdW5kZXJcbiAgLy8gdGhlaXIgYHR5cGVgIHByb3BlcnR5LCBhbmQgb3B0aW9uYWxseSB0aGVzZSBvdGhlciBwcm9wZXJ0aWVzOlxuICAvL1xuICAvLyAqKmBjb250YWluc2AqKmA6IHN0cmluZ2BcbiAgLy8gICA6IE9ubHkgdmFsaWQgZm9yIGBub2Rlc2AuIFRoZSBba2luZF0oI05vZGVUeXBlLmtpbmQpIG9mIHRoZVxuICAvLyAgICAgbm9kZXMgdGhhdCB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gaW4gdGhpcyBzY2hlbWEuXG4gIC8vXG4gIC8vICoqYGtpbmRgKipgOiBzdHJpbmdgXG4gIC8vICA6IE9ubHkgdmFsaWQgZm9yIGBub2Rlc2AuIE92ZXJyaWRlcyB0aGUga2luZCBvZiB0aGlzIG5vZGUgaW5cbiAgLy8gICAgdGhpcyBzY2hlbWEuIFNhbWUgZm9ybWF0IGFzIGBOb2RlVHlwZS5raW5kYC5cbiAgLy9cbiAgLy8gKipgYXR0cmlidXRlc2AqKmA6IE9iamVjdDxBdHRyaWJ1dGU+YFxuICAvLyAgIDogRXh0cmEgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gdGhpcyBub2RlIGluIHRoaXMgc2NoZW1hLlxuXG4gIGZ1bmN0aW9uIFNjaGVtYVNwZWMobm9kZXMsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjaGVtYVNwZWMpO1xuXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzID8gY29weU9iaihub2RlcywgZW5zdXJlV3JhcHBlZCkgOiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMubWFya3MgPSBtYXJrcyA/IGNvcHlPYmoobWFya3MsIGVuc3VyZVdyYXBwZWQpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIC8vIEZvciBub2RlIHR5cGVzIHdoZXJlIGFsbCBhdHRycyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAob3Igd2hpY2ggZG9uJ3RcbiAgLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4gIC8vIG9iamVjdCwgYW5kIHVzZSBpdCBmb3IgYWxsIG5vZGVzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBzcGVjaWZpY1xuICAvLyBhdHRyaWJ1dGVzLlxuXG4gIC8vIDo6ICg/T2JqZWN0PD97dHlwZTogTm9kZVR5cGV9PiwgP09iamVjdDw/e3R5cGU6IE1hcmtUeXBlfT4pIOKGkiBTY2hlbWFTcGVjXG4gIC8vIEJhc2UgYSBuZXcgc2NoZW1hIHNwZWMgb24gdGhpcyBvbmUgYnkgc3BlY2lmeWluZyBub2RlcyBhbmQgbWFya3NcbiAgLy8gdG8gYWRkLCBjaGFuZ2UsIG9yIHJlbW92ZS5cbiAgLy9cbiAgLy8gV2hlbiBgbm9kZXNgIGlzIHBhc3NlZCwgaXQgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIHR5cGUgbmFtZXNcbiAgLy8gdG8gZWl0aGVyIGBudWxsYCwgdG8gZGVsZXRlIHRoZSB0eXBlIG9mIHRoYXQgbmFtZSwgdG8gYVxuICAvLyBgTm9kZVR5cGVgLCB0byBhZGQgb3IgcmVwbGFjZSB0aGUgbm9kZSB0eXBlIG9mIHRoYXQgbmFtZSwgb3IgdG9cbiAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgW2V4dGVuc2lvblxuICAvLyBwcm9wZXJ0aWVzXSgjU2NoZW1hU3BlY19jb25zdHJ1Y3RvciksIHRvIGFkZCB0byB0aGUgZXhpc3RpbmdcbiAgLy8gZGVzY3JpcHRpb24gb2YgdGhhdCBub2RlIHR5cGUuXG4gIC8vXG4gIC8vIFNpbWlsYXJseSwgYG1hcmtzYCBjYW4gYmUgYW4gb2JqZWN0IHRvIGFkZCwgY2hhbmdlLCBvciByZW1vdmVcbiAgLy8gbWFya3MgaW4gdGhlIHNjaGVtYS5cblxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hU3BlYywgW3tcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShub2RlcywgbWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgU2NoZW1hU3BlYyhub2RlcyA/IG92ZXJsYXlPYmoodGhpcy5ub2Rlcywgbm9kZXMpIDogdGhpcy5ub2RlcywgbWFya3MgPyBvdmVybGF5T2JqKHRoaXMubWFya3MsIG1hcmtzKSA6IHRoaXMubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/dW5pb248c3RyaW5nLCAobmFtZTogc3RyaW5nLCB0eXBlOiBOb2RlVHlwZSkg4oaSIGJvb2w+LCBzdHJpbmcsIEF0dHJpYnV0ZSkg4oaSIFNjaGVtYVNwZWNcbiAgICAvLyBDcmVhdGUgYSBuZXcgc2NoZW1hIHNwZWMgd2l0aCBhdHRyaWJ1dGVzIGFkZGVkIHRvIHNlbGVjdGVkIG5vZGVcbiAgICAvLyB0eXBlcy4gYGZpbHRlcmAgY2FuIGJlIGBudWxsYCwgdG8gYWRkIHRoZSBhdHRyaWJ1dGUgdG8gYWxsIG5vZGVcbiAgICAvLyB0eXBlcywgYSBzdHJpbmcsIHRvIGFkZCBpdCBvbmx5IHRvIHRoZSBuYW1lZCBub2RlIHR5cGUsIG9yIGFcbiAgICAvLyBwcmVkaWNhdGUgZnVuY3Rpb24sIHRvIGFkZCBpdCB0byBub2RlIHR5cGVzIHRoYXQgcGFzcyB0aGVcbiAgICAvLyBwcmVkaWNhdGUuXG4gICAgLy9cbiAgICAvLyBUaGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIGFsb25nc2lkZSB0aGUgbm9kZSB0eXBlJ3MgW2RlZmF1bHRcbiAgICAvLyBhdHRyaWJ1dGVzXSgjTm9kZVR5cGUuYXR0cmlidXRlcykuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQXR0cmlidXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEF0dHJpYnV0ZShmaWx0ZXIsIGF0dHJOYW1lLCBhdHRyKSB7XG4gICAgICB2YXIgY29weSA9IGNvcHlPYmoodGhpcy5ub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfbmFtZTcgaW4gY29weSkge1xuICAgICAgICBpZiAodHlwZW9mIGZpbHRlciA9PSBcInN0cmluZ1wiID8gZmlsdGVyID09IF9uYW1lNyA6IHR5cGVvZiBmaWx0ZXIgPT0gXCJmdW5jdGlvblwiID8gZmlsdGVyKF9uYW1lNywgY29weVtfbmFtZTddKSA6IGZpbHRlciA/IGZpbHRlciA9PSBjb3B5W19uYW1lN10gOiB0cnVlKSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBjb3B5W19uYW1lN10gPSBjb3B5T2JqKGNvcHlbX25hbWU3XSk7KGluZm8uYXR0cmlidXRlcyB8fCAoaW5mby5hdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW2F0dHJOYW1lXSA9IGF0dHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgU2NoZW1hU3BlYyhjb3B5LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NoZW1hU3BlYztcbn0pKCk7XG5cbmV4cG9ydHMuU2NoZW1hU3BlYyA9IFNjaGVtYVNwZWM7XG5mdW5jdGlvbiBnZXREZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgdmFyIGRlZmF1bHRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICB2YXIgYXR0ciA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICBpZiAoYXR0cltcImRlZmF1bHRcIl0gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgZGVmYXVsdHNbYXR0ck5hbWVdID0gYXR0cltcImRlZmF1bHRcIl07XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRzO1xufVxuXG5mdW5jdGlvbiBfYnVpbGRBdHRycyhhdHRyU3BlYywgYXR0cnMsIGFyZzEsIGFyZzIpIHtcbiAgdmFyIGJ1aWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgX25hbWU4IGluIGF0dHJTcGVjKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0cnMgJiYgYXR0cnNbX25hbWU4XTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdmFyIGF0dHIgPSBhdHRyU3BlY1tfbmFtZThdO1xuICAgICAgaWYgKGF0dHJbXCJkZWZhdWx0XCJdICE9IG51bGwpIHZhbHVlID0gYXR0cltcImRlZmF1bHRcIl07ZWxzZSBpZiAoYXR0ci5jb21wdXRlKSB2YWx1ZSA9IGF0dHIuY29tcHV0ZShhcmcxLCBhcmcyKTtlbHNlIFNjaGVtYUVycm9yLnJhaXNlKFwiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIGF0dHJpYnV0ZSBcIiArIF9uYW1lOCk7XG4gICAgfVxuICAgIGJ1aWx0W19uYW1lOF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gYnVpbHQ7XG59XG5cbi8vIDs7IEVhY2ggZG9jdW1lbnQgaXMgYmFzZWQgb24gYSBzaW5nbGUgc2NoZW1hLCB3aGljaCBwcm92aWRlcyB0aGVcbi8vIG5vZGUgYW5kIG1hcmsgdHlwZXMgdGhhdCBpdCBpcyBtYWRlIHVwIG9mICh3aGljaCwgaW4gdHVybixcbi8vIGRldGVybWluZSB0aGUgc3RydWN0dXJlIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSkuXG5cbnZhciBTY2hlbWEgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoU2NoZW1hU3BlYylcbiAgLy8gQ29uc3RydWN0IGEgc2NoZW1hIGZyb20gYSBzcGVjaWZpY2F0aW9uLlxuXG4gIGZ1bmN0aW9uIFNjaGVtYShzcGVjKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjaGVtYSk7XG5cbiAgICAvLyA6OiBTY2hlbWFTcGVjXG4gICAgLy8gVGhlIHNwZWNpZmljYXRpb24gb24gd2hpY2ggdGhlIHNjaGVtYSBpcyBiYXNlZC5cbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHRoaXMua2luZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIDo6IE9iamVjdDxOb2RlVHlwZT5cbiAgICAvLyBBbiBvYmplY3QgbWFwcGluZyB0aGUgc2NoZW1hJ3Mgbm9kZSBuYW1lcyB0byBub2RlIHR5cGUgb2JqZWN0cy5cbiAgICB0aGlzLm5vZGVzID0gTm9kZVR5cGUuY29tcGlsZShzcGVjLm5vZGVzLCB0aGlzKTtcbiAgICAvLyA6OiBPYmplY3Q8TWFya1R5cGU+XG4gICAgLy8gQSBtYXAgZnJvbSBtYXJrIG5hbWVzIHRvIG1hcmsgdHlwZSBvYmplY3RzLlxuICAgIHRoaXMubWFya3MgPSBNYXJrVHlwZS5jb21waWxlKHNwZWMubWFya3MsIHRoaXMpO1xuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIEFuIG9iamVjdCBmb3Igc3RvcmluZyB3aGF0ZXZlciB2YWx1ZXMgbW9kdWxlcyBtYXkgd2FudCB0b1xuICAgIC8vIGNvbXB1dGUgYW5kIGNhY2hlIHBlciBzY2hlbWEuIChJZiB5b3Ugd2FudCB0byBzdG9yZSBzb21ldGhpbmdcbiAgICAvLyBpbiBpdCwgdHJ5IHRvIHVzZSBwcm9wZXJ0eSBuYW1lcyB1bmxpa2VseSB0byBjbGFzaC4pXG4gICAgdGhpcy5jYWNoZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmJpbmQodGhpcyk7XG4gICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5ub2RlRnJvbUpTT04gPSB0aGlzLm5vZGVGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgIHRoaXMubWFya0Zyb21KU09OID0gdGhpcy5tYXJrRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIDo6ICh1bmlvbjxzdHJpbmcsIE5vZGVUeXBlPiwgP09iamVjdCwgP3VuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+LCA/W01hcmtdKSDihpIgTm9kZVxuICAvLyBDcmVhdGUgYSBub2RlIGluIHRoaXMgc2NoZW1hLiBUaGUgYHR5cGVgIG1heSBiZSBhIHN0cmluZyBvciBhXG4gIC8vIGBOb2RlVHlwZWAgaW5zdGFuY2UuIEF0dHJpYnV0ZXMgd2lsbCBiZSBleHRlbmRlZFxuICAvLyB3aXRoIGRlZmF1bHRzLCBgY29udGVudGAgbWF5IGJlIGEgYEZyYWdtZW50YCxcbiAgLy8gYG51bGxgLCBhIGBOb2RlYCwgb3IgYW4gYXJyYXkgb2Ygbm9kZXMuXG4gIC8vXG4gIC8vIFdoZW4gY3JlYXRpbmcgYSB0ZXh0IG5vZGUsIGBjb250ZW50YCBzaG91bGQgYmUgYSBzdHJpbmcgYW5kIGlzXG4gIC8vIGludGVycHJldGVkIGFzIHRoZSBub2RlJ3MgdGV4dC5cbiAgLy9cbiAgLy8gVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIFNjaGVtYSwgbWVhbmluZyB5b3UgZG9uJ3QgaGF2ZSB0b1xuICAvLyBjYWxsIGl0IGFzIGEgbWV0aG9kLCBidXQgY2FuIHBhc3MgaXQgdG8gaGlnaGVyLW9yZGVyIGZ1bmN0aW9uc1xuICAvLyBhbmQgc3VjaC5cblxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hLCBbe1xuICAgIGtleTogXCJub2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIikgdHlwZSA9IHRoaXMubm9kZVR5cGUodHlwZSk7ZWxzZSBpZiAoISh0eXBlIGluc3RhbmNlb2YgTm9kZVR5cGUpKSBTY2hlbWFFcnJvci5yYWlzZShcIkludmFsaWQgbm9kZSB0eXBlOiBcIiArIHR5cGUpO2Vsc2UgaWYgKHR5cGUuc2NoZW1hICE9IHRoaXMpIFNjaGVtYUVycm9yLnJhaXNlKFwiTm9kZSB0eXBlIGZyb20gZGlmZmVyZW50IHNjaGVtYSB1c2VkIChcIiArIHR5cGUubmFtZSArIFwiKVwiKTtcblxuICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP1tNYXJrXSkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSB0ZXh0IG5vZGUgaW4gdGhlIHNjaGVtYS4gVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIFNjaGVtYS5cbiAgfSwge1xuICAgIGtleTogXCJ0ZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRleHQoX3RleHQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy50ZXh0LmNyZWF0ZShudWxsLCBfdGV4dCwgX21hcmsuTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSID9Ob2RlVHlwZVxuICAgIC8vIFJldHVybiB0aGUgZGVmYXVsdCB0ZXh0YmxvY2sgdHlwZSBmb3IgdGhpcyBzY2hlbWEsIG9yIGBudWxsYCBpZlxuICAgIC8vIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBub2RlIHR5cGUgd2l0aCBhIGBkZWZhdWx0VGV4dGJsb2NrYFxuICAgIC8vIHByb3BlcnR5LlxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0YmxvY2tUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmF1bHRUZXh0YmxvY2tUeXBlKCkge1xuICAgICAgdmFyIGNhY2hlZCA9IHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlO1xuICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgZm9yICh2YXIgX25hbWU5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbX25hbWU5XS5kZWZhdWx0VGV4dGJsb2NrKSByZXR1cm4gdGhpcy5jYWNoZWQuZGVmYXVsdFRleHRibG9ja1R5cGUgPSB0aGlzLm5vZGVzW19uYW1lOV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWQuZGVmYXVsdFRleHRibG9ja1R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsID9PYmplY3QpIOKGkiBNYXJrXG4gICAgLy8gQ3JlYXRlIGEgbWFyayB3aXRoIHRoZSBuYW1lZCB0eXBlXG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrKG5hbWUsIGF0dHJzKSB7XG4gICAgICB2YXIgc3BlYyA9IHRoaXMubWFya3NbbmFtZV0gfHwgU2NoZW1hRXJyb3IucmFpc2UoXCJObyBtYXJrIG5hbWVkIFwiICsgbmFtZSk7XG4gICAgICByZXR1cm4gc3BlYy5jcmVhdGUoYXR0cnMpO1xuICAgIH1cblxuICAgIC8vIDo6IChPYmplY3QpIOKGkiBOb2RlXG4gICAgLy8gRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFRoaXMgbWV0aG9kIGlzXG4gICAgLy8gYm91bmQuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZUZyb21KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVGcm9tSlNPTihqc29uKSB7XG4gICAgICByZXR1cm4gX25vZGUuTm9kZS5mcm9tSlNPTih0aGlzLCBqc29uKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTWFya1xuICAgIC8vIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIC8vIGJvdW5kLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtGcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrRnJvbUpTT04oanNvbikge1xuICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLm1hcmsoanNvbik7XG4gICAgICByZXR1cm4gdGhpcy5tYXJrKGpzb24uXywganNvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIE5vZGVUeXBlXG4gICAgLy8gR2V0IHRoZSBgTm9kZVR5cGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpblxuICAgIC8vIHRoaXMgc2NoZW1hLCBvciByYWlzZSBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgfSwge1xuICAgIGtleTogXCJub2RlVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlVHlwZShuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlc1tuYW1lXSB8fCBTY2hlbWFFcnJvci5yYWlzZShcIlVua25vd24gbm9kZSB0eXBlOiBcIiArIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsIHN0cmluZykg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgYSBub2RlIGtpbmQgaXMgYSBzdWIta2luZCBvZiBhbm90aGVyIGtpbmQuXG4gIH0sIHtcbiAgICBrZXk6IFwic3ViS2luZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJLaW5kKHN1Yiwgc3VwKSB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChzdWIgPT0gc3VwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgc3ViID0gdGhpcy5raW5kc1tzdWJdO1xuICAgICAgICBpZiAoIXN1YikgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsICh2YWx1ZTogKiwgc291cmNlOiB1bmlvbjxOb2RlVHlwZSwgTWFya1R5cGUsIEF0dHJpYnV0ZT4pKVxuICAgIC8vIFJldHJpZXZlIGFsbCByZWdpc3RlcmVkIGl0ZW1zIHVuZGVyIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhpc1xuICAgIC8vIHNjaGVtYS4gVGhlIGdpdmVuIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCBpdGVtIGFuZCwgYXNcbiAgICAvLyBhIHNlY29uZCBhcmd1bWVudCwgdGhlIGVsZW1lbnTigJRub2RlIHR5cGUsIG1hcmsgdHlwZSwgb3JcbiAgICAvLyBhdHRyaWJ1dGXigJR0aGF0IGl0IHdhcyBhc3NvY2lhdGVkIHdpdGguXG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0cnkobmFtZSwgZikge1xuICAgICAgdmFyIGF0dHJzU2VlbiA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgdmFyIG9iaiA9IGkgPyB0aGlzLm1hcmtzIDogdGhpcy5ub2RlcztcbiAgICAgICAgZm9yICh2YXIgdG5hbWUgaW4gb2JqKSB7XG4gICAgICAgICAgdmFyIHR5cGUgPSBvYmpbdG5hbWVdO1xuICAgICAgICAgIGlmICh0eXBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcInJlZ2lzdHJ5XCIpKSB7XG4gICAgICAgICAgICB2YXIgcmVnID0gdHlwZS5yZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgICAgIGlmIChyZWcpIGZvciAodmFyIGogPSAwOyBqIDwgcmVnLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGYocmVnW2pdLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgYW5hbWUgaW4gdHlwZS5hdHRycykge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB0eXBlLmF0dHJzW2FuYW1lXSxcbiAgICAgICAgICAgICAgICByZWcgPSBhdHRyLnJlZ2lzdHJ5W25hbWVdO1xuICAgICAgICAgICAgaWYgKHJlZyAmJiBhdHRyc1NlZW4uaW5kZXhPZihhdHRyKSA9PSAtMSkge1xuICAgICAgICAgICAgICBhdHRyc1NlZW4ucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBmKHJlZ1tqXSwgYXR0cik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NoZW1hO1xufSkoKTtcblxuZXhwb3J0cy5TY2hlbWEgPSBTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5mcm9tRE9NID0gZnJvbURPTTtcbmV4cG9ydHMuZnJvbUhUTUwgPSBmcm9tSFRNTDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG4vLyA6OiAoU2NoZW1hLCBET01Ob2RlLCA/T2JqZWN0KSDihpIgTm9kZVxuLy8gUGFyc2UgZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBvZiBhIERPTSBub2RlLiBUbyBwYXNzIGFuIGV4cGxpY2l0XG4vLyBwYXJlbnQgZG9jdW1lbnQgKGZvciBleGFtcGxlLCB3aGVuIG5vdCBpbiBhIGJyb3dzZXIgd2luZG93XG4vLyBlbnZpcm9ubWVudCwgd2hlcmUgd2Ugc2ltcGx5IHVzZSB0aGUgZ2xvYmFsIGRvY3VtZW50KSwgcGFzcyBpdCBhc1xuLy8gdGhlIGBkb2N1bWVudGAgcHJvcGVydHkgb2YgYG9wdGlvbnNgLlxuXG5mdW5jdGlvbiBmcm9tRE9NKHNjaGVtYSwgZG9tLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgY29udGV4dCA9IG5ldyBET01QYXJzZVN0YXRlKHNjaGVtYSwgb3B0aW9ucy50b3BOb2RlIHx8IHNjaGVtYS5ub2RlKFwiZG9jXCIpLCBvcHRpb25zKTtcbiAgdmFyIHN0YXJ0ID0gb3B0aW9ucy5mcm9tID8gZG9tLmNoaWxkTm9kZXNbb3B0aW9ucy5mcm9tXSA6IGRvbS5maXJzdENoaWxkO1xuICB2YXIgZW5kID0gb3B0aW9ucy50byAhPSBudWxsICYmIGRvbS5jaGlsZE5vZGVzW29wdGlvbnMudG9dIHx8IG51bGw7XG4gIGNvbnRleHQuYWRkQWxsKHN0YXJ0LCBlbmQsIHRydWUpO1xuICB2YXIgZG9jID0gdW5kZWZpbmVkO1xuICB3aGlsZSAoY29udGV4dC5zdGFjay5sZW5ndGgpIGRvYyA9IGNvbnRleHQubGVhdmUoKTtcbiAgcmV0dXJuIGRvYztcbn1cblxuLy8gOzsgI3BhdGg9RE9NUGFyc2VTcGVjICNraW5kPWludGVyZmFjZSAjdG9jPWZhbHNlXG4vLyBUbyBkZWZpbmUgdGhlIHdheSBbbm9kZV0oI05vZGVUeXBlKSBhbmQgW21hcmtdKCNNYXJrVHlwZSkgdHlwZXMgYXJlXG4vLyBwYXJzZWQsIHlvdSBjYW4gYXNzb2NpYXRlIG9uZSBvciBtb3JlIERPTSBwYXJzaW5nIHNwZWNpZmljYXRpb25zIHRvXG4vLyB0aGVtIHVzaW5nIHRoZSBbYHJlZ2lzdGVyYF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBtZXRob2Qgd2l0aCB0aGVcbi8vIGBwYXJzZURPTWAgcHJvcGVydHkgbmFtZS4gRWFjaCBvZiB0aGVtIGRlZmluZXMgYSBwYXJzaW5nIHN0cmF0ZWd5XG4vLyBmb3IgYSBjZXJ0YWluIHR5cGUgb2YgRE9NIG5vZGUuXG4vL1xuLy8gTm90ZSB0aGF0IGBBdHRyaWJ1dGVgcyBtYXkgYWxzbyBjb250YWluIGEgYHBhcnNlRE9NYCBwcm9wZXJ0eSxcbi8vIHdoaWNoIHNob3VsZCBfbm90XyBiZSBhIGBET01QYXJzZVNwZWNgLCBidXQgc2ltcGx5IGEgZnVuY3Rpb24gdGhhdFxuLy8gY29tcHV0ZXMgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGZyb20gYSBET00gbm9kZS5cblxuLy8gOjogP3N0cmluZyAjcGF0aD1ET01QYXJzZVNwZWMudGFnXG4vLyBUaGUgKGxvd2VyLWNhc2UpIHRhZyBuYW1lIGZvciB3aGljaCB0byBhY3RpdmF0ZSB0aGlzIHBhcnNlci4gV2hlblxuLy8gbm90IGdpdmVuLCBpdCBpcyBhY3RpdmF0ZWQgZm9yIGFsbCBub2Rlcy5cblxuLy8gOjogP251bWJlciAjcGF0aD1ET01QYXJzZVNwZWMucmFua1xuLy8gVGhlIHByZWNlZGVuY2Ugb2YgdGhpcyBwYXJzaW5nIHN0cmF0ZWd5LiBTaG91bGQgYmUgYSBudW1iZXIgYmV0d2VlblxuLy8gMCBhbmQgMTAwLCB3aGljaCBkZXRlcm1pbmVzIHdoZW4gdGhpcyBwYXJzZXIgZ2V0cyBhIGNoYW5jZSByZWxhdGl2ZVxuLy8gdG8gb3RoZXJzIHRoYXQgYXBwbHkgdG8gdGhlIG5vZGUgKGxvdyByYW5rcyBnbyBmaXJzdCkuIERlZmF1bHRzIHRvXG4vLyA1MC5cblxuLy8gOjogdW5pb248c3RyaW5nLCAoZG9tOiBET01Ob2RlLCBzdGF0ZTogRE9NUGFyc2VTdGF0ZSkg4oaSID9ib29sPiAjcGF0aD1ET01QYXJzZVNwZWMucGFyc2Vcbi8vIFRoZSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIERPTSBub2RlLCBwYXJzZXMgaXQsIHVwZGF0aW5nIHRoZSBwYXJzZVxuLy8gc3RhdGUuIEl0IHNob3VsZCByZXR1cm4gKHRoZSBleGFjdCB2YWx1ZSkgYGZhbHNlYCB3aGVuIGl0IHdhbnRzIHRvXG4vLyBpbmRpY2F0ZSB0aGF0IGl0IHdhcyBub3QgYWJsZSB0byBwYXJzZSB0aGlzIG5vZGUuIFRoaXMgZnVuY3Rpb24gaXNcbi8vIGNhbGxlZCBpbiBzdWNoIGEgd2F5IHRoYXQgYHRoaXNgIGlzIGJvdW5kIHRvIHRoZSB0eXBlIHRoYXQgdGhlXG4vLyBwYXJzZSBzcGVjIHdhcyBhc3NvY2lhdGVkIHdpdGguXG4vL1xuLy8gV2hlbiB0aGlzIGlzIHNldCB0byB0aGUgc3RyaW5nIGBcImJsb2NrXCJgLCB0aGUgY29udGVudCBvZiB0aGUgRE9NXG4vLyBub2RlIGlzIHBhcnNlZCBhcyB0aGUgY29udGVudCBpbiBhIG5vZGUgb2YgdGhlIHR5cGUgdGhhdCB0aGlzIHNwZWNcbi8vIHdhcyBhc3NvY2lhdGVkIHdpdGguXG4vL1xuLy8gV2hlbiBzZXQgdG8gdGhlIHN0cmluZyBgXCJtYXJrXCJgLCB0aGUgY29udGVudCBvZiB0aGUgRE9NIG5vZGUgaXNcbi8vIHBhcnNlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBtYXJrIHRoYXQgdGhpcyBzcGVjIHdhcyBhc3NvY2lhdGVkXG4vLyB3aXRoIGFkZGVkIHRvIHRoZWlyIG1hcmtzLlxuXG4oMCwgX2luZGV4LmRlZmluZVNvdXJjZSkoXCJkb21cIiwgZnJvbURPTSk7XG5cbi8vIDo6IChTY2hlbWEsIHN0cmluZywgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlcyB0aGUgSFRNTCBpbnRvIGEgRE9NLCBhbmQgdGhlbiBjYWxscyB0aHJvdWdoIHRvIGBmcm9tRE9NYC5cblxuZnVuY3Rpb24gZnJvbUhUTUwoc2NoZW1hLCBodG1sLCBvcHRpb25zKSB7XG4gIHZhciB3cmFwID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHdyYXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGZyb21ET00oc2NoZW1hLCB3cmFwLCBvcHRpb25zKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwiaHRtbFwiLCBmcm9tSFRNTCk7XG5cbnZhciBibG9ja0VsZW1lbnRzID0ge1xuICBhZGRyZXNzOiB0cnVlLCBhcnRpY2xlOiB0cnVlLCBhc2lkZTogdHJ1ZSwgYmxvY2txdW90ZTogdHJ1ZSwgY2FudmFzOiB0cnVlLFxuICBkZDogdHJ1ZSwgZGl2OiB0cnVlLCBkbDogdHJ1ZSwgZmllbGRzZXQ6IHRydWUsIGZpZ2NhcHRpb246IHRydWUsIGZpZ3VyZTogdHJ1ZSxcbiAgZm9vdGVyOiB0cnVlLCBmb3JtOiB0cnVlLCBoMTogdHJ1ZSwgaDI6IHRydWUsIGgzOiB0cnVlLCBoNDogdHJ1ZSwgaDU6IHRydWUsXG4gIGg2OiB0cnVlLCBoZWFkZXI6IHRydWUsIGhncm91cDogdHJ1ZSwgaHI6IHRydWUsIGxpOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2w6IHRydWUsXG4gIG91dHB1dDogdHJ1ZSwgcDogdHJ1ZSwgcHJlOiB0cnVlLCBzZWN0aW9uOiB0cnVlLCB0YWJsZTogdHJ1ZSwgdGZvb3Q6IHRydWUsIHVsOiB0cnVlXG59O1xuXG52YXIgbm9NYXJrcyA9IFtdO1xuXG4vLyA7OyAjdG9jPWZhbHNlIEEgc3RhdGUgb2JqZWN0IHVzZWQgdG8gdHJhY2sgY29udGV4dCBkdXJpbmcgYSBwYXJzZSxcbi8vIGFuZCB0byBleHBvc2UgbWV0aG9kcyB0byBjdXN0b20gcGFyc2luZyBmdW5jdGlvbnMuXG5cbnZhciBET01QYXJzZVN0YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRE9NUGFyc2VTdGF0ZShzY2hlbWEsIHRvcE5vZGUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE9NUGFyc2VTdGF0ZSk7XG5cbiAgICAvLyA6OiBPYmplY3QgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiBTY2hlbWEgVGhlIHNjaGVtYSB0aGF0IHdlIGFyZSBwYXJzaW5nIGludG8uXG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5zdGFjayA9IFtdO1xuICAgIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgIHRoaXMuY2xvc2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW50ZXIodG9wTm9kZS50eXBlLCB0b3BOb2RlLmF0dHJzKTtcbiAgICB0aGlzLm5vZGVJbmZvID0gbm9kZUluZm8oc2NoZW1hKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhET01QYXJzZVN0YXRlLCBbe1xuICAgIGtleTogXCJwYXJzZUF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQXR0cnMoZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiB0eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gdHlwZS5hdHRyc1thdHRyXTtcbiAgICAgICAgaWYgKGRlc2MucGFyc2VET00gJiYgKCFhdHRycyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJzLCBhdHRyKSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBkZXNjLnBhcnNlRE9NKGRvbSwgdGhpcy5vcHRpb25zLCBkZXNjLCB0eXBlKTtcbiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZERPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRET00oZG9tKSB7XG4gICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gRklYTUUgZGVmaW5lIGEgY29oZXJlbnQgc3RyYXRlZ3kgZm9yIGRlYWxpbmcgd2l0aCB0cmFpbGluZywgbGVhZGluZywgYW5kIG11bHRpcGxlIHNwYWNlcyAodGhpcyBpc24ndCBvbmUpXG4gICAgICAgIHZhciB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIHZhciBfdG9wID0gdGhpcy50b3AsXG4gICAgICAgICAgICBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoL1xcUy8udGVzdCh2YWx1ZSkgfHwgX3RvcC50eXBlLmlzVGV4dGJsb2NrKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcbiAgICAgICAgICBpZiAoL15cXHMvLnRlc3QodmFsdWUpICYmIChsYXN0ID0gX3RvcC5jb250ZW50W190b3AuY29udGVudC5sZW5ndGggLSAxXSkgJiYgbGFzdC50eXBlLm5hbWUgPT0gXCJ0ZXh0XCIgJiYgL1xccyQvLnRlc3QobGFzdC50ZXh0KSkgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICBpZiAodmFsdWUpIHRoaXMuaW5zZXJ0KHRoaXMuc2NoZW1hLnRleHQodmFsdWUsIHRoaXMubWFya3MpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkb20ubm9kZVR5cGUgIT0gMSB8fCBkb20uaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZSBub24tdGV4dCBub24tZWxlbWVudCBub2Rlc1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5wYXJzZU5vZGVUeXBlKGRvbSkpIHtcbiAgICAgICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgICAgdmFyIF9uYW1lID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKGJsb2NrRWxlbWVudHMuaGFzT3duUHJvcGVydHkoX25hbWUpICYmIHRoaXMudG9wLnR5cGUgPT0gdGhpcy5zY2hlbWEuZGVmYXVsdFRleHRibG9ja1R5cGUoKSkgdGhpcy5jbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0cnlQYXJzZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyeVBhcnNlcnMocGFyc2VycywgZG9tKSB7XG4gICAgICBpZiAocGFyc2VycykgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJzZXIgPSBwYXJzZXJzW2ldO1xuICAgICAgICBpZiAocGFyc2VyLnBhcnNlLmNhbGwocGFyc2VyLnR5cGUsIGRvbSwgdGhpcykgIT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VOb2RlVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZU5vZGVUeXBlKGRvbSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJ5UGFyc2Vycyh0aGlzLm5vZGVJbmZvW2RvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSwgZG9tKSB8fCB0aGlzLnRyeVBhcnNlcnModGhpcy5ub2RlSW5mby5fLCBkb20pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRBbGxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQWxsKGZyb20sIHRvLCBzeW5jKSB7XG4gICAgICB2YXIgc3RhY2sgPSBzeW5jICYmIHRoaXMuc3RhY2suc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGRvbSA9IGZyb207IGRvbSAhPSB0bzsgZG9tID0gZG9tLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIHRoaXMuYWRkRE9NKGRvbSk7XG4gICAgICAgIGlmIChzeW5jICYmIGJsb2NrRWxlbWVudHMuaGFzT3duUHJvcGVydHkoZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB0aGlzLnN5bmMoc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb0Nsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRvQ2xvc2UoKSB7XG4gICAgICBpZiAoIXRoaXMuY2xvc2luZyB8fCB0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5sZWF2ZSgpO1xuICAgICAgdGhpcy5lbnRlcihsZWZ0LnR5cGUsIGxlZnQuYXR0cnMpO1xuICAgICAgdGhpcy5jbG9zaW5nID0gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluc2VydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnQobm9kZSkge1xuICAgICAgaWYgKHRoaXMudG9wLnR5cGUuY2FuQ29udGFpbihub2RlKSkge1xuICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5zdGFja1tpXS50eXBlLmZpbmRDb25uZWN0aW9uKG5vZGUudHlwZSk7XG4gICAgICAgICAgaWYgKCFyb3V0ZSkgY29udGludWU7XG4gICAgICAgICAgaWYgKGkgPT0gdGhpcy5zdGFjay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gaSArIDEpIHRoaXMubGVhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3V0ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdGhpcy5lbnRlcihyb3V0ZVtqXSk7XG4gICAgICAgICAgfWlmICh0aGlzLm1hcmtzLmxlbmd0aCkgdGhpcy5tYXJrcyA9IG5vTWFya3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudG9wLmNvbnRlbnQucHVzaChub2RlKTtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIDo6IChET01Ob2RlLCBOb2RlVHlwZSwgP09iamVjdCwgW05vZGVdKSDihpIgTm9kZVxuICAgIC8vIEluc2VydCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUsIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQsIGJhc2VkIG9uXG4gICAgLy8gYGRvbWAsIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydEZyb20oZG9tLCB0eXBlLCBhdHRycywgY29udGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KHR5cGUuY3JlYXRlQXV0b0ZpbGwodGhpcy5wYXJzZUF0dHJzKGRvbSwgdHlwZSwgYXR0cnMpLCBjb250ZW50LCB0aGlzLm1hcmtzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyKHR5cGUsIGF0dHJzKSB7XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgdGhpcy5zdGFjay5wdXNoKHsgdHlwZTogdHlwZSwgYXR0cnM6IGF0dHJzLCBjb250ZW50OiBbXSB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVudGVyRnJvbShkb20sIHR5cGUsIGF0dHJzKSB7XG4gICAgICB0aGlzLmVudGVyKHR5cGUsIHRoaXMucGFyc2VBdHRycyhkb20sIHR5cGUsIGF0dHJzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKCkge1xuICAgICAgdmFyIHRvcCA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICB2YXIgbm9kZSA9IHRvcC50eXBlLmNyZWF0ZUF1dG9GaWxsKHRvcC5hdHRycywgdG9wLmNvbnRlbnQpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB0aGlzLmluc2VydChub2RlKTtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzeW5jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN5bmMoc3RhY2spIHtcbiAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IHN0YWNrLmxlbmd0aCkgdGhpcy5sZWF2ZSgpO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB2YXIgbiA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIG9uZSA9IHRoaXMuc3RhY2tbbl0sXG4gICAgICAgICAgICB0d28gPSBzdGFja1tuXTtcbiAgICAgICAgaWYgKG9uZS50eXBlID09IHR3by50eXBlICYmIF9tb2RlbC5Ob2RlLnNhbWVBdHRycyhvbmUuYXR0cnMsIHR3by5hdHRycykpIGJyZWFrO1xuICAgICAgICB0aGlzLmxlYXZlKCk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gdGhpcy5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGFkZCA9IHN0YWNrW3RoaXMuc3RhY2subGVuZ3RoXTtcbiAgICAgICAgdGhpcy5lbnRlcihhZGQudHlwZSwgYWRkLmF0dHJzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aCkgdGhpcy5tYXJrcyA9IG5vTWFya3M7XG4gICAgICB0aGlzLmNsb3NpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoRE9NTm9kZSwgTm9kZVR5cGUsID9PYmplY3QpXG4gICAgLy8gUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGBkb21gIGFzIGNoaWxkcmVuIG9mIGEgbm9kZSBvZiB0aGUgZ2l2ZW5cbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcIndyYXBJblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwSW4oZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgdGhpcy5lbnRlckZyb20oZG9tLCB0eXBlLCBhdHRycyk7XG4gICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxlYXZlKCk7XG4gICAgfVxuXG4gICAgLy8gOjogKERPTU5vZGUsIE1hcmspXG4gICAgLy8gUGFyc2UgdGhlIGNvbnRlbnRzIG9mIGBkb21gLCB3aXRoIGBtYXJrYCBhZGRlZCB0byB0aGUgc2V0IG9mXG4gICAgLy8gY3VycmVudCBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwTWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwTWFyayhkb20sIG1hcmspIHtcbiAgICAgIHZhciBvbGQgPSB0aGlzLm1hcmtzO1xuICAgICAgdGhpcy5tYXJrcyA9IChtYXJrLmluc3RhbmNlIHx8IG1hcmspLmFkZFRvU2V0KG9sZCk7XG4gICAgICB0aGlzLmFkZEFsbChkb20uZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICB0aGlzLm1hcmtzID0gb2xkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b3BcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERPTVBhcnNlU3RhdGU7XG59KSgpO1xuXG5mdW5jdGlvbiBub2RlSW5mbyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5jYWNoZWQucGFyc2VET01Ob2RlcyB8fCAoc2NoZW1hLmNhY2hlZC5wYXJzZURPTU5vZGVzID0gc3VtbWFyaXplTm9kZUluZm8oc2NoZW1hKSk7XG59XG5cbmZ1bmN0aW9uIHN1bW1hcml6ZU5vZGVJbmZvKHNjaGVtYSkge1xuICB2YXIgdGFncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRhZ3MuXyA9IFtdO1xuICBzY2hlbWEucmVnaXN0cnkoXCJwYXJzZURPTVwiLCBmdW5jdGlvbiAoaW5mbywgdHlwZSkge1xuICAgIHZhciB0YWcgPSBpbmZvLnRhZyB8fCBcIl9cIjtcbiAgICB2YXIgcGFyc2UgPSBpbmZvLnBhcnNlO1xuICAgIGlmIChwYXJzZSA9PSBcImJsb2NrXCIpIHBhcnNlID0gZnVuY3Rpb24gKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMpO1xuICAgIH07ZWxzZSBpZiAocGFyc2UgPT0gXCJtYXJrXCIpIHBhcnNlID0gZnVuY3Rpb24gKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBNYXJrKGRvbSwgdGhpcyk7XG4gICAgfTsodGFnc1t0YWddIHx8ICh0YWdzW3RhZ10gPSBbXSkpLnB1c2goe1xuICAgICAgdHlwZTogdHlwZSwgcGFyc2U6IHBhcnNlLFxuICAgICAgcmFuazogaW5mby5yYW5rID09IG51bGwgPyA1MCA6IGluZm8ucmFua1xuICAgIH0pO1xuICB9KTtcbiAgZm9yICh2YXIgdGFnIGluIHRhZ3MpIHtcbiAgICB0YWdzW3RhZ10uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICB9KTtcbiAgfXJldHVybiB0YWdzO1xufVxuXG5fbW9kZWwuUGFyYWdyYXBoLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwicFwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuQmxvY2tRdW90ZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImJsb2NrcXVvdGVcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxudmFyIF9sb29wID0gZnVuY3Rpb24gKGkpIHtcbiAgX21vZGVsLkhlYWRpbmcucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7XG4gICAgdGFnOiBcImhcIiArIGksXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMsIHsgbGV2ZWw6IGkgfSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmZvciAodmFyIGkgPSAxOyBpIDw9IDY7IGkrKykge1xuICBfbG9vcChpKTtcbn1fbW9kZWwuSG9yaXpvbnRhbFJ1bGUucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJoclwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuQ29kZUJsb2NrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwicHJlXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgdmFyIHBhcmFtcyA9IGRvbS5maXJzdENoaWxkICYmIC9eY29kZSQvaS50ZXN0KGRvbS5maXJzdENoaWxkLm5vZGVOYW1lKSAmJiBkb20uZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgICBpZiAocGFyYW1zICYmIC9mZW5jZS8udGVzdChwYXJhbXMpKSB7XG4gICAgICB2YXIgZm91bmQgPSBbXSxcbiAgICAgICAgICByZSA9IC8oPzpefFxccylsYW5nLShcXFMrKS9nLFxuICAgICAgICAgIG0gPSB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAobSA9IHJlLnRlc3QocGFyYW1zKSkgZm91bmQucHVzaChtWzFdKTtcbiAgICAgIHBhcmFtcyA9IGZvdW5kLmpvaW4oXCIgXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgdGV4dCA9IGRvbS50ZXh0Q29udGVudDtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcywgeyBwYXJhbXM6IHBhcmFtcyB9LCB0ZXh0ID8gW3N0YXRlLnNjaGVtYS50ZXh0KHRleHQpXSA6IFtdKTtcbiAgfSB9KTtcblxuX21vZGVsLkJ1bGxldExpc3QucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJ1bFwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuT3JkZXJlZExpc3QucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJvbFwiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHZhciBhdHRycyA9IHsgb3JkZXI6IGRvbS5nZXRBdHRyaWJ1dGUoXCJzdGFydFwiKSB8fCAxIH07XG4gICAgc3RhdGUud3JhcEluKGRvbSwgdGhpcywgYXR0cnMpO1xuICB9IH0pO1xuXG5fbW9kZWwuTGlzdEl0ZW0ucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJsaVwiLCBwYXJzZTogXCJibG9ja1wiIH0pO1xuXG5fbW9kZWwuSGFyZEJyZWFrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiYnJcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcyk7XG4gIH0gfSk7XG5cbl9tb2RlbC5JbWFnZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImltZ1wiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHN0YXRlLmluc2VydEZyb20oZG9tLCB0aGlzLCB7XG4gICAgICBzcmM6IGRvbS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksXG4gICAgICB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIHx8IG51bGwsXG4gICAgICBhbHQ6IGRvbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgfHwgbnVsbFxuICAgIH0pO1xuICB9IH0pO1xuXG4vLyBJbmxpbmUgc3R5bGUgdG9rZW5zXG5cbl9tb2RlbC5MaW5rTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImFcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICB2YXIgaHJlZiA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlO1xuICAgIHN0YXRlLndyYXBNYXJrKGRvbSwgdGhpcy5jcmVhdGUoeyBocmVmOiBocmVmLCB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIH0pKTtcbiAgfSB9KTtcblxuX21vZGVsLkVtTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImlcIiwgcGFyc2U6IFwibWFya1wiIH0pO1xuX21vZGVsLkVtTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImVtXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcblxuX21vZGVsLlN0cm9uZ01hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJiXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcbl9tb2RlbC5TdHJvbmdNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwic3Ryb25nXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcblxuX21vZGVsLkNvZGVNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiY29kZVwiLCBwYXJzZTogXCJtYXJrXCIgfSk7IiwiLy8gISEgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHdheSB0byByZWdpc3RlciBhbmQgYWNjZXNzIHBhcnNlcnMgZnJvbVxuLy8gdmFyaW91cyBpbnB1dCBmb3JtYXRzIHRvIFByb3NlTWlycm9yJ3MgW2RvY3VtZW50IGZvcm1hdF0oI05vZGUpLiBUb1xuLy8gbG9hZCB0aGUgYWN0dWFsIHBhcnNlcnMsIHlvdSBuZWVkIHRvIGltcG9ydCBwYXJzZXIgbW9kdWxlcyBsaWtlXG4vLyBgcGFyc2UvZG9tYCBvciBgcGFyc2UvbWFya2Rvd25gLCB3aGljaCB3aWxsIHRoZW4gcmVnaXN0ZXJcbi8vIHRoZW1zZWx2ZXMgaGVyZSwgYXMgd2VsbCBhcyBleHBvcnQgc3BlY2lhbC1wdXJwb3NlIHBhcnNpbmdcbi8vIGZ1bmN0aW9ucy5cbi8vXG4vLyBUaGVzZSBhcmUgdGhlIHBhcnNlcyBpbiB0aGUgZGlzdHJpYnV0aW9uOlxuLy9cbi8vICoqYFwianNvblwiYCoqXG4vLyAgIDogVGhlIHRvcC1sZXZlbCBtb2R1bGUgZGVmaW5lcyBhIHNpbmdsZSBwYXJzZXIgYFwianNvblwiYCwgd2hpY2hcbi8vICAgICB1c2VzIGBOb2RlLmZyb21KU09OYCB0byBwYXJzZSBKU09OIGRhdGEuXG4vL1xuLy8gKipgXCJkb21cImAqKlxuLy8gICA6IFBhcnNlcyBbRE9NXG4vLyAgICAgbm9kZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlKS5cbi8vICAgICBEZWZpbmVkIGluIGBwYXJzZS9kb21gLiBTZWUgYGZyb21ET01gLlxuLy9cbi8vICoqYFwiaHRtbFwiYCoqXG4vLyAgIDogUGFyc2VzIHN0cmluZ3Mgb2YgSFRNTCBjb250ZW50LiBEZWZpbmVkIGluIGBwYXJzZS9kb21gLlxuLy9cbi8vICoqYFwibWFya2Rvd25cImAqKlxuLy8gICA6IFBhcnNlcyBzdHJpbmdzIG9mXG4vLyAgICAgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pLWZvcm1hdHRlZCB0ZXh0LiBEZWZpbmVkIGluXG4vLyAgICAgYHBhcnNlL21hcmtkb3duYC4gU2VlIGBmcm9tTWFya2Rvd25gLlxuLy9cbi8vICoqYFwidGV4dFwiYCoqXG4vLyAgIDogU2ltcGx5IHNwbGl0cyBhIHN0cmluZyBvZiB0ZXh0IG9uIGJsYW5rIGxpbmVzIGFuZCBjcmVhdGVzIGFcbi8vICAgICBkb2N1bWVudCBjb250YWluaW5nIHRob3NlIGxpbmVzIGFzIHBhcmFncmFwaHMuIERlZmluZWQgaW5cbi8vICAgICBgcGFyc2UvdGV4dGAuIFNlZSBgZnJvbVRleHRgLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucGFyc2VGcm9tID0gcGFyc2VGcm9tO1xuZXhwb3J0cy5rbm93blNvdXJjZSA9IGtub3duU291cmNlO1xuZXhwb3J0cy5kZWZpbmVTb3VyY2UgPSBkZWZpbmVTb3VyY2U7XG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChTY2hlbWEsIGFueSwgc3RyaW5nLCA/T2JqZWN0KSDihpIgTm9kZVxuLy8gUGFyc2UgZG9jdW1lbnQgYHZhbHVlYCBmcm9tIHRoZSBmb3JtYXQgbmFtZWQgYnkgYGZvcm1hdGAuIElmXG4vLyBgb3B0aW9uc2AgaXMgZ2l2ZW4sIGl0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgcGFyc2VyIGZ1bmN0aW9uLlxuXG5mdW5jdGlvbiBwYXJzZUZyb20oc2NoZW1hLCB2YWx1ZSwgZm9ybWF0LCBvcHRpb25zKSB7XG4gIHZhciBjb252ZXJ0ZXIgPSBwYXJzZXJzW2Zvcm1hdF07XG4gIGlmICghY29udmVydGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2UgZm9ybWF0IFwiICsgZm9ybWF0ICsgXCIgbm90IGRlZmluZWRcIik7XG4gIHJldHVybiBjb252ZXJ0ZXIoc2NoZW1hLCB2YWx1ZSwgb3B0aW9ucyk7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBib29sXG4vLyBRdWVyeSB3aGV0aGVyIGEgcGFyc2VyIGZvciB0aGUgbmFtZWQgZm9ybWF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG5cbmZ1bmN0aW9uIGtub3duU291cmNlKGZvcm1hdCkge1xuICByZXR1cm4gISFwYXJzZXJzW2Zvcm1hdF07XG59XG5cbi8vIDo6IChzdHJpbmcsIChTY2hlbWEsIGFueSwgP09iamVjdCkg4oaSIE5vZGUpXG4vLyBSZWdpc3RlciBhIHBhcnNlciBmdW5jdGlvbiBmb3IgYGZvcm1hdGAuXG5cbmZ1bmN0aW9uIGRlZmluZVNvdXJjZShmb3JtYXQsIGZ1bmMpIHtcbiAgcGFyc2Vyc1tmb3JtYXRdID0gZnVuYztcbn1cblxuZGVmaW5lU291cmNlKFwianNvblwiLCBmdW5jdGlvbiAoc2NoZW1hLCBqc29uKSB7XG4gIHJldHVybiBzY2hlbWEubm9kZUZyb21KU09OKGpzb24pO1xufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmZyb21UZXh0ID0gZnJvbVRleHQ7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9pbmRleFwiKTtcblxuLy8gRklYTUUgaXMgaXQgbWVhbmluZ2Z1bCB0byB0cnkgYW5kIGF0dGFjaCB0ZXh0LXBhcnNpbmcgaW5mb3JtYXRpb25cbi8vIHRvIG5vZGUgdHlwZXM/XG5cbi8vIDo6IChTY2hlbWEsIHN0cmluZykg4oaSIE5vZGVcbi8vIENvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNpbXBsZSBQcm9zZU1pcnJvciBkb2N1bWVudC5cblxuZnVuY3Rpb24gZnJvbVRleHQoc2NoZW1hLCB0ZXh0KSB7XG4gIHZhciBibG9ja3MgPSB0ZXh0LnRyaW0oKS5zcGxpdCgvXFxuezIsfS8pO1xuICB2YXIgbm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BhbnMgPSBbXTtcbiAgICB2YXIgcGFydHMgPSBibG9ja3NbaV0uc3BsaXQoXCJcXG5cIik7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGopIHNwYW5zLnB1c2goc2NoZW1hLm5vZGUoXCJoYXJkX2JyZWFrXCIpKTtcbiAgICAgIGlmIChwYXJ0c1tqXSkgc3BhbnMucHVzaChzY2hlbWEudGV4dChwYXJ0c1tqXSkpO1xuICAgIH1cbiAgICBub2Rlcy5wdXNoKHNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIsIG51bGwsIHNwYW5zKSk7XG4gIH1cbiAgaWYgKCFub2Rlcy5sZW5ndGgpIG5vZGVzLnB1c2goc2NoZW1hLm5vZGUoXCJwYXJhZ3JhcGhcIikpO1xuICByZXR1cm4gc2NoZW1hLm5vZGUoXCJkb2NcIiwgbnVsbCwgbm9kZXMpO1xufVxuXG4oMCwgX2luZGV4LmRlZmluZVNvdXJjZSkoXCJ0ZXh0XCIsIGZyb21UZXh0KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLnRvRE9NID0gdG9ET007XG5leHBvcnRzLnJlbmRlck5vZGVUb0RPTSA9IHJlbmRlck5vZGVUb0RPTTtcbmV4cG9ydHMudG9IVE1MID0gdG9IVE1MO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbi8vIDs7ICN0b2M9ZmFsc2UgT2JqZWN0IHVzZWQgdG8gdG8gZXhwb3NlIHJlbGV2YW50IHZhbHVlcyBhbmQgbWV0aG9kc1xuLy8gdG8gRE9NIHNlcmlhbGl6ZXIgZnVuY3Rpb25zLlxuXG52YXIgRE9NU2VyaWFsaXplciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERPTVNlcmlhbGl6ZXIob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBET01TZXJpYWxpemVyKTtcblxuICAgIC8vIDo6IE9iamVjdCBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNlcmlhbGl6ZXIuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiBET01Eb2N1bWVudCBUaGUgRE9NIGRvY3VtZW50IGluIHdoaWNoIHdlIGFyZSB3b3JraW5nLlxuICAgIHRoaXMuZG9jID0gdGhpcy5vcHRpb25zLmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudDtcbiAgfVxuXG4gIC8vIDo6IChOb2RlLCA/T2JqZWN0KSDihpIgRE9NRnJhZ21lbnRcbiAgLy8gU2VyaWFsaXplIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBub2RlIHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuIG5vdFxuICAvLyBpbiB0aGUgYnJvd3NlciwgdGhlIGBkb2N1bWVudGAgb3B0aW9uLCBjb250YWluaW5nIGEgRE9NIGRvY3VtZW50LFxuICAvLyBzaG91bGQgYmUgcGFzc2VkIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZSBjYW4gY3JlYXRlIG5vZGVzLlxuICAvL1xuICAvLyBUbyBkZWZpbmUgcmVuZGVyaW5nIGJlaGF2aW9yIGZvciB5b3VyIG93biBbbm9kZV0oI05vZGVUeXBlKSBhbmRcbiAgLy8gW21hcmtdKCNNYXJrVHlwZSkgdHlwZXMsIGdpdmUgdGhlbSBhIGBzZXJpYWxpemVET01gIG1ldGhvZC4gVGhpc1xuICAvLyBtZXRob2QgaXMgcGFzc2VkIGEgYE5vZGVgIGFuZCBhIGBET01TZXJpYWxpemVyYCwgYW5kIHNob3VsZCByZXR1cm5cbiAgLy8gdGhlIFtET01cbiAgLy8gbm9kZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUpIHRoYXRcbiAgLy8gcmVwcmVzZW50cyB0aGlzIG5vZGUgYW5kIGl0cyBjb250ZW50LiBGb3IgbWFya3MsIHRoYXQgc2hvdWxkIGJlIGFuXG4gIC8vIGlubGluZSB3cmFwcGluZyBub2RlIGxpa2UgYDxhPmAgb3IgYDxzdHJvbmc+YC5cbiAgLy9cbiAgLy8gSW5kaXZpZHVhbCBhdHRyaWJ1dGVzIGNhbiBhbHNvIGRlZmluZSBzZXJpYWxpemF0aW9uIGJlaGF2aW9yLiBJZiBhblxuICAvLyBgQXR0cmlidXRlYCBvYmplY3QgaGFzIGEgYHNlcmlhbGl6ZURPTWAgbWV0aG9kLCB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gIC8vIHdpdGggdGhlIERPTSBub2RlIHJlcHJlc2VudGluZyB0aGUgbm9kZSB0aGF0IHRoZSBhdHRyaWJ1dGUgYXBwbGllc1xuICAvLyB0byBhbmQgdGhlIGF0dHRyaWJ1dGUncyB2YWx1ZSwgc28gdGhhdCBpdCBjYW4gc2V0IGFkZGl0aW9uYWwgRE9NXG4gIC8vIGF0dHJpYnV0ZXMgb24gdGhlIERPTSBub2RlLlxuXG4gIC8vIDo6IChzdHJpbmcsID9PYmplY3QsIC4uLnVuaW9uPHN0cmluZywgRE9NTm9kZT4pIOKGkiBET01Ob2RlXG4gIC8vIENyZWF0ZSBhIERPTSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIChvcHRpb25hbGx5KSB0aGUgZ2l2ZW5cbiAgLy8gYXR0cmlidXRlcyBhbmQgY29udGVudC4gQ29udGVudCBlbGVtZW50cyBtYXkgYmUgc3RyaW5ncyAoZm9yIHRleHRcbiAgLy8gbm9kZXMpIG9yIG90aGVyIERPTSBub2Rlcy5cblxuICBfY3JlYXRlQ2xhc3MoRE9NU2VyaWFsaXplciwgW3tcbiAgICBrZXk6IFwiZWx0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVsdCh0eXBlLCBhdHRycykge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7XG4gICAgICBpZiAoYXR0cnMpIGZvciAodmFyIF9uYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGlmIChfbmFtZSA9PSBcInN0eWxlXCIpIHJlc3VsdC5zdHlsZS5jc3NUZXh0ID0gYXR0cnNbX25hbWVdO2Vsc2UgaWYgKGF0dHJzW19uYW1lXSkgcmVzdWx0LnNldEF0dHJpYnV0ZShfbmFtZSwgYXR0cnNbX25hbWVdKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGNvbnRlbnQgPSBBcnJheShfbGVuID4gMiA/IF9sZW4gLSAyIDogMCksIF9rZXkgPSAyOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGNvbnRlbnRbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LmFwcGVuZENoaWxkKHR5cGVvZiBjb250ZW50W2ldID09IFwic3RyaW5nXCIgPyB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShjb250ZW50W2ldKSA6IGNvbnRlbnRbaV0pO1xuICAgICAgfXJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTm9kZShub2RlLCBvZmZzZXQpIHtcbiAgICAgIHZhciBkb20gPSBub2RlLnR5cGUuc2VyaWFsaXplRE9NKG5vZGUsIHRoaXMpO1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiBub2RlLnR5cGUuYXR0cnMpIHtcbiAgICAgICAgdmFyIGRlc2MgPSBub2RlLnR5cGUuYXR0cnNbYXR0cl07XG4gICAgICAgIGlmIChkZXNjLnNlcmlhbGl6ZURPTSkgZGVzYy5zZXJpYWxpemVET00oZG9tLCBub2RlLmF0dHJzW2F0dHJdLCB0aGlzLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub25SZW5kZXIpIGRvbSA9IHRoaXMub3B0aW9ucy5vblJlbmRlcihub2RlLCBkb20sIG9mZnNldCkgfHwgZG9tO1xuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDb250ZW50KG5vZGUsIHdoZXJlKSB7XG4gICAgICBpZiAoIXdoZXJlKSB3aGVyZSA9IHRoaXMuZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgIGlmICghbm9kZS5pc1RleHRibG9jaykgdGhpcy5yZW5kZXJCbG9ja3NJbnRvKG5vZGUsIHdoZXJlKTtlbHNlIGlmICh0aGlzLm9wdGlvbnMucmVuZGVySW5saW5lRmxhdCkgdGhpcy5yZW5kZXJJbmxpbmVGbGF0SW50byhub2RlLCB3aGVyZSk7ZWxzZSB0aGlzLnJlbmRlcklubGluZUludG8obm9kZSwgd2hlcmUpO1xuICAgICAgcmV0dXJuIHdoZXJlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJCbG9ja3NJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckJsb2Nrc0ludG8ocGFyZW50LCB3aGVyZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHBhcmVudC5pdGVyKCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHRoaXMub3B0aW9ucy5wYXRoLnB1c2goaS5vZmZzZXQgLSBjaGlsZC53aWR0aCk7XG4gICAgICAgIHdoZXJlLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyTm9kZShjaGlsZCwgaS5vZmZzZXQgLSBjaGlsZC53aWR0aCkpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHRoaXMub3B0aW9ucy5wYXRoLnBvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJJbmxpbmVJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcklubGluZUludG8ocGFyZW50LCB3aGVyZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHRvcCA9IHdoZXJlO1xuICAgICAgdmFyIGFjdGl2ZSA9IFtdO1xuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIG9mZnNldCkge1xuICAgICAgICB2YXIga2VlcCA9IDA7XG4gICAgICAgIGZvciAoOyBrZWVwIDwgTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgbm9kZS5tYXJrcy5sZW5ndGgpOyArK2tlZXApIGlmICghbm9kZS5tYXJrc1trZWVwXS5lcShhY3RpdmVba2VlcF0pKSBicmVhaztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgYWN0aXZlLnBvcCgpO1xuICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgYWRkID0gbm9kZS5tYXJrc1thY3RpdmUubGVuZ3RoXTtcbiAgICAgICAgICBhY3RpdmUucHVzaChhZGQpO1xuICAgICAgICAgIHRvcCA9IHRvcC5hcHBlbmRDaGlsZChfdGhpcy5yZW5kZXJNYXJrKGFkZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5hcHBlbmRDaGlsZChfdGhpcy5yZW5kZXJOb2RlKG5vZGUsIG9mZnNldCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlcklubGluZUZsYXRJbnRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcklubGluZUZsYXRJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBwYXJlbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgc3RhcnQpIHtcbiAgICAgICAgdmFyIGRvbSA9IF90aGlzMi5yZW5kZXJOb2RlKG5vZGUsIHN0YXJ0KTtcbiAgICAgICAgZG9tID0gX3RoaXMyLndyYXBJbmxpbmVGbGF0KGRvbSwgbm9kZS5tYXJrcyk7XG4gICAgICAgIGRvbSA9IF90aGlzMi5vcHRpb25zLnJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBzdGFydCkgfHwgZG9tO1xuICAgICAgICB3aGVyZS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlck1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTWFyayhtYXJrKSB7XG4gICAgICB2YXIgZG9tID0gbWFyay50eXBlLnNlcmlhbGl6ZURPTShtYXJrLCB0aGlzKTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gbWFyay50eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gbWFyay50eXBlLmF0dHJzW2F0dHJdO1xuICAgICAgICBpZiAoZGVzYy5zZXJpYWxpemVET00pIGRlc2Muc2VyaWFsaXplRE9NKGRvbSwgbWFyay5hdHRyc1thdHRyXSwgdGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwSW5saW5lRmxhdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwSW5saW5lRmxhdChkb20sIG1hcmtzKSB7XG4gICAgICBmb3IgKHZhciBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHdyYXAgPSB0aGlzLnJlbmRlck1hcmsobWFya3NbaV0pO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgICAgIGRvbSA9IHdyYXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlLCBzdHJpbmcsID9PYmplY3QpIOKGkiBET01Ob2RlXG4gICAgLy8gUmVuZGVyIHRoZSBjb250ZW50IG9mIFByb3NlTWlycm9yIG5vZGUgaW50byBhIERPTSBub2RlIHdpdGggdGhlXG4gICAgLy8gZ2l2ZW4gdGFnIG5hbWUgYW5kIGF0dHJpYnV0ZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQXMobm9kZSwgdGFnTmFtZSwgdGFnQXR0cnMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRlbnQobm9kZSwgdGhpcy5lbHQodGFnTmFtZSwgdGFnQXR0cnMpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRE9NU2VyaWFsaXplcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIHRvRE9NKG5vZGUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1sxXTtcblxuICByZXR1cm4gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucykucmVuZGVyQ29udGVudChub2RlKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwiZG9tXCIsIHRvRE9NKTtcblxuLy8gOjogKE5vZGUsID9PYmplY3QpIOKGkiBET01Ob2RlXG4vLyBTZXJpYWxpemUgYSBnaXZlbiBub2RlIHRvIGEgRE9NIG5vZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWRcbi8vIHRvIHNlcmlhbGl6ZSBhIHBhcnQgb2YgYSBkb2N1bWVudCwgYXMgb3Bwb3NlZCB0byB0aGUgd2hvbGVcbi8vIGRvY3VtZW50LlxuXG5mdW5jdGlvbiByZW5kZXJOb2RlVG9ET00obm9kZSwgb3B0aW9ucywgb2Zmc2V0KSB7XG4gIHZhciBzZXJpYWxpemVyID0gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gIHZhciBkb20gPSBzZXJpYWxpemVyLnJlbmRlck5vZGUobm9kZSwgb2Zmc2V0KTtcbiAgaWYgKG5vZGUuaXNJbmxpbmUpIHtcbiAgICBkb20gPSBzZXJpYWxpemVyLndyYXBJbmxpbmVGbGF0KGRvbSwgbm9kZS5tYXJrcyk7XG4gICAgaWYgKHNlcmlhbGl6ZXIub3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KSBkb20gPSBvcHRpb25zLnJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBvZmZzZXQpIHx8IGRvbTtcbiAgfVxuICByZXR1cm4gZG9tO1xufVxuXG4vLyA6OiAoTm9kZSwgP09iamVjdCkg4oaSIHN0cmluZ1xuLy8gU2VyaWFsaXplIGEgbm9kZSBhcyBhbiBIVE1MIHN0cmluZy4gR29lcyB0aHJvdWdoIGB0b0RPTWAgYW5kIHRoZW5cbi8vIHNlcmlhbGl6ZXMgdGhlIHJlc3VsdC4gQWdhaW4sIHlvdSBtdXN0IHBhc3MgYSBgZG9jdW1lbnRgIG9wdGlvblxuLy8gd2hlbiBub3QgaW4gdGhlIGJyb3dzZXIuXG5cbmZ1bmN0aW9uIHRvSFRNTChub2RlLCBvcHRpb25zKSB7XG4gIHZhciBzZXJpYWxpemVyID0gbmV3IERPTVNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gIHZhciB3cmFwID0gc2VyaWFsaXplci5lbHQoXCJkaXZcIik7XG4gIHdyYXAuYXBwZW5kQ2hpbGQoc2VyaWFsaXplci5yZW5kZXJDb250ZW50KG5vZGUpKTtcbiAgcmV0dXJuIHdyYXAuaW5uZXJIVE1MO1xufVxuXG4oMCwgX2luZGV4LmRlZmluZVRhcmdldCkoXCJodG1sXCIsIHRvSFRNTCk7XG5cbi8vIEJsb2NrIG5vZGVzXG5cbmZ1bmN0aW9uIGRlZihjbHMsIG1ldGhvZCkge1xuICBjbHMucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IG1ldGhvZDtcbn1cblxuZGVmKF9tb2RlbC5CbG9ja1F1b3RlLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImJsb2NrcXVvdGVcIik7XG59KTtcblxuX21vZGVsLkJsb2NrUXVvdGUucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZCA9IGZ1bmN0aW9uIChfLCBwYXRoLCBkb20sIGNvb3Jkcykge1xuICB2YXIgY2hpbGRCb3ggPSBkb20uZmlyc3RDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgaWYgKGNvb3Jkcy5sZWZ0IDwgY2hpbGRCb3gubGVmdCAtIDIpIHJldHVybiBfbW9kZWwuUG9zLmZyb20ocGF0aCk7XG59O1xuXG5kZWYoX21vZGVsLkJ1bGxldExpc3QsIGZ1bmN0aW9uIChub2RlLCBzKSB7XG4gIHJldHVybiBzLnJlbmRlckFzKG5vZGUsIFwidWxcIik7XG59KTtcblxuZGVmKF9tb2RlbC5PcmRlcmVkTGlzdCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyICE9IFwiMVwiICYmIG5vZGUuYXR0cnMub3JkZXIgfSk7XG59KTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQgPSBfbW9kZWwuQnVsbGV0TGlzdC5wcm90b3R5cGUuY291bnRDb29yZHNBc0NoaWxkID0gZnVuY3Rpb24gKF8sIHBhdGgsIGRvbSwgY29vcmRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoIWNoaWxkLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkgY29udGludWU7XG4gICAgdmFyIGNoaWxkQm94ID0gY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGNvb3Jkcy5sZWZ0ID4gY2hpbGRCb3gubGVmdCAtIDIpIHJldHVybiBudWxsO1xuICAgIGlmIChjaGlsZEJveC50b3AgPD0gY29vcmRzLnRvcCAmJiBjaGlsZEJveC5ib3R0b20gPj0gY29vcmRzLnRvcCkgcmV0dXJuIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGkpO1xuICB9XG59O1xuXG5kZWYoX21vZGVsLkxpc3RJdGVtLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImxpXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuSG9yaXpvbnRhbFJ1bGUsIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImhyXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuUGFyYWdyYXBoLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcInBcIik7XG59KTtcblxuZGVmKF9tb2RlbC5IZWFkaW5nLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcImhcIiArIG5vZGUuYXR0cnMubGV2ZWwpO1xufSk7XG5cbmRlZihfbW9kZWwuQ29kZUJsb2NrLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICB2YXIgY29kZSA9IHMucmVuZGVyQXMobm9kZSwgXCJjb2RlXCIpO1xuICBpZiAobm9kZS5hdHRycy5wYXJhbXMgIT0gbnVsbCkgY29kZS5jbGFzc05hbWUgPSBcImZlbmNlIFwiICsgbm9kZS5hdHRycy5wYXJhbXMucmVwbGFjZSgvKF58XFxzKykvZywgXCIkJmxhbmctXCIpO1xuICByZXR1cm4gcy5lbHQoXCJwcmVcIiwgbnVsbCwgY29kZSk7XG59KTtcblxuLy8gSW5saW5lIGNvbnRlbnRcblxuZGVmKF9tb2RlbC5UZXh0LCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5kb2MuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbn0pO1xuXG5kZWYoX21vZGVsLkltYWdlLCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5lbHQoXCJpbWdcIiwge1xuICAgIHNyYzogbm9kZS5hdHRycy5zcmMsXG4gICAgYWx0OiBub2RlLmF0dHJzLmFsdCxcbiAgICB0aXRsZTogbm9kZS5hdHRycy50aXRsZVxuICB9KTtcbn0pO1xuXG5kZWYoX21vZGVsLkhhcmRCcmVhaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiYnJcIik7XG59KTtcblxuLy8gSW5saW5lIHN0eWxlc1xuXG5kZWYoX21vZGVsLkVtTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiZW1cIik7XG59KTtcblxuZGVmKF9tb2RlbC5TdHJvbmdNYXJrLCBmdW5jdGlvbiAoXywgcykge1xuICByZXR1cm4gcy5lbHQoXCJzdHJvbmdcIik7XG59KTtcblxuZGVmKF9tb2RlbC5Db2RlTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiY29kZVwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLkxpbmtNYXJrLCBmdW5jdGlvbiAobWFyaywgcykge1xuICByZXR1cm4gcy5lbHQoXCJhXCIsIHsgaHJlZjogbWFyay5hdHRycy5ocmVmLFxuICAgIHRpdGxlOiBtYXJrLmF0dHJzLnRpdGxlIH0pO1xufSk7IiwiLy8gISEgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSB3YXkgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBmdW5jdGlvbnMgdGhhdFxuLy8gc2VyaWFsaXplIFByb3NlTWlycm9yIFtkb2N1bWVudHNdKCNOb2RlKSB0byB2YXJpb3VzIGZvcm1hdHMuIFRvXG4vLyBsb2FkIHRoZSBhY3R1YWwgc2VyaWFsaXplcnMsIHlvdSBuZWVkIHRvIGluY2x1ZGUgc3VibW9kdWxlcyBvZiB0aGlzXG4vLyBtb2R1bGUgKG9yIDNyZCBwYXJ0eSBzZXJpYWxpemF0aW9uIG1vZHVsZXMpLCB3aGljaCB3aWxsIHJlZ2lzdGVyXG4vLyB0aGVtc2VsdmVzIHRvIHRoaXMgbW9kdWxlLlxuLy9cbi8vIFRoZXNlIGFyZSB0aGUgc2VyaWFsaXplcnMgZGVmaW5lZDpcbi8vXG4vLyAqKmBcImpzb25cImAqKlxuLy8gICA6IFVzZSBgTm9kZS50b0pTT05gIHRvIHNlcmlhbGl6ZSB0aGUgbm9kZSBhcyBKU09OLiBEZWZpbmVkIGJ5IHRoZVxuLy8gICAgIHRvcC1sZXZlbCBgc2VyaWFsaXplYCBtb2R1bGUuXG4vL1xuLy8gKipgXCJkb21cImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBhIFtET01cbi8vICAgICBmcmFnbWVudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnQpLlxuLy8gICAgIERlZmluZWQgaW4gYHNlcmlhbGl6ZS9kb21gLiBTZWUgYHRvRE9NYC5cbi8vXG4vLyAqKmBcImh0bWxcImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBIVE1MIHRleHQuIERlZmluZWQgaW4gYHNlcmlhbGl6ZS9kb21gLiBTZWUgYHRvSFRNTGAuXG4vL1xuLy8gKipgXCJtYXJrZG93blwiYCoqXG4vLyAgIDogU2VyaWFsaXplIHRvIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSBtYXJrZWQtdXBcbi8vICAgICB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvbWFya2Rvd25gLiBTZWUgYHRvTWFya2Rvd25gLlxuLy9cbi8vICoqYFwidGV4dFwiYCoqXG4vLyAgIDogU2VyaWFsaXplIHRvIHBsYWluIHRleHQuIERlZmluZWQgaW4gYHNlcmlhbGl6ZS90ZXh0YC4gU2VlIGB0b1RleHRgLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuc2VyaWFsaXplVG8gPSBzZXJpYWxpemVUbztcbmV4cG9ydHMua25vd25UYXJnZXQgPSBrbm93blRhcmdldDtcbmV4cG9ydHMuZGVmaW5lVGFyZ2V0ID0gZGVmaW5lVGFyZ2V0O1xudmFyIHNlcmlhbGl6ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gOjogKE5vZGUsIHN0cmluZywgP09iamVjdCkg4oaSIGFueVxuLy8gU2VyaWFsaXplIHRoZSBnaXZlbiBkb2N1bWVudCB0byB0aGUgZ2l2ZW4gZm9ybWF0LiBJZiBgb3B0aW9uc2AgaXNcbi8vIGdpdmVuLCBpdCB3aWxsIGJlIHBhc3NlZCBhbG9uZyB0byB0aGUgc2VyaWFsaXplciBmdW5jdGlvbi5cblxuZnVuY3Rpb24gc2VyaWFsaXplVG8oZG9jLCBmb3JtYXQsIG9wdGlvbnMpIHtcbiAgdmFyIGNvbnZlcnRlciA9IHNlcmlhbGl6ZXJzW2Zvcm1hdF07XG4gIGlmICghY29udmVydGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgZm9ybWF0IFwiICsgZm9ybWF0ICsgXCIgbm90IGRlZmluZWRcIik7XG4gIHJldHVybiBjb252ZXJ0ZXIoZG9jLCBvcHRpb25zKTtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIGJvb2xcbi8vIFF1ZXJ5IHdoZXRoZXIgYSBnaXZlbiBzZXJpYWxpemF0aW9uIGZvcm1hdCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuXG5mdW5jdGlvbiBrbm93blRhcmdldChmb3JtYXQpIHtcbiAgcmV0dXJuICEhc2VyaWFsaXplcnNbZm9ybWF0XTtcbn1cblxuLy8gOjogKHN0cmluZywgKE5vZGUsID9PYmplY3QpIOKGkiBhbnkpXG4vLyBSZWdpc3RlciBhIGZ1bmN0aW9uIGFzIHRoZSBzZXJpYWxpemVyIGZvciBgZm9ybWF0YC5cblxuZnVuY3Rpb24gZGVmaW5lVGFyZ2V0KGZvcm1hdCwgZnVuYykge1xuICBzZXJpYWxpemVyc1tmb3JtYXRdID0gZnVuYztcbn1cblxuZGVmaW5lVGFyZ2V0KFwianNvblwiLCBmdW5jdGlvbiAoZG9jKSB7XG4gIHJldHVybiBkb2MudG9KU09OKCk7XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudG9UZXh0ID0gdG9UZXh0O1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbl9tb2RlbC5CbG9jay5wcm90b3R5cGUuc2VyaWFsaXplVGV4dCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBhY2N1bSA9IFwiXCI7XG4gIG5vZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gYWNjdW0gKz0gY2hpbGQudHlwZS5zZXJpYWxpemVUZXh0KGNoaWxkKTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bTtcbn07XG5cbl9tb2RlbC5UZXh0YmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgdGV4dCA9IF9tb2RlbC5CbG9jay5wcm90b3R5cGUuc2VyaWFsaXplVGV4dChub2RlKTtcbiAgcmV0dXJuIHRleHQgJiYgdGV4dCArIFwiXFxuXFxuXCI7XG59O1xuXG5fbW9kZWwuSW5saW5lLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gXCJcIjtcbn07XG5cbl9tb2RlbC5IYXJkQnJlYWsucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBcIlxcblwiO1xufTtcblxuX21vZGVsLlRleHQucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gbm9kZS50ZXh0O1xufTtcblxuLy8gOjogKE5vZGUpIOKGkiBzdHJpbmdcbi8vIFNlcmlhbGl6ZSBhIG5vZGUgYXMgYSBwbGFpbiB0ZXh0IHN0cmluZy5cblxuZnVuY3Rpb24gdG9UZXh0KGRvYykge1xuICByZXR1cm4gZG9jLnR5cGUuc2VyaWFsaXplVGV4dChkb2MpLnRyaW0oKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwidGV4dFwiLCB0b1RleHQpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYW5MaWZ0ID0gY2FuTGlmdDtcbmV4cG9ydHMuY2FuV3JhcCA9IGNhbldyYXA7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuLy8gISEgKipgYW5jZXN0b3JgKipcbi8vICAgIDogQ2hhbmdlIHRoZSBzdGFjayBvZiBub2RlcyB0aGF0IHdyYXAgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4vLyAgICAgIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLCB3aGljaCBtdXN0IHBvaW50IGludG8gdGhlIHNhbWUgcGFyZW50XG4vLyAgICAgIG5vZGUuXG4vL1xuLy8gICAgICBUaGUgc2V0IG9mIGFuY2VzdG9ycyB0byByZXBsYWNlIGlzIGRldGVybWluZWQgYnkgdGhlIGBkZXB0aGBcbi8vICAgICAgcHJvcGVydHkgb2YgdGhlIHN0ZXAncyBwYXJhbWV0ZXIuIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuXG4vLyAgICAgIHplcm8sIGBmcm9tYCBhbmQgYHRvYCBtdXN0IHBvaW50IGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbi8vICAgICAgc3RhY2sgb2Ygbm9kZXMsIG9mIHRoYXQgZGVwdGgsIHNpbmNlIHRoaXMgc3RlcCB3aWxsIG5vdCBzcGxpdFxuLy8gICAgICBub2Rlcy5cbi8vXG4vLyAgICAgIFRoZSBzZXQgb2YgbmV3IGFuY2VzdG9ycyB0byB3cmFwIHdpdGggaXMgZGV0ZXJtaW5lZCBieSB0aGVcbi8vICAgICAgYHR5cGVzYCBhbmQgYGF0dHJzYCBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBmaXJzdFxuLy8gICAgICBzaG91bGQgYmUgYW4gYXJyYXkgb2YgYE5vZGVUeXBlYHMsIGFuZCB0aGUgc2Vjb25kLCBvcHRpb25hbGx5LFxuLy8gICAgICBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgb2JqZWN0cy5cblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJhbmNlc3RvclwiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICB2YXIgZnJvbSA9IHN0ZXAuZnJvbSxcbiAgICAgICAgdG8gPSBzdGVwLnRvO1xuICAgIGlmICghKDAsIF90cmVlLmlzRmxhdFJhbmdlKShmcm9tLCB0bykpIHJldHVybiBudWxsO1xuICAgIHZhciB0b1BhcmVudCA9IGZyb20ucGF0aCxcbiAgICAgICAgc3RhcnQgPSBmcm9tLm9mZnNldCxcbiAgICAgICAgZW5kID0gdG8ub2Zmc2V0O1xuICAgIHZhciBfc3RlcCRwYXJhbSA9IHN0ZXAucGFyYW07XG4gICAgdmFyIF9zdGVwJHBhcmFtJGRlcHRoID0gX3N0ZXAkcGFyYW0uZGVwdGg7XG4gICAgdmFyIGRlcHRoID0gX3N0ZXAkcGFyYW0kZGVwdGggPT09IHVuZGVmaW5lZCA/IDAgOiBfc3RlcCRwYXJhbSRkZXB0aDtcbiAgICB2YXIgX3N0ZXAkcGFyYW0kdHlwZXMgPSBfc3RlcCRwYXJhbS50eXBlcztcbiAgICB2YXIgdHlwZXMgPSBfc3RlcCRwYXJhbSR0eXBlcyA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RlcCRwYXJhbSR0eXBlcztcbiAgICB2YXIgX3N0ZXAkcGFyYW0kYXR0cnMgPSBfc3RlcCRwYXJhbS5hdHRycztcbiAgICB2YXIgYXR0cnMgPSBfc3RlcCRwYXJhbSRhdHRycyA9PT0gdW5kZWZpbmVkID8gW10gOiBfc3RlcCRwYXJhbSRhdHRycztcblxuICAgIHZhciBpbm5lciA9IGRvYy5wYXRoKGZyb20ucGF0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7XG4gICAgICBpZiAoc3RhcnQgPiAwIHx8IGVuZCA8IGRvYy5wYXRoKHRvUGFyZW50KS5zaXplIHx8IHRvUGFyZW50Lmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgIHN0YXJ0ID0gdG9QYXJlbnRbdG9QYXJlbnQubGVuZ3RoIC0gMV07XG4gICAgICBlbmQgPSBzdGFydCArIDE7XG4gICAgICB0b1BhcmVudCA9IHRvUGFyZW50LnNsaWNlKDAsIHRvUGFyZW50Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPT0gMCAmJiB0eXBlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgcGFyZW50ID0gZG9jLnBhdGgodG9QYXJlbnQpLFxuICAgICAgICBwYXJlbnRTaXplID0gcGFyZW50LnNpemUsXG4gICAgICAgIG5ld1BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50LnR5cGUubG9ja2VkKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodHlwZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBsYXN0V3JhcHBlciA9IHR5cGVzW3R5cGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgY29udGVudCA9IGlubmVyLmNvbnRlbnQuc2xpY2UoZnJvbS5vZmZzZXQsIHRvLm9mZnNldCk7XG4gICAgICAgIGlmICghcGFyZW50LnR5cGUuY2FuQ29udGFpblR5cGUodHlwZXNbMF0pIHx8IGNvbnRlbnQuc29tZShmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbGFzdFdyYXBwZXIuY2FuQ29udGFpbihuKTtcbiAgICAgICAgfSkgfHwgIWlubmVyLnNpemUgJiYgIWxhc3RXcmFwcGVyLmNhbkJlRW1wdHkgfHwgbGFzdFdyYXBwZXIubG9ja2VkKSByZXR1cm4ge1xuICAgICAgICAgICAgdjogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgIHZhciBub2RlID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IHR5cGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgbm9kZSA9IHR5cGVzW2ldLmNyZWF0ZShhdHRyc1tpXSwgbm9kZSB8fCBjb250ZW50KTtcbiAgICAgICAgfW5ld1BhcmVudCA9IHBhcmVudC5zcGxpY2Uoc3RhcnQsIGVuZCwgX21vZGVsLkZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgfSkoKTtcblxuICAgICAgaWYgKHR5cGVvZiBfcmV0ID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldC52O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBhcmVudC50eXBlLmNhbkNvbnRhaW5GcmFnbWVudChpbm5lci5jb250ZW50KSB8fCAhaW5uZXIuc2l6ZSAmJiBzdGFydCA9PSAwICYmIGVuZCA9PSBwYXJlbnQuc2l6ZSAmJiAhcGFyZW50LnR5cGUuY2FuQmVFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgICBuZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKHN0YXJ0LCBlbmQsIGlubmVyLmNvbnRlbnQpO1xuICAgIH1cbiAgICB2YXIgY29weSA9IGRvYy5yZXBsYWNlRGVlcCh0b1BhcmVudCwgbmV3UGFyZW50KTtcblxuICAgIHZhciB0b0lubmVyID0gdG9QYXJlbnQuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0b0lubmVyLnB1c2goaSA/IDAgOiBzdGFydCk7XG4gICAgfXZhciBzdGFydE9mSW5uZXIgPSBuZXcgX21vZGVsLlBvcyh0b0lubmVyLCB0eXBlcy5sZW5ndGggPyAwIDogc3RhcnQpO1xuICAgIHZhciByZXBsYWNlZCA9IG51bGw7XG4gICAgdmFyIGluc2VydGVkU2l6ZSA9IHR5cGVzLmxlbmd0aCA/IDEgOiB0by5vZmZzZXQgLSBmcm9tLm9mZnNldDtcbiAgICBpZiAoZGVwdGggIT0gdHlwZXMubGVuZ3RoIHx8IGRlcHRoID4gMSB8fCB0eXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgcG9zQmVmb3JlID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0KTtcbiAgICAgIHZhciBwb3NBZnRlcjEgPSBuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgZW5kKSxcbiAgICAgICAgICBwb3NBZnRlcjIgPSBuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgc3RhcnQgKyBpbnNlcnRlZFNpemUpO1xuICAgICAgdmFyIGVuZE9mSW5uZXIgPSBuZXcgX21vZGVsLlBvcyh0b0lubmVyLCBzdGFydE9mSW5uZXIub2Zmc2V0ICsgKHRvLm9mZnNldCAtIGZyb20ub2Zmc2V0KSk7XG4gICAgICByZXBsYWNlZCA9IFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHBvc0JlZm9yZSwgZnJvbSwgcG9zQmVmb3JlLCBzdGFydE9mSW5uZXIpLCBuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHRvLCBwb3NBZnRlcjEsIGVuZE9mSW5uZXIsIHBvc0FmdGVyMiwgcG9zQWZ0ZXIxLCBwb3NBZnRlcjIpXTtcbiAgICB9XG4gICAgdmFyIG1vdmVkID0gW25ldyBfbWFwLk1vdmVkUmFuZ2UoZnJvbSwgdG8ub2Zmc2V0IC0gZnJvbS5vZmZzZXQsIHN0YXJ0T2ZJbm5lcildO1xuICAgIGlmIChlbmQgLSBzdGFydCAhPSBpbnNlcnRlZFNpemUpIG1vdmVkLnB1c2gobmV3IF9tYXAuTW92ZWRSYW5nZShuZXcgX21vZGVsLlBvcyh0b1BhcmVudCwgZW5kKSwgcGFyZW50U2l6ZSAtIGVuZCwgbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0ICsgaW5zZXJ0ZWRTaXplKSkpO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChjb3B5LCBuZXcgX21hcC5Qb3NNYXAobW92ZWQsIHJlcGxhY2VkKSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIG9sZERvYywgbWFwKSB7XG4gICAgdmFyIHR5cGVzID0gW10sXG4gICAgICAgIGF0dHJzID0gW107XG4gICAgaWYgKHN0ZXAucGFyYW0uZGVwdGgpIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcC5wYXJhbS5kZXB0aDsgaSsrKSB7XG4gICAgICB2YXIgX3BhcmVudCA9IG9sZERvYy5wYXRoKHN0ZXAuZnJvbS5wYXRoLnNsaWNlKDAsIHN0ZXAuZnJvbS5wYXRoLmxlbmd0aCAtIGkpKTtcbiAgICAgIHR5cGVzLnVuc2hpZnQoX3BhcmVudC50eXBlKTtcbiAgICAgIGF0dHJzLnVuc2hpZnQoX3BhcmVudC5hdHRycyk7XG4gICAgfVxuICAgIHZhciBuZXdGcm9tID0gbWFwLm1hcChzdGVwLmZyb20pLnBvcztcbiAgICB2YXIgbmV3VG8gPSBzdGVwLmZyb20uY21wKHN0ZXAudG8pID8gbWFwLm1hcChzdGVwLnRvLCAtMSkucG9zIDogbmV3RnJvbTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJhbmNlc3RvclwiLCBuZXdGcm9tLCBuZXdUbywgbnVsbCwgeyBkZXB0aDogc3RlcC5wYXJhbS50eXBlcyA/IHN0ZXAucGFyYW0udHlwZXMubGVuZ3RoIDogMCxcbiAgICAgIHR5cGVzOiB0eXBlcywgYXR0cnM6IGF0dHJzIH0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4geyBkZXB0aDogcGFyYW0uZGVwdGgsXG4gICAgICB0eXBlczogcGFyYW0udHlwZXMgJiYgcGFyYW0udHlwZXMubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0Lm5hbWU7XG4gICAgICB9KSxcbiAgICAgIGF0dHJzOiBwYXJhbS5hdHRycyB9O1xuICB9LFxuICBwYXJhbUZyb21KU09OOiBmdW5jdGlvbiBwYXJhbUZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgIHJldHVybiB7IGRlcHRoOiBqc29uLmRlcHRoLFxuICAgICAgdHlwZXM6IGpzb24udHlwZXMgJiYganNvbi50eXBlcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5ub2RlVHlwZShuKTtcbiAgICAgIH0pLFxuICAgICAgYXR0cnM6IGpzb24uYXR0cnMgfTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNhbkJlTGlmdGVkKGRvYywgcmFuZ2UpIHtcbiAgdmFyIGNvbnRlbnQgPSBbZG9jLnBhdGgocmFuZ2UuZnJvbS5wYXRoKV0sXG4gICAgICB1bndyYXAgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwYXJlbnREZXB0aCA9IC0xO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gKF9ub2RlLCBpKSB7XG4gICAgICBpZiAoIWNvbnRlbnQuc29tZShmdW5jdGlvbiAoaW5uZXIpIHtcbiAgICAgICAgcmV0dXJuICFfbm9kZS50eXBlLmNhbkNvbnRhaW5Db250ZW50KGlubmVyLnR5cGUpO1xuICAgICAgfSkpIHBhcmVudERlcHRoID0gaTtcbiAgICAgIF9ub2RlID0gX25vZGUuY2hpbGQocmFuZ2UuZnJvbS5wYXRoW2ldKTtcbiAgICAgIG5vZGUgPSBfbm9kZTtcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgbm9kZSA9IGRvYywgaSA9IDA7IGkgPCByYW5nZS5mcm9tLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9sb29wKG5vZGUsIGkpO1xuICAgIH1cbiAgICBpZiAocGFyZW50RGVwdGggPiAtMSkgcmV0dXJuIHsgcGF0aDogcmFuZ2UuZnJvbS5wYXRoLnNsaWNlKDAsIHBhcmVudERlcHRoKSwgdW53cmFwOiB1bndyYXAgfTtcbiAgICBpZiAodW53cmFwIHx8ICFjb250ZW50WzBdLmlzQmxvY2spIHJldHVybiBudWxsO1xuICAgIGNvbnRlbnQgPSBjb250ZW50WzBdLmNvbnRlbnQuc2xpY2UocmFuZ2UuZnJvbS5vZmZzZXQsIHJhbmdlLnRvLm9mZnNldCk7XG4gICAgdW53cmFwID0gdHJ1ZTtcbiAgfVxufVxuXG4vLyA6OiAoTm9kZSwgUG9zLCA/UG9zKSDihpIgYm9vbFxuLy8gVGVsbHMgeW91IHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9ucycgW3NpYmxpbmdcbi8vIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpLCBvciBhbnkgb2YgaXRzIGFuY2VzdG9yIG5vZGVzLCBjYW4gYmVcbi8vIGxpZnRlZCBvdXQgb2YgYSBwYXJlbnQuXG5cbmZ1bmN0aW9uIGNhbkxpZnQoZG9jLCBmcm9tLCB0bykge1xuICB2YXIgcmFuZ2UgPSBkb2Muc2libGluZ1JhbmdlKGZyb20sIHRvIHx8IGZyb20pO1xuICB2YXIgZm91bmQgPSBjYW5CZUxpZnRlZChkb2MsIHJhbmdlKTtcbiAgaWYgKGZvdW5kKSByZXR1cm4geyBmb3VuZDogZm91bmQsIHJhbmdlOiByYW5nZSB9O1xufVxuXG4vLyA6OiAoUG9zLCA/UG9zKSDihpIgVHJhbnNmb3JtXG4vLyBMaWZ0IHRoZSBuZWFyZXN0IGxpZnRhYmxlIGFuY2VzdG9yIG9mIHRoZSBbc2libGluZ1xuLy8gcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlIGdpdmVuIHBvc2l0aW9ucyBvdXQgb2YgaXRzXG4vLyBwYXJlbnQgKG9yIGRvIG5vdGhpbmcgaWYgbm8gc3VjaCBub2RlIGV4aXN0cykuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uIChmcm9tKSB7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGZyb20gOiBhcmd1bWVudHNbMV07XG4gIHJldHVybiAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW4gPSBjYW5MaWZ0KHRoaXMuZG9jLCBmcm9tLCB0byk7XG4gICAgaWYgKCFjYW4pIHJldHVybiB0aGlzO1xuICAgIHZhciBmb3VuZCA9IGNhbi5mb3VuZDtcbiAgICB2YXIgcmFuZ2UgPSBjYW4ucmFuZ2U7XG5cbiAgICB2YXIgZGVwdGggPSByYW5nZS5mcm9tLnBhdGgubGVuZ3RoIC0gZm91bmQucGF0aC5sZW5ndGg7XG4gICAgdmFyIHJhbmdlTm9kZSA9IGZvdW5kLnVud3JhcCAmJiB0aGlzLmRvYy5wYXRoKHJhbmdlLmZyb20ucGF0aCk7XG5cbiAgICBmb3IgKHZhciBkID0gMCwgcG9zID0gcmFuZ2UudG87OyBkKyspIHtcbiAgICAgIGlmIChwb3Mub2Zmc2V0IDwgdGhpcy5kb2MucGF0aChwb3MucGF0aCkuc2l6ZSkge1xuICAgICAgICB0aGlzLnNwbGl0KHBvcywgZGVwdGggLSBkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZCA9PSBkZXB0aCAtIDEpIGJyZWFrO1xuICAgICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgMSk7XG4gICAgfVxuICAgIGZvciAodmFyIGQgPSAwLCBwb3MgPSByYW5nZS5mcm9tOzsgZCsrKSB7XG4gICAgICBpZiAocG9zLm9mZnNldCA+IDApIHtcbiAgICAgICAgdGhpcy5zcGxpdChwb3MsIGRlcHRoIC0gZCk7XG4gICAgICAgIHZhciBjdXQgPSByYW5nZS5mcm9tLnBhdGgubGVuZ3RoIC0gZGVwdGgsXG4gICAgICAgICAgICBwYXRoID0gcG9zLnBhdGguc2xpY2UoMCwgY3V0KS5jb25jYXQocG9zLnBhdGhbY3V0XSArIDEpO1xuICAgICAgICB3aGlsZSAocGF0aC5sZW5ndGggPCByYW5nZS5mcm9tLnBhdGgubGVuZ3RoKSBwYXRoLnB1c2goMCk7XG4gICAgICAgIHJhbmdlID0geyBmcm9tOiBuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHJhbmdlLnRvLm9mZnNldCAtIHJhbmdlLmZyb20ub2Zmc2V0KSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChkID09IGRlcHRoIC0gMSkgYnJlYWs7XG4gICAgICBwb3MgPSBwb3Muc2hvcnRlbigpO1xuICAgIH1cbiAgICBpZiAoZm91bmQudW53cmFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gcmFuZ2UudG8ub2Zmc2V0IC0gMTsgaSA+IHJhbmdlLmZyb20ub2Zmc2V0OyBpLS0pIHtcbiAgICAgICAgdGhpcy5qb2luKG5ldyBfbW9kZWwuUG9zKHJhbmdlLmZyb20ucGF0aCwgaSkpO1xuICAgICAgfXZhciBzaXplID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSByYW5nZU5vZGUuaXRlcihyYW5nZS5mcm9tLm9mZnNldCwgcmFuZ2UudG8ub2Zmc2V0KSwgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gaS5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHNpemUgKz0gY2hpbGQuc2l6ZTtcbiAgICAgIH12YXIgcGF0aCA9IHJhbmdlLmZyb20ucGF0aC5jb25jYXQocmFuZ2UuZnJvbS5vZmZzZXQpO1xuICAgICAgcmFuZ2UgPSB7IGZyb206IG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCB0bzogbmV3IF9tb2RlbC5Qb3MocGF0aCwgc2l6ZSkgfTtcbiAgICAgICsrZGVwdGg7XG4gICAgfVxuICAgIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIHJhbmdlLmZyb20sIHJhbmdlLnRvLCBudWxsLCB7IGRlcHRoOiBkZXB0aCB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbi8vIDo6IChOb2RlLCBQb3MsID9Qb3MsIE5vZGVUeXBlKSDihpIgYm9vbFxuLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBbc2libGluZyByYW5nZV0oI05vZGUuc2libGluZ1JhbmdlKSBvZiB0aGVcbi8vIGdpdmVuIHBvc2l0aW9ucyBjYW4gYmUgd3JhcHBlZCBpbiB0aGUgZ2l2ZW4gbm9kZSB0eXBlLlxuXG5mdW5jdGlvbiBjYW5XcmFwKGRvYywgZnJvbSwgdG8sIHR5cGUpIHtcbiAgdmFyIHJhbmdlID0gZG9jLnNpYmxpbmdSYW5nZShmcm9tLCB0byB8fCBmcm9tKTtcbiAgaWYgKHJhbmdlLmZyb20ub2Zmc2V0ID09IHJhbmdlLnRvLm9mZnNldCkgcmV0dXJuIG51bGw7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChyYW5nZS5mcm9tLnBhdGgpO1xuICB2YXIgYXJvdW5kID0gcGFyZW50LnR5cGUuZmluZENvbm5lY3Rpb24odHlwZSk7XG4gIHZhciBpbnNpZGUgPSB0eXBlLmZpbmRDb25uZWN0aW9uKHBhcmVudC5jaGlsZChyYW5nZS5mcm9tLm9mZnNldCkudHlwZSk7XG4gIGlmIChhcm91bmQgJiYgaW5zaWRlKSByZXR1cm4geyByYW5nZTogcmFuZ2UsIGFyb3VuZDogYXJvdW5kLCBpbnNpZGU6IGluc2lkZSB9O1xufVxuXG4vLyA6OiAoUG9zLCA/UG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gV3JhcCB0aGUgW3NpYmxpbmcgcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlIGdpdmVuIHBvc2l0aW9uc1xuLy8gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIChpZlxuLy8gcG9zc2libGUpLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHR5cGUsIHdyYXBBdHRycykge1xuICB2YXIgY2FuID0gY2FuV3JhcCh0aGlzLmRvYywgZnJvbSwgdG8sIHR5cGUpO1xuICBpZiAoIWNhbikgcmV0dXJuIHRoaXM7XG4gIHZhciByYW5nZSA9IGNhbi5yYW5nZTtcbiAgdmFyIGFyb3VuZCA9IGNhbi5hcm91bmQ7XG4gIHZhciBpbnNpZGUgPSBjYW4uaW5zaWRlO1xuXG4gIHZhciB0eXBlcyA9IGFyb3VuZC5jb25jYXQodHlwZSkuY29uY2F0KGluc2lkZSk7XG4gIHZhciBhdHRycyA9IGFyb3VuZC5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9KS5jb25jYXQod3JhcEF0dHJzKS5jb25jYXQoaW5zaWRlLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pKTtcbiAgdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgcmFuZ2UuZnJvbSwgcmFuZ2UudG8sIG51bGwsIHsgdHlwZXM6IHR5cGVzLCBhdHRyczogYXR0cnMgfSk7XG4gIGlmIChpbnNpZGUubGVuZ3RoKSB7XG4gICAgdmFyIHRvSW5uZXIgPSByYW5nZS5mcm9tLnBhdGguc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyb3VuZC5sZW5ndGggKyBpbnNpZGUubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICB0b0lubmVyLnB1c2goaSA/IDAgOiByYW5nZS5mcm9tLm9mZnNldCk7XG4gICAgfWZvciAodmFyIGkgPSByYW5nZS50by5vZmZzZXQgLSAxIC0gcmFuZ2UuZnJvbS5vZmZzZXQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHRoaXMuc3BsaXQobmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgaSksIGluc2lkZS5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsID9Qb3MsIE5vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbi8vIHRoZSBnaXZlbiBub2RlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zZXRCbG9ja1R5cGUgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHR5cGUsIGF0dHJzKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvIHx8IGZyb20sIGZ1bmN0aW9uIChub2RlLCBwYXRoKSB7XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUuaGFzTWFya3VwKHR5cGUsIGF0dHJzKSkge1xuICAgICAgcGF0aCA9IHBhdGguc2xpY2UoKTtcbiAgICAgIC8vIEVuc3VyZSBhbGwgbWFya3VwIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgbmV3IG5vZGUgdHlwZSBpcyBjbGVhcmVkXG4gICAgICBfdGhpcy5jbGVhck1hcmt1cChuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgbm9kZS5zaXplKSwgdHlwZSk7XG4gICAgICBfdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIF90aGlzLmRvYy5wYXRoKHBhdGgpLnNpemUpLCBudWxsLCB7IGRlcHRoOiAxLCB0eXBlczogW3R5cGVdLCBhdHRyczogW2F0dHJzXSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIE5vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBDaGFuZ2UgdGhlIHR5cGUgYW5kIGF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUgYWZ0ZXIgYHBvc2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc2V0Tm9kZVR5cGUgPSBmdW5jdGlvbiAocG9zLCB0eXBlLCBhdHRycykge1xuICB2YXIgbm9kZSA9IHRoaXMuZG9jLm5vZGVBZnRlcihwb3MpO1xuICB2YXIgcGF0aCA9IHBvcy50b1BhdGgoKTtcbiAgdGhpcy5zdGVwKFwiYW5jZXN0b3JcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIG5vZGUuc2l6ZSksIG51bGwsIHsgZGVwdGg6IDEsIHR5cGVzOiBbdHlwZV0sIGF0dHJzOiBbYXR0cnNdIH0pO1xuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnJlcXVpcmUoXCIuL21hcmtcIik7XG5cbnJlcXVpcmUoXCIuL3NwbGl0XCIpO1xuXG5yZXF1aXJlKFwiLi9yZXBsYWNlXCIpO1xuXG4vLyAhISBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgd2F5IHRvIHRyYW5zZm9ybSBkb2N1bWVudHMuIFRyYW5zZm9ybWluZ1xuLy8gaGFwcGVucyBpbiBgU3RlcGBzLCB3aGljaCBhcmUgYXRvbWljLCB3ZWxsLWRlZmluZWQgbW9kaWZpY2F0aW9ucyB0b1xuLy8gYSBkb2N1bWVudC4gW0FwcGx5aW5nXShgU3RlcC5hcHBseWApIGEgc3RlcCBwcm9kdWNlcyBhIG5ldyBkb2N1bWVudFxuLy8gYW5kIGEgW3Bvc2l0aW9uIG1hcF0oI1Bvc01hcCkgdGhhdCBtYXBzIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4vLyBkb2N1bWVudCB0byBwb3NpdGlvbiBpbiB0aGUgbmV3IGRvY3VtZW50LiBTdGVwcyBjYW4gYmVcbi8vIFtpbnZlcnRlZF0oI1N0ZXAuaW52ZXJ0KSB0byBjcmVhdGUgYSBzdGVwIHRoYXQgdW5kb2VzIHRoZWlyIGVmZmVjdCxcbi8vIGFuZCBjaGFpbmVkIHRvZ2V0aGVyIGluIGEgY29udmVuaWVuY2Ugb2JqZWN0IGNhbGxlZCBhIGBUcmFuc2Zvcm1gLlxuLy9cbi8vIFRoaXMgbW9kdWxlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgYnJvd3NlciBBUEkgYmVpbmcgYXZhaWxhYmxlXG4vLyAoaS5lLiB5b3UgY2FuIGxvYWQgaXQgaW50byBhbnkgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCkuXG4vL1xuLy8gVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBzdGVwcyBkZWZpbmVkOlxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYW5zZm9ybVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdHJhbnNmb3JtLlRyYW5zZm9ybTtcbiAgfVxufSk7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlN0ZXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3N0ZXAuU3RlcDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwUmVzdWx0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdGVwLlN0ZXBSZXN1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX2FuY2VzdG9yID0gcmVxdWlyZShcIi4vYW5jZXN0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNhbkxpZnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FuY2VzdG9yLmNhbkxpZnQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY2FuV3JhcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfYW5jZXN0b3IuY2FuV3JhcDtcbiAgfVxufSk7XG5cbnZhciBfam9pbiA9IHJlcXVpcmUoXCIuL2pvaW5cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImpvaW5Qb2ludFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfam9pbi5qb2luUG9pbnQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiam9pbmFibGVCbG9ja3NcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pvaW4uam9pbmFibGVCbG9ja3M7XG4gIH1cbn0pO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUG9zTWFwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYXAuUG9zTWFwO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcFJlc3VsdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWFwLk1hcFJlc3VsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZW1hcHBpbmdcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21hcC5SZW1hcHBpbmc7XG4gIH1cbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5qb2luYWJsZUJsb2NrcyA9IGpvaW5hYmxlQmxvY2tzO1xuZXhwb3J0cy5qb2luUG9pbnQgPSBqb2luUG9pbnQ7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX21hcCA9IHJlcXVpcmUoXCIuL21hcFwiKTtcblxuLy8gISEgKipgam9pbmAqKlxuLy8gICA6IEpvaW4gdHdvIGJsb2NrIGVsZW1lbnRzIHRvZ2V0aGVyLiBgZnJvbWAgYW5kIGB0b2AgbXVzdCBwb2ludCBhdFxuLy8gICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGFuZCBzdGFydCBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgKHNvIHRoYXRcbi8vICAgICB0aGUgaW50ZW50aW9uIGlzIHByZXNlcnZlZCBldmVuIHdoZW4gdGhlIHBvc2l0aW9ucyBhcmUgbWFwcGVkKS5cblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJqb2luXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciBiZWZvcmUgPSBkb2MucGF0aChzdGVwLmZyb20ucGF0aCk7XG4gICAgdmFyIGFmdGVyID0gZG9jLnBhdGgoc3RlcC50by5wYXRoKTtcbiAgICBpZiAoc3RlcC5mcm9tLm9mZnNldCA8IGJlZm9yZS5zaXplIHx8IHN0ZXAudG8ub2Zmc2V0ID4gMCB8fCAhYmVmb3JlLnR5cGUuY2FuQ29udGFpbkZyYWdtZW50KGFmdGVyLmNvbnRlbnQpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcEZyb20gPSBzdGVwLmZyb20ucGF0aCxcbiAgICAgICAgcFRvID0gc3RlcC50by5wYXRoO1xuICAgIHZhciBsYXN0ID0gcEZyb20ubGVuZ3RoIC0gMSxcbiAgICAgICAgb2Zmc2V0ID0gcEZyb21bbGFzdF0gKyAxO1xuICAgIGlmIChwRnJvbS5sZW5ndGggIT0gcFRvLmxlbmd0aCB8fCBwRnJvbS5sZW5ndGggPT0gMCB8fCBvZmZzZXQgIT0gcFRvW2xhc3RdKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgaWYgKHBGcm9tW2ldICE9IHBUb1tpXSkgcmV0dXJuIG51bGw7XG4gICAgfXZhciB0YXJnZXRQYXRoID0gcEZyb20uc2xpY2UoMCwgbGFzdCk7XG4gICAgdmFyIHRhcmdldCA9IGRvYy5wYXRoKHRhcmdldFBhdGgpLFxuICAgICAgICBvbGRTaXplID0gdGFyZ2V0LnNpemU7XG4gICAgaWYgKHRhcmdldC50eXBlLmxvY2tlZCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGpvaW5lZCA9IGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCk7XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAodGFyZ2V0UGF0aCwgdGFyZ2V0LnNwbGljZShvZmZzZXQgLSAxLCBvZmZzZXQgKyAxLCBfbW9kZWwuRnJhZ21lbnQuZnJvbShqb2luZWQpKSk7XG5cbiAgICB2YXIgbWFwID0gbmV3IF9tYXAuUG9zTWFwKFtuZXcgX21hcC5Nb3ZlZFJhbmdlKHN0ZXAudG8sIGFmdGVyLnNpemUsIHN0ZXAuZnJvbSksIG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3ModGFyZ2V0UGF0aCwgb2Zmc2V0ICsgMSksIG9sZFNpemUgLSBvZmZzZXQgLSAxLCBuZXcgX21vZGVsLlBvcyh0YXJnZXRQYXRoLCBvZmZzZXQpKV0sIFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHN0ZXAuZnJvbSwgc3RlcC50bywgc3RlcC5mcm9tLCBzdGVwLmZyb20sIHN0ZXAudG8uc2hvcnRlbigpKV0pO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChjb3B5LCBtYXApO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MpIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJzcGxpdFwiLCBudWxsLCBudWxsLCBzdGVwLmZyb20sIG9sZERvYy5wYXRoKHN0ZXAudG8ucGF0aCkuY29weSgpKTtcbiAgfVxufSk7XG5cbi8vIDo6IChOb2RlLCBQb3MpIOKGkiBib29sXG4vLyBUZXN0IHdoZXRoZXIgdGhlIGJsb2NrcyBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gY2FuIGJlXG4vLyBqb2luZWQuXG5cbmZ1bmN0aW9uIGpvaW5hYmxlQmxvY2tzKGRvYywgcG9zKSB7XG4gIGlmIChwb3Mub2Zmc2V0ID09IDApIHJldHVybiBmYWxzZTtcbiAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBvcy5wYXRoKTtcbiAgaWYgKHBhcmVudC5pc1RleHRibG9jayB8fCBwb3Mub2Zmc2V0ID09IHBhcmVudC5zaXplKSByZXR1cm4gZmFsc2U7XG4gIHZhciB0eXBlID0gcGFyZW50LmNoaWxkKHBvcy5vZmZzZXQgLSAxKS50eXBlO1xuICByZXR1cm4gIXR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5jb250YWlucyAmJiB0eXBlID09IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0KS50eXBlO1xufVxuXG4vLyA6OiAoTm9kZSwgUG9zLCA/bnVtYmVyKSDihpIgP1Bvc1xuLy8gRmluZCBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gdGhhdCBjYW4gYmUgam9pbmVkIHRvIHRoZVxuLy8gYmxvY2sgYmVmb3JlIChvciBhZnRlciBpZiBgZGlyYCBpcyBwb3NpdGl2ZSkuIFJldHVybnMgdGhlIGpvaW5hYmxlXG4vLyBwb2ludCwgaWYgYW55LlxuXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MpIHtcbiAgdmFyIGRpciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IC0xIDogYXJndW1lbnRzWzJdO1xuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoam9pbmFibGVCbG9ja3MoZG9jLCBwb3MpKSByZXR1cm4gcG9zO1xuICAgIGlmIChwb3MuZGVwdGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgZGlyIDwgMCA/IDAgOiAxKTtcbiAgfVxufVxuXG4vLyA6OiAoUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gKGF0KSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLmRvYy5wYXRoKGF0LnBhdGgpO1xuICBpZiAoYXQub2Zmc2V0ID09IDAgfHwgYXQub2Zmc2V0ID09IHBhcmVudC5zaXplIHx8IHBhcmVudC5pc1RleHRibG9jaykgcmV0dXJuIHRoaXM7XG4gIHRoaXMuc3RlcChcImpvaW5cIiwgbmV3IF9tb2RlbC5Qb3MoYXQucGF0aC5jb25jYXQoYXQub2Zmc2V0IC0gMSksIHBhcmVudC5jaGlsZChhdC5vZmZzZXQgLSAxKS5zaXplKSwgbmV3IF9tb2RlbC5Qb3MoYXQucGF0aC5jb25jYXQoYXQub2Zmc2V0KSwgMCkpO1xuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxuLy8gOzsgI2tpbmQ9aW50ZXJmYWNlICNwYXRoPU1hcHBhYmxlICN0b2M9ZmFsc2Vcbi8vIFRoZXJlIGFyZSB2YXJpb3VzIHRoaW5ncyB0aGF0IHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkIHRocm91Z2guXG4vLyBXZSdsbCBkZW5vdGUgdGhvc2UgYXMgJ21hcHBhYmxlJy4gVGhpcyBpcyBub3QgYW4gYWN0dWFsIGNsYXNzIGluXG4vLyB0aGUgY29kZWJhc2UsIG9ubHkgYW4gYWdyZWVkLW9uIGludGVyZmFjZS5cblxuLy8gOjogKHBvczogUG9zLCBiaWFzOiA/bnVtYmVyKSDihpIgTWFwUmVzdWx0XG4vLyAjcGF0aD1NYXBwYWJsZS5tYXBcbi8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBvYmplY3QuIFdoZW4gZ2l2ZW4sIHRoZSBgYmlhc2Bcbi8vIGRldGVybWluZXMgaW4gd2hpY2ggZGlyZWN0aW9uIHRvIG1vdmUgd2hlbiBhIGNodW5rIG9mIGNvbnRlbnQgaXNcbi8vIGluc2VydGVkIGF0IG9yIGFyb3VuZCB0aGUgbWFwcGVkIHBvc2l0aW9uLlxuXG52YXIgTW92ZWRSYW5nZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1vdmVkUmFuZ2Uoc3RhcnQsIHNpemUpIHtcbiAgICB2YXIgZGVzdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMl07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTW92ZWRSYW5nZSk7XG5cbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICB0aGlzLmRlc3QgPSBkZXN0O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1vdmVkUmFuZ2UsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiW21vdmVkIFwiICsgdGhpcy5zdGFydCArIFwiK1wiICsgdGhpcy5zaXplICsgXCIgdG8gXCIgKyB0aGlzLmRlc3QgKyBcIl1cIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbmV3IF9tb2RlbC5Qb3ModGhpcy5zdGFydC5wYXRoLCB0aGlzLnN0YXJ0Lm9mZnNldCArIHRoaXMuc2l6ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vdmVkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLk1vdmVkUmFuZ2UgPSBNb3ZlZFJhbmdlO1xuXG52YXIgU2lkZSA9IGZ1bmN0aW9uIFNpZGUoZnJvbSwgdG8sIHJlZikge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2lkZSk7XG5cbiAgdGhpcy5mcm9tID0gZnJvbTtcbiAgdGhpcy50byA9IHRvO1xuICB0aGlzLnJlZiA9IHJlZjtcbn07XG5cbnZhciBSZXBsYWNlZFJhbmdlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVwbGFjZWRSYW5nZShmcm9tLCB0bywgbmV3RnJvbSwgbmV3VG8pIHtcbiAgICB2YXIgcmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gZnJvbSA6IGFyZ3VtZW50c1s0XTtcbiAgICB2YXIgbmV3UmVmID0gYXJndW1lbnRzLmxlbmd0aCA8PSA1IHx8IGFyZ3VtZW50c1s1XSA9PT0gdW5kZWZpbmVkID8gbmV3RnJvbSA6IGFyZ3VtZW50c1s1XTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXBsYWNlZFJhbmdlKTtcblxuICAgICAgdGhpcy5iZWZvcmUgPSBuZXcgU2lkZShmcm9tLCB0bywgcmVmKTtcbiAgICAgIHRoaXMuYWZ0ZXIgPSBuZXcgU2lkZShuZXdGcm9tLCBuZXdUbywgbmV3UmVmKTtcbiAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlcGxhY2VkUmFuZ2UsIFt7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiW3JlcGxhY2VkIFwiICsgdGhpcy5iZWZvcmUuZnJvbSArIFwiLVwiICsgdGhpcy5iZWZvcmUudG8gKyBcIiB3aXRoIFwiICsgdGhpcy5hZnRlci5mcm9tICsgXCItXCIgKyB0aGlzLmFmdGVyLnRvICsgXCJdXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlcGxhY2VkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLlJlcGxhY2VkUmFuZ2UgPSBSZXBsYWNlZFJhbmdlO1xuXG52YXIgZW1wdHkgPSBbXTtcblxuZnVuY3Rpb24gb2Zmc2V0RnJvbShiYXNlLCBwb3MpIHtcbiAgaWYgKHBvcy5wYXRoLmxlbmd0aCA+IGJhc2UucGF0aC5sZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IFtwb3MucGF0aFtiYXNlLnBhdGgubGVuZ3RoXSAtIGJhc2Uub2Zmc2V0XTtcbiAgICBmb3IgKHZhciBpID0gYmFzZS5wYXRoLmxlbmd0aCArIDE7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgcGF0aC5wdXNoKHBvcy5wYXRoW2ldKTtcbiAgICB9cmV0dXJuIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHBvcy5vZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgX21vZGVsLlBvcyhbXSwgcG9zLm9mZnNldCAtIGJhc2Uub2Zmc2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBUaHJvdWdoKG1hcCwgcG9zLCBiaWFzLCBiYWNrKSB7XG4gIGlmIChiaWFzID09PSB1bmRlZmluZWQpIGJpYXMgPSAxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLnJlcGxhY2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gbWFwLnJlcGxhY2VkW2ldLFxuICAgICAgICBzaWRlID0gYmFjayA/IHJhbmdlLmFmdGVyIDogcmFuZ2UuYmVmb3JlO1xuICAgIHZhciBsZWZ0ID0gdW5kZWZpbmVkLFxuICAgICAgICByaWdodCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoKGxlZnQgPSBwb3MuY21wKHNpZGUuZnJvbSkpID49IDAgJiYgKHJpZ2h0ID0gcG9zLmNtcChzaWRlLnRvKSkgPD0gMCkge1xuICAgICAgdmFyIG90aGVyID0gYmFjayA/IHJhbmdlLmJlZm9yZSA6IHJhbmdlLmFmdGVyO1xuICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQoYmlhcyA8IDAgPyBvdGhlci5mcm9tIDogb3RoZXIudG8sICEhKGxlZnQgJiYgcmlnaHQpLCB7IHJhbmdlSUQ6IGksIG9mZnNldDogb2Zmc2V0RnJvbShzaWRlLnJlZiwgcG9zKSB9KTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5tb3ZlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciByYW5nZSA9IG1hcC5tb3ZlZFtpXTtcbiAgICB2YXIgc3RhcnQgPSBiYWNrID8gcmFuZ2UuZGVzdCA6IHJhbmdlLnN0YXJ0O1xuICAgIGlmIChwb3MuY21wKHN0YXJ0KSA+PSAwICYmIF9tb2RlbC5Qb3MuY21wKHBvcy5wYXRoLCBwb3Mub2Zmc2V0LCBzdGFydC5wYXRoLCBzdGFydC5vZmZzZXQgKyByYW5nZS5zaXplKSA8PSAwKSB7XG4gICAgICB2YXIgZGVzdCA9IGJhY2sgPyByYW5nZS5zdGFydCA6IHJhbmdlLmRlc3Q7XG4gICAgICB2YXIgZGVwdGggPSBzdGFydC5kZXB0aDtcbiAgICAgIGlmIChwb3MuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gZGVzdC5vZmZzZXQgKyAocG9zLnBhdGhbZGVwdGhdIC0gc3RhcnQub2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQobmV3IF9tb2RlbC5Qb3MoZGVzdC5wYXRoLmNvbmNhdChvZmZzZXQpLmNvbmNhdChwb3MucGF0aC5zbGljZShkZXB0aCArIDEpKSwgcG9zLm9mZnNldCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQobmV3IF9tb2RlbC5Qb3MoZGVzdC5wYXRoLCBkZXN0Lm9mZnNldCArIChwb3Mub2Zmc2V0IC0gc3RhcnQub2Zmc2V0KSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTWFwUmVzdWx0KHBvcyk7XG59XG5cbi8vIDs7IEEgcG9zaXRpb24gbWFwLCBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YXkgcG9zaXRpb25zIGluXG4vLyB0aGUgcHJlLXN0ZXAgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGNvcnJlc3BvbmQgdG8gcG9zaXRpb25zIGluIHRoZVxuLy8gcG9zdC1zdGVwIHZlcnNpb24uIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBgTWFwcGFibGVgLlxuXG52YXIgUG9zTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9zTWFwKG1vdmVkLCByZXBsYWNlZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3NNYXApO1xuXG4gICAgdGhpcy5tb3ZlZCA9IG1vdmVkIHx8IGVtcHR5O1xuICAgIHRoaXMucmVwbGFjZWQgPSByZXBsYWNlZCB8fCBlbXB0eTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIHJldHVybiB2YWx1ZSBvZiBtYXBwaW5nIGEgcG9zaXRpb24uXG5cbiAgX2NyZWF0ZUNsYXNzKFBvc01hcCwgW3tcbiAgICBrZXk6IFwicmVjb3ZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWNvdmVyKG9mZnNldCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZWRbb2Zmc2V0LnJhbmdlSURdLmFmdGVyLnJlZi5leHRlbmQob2Zmc2V0Lm9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCB0aGUgZ2l2ZW4gcG9zaXRpb24gdGhyb3VnaCB0aGlzIG1hcC4gVGhlIGBiaWFzYCBwYXJhbWV0ZXIgY2FuXG4gICAgLy8gYmUgdXNlZCB0byBjb250cm9sIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB0cmFuc2Zvcm0gaW5zZXJ0ZWRcbiAgICAvLyBjb250ZW50IGF0IChvciBhcm91bmQpIHRoaXMgcG9zaXRpb27igJRpZiBgYmlhc2AgaXMgbmVnYXRpdmUsIHRoZSBhXG4gICAgLy8gcG9zaXRpb24gYmVmb3JlIHRoZSBpbnNlcnRlZCBjb250ZW50IHdpbGwgYmUgcmV0dXJuZWQsIGlmIGl0IGlzXG4gICAgLy8gcG9zaXRpdmUsIGEgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGlvbiBpcyByZXR1cm5lZC5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKHBvcywgYmlhcykge1xuICAgICAgcmV0dXJuIG1hcFRocm91Z2godGhpcywgcG9zLCBiaWFzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIFBvc01hcFxuICAgIC8vIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFwLiBUaGUgcmVzdWx0IGNhbiBiZSB1c2VkIHRvXG4gICAgLy8gbWFwIHBvc2l0aW9ucyBpbiB0aGUgcG9zdC1zdGVwIGRvY3VtZW50IHRvIHRoZSBwcmUtc3RlcCBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJ0KCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnZlcnRlZFBvc01hcCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb3ZlZC5jb25jYXQodGhpcy5yZXBsYWNlZCkuam9pbihcIiBcIik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvc01hcDtcbn0pKCk7XG5cbmV4cG9ydHMuUG9zTWFwID0gUG9zTWFwO1xuXG52YXIgTWFwUmVzdWx0ID0gZnVuY3Rpb24gTWFwUmVzdWx0KHBvcykge1xuICB2YXIgZGVsZXRlZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXJndW1lbnRzWzFdO1xuICB2YXIgcmVjb3ZlciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMl07XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcFJlc3VsdCk7XG5cbiAgLy8gOjogUG9zIFRoZSBtYXBwZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24uXG4gIHRoaXMucG9zID0gcG9zO1xuICAvLyA6OiBib29sIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBwb3NpdGlvbiB3YXMgZGVsZXRlZCwgdGhhdCBpcyxcbiAgLy8gd2hldGhlciB0aGUgc3RlcCByZW1vdmVkIGl0cyBzdXJyb3VuZGluZ3MgZnJvbSB0aGUgZG9jdW1lbnQuXG4gIHRoaXMuZGVsZXRlZCA9IGRlbGV0ZWQ7XG4gIHRoaXMucmVjb3ZlciA9IHJlY292ZXI7XG59O1xuXG5leHBvcnRzLk1hcFJlc3VsdCA9IE1hcFJlc3VsdDtcblxudmFyIEludmVydGVkUG9zTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSW52ZXJ0ZWRQb3NNYXAobWFwKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludmVydGVkUG9zTWFwKTtcblxuICAgIHRoaXMuaW5uZXIgPSBtYXA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW52ZXJ0ZWRQb3NNYXAsIFt7XG4gICAga2V5OiBcInJlY292ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3ZlcihvZmZzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlubmVyLnJlcGxhY2VkW29mZnNldC5yYW5nZUlEXS5iZWZvcmUucmVmLmV4dGVuZChvZmZzZXQub2Zmc2V0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHJldHVybiBtYXBUaHJvdWdoKHRoaXMuaW5uZXIsIHBvcywgYmlhcywgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludmVydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZlcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gXCItXCIgKyB0aGlzLmlubmVyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbnZlcnRlZFBvc01hcDtcbn0pKCk7XG5cbnZhciBudWxsTWFwID0gbmV3IFBvc01hcCgpO1xuXG5leHBvcnRzLm51bGxNYXAgPSBudWxsTWFwO1xuLy8gOzsgQSByZW1hcHBpbmcgcmVwcmVzZW50cyBhIHBpcGVsaW5lIG9mIHplcm8gb3IgbW9yZSBtYXBwaW5ncy4gSXRcbi8vIGlzIGEgc3BlY2lhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmVkIHVzZWQgdG8gbWFuYWdlIG1hcHBpbmcgdGhyb3VnaCBhXG4vLyBzZXJpZXMgb2Ygc3RlcHMsIHR5cGljYWxseSBpbmNsdWRpbmcgaW52ZXJ0ZWQgYW5kIG5vbi1pbnZlcnRlZFxuLy8gdmVyc2lvbnMgb2YgdGhlIHNhbWUgc3RlcC4gKFRoaXMgY29tZXMgdXAgd2hlbiDigJhyZWJhc2luZ+KAmSBzdGVwcyBmb3Jcbi8vIGNvbGxhYm9yYXRpb24gb3IgaGlzdG9yeSBtYW5hZ2VtZW50LikgVGhpcyBjbGFzcyBpbXBsZW1lbnRzXG4vLyBgTWFwcGFibGVgLlxuXG52YXIgUmVtYXBwaW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKD9bUG9zTWFwXSwgP1tQb3NNYXBdKVxuXG4gIGZ1bmN0aW9uIFJlbWFwcGluZygpIHtcbiAgICB2YXIgaGVhZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzBdO1xuICAgIHZhciB0YWlsID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1pcnJvciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhcmd1bWVudHNbMl07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVtYXBwaW5nKTtcblxuICAgIC8vIDo6IFtQb3NNYXBdXG4gICAgLy8gVGhlIG1hcHMgaW4gdGhlIGhlYWQgb2YgdGhlIG1hcHBpbmcgYXJlIGFwcGxpZWQgdG8gaW5wdXRcbiAgICAvLyBwb3NpdGlvbnMgZmlyc3QsIGJhY2stdG8tZnJvbnQuIFNvIHRoZSBtYXAgYXQgdGhlIGVuZCBvZiB0aGlzXG4gICAgLy8gYXJyYXkgKGlmIGFueSkgaXMgdGhlIHZlcnkgZmlyc3Qgb25lIGFwcGxpZWQuXG4gICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICAvLyBUaGUgbWFwcyBpbiB0aGUgdGFpbCBhcmUgYXBwbGllZCBsYXN0LCBmcm9udC10by1iYWNrLlxuICAgIHRoaXMudGFpbCA9IHRhaWw7XG4gICAgdGhpcy5taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvLyA6OiAoUG9zTWFwLCA/bnVtYmVyKSDihpIgbnVtYmVyXG4gIC8vIEFkZCBhIG1hcCB0byB0aGUgbWFwcGluZydzIGZyb250LiBJZiB0aGlzIG1hcCBpcyB0aGUgbWlycm9yIGltYWdlXG4gIC8vIChwcm9kdWNlZCBieSBhbiBpbnZlcnRlZCBzdGVwKSBvZiBhbm90aGVyIG1hcCBpbiB0aGlzIG1hcHBpbmcsXG4gIC8vIHRoYXQgbWFwJ3MgaWQgKGFzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG9yXG4gIC8vIFtgYWRkVG9CYWNrYF0oI1JlbWFwcGluZy5hZGRUb0JhY2spKSBzaG91bGQgYmUgcGFzc2VkIGFzIGEgc2Vjb25kXG4gIC8vIHBhcmFtZXRlciB0byByZWdpc3RlciB0aGUgY29ycmVzcG9uZGVuY2UuXG5cbiAgX2NyZWF0ZUNsYXNzKFJlbWFwcGluZywgW3tcbiAgICBrZXk6IFwiYWRkVG9Gcm9udFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUb0Zyb250KG1hcCwgY29ycikge1xuICAgICAgdGhpcy5oZWFkLnB1c2gobWFwKTtcbiAgICAgIHZhciBpZCA9IC10aGlzLmhlYWQubGVuZ3RoO1xuICAgICAgaWYgKGNvcnIgIT0gbnVsbCkgdGhpcy5taXJyb3JbaWRdID0gY29ycjtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zTWFwLCA/bnVtYmVyKSDihpIgbnVtYmVyXG4gICAgLy8gQWRkIGEgbWFwIHRvIHRoZSBtYXBwaW5nJ3MgYmFjay4gSWYgdGhlIG1hcCBpcyB0aGUgbWlycm9yIGltYWdlXG4gICAgLy8gb2YgYW5vdGhlciBtYXBwaW5nIGluIHRoaXMgb2JqZWN0LCB0aGUgaWQgb2YgdGhhdCBtYXAgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIHRvIHJlZ2lzdGVyIHRoZSBjb3JyZXNwb25kZW5jZS5cbiAgfSwge1xuICAgIGtleTogXCJhZGRUb0JhY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9CYWNrKG1hcCwgY29ycikge1xuICAgICAgdGhpcy50YWlsLnB1c2gobWFwKTtcbiAgICAgIHZhciBpZCA9IHRoaXMudGFpbC5sZW5ndGggLSAxO1xuICAgICAgaWYgKGNvcnIgIT0gbnVsbCkgdGhpcy5taXJyb3JbY29ycl0gPSBpZDtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChpZCkge1xuICAgICAgcmV0dXJuIGlkIDwgMCA/IHRoaXMuaGVhZFstaWQgLSAxXSA6IHRoaXMudGFpbFtpZF07XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyByZW1hcHBpbmcsIG9wdGlvbmFsbHkgcGFzc2luZyBhIGJpYXNcbiAgICAvLyBkaXJlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHZhciBkZWxldGVkID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGkgPSAtdGhpcy5oZWFkLmxlbmd0aDsgaSA8IHRoaXMudGFpbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbWFwID0gdGhpcy5nZXQoaSk7XG4gICAgICAgIHZhciByZXN1bHQgPSBtYXAubWFwKHBvcywgYmlhcyk7XG4gICAgICAgIGlmIChyZXN1bHQucmVjb3Zlcikge1xuICAgICAgICAgIHZhciBjb3JyID0gdGhpcy5taXJyb3JbaV07XG4gICAgICAgICAgaWYgKGNvcnIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaSA9IGNvcnI7XG4gICAgICAgICAgICBwb3MgPSB0aGlzLmdldChjb3JyKS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRlbGV0ZWQpIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICBwb3MgPSByZXN1bHQucG9zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IE1hcFJlc3VsdChwb3MsIGRlbGV0ZWQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZW1hcHBpbmc7XG59KSgpO1xuXG5leHBvcnRzLlJlbWFwcGluZyA9IFJlbWFwcGluZzsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfdHJlZSA9IHJlcXVpcmUoXCIuL3RyZWVcIik7XG5cbi8vICEhXG4vLyAqKmBhZGRNYXJrYCoqXG4vLyAgIDogQWRkIHRoZSBgTWFya2AgZ2l2ZW4gYXMgdGhlIHN0ZXAncyBwYXJhbWV0ZXIgdG8gYWxsXG4vLyAgICAgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgKHdoZW4gYWxsb3dlZCkuXG4vL1xuLy8gKipgcmVtb3ZlTWFya2AqKlxuLy8gICA6IFJlbW92ZSB0aGUgYE1hcmtgIGdpdmVuIGFzIHRoZSBzdGVwJ3MgcGFyYW1ldGVyIGZyb20gYWxsIGlubGluZVxuLy8gICAgIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiYWRkTWFya1wiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoKDAsIF90cmVlLmNvcHlTdHJ1Y3R1cmUpKGRvYywgc3RlcC5mcm9tLCBzdGVwLnRvLCBmdW5jdGlvbiAobm9kZSwgZnJvbSwgdG8pIHtcbiAgICAgIGlmICghbm9kZS50eXBlLmNhbkNvbnRhaW5NYXJrKHN0ZXAucGFyYW0pKSByZXR1cm4gbm9kZTtcbiAgICAgIHJldHVybiAoMCwgX3RyZWUuY29weUlubGluZSkobm9kZSwgZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm1hcmsoc3RlcC5wYXJhbS5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcInJlbW92ZU1hcmtcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgbnVsbCwgc3RlcC5wYXJhbSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbS50b0pTT04oKTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uKTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsIFBvcywgTWFyaykg4oaSIFRyYW5zZm9ybVxuLy8gQWRkIHRoZSBnaXZlbiBtYXJrIHRvIHRoZSBpbmxpbmUgY29udGVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5hZGRNYXJrID0gZnVuY3Rpb24gKGZyb20sIHRvLCBtYXJrKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlbW92ZWQgPSBbXSxcbiAgICAgIGFkZGVkID0gW10sXG4gICAgICByZW1vdmluZyA9IG51bGwsXG4gICAgICBhZGRpbmcgPSBudWxsO1xuICB0aGlzLmRvYy5pbmxpbmVOb2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChfcmVmLCBwYXRoLCBzdGFydCwgZW5kLCBwYXJlbnQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmLm1hcmtzO1xuXG4gICAgaWYgKG1hcmsuaXNJblNldChtYXJrcykgfHwgIXBhcmVudC50eXBlLmNhbkNvbnRhaW5NYXJrKG1hcmsudHlwZSkpIHtcbiAgICAgIGFkZGluZyA9IHJlbW92aW5nID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJtID0gbWFyay50eXBlLmlzSW5TZXQobWFya3MpO1xuICAgICAgaWYgKHJtKSB7XG4gICAgICAgIGlmIChyZW1vdmluZyAmJiByZW1vdmluZy5wYXJhbS5lcShybSkpIHtcbiAgICAgICAgICByZW1vdmluZy50byA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVtb3ZpbmcgPSBuZXcgX3N0ZXAuU3RlcChcInJlbW92ZU1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBybSk7XG4gICAgICAgICAgcmVtb3ZlZC5wdXNoKHJlbW92aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZW1vdmluZykge1xuICAgICAgICByZW1vdmluZyA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYWRkaW5nKSB7XG4gICAgICAgIGFkZGluZy50byA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRpbmcgPSBuZXcgX3N0ZXAuU3RlcChcImFkZE1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBtYXJrKTtcbiAgICAgICAgYWRkZWQucHVzaChhZGRpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBfdGhpcy5zdGVwKHMpO1xuICB9KTtcbiAgYWRkZWQuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBfdGhpcy5zdGVwKHMpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5fc3RlcC5TdGVwLmRlZmluZShcInJlbW92ZU1hcmtcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KCgwLCBfdHJlZS5jb3B5U3RydWN0dXJlKShkb2MsIHN0ZXAuZnJvbSwgc3RlcC50bywgZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gKDAsIF90cmVlLmNvcHlJbmxpbmUpKG5vZGUsIGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHN0ZXAucGFyYW0ucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcImFkZE1hcmtcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgbnVsbCwgc3RlcC5wYXJhbSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbS50b0pTT04oKTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4gc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uKTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsIFBvcywgdW5pb248TWFyaywgTWFya1R5cGU+KSDihpIgVHJhbnNmb3JtXG4vLyBSZW1vdmUgdGhlIGdpdmVuIG1hcmssIG9yIGFsbCBtYXJrcyBvZiB0aGUgZ2l2ZW4gdHlwZSwgZnJvbSBpbmxpbmVcbi8vIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnJlbW92ZU1hcmsgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIG1hcmsgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIHZhciBtYXRjaGVkID0gW10sXG4gICAgICBzdGVwID0gMDtcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZjIsIHBhdGgsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmMi5tYXJrcztcblxuICAgIHN0ZXArKztcbiAgICB2YXIgdG9SZW1vdmUgPSBudWxsO1xuICAgIGlmIChtYXJrIGluc3RhbmNlb2YgX21vZGVsLk1hcmtUeXBlKSB7XG4gICAgICB2YXIgZm91bmQgPSBtYXJrLmlzSW5TZXQobWFya3MpO1xuICAgICAgaWYgKGZvdW5kKSB0b1JlbW92ZSA9IFtmb3VuZF07XG4gICAgfSBlbHNlIGlmIChtYXJrKSB7XG4gICAgICBpZiAobWFyay5pc0luU2V0KG1hcmtzKSkgdG9SZW1vdmUgPSBbbWFya107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvUmVtb3ZlID0gbWFya3M7XG4gICAgfVxuICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBybSA9IHRvUmVtb3ZlW2ldLFxuICAgICAgICAgICAgZm91bmQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWF0Y2hlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBtID0gbWF0Y2hlZFtqXTtcbiAgICAgICAgICBpZiAobS5zdGVwID09IHN0ZXAgLSAxICYmIHJtLmVxKG1hdGNoZWRbal0uc3R5bGUpKSBmb3VuZCA9IG07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgZm91bmQudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgICAgIGZvdW5kLnN0ZXAgPSBzdGVwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZWQucHVzaCh7IHN0eWxlOiBybSwgZnJvbTogbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCB0bzogbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgc3RlcDogc3RlcCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIG1hdGNoZWQuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBfdGhpczIuc3RlcChcInJlbW92ZU1hcmtcIiwgbS5mcm9tLCBtLnRvLCBudWxsLCBtLnN0eWxlKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCA/Tm9kZVR5cGUpIOKGkiBUcmFuc2Zvcm1cbi8vIFJlbW92ZSBhbGwgbWFya3MgYW5kIG5vbi10ZXh0IGlubGluZSBub2Rlcywgb3IgaWYgYG5ld1BhcmVudGAgaXNcbi8vIGdpdmVuLCBhbGwgbWFya3MgYW5kIGlubGluZSBub2RlcyB0aGF0IG1heSBub3QgYXBwZWFyIGFzIGNvbnRlbnQgb2Zcbi8vIGBuZXdQYXJlbnRgLCBmcm9tIHRoZSBnaXZlbiByYW5nZS5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5jbGVhck1hcmt1cCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgbmV3UGFyZW50KSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHZhciBkZWxTdGVwcyA9IFtdOyAvLyBNdXN0IGJlIGFjY3VtdWxhdGVkIGFuZCBhcHBsaWVkIGluIGludmVyc2Ugb3JkZXJcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZjMsIHBhdGgsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbWFya3MgPSBfcmVmMy5tYXJrcztcbiAgICB2YXIgdHlwZSA9IF9yZWYzLnR5cGU7XG5cbiAgICBpZiAobmV3UGFyZW50ID8gIW5ld1BhcmVudC5jYW5Db250YWluVHlwZSh0eXBlKSA6ICF0eXBlLmlzVGV4dCkge1xuICAgICAgcGF0aCA9IHBhdGguc2xpY2UoKTtcbiAgICAgIHZhciBfZnJvbSA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KTtcbiAgICAgIGRlbFN0ZXBzLnB1c2gobmV3IF9zdGVwLlN0ZXAoXCJyZXBsYWNlXCIsIF9mcm9tLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBfZnJvbSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWFyayA9IG1hcmtzW2ldO1xuICAgICAgaWYgKCFuZXdQYXJlbnQgfHwgIW5ld1BhcmVudC5jYW5Db250YWluTWFyayhtYXJrLnR5cGUpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICAgIF90aGlzMy5zdGVwKFwicmVtb3ZlTWFya1wiLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBzdGFydCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCksIG51bGwsIG1hcmspO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSBkZWxTdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHRoaXMuc3RlcChkZWxTdGVwc1tpXSk7XG4gIH1yZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbnZhciBfdHJlZSA9IHJlcXVpcmUoXCIuL3RyZWVcIik7XG5cbi8vICEhICoqYHJlcGxhY2VgKipcblxuLy8gICA6IERlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgYW5kXG4vLyAgICAgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBjaHVuayBvZiBjb250ZW50LiBgcG9zYCBtdXN0XG4vLyAgICAgcG9pbnQgYXQgdGhlIOKAmHJvb3TigJkgYXQgd2hpY2ggdGhlIGN1dCBzdGFydHPigJRhIHBvc2l0aW9uIGJldHdlZW5cbi8vICAgICBhbmQgYWJvdmUgYGZyb21gIGFuZCBgdG9gLlxuLy9cbi8vICAgICBXaGVuIG5ldyBjb250ZW50IGlzIHRvIGJlIGluc2VydGVkLCB0aGUgc3RlcCdzIHBhcmFtZXRlciBzaG91bGRcbi8vICAgICBiZSBhbiBvYmplY3Qgb2Ygc2hhcGUgYHtjb250ZW50OiBgW2BGcmFnbWVudGBdKCNGcmFnbWVudClgLFxuLy8gICAgIG9wZW5MZWZ0OiBudW1iZXIsIG9wZW5SaWdodDogbnVtYmVyfWAuIFRoZSBzdGVwIHdpbGwgaW5zZXJ0IHRoZVxuLy8gICAgIGdpdmVuIGNvbnRlbnQgYXQgdGhlIHJvb3Qgb2YgdGhlIGN1dCwgYW5kIGBvcGVuTGVmdGAgYW5kXG4vLyAgICAgYG9wZW5SaWdodGAgaW5kaWNhdGUgaG93IG11Y2ggb2YgdGhlIGNvbnRlbnQgb24gYm90aCBzaWRlc1xuLy8gICAgIHNob3VsZCBiZSBjb25zaWRlZCDigJhvcGVu4oCZLlxuLy9cbi8vICAgICBBIHJlcGxhY2Ugc3RlcCB3aWxsIHRyeSB0byBqb2luIG9wZW4gbm9kZXMgb24gYm90aCBzaWRlcyBvZiB0aGVcbi8vICAgICBjdXQuIFRoYXQgaXMsIG5vZGVzIGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudCB0aGF0IGFyZSBwYXJ0aWFsbHlcbi8vICAgICBjdXQgb2ZmIGJ5IGBmcm9tYCBhbmQgYHRvYCwgYW5kIG5vZGVzIGF0IHRoZSBzaWRlcyBvZiB0aGVcbi8vICAgICByZXBsYWNlbWVudCBjb250ZW50IGFzIHNwZWNpZmljZWQgYnkgYG9wZW5MZWZ0YCBhbmRcbi8vICAgICBgb3BlblJpZ2h0YC4gRm9yIGV4YW1wbGUsIGlmIGBvcGVuTGVmdGAgaXMgMiwgdGhlIGZpcnN0IG5vZGUgb2Zcbi8vICAgICB0aGUgcmVwbGFjZW1lbnQgY29udGVudCBhcyB3ZWxsIGFzIGl0cyBmaXJzdCBjaGlsZCBpc1xuLy8gICAgIGNvbnNpZGVyZWQgb3Blbi4gV2hlbmV2ZXIgdHdvIG9wZW4gbm9kZXMgd2l0aCB0aGUgc2FtZVxuLy8gICAgIFttYXJrdXBdKCNOb2RlLnNhbWVNYXJrdXApIGVuZCB1cCBuZXh0IHRvIGVhY2ggb3RoZXIsIHRoZXkgYXJlXG4vLyAgICAgam9pbmVkLiBPcGVuIG5vZGVzIHRoYXQgYXJlbid0IGpvaW5lZCBhcmUgW2Nsb3NlZF0oI05vZGUuY2xvc2UpXG4vLyAgICAgdG8gZW5zdXJlIHRoZWlyIGNvbnRlbnQgKG9yIGxhY2sgb2YgaXQpIGlzIHZhbGlkLlxuXG5mdW5jdGlvbiBmaW5kTW92ZWRDaHVua3Mob2xkTm9kZSwgb2xkUGF0aCwgbmV3Tm9kZSwgc3RhcnREZXB0aCkge1xuICB2YXIgbW92ZWQgPSBbXTtcbiAgdmFyIG5ld1BhdGggPSBvbGRQYXRoLnBhdGguc2xpY2UoMCwgc3RhcnREZXB0aCk7XG5cbiAgZm9yICh2YXIgZGVwdGggPSBzdGFydERlcHRoOzsgZGVwdGgrKykge1xuICAgIHZhciBqb2luZWQgPSBkZXB0aCA9PSBvbGRQYXRoLmRlcHRoID8gMCA6IDE7XG4gICAgdmFyIGN1dCA9IGRlcHRoID09IG9sZFBhdGguZGVwdGggPyBvbGRQYXRoLm9mZnNldCA6IG9sZFBhdGgucGF0aFtkZXB0aF07XG4gICAgdmFyIGFmdGVyQ3V0ID0gb2xkTm9kZS5zaXplIC0gY3V0O1xuICAgIHZhciBuZXdPZmZzZXQgPSBuZXdOb2RlLnNpemUgLSBhZnRlckN1dDtcblxuICAgIHZhciBmcm9tID0gb2xkUGF0aC5zaG9ydGVuKGRlcHRoLCBqb2luZWQpO1xuICAgIHZhciB0byA9IG5ldyBfbW9kZWwuUG9zKG5ld1BhdGgsIG5ld09mZnNldCArIGpvaW5lZCk7XG4gICAgaWYgKGZyb20uY21wKHRvKSkgbW92ZWQucHVzaChuZXcgX21hcC5Nb3ZlZFJhbmdlKGZyb20sIGFmdGVyQ3V0IC0gam9pbmVkLCB0bykpO1xuXG4gICAgaWYgKCFqb2luZWQpIHJldHVybiBtb3ZlZDtcblxuICAgIG9sZE5vZGUgPSBvbGROb2RlLmNoaWxkKGN1dCk7XG4gICAgbmV3Tm9kZSA9IG5ld05vZGUuY2hpbGQobmV3T2Zmc2V0KTtcbiAgICBuZXdQYXRoID0gbmV3UGF0aC5jb25jYXQobmV3T2Zmc2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlKG5vZGUsIGZyb20sIHRvLCByb290LCByZXBsKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNSB8fCBhcmd1bWVudHNbNV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbNV07XG5cbiAgaWYgKGRlcHRoID09IHJvb3QubGVuZ3RoKSB7XG4gICAgdmFyIGJlZm9yZSA9IG5vZGUuc2xpY2VCZXR3ZWVuKG51bGwsIGZyb20sIGRlcHRoKTtcbiAgICB2YXIgYWZ0ZXIgPSBub2RlLnNsaWNlQmV0d2Vlbih0bywgbnVsbCwgZGVwdGgpLFxuICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFiZWZvcmUudHlwZS5jYW5Db250YWluRnJhZ21lbnQocmVwbC5jb250ZW50KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHJlcGwuY29udGVudC5zaXplKSByZXN1bHQgPSBiZWZvcmUuYXBwZW5kKHJlcGwuY29udGVudCwgZnJvbS5kZXB0aCAtIGRlcHRoLCByZXBsLm9wZW5MZWZ0KS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgcmVwbC5vcGVuUmlnaHQsIHRvLmRlcHRoIC0gZGVwdGgpO2Vsc2UgcmVzdWx0ID0gYmVmb3JlLmFwcGVuZChhZnRlci5jb250ZW50LCBmcm9tLmRlcHRoIC0gZGVwdGgsIHRvLmRlcHRoIC0gZGVwdGgpO1xuICAgIGlmICghcmVzdWx0LnNpemUgJiYgIXJlc3VsdC50eXBlLmNhbkJlRW1wdHkpIHJlc3VsdCA9IHJlc3VsdC5jb3B5KHJlc3VsdC50eXBlLmRlZmF1bHRDb250ZW50KCkpO1xuICAgIHJldHVybiB7IGRvYzogcmVzdWx0LCBtb3ZlZDogZmluZE1vdmVkQ2h1bmtzKG5vZGUsIHRvLCByZXN1bHQsIGRlcHRoKSB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBwb3MgPSByb290W2RlcHRoXTtcbiAgICB2YXIgcmVzdWx0ID0gcmVwbGFjZShub2RlLmNoaWxkKHBvcyksIGZyb20sIHRvLCByb290LCByZXBsLCBkZXB0aCArIDEpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyBkb2M6IG5vZGUucmVwbGFjZShwb3MsIHJlc3VsdC5kb2MpLCBtb3ZlZDogcmVzdWx0Lm1vdmVkIH07XG4gIH1cbn1cblxudmFyIG51bGxSZXBsID0geyBjb250ZW50OiBfbW9kZWwuZW1wdHlGcmFnbWVudCwgb3BlbkxlZnQ6IDAsIG9wZW5SaWdodDogMCB9O1xuXG5fc3RlcC5TdGVwLmRlZmluZShcInJlcGxhY2VcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIHJvb3RQb3MgPSBzdGVwLnBvcyxcbiAgICAgICAgcm9vdCA9IHJvb3RQb3MucGF0aDtcbiAgICBpZiAoc3RlcC5mcm9tLmRlcHRoIDwgcm9vdC5sZW5ndGggfHwgc3RlcC50by5kZXB0aCA8IHJvb3QubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdGVwLmZyb20ucGF0aFtpXSAhPSByb290W2ldIHx8IHN0ZXAudG8ucGF0aFtpXSAhPSByb290W2ldKSByZXR1cm4gbnVsbDtcbiAgICB9dmFyIHJlc3VsdCA9IHJlcGxhY2UoZG9jLCBzdGVwLmZyb20sIHN0ZXAudG8sIHJvb3RQb3MucGF0aCwgc3RlcC5wYXJhbSB8fCBudWxsUmVwbCk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciBvdXQgPSByZXN1bHQuZG9jO1xuICAgIHZhciBtb3ZlZCA9IHJlc3VsdC5tb3ZlZDtcblxuICAgIHZhciBlbmQgPSBtb3ZlZC5sZW5ndGggPyBtb3ZlZFttb3ZlZC5sZW5ndGggLSAxXS5kZXN0IDogc3RlcC50bztcbiAgICB2YXIgcmVwbGFjZWQgPSBuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHN0ZXAuZnJvbSwgc3RlcC50bywgc3RlcC5mcm9tLCBlbmQsIHJvb3RQb3MsIHJvb3RQb3MpO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdChvdXQsIG5ldyBfbWFwLlBvc01hcChtb3ZlZCwgW3JlcGxhY2VkXSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MsIG1hcCkge1xuICAgIHZhciBkZXB0aCA9IHN0ZXAucG9zLmRlcHRoO1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcInJlcGxhY2VcIiwgc3RlcC5mcm9tLCBtYXAubWFwKHN0ZXAudG8pLnBvcywgc3RlcC5mcm9tLnNob3J0ZW4oZGVwdGgpLCB7XG4gICAgICBjb250ZW50OiBvbGREb2MucGF0aChzdGVwLnBvcy5wYXRoKS5jb250ZW50LnNsaWNlQmV0d2VlbihzdGVwLmZyb20sIHN0ZXAudG8sIGRlcHRoKSxcbiAgICAgIG9wZW5MZWZ0OiBzdGVwLmZyb20uZGVwdGggLSBkZXB0aCxcbiAgICAgIG9wZW5SaWdodDogc3RlcC50by5kZXB0aCAtIGRlcHRoXG4gICAgfSk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbSAmJiB7IGNvbnRlbnQ6IHBhcmFtLmNvbnRlbnQuc2l6ZSAmJiBwYXJhbS5jb250ZW50LnRvSlNPTigpLFxuICAgICAgb3BlbkxlZnQ6IHBhcmFtLm9wZW5MZWZ0LCBvcGVuUmlnaHQ6IHBhcmFtLm9wZW5SaWdodCB9O1xuICB9LFxuICBwYXJhbUZyb21KU09OOiBmdW5jdGlvbiBwYXJhbUZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgIHJldHVybiBqc29uICYmIHsgY29udGVudDogX21vZGVsLkZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSxcbiAgICAgIG9wZW5MZWZ0OiBqc29uLm9wZW5MZWZ0LCBvcGVuUmlnaHQ6IGpzb24ub3BlblJpZ2h0IH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBzaGlmdEZyb21TdGFjayhzdGFjaywgZGVwdGgpIHtcbiAgdmFyIHNoaWZ0ZWQgPSBzdGFja1tkZXB0aF0gPSBzdGFja1tkZXB0aF0uc3BsaWNlKDAsIDEsIF9tb2RlbC5lbXB0eUZyYWdtZW50KTtcbiAgZm9yICh2YXIgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzaGlmdGVkID0gc3RhY2tbaV0gPSBzdGFja1tpXS5yZXBsYWNlKDAsIHNoaWZ0ZWQpO1xuICB9XG59XG5cbi8vIEZJWE1FIGZpbmQgYSBub3Qgc28gaG9ycmlibHkgY29uZnVzaW5nIHdheSB0byBleHByZXNzIHRoaXNcbmZ1bmN0aW9uIGJ1aWxkSW5zZXJ0ZWQobm9kZXNMZWZ0LCBzb3VyY2UsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHNsaWNlZCA9IHNvdXJjZS5zbGljZUJldHdlZW4oc3RhcnQsIGVuZCk7XG4gIHZhciBub2Rlc1JpZ2h0ID0gW107XG4gIGZvciAodmFyIG5vZGUgPSBzbGljZWQsIGkgPSAwOyBpIDw9IHN0YXJ0LnBhdGgubGVuZ3RoOyBpKyssIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICBub2Rlc1JpZ2h0LnB1c2gobm9kZSk7XG4gIH12YXIgc2FtZSA9ICgwLCBfdHJlZS5zYW1lUGF0aERlcHRoKShzdGFydCwgZW5kKTtcbiAgdmFyIHNlYXJjaExlZnQgPSBub2Rlc0xlZnQubGVuZ3RoIC0gMSxcbiAgICAgIHNlYXJjaFJpZ2h0ID0gbm9kZXNSaWdodC5sZW5ndGggLSAxO1xuICB2YXIgcmVzdWx0ID0gbnVsbDtcblxuICB2YXIgaW5uZXIgPSBub2Rlc1JpZ2h0W3NlYXJjaFJpZ2h0XTtcbiAgaWYgKGlubmVyLmlzVGV4dGJsb2NrICYmIGlubmVyLnNpemUgJiYgbm9kZXNMZWZ0W3NlYXJjaExlZnRdLmlzVGV4dGJsb2NrKSB7XG4gICAgcmVzdWx0ID0gbm9kZXNMZWZ0W3NlYXJjaExlZnQtLV0uY29weShpbm5lci5jb250ZW50KTtcbiAgICAtLXNlYXJjaFJpZ2h0O1xuICAgIHNoaWZ0RnJvbVN0YWNrKG5vZGVzUmlnaHQsIHNlYXJjaFJpZ2h0KTtcbiAgfVxuXG4gIGZvciAoOzspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzUmlnaHRbc2VhcmNoUmlnaHRdLFxuICAgICAgICB0eXBlID0gbm9kZS50eXBlLFxuICAgICAgICBtYXRjaGVkID0gbnVsbDtcbiAgICB2YXIgb3V0c2lkZSA9IHNlYXJjaFJpZ2h0IDw9IHNhbWU7XG4gICAgZm9yICh2YXIgaSA9IHNlYXJjaExlZnQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgbGVmdCA9IG5vZGVzTGVmdFtpXTtcbiAgICAgIGlmIChvdXRzaWRlID8gbGVmdC50eXBlLmNhbkNvbnRhaW5Db250ZW50KG5vZGUudHlwZSkgOiBsZWZ0LnR5cGUgPT0gdHlwZSkge1xuICAgICAgICBtYXRjaGVkID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXRjaGVkICE9IG51bGwpIHtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdCA9IG5vZGVzTGVmdFttYXRjaGVkXS5jb3B5KG5vZGUuY29udGVudCk7XG4gICAgICAgIHNlYXJjaExlZnQgPSBtYXRjaGVkIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChzZWFyY2hMZWZ0ID49IG1hdGNoZWQpIHtcbiAgICAgICAgICB2YXIgd3JhcCA9IG5vZGVzTGVmdFtzZWFyY2hMZWZ0XTtcbiAgICAgICAgICB2YXIgY29udGVudCA9IF9tb2RlbC5GcmFnbWVudC5mcm9tKHJlc3VsdCk7XG4gICAgICAgICAgcmVzdWx0ID0gd3JhcC5jb3B5KHNlYXJjaExlZnQgPT0gbWF0Y2hlZCA/IGNvbnRlbnQuYXBwZW5kKG5vZGUuY29udGVudCkgOiBjb250ZW50KTtcbiAgICAgICAgICBzZWFyY2hMZWZ0LS07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoZWQgIT0gbnVsbCB8fCBub2RlLnNpemUgPT0gMCkge1xuICAgICAgaWYgKG91dHNpZGUpIGJyZWFrO1xuICAgICAgaWYgKHNlYXJjaFJpZ2h0KSBzaGlmdEZyb21TdGFjayhub2Rlc1JpZ2h0LCBzZWFyY2hSaWdodCAtIDEpO1xuICAgIH1cbiAgICBzZWFyY2hSaWdodC0tO1xuICB9XG5cbiAgdmFyIHJlcGwgPSB7IGNvbnRlbnQ6IHJlc3VsdCA/IHJlc3VsdC5jb250ZW50IDogX21vZGVsLmVtcHR5RnJhZ21lbnQsXG4gICAgb3BlbkxlZnQ6IHN0YXJ0LmRlcHRoIC0gc2VhcmNoUmlnaHQsXG4gICAgb3BlblJpZ2h0OiBlbmQuZGVwdGggLSBzZWFyY2hSaWdodCB9O1xuICByZXR1cm4geyByZXBsOiByZXBsLCBkZXB0aDogc2VhcmNoTGVmdCArIDEgfTtcbn1cblxuZnVuY3Rpb24gbW92ZVRleHQodHIsIGRvYywgYmVmb3JlLCBhZnRlcikge1xuICB2YXIgcm9vdCA9ICgwLCBfdHJlZS5zYW1lUGF0aERlcHRoKShiZWZvcmUsIGFmdGVyKTtcbiAgdmFyIGN1dEF0ID0gYWZ0ZXIuc2hvcnRlbihudWxsLCAxKTtcbiAgd2hpbGUgKGN1dEF0LnBhdGgubGVuZ3RoID4gcm9vdCAmJiBkb2MucGF0aChjdXRBdC5wYXRoKS5zaXplID09IDEpIGN1dEF0ID0gY3V0QXQuc2hvcnRlbihudWxsLCAxKTtcbiAgdHIuc3BsaXQoY3V0QXQsIGN1dEF0LnBhdGgubGVuZ3RoIC0gcm9vdCk7XG4gIHZhciBzdGFydCA9IGFmdGVyLFxuICAgICAgZW5kID0gbmV3IF9tb2RlbC5Qb3Moc3RhcnQucGF0aCwgZG9jLnBhdGgoc3RhcnQucGF0aCkuc2l6ZSk7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChzdGFydC5wYXRoLnNsaWNlKDAsIHJvb3QpKTtcbiAgdmFyIHdhbnRlZCA9IHBhcmVudC5wYXRoTm9kZXMoYmVmb3JlLnBhdGguc2xpY2Uocm9vdCkpO1xuICB2YXIgZXhpc3RpbmcgPSBwYXJlbnQucGF0aE5vZGVzKHN0YXJ0LnBhdGguc2xpY2Uocm9vdCkpO1xuICB3aGlsZSAod2FudGVkLmxlbmd0aCAmJiBleGlzdGluZy5sZW5ndGggJiYgd2FudGVkWzBdLnNhbWVNYXJrdXAoZXhpc3RpbmdbMF0pKSB7XG4gICAgd2FudGVkLnNoaWZ0KCk7XG4gICAgZXhpc3Rpbmcuc2hpZnQoKTtcbiAgfVxuICBpZiAoZXhpc3RpbmcubGVuZ3RoIHx8IHdhbnRlZC5sZW5ndGgpIHRyLnN0ZXAoXCJhbmNlc3RvclwiLCBzdGFydCwgZW5kLCBudWxsLCB7XG4gICAgZGVwdGg6IGV4aXN0aW5nLmxlbmd0aCxcbiAgICB0eXBlczogd2FudGVkLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4udHlwZTtcbiAgICB9KSxcbiAgICBhdHRyczogd2FudGVkLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4uYXR0cnM7XG4gICAgfSlcbiAgfSk7XG4gIGZvciAodmFyIGkgPSByb290OyBpIDwgYmVmb3JlLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICB0ci5qb2luKGJlZm9yZS5zaG9ydGVuKGksIDEpKTtcbiAgfVxufVxuXG4vLyA6OiAoUG9zLCBQb3MpIOKGkiBUcmFuc2Zvcm1cbi8vIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGVbXCJkZWxldGVcIl0gPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgaWYgKGZyb20uY21wKHRvKSkgdGhpcy5yZXBsYWNlKGZyb20sIHRvKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCBQb3MsIE5vZGUsIFBvcywgUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBSZXBsYWNlIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCB3aXRoIHRoZVxuLy8gcGFydCBvZiB0aGUgYHNvdXJjZWAgYmV0d2VlbiBgc3RhcnRgIGFuZCBgZW5kYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzb3VyY2UsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJlcGwgPSB1bmRlZmluZWQsXG4gICAgICBkZXB0aCA9IHVuZGVmaW5lZCxcbiAgICAgIGRvYyA9IHRoaXMuZG9jLFxuICAgICAgbWF4RGVwdGggPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoZnJvbSwgdG8pO1xuICBpZiAoc291cmNlKSB7XG4gICAgO1xuICAgIHZhciBfYnVpbGRJbnNlcnRlZCA9IGJ1aWxkSW5zZXJ0ZWQoZG9jLnBhdGhOb2Rlcyhmcm9tLnBhdGgpLCBzb3VyY2UsIHN0YXJ0LCBlbmQpO1xuXG4gICAgcmVwbCA9IF9idWlsZEluc2VydGVkLnJlcGw7XG4gICAgZGVwdGggPSBfYnVpbGRJbnNlcnRlZC5kZXB0aDtcblxuICAgIHdoaWxlIChkZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICBpZiAocmVwbC5jb250ZW50LnNpemUpIHJlcGwgPSB7IGNvbnRlbnQ6IF9tb2RlbC5GcmFnbWVudC5mcm9tKGRvYy5wYXRoKGZyb20ucGF0aC5zbGljZSgwLCBkZXB0aCkpLmNvcHkocmVwbC5jb250ZW50KSksXG4gICAgICAgIG9wZW5MZWZ0OiByZXBsLm9wZW5MZWZ0ICsgMSwgb3BlblJpZ2h0OiByZXBsLm9wZW5SaWdodCArIDEgfTtcbiAgICAgIGRlcHRoLS07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcGwgPSBudWxsUmVwbDtcbiAgICBkZXB0aCA9IG1heERlcHRoO1xuICB9XG4gIHZhciByb290ID0gZnJvbS5zaG9ydGVuKGRlcHRoKSxcbiAgICAgIGRvY0FmdGVyID0gZG9jLFxuICAgICAgYWZ0ZXIgPSB0bztcbiAgaWYgKHJlcGwuY29udGVudC5zaXplIHx8ICgwLCBfdHJlZS5yZXBsYWNlSGFzRWZmZWN0KShkb2MsIGZyb20sIHRvKSkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnN0ZXAoXCJyZXBsYWNlXCIsIGZyb20sIHRvLCByb290LCByZXBsKTtcbiAgICBkb2NBZnRlciA9IHJlc3VsdC5kb2M7XG4gICAgYWZ0ZXIgPSByZXN1bHQubWFwLm1hcCh0bykucG9zO1xuICB9XG5cbiAgLy8gSWYgbm8gdGV4dCBub2RlcyBiZWZvcmUgb3IgYWZ0ZXIgZW5kIG9mIHJlcGxhY2VtZW50LCBkb24ndCBnbHVlIHRleHRcbiAgaWYgKCFkb2MucGF0aCh0by5wYXRoKS5pc1RleHRibG9jaykgcmV0dXJuIHRoaXM7XG4gIGlmICghKHJlcGwuY29udGVudC5zaXplID8gc291cmNlLnBhdGgoZW5kLnBhdGgpLmlzVGV4dGJsb2NrIDogZG9jLnBhdGgoZnJvbS5wYXRoKS5pc1RleHRibG9jaykpIHJldHVybiB0aGlzO1xuXG4gIHZhciBub2Rlc0FmdGVyID0gZG9jLnBhdGgocm9vdC5wYXRoKS5wYXRoTm9kZXModG8ucGF0aC5zbGljZShkZXB0aCkpLnNsaWNlKDEpO1xuICB2YXIgbm9kZXNCZWZvcmUgPSB1bmRlZmluZWQ7XG4gIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSkge1xuICAgIHZhciBpbnNlcnRlZCA9IHJlcGwuY29udGVudDtcbiAgICBub2Rlc0JlZm9yZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwbC5vcGVuUmlnaHQ7IGkrKykge1xuICAgICAgdmFyIGxhc3QgPSBpbnNlcnRlZC5jaGlsZChpbnNlcnRlZC5zaXplIC0gMSk7XG4gICAgICBub2Rlc0JlZm9yZS5wdXNoKGxhc3QpO1xuICAgICAgaW5zZXJ0ZWQgPSBsYXN0LmNvbnRlbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vZGVzQmVmb3JlID0gZG9jLnBhdGgocm9vdC5wYXRoKS5wYXRoTm9kZXMoZnJvbS5wYXRoLnNsaWNlKGRlcHRoKSkuc2xpY2UoMSk7XG4gIH1cblxuICBpZiAobm9kZXNCZWZvcmUubGVuZ3RoICYmIChub2Rlc0FmdGVyLmxlbmd0aCAhPSBub2Rlc0JlZm9yZS5sZW5ndGggfHwgIW5vZGVzQWZ0ZXIuZXZlcnkoZnVuY3Rpb24gKG4sIGkpIHtcbiAgICByZXR1cm4gbi5zYW1lTWFya3VwKG5vZGVzQmVmb3JlW2ldKTtcbiAgfSkpKSB7XG4gICAgdmFyIF9hZnRlciRzaG9ydGVuID0gYWZ0ZXIuc2hvcnRlbihyb290LmRlcHRoKTtcblxuICAgIHZhciBwYXRoID0gX2FmdGVyJHNob3J0ZW4ucGF0aDtcbiAgICB2YXIgb2Zmc2V0ID0gX2FmdGVyJHNob3J0ZW4ub2Zmc2V0O3ZhciBiZWZvcmUgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgbm9kZSA9IGRvY0FmdGVyLnBhdGgocGF0aCksIGkgPSAwOzsgaSsrKSB7XG4gICAgICBpZiAoaSA9PSBub2Rlc0JlZm9yZS5sZW5ndGgpIHtcbiAgICAgICAgYmVmb3JlID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwYXRoLnB1c2gob2Zmc2V0IC0gMSk7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZChvZmZzZXQgLSAxKTtcbiAgICAgIG9mZnNldCA9IG5vZGUuc2l6ZTtcbiAgICB9XG4gICAgbW92ZVRleHQodGhpcywgZG9jQWZ0ZXIsIGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCB1bmlvbjxGcmFnbWVudCwgTm9kZSwgW05vZGVdPikg4oaSIFRyYW5zZm9ybVxuLy8gUmVwbGFjZSB0aGUgZ2l2ZW4gc2libGluZyByYW5nZSAocG9zaXRpb24gcG9udGluZyBpbnRvIHRoZSBzYW1lXG4vLyBwYXJlbnQpIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQsIHdoaWNoIG1heSBiZSBhIGZyYWdtZW50LCBub2RlLCBvclxuLy8gYXJyYXkgb2Ygbm9kZXMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUucmVwbGFjZVdpdGggPSBmdW5jdGlvbiAoZnJvbSwgdG8sIGNvbnRlbnQpIHtcbiAgaWYgKCEoY29udGVudCBpbnN0YW5jZW9mIF9tb2RlbC5GcmFnbWVudCkpIGNvbnRlbnQgPSBfbW9kZWwuRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgaWYgKCFfbW9kZWwuUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkpIHJldHVybiB0aGlzO1xuICB0aGlzLnN0ZXAoXCJyZXBsYWNlXCIsIGZyb20sIHRvLCBmcm9tLCB7IGNvbnRlbnQ6IGNvbnRlbnQsIG9wZW5MZWZ0OiAwLCBvcGVuUmlnaHQ6IDAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgdW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gY29udGVudCBhdCB0aGUgYHBvc2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHBvcywgY29udGVudCkge1xuICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG59O1xuXG4vLyA6OiAoUG9zLCBzdHJpbmcpIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gdGV4dCBhdCBgcG9zYCwgaW5oZXJpdGluZyB0aGUgbWFya3Mgb2YgdGhlXG4vLyBleGlzdGluZyBjb250ZW50IGF0IHRoYXQgcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0VGV4dCA9IGZ1bmN0aW9uIChwb3MsIHRleHQpIHtcbiAgcmV0dXJuIHRoaXMuaW5zZXJ0KHBvcywgdGhpcy5kb2MudHlwZS5zY2hlbWEudGV4dCh0ZXh0LCB0aGlzLmRvYy5tYXJrc0F0KHBvcykpKTtcbn07XG5cbi8vIDo6IChQb3MsIE5vZGUpIOKGkiBUcmFuc2Zvcm1cbi8vIEluc2VydCB0aGUgZ2l2ZW4gbm9kZSBhdCBgcG9zYCwgaW5oZXJpdGluZyB0aGUgbWFya3Mgb2YgdGhlXG4vLyBleGlzdGluZyBjb250ZW50IGF0IHRoYXQgcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuaW5zZXJ0SW5saW5lID0gZnVuY3Rpb24gKHBvcywgbm9kZSkge1xuICByZXR1cm4gdGhpcy5pbnNlcnQocG9zLCBub2RlLm1hcmsodGhpcy5kb2MubWFya3NBdChwb3MpKSk7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYHNwbGl0YCoqXG4vLyAgIDogU3BsaXQgYSBibG9jayBub2RlIGF0IGBwb3NgLiBUaGUgcGFyYW1ldGVyLCBpZiBnaXZlbiwgbWF5IGJlXG4vLyAgICAgYHt0eXBlLCA/YXR0cnN9YCBvYmplY3QgZ2l2aW5nIHRoZSBub2RlIHR5cGUgYW5kIG9wdGlvbmFsbHkgdGhlXG4vLyAgICAgYXR0cmlidXRlcyBvZiB0aGUgbm9kZSBjcmVhdGVkIHRvIGhvbGQgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlXG4vLyAgICAgc3BsaXQuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwic3BsaXRcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIHBvcyA9IHN0ZXAucG9zO1xuICAgIGlmIChwb3MuZGVwdGggPT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgX3BvcyRzaG9ydGVuID0gcG9zLnNob3J0ZW4oKTtcblxuICAgIHZhciBwYXJlbnRQYXRoID0gX3BvcyRzaG9ydGVuLnBhdGg7XG4gICAgdmFyIG9mZnNldCA9IF9wb3Mkc2hvcnRlbi5vZmZzZXQ7XG5cbiAgICB2YXIgcGFyZW50ID0gZG9jLnBhdGgocGFyZW50UGF0aCk7XG4gICAgdmFyIHRhcmdldCA9IHBhcmVudC5jaGlsZChvZmZzZXQpLFxuICAgICAgICB0YXJnZXRTaXplID0gdGFyZ2V0LnNpemU7XG5cbiAgICB2YXIgX3JlZiA9IHN0ZXAucGFyYW0gfHwgdGFyZ2V0O1xuXG4gICAgdmFyIHR5cGVBZnRlciA9IF9yZWYudHlwZTtcbiAgICB2YXIgYXR0cnNBZnRlciA9IF9yZWYuYXR0cnM7XG5cbiAgICB2YXIgc3BsaXRBdCA9IHBvcy5vZmZzZXQ7XG4gICAgaWYgKHNwbGl0QXQgPT0gMCAmJiAhdGFyZ2V0LnR5cGUuY2FuQmVFbXB0eSB8fCB0YXJnZXQudHlwZS5sb2NrZWQgfHwgc3BsaXRBdCA9PSB0YXJnZXQuc2l6ZSAmJiAhdHlwZUFmdGVyLmNhbkJlRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMSwgX21vZGVsLkZyYWdtZW50LmZyb20oW3RhcmdldC5zbGljZSgwLCBzcGxpdEF0KSwgdHlwZUFmdGVyLmNyZWF0ZShhdHRyc0FmdGVyLCB0YXJnZXQuY29udGVudC5zbGljZShzcGxpdEF0KSldKSk7XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAocGFyZW50UGF0aCwgbmV3UGFyZW50KTtcblxuICAgIHZhciBkZXN0ID0gbmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aC5jb25jYXQob2Zmc2V0ICsgMSksIDApO1xuICAgIHZhciBtYXAgPSBuZXcgX21hcC5Qb3NNYXAoW25ldyBfbWFwLk1vdmVkUmFuZ2UocG9zLCB0YXJnZXRTaXplIC0gcG9zLm9mZnNldCwgZGVzdCksIG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aCwgb2Zmc2V0ICsgMSksIG5ld1BhcmVudC5zaXplIC0gMiAtIG9mZnNldCwgbmV3IF9tb2RlbC5Qb3MocGFyZW50UGF0aCwgb2Zmc2V0ICsgMikpXSwgW25ldyBfbWFwLlJlcGxhY2VkUmFuZ2UocG9zLCBwb3MsIHBvcywgZGVzdCwgcG9zLCBwb3Muc2hvcnRlbihudWxsLCAxKSldKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbWFwKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgX29sZERvYywgbWFwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwiam9pblwiLCBzdGVwLnBvcywgbWFwLm1hcChzdGVwLnBvcykucG9zKTtcbiAgfSxcbiAgcGFyYW1Ub0pTT046IGZ1bmN0aW9uIHBhcmFtVG9KU09OKHBhcmFtKSB7XG4gICAgcmV0dXJuIHBhcmFtICYmIHsgdHlwZTogcGFyYW0udHlwZS5uYW1lLCBhdHRyczogcGFyYW0uYXR0cnMgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4ganNvbiAmJiB7IHR5cGU6IHNjaGVtYS5ub2RlVHlwZShqc29uLnR5cGUpLCBhdHRyczoganNvbi5hdHRycyB9O1xuICB9XG59KTtcblxuLy8gOjogKFBvcywgP251bWJlciwgP05vZGVUeXBlLCA/T2JqZWN0KSDihpIgVHJhbnNmb3JtXG4vLyBTcGxpdCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIGFuZCBvcHRpb25hbGx5LCBpZiBgZGVwdGhgIGlzXG4vLyBncmVhdGVyIHRoYW4gb25lLCBhbnkgbnVtYmVyIG9mIG5vZGVzIGFib3ZlIHRoYXQuIEJ5IGRlZmF1bHQsIHRoZSBwYXJ0XG4vLyBzcGxpdCBvZmYgd2lsbCBpbmhlcml0IHRoZSBub2RlIHR5cGUgb2YgdGhlIG9yaWdpbmFsIG5vZGUuIFRoaXMgY2FuXG4vLyBiZSBjaGFuZ2VkIGJ5IHBhc3NpbmcgYHR5cGVBZnRlcmAgYW5kIGBhdHRyc0FmdGVyYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIChwb3MsIGRlcHRoLCB0eXBlQWZ0ZXIsIGF0dHJzQWZ0ZXIpIHtcbiAgaWYgKGRlcHRoID09PSB1bmRlZmluZWQpIGRlcHRoID0gMTtcblxuICBpZiAoZGVwdGggPT0gMCkgcmV0dXJuIHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgdGhpcy5zdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgcG9zLCB0eXBlQWZ0ZXIgJiYgeyB0eXBlOiB0eXBlQWZ0ZXIsIGF0dHJzOiBhdHRyc0FmdGVyIH0pO1xuICAgIGlmIChpID09IGRlcHRoIC0gMSkgcmV0dXJuIHRoaXM7XG4gICAgdHlwZUFmdGVyID0gbnVsbDtcbiAgICBwb3MgPSBwb3Muc2hvcnRlbihudWxsLCAxKTtcbiAgfVxufTtcblxuLy8gOjogKFBvcywgP251bWJlcikg4oaSIFRyYW5zZm9ybVxuLy8gU3BsaXQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBfaWZfIHRoYXQgcG9zaXRpb24gaXNuJ3QgYWxyZWFkeSBhdFxuLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIG5vZGUuIElmIGBkZXB0aGAgaXMgZ3JlYXRlciB0aGFuIG9uZSwgYWxzbyBkb1xuLy8gc28gZm9yIHBhcmVudCBwb3NpdGlvbnMgYWJvdmUgdGhlIGdpdmVuIHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnNwbGl0SWZOZWVkZWQgPSBmdW5jdGlvbiAocG9zKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDEgOiBhcmd1bWVudHNbMV07XG5cbiAgZm9yICh2YXIgb2ZmID0gMDsgb2ZmIDwgZGVwdGg7IG9mZisrKSB7XG4gICAgdmFyIGhlcmUgPSBwb3Muc2hvcnRlbihwb3MuZGVwdGggLSBvZmYpO1xuICAgIGlmIChoZXJlLm9mZnNldCAmJiBoZXJlLm9mZnNldCA8IHRoaXMuZG9jLnBhdGgoaGVyZS5wYXRoKS5zaXplKSB0aGlzLnN0ZXAoXCJzcGxpdFwiLCBudWxsLCBudWxsLCBoZXJlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vIDs7IEEgc3RlcCBvYmplY3Qgd3JhcHMgYW4gYXRvbWljIG9wZXJhdGlvbi4gSXQgZ2VuZXJhbGx5IGFwcGxpZXNcbi8vIG9ubHkgdG8gdGhlIGRvY3VtZW50IGl0IHdhcyBjcmVhdGVkIGZvciwgc2luY2UgdGhlIHBvc2l0aW9uc1xuLy8gYXNzb2NpYXRlZCB3aXRoIGl0IHdpbGwgb25seSBtYWtlIHNlbnNlIGZvciB0aGF0IGRvY3VtZW50LlxuXG52YXIgU3RlcCA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChzdHJpbmcsID9Qb3MsID9Qb3MsID9Qb3MsID9hbnkpXG4gIC8vIEJ1aWxkIGEgc3RlcC4gVGhlIHR5cGUgc2hvdWxkIG5hbWUgYSBbZGVmaW5lZF0oU3RlcC5kZWZpbmUpIHN0ZXBcbiAgLy8gdHlwZSwgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcG9zaXRpb25zIGFuZCBwYXJhbWV0ZXIgc2hvdWxkIGJlXG4gIC8vIGFwcHJvcHJpYXRlIGZvciB0aGF0IHR5cGUuXG5cbiAgZnVuY3Rpb24gU3RlcCh0eXBlLCBmcm9tLCB0bywgcG9zKSB7XG4gICAgdmFyIHBhcmFtID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGVwKTtcblxuICAgIGlmICghKHR5cGUgaW4gc3RlcHMpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHN0ZXAgdHlwZTogXCIgKyB0eXBlKTtcbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBUaGUgdHlwZSBvZiB0aGUgc3RlcC5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgc3RhcnQgb2YgdGhlIHN0ZXAncyByYW5nZSwgaWYgYW55LiBXaGljaCBvZiB0aGUgdGhyZWVcbiAgICAvLyBvcHRpb25hbCBwb3NpdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc3RlcCBhIGdpdmVuIHN0ZXAgdHlwZVxuICAgIC8vIHVzZXMgZGlmZmVycy4gVGhlIHdheSBlYWNoIG9mIHRoZXNlIHBvc2l0aW9ucyBpcyBtYXBwZWQgd2hlblxuICAgIC8vIHRoZSBzdGVwIGlzIG1hcHBlZCBvdmVyIGEgW3Bvc2l0aW9uIG1hcHBpbmddKCNQb3NNYXApIGRlcGVuZHNcbiAgICAvLyBvbiBpdHMgcm9sZS5cbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgZW5kIG9mIHRoZSBzdGVwJ3MgcmFuZ2UuXG4gICAgdGhpcy50byA9IHRvO1xuICAgIC8vIDo6ID9Qb3NcbiAgICAvLyBUaGUgYmFzZSBwb3NpdGlvbiBmb3IgdGhpcyBzdGVwLlxuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIC8vIDo6ID9hbnlcbiAgICAvLyBFeHRyYSBzdGVwLXR5cGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGVwLlxuICAgIHRoaXMucGFyYW0gPSBwYXJhbTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgT2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2ZcbiAgLy8gYXBwbHlpbmcgYSB0cmFuc2Zvcm0gc3RlcCB0byBhIGRvY3VtZW50LlxuXG4gIC8vIDo6IChOb2RlKSDihpIgP1N0ZXBSZXN1bHRcbiAgLy8gQXBwbGllcyB0aGlzIHN0ZXAgdG8gdGhlIGdpdmVuIGRvY3VtZW50LCByZXR1cm5pbmcgYSByZXN1bHRcbiAgLy8gY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQgKHRoZSBpbnB1dCBkb2N1bWVudCBpcyBub3RcbiAgLy8gY2hhbmdlZCkgYW5kIGEgYFBvc01hcGAuIElmIHRoZSBzdGVwIGNvdWxkIG5vdCBtZWFuaW5nZnVsbHkgYmVcbiAgLy8gYXBwbGllZCB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQsIHRoaXMgcmV0dXJucyBgbnVsbGAuXG5cbiAgX2NyZWF0ZUNsYXNzKFN0ZXAsIFt7XG4gICAga2V5OiBcImFwcGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KGRvYykge1xuICAgICAgcmV0dXJuIHN0ZXBzW3RoaXMudHlwZV0uYXBwbHkoZG9jLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgUG9zTWFwKSDihpIgU3RlcFxuICAgIC8vIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgc3RlcC4gTmVlZHMgdGhlIGRvY3VtZW50IGFzIGl0XG4gICAgLy8gd2FzIGJlZm9yZSB0aGUgc3RlcCwgYXMgd2VsbCBhcyBgUG9zTWFwYCBjcmVhdGVkIGJ5IGFwcGx5aW5nIHRoZVxuICAgIC8vIHN0ZXAgdG8gdGhhdCBkb2N1bWVudCwgYXMgaW5wdXQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52ZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmVydChvbGREb2MsIG1hcCkge1xuICAgICAgcmV0dXJuIHN0ZXBzW3RoaXMudHlwZV0uaW52ZXJ0KHRoaXMsIG9sZERvYywgbWFwKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTWFwcGFibGUpIOKGkiA/U3RlcFxuICAgIC8vIE1hcCB0aGlzIHN0ZXAgdGhyb3VnaCBhIG1hcHBhYmxlIHRoaW5nLCByZXR1cm5pbmcgZWl0aGVyIGFcbiAgICAvLyB2ZXJzaW9uIG9mIHRoYXQgc3RlcCB3aXRoIGl0cyBwb3NpdGlvbnMgYWRqdXN0ZWQsIG9yIGBudWxsYCBpZlxuICAgIC8vIHRoZSBzdGVwIHdhcyBlbnRpcmVseSBkZWxldGVkIGJ5IHRoZSBtYXBwaW5nLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocmVtYXBwaW5nKSB7XG4gICAgICB2YXIgYWxsRGVsZXRlZCA9IHRydWU7XG4gICAgICB2YXIgZnJvbSA9IG51bGwsXG4gICAgICAgICAgdG8gPSBudWxsLFxuICAgICAgICAgIHBvcyA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLmZyb20pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy5mcm9tLCAxKTtcbiAgICAgICAgZnJvbSA9IHJlc3VsdC5wb3M7XG4gICAgICAgIGlmICghcmVzdWx0LmRlbGV0ZWQpIGFsbERlbGV0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvKSB7XG4gICAgICAgIGlmICh0aGlzLnRvLmNtcCh0aGlzLmZyb20pID09IDApIHtcbiAgICAgICAgICB0byA9IGZyb207XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy50bywgLTEpO1xuICAgICAgICAgIHRvID0gcmVzdWx0LnBvcy5tYXgoZnJvbSk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGVsZXRlZCkgYWxsRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wb3MpIHtcbiAgICAgICAgaWYgKGZyb20gJiYgdGhpcy5wb3MuY21wKHRoaXMuZnJvbSkgPT0gMCkge1xuICAgICAgICAgIHBvcyA9IGZyb207XG4gICAgICAgIH0gZWxzZSBpZiAodG8gJiYgdGhpcy5wb3MuY21wKHRoaXMudG8pID09IDApIHtcbiAgICAgICAgICBwb3MgPSB0bztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVtYXBwaW5nLm1hcCh0aGlzLnBvcywgMSk7XG4gICAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgICAgICBpZiAoIXJlc3VsdC5kZWxldGVkKSBhbGxEZWxldGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhbGxEZWxldGVkID8gbnVsbCA6IG5ldyBTdGVwKHRoaXMudHlwZSwgZnJvbSwgdG8sIHBvcywgdGhpcy5wYXJhbSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIENyZWF0ZSBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHN0ZXAuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHZhciBpbXBsID0gc3RlcHNbdGhpcy50eXBlXTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZnJvbTogdGhpcy5mcm9tLFxuICAgICAgICB0bzogdGhpcy50byxcbiAgICAgICAgcG9zOiB0aGlzLnBvcyxcbiAgICAgICAgcGFyYW06IGltcGwucGFyYW1Ub0pTT04gPyBpbXBsLnBhcmFtVG9KU09OKHRoaXMucGFyYW0pIDogdGhpcy5wYXJhbVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA6OiAoU2NoZW1hLCBPYmplY3QpIOKGkiBTdGVwXG4gICAgLy8gRGVzZXJpYWxpemUgYSBzdGVwIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH1dLCBbe1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgIHZhciBpbXBsID0gc3RlcHNbanNvbi50eXBlXTtcbiAgICAgIHJldHVybiBuZXcgU3RlcChqc29uLnR5cGUsIGpzb24uZnJvbSAmJiBfbW9kZWwuUG9zLmZyb21KU09OKGpzb24uZnJvbSksIGpzb24udG8gJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLnRvKSwganNvbi5wb3MgJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLnBvcyksIGltcGwucGFyYW1Gcm9tSlNPTiA/IGltcGwucGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24ucGFyYW0pIDoganNvbi5wYXJhbSk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgT2JqZWN0KVxuICAgIC8vIERlZmluZSBhIG5ldyB0eXBlIG9mIHN0ZXAuIEltcGxlbWVudGF0aW9uIHNob3VsZCBoYXZlIHRoZVxuICAgIC8vIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgIC8vXG4gICAgLy8gKipgYXBwbHlgKipgKGRvYzogTm9kZSwgc3RlcDogU3RlcCkg4oaSID9TdGVwUmVzdWx0XG4gICAgLy8gICA6IEFwcGxpZXMgdGhlIHN0ZXAgdG8gYSBkb2N1bWVudC5cbiAgICAvLyAqKmBpbnZlcnRgKipgKHN0ZXA6IFN0ZXAsIG9sZERvYzogTm9kZSwgbWFwOiBQb3NNYXApIOKGkiBTdGVwXG4gICAgLy8gICA6IENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoZSBzdGVwLlxuICAgIC8vICoqYHBhcmFtVG9KU09OYCoqYChwYXJhbTogP2FueSkg4oaSID9PYmplY3RcbiAgICAvLyAgIDogU2VyaWFsaXplIHRoaXMgc3RlcCB0eXBlJ3MgcGFyYW1ldGVyIHRvIEpTT04uXG4gICAgLy8gKipgcGFyYW1Gcm9tSlNPTmAqKmAoc2NoZW1hOiBTY2hlbWEsIGpzb246ID9PYmplY3QpIOKGkiA/YW55XG4gICAgLy8gICA6IERlc2VyaWFsaXplIHRoaXMgc3RlcCB0eXBlJ3MgcGFyYW1ldGVyIGZyb20gSlNPTi5cbiAgfSwge1xuICAgIGtleTogXCJkZWZpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVmaW5lKHR5cGUsIGltcGxlbWVudGF0aW9uKSB7XG4gICAgICBzdGVwc1t0eXBlXSA9IGltcGxlbWVudGF0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdGVwO1xufSkoKTtcblxuZXhwb3J0cy5TdGVwID0gU3RlcDtcblxudmFyIFN0ZXBSZXN1bHQgPSBmdW5jdGlvbiBTdGVwUmVzdWx0KGRvYykge1xuICB2YXIgbWFwID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gX21hcC5udWxsTWFwIDogYXJndW1lbnRzWzFdO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdGVwUmVzdWx0KTtcblxuICAvLyA6OiBOb2RlIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudC5cbiAgdGhpcy5kb2MgPSBkb2M7XG4gIC8vIDo6IFBvc01hcFxuICAvLyBUaGUgcG9zaXRpb24gbWFwIHRoYXQgZGVzY3JpYmVzIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZVxuICAvLyBvbGQgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gIHRoaXMubWFwID0gbWFwO1xufTtcblxuZXhwb3J0cy5TdGVwUmVzdWx0ID0gU3RlcFJlc3VsdDtcblxudmFyIHN0ZXBzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3N0ZXAyID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vIDs7IEEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgb2Z0ZW4gY29uc2lzdHMgb2YgYSBzZXJpZXMgb2Zcbi8vIFtzdGVwc10oI1N0ZXApLiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY29udmVuaWVuY2UgYWJzdHJhY3Rpb24gdG9cbi8vIGJ1aWxkIHVwIGFuZCB0cmFjayBzdWNoIGFuIGFycmF5IG9mIHN0ZXBzLiBBIGBUcmFuc2Zvcm1gIG9iamVjdFxuLy8gaW1wbGVtZW50cyBgTWFwcGFibGVgLlxuLy9cbi8vIFRoZSBoaWdoLWxldmVsIHRyYW5zZm9ybWluZyBtZXRob2RzIHJldHVybiB0aGUgYFRyYW5zZm9ybWAgb2JqZWN0XG4vLyBpdHNlbGYsIHNvIHRoYXQgdGhleSBjYW4gYmUgY2hhaW5lZC5cblxudmFyIFRyYW5zZm9ybSA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChOb2RlKVxuICAvLyBDcmVhdGUgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC5cblxuICBmdW5jdGlvbiBUcmFuc2Zvcm0oZG9jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zZm9ybSk7XG5cbiAgICAvLyA6OiBbU3RlcF1cbiAgICAvLyBUaGUgYWNjdW11bGF0ZWQgc3RlcHMuXG4gICAgdGhpcy5zdGVwcyA9IFtdO1xuICAgIC8vIDo6IFtOb2RlXVxuICAgIC8vIFRoZSBpbmRpdmlkdWFsIGRvY3VtZW50IHZlcnNpb25zLiBBbHdheXMgaGFzIGEgbGVuZ3RoIG9uZSBtb3JlXG4gICAgLy8gdGhhbiBgc3RlcHNgLCBzaW5jZSBpdCBhbHNvIGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBzdGFydGluZ1xuICAgIC8vIGRvY3VtZW50LlxuICAgIHRoaXMuZG9jcyA9IFtkb2NdO1xuICAgIC8vIDo6IFtQb3NNYXBdXG4gICAgLy8gVGhlIHBvc2l0aW9uIG1hcHMgcHJvZHVjZWQgYnkgdGhlIHN0ZXBzLiBIYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gICAgLy8gYHN0ZXBzYC5cbiAgICB0aGlzLm1hcHMgPSBbXTtcbiAgfVxuXG4gIC8vIDo6IE5vZGVcbiAgLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQuXG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zZm9ybSwgW3tcbiAgICBrZXk6IFwic3RlcFwiLFxuXG4gICAgLy8gOjogKFN0ZXApIOKGkiA/U3RlcFJlc3VsdFxuICAgIC8vIEFkZCBhIHN0ZXAgdG8gdGhpcyB0cmFuc2Zvcm1hdGlvbi4gSWYgdGhlIHN0ZXAgY2FuIGJlXG4gICAgLy8gW2FwcGxpZWRdKCNTdGVwLmFwcGx5KSB0byB0aGUgY3VycmVudCBkb2N1bWVudCwgdGhlIHJlc3VsdCBvZlxuICAgIC8vIGFwcGx5aW5nIGl0IGlzIHJldHVybmVkLCBhbmQgYW4gZWxlbWVudCBpcyBhZGRlZCB0byB0aGVcbiAgICAvLyBbYHN0ZXBzYF0oI1RyYW5zZm9ybS5zdGVwcyksIFtgZG9jc2BdKCNUcmFuc2Zvcm0uZG9jcyksIGFuZFxuICAgIC8vIFtgbWFwc2BdKCNUcmFuc2Zvcm0ubWFwcykgYXJyYXlzLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGVwKF9zdGVwLCBmcm9tLCB0bywgcG9zLCBwYXJhbSkge1xuICAgICAgaWYgKHR5cGVvZiBfc3RlcCA9PSBcInN0cmluZ1wiKSBfc3RlcCA9IG5ldyBfc3RlcDIuU3RlcChfc3RlcCwgZnJvbSwgdG8sIHBvcywgcGFyYW0pO1xuICAgICAgdmFyIHJlc3VsdCA9IF9zdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKF9zdGVwKTtcbiAgICAgICAgdGhpcy5tYXBzLnB1c2gocmVzdWx0Lm1hcCk7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHJlc3VsdC5kb2MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/bnVtYmVyKSDihpIgTWFwUmVzdWx0XG4gICAgLy8gTWFwIGEgcG9zaXRpb24gdGhyb3VnaCB0aGUgd2hvbGUgdHJhbnNmb3JtYXRpb24gKGFsbCB0aGUgcG9zaXRpb25cbiAgICAvLyBtYXBzIGluIFtgbWFwc2BdKCNUcmFuc2Zvcm0ubWFwcykpLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHZhciBkZWxldGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5tYXBzW2ldLm1hcChwb3MsIGJpYXMpO1xuICAgICAgICBwb3MgPSByZXN1bHQucG9zO1xuICAgICAgICBpZiAocmVzdWx0LmRlbGV0ZWQpIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBfbWFwLk1hcFJlc3VsdChwb3MsIGRlbGV0ZWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb2NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3NbdGhpcy5kb2NzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8vIDo6IE5vZGVcbiAgICAvLyBUaGUgb3JpZ2luYWwgaW5wdXQgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmVmb3JlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2NzWzBdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2Zvcm07XG59KSgpO1xuXG5leHBvcnRzLlRyYW5zZm9ybSA9IFRyYW5zZm9ybTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29weVN0cnVjdHVyZSA9IGNvcHlTdHJ1Y3R1cmU7XG5leHBvcnRzLmNvcHlJbmxpbmUgPSBjb3B5SW5saW5lO1xuZXhwb3J0cy5pc0ZsYXRSYW5nZSA9IGlzRmxhdFJhbmdlO1xuZXhwb3J0cy5yZXBsYWNlSGFzRWZmZWN0ID0gcmVwbGFjZUhhc0VmZmVjdDtcbmV4cG9ydHMuc2FtZVBhdGhEZXB0aCA9IHNhbWVQYXRoRGVwdGg7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbmZ1bmN0aW9uIGNvcHlTdHJ1Y3R1cmUobm9kZSwgZnJvbSwgdG8sIGYpIHtcbiAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1s0XTtcblxuICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgIHJldHVybiBmKG5vZGUsIGZyb20gPyBmcm9tLm9mZnNldCA6IDAsIHRvID8gdG8ub2Zmc2V0IDogbm9kZS5zaXplKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIW5vZGUuc2l6ZSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHN0YXJ0ID0gZnJvbSA/IGZyb20ucGF0aFtkZXB0aF0gOiAwO1xuICAgIHZhciBlbmQgPSB0byA/IHRvLnBhdGhbZGVwdGhdICsgMSA6IG5vZGUuc2l6ZTtcbiAgICB2YXIgY29udGVudCA9IG5vZGUuY29udGVudC50b0FycmF5KDAsIHN0YXJ0KTtcbiAgICBmb3IgKHZhciBpdGVyID0gbm9kZS5pdGVyKHN0YXJ0LCBlbmQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgIHZhciBwYXNzRnJvbSA9IGl0ZXIub2Zmc2V0IC0gY2hpbGQud2lkdGggPT0gc3RhcnQgPyBmcm9tIDogbnVsbDtcbiAgICAgIHZhciBwYXNzVG8gPSBpdGVyLm9mZnNldCA9PSBlbmQgPyB0byA6IG51bGw7XG4gICAgICBjb250ZW50LnB1c2goY29weVN0cnVjdHVyZShjaGlsZCwgcGFzc0Zyb20sIHBhc3NUbywgZiwgZGVwdGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNvcHkoX21vZGVsLkZyYWdtZW50LmZyb21BcnJheShjb250ZW50LmNvbmNhdChub2RlLmNvbnRlbnQudG9BcnJheShlbmQpKSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvcHlJbmxpbmUobm9kZSwgZnJvbSwgdG8sIGYpIHtcbiAgcmV0dXJuIG5vZGUuc3BsaWNlKGZyb20sIHRvLCBub2RlLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pLm1hcChmKSk7XG59XG5cbmZ1bmN0aW9uIGlzRmxhdFJhbmdlKGZyb20sIHRvKSB7XG4gIGlmIChmcm9tLnBhdGgubGVuZ3RoICE9IHRvLnBhdGgubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb20ucGF0aFtpXSAhPSB0by5wYXRoW2ldKSByZXR1cm4gZmFsc2U7XG4gIH1yZXR1cm4gZnJvbS5vZmZzZXQgPD0gdG8ub2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBjYW5CZUpvaW5lZChub2RlLCBvZmZzZXQsIGRlcHRoKSB7XG4gIGlmICghZGVwdGggfHwgb2Zmc2V0ID09IDAgfHwgb2Zmc2V0ID09IG5vZGUuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgbGVmdCA9IG5vZGUuY2hpbGQob2Zmc2V0IC0gMSksXG4gICAgICByaWdodCA9IG5vZGUuY2hpbGQob2Zmc2V0KTtcbiAgcmV0dXJuIGxlZnQuc2FtZU1hcmt1cChyaWdodCk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VIYXNFZmZlY3QoZG9jLCBmcm9tLCB0bykge1xuICBmb3IgKHZhciBkZXB0aCA9IDAsIG5vZGUgPSBkb2M7OyBkZXB0aCsrKSB7XG4gICAgdmFyIGZyb21FbmQgPSBkZXB0aCA9PSBmcm9tLmRlcHRoLFxuICAgICAgICB0b0VuZCA9IGRlcHRoID09IHRvLmRlcHRoO1xuICAgIGlmIChmcm9tRW5kIHx8IHRvRW5kIHx8IGZyb20ucGF0aFtkZXB0aF0gIT0gdG8ucGF0aFtkZXB0aF0pIHtcbiAgICAgIHZhciBnYXBTdGFydCA9IHVuZGVmaW5lZCxcbiAgICAgICAgICBnYXBFbmQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoZnJvbUVuZCkge1xuICAgICAgICBnYXBTdGFydCA9IGZyb20ub2Zmc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2FwU3RhcnQgPSBmcm9tLnBhdGhbZGVwdGhdICsgMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGRlcHRoICsgMSwgbiA9IG5vZGUuY2hpbGQoZ2FwU3RhcnQgLSAxKTsgaSA8PSBmcm9tLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA9PSBmcm9tLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZnJvbS5vZmZzZXQgPCBuLnNpemUpIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZnJvbS5wYXRoW2ldICsgMSA8IG4uc2l6ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBuID0gbi5jaGlsZChmcm9tLnBhdGhbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW5kKSB7XG4gICAgICAgIGdhcEVuZCA9IHRvLm9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdhcEVuZCA9IHRvLnBhdGhbZGVwdGhdO1xuICAgICAgICBmb3IgKHZhciBpID0gZGVwdGggKyAxOyBpIDw9IHRvLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoKGkgPT0gdG8ucGF0aC5sZW5ndGggPyB0by5vZmZzZXQgOiB0by5wYXRoW2ldKSA+IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2FwU3RhcnQgIT0gZ2FwRW5kKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBjYW5CZUpvaW5lZChub2RlLCBnYXBTdGFydCwgTWF0aC5taW4oZnJvbS5kZXB0aCwgdG8uZGVwdGgpIC0gZGVwdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZChmcm9tLnBhdGhbZGVwdGhdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FtZVBhdGhEZXB0aChhLCBiKSB7XG4gIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgaWYgKGkgPT0gYS5wYXRoLmxlbmd0aCB8fCBpID09IGIucGF0aC5sZW5ndGggfHwgYS5wYXRoW2ldICE9IGIucGF0aFtpXSkgcmV0dXJuIGk7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBQcm9zZU1pcnJvckVycm9yID0gKGZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzKFByb3NlTWlycm9yRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gUHJvc2VNaXJyb3JFcnJvcihtZXNzYWdlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3NlTWlycm9yRXJyb3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUHJvc2VNaXJyb3JFcnJvci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgaWYgKHRoaXMubWVzc2FnZSAhPSBtZXNzYWdlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLm5hbWUpO2Vsc2UgdGhpcy5zdGFjayA9IG5ldyBFcnJvcihtZXNzYWdlKS5zdGFjaztcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHJvc2VNaXJyb3JFcnJvciwgW3tcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCBmdW5jdGlvbk5hbWUodGhpcy5jb25zdHJ1Y3RvcikgfHwgXCJQcm9zZU1pcnJvckVycm9yXCI7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmFpc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFpc2UobWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IHRoaXMobWVzc2FnZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFByb3NlTWlycm9yRXJyb3I7XG59KShFcnJvcik7XG5cbmV4cG9ydHMuUHJvc2VNaXJyb3JFcnJvciA9IFByb3NlTWlycm9yRXJyb3I7XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uTmFtZShmKSB7XG4gIHZhciBtYXRjaCA9IC9eZnVuY3Rpb24gKFxcdyspLy5leGVjKGYudG9TdHJpbmcoKSk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn0iLCIvLyA7OyAjcGF0aD1FdmVudE1peGluICNraW5kPWludGVyZmFjZVxuLy8gQSBzZXQgb2YgbWV0aG9kcyBmb3Igb2JqZWN0cyB0aGF0IGVtaXQgZXZlbnRzLiBBZGRlZCBieSBjYWxsaW5nXG4vLyBgZXZlbnRNaXhpbmAgb24gYSBjb25zdHJ1Y3Rvci5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmV2ZW50TWl4aW4gPSBldmVudE1peGluO1xudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBbYW55XSkpICNwYXRoPUV2ZW50TWl4aW4ub25cbiAgLy8gUmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gIG9uOiBmdW5jdGlvbiBvbih0eXBlLCBmKSB7XG4gICAgdmFyIG1hcCA9IHRoaXMuX2hhbmRsZXJzIHx8ICh0aGlzLl9oYW5kbGVycyA9IHt9KTtcbiAgICB2YXIgYXJyID0gbWFwW3R5cGVdIHx8IChtYXBbdHlwZV0gPSBbXSk7XG4gICAgYXJyLnB1c2goZik7XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IFthbnldKSkgI3BhdGg9RXZlbnRNaXhpbi5vZmZcbiAgLy8gVW5yZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgb2ZmOiBmdW5jdGlvbiBvZmYodHlwZSwgZikge1xuICAgIHZhciBhcnIgPSB0aGlzLl9oYW5kbGVycyAmJiB0aGlzLl9oYW5kbGVyc1t0eXBlXTtcbiAgICBpZiAoYXJyKSBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGFycltpXSA9PSBmKSB7XG4gICAgICAgIGFyci5zcGxpY2UoaSwgMSk7YnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIC4uLmFyZ3M6IFthbnldKSAjcGF0aD1FdmVudE1peGluLnNpZ25hbFxuICAvLyBTaWduYWwgYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUsIHBhc3NpbmcgYW55IG51bWJlciBvZlxuICAvLyBhcmd1bWVudHMuIFdpbGwgY2FsbCB0aGUgaGFuZGxlcnMgZm9yIHRoZSBldmVudCwgcGFzc2luZyB0aGVtIHRoZVxuICAvLyBhcmd1bWVudHMuXG4gIHNpZ25hbDogZnVuY3Rpb24gc2lnbmFsKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoYXJyKSBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgYXJyW2ldLmFwcGx5KGFyciwgdmFsdWVzKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZywgLi4uYXJnczogW2FueV0pICNwYXRoPUV2ZW50TWl4aW4uc2lnbmFsSGFuZGxlYWJsZVxuICAvLyBTaWduYWwgYSBoYW5kbGVhYmxlIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlLiBBbGwgaGFuZGxlcnMgZm9yIHRoZVxuICAvLyBldmVudCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMsIHVudGlsIG9uZSBvZiB0aGVtXG4gIC8vIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgbm90IHRoZSB2YWx1ZSBgZmFsc2VgLiBXaGVuIHRoYXRcbiAgLy8gaGFwcGVucywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGF0IGhhbmRsZXIgaXMgcmV0dXJuZWQuIElmIHRoYXRcbiAgLy8gZG9lcyBub3QgaGFwcGVuLCBgZmFsc2VgIGlzIHJldHVybmVkLlxuICBzaWduYWxIYW5kbGVhYmxlOiBmdW5jdGlvbiBzaWduYWxIYW5kbGVhYmxlKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIHZhbHVlc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGFycltpXS5hcHBseShhcnIsIHZhbHVlcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1yZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLy8gOjogKHR5cGU6IHN0cmluZykg4oaSIGJvb2wgI3BhdGg9RXZlbnRNaXhpbi5oYXNIYW5kbGVyXG4gIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlcmUgYXJlIGFueSBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlLlxuICBoYXNIYW5kbGVyOiBmdW5jdGlvbiBoYXNIYW5kbGVyKHR5cGUpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgcmV0dXJuIGFyciAmJiBhcnIubGVuZ3RoID4gMDtcbiAgfVxufTtcblxuLy8gOjogKCgpKVxuLy8gQWRkIHRoZSBtZXRob2RzIGluIHRoZSBgRXZlbnRNaXhpbmAgaW50ZXJmYWNlIHRvIHRoZSBwcm90b3R5cGVcbi8vIG9iamVjdCBvZiB0aGUgZ2l2ZW4gY29uc3RydWN0b3IuXG5cbmZ1bmN0aW9uIGV2ZW50TWl4aW4oY3Rvcikge1xuICB2YXIgcHJvdG8gPSBjdG9yLnByb3RvdHlwZTtcbiAgZm9yICh2YXIgcHJvcCBpbiBtZXRob2RzKSBpZiAobWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgcHJvdG9bcHJvcF0gPSBtZXRob2RzW3Byb3BdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBNYXAgPSB3aW5kb3cuTWFwIHx8IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIF9jbGFzcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgX2NsYXNzKTtcblxuICAgIHRoaXMuY29udGVudCA9IFtdO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKF9jbGFzcywgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICAgIGlmIChmb3VuZCA+IC0xKSB0aGlzLmNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO2Vsc2UgdGhpcy5jb250ZW50LnB1c2goa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChrZXkpID4gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChrZXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5jb250ZW50Lmxlbmd0aCA9IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoIC8gMjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gX2NsYXNzO1xufSkoKTtcbmV4cG9ydHMuTWFwID0gTWFwOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBzb3J0ZWRJbnNlcnQ7XG5cbmZ1bmN0aW9uIHNvcnRlZEluc2VydChhcnJheSwgZWx0LCBjb21wYXJlKSB7XG4gIHZhciBpID0gMDtcbiAgZm9yICg7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgaWYgKGNvbXBhcmUoYXJyYXlbaV0sIGVsdCkgPiAwKSBicmVhaztcbiAgYXJyYXkuc3BsaWNlKGksIDAsIGVsdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07Il19 +},{"../../../../git/prosemirror/dist/dom":1,"../../../../git/prosemirror/dist/menu/menu":19,"../../../../git/prosemirror/dist/model":27}]},{},[52]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy93YXRjaGlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb20vaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2FwdHVyZWtleXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvY2hhci5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jb21tYW5kcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9jc3MuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvZG9tY2hhbmdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L2RyYXcuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvaGlzdG9yeS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9pbnB1dC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9rZXlzLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0L21haW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvb3B0aW9ucy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9yYW5nZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZWRpdC9zZWxlY3Rpb24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L2lucHV0cnVsZXMvYXV0b2lucHV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9pbnB1dHJ1bGVzL2lucHV0cnVsZXMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvaWNvbnMuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvbWVudS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdG9vbHRpcG1lbnUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21lbnUvdXBkYXRlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kZWZhdWx0c2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9kaWZmLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbC9mcmFnbWVudC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL21hcmsuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL25vZGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsL3Bvcy5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWwvc2NoZW1hLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS9kb20uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3BhcnNlL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9wYXJzZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvZG9tLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC9zZXJpYWxpemUvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3NlcmlhbGl6ZS90ZXh0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vYW5jZXN0b3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9pbmRleC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL2pvaW4uanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXAuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3RyYW5zZm9ybS9tYXJrLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vcmVwbGFjZS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3NwbGl0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC90cmFuc2Zvcm0vc3RlcC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyYW5zZm9ybS5qcyIsImM6L1VzZXJzL3Bib3lzZW4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvdHJhbnNmb3JtL3RyZWUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXJyb3IuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvZXZlbnQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL2dpdC9wcm9zZW1pcnJvci9kaXN0L3V0aWwvbWFwLmpzIiwiYzovVXNlcnMvcGJveXNlbi9naXQvcHJvc2VtaXJyb3IvZGlzdC91dGlsL3NvcnRlZGluc2VydC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvbWFpbi5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvdXRpbHMvaW5kZXguanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvYmxvY2ttYXRoLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2NhcnJ5Zm9yd2FyZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2JveC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy9jaGVja2xpc3QuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaWZyYW1lLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2ltYWdlLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2luZGV4LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL2lubGluZW1hdGguanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvaW5wdXQuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvbXVsdGlwbGVjaG9pY2UuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvcmFkaW9idXR0b24uanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2NhbGUuanMiLCJjOi9Vc2Vycy9wYm95c2VuL3Byb3NlbWlycm9yL3Byb3NlbWlycm9yLXdpZGdldHMvc3JjL3dpZGdldHMvc2VsZWN0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3NwcmVhZHNoZWV0LmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRhcmVhLmpzIiwiYzovVXNlcnMvcGJveXNlbi9wcm9zZW1pcnJvci9wcm9zZW1pcnJvci13aWRnZXRzL3NyYy93aWRnZXRzL3RleHRmaWVsZC5qcyIsImM6L1VzZXJzL3Bib3lzZW4vcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3Itd2lkZ2V0cy9zcmMvd2lkZ2V0cy93aWRnZXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzND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RSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBLENBQUUsSUFBSSxDQUFBLEFBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQUUsWUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNO09BQUU7S0FBRSxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQUUsUUFBRSxHQUFHLElBQUksQ0FBQyxBQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7S0FBRSxTQUFTO0FBQUUsVUFBSTtBQUFFLFlBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO09BQUUsU0FBUztBQUFFLFlBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO09BQUU7S0FBRSxBQUFDLE9BQU8sSUFBSSxDQUFDO0dBQUUsQUFBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUFFLFFBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUFFLGFBQU8sR0FBRyxDQUFDO0tBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQUUsTUFBTTtBQUFFLFlBQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUFFO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUUxcEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxZQUFZO0FBQUUsV0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQUUsU0FBSyxJ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QU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDNUcsV0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztHQUNsRTs7QUFFRCxNQUFJLFVBQVUsR0FBRyxJQUFJO01BQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDckIsTUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRSxTQUFPLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbkQsTUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFDbEMsUUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUM3QixjQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUMxQixRQUFJLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztHQUN4RjtBQUNELE1BQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RCxTQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDbEQsTUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFD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RUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSztBQUM1RixJQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsUUFBUTtBQUN4RixJQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUs7QUFDL0QsS0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRO0FBQy9ELEtBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJO0FBQ25HLEtBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRO0FBQzlGLE9BQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVE7Q0FDakYsQ0FBQzs7QUFFRixPQUFPLENBQUMsUUFBUSxHQUFHLFFB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QixRQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7O0FBR2hHLFFBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQSxDQUFFLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7OztBQUd4RSxRQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUEsQ0FBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlFLFFBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7QUFFaEMsUUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7QUFFN0gsUUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUEsQ0FBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRyxLQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFBLENBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxRQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDcEMsUUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O0FBS3BFLFFBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixRQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztBQUN0QixRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLFFBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDOztBQUU1QixRQUFJLENBQUMsR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRCxRQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLFFBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOzs7O0FBSXBDLFFBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xELFFBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFdkMsS0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFDO0dBQ2pDOzs7OztBQUtELGNBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN6QixPQUFHLEVBQUUsV0FBVztBQUNoQixTQUFLLEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNyQyxPQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFBLENBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUM1Qzs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsV0FBVztBQUNoQixTQUFLLEVBQUUsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzlCLGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMzQjs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsa0JBQWtCOzs7Ozs7QUFNdkIsU0FBSyxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM3QyxVQUFJLENBQUMsWUFBWSxDQUFDLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNoRTs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsa0JBQWtCO0FBQ3ZCLFNBQUssRUFBRSxTQUFTLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtBQUNwQyxVQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQixVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsVUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0FBQ3RHLFVBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLFVBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7QUFDckYsVUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0FBQ25DLFVBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQzlFOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLFNBQUssRUFBRSxTQUFTLFlBQVksQ0FBQyxTQUFTLEVBQUU7QUFDdEMsVUFBSSxTQUFTLFlBQVksV0FBVyxDQUFDLGFBQWEsRUFBRTtBQUNsRCxZQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsWUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO09BQzdELE1BQU07QUFDTCxZQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7T0FDcEM7QUFDRCxVQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDcEM7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLG9CQUFvQjtBQUN6QixTQUFLLEVBQUUsU0FBUyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7QUFDNUMsVUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztBQUNuQyxVQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ3JFOzs7Ozs7R0FNRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsU0FBSyxFQUFFLFNBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDeEMsVUFBSSxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUEsQ0FBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RSxVQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3BCOzs7Ozs7R0FNRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsU0FBSyxFQUFFLFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRTtBQUNqQyxhQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFBLENBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQzFFO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxhQUFhO0FBQ2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUU7QUFDL0IsVUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7O0FBRTNHLFVBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2YsVUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUMsVUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDM0M7Ozs7R0FJRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFFBQVE7QUFDYixTQUFLLEVBQUUsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMvQixVQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsb0JBQW9CLENBQUEsQ0FBRSxHQUFHLENBQUMsQ0FBQzs7OztBQUkzRCxVQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdEMsVUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsVUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOzs7O0FBSXhCLFVBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNqQztHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsV0FBVztBQUNoQixTQUFLLEVBQUUsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7QUFDakQsVUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztBQUNuQyxVQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvQixVQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLFVBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Ozs7OztBQU1yRSxVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3ZCOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7QUFlWixTQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsU0FBUyxFQUFFO0FBQy9CLFVBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFL0YsVUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUMsVUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQSxDQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQzs7QUFFbkwsVUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7O0FBSzVELFVBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3QyxVQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ2xELGFBQU8sU0FBUyxDQUFDO0tBQ2xCOzs7Ozs7R0FNRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFVBQVU7QUFDZixTQUFLLEVBQUUsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRTtBQUN2QyxVQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxtQ0FBbUMsQ0FBQyxDQUFDO0tBQ3BIO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxpQkFBaUI7QUFDdEIsU0FBSyxFQUFFLFNBQVMsZUFBZSxHQUFHO0FBQ2hDLGFBQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDaEQ7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGdCQUFnQjtBQUNyQixTQUFLLEVBQUUsU0FBUyxjQUFjLEdBQUc7QUFDL0IsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztBQUVqQixVQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBQ3pCLFVBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsVUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDeEIsU0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFBLENBQUUsWUFBWTtBQUMxQyxlQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUM3QixlQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZixDQUFDLENBQUM7QUFDSCxZQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztPQUM1QjtBQUNELGFBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztLQUN2Qjs7Ozs7Ozs7OztHQVVGLEVBQUU7QUFDRCxPQUFHLEVBQUUsT0FBTztBQUNaLFNBQUssRUFBRSxTQUFTLEtBQUssR0FBRztBQUN0QixVQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPOzs7O0FBSXJFLFVBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDeEIsVUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN4QixVQUFJLENBQUMsRUFBRSxFQUFFLE9BQU87QUFDaEIsVUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdEIsVUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzs7QUFFOUIsVUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtVQUN2RCxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3BCLFVBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLGdCQUFnQixDQUFBLEFBQUMsRUFBRTtBQUNoRSxTQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFBLENBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0QsWUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN4QixlQUFPLEdBQUcsSUFBSSxDQUFDO09BQ2hCOztBQUVELFVBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7O0FBRS9GLFVBQUksRUFBRSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQSxDQUFFLElBQUksRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7OztBQUcxRixVQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7Ozs7O0FBT3BDLFVBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Ozs7O0FBS3JCLFVBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkIsVUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztLQUNoQzs7Ozs7Ozs7R0FRRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFdBQVc7QUFDaEIsU0FBSyxFQUFFLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRTtBQUM3QixVQUFJLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRW5GLE9BQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0YsZUFBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7T0FDeEIsQ0FBQyxDQUFDO0tBQ0o7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLFNBQUssRUFBRSxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUU7QUFDaEMsVUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDOUIsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDcEMsWUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO0FBQ3pELGNBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLGlCQUFPLElBQUksQ0FBQztTQUNiO09BQ0Y7S0FDRjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCaEIsU0FBSyxFQUFFLFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQzNDLFVBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsVUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixVQUFJLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RCxVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixhQUFPLEtBQUssQ0FBQztLQUNkOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxhQUFhO0FBQ2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUU7QUFDakMsVUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEM7Ozs7Ozs7O0dBUUYsRUFBRTtBQUNELE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO0FBQ3ZDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDekIsVUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO0FBQ2IsWUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFlBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFDLFlBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU87QUFDMUUsWUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7OztBQUc3RixZQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7T0FDakMsTUFBTTtBQUNMLFlBQUksRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO09BQ3JNO0tBQ0Y7Ozs7Ozs7R0FPRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGFBQWE7QUFDbEIsU0FBSyxFQUFFLFNBQVMsV0FBVyxHQUFHO0FBQzVCLFVBQUksSUFBSSxDQUFDO0FBQ1QsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQSxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7S0FDL0Y7Ozs7R0FJRixFQUFFO0FBQ0QsT0FBRyxFQUFFLE9BQU87QUFDWixTQUFLLEVBQUUsU0FBUyxLQUFLLEdBQUc7QUFDdEIsVUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNFOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxVQUFVO0FBQ2YsU0FBSyxFQUFFLFNBQVMsUUFBUSxHQUFHO0FBQ3pCLFVBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFlBQVksV0FBVyxDQUFDLGFBQWEsRUFBRSxPQUFPLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3BKOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxhQUFhOzs7Ozs7O0FBT2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7QUFDbEMsYUFBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFBLENBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ25EOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsYUFBYTtBQUNsQixTQUFLLEVBQUUsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFO0FBQy9CLFVBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsYUFBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFBLENBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2hEOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsZ0JBQWdCO0FBQ3JCLFNBQUssRUFBRSxTQUFTLGNBQWMsR0FBRztBQUMvQixVQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXBGLFVBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsVUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztLQUNyQzs7Ozs7O0dBTUYsRUFBRTtBQUNELE9BQUcsRUFBRSxhQUFhO0FBQ2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ3hDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUIsYUFBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQSxBQUFDLENBQUM7S0FDcEQ7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxlQUFlO0FBQ3BCLFNBQUssRUFBRSxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUU7QUFDbEMsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxVQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsT0FBTyxNQUFNLENBQUM7O0FBRXhDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1VBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzdCLFVBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMvQyxVQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQSxBQUFDLENBQUM7QUFDaEYsVUFBSSxHQUFHLEVBQUU7QUFDUCxXQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFBLENBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDckUsWUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxZQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7T0FDMUc7QUFDRCxXQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDaEMsWUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQyxZQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7T0FDM0c7QUFDRCxhQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RDO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxVQUFVO0FBQ2YsU0FBSyxFQUFFLFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDaEMsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOztBQUVsQixVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsVUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFO0FBQzdDLFlBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsWUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztPQUN2RSxDQUFDLENBQUM7S0FDSjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsZ0JBQWdCO0FBQ3JCLFNBQUssRUFBRSxTQUFTLGNBQWMsQ0FBQyxLQUFLLEVBQUU7QUFDcEMsVUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDNUIsVUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7VUFDakIsRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDbEIsV0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLEVBQUU7QUFDN0MsWUFBSSxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQzdCLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztBQUM5QixZQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM1RCxjQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6QyxjQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RCxjQUFJLEdBQUcsS0FBSyxDQUFDO1NBQ2QsTUFBTTtBQUNMLGNBQUksSUFBSSxHQUFHLENBQUMsWUFBWTtBQUN0QixnQkFBSSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxnQkFBSSxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakQsZ0JBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNwQixrQkFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQzFDLG9CQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztlQUNsRSxDQUFDLENBQUM7YUFDSixNQUFNO0FBQ0wsbUJBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRztBQUM5RSxxQkFBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7ZUFDaEM7YUFDRjtBQUNELG1CQUFPLE9BQU8sQ0FBQztXQUNoQixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxjQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsTUFBTTtTQUM3QjtPQUNGO0tBQ0Y7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFdBQVc7QUFDaEIsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFVBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3BELGFBQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7S0FDdkI7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLElBQUk7QUFDVCxPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQztHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQSxDQUFFLElBQUksQ0FBQyxDQUFBLEFBQUMsQ0FBQztLQUMvRztHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsYUFBYTtBQUNsQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsVUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN6QixhQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hEOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUEsQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDckQ7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFdBQVcsQ0FBQztDQUNwQixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUNsQyxJQUFJLFlBQVksR0FBRyxDQUFDO0lBQ2hCLFlBQVksR0FBRyxDQUFDLENBQUM7O0FBRXJCLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQzs7QUFFckIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQSxDQUFFLFdBQVcsQ0FBQyxDQUFDOztBQUV4QyxJQUFJLFNBQVMsR0FBRyxTQUFTLFNBQVMsQ0FBQyxFQUFFLEVBQUU7QUFDckMsaUJBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7O0FBRWpDLE1BQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztBQUNsQixNQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ3hCLE1BQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQzVCLE1BQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLE1BQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7Q0FDOUM7Ozs7Q0FJQTs7QUFFRCxJQUFJLGVBQWUsR0FBRyxDQUFDLFVBQVUsVUFBVSxFQUFFO0FBQzNDLFdBQVMsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7O0FBRXZDLFdBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRTtBQUMzQixtQkFBZSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQzs7QUFFdkMsUUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRixRQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztHQUNkOzs7Ozs7QUFNRCxjQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDN0IsT0FBRyxFQUFFLE9BQU87QUFDWixTQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQzdCLGFBQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3JDOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsa0JBQWtCOzs7Ozs7QUFNdkIsU0FBSyxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtBQUNuRCxVQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2hDLFVBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDN0IsVUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztBQUMzQixVQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ3JELFVBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtBQUNuRCxZQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZFLFlBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7T0FDdkQ7O0FBRUQsVUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTs7QUFFM0QsWUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsVUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUM5QyxNQUFNLElBQUksT0FBTyxFQUFFOztBQUVsQixlQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxBQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMs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LE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO09BQ3RIO0tBQ0Y7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFlBQVksQ0FBQztDQUNyQixDQUFBLEVBQUcsQ0FBQzs7O0FDeE1MLFlBQVksQ0FBQzs7QUFFYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFBRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxTQUFTLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBRSxRQUFJLE1BQU0sR0FBRyxFQUFFO1FBQUUsUUFBUSxHQUFHLEdBQUc7UUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsVUFBRSxHQUFHLE1BQU0sQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQUU7R0FBRTtDQUFFLENBQUM7O0FBRWxwQixJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxBQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFD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RyxDQUFDLENBQUM7QUFDZixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsUUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUztBQUMvQyxRQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDN0UsUUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVM7QUFDeEIsUUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQ2IsVUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0tBQ3RCO0FBQ0QsUUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzdFLFFBQUksRUFBRSxHQUFHLElBQUksRUFBRTtBQUNiLFVBQUksR0FBRyxFQUFFLENBQUM7QUFDVixZQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBLEdBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0dBQ0Y7QUFDRCxNQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUMxQyxTQUFPLE1BQU0sQ0FBQztDQUNmOztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDOUMsTUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDaEMsTUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ25DLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLE9BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUIsU0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFNBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFNBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztHQUMzQztBQUNELFNBQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FDN0M7O0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUN4QyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZixPQUFLLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFO0FBQ3JFLFFBQUksS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDbEc7QUFDRCxTQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDckM7O0FBRUQsU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUNyRCxNQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLE1BQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzs7QUFFN0UsT0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQUFBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFO0FBQ3BGLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsUUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pKLFFBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixRQUFJLE1BQU0sR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3RSxRQUFJLE1BQU0sRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUMxQixRQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7R0FDWjtDQUNGOzs7O0FBSUQsU0FBUyxpQkFB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QUFJLE1BQU0sR0FBRyxFQUFFO1FBQUUsUUFBUSxHQUFHLEdBQUc7UUFBRSxRQUFRLEdBQUcsR0FBRyxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsVUFBRSxHQUFHLE1BQU0sQ0FBQyxBQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQUU7R0FBRTtDQUFFLENBQUM7O0FBRWxwQixTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFO0FBQUUsTUFBSSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUEsQUFBQyxFQUFFO0FBQUUsVUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0dBQUU7Q0FBRTs7QUFF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M0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7QUFBRSxNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxTQUFTLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBRSxRQUFJLE1BQU0sR0FBRyxJQUFJO1FBQUUsUUFBUSxHQUFHLElBQUk7UUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxBQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQUFBQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFBRSxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxNQUFNO0FBQUUsWUFBSSxHQUFHLE1BQU0sQ0FBQyxBQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQUFBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEFBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDLEFBQUMsU0FBUyxTQUFTLENBQUM7T0FBRTtLQUFFLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQUUsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQUUsTUFBTTtBQUFFLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFBRSxlQUFPLFNBQVMsQ0FBQztPQUFFLEFBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFD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QUNELE9BQUcsRUFBRSxhQUFhO0FBQ2xCLFNBQUssRUFBRSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtBQUN0RCxVQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1VBQzlCLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUMsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7VUFDM0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDN0IsVUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxVQUFJLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNqUyxhQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FD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Q2xDLE9BQU8sS0FBSyxDQUFDO0tBQ2Y7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxJQUFJO0FBQ1QsU0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRTtBQUN4QixVQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDL0IsVUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDMUMsV0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzNCLFlBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO09BQ3pELE9BQU8sSUFBSSxDQUFDO0tBQ2Q7Ozs7R0FJRixDQUFDLEVBQUUsQ0FBQztBQUNILE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUIsVUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFVBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3ZDLFdBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pDLFlBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO09BQ2xDLE9BQU8sSUFBSSxDQUFDO0tBQ2Q7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUM3QixVQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFN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LEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBLENBQUUsSUFBSSxDQUFBLEFBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQUUsWUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNO09BQUU7S0FBRSxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQUUsUUFBRSxHQUFHLElBQUksQ0FBQyxBQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7S0FBRSxTQUFTO0FBQUUsVUFBSTtBQUFFLFlBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO09BQUUsU0FBUztBQUFFLFlBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO09BQUU7S0FBRSxBQUFDLE9BQU8sSUFBSSxDQUFDO0dBQUUsQUFBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUFFLFFBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUFFLGFBQU8sR0FBRyxDQUFDO0tBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQUUsYUFBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQUUsTUFBTTtBQUFFLFlBQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUFFO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUUxcEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxZQUFZO0FBQUUsV0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQUUsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFBRSxVQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFBQyxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLEFBQUMsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQUFBQyxJQUFJLE9BQU8sSUFBSSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQUFBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQUU7R0FBRSxBQUFDLE9BQU8sVUFBVSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRTtBQUFFLFFBQUksVUFBVSxFQUFFLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQUFBQyxJQUFJLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQUFBQyxPQUFPLFdBQVcsQ0FBQztHQUFFLENBQUM7Q0FBRSxDQUFBLEVBQUcsQ0FBQzs7QUFFdGpCLElBQUksSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQUUsTUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEFBQUMsU0FBUyxFQUFFLE9BQU8sTUFBTSxFQUFFO0FBQUUsUUFBSSxNQUFNLEdBQUcsR0FBRztRQUFFLFFBQVEsR0FBRyxHQUFHO1FBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxBQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQUFBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQUFBQyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEFBQUMsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQUUsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxBQUFDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUFFLGVBQU8sU0FBUyxDQUFDO09BQUUsTUFBTTtBQUFFLFdBQUcsR0FBRyxNQUFNLENBQUMsQUFBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEFBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxBQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQUFBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQyxBQUFDLFNBQVMsU0FBUyxDQUFDO09BQUU7S0FBRSxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUFFLGFBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztLQUFFLE1BQU07QUFBRSxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEFBQUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO0FBQUUsZUFBTyxTQUFTLENBQUM7T0FBRSxBQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUFFO0dBQUU7Q0FBRSxDQUFDOztBQUVycEIsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtBQUFFLE1BQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFBLEFBQUMsRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQztHQUFFO0NBQUU7O0FBRXpKLFNBQVMsU0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFBRSxNQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO0FBQUUsVUFBTSxJQUFJLFNBQVMsQ0FBQywwREFBMEQsR0FBRyxPQUFPLFVBQVUsQ0FBQyxDQUFDO0dBQUUsQUFBQyxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEFBQUMsSUFBSSxVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztDQUFFOztBQUU5ZSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlCLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7QUFFdEMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUU5QixJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7Ozs7O0FBSzFDLElBQUksV0FBVyxHQUFHLENBQUMsVUFBVSxpQkFBaUIsRUFBRTtBQUM5QyxXQUFTLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7O0FBRTFDLFdBQVMsV0FBVyxHQUFHO0FBQ3JCLG1CQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDOztBQUVuQyxRQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDaEc7O0FBRUQsU0FBTyxXQUFXLENBQUM7Q0FDcEIsQ0FBQSxDQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztBQUVoQyxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQzs7QUFFbEMsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQy9DLFdBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDckIsUUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtBQUN2QixVQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLE9BQU87QUFDckMsaUJBQVcsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN6RztBQUNELFFBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdHLFVBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0dBQ3pCOztBQUVELE9BQUssSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3RELFFBQUksT0FBTyxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztBQUNwRSxRQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7QUFDbkIsVUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs7QUFFM0MsVUFBSSxRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFFMUMsVUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFVBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixVQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXRCLFVBQUksSUFBSSxFQUFFO0FBQ1IsV0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQixZQUFJLEdBQUcsSUFBSSxDQUFDO09BQ2I7QUFDRCxVQUFJLEdBQUcsRUFBRTtBQUNQLFdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEIsZUFBTztPQUNSO0tBQ0Y7R0FDRjtDQUNGOzs7Ozs7Ozs7QUFTRCxJQUFJLFFBQVEsR0FBRyxDQUFDLFlBQVk7QUFDMUIsV0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9DLG1CQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDOzs7O0FBSWhDLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOzs7O0FBSWpCLFFBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOzs7QUFHekIsUUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7OztBQUduQixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixRQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUM1Qzs7Ozs7Ozs7OztBQVVELGNBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN0QixPQUFHLEVBQUUsb0JBQW9COzs7OztBQUt6QixTQUFLLEVBQUUsU0FBUyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUU7QUFDM0MsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztBQUVqQixVQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDZCxjQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQzVCLFlBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUM7T0FDdEMsQ0FBQyxDQUFDO0FBQ0gsYUFBTyxFQUFFLENBQUM7S0FDWDs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFVBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNsRCxXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsWUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO09BQ3ZELE9BQU8sSUFBSSxDQUFDO0tBQ2Q7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxnQkFBZ0I7QUFDckIsU0FBSyxFQUFFLFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRTtBQUNuQyxVQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0FBQ2xDLFVBQUksUUFBUSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztBQUNuQyxVQUFJLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxZQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO09BQzNDLE9BQU8sS0FBSyxDQUFDO0tBQ2Y7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxnQkFBZ0I7QUFDckIsU0FBSyxFQUFFLFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRTtBQUNuQyxhQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3REOzs7Ozs7R0FNRixFQUFFO0FBQ0QsT0FBRyxFQUFFLG1CQUFtQjtBQUN4QixTQUFLLEVBQUUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7QUFDdEMsYUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMxRDs7Ozs7O0dBTUYsRUFBRTtBQUNELE9BQUcsRUFBRSxnQkFBZ0I7QUFDckIsU0FBSyxFQUFFLFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRTs7QUFFcEMsVUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDOztBQUUxQyxVQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLFVBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUNwQixZQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDN0IsYUFBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUNuQyxjQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxjQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQSxBQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdEYsZ0JBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLGdCQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDM0Msa0JBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLGdCQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztXQUM1QjtTQUNGO09BQ0Y7S0FDRjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUN6QyxVQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3JIOzs7Ozs7Ozs7R0FTRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFFBQVE7QUFDYixTQUFLLEVBQUUsU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7QUFDNUMsYUFBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDM0g7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGdCQUFnQjtBQUNyQixTQUFLLEVBQUUsU0FBUyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7QUFDcEQsVUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFBLElBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDM0YsYUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDM0M7Ozs7R0FJRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFNBQVM7QUFDZCxPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxLQUFLLENBQUM7S0FDZDs7Ozs7R0FLRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGFBQWE7QUFDbEIsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sS0FBSyxDQUFDO0tBQ2Q7Ozs7R0FJRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFVBQVU7QUFDZixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxLQUFLLENBQUM7S0FDZDs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLEtBQUssQ0FBQztLQUNkOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLENBQUM7S0FDYjs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLEtBQUssQ0FBQztLQUNkOzs7Ozs7Ozs7R0FTRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sSUFBSSxDQUFDO0tBQ2I7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGVBQWU7Ozs7OztBQU1wQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxLQUFLLENBQUM7S0FDZDtHQUNGLENBQUMsRUFBRSxDQUFDO0FBQ0gsT0FBRyxFQUFFLFNBQVM7QUFDZCxTQUFLLEVBQUUsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUNyQyxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFdBQUssSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ3hCLFlBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixZQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDN0UsaUJBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsWUFBSSxRQUFRLEdBQUcsVUFBVSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDbEUsWUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUM1QixZQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDbkIsZUFBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixlQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUU7QUFDRCxjQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7T0FDNUQ7QUFDRCxXQUFLLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtBQUN6QixZQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFlBQUksUUFBUSxJQUFJLEVBQUUsUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUEsQUFBQyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLE1BQU0sR0FBRyw2Q0FBNkMsR0FBRyxRQUFRLENBQUMsQ0FBQztPQUNsSjtBQUNELFVBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUN0RSxVQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7O0FBRXhFLGFBQU8sTUFBTSxDQUFDO0tBQ2Y7Ozs7Ozs7R0FPRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFVBQVU7QUFDZixTQUFLLEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNwQyxVQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUEsQ0FBQyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMxTDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsTUFBTTtBQUNYLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLEdBQUcsQ0FBQztLQUNaO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxRQUFRLENBQUM7Q0FDakIsQ0FBQSxFQUFHLENBQUM7O0FBRUwsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDNUIsUUFBUSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Ozs7QUFJekIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxVQUFVLFNBQVMsRUFBRTtBQUNoQyxXQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDOztBQUU1QixXQUFTLEtBQUssR0FBRztBQUNmLG1CQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDOztBQUU3QixRQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUY7Ozs7QUFJRCxjQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbkIsT0FBRyxFQUFFLGdCQUFnQjtBQUNyQixTQUFLLEVBQUUsU0FBUyxjQUFjLEdBQUc7QUFDL0IsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3hELFVBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDLFVBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUUsV0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLGFBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztPQUNyQyxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hDO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxTQUFTO0FBQ2QsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sSUFBSSxDQUFDO0tBQ2I7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFlBQVk7QUFDakIsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7S0FDOUI7R0FDRixDQUFDLEVBQUUsQ0FBQztBQUNILE9BQUcsRUFBRSxVQUFVO0FBQ2YsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sT0FBTyxDQUFDO0tBQ2hCO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxNQUFNO0FBQ1gsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sUUFBUSxDQUFDO0tBQ2pCO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxLQUFLLENBQUM7Q0FDZCxDQUFBLENBQUUsUUFBUSxDQUFDLENBQUM7O0FBRWIsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O0FBRXRCLElBQUksU0FBUyxHQUFHLENBQUMsVUFBVSxNQUFNLEVBQUU7QUFDakMsV0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzs7QUFFN0IsV0FBUyxTQUFTLEdBQUc7QUFDbkIsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7O0FBRWpDLFFBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztHQUM5Rjs7OztBQUlELGNBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2QixPQUFHLEVBQUUsZUFBZTtBQUNwQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLENBQUM7S0FDYjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsYUFBYTtBQUNsQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLENBQUM7S0FDYjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxJQUFJLENBQUM7S0FDYjtHQUNGLENBQUMsRUFBRSxDQUFDO0FBQ0gsT0FBRyxFQUFFLFVBQVU7QUFDZixPQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsYUFBTyxRQUFRLENBQUM7S0FDakI7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFNBQVMsQ0FBQztDQUNsQixDQUFBLENBQUUsS0FBSyxDQUFDLENBQUM7O0FBRVYsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7O0FBRTlCLElBQUksTUFBTSxHQUFHLENBQUMsVUFBVSxVQUFVLEVBQUU7QUFDbEMsV0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQzs7QUFFOUIsV0FBUyxNQUFNLEdBQUc7QUFDaEIsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBRTlCLFFBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztHQUMzRjs7OztBQUlELGNBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNwQixPQUFHLEVBQUUsVUFBVTtBQUNmLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLElBQUksQ0FBQztLQUNiO0dBQ0YsQ0FBQyxFQUFFLENBQUM7QUFDSCxPQUFHLEVBQUUsVUFBVTtBQUNmLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLElBQUksQ0FBQztLQUNiO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxNQUFNO0FBQ1gsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxNQUFNLENBQUM7Q0FDZixDQUFBLENBQUUsUUFBUSxDQUFDLENBQUM7O0FBRWIsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0FBRXhCLElBQUksSUFBSSxHQUFHLENBQUMsVUFBVSxPQUFPLEVBQUU7QUFDN0IsV0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFekIsV0FBUyxJQUFJLEdBQUc7QUFDZCxtQkFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7QUFFNUIsUUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0dBQ3pGOzs7Ozs7OztBQVFELGNBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQixPQUFHLEVBQUUsUUFBUTtBQUNiLFNBQUssRUFBRSxTQUFTLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtBQUM1QyxhQUFPLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2xGO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxZQUFZO0FBQ2pCLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLEtBQUssQ0FBQztLQUNkO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxRQUFRO0FBQ2IsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sSUFBSSxDQUFDO0tBQ2I7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLElBQUksQ0FBQztDQUNiLENBQUEsQ0FBRSxNQUFNLENBQUMsQ0FBQzs7QUFFWCxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7QUFFcEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQjNCLFdBQVMsU0FBUyxHQUFHO0FBQ25CLFFBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEYsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7O0FBRWpDLFFBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckMsUUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQy9CLFFBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNyQzs7Ozs7Ozs7Ozs7O0FBWUQsY0FBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3ZCLE9BQUcsRUFBRSxVQUFVO0FBQ2YsU0FBSyxFQUFFLFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUEsQ0FBQyxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNsRTtHQUNGLENBQUMsQ0FBQyxDQUFDOztBQUVKLFNBQU8sU0FBUyxDQUFDO0NBQ2xCLENBQUEsRUFBRyxDQUFDOztBQUVMLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztBQUU5QixJQUFJLFFBQVEsR0FBRyxDQUFDLFlBQVk7QUFDMUIsV0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQzNDLG1CQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDOzs7O0FBSWhDLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOzs7QUFHakIsUUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsUUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7OztBQUdqQixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixRQUFJLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNDLFFBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7R0FDNUQ7Ozs7Ozs7Ozs7OztBQVlELGNBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN0QixPQUFHLEVBQUUsUUFBUTs7Ozs7O0FBTWIsU0FBSyxFQUFFLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUM1QixVQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ2xELGFBQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNuRTtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsZUFBZTs7Ozs7QUFLcEIsU0FBSyxFQUFFLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRTtBQUNqQyxXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUcsYUFBTyxHQUFHLENBQUM7S0FDWjs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsU0FBUztBQUNkLFNBQUssRUFBRSxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDM0IsV0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsWUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztPQUN4QztLQUNGO0dBQ0YsQ0FBQyxFQUFFLENBQUM7QUFDSCxPQUFHLEVBQUUsVUFBVTtBQUNmLFNBQUssRUFBRSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFDOUIsVUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLFdBQUssSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ3hCLGNBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7T0FDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDM0IsZUFBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7T0FDeEIsQ0FBQyxDQUFDO0FBQ0gsVUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxhQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUMzQixPQUFPLEtBQUssQ0FBQztLQUNmO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxTQUFTO0FBQ2QsU0FBSyxFQUFFLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDckMsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqQyxVQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFdBQUssSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ3hCLFlBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixZQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQ3BELGNBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7T0FDdEU7QUFDRCxhQUFPLE1BQU0sQ0FBQztLQUNmO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxNQUFNO0FBQ1gsT0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLGFBQU8sRUFBRSxDQUFDO0tBQ1g7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFFBQVEsQ0FBQztDQUNqQixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM1QixRQUFRLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzs7Ozs7QUFLekIsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDOzs7OztBQUt0QyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZCLE1BQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsT0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUU7QUFDcEIsVUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQzdDLE9BQU8sTUFBTSxDQUFDO0NBQ2hCOztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRTtBQUMxQixTQUFPLEdBQUcsWUFBWSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ3REOztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDaEMsTUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLE9BQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO0FBQzFCLFFBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFDaEIsYUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDckIsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDcEIsVUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztLQUNyQixNQUFNO0FBQ0wsVUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNwRCxXQUFLLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUNyQixnQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUM3QjtLQUNGO0dBQ0Y7QUFDRCxTQUFPLElBQUksQ0FBQztDQUNiOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRCxJQUFJLFVBQVUsR0FBRyxDQUFDLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQjVCLFdBQVMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDaEMsbUJBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7O0FBRWxDLFFBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RSxRQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCRCxjQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEIsT0FBRyxFQUFFLFFBQVE7QUFDYixTQUFLLEVBQUUsU0FBUyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUNuQyxhQUFPLElBQUksVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0g7Ozs7Ozs7Ozs7O0dBV0YsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLFNBQUssRUFBRSxTQUFTLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtBQUNuRCxVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLFdBQUssSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3ZCLFlBQUksT0FBTyxNQUFNLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSSxNQUFNLEdBQUcsT0FBTyxNQUFNLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFO0FBQ3RKLGNBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQy9IO09BQ0Y7QUFDRCxhQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDekM7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLFVBQVUsQ0FBQztDQUNuQixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUNoQyxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUU7QUFDOUIsTUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxPQUFLLElBQUksUUFBUSxJQUFJLEtBQUssRUFBRTtBQUMxQixRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0IsUUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3pDLFlBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7R0FDdEM7QUFDRCxTQUFPLFFBQVEsQ0FBQztDQUNqQjs7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDaEQsTUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxPQUFLLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRTtBQUMzQixRQUFJLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25DLFFBQUksS0FBSyxJQUFJLElBQUksRUFBRTtBQUNqQixVQUFJLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUIsVUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxNQUFNLENBQUMsQ0FBQztLQUNsTDtBQUNELFNBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7R0FDdkI7QUFDRCxTQUFPLEtBQUssQ0FBQztDQUNkOzs7Ozs7QUFNRCxJQUFJLE1BQU0sR0FBRyxDQUFDLFlBQVk7Ozs7QUFJeEIsV0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFO0FBQ3BCLG1CQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7O0FBSTlCLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O0FBR2pDLFFBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDOzs7QUFHaEQsUUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Ozs7O0FBS2hELFFBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFbEMsUUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQyxRQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFFBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsUUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNsRDs7Ozs7Ozs7Ozs7Ozs7O0FBZUQsY0FBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLE9BQUcsRUFBRSxNQUFNO0FBQ1gsU0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtBQUNoRCxVQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxJQUFJLFlBQVksUUFBUSxDQUFBLEFBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7O0FBRTFQLGFBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzNDOzs7O0dBSUYsRUFBRTtBQUNELE9BQUcsRUFBRSxNQUFNO0FBQ1gsU0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDakMsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ3ZFOzs7Ozs7R0FNRixFQUFFO0FBQ0QsT0FBRyxFQUFFLHNCQUFzQjtBQUMzQixTQUFLLEVBQUUsU0FBUyxvQkFBb0IsR0FBRztBQUNyQyxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO0FBQzlDLFVBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUN4QyxXQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDN0IsWUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO09BQ3ZHO0FBQ0QsYUFBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztLQUNoRDs7OztHQUlGLEVBQUU7QUFDRCxPQUFHLEVBQUUsTUFBTTtBQUNYLFNBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ2hDLFVBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxRSxhQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDM0I7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLFNBQUssRUFBRSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDakMsYUFBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDeEM7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxjQUFjO0FBQ25CLFNBQUssRUFBRSxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFDakMsVUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELGFBQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2hDOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsVUFBVTtBQUNmLFNBQUssRUFBRSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDN0IsYUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDNUU7Ozs7R0FJRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFNBQVM7QUFDZCxTQUFLLEVBQUUsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNoQyxlQUFTO0FBQ1AsWUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQzVCLFdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLFlBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUM7T0FDeEI7S0FDRjs7Ozs7OztHQU9GLEVBQUU7QUFDRCxPQUFHLEVBQUUsVUFBVTtBQUNmLFNBQUssRUFBRSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLFVBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNuQixXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFCLFlBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDdEMsYUFBSyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUU7QUFDckIsY0FBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RCLGNBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ3pELGdCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLGdCQUFJLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxlQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pCO1dBQ0Y7QUFDRCxlQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDNUIsZ0JBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN4QixHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixnQkFBSSxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUN4Qyx1QkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixtQkFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkMsaUJBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7ZUFDakI7YUFDRjtXQUNGO1NBQ0Y7T0FDRjtLQUNGO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxNQUFNLENBQUM7Q0FDZixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7O0FDaDhCeEIsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFlBQVksR0FBRyxDQUFDLFlBQVk7QUFBRSxXQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFBRSxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUFFLFVBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQUFBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxBQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxBQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FBRTtHQUFFLEFBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFO0FBQUUsUUFBSSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxBQUFDLElBQUksV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxBQUFDLE9BQU8sV0FBVyxDQUFDO0dBQUUsQ0FBQztDQUFFLENBQUEsRUFBRyxDQUFDOztBQUV0akIsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDMUIsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0FBRTVCLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7QUFBRSxNQUFJLEVBQUUsUUFBUSxZQUFZLFdBQVcsQ0FBQSxBQUFDLEVBQUU7QUFBRSxVQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7R0FBRTtDQUFFOztBQUV6SixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRWpDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7Ozs7QUFRaEMsU0FBUyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDckMsTUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQUksT0FBTyxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsTUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3pFLE1BQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNuRSxTQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakMsTUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDO0FBQ3BCLFNBQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNuRCxTQUFPLEdBQUcsQ0FBQztDQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNDRCxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFBLENBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7OztBQUt6QyxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN2QyxNQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUEsQ0FBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakYsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDdEIsU0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztDQUN2Qzs7QUFFRCxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFBLENBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDOztBQUUzQyxJQUFJLGFBQWEsR0FBRztBQUNsQixTQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJO0FBQ3pFLElBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtBQUM3RSxRQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSTtBQUMxRSxJQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSTtBQUNsRixRQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSTtDQUNwRixDQUFDOztBQUVGLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQzs7Ozs7QUFLakIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxZQUFZO0FBQy9CLFdBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQy9DLG1CQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDOzs7QUFHckMsUUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDOztBQUU3QixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQixRQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNoQixRQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNyQixRQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNyQixRQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLFFBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0dBQ2xDOztBQUVELGNBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUMzQixPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDM0MsV0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzNCLFlBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsWUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQSxBQUFDLEVBQUU7QUFDbkYsY0FBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsY0FBSSxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ2pCLGdCQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDdkIsaUJBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7V0FDckI7U0FDRjtPQUNGO0FBQ0QsYUFBTyxLQUFLLENBQUM7S0FDZDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsUUFBUTtBQUNiLFNBQUssRUFBRSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFDMUIsVUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTs7QUFFckIsWUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztBQUMxQixZQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRztZQUNmLElBQUksR0FBRyxTQUFTLENBQUM7QUFDckIsWUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzdDLGVBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuQyxjQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUEsQUFBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySixjQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUM3RDtPQUNGLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFOztPQUU5RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2pDLGNBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsQyxjQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ3ZDLGNBQUksYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDckg7S0FDSjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtBQUN2QyxVQUFJLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwRCxZQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsWUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUM7T0FDdEU7S0FDRjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsZUFBZTtBQUNwQixTQUFLLEVBQUUsU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFO0FBQ2pDLGFBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2pIO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxRQUFRO0FBQ2IsU0FBSyxFQUFFLFNBQVMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQ3JDLFVBQUksS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZDLFdBQUssSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDckQsWUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixZQUFJLElBQUksSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQ3hGO0tBQ0Y7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFNBQVM7QUFDZCxTQUFLLEVBQUUsU0FBUyxPQUFPLEdBQUc7QUFDeEIsVUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE9BQU87QUFDbkQsVUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hCLFVBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEMsVUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDdEI7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFFBQVE7QUFDYixTQUFLLEVBQUUsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFO0FBQzNCLFVBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2xDLFlBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztPQUNoQixNQUFNO0FBQ0wsYUFBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMvQyxjQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELGNBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUztBQUNyQixjQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDOUIsZ0JBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztXQUNoQixNQUFNO0FBQ0wsbUJBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7V0FDaEQ7QUFDRCxlQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxnQkFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztXQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQzdDLGdCQUFNO1NBQ1A7T0FDRjtBQUNELFVBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixhQUFPLElBQUksQ0FBQztLQUNiOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ3BELGFBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDakc7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLE9BQU87QUFDWixTQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNqQyxVQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBQzVDLFVBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzVEO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxXQUFXO0FBQ2hCLFNBQUssRUFBRSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUMxQyxVQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNyRDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsT0FBTztBQUNaLFNBQUssRUFBRSxTQUFTLEtBQUssR0FBRztBQUN0QixVQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzNCLFVBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNELFVBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxhQUFPLElBQUksQ0FBQztLQUNiO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxNQUFNO0FBQ1gsU0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUMxQixhQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RELGVBQVM7QUFDUCxZQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3pCLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNuQixHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFlBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU07QUFDL0UsWUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO09BQ2Q7QUFDRCxhQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdkMsWUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkMsWUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztPQUNqQztBQUNELFVBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDNUMsVUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7S0FDdEI7Ozs7O0dBS0YsRUFBRTtBQUNELE9BQUcsRUFBRSxRQUFRO0FBQ2IsU0FBSyxFQUFFLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3ZDLFVBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNqQyxVQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hDLFVBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUNkOzs7OztHQUtGLEVBQUU7QUFDRCxPQUFHLEVBQUUsVUFBVTtBQUNmLFNBQUssRUFBRSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQ2xDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDckIsVUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFBLENBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELFVBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsQyxVQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztLQUNsQjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsS0FBSztBQUNWLE9BQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixhQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDMUM7R0FDRixDQUFDLENBQUMsQ0FBQzs7QUFFSixTQUFPLGFBQWEsQ0FBQztDQUN0QixDQUFBLEVBQUcsQ0FBQzs7QUFFTCxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDeEIsU0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQSxBQUFDLENBQUM7Q0FDakc7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7QUFDakMsTUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixNQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNaLFFBQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUNoRCxRQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUMxQixRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLFFBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxLQUFLLEdBQUcsVUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ2xELFdBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3pCLENBQUMsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsS0FBSyxHQUFHLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUN4RCxXQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUEsQ0FBQyxDQUFFLElBQUksQ0FBQztBQUNyQyxVQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLO0FBQ3hCLFVBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUk7S0FDekMsQ0FBQyxDQUFDO0dBQ0osQ0FBQyxDQUFDO0FBQ0gsT0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDcEIsUUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsYUFBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0dBQ0osT0FBTyxJQUFJLENBQUM7Q0FDZDs7QUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDOztBQUVwRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDOztBQUU5RSxJQUFJLEtBQUssR0FBRyxTQUFSLEtBQUssQ0FBYSxDQUFDLEVBQUU7QUFDdkIsUUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFO0FBQ2xDLE9BQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNaLFNBQUssRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ2hDLFdBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZDO0dBQ0YsQ0FBQyxDQUFDO0NBQ0osQ0FBQzs7QUFFRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNCLE9BQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNWLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7O0FBRTNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDbEYsUUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0csUUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNsQyxVQUFJLEtBQUssR0FBRyxFQUFFO1VBQ1YsRUFBRSxHQUFHLHFCQUFxQjtVQUMxQixDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2xCLGFBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxZQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMxQixNQUFNO0FBQ0wsWUFBTSxHQUFHLElBQUksQ0FBQztLQUNmO0FBQ0QsUUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztBQUMzQixTQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztHQUN4RixFQUFFLENBQUMsQ0FBQzs7QUFFUCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDOztBQUV0RSxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ25GLFFBQUksS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDdEQsU0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQ2hDLEVBQUUsQ0FBQyxDQUFDOztBQUVQLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7O0FBRXBFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDakYsU0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7R0FDN0IsRUFBRSxDQUFDLENBQUM7O0FBRVAsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUM5RSxTQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDMUIsU0FBRyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0FBQzVCLFdBQUssRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUk7QUFDeEMsU0FBRyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSTtLQUNyQyxDQUFDLENBQUM7R0FDSixFQUFFLENBQUMsQ0FBQzs7OztBQUlQLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDL0UsUUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxRQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3hCLFNBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0dBQ3BGLEVBQUUsQ0FBQyxDQUFDOztBQUVQLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDaEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs7QUFFakUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDOztBQUV6RSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclZyRSxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzNDLE9BQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDOUIsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDbEMsT0FBTyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDcEMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7O0FBTWxDLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtBQUNqRCxNQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEMsTUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztBQUM1RSxTQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0NBQzFDOzs7OztBQUtELFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRTtBQUMzQixTQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDMUI7Ozs7O0FBS0QsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUNsQyxTQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQ3hCOztBQUVELFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQzNDLFNBQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNsQyxDQUFDLENBQUM7OztBQ25FSCxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzNDLE9BQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0FBRTVCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7Ozs7QUFRaEMsU0FBUyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUM5QixNQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLE9BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFFBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNmLFFBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckMsVUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDN0MsVUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakQ7QUFDRCxTQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0dBQ25EO0FBQ0QsTUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsU0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDeEM7O0FBRUQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQSxDQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzs7O0FDL0IzQyxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzNDLE9BQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDOztBQUVILElBQUksWUFBWSxHQUFHLENBQUMsWUFBWTtBQUFFLFdBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUFFLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQUUsVUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxBQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEFBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEFBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUFFO0dBQUUsQUFBQyxPQUFPLFVBQVUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUU7QUFBRSxRQUFJLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEFBQUMsSUFBSSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEFBQUMsT0FBTyxXQUFXLENBQUM7R0FBRSxDQUFDO0NBQUUsQ0FBQSxFQUFHLENBQUM7O0FBRXRqQixPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QixPQUFPLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztBQUMxQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7QUFFeEIsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtBQUFFLE1BQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFBLEFBQUMsRUFBRTtBQUFFLFVBQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQztHQUFFO0NBQUU7O0FBRXpKLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFakMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7OztBQUtoQyxJQUFJLGFBQWEsR0FBRyxDQUFDLFlBQVk7QUFDL0IsV0FBUyxhQUFhLENBQUMsT0FBTyxFQUFFO0FBQzlCLG1CQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDOzs7QUFHckMsUUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDOztBQUU3QixRQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7R0FDckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJELGNBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUMzQixPQUFHLEVBQUUsS0FBSztBQUNWLFNBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQy9CLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLFVBQUksS0FBSyxFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO0FBQ2xDLFlBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztPQUMzSDs7QUFFRCxXQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO0FBQ3pHLGVBQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO09BQ3JDOztBQUVELFdBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLGNBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ3RHLE9BQU8sTUFBTSxDQUFDO0tBQ2hCO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxZQUFZO0FBQ2pCLFNBQUssRUFBRSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ3ZDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxXQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2hDLFlBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFlBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztPQUM3RTtBQUNELFVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ2pGLGFBQU8sR0FBRyxDQUFDO0tBQ1o7R0FDRixFQUFFO0FBQ0QsT0FBRyxFQUFFLGVBQWU7QUFDcEIsU0FBSyxFQUFFLFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDekMsVUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3RELFVBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakwsYUFBTyxLQUFLLENBQUM7S0FDZDtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsa0JBQWtCO0FBQ3ZCLFNBQUssRUFBRSxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDOUMsV0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLFNBQVMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRztBQUN0RSxZQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RSxhQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEUsWUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztPQUNoRDtLQUNGO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxrQkFBa0I7QUFDdkIsU0FBSyxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUM5QyxVQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7O0FBRWpCLFVBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztBQUNoQixVQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDaEIsWUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxNQUFNLEVBQUU7QUFDckMsWUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsZUFBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU07QUFDaEgsZUFBTyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUMzQixnQkFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsYUFBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7U0FDdEI7QUFDRCxlQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDeEMsY0FBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsYUFBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlDO0FBQ0QsV0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO09BQ2pELENBQUMsQ0FBQztLQUNKO0dBQ0YsRUFBRTtBQUNELE9BQUcsRUFBRSxzQkFBc0I7QUFDM0IsU0FBSyxFQUFFLFNBQVMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNsRCxVQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRWxCLFlBQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3BDLFlBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLFdBQUcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsV0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDL0QsYUFBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUN4QixDQUFDLENBQUM7S0FDSjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsWUFBWTtBQUNqQixTQUFLLEVBQUUsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxXQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2hDLFlBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFlBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3ZFO0FBQ0QsYUFBTyxHQUFHLENBQUM7S0FDWjtHQUNGLEVBQUU7QUFDRCxPQUFHLEVBQUUsZ0JBQWdCO0FBQ3JCLFNBQUssRUFBRSxTQUFTLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3pDLFdBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxZQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLFlBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsV0FBRyxHQUFHLElBQUksQ0FBQztPQUNaO0FBQ0QsYUFBTyxHQUFHLENBQUM7S0FDWjs7Ozs7R0FLRixFQUFFO0FBQ0QsT0FBRyxFQUFFLFVBQVU7QUFDZixTQUFLLEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7QUFDaEQsYUFBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0tBQzlEO0dBQ0YsQ0FBQyxDQUFDLENBQUM7O0FBRUosU0FBTyxhQUFhLENBQUM7Q0FDdEIsQ0FBQSxFQUFHLENBQUM7O0FBRUwsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQ25CLE1BQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEYsU0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDdkQ7O0FBRUQsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQSxDQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs7Ozs7OztBQU92QyxTQUFTLGVBQWUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUM5QyxNQUFJLFVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxNQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5QyxNQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDakIsT0FBRyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRCxRQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztHQUNuRztBQUNELFNBQU8sR0FBRyxDQUFDO0NBQ1o7Ozs7Ozs7QUFPRCxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzdCLE1BQUksVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLE1BQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsTUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakQsU0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQ3ZCOztBQUVELENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUEsQ0FBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Ozs7QUFJekMsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRTtBQUN4QixLQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7Q0FDckM7O0FBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ3hDLFNBQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7Q0FDdkMsQ0FBQyxDQUFDOztBQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQy9FLE1BQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztBQUN0RCxNQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNuRSxDQUFDOztBQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUN4QyxTQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQy9CLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDekMsU0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztDQUN2RixDQUFDLENBQUM7O0FBRUgsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDakksT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUztBQUMvQyxRQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztBQUM3QyxRQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDakQsUUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztHQUNqRztDQUNGLENBQUM7O0FBRUYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ3RDLFNBQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDL0IsQ0FBQyxDQUFDOztBQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxTQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDcEIsQ0FBQyxDQUFDOztBQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUN2QyxTQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzlCLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDckMsU0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUNqRCxDQUFDLENBQUM7O0FBRUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZDLE1BQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLE1BQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDNUcsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDakMsQ0FBQyxDQUFDOzs7O0FBSUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLFNBQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3hDLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDbkMsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRTtBQUNsQixPQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO0FBQ25CLE9BQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7QUFDbkIsU0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztHQUN4QixDQUFDLENBQUM7Q0FDSixDQUFDLENBQUM7O0FBRUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLFNBQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNwQixDQUFDLENBQUM7Ozs7QUFJSCxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3BCLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0NBQ3hCLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQ3RCLENBQUMsQ0FBQzs7QUFFSCxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDdEMsU0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7QUFDdkMsU0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztDQUM5QixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFRSCxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzNDLE9BQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDbEMsT0FBTyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDbEMsT0FBTyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDcEMsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7O0FBTXRDLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQ3pDLE1BQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxNQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQzVFLFNBQU8sU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUNoQzs7Ozs7QUFLRCxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUU7QUFDM0IsU0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQzlCOzs7OztBQUtELFNBQVMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDbEMsYUFBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztDQUM1Qjs7QUFFRCxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxFQUFFO0FBQ2xDLFNBQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQ3JCLENBQUMsQ0FBQzs7O0FDL0RILFlBQVksQ0FBQzs7QUFFYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7QUFFeEIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqQyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRWhDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLElBQUksRUFBRTtBQUNyRCxNQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZixNQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFO0FBQzVCLFdBQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ2pELENBQUMsQ0FBQztBQUNILFNBQU8sS0FBSyxDQUFDO0NBQ2QsQ0FBQzs7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDekQsTUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELFNBQU8sSUFBSSxJQUFJLElBQUksR0FBRyxNQUFNLENBQUM7Q0FDOUIsQ0FBQzs7QUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsWUFBWTtBQUNsRCxTQUFPLEVBQUUsQ0FBQztDQUNYLENBQUM7O0FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFlBQVk7QUFDckQsU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOztBQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLElBQUksRUFBRTtBQUNwRCxTQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDbEIsQ0FBQzs7Ozs7QUFLRixTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFDbkIsU0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztDQUMzQzs7QUFFRCxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFBLENBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7QUMzQ3pDLFlBQVksQ0FBQzs7QUFFYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsT0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7QUFDSCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQixPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFFMUIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRXhDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFOUIsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUU5QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO0FBQzVCLE9BQUssRUFBRSxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQy9CLFFBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJO1FBQ2hCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFBLENBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ25ELFFBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJO1FBQ3BCLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNuQixHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUNwQixRQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQzdCLFFBQUksaUJBQWlCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUMxQyxRQUFJLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxTQUFTLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BFLFFBQUksaUJBQWlCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUMxQyxRQUFJLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLGlCQUFpQixDQUFDO0FBQ3JFLFFBQUksaUJBQWlCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUMxQyxRQUFJLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLGlCQUFpQixDQUFDOztBQUVyRSxRQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlCLFVBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDcEYsV0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFNBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLGNBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ25EO0FBQ0QsUUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztBQUVqRCxRQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMzQixVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUk7UUFDeEIsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUMxQixRQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3BDLFFBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtBQUNoQixVQUFJLElBQUksR0FBRyxDQUFDLFlBQVk7QUFDdEIsWUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsWUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUQsWUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDckUsaUJBQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTztBQUN2RSxXQUFDLEVBQUUsSUFBSTtTQUNSLENBQUM7QUFDSixZQUFJLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEIsYUFBSyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLGNBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLENBQUM7U0FDbkQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO09BQ3BFLENBQUEsRUFBRyxDQUFDOztBQUVMLFVBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM3QyxNQUFNO0FBQ0wsVUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDOUksZUFBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDdEQ7QUFDRCxRQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQzs7QUFFaEQsUUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQy9CLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JDLGFBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztLQUM3QixJQUFJLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLFFBQUksUUFBUSxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUQsUUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQzFELFVBQUksU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEQsVUFBSSxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7VUFDekMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQy9ELFVBQUksVUFBVSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUEsQUFBQyxDQUFDLENBQUM7QUFDMUYsY0FBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDbks7QUFDRCxRQUFJLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDL0UsUUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xLLFdBQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7R0FDckU7QUFDRCxRQUFNLEVBQUUsU0FBUyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDekMsUUFBSSxLQUFLLEdBQUcsRUFBRTtRQUNWLEtBQUssR0FB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SyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDbEQ7Ozs7OztBQU1ELFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLElBQUksRUFBRTtBQUNwRCxNQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsU0FBTyxDQUFDLFlBQVk7QUFDbEIsUUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLFFBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDdEIsUUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN0QixRQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDOztBQUV0QixRQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdkQsUUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUUvRCxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUNwQyxVQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtBQUM3QyxZQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsY0FB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LElBQUksQ0FBQztHQUNiLENBQUEsQ0FBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0NBQzNCLENBQUM7Ozs7OztBQU1GLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNwQyxNQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0MsTUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQztBQUN0RCxNQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsTUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUMsTUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkUsTUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQy9FOzs7Ozs7QUFNRCxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDekUsTUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxNQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3RCLE1BQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEIsTUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN4QixNQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDOztBQUV4QixNQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxNQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVk7QUFDakMsV0FBTyxJQUFJLENBQUM7R0FDYixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVk7QUFDakQsV0FBTyxJQUFJLENBQUM7R0FDYixDQUFDLENBQUMsQ0FBQztBQUNKLE1BQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2xGLE1BQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUNqQixRQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxRCxhQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pFLFVBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdkQ7R0FDRjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2IsQ0FBQzs7Ozs7QUFLRixVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDN0UsTUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztBQUVqQixNQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxVQUFVLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDNUQsUUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDcEQsVUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7QUFFcEIsV0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xGLFdBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwSixhQUFPLEtBQUssQ0FBQztLQUNkO0dBQ0YsQ0FBQyxDQUFDO0FBQ0gsU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7O0FBSUYsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDdkUsTUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3hCLE1BQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkksU0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOzs7QUMzUkYsWUFBWSxDQUFDOztBQUViLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtBQUMzQyxPQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQzs7QUFFSCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRWxCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7QUFFbkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQWNyQixJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtBQUMxQyxZQUFVLEVBQUUsSUFBSTtBQUNoQixLQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsV0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDO0dBQzdCO0NBQ0YsQ0FBQyxDQUFDOztBQUVILElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFOUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQ3JDLFlBQVUsRUFBRSxJQUFJO0FBQ2hCLEtBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixXQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7R0FDbkI7Q0FDRixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7QUFDM0MsWUFBVSxFQUFFLElBQUk7QUFDaEIsS0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQztHQUN6QjtDQUNGLENBQUMsQ0FBQzs7QUFFSCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7O0FBRXRDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtBQUN4QyxZQUFVLEVBQUUsSUFBSTtBQUNoQixLQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsV0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDO0dBQzFCO0NBQ0YsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO0FBQ3hDLFlBQVUsRUFBRSxJQUFJO0FBQ2hCLEtBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixXQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUM7R0FDMUI7Q0FDRixDQUFDLENBQUM7O0FBRUgsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUU5QixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUU7QUFDMUMsWUFBVSxFQUFFLElBQUk7QUFDaEIsS0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQztHQUN4QjtDQUNGLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFO0FBQy9DLFlBQVUsRUFBRSxJQUFJO0FBQ2hCLEtBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixXQUFPLEtBQUssQ0FBQyxjQUFjLENBQUM7R0FDN0I7Q0FDRixDQUFDLENBQUM7O0FBRUgsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUU1QixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7QUFDdkMsWUFBVSxFQUFFLElBQUk7QUFDaEIsS0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztHQUNwQjtDQUNGLENBQUMsQ0FBQztBQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRTtBQUMxQyxZQUFVLEVBQUUsSUFBSTtBQUNoQixLQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7QUFDbEIsV0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0dBQ3ZCO0NBQ0YsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFO0FBQzFDLFlBQVUsRUFBRSxJQUFJO0FBQ2hCLEtBQUcsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNsQixXQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7R0FDdkI7Q0FDRixDQUFDLENBQUM7OztBQ2pHSCxZQUFZLENBQUM7O0FBRWIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFO0FBQzNDLE9BQUssRUFBRSxJQUFJO0NBQ1osQ0FBQyxDQUFDO0FBQ0gsT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDeEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7O0FBRTlCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFakMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztBQUV4QyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Ozs7OztBQU81QixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDeEIsT0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDL0IsUUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxRQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDeEgsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1FBQ3RCLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUN2QixRQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDdkIsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsUUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUN4RixTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdCLFVBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztLQUNyQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxRQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUMxQixRQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3BDLFFBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLFFBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFNUcsUUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElB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LEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzlIO0dBQ0Y7O0FBRUQsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pDLFFBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsUUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM1QyxRQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMzRyxVQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0FBQzNDLFVBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDeEIsVUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRTtBQUNyQixZQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQSxBQUFDLENBQUM7QUFDNUQsZUFBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJ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TUFBTSxDQUFDOztBQUVoQyxRQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzFCLFFBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7O0FBRTVCLFFBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDekIsUUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2xJLFFBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pLLFFBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztBQUVsRCxRQUFJLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFD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M0MsYUFBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1dBQzNCO1NBQ0Y7T0FDRjtBQUNELFVBQUksS0FBSyxFQUFFO0FBQ1QsY0FBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7T0FDcEIsTUFBTTtBQUNMLGNBQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLGFBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsY0FBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsR0FBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7U0FDckU7T0FDRjtBQUNELFVBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQztBQUNwQyxhQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7S0FDNUUsTUFBTTtBQUNMLFVBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNyQztHQUNGO0NBQ0Y7O0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzQixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUNwQixRQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxN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QUksQ0FBQyxDQUFBO0FBQzNCLE1BQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDRDQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7RUFDNUM7QUFDRCxRQUFPLEVBQUUsUUFBUTtBQUNqQixVQUFTLEVBQUUsT0FBTztBQUNsQixTQUFRLEVBQUUsRUFBRTtDQUNaLENBQUMsQ0FBQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZWx0ID0gZWx0O1xuZXhwb3J0cy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5leHBvcnRzLnJtQ2xhc3MgPSBybUNsYXNzO1xuZXhwb3J0cy5hZGRDbGFzcyA9IGFkZENsYXNzO1xuZXhwb3J0cy5jb250YWlucyA9IGNvbnRhaW5zO1xuZXhwb3J0cy5pbnNlcnRDU1MgPSBpbnNlcnRDU1M7XG5cbmZ1bmN0aW9uIGVsdCh0YWcsIGF0dHJzKSB7XG4gIHZhciByZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG4gIGlmIChhdHRycykgZm9yICh2YXIgX25hbWUgaW4gYXR0cnMpIHtcbiAgICBpZiAoX25hbWUgPT0gXCJzdHlsZVwiKSByZXN1bHQuc3R5bGUuY3NzVGV4dCA9IGF0dHJzW19uYW1lXTtlbHNlIGlmIChhdHRyc1tfbmFtZV0gIT0gbnVsbCkgcmVzdWx0LnNldEF0dHJpYnV0ZShfbmFtZSwgYXR0cnNbX25hbWVdKTtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDJdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgYWRkKGFyZ3NbaV0sIHJlc3VsdCk7XG4gIH1yZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhZGQodmFsdWUsIHRhcmdldCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIpIHZhbHVlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQodmFsdWVbaV0sIHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZCh2YWx1ZSk7XG4gIH1cbn1cblxudmFyIHJlcUZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5mdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZikge1xuICBpZiAocmVxRnJhbWUpIHJlcUZyYW1lKGYpO2Vsc2Ugc2V0VGltZW91dChmLCAxMCk7XG59XG5cbnZhciBpZV91cHRvMTAgPSAvTVNJRSBcXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG52YXIgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTtcblxudmFyIGJyb3dzZXIgPSB7XG4gIG1hYzogL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLFxuICBpZV91cHRvMTA6IGllX3VwdG8xMCxcbiAgaWVfMTF1cDogaWVfMTF1cCxcbiAgaWU6IGllX3VwdG8xMCB8fCBpZV8xMXVwLFxuICBnZWNrbzogL2dlY2tvXFwvXFxkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxufTtcblxuZXhwb3J0cy5icm93c2VyID0gYnJvd3NlcjtcbmZ1bmN0aW9uIGNsYXNzVGVzdChjbHMpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIGNscyArIFwiKD86JHxcXFxccylcXFxccypcIik7XG59XG5cbmZ1bmN0aW9uIHJtQ2xhc3Mobm9kZSwgY2xzKSB7XG4gIHZhciBjdXJyZW50ID0gbm9kZS5jbGFzc05hbWU7XG4gIHZhciBtYXRjaCA9IGNsYXNzVGVzdChjbHMpLmV4ZWMoY3VycmVudCk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBhZnRlciA9IGN1cnJlbnQuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgIG5vZGUuY2xhc3NOYW1lID0gY3VycmVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAoYWZ0ZXIgPyBtYXRjaFsxXSArIGFmdGVyIDogXCJcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ2xhc3Mobm9kZSwgY2xzKSB7XG4gIHZhciBjdXJyZW50ID0gbm9kZS5jbGFzc05hbWU7XG4gIGlmICghY2xhc3NUZXN0KGNscykudGVzdChjdXJyZW50KSkgbm9kZS5jbGFzc05hbWUgKz0gKGN1cnJlbnQgPyBcIiBcIiA6IFwiXCIpICsgY2xzO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIC8vIEFuZHJvaWQgYnJvd3NlciBhbmQgSUUgd2lsbCByZXR1cm4gZmFsc2UgaWYgY2hpbGQgaXMgYSB0ZXh0IG5vZGUuXG4gIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSBjaGlsZCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gIHJldHVybiBjaGlsZCAmJiBwYXJlbnQuY29udGFpbnMoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRDU1MoY3NzKSB7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG4gIGRvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG5mdW5jdGlvbiBub3RoaW5nKCkge31cblxuZnVuY3Rpb24gZW5zdXJlU2VsZWN0aW9uKHBtKSB7XG4gIGlmIChwbS5zZWxlY3Rpb24ubm9kZSkge1xuICAgIHZhciBmb3VuZCA9ICgwLCBfc2VsZWN0aW9uLmZpbmRTZWxlY3Rpb25OZWFyKShwbS5kb2MsIHBtLnNlbGVjdGlvbi5mcm9tLCAxLCB0cnVlKTtcbiAgICBpZiAoZm91bmQpICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgZm91bmQuaGVhZCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBBIGJhY2tkcm9wIGtleW1hcCB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBhbHdheXMgc3VwcHJlc3Mga2V5cyB0aGF0XG4vLyBoYXZlIGEgZGFuZ2Vyb3VzIGRlZmF1bHQgZWZmZWN0LCBldmVuIGlmIHRoZSBjb21tYW5kcyB0aGV5IGFyZVxuLy8gYm91bmQgdG8gcmV0dXJuIGZhbHNlLCBhbmQgdG8gbWFrZSBzdXJlIHRoYXQgY3Vyc29yLW1vdGlvbiBrZXlzXG4vLyBmaW5kIGEgY3Vyc29yIChhcyBvcHBvc2VkIHRvIGEgbm9kZSBzZWxlY3Rpb24pIHdoZW4gcHJlc3NlZC5cblxudmFyIGtleXMgPSB7XG4gIFwiRXNjXCI6IG5vdGhpbmcsXG4gIFwiRW50ZXJcIjogbm90aGluZyxcbiAgXCJNb2QtRW50ZXJcIjogbm90aGluZyxcbiAgXCJTaGlmdC1FbnRlclwiOiBub3RoaW5nLFxuICBcIkJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIkRlbGV0ZVwiOiBub3RoaW5nLFxuICBcIk1vZC1CXCI6IG5vdGhpbmcsXG4gIFwiTW9kLUlcIjogbm90aGluZyxcbiAgXCJNb2QtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLURlbGV0ZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LURlbGV0ZVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1CYWNrc3BhY2VcIjogbm90aGluZyxcbiAgXCJTaGlmdC1Nb2QtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiTW9kLVpcIjogbm90aGluZyxcbiAgXCJNb2QtWVwiOiBub3RoaW5nLFxuICBcIlNoaWZ0LU1vZC1aXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1EXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1IXCI6IG5vdGhpbmcsXG4gIFwiQ3RybC1BbHQtQmFja3NwYWNlXCI6IG5vdGhpbmcsXG4gIFwiQWx0LURcIjogbm90aGluZyxcbiAgXCJBbHQtRGVsZXRlXCI6IG5vdGhpbmcsXG4gIFwiQWx0LUJhY2tzcGFjZVwiOiBub3RoaW5nLFxuXG4gIFwiTW9kLUFcIjogZW5zdXJlU2VsZWN0aW9uXG59O1tcIkxlZnRcIiwgXCJSaWdodFwiLCBcIlVwXCIsIFwiRG93blwiLCBcIkhvbWVcIiwgXCJFbmRcIiwgXCJQYWdlVXBcIiwgXCJQYWdlRG93blwiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAga2V5c1trZXldID0ga2V5c1tcIlNoaWZ0LVwiICsga2V5XSA9IGtleXNbXCJNb2QtXCIgKyBrZXldID0ga2V5c1tcIlNoaWZ0LU1vZC1cIiArIGtleV0gPSBrZXlzW1wiQWx0LVwiICsga2V5XSA9IGtleXNbXCJTaGlmdC1BbHQtXCIgKyBrZXldID0gZW5zdXJlU2VsZWN0aW9uO1xufSk7W1wiTGVmdFwiLCBcIk1vZC1MZWZ0XCIsIFwiUmlnaHRcIiwgXCJNb2QtUmlnaHRcIiwgXCJVcFwiLCBcIkRvd25cIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBkZWxldGUga2V5c1trZXldO1xufSk7XG5cbmlmIChfZG9tLmJyb3dzZXIubWFjKSBrZXlzW1wiQ3RybC1GXCJdID0ga2V5c1tcIkN0cmwtQlwiXSA9IGtleXNbXCJDdHJsLVBcIl0gPSBrZXlzW1wiQ3RybC1OXCJdID0ga2V5c1tcIkFsdC1GXCJdID0ga2V5c1tcIkFsdC1CXCJdID0ga2V5c1tcIkN0cmwtQVwiXSA9IGtleXNbXCJDdHJsLUVcIl0gPSBrZXlzW1wiQ3RybC1WXCJdID0ga2V5c1tcImdvUGFnZVVwXCJdID0gZW5zdXJlU2VsZWN0aW9uO1xuXG52YXIgY2FwdHVyZUtleXMgPSBuZXcgX2tleXMuS2V5bWFwKGtleXMpO1xuZXhwb3J0cy5jYXB0dXJlS2V5cyA9IGNhcHR1cmVLZXlzOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1dvcmRDaGFyID0gaXNXb3JkQ2hhcjtcbmV4cG9ydHMuY2hhckNhdGVnb3J5ID0gY2hhckNhdGVnb3J5O1xuZXhwb3J0cy5pc0V4dGVuZGluZ0NoYXIgPSBpc0V4dGVuZGluZ0NoYXI7XG52YXIgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5cbi8vIEV4dGVuZGluZyB1bmljb2RlIGNoYXJhY3RlcnMuIEEgc2VyaWVzIG9mIGEgbm9uLWV4dGVuZGluZyBjaGFyICtcbi8vIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIGNoYXJzIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBhcyBmYXJcbi8vIGFzIGVkaXRpbmcgYW5kIG1lYXN1cmluZyBpcyBjb25jZXJuZWQuIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QsXG4vLyBzaW5jZSBzb21lIHNjcmlwdHMvZm9udHMvYnJvd3NlcnMgYWxzbyB0cmVhdCBvdGhlciBjb25maWd1cmF0aW9uc1xuLy8gb2YgY29kZSBwb2ludHMgYXMgYSBncm91cC5cbnZhciBleHRlbmRpbmdDaGFyID0gL1tcXHUwMzAwLVxcdTAzNmZcXHUwNDgzLVxcdTA0ODlcXHUwNTkxLVxcdTA1YmRcXHUwNWJmXFx1MDVjMVxcdTA1YzJcXHUwNWM0XFx1MDVjNVxcdTA1YzdcXHUwNjEwLVxcdTA2MWFcXHUwNjRiLVxcdTA2NWVcXHUwNjcwXFx1MDZkNi1cXHUwNmRjXFx1MDZkZS1cXHUwNmU0XFx1MDZlN1xcdTA2ZThcXHUwNmVhLVxcdTA2ZWRcXHUwNzExXFx1MDczMC1cXHUwNzRhXFx1MDdhNi1cXHUwN2IwXFx1MDdlYi1cXHUwN2YzXFx1MDgxNi1cXHUwODE5XFx1MDgxYi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJkXFx1MDkwMC1cXHUwOTAyXFx1MDkzY1xcdTA5NDEtXFx1MDk0OFxcdTA5NGRcXHUwOTUxLVxcdTA5NTVcXHUwOTYyXFx1MDk2M1xcdTA5ODFcXHUwOWJjXFx1MDliZVxcdTA5YzEtXFx1MDljNFxcdTA5Y2RcXHUwOWQ3XFx1MDllMlxcdTA5ZTNcXHUwYTAxXFx1MGEwMlxcdTBhM2NcXHUwYTQxXFx1MGE0MlxcdTBhNDdcXHUwYTQ4XFx1MGE0Yi1cXHUwYTRkXFx1MGE1MVxcdTBhNzBcXHUwYTcxXFx1MGE3NVxcdTBhODFcXHUwYTgyXFx1MGFiY1xcdTBhYzEtXFx1MGFjNVxcdTBhYzdcXHUwYWM4XFx1MGFjZFxcdTBhZTJcXHUwYWUzXFx1MGIwMVxcdTBiM2NcXHUwYjNlXFx1MGIzZlxcdTBiNDEtXFx1MGI0NFxcdTBiNGRcXHUwYjU2XFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI4MlxcdTBiYmVcXHUwYmMwXFx1MGJjZFxcdTBiZDdcXHUwYzNlLVxcdTBjNDBcXHUwYzQ2LVxcdTBjNDhcXHUwYzRhLVxcdTBjNGRcXHUwYzU1XFx1MGM1NlxcdTBjNjJcXHUwYzYzXFx1MGNiY1xcdTBjYmZcXHUwY2MyXFx1MGNjNlxcdTBjY2NcXHUwY2NkXFx1MGNkNVxcdTBjZDZcXHUwY2UyXFx1MGNlM1xcdTBkM2VcXHUwZDQxLVxcdTBkNDRcXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGRjYVxcdTBkY2ZcXHUwZGQyLVxcdTBkZDRcXHUwZGQ2XFx1MGRkZlxcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZWIxXFx1MGViNC1cXHUwZWI5XFx1MGViYlxcdTBlYmNcXHUwZWM4LVxcdTBlY2RcXHUwZjE4XFx1MGYxOVxcdTBmMzVcXHUwZjM3XFx1MGYzOVxcdTBmNzEtXFx1MGY3ZVxcdTBmODAtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY5MC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmQtXFx1MTAzMFxcdTEwMzItXFx1MTAzN1xcdTEwMzlcXHUxMDNhXFx1MTAzZFxcdTEwM2VcXHUxMDU4XFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNzEtXFx1MTA3NFxcdTEwODJcXHUxMDg1XFx1MTA4NlxcdTEwOGRcXHUxMDlkXFx1MTM1ZlxcdTE3MTItXFx1MTcxNFxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I3LVxcdTE3YmRcXHUxN2M2XFx1MTdjOS1cXHUxN2QzXFx1MTdkZFxcdTE4MGItXFx1MTgwZFxcdTE4YTlcXHUxOTIwLVxcdTE5MjJcXHUxOTI3XFx1MTkyOFxcdTE5MzJcXHUxOTM5LVxcdTE5M2JcXHUxYTE3XFx1MWExOFxcdTFhNTZcXHUxYTU4LVxcdTFhNWVcXHUxYTYwXFx1MWE2MlxcdTFhNjUtXFx1MWE2Y1xcdTFhNzMtXFx1MWE3Y1xcdTFhN2ZcXHUxYjAwLVxcdTFiMDNcXHUxYjM0XFx1MWIzNi1cXHUxYjNhXFx1MWIzY1xcdTFiNDJcXHUxYjZiLVxcdTFiNzNcXHUxYjgwXFx1MWI4MVxcdTFiYTItXFx1MWJhNVxcdTFiYThcXHUxYmE5XFx1MWMyYy1cXHUxYzMzXFx1MWMzNlxcdTFjMzdcXHUxY2QwLVxcdTFjZDJcXHUxY2Q0LVxcdTFjZTBcXHUxY2UyLVxcdTFjZThcXHUxY2VkXFx1MWRjMC1cXHUxZGU2XFx1MWRmZC1cXHUxZGZmXFx1MjAwY1xcdTIwMGRcXHUyMGQwLVxcdTIwZjBcXHUyY2VmLVxcdTJjZjFcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2NmYtXFx1YTY3MlxcdWE2N2NcXHVhNjdkXFx1YTZmMFxcdWE2ZjFcXHVhODAyXFx1YTgwNlxcdWE4MGJcXHVhODI1XFx1YTgyNlxcdWE4YzRcXHVhOGUwLVxcdWE4ZjFcXHVhOTI2LVxcdWE5MmRcXHVhOTQ3LVxcdWE5NTFcXHVhOTgwLVxcdWE5ODJcXHVhOWIzXFx1YTliNi1cXHVhOWI5XFx1YTliY1xcdWFhMjktXFx1YWEyZVxcdWFhMzFcXHVhYTMyXFx1YWEzNVxcdWFhMzZcXHVhYTQzXFx1YWE0Y1xcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFiZTVcXHVhYmU4XFx1YWJlZFxcdWRjMDAtXFx1ZGZmZlxcdWZiMWVcXHVmZTAwLVxcdWZlMGZcXHVmZTIwLVxcdWZlMjZcXHVmZjllXFx1ZmY5Zl0vO1xuXG5mdW5jdGlvbiBpc1dvcmRDaGFyKGNoKSB7XG4gIHJldHVybiAoL1xcdy8udGVzdChjaCkgfHwgaXNFeHRlbmRpbmdDaGFyKGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKVxuICApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2F0ZWdvcnkgb2YgYSBnaXZlbiBjaGFyYWN0ZXIuIEVpdGhlciBhIFwic3BhY2VcIixcbiAqIGEgY2hhcmFjdGVyIHRoYXQgY2FuIGJlIHBhcnQgb2YgYSB3b3JkIChcIndvcmRcIiksIG9yIGFueXRoaW5nIGVsc2UgKFwib3RoZXJcIikuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBjaCBUaGUgY2hhcmFjdGVyLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGNoYXJDYXRlZ29yeShjaCkge1xuICByZXR1cm4gKC9cXHMvLnRlc3QoY2gpID8gXCJzcGFjZVwiIDogaXNXb3JkQ2hhcihjaCkgPyBcIndvcmRcIiA6IFwib3RoZXJcIlxuICApO1xufVxuXG5mdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY2gpIHtcbiAgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgPj0gNzY4ICYmIGV4dGVuZGluZ0NoYXIudGVzdChjaCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KSgpO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZGVmaW5lUGFyYW1IYW5kbGVyID0gZGVmaW5lUGFyYW1IYW5kbGVyO1xuZXhwb3J0cy5pbml0Q29tbWFuZHMgPSBpbml0Q29tbWFuZHM7XG5leHBvcnRzLmRlZmF1bHRLZXltYXAgPSBkZWZhdWx0S2V5bWFwO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycjJbaV0gPSBhcnJbaV07IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX2NoYXIgPSByZXF1aXJlKFwiLi9jaGFyXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIF9vcHRpb25zID0gcmVxdWlyZShcIi4vb3B0aW9uc1wiKTtcblxudmFyIHBhcmFtSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG52YXIgZW1wdHkgPSBbXTtcblxuLy8gRklYTUUgZG9jdW1lbnQgaW5kaXZpZHVhbCBjb21tYW5kc1xuXG4vLyA7OyBBIGNvbW1hbmQgaXMgYSBuYW1lZCBwaWVjZSBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIGJvdW5kIHRvXG4vLyBhIGtleSwgc2hvd24gaW4gdGhlIG1lbnUsIG9yIG90aGVyd2lzZSBleHBvc2VkIHRvIHRoZSB1c2VyLlxuLy9cbi8vIFRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBlZGl0b3IgYXJlIGdhdGhlcmVkIGZyb20gdGhlXG4vLyBbcmVnaXN0cmllc10oI3JlZ2lzdHJpZXMpIGdpdmVuIHRvIHRoZSBlZGl0b3IsIGFuZCB0aGUgbm9kZSBhbmRcbi8vIG1hcmsgdHlwZXMgaW4gaXRzIFtzY2hlbWFdKCNTY2hlbWEucmVnaXN0cnkpLiBVc2UgdGhlXG4vLyBbYHJlZ2lzdGVyYF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBtZXRob2Qgd2l0aCBgXCJjb21tYW5kXCJgIGFzIHRoZVxuLy8gbmFtZSBhbmQgYSBgQ29tbWFuZFNwZWNgIGFzIHZhbHVlIHRvIGRlZmluZSBhIG5ldyBjb21tYW5kLlxuXG52YXIgQ29tbWFuZCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbW1hbmQoc3BlYywgc2VsZikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21tYW5kKTtcblxuICAgIC8vIDo6IHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAgICB0aGlzLm5hbWUgPSBzcGVjLm5hbWU7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBkZWZpbmUgYSBjb21tYW5kIHdpdGhvdXQgYSBuYW1lXCIpO1xuICAgIC8vIDo6IENvbW1hbmRTcGVjIFRoZSBjb21tYW5kJ3Mgc3BlY2lmeWluZyBvYmplY3QuXG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICB9XG5cbiAgLy8gOzsgI3BhdGg9Q29tbWFuZFNwZWMgI2tpbmQ9aW50ZXJmYWNlICN0b2M9ZmFsc2VcbiAgLy8gQ29tbWFuZHMgYXJlIGRlZmluZWQgdXNpbmcgb2JqZWN0cyB0aGF0IHNwZWNpZnkgdmFyaW91cyBhc3BlY3RzIG9mXG4gIC8vIHRoZSBjb21tYW5kLiBUaGUgb25seSBwcm9wZXJ0aWVzIHRoYXQgX211c3RfIGFwcGVhciBpbiBhIGNvbW1hbmRcbiAgLy8gc3BlYyBhcmUgW2BuYW1lYF0oI0NvbW1hbmRTcGVjLm5hbWUpIGFuZCBbYHJ1bmBdKCNDb21tYW5kU3BlYy5ydW4pLlxuICAvLyBZb3Ugc2hvdWxkIHByb2JhYmx5IGFsc28gZ2l2ZSB5b3VyIGNvbW1hbmRzIGEgYGxhYmVsYC5cblxuICAvLyA6OiBzdHJpbmcgI3BhdGg9Q29tbWFuZFNwZWMubmFtZVxuICAvLyBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZCwgd2hpY2ggd2lsbCBiZSBpdHMga2V5IGluXG4gIC8vIGBQcm9zZU1pcnJvci5jb21tYW5kc2AsIGFuZCB0aGUgdGhpbmcgcGFzc2VkIHRvXG4gIC8vIFtgZXhlY0NvbW1hbmRgXSgjUHJvc2VNaXJyb3IuZXhlY0NvbW1hbmQpLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kU3BlYy5sYWJlbFxuICAvLyBBIHVzZXItZmFjaW5nIGxhYmVsIGZvciB0aGUgY29tbWFuZC4gVGhpcyB3aWxsIGJlIHVzZWQsIGFtb25nIG90aGVyXG4gIC8vIHRoaW5ncy4gYXMgdGhlIHRvb2x0aXAgdGl0bGUgZm9yIHRoZSBjb21tYW5kJ3MgbWVudSBpdGVtLiBJZiB0aGVyZVxuICAvLyBpcyBubyBgbGFiZWxgLCB0aGUgY29tbWFuZCdzIGBuYW1lYCB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cblxuICAvLyA6OiAocG06IFByb3NlTWlycm9yLCAuLi5wYXJhbXM6IFthbnldKSDihpIgP2Jvb2wgI3BhdGg9Q29tbWFuZFNwZWMucnVuXG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHRoZSBjb21tYW5kLiBJZiB0aGUgY29tbWFuZCBoYXNcbiAgLy8gW3BhcmFtZXRlcnNdKCNDb21tYW5kU3BlYy5wYXJhbXMpLCB0aGVpciB2YWx1ZXMgYXJlIHBhc3NlZCBhc1xuICAvLyBhcmd1bWVudHMuIEZvciBjb21tYW5kcyBbcmVnaXN0ZXJlZF0oI05vZGVUeXBlLnJlZ2lzdGVyKSBvbiBub2RlIG9yXG4gIC8vIG1hcmsgdHlwZXMsIGB0aGlzYCB3aWxsIGJlIGJvdW5kIHRvIHRoZSBub2RlIG9yIG1hcmsgdHlwZSB3aGVuIHRoaXNcbiAgLy8gZnVuY3Rpb24gaXMgcmFuLiBTaG91bGQgcmV0dXJuIGBmYWxzZWAgd2hlbiB0aGUgY29tbWFuZCBjb3VsZCBub3RcbiAgLy8gYmUgZXhlY3V0ZWQuXG5cbiAgLy8gOjogW0NvbW1hbmRQYXJhbV0gI3BhdGg9Q29tbWFuZFNwZWMucGFyYW1zXG4gIC8vIFRoZSBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBjb21tYW5kIGV4cGVjdHMuXG5cbiAgLy8gOjogKHBtOiBQcm9zZU1pcnJvcikg4oaSIGJvb2wgI3BhdGg9Q29tbWFuZFNwZWMuc2VsZWN0XG4gIC8vIFRoZSBmdW5jdGlvbiB1c2VkIHRvIFtzZWxlY3RdKCNDb21tYW5kLnNlbGVjdCkgdGhlIGNvbW1hbmQuIGB0aGlzYFxuICAvLyB3aWxsIGFnYWluIGJlIGJvdW5kIHRvIGEgbm9kZSBvciBtYXJrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuXG4gIC8vIDo6IChwbTogUHJvc2VNaXJyb3IpIOKGkiBib29sICNwYXRoPUNvbW1hbmRTcGVjLmFjdGl2ZVxuICAvLyBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29tbWFuZCBpc1xuICAvLyBbYWN0aXZlXSgjQ29tbWFuZC5hY3RpdmUpLiBgdGhpc2AgcmVmZXJzIHRvIHRoZSBhc3NvY2lhdGVkIG5vZGUgb3JcbiAgLy8gbWFyayB0eXBlLlxuXG4gIC8vIDo6IHVuaW9uPHN0cmluZywgW3N0cmluZ10+ICNwYXRoPUNvbW1hbmRTcGVjLmtleVxuICAvLyBUaGUgZGVmYXVsdCBrZXkgYmluZGluZyBvciBiaW5kaW5ncyBmb3IgdGhpcyBjb21tYW5kLlxuXG4gIC8vIDo6IHVuaW9uPHN0cmluZywgW3N0cmluZ10+ICNwYXRoPUNvbW1hbmRTcGVjLnBjS2V5XG4gIC8vIERlZmF1bHQga2V5IGJpbmRpbmcgb3IgYmluZGluZ3Mgc3BlY2lmaWMgdG8gbm9uLU1hYyBwbGF0Zm9ybXMuXG5cbiAgLy8gOjogdW5pb248c3RyaW5nLCBbc3RyaW5nXT4gI3BhdGg9Q29tbWFuZFNwZWMubWFjS2V5XG4gIC8vIERlZmF1bHQga2V5IGJpbmRpbmcgb3IgYmluZGluZ3Mgc3BlY2lmaWMgdG8gdGhlIE1hYyBwbGF0Zm9ybS5cblxuICAvLyBGSVhNRSBkb2N1bWVudCBtZW51IGFuZCBpY29uIHByb3BlcnRpZXNcblxuICAvLyA7OyAjcGF0aD1Db21tYW5kUGFyYW0gI2tpbmQ9aW50ZXJmYWNlICN0b2M9ZmFsc2VcbiAgLy8gVGhlIHBhcmFtZXRlcnMgdGhhdCBhIGNvbW1hbmQgY2FuIHRha2UgYXJlIHNwZWNpZmllZCB1c2luZyBvYmplY3RzXG4gIC8vIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kUGFyYW0ubGFiZWxcbiAgLy8gVGhlIHVzZXItZmFjaW5nIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4gU2hvd24gdG8gdGhlIHVzZXIgd2hlblxuICAvLyBwcm9tcHRpbmcgZm9yIHRoaXMgcGFyYW1ldGVyLlxuXG4gIC8vIDo6IHN0cmluZyAjcGF0aD1Db21tYW5kUGFyYW0udHlwZVxuICAvLyBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLiBTdXBwb3J0ZWQgdHlwZXMgYXJlIGBcInRleHRcImAgYW5kIGBcInNlbGVjdFwiYC5cblxuICAvLyA6OiBhbnkgI3BhdGg9Q29tbWFuZFBhcmFtLmRlZmF1bHRcbiAgLy8gQSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyLlxuXG4gIC8vIDo6IChzdHJpbmcsIChwbTogUHJvc2VNaXJyb3IsIGNtZDogQ29tbWFuZCwgY2FsbGJhY2s6ICg/W2FueV0pKSlcbiAgLy8gUmVnaXN0ZXIgYSBwYXJhbWV0ZXIgaGFuZGxlciwgd2hpY2ggaXMgYSBmdW5jdGlvbiB0aGF0IHByb21wdHMgdGhlXG4gIC8vIHVzZXIgdG8gZW50ZXIgdmFsdWVzIGZvciBhIGNvbW1hbmQncyBbcGFyYW1ldGVyc10oI0NvbW1hbmRQYXJhbSksIGFuZFxuICAvLyBjYWxscyBhIGNhbGxiYWNrIHdpdGggdGhlIHZhbHVlcyByZWNlaXZlZC4gU2VlIGFsc28gdGhlXG4gIC8vIFtgY29tbWFuZFBhcmFtSGFuZGxlcmAgb3B0aW9uXSgjY29tbWFuZFBhcmFtSGFuZGxlcikuXG5cbiAgLy8gOjogKFByb3NlTWlycm9yLCA/W2FueV0pIOKGkiA/Ym9vbFxuICAvLyBFeGVjdXRlIHRoaXMgY29tbWFuZC4gSWYgdGhlIGNvbW1hbmQgdGFrZXNcbiAgLy8gW3BhcmFtZXRlcnNdKCNDb21tYW5kLnBhcmFtcyksIHRoZXkgY2FuIGJlIHBhc3NlZCBhcyBzZWNvbmRcbiAgLy8gYXJndW1lbnQgaGVyZSwgb3Igb21pdHRlZCwgaW4gd2hpY2ggY2FzZSBhIFtwYXJhbWV0ZXJcbiAgLy8gaGFuZGxlcl0oI2RlZmluZVBhcmFtSGFuZGxlcikgd2lsbCBiZSBjYWxsZWQgdG8gcHJvbXB0IHRoZSB1c2VyXG4gIC8vIGZvciB2YWx1ZXMuXG4gIC8vXG4gIC8vIFJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjb21tYW5kIHNwZWMncyBbYHJ1bmBcbiAgLy8gbWV0aG9kXSgjQ29tbWFuZFNwZWMucnVuKSwgb3IgYGZhbHNlYCBpZiB0aGUgY29tbWFuZCBjb3VsZCBub3QgYmVcbiAgLy8gcmFuLlxuXG4gIF9jcmVhdGVDbGFzcyhDb21tYW5kLCBbe1xuICAgIGtleTogXCJleGVjXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWMocG0sIHBhcmFtcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHJ1biA9IHRoaXMuc3BlYy5ydW47XG4gICAgICBpZiAoIXRoaXMucGFyYW1zLmxlbmd0aCkgcmV0dXJuIHJ1bi5jYWxsKHRoaXMuc2VsZiwgcG0pO1xuICAgICAgaWYgKHBhcmFtcykgcmV0dXJuIHJ1bi5jYWxsLmFwcGx5KHJ1biwgW3RoaXMuc2VsZiwgcG1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocGFyYW1zKSkpO1xuICAgICAgdmFyIGhhbmRsZXIgPSBnZXRQYXJhbUhhbmRsZXIocG0pO1xuICAgICAgaWYgKCFoYW5kbGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICBoYW5kbGVyKHBtLCB0aGlzLCBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXMpIHJ1bi5jYWxsLmFwcGx5KHJ1biwgW190aGlzLnNlbGYsIHBtXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHBhcmFtcykpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6IChQcm9zZU1pcnJvcikg4oaSIGJvb2xcbiAgICAvLyBBc2sgdGhpcyBjb21tYW5kIHdoZXRoZXIgaXQgaXMgY3VycmVudGx5IHJlbGV2YW50LCBnaXZlbiB0aGVcbiAgICAvLyBlZGl0b3IncyBkb2N1bWVudCBhbmQgc2VsZWN0aW9uLiBJZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBkZWZpbmUgYVxuICAgIC8vIFtgc2VsZWN0YF0oI0NvbW1hbmRTcGVjLnNlbGVjdCkgbWV0aG9kLCB0aGlzIGFsd2F5cyByZXR1cm5zIHRydWUuXG4gIH0sIHtcbiAgICBrZXk6IFwic2VsZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIGYgPSB0aGlzLnNwZWMuc2VsZWN0O1xuICAgICAgcmV0dXJuIGYgPyBmLmNhbGwodGhpcy5zZWxmLCBwbSkgOiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDo6IChQcm9zZU1pcnJvcikg4oaSIGJvb2xcbiAgICAvLyBBc2sgdGhpcyBjb21tYW5kIHdoZXRoZXIgaXQgaXMg4oCcYWN0aXZl4oCdLiBUaGlzIGlzIG1vc3RseSB1c2VkIHRvXG4gICAgLy8gc3R5bGUgaW5saW5lIG1hcmsgaWNvbnMgKHN1Y2ggYXMgc3Ryb25nKSBkaWZmZXJlbnRseSB3aGVuIHRoZVxuICAgIC8vIHNlbGVjdGlvbiBjb250YWlucyBzdWNoIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImFjdGl2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3RpdmUocG0pIHtcbiAgICAgIHZhciBmID0gdGhpcy5zcGVjLmFjdGl2ZTtcbiAgICAgIHJldHVybiBmID8gZi5jYWxsKHRoaXMuc2VsZiwgcG0pIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogW0NvbW1hbmRQYXJhbV1cbiAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHRoaXMgY29tbWFuZCBleHBlY3RzLlxuICB9LCB7XG4gICAga2V5OiBcInBhcmFtc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BlYy5wYXJhbXMgfHwgZW1wdHk7XG4gICAgfVxuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gR2V0IHRoZSBsYWJlbCBmb3IgdGhpcyBjb21tYW5kLlxuICB9LCB7XG4gICAga2V5OiBcImxhYmVsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGVjLmxhYmVsIHx8IHRoaXMubmFtZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tbWFuZDtcbn0pKCk7XG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG5cbmZ1bmN0aW9uIGRlZmluZVBhcmFtSGFuZGxlcihuYW1lLCBoYW5kbGVyKSB7XG4gIHBhcmFtSGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJhbUhhbmRsZXIocG0pIHtcbiAgdmFyIG9wdGlvbiA9IHBtLm9wdGlvbnMuY29tbWFuZFBhcmFtSGFuZGxlcjtcbiAgaWYgKG9wdGlvbiAmJiBwYXJhbUhhbmRsZXJzW29wdGlvbl0pIHJldHVybiBwYXJhbUhhbmRsZXJzW29wdGlvbl07XG59XG5cbmZ1bmN0aW9uIGluaXRDb21tYW5kcyhwbSkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcG0ucmVnaXN0cnkoXCJjb21tYW5kXCIsIGZ1bmN0aW9uIChzcGVjLCB0eXBlKSB7XG4gICAgcmVzdWx0W3NwZWMubmFtZV0gPSBuZXcgQ29tbWFuZChzcGVjLCB0eXBlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRLZXltYXAocG0pIHtcbiAgdmFyIGJpbmRpbmdzID0ge307XG4gIGZ1bmN0aW9uIGFkZChjb21tYW5kLCBrZXkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhZGQoY29tbWFuZCwga2V5W2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgdmFyIF9kJCRleGVjID0gL14oLis/KSg/OlxcKChcXGQrKVxcKSk/JC8uZXhlYyhrZXkpO1xuXG4gICAgICB2YXIgX2QkJGV4ZWMyID0gX3NsaWNlZFRvQXJyYXkoX2QkJGV4ZWMsIDMpO1xuXG4gICAgICB2YXIgXyA9IF9kJCRleGVjMlswXTtcbiAgICAgIHZhciBfbmFtZSA9IF9kJCRleGVjMlsxXTtcbiAgICAgIHZhciBfZCQkZXhlYzIkMiA9IF9kJCRleGVjMlsyXTtcbiAgICAgIHZhciByYW5rID0gX2QkJGV4ZWMyJDIgPT09IHVuZGVmaW5lZCA/IDUwIDogX2QkJGV4ZWMyJDI7XG5cbiAgICAgICgwLCBfdXRpbFNvcnRlZGluc2VydDJbXCJkZWZhdWx0XCJdKShiaW5kaW5nc1tfbmFtZV0gfHwgKGJpbmRpbmdzW19uYW1lXSA9IFtdKSwgeyBjb21tYW5kOiBjb21tYW5kLCByYW5rOiByYW5rIH0sIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZm9yICh2YXIgX25hbWUyIGluIHBtLmNvbW1hbmRzKSB7XG4gICAgdmFyIGNtZCA9IHBtLmNvbW1hbmRzW19uYW1lMl07XG4gICAgYWRkKF9uYW1lMiwgY21kLnNwZWMua2V5KTtcbiAgICBhZGQoX25hbWUyLCBfZG9tLmJyb3dzZXIubWFjID8gY21kLnNwZWMubWFjS2V5IDogY21kLnNwZWMucGNLZXkpO1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIGJpbmRpbmdzKSB7XG4gICAgYmluZGluZ3Nba2V5XSA9IGJpbmRpbmdzW2tleV0ubWFwKGZ1bmN0aW9uIChiKSB7XG4gICAgICByZXR1cm4gYi5jb21tYW5kO1xuICAgIH0pO1xuICB9cmV0dXJuIG5ldyBfa2V5cy5LZXltYXAoYmluZGluZ3MpO1xufVxuXG52YXIgYW5kU2Nyb2xsID0geyBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9O1xuXG5fbW9kZWwuSGFyZEJyZWFrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiaW5zZXJ0SGFyZEJyZWFrXCIsXG4gIGxhYmVsOiBcIkluc2VydCBoYXJkIGJyZWFrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24gPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uLm5vZGU7XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHJldHVybiBmYWxzZTtlbHNlIGlmIChwbS5kb2MucGF0aChmcm9tLnBhdGgpLnR5cGUuaXNDb2RlKSByZXR1cm4gcG0udHIudHlwZVRleHQoXCJcXG5cIikuYXBwbHkoYW5kU2Nyb2xsKTtlbHNlIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKCkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogW1wiTW9kLUVudGVyXCIsIFwiU2hpZnQtRW50ZXJcIl1cbn0pO1xuXG5mdW5jdGlvbiBtYXJrQWN0aXZlKHBtLCB0eXBlKSB7XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIGlmIChzZWwuZW1wdHkpIHJldHVybiB0eXBlLmlzSW5TZXQocG0uYWN0aXZlTWFya3MoKSk7ZWxzZSByZXR1cm4gcG0uZG9jLnJhbmdlSGFzTWFyayhzZWwuZnJvbSwgc2VsLnRvLCB0eXBlKTtcbn1cblxuZnVuY3Rpb24gY2FuQWRkSW5saW5lKHBtLCB0eXBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMi5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMi50bztcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjIuZW1wdHk7XG5cbiAgaWYgKGVtcHR5KSByZXR1cm4gIXR5cGUuaXNJblNldChwbS5hY3RpdmVNYXJrcygpKSAmJiBwbS5kb2MucGF0aChmcm9tLnBhdGgpLnR5cGUuY2FuQ29udGFpbk1hcmsodHlwZSk7XG4gIHZhciBjYW4gPSBmYWxzZTtcbiAgcG0uZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoY2FuIHx8IG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChub2RlLmlzSW5saW5lICYmICF0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpIGNhbiA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gY2FuO1xufVxuXG5mdW5jdGlvbiBtYXJrQXBwbGllcyhwbSwgdHlwZSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjMgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjMuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjMudG87XG5cbiAgdmFyIHJlbGV2YW50ID0gZmFsc2U7XG4gIHBtLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIGlmIChub2RlLnR5cGUuY2FuQ29udGFpbk1hcmsodHlwZSkpIHJlbGV2YW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVsZXZhbnQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya0NvbW1hbmRzKHR5cGUsIG5hbWUsIGxhYmVsTmFtZSwgc3BlYykge1xuICBpZiAoIWxhYmVsTmFtZSkgbGFiZWxOYW1lID0gbmFtZTtcbiAgdmFyIGNhcCA9IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICB0eXBlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gICAgbmFtZTogXCJzZXRcIiArIGNhcCxcbiAgICBsYWJlbDogXCJTZXQgXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHBtLnNldE1hcmsodGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIGNhbkFkZElubGluZShwbSwgdGhpcyk7XG4gICAgfSxcbiAgICBpY29uOiB7IGZyb206IG5hbWUgfVxuICB9KTtcbiAgdHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICAgIG5hbWU6IFwidW5zZXRcIiArIGNhcCxcbiAgICBsYWJlbDogXCJSZW1vdmUgXCIgKyBsYWJlbE5hbWUsXG4gICAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICAgIHBtLnNldE1hcmsodGhpcywgZmFsc2UpO1xuICAgIH0sXG4gICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICAgIHJldHVybiBtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgICB9LFxuICAgIGljb246IHsgZnJvbTogbmFtZSB9XG4gIH0pO1xuICB2YXIgY29tbWFuZCA9IHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGxhYmVsOiBcIlRvZ2dsZSBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgcG0uc2V0TWFyayh0aGlzLCBudWxsKTtcbiAgICB9LFxuICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHBtKSB7XG4gICAgICByZXR1cm4gbWFya0FjdGl2ZShwbSwgdGhpcyk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgcmV0dXJuIG1hcmtBcHBsaWVzKHBtLCB0aGlzKTtcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIHByb3AgaW4gc3BlYykge1xuICAgIGNvbW1hbmRbcHJvcF0gPSBzcGVjW3Byb3BdO1xuICB9dHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwgY29tbWFuZCk7XG59XG5cbmdlbmVyYXRlTWFya0NvbW1hbmRzKF9tb2RlbC5TdHJvbmdNYXJrLCBcInN0cm9uZ1wiLCBudWxsLCB7XG4gIG1lbnVHcm91cDogXCJpbmxpbmVcIiwgbWVudVJhbms6IDIwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDgwNSwgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTMxNyA4NjlxNDIgMTggODAgMTggMjE0IDAgMjE0LTE5MSAwLTY1LTIzLTEwMi0xNS0yNS0zNS00MnQtMzgtMjYtNDYtMTQtNDgtNi01NC0xcS00MSAwLTU3IDUgMCAzMC0wIDkwdC0wIDkwcTAgNC0wIDM4dC0wIDU1IDIgNDcgNiAzOHpNMzA5IDQ0MnEyNCA0IDYyIDQgNDYgMCA4MS03dDYyLTI1IDQyLTUxIDE0LTgxcTAtNDAtMTYtNzB0LTQ1LTQ2LTYxLTI0LTcwLThxLTI4IDAtNzQgNyAwIDI4IDIgODZ0MiA4NnEwIDE1LTAgNDV0LTAgNDVxMCAyNiAwIDM5ek0wIDk1MGwxLTUzcTgtMiA0OC05dDYwLTE1cTQtNiA3LTE1dDQtMTkgMy0xOCAxLTIxIDAtMTl2LTM3cTAtNTYxLTEyLTU4NS0yLTQtMTItOHQtMjUtNi0yOC00LTI3LTItMTctMWwtMi00N3E1Ni0xIDE5NC02dDIxMy01cTEzIDAgMzkgMHQzOCAwcTQwIDAgNzggN3Q3MyAyNCA2MSA0MCA0MiA1OSAxNiA3OHEwIDI5LTkgNTR0LTIyIDQxLTM2IDMyLTQxIDI1LTQ4IDIycTg4IDIwIDE0NiA3NnQ1OCAxNDFxMCA1Ny0yMCAxMDJ0LTUzIDc0LTc4IDQ4LTkzIDI3LTEwMCA4cS0yNSAwLTc1LTF0LTc1LTFxLTYwIDAtMTc1IDZ0LTEzMiA2elwiXG4gIH0sXG4gIGtleTogXCJNb2QtQlwiXG59KTtcblxuZ2VuZXJhdGVNYXJrQ29tbWFuZHMoX21vZGVsLkVtTWFyaywgXCJlbVwiLCBcImVtcGhhc2lzXCIsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjEsXG4gIGljb246IHtcbiAgICB3aWR0aDogNTg1LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMCA5NDlsOS00OHEzLTEgNDYtMTJ0NjMtMjFxMTYtMjAgMjMtNTcgMC00IDM1LTE2NXQ2NS0zMTAgMjktMTY5di0xNHEtMTMtNy0zMS0xMHQtMzktNC0zMy0zbDEwLTU4cTE4IDEgNjggM3Q4NSA0IDY4IDFxMjcgMCA1Ni0xdDY5LTQgNTYtM3EtMiAyMi0xMCA1MC0xNyA1LTU4IDE2dC02MiAxOXEtNCAxMC04IDI0dC01IDIyLTQgMjYtMyAyNHEtMTUgODQtNTAgMjM5dC00NCAyMDNxLTEgNS03IDMzdC0xMSA1MS05IDQ3LTMgMzJsMCAxMHE5IDIgMTA1IDE3LTEgMjUtOSA1Ni02IDAtMTggMHQtMTggMHEtMTYgMC00OS01dC00OS01cS03OC0xLTExNy0xLTI5IDAtODEgNXQtNjkgNnpcIlxuICB9LFxuICBrZXk6IFwiTW9kLUlcIlxufSk7XG5cbmdlbmVyYXRlTWFya0NvbW1hbmRzKF9tb2RlbC5Db2RlTWFyaywgXCJjb2RlXCIsIG51bGwsIHtcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMjIsXG4gIGljb246IHtcbiAgICB3aWR0aDogODk2LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNjA4IDE5MmwtOTYgOTYgMjI0IDIyNC0yMjQgMjI0IDk2IDk2IDI4OC0zMjAtMjg4LTMyMHpNMjg4IDE5MmwtMjg4IDMyMCAyODggMzIwIDk2LTk2LTIyNC0yMjQgMjI0LTIyNC05Ni05NnpcIlxuICB9LFxuICBrZXk6IFwiTW9kLWBcIlxufSk7XG5cbl9tb2RlbC5MaW5rTWFyay5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInVubGlua1wiLFxuICBsYWJlbDogXCJVbmxpbmtcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zZXRNYXJrKHRoaXMsIGZhbHNlKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbWFya0FjdGl2ZShwbSwgdGhpcyk7XG4gIH0sXG4gIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaW5saW5lXCIsIG1lbnVSYW5rOiAzMCxcbiAgaWNvbjogeyBmcm9tOiBcImxpbmtcIiB9XG59KTtcblxuX21vZGVsLkxpbmtNYXJrLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibGlua1wiLFxuICBsYWJlbDogXCJBZGQgbGlua1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSwgaHJlZiwgdGl0bGUpIHtcbiAgICBwbS5zZXRNYXJrKHRoaXMsIHRydWUsIHsgaHJlZjogaHJlZiwgdGl0bGU6IHRpdGxlIH0pO1xuICB9LFxuICBwYXJhbXM6IFt7IGxhYmVsOiBcIlRhcmdldFwiLCB0eXBlOiBcInRleHRcIiB9LCB7IGxhYmVsOiBcIlRpdGxlXCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9XSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbWFya0FwcGxpZXMocG0sIHRoaXMpICYmICFtYXJrQWN0aXZlKHBtLCB0aGlzKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogMzAsXG4gIGljb246IHtcbiAgICB3aWR0aDogOTUxLCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNODMyIDY5NHEwLTIyLTE2LTM4bC0xMTgtMTE4cS0xNi0xNi0zOC0xNi0yNCAwLTQxIDE4IDEgMSAxMCAxMHQxMiAxMiA4IDEwIDcgMTQgMiAxNXEwIDIyLTE2IDM4dC0zOCAxNnEtOCAwLTE1LTJ0LTE0LTctMTAtOC0xMi0xMi0xMC0xMHEtMTggMTctMTggNDEgMCAyMiAxNiAzOGwxMTcgMTE4cTE1IDE1IDM4IDE1IDIyIDAgMzgtMTRsODQtODNxMTYtMTYgMTYtMzh6TTQzMCAyOTJxMC0yMi0xNi0zOGwtMTE3LTExOHEtMTYtMTYtMzgtMTYtMjIgMC0zOCAxNWwtODQgODNxLTE2IDE2LTE2IDM4IDAgMjIgMTYgMzhsMTE4IDExOHExNSAxNSAzOCAxNSAyNCAwIDQxLTE3LTEtMS0xMC0xMHQtMTItMTItOC0xMC03LTE0LTItMTVxMC0yMiAxNi0zOHQzOC0xNnE4IDAgMTUgMnQxNCA3IDEwIDggMTIgMTIgMTAgMTBxMTgtMTcgMTgtNDF6TTk0MSA2OTRxMCA2OC00OCAxMTZsLTg0IDgzcS00NyA0Ny0xMTYgNDctNjkgMC0xMTYtNDhsLTExNy0xMThxLTQ3LTQ3LTQ3LTExNiAwLTcwIDUwLTExOWwtNTAtNTBxLTQ5IDUwLTExOCA1MC02OCAwLTExNi00OGwtMTE4LTExOHEtNDgtNDgtNDgtMTE2dDQ4LTExNmw4NC04M3E0Ny00NyAxMTYtNDcgNjkgMCAxMTYgNDhsMTE3IDExOHE0NyA0NyA0NyAxMTYgMCA3MC01MCAxMTlsNTAgNTBxNDktNTAgMTE4LTUwIDY4IDAgMTE2IDQ4bDExOCAxMThxNDggNDggNDggMTE2elwiXG4gIH1cbn0pO1xuXG5fbW9kZWwuSW1hZ2UucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJpbnNlcnRJbWFnZVwiLFxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHsgc3JjOiBzcmMsIHRpdGxlOiB0aXRsZSwgYWx0OiBhbHQgfSkpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiSW1hZ2UgVVJMXCIsIHR5cGU6IFwidGV4dFwiIH0sIHsgbGFiZWw6IFwiRGVzY3JpcHRpb24gLyBhbHRlcm5hdGl2ZSB0ZXh0XCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9LCB7IGxhYmVsOiBcIlRpdGxlXCIsIHR5cGU6IFwidGV4dFwiLCBcImRlZmF1bHRcIjogXCJcIiB9XSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uZG9jLnBhdGgocG0uc2VsZWN0aW9uLmZyb20ucGF0aCkudHlwZS5jYW5Db250YWluVHlwZSh0aGlzKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImlubGluZVwiLCBtZW51UmFuazogNDAsXG4gIGljb246IHtcbiAgICB3aWR0aDogMTA5NywgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTM2NSAzMjlxMCA0NS0zMiA3N3QtNzcgMzItNzctMzItMzItNzcgMzItNzcgNzctMzIgNzcgMzIgMzIgNzd6TTk1MCA1NDh2MjU2aC04MDR2LTEwOWwxODItMTgyIDkxIDkxIDI5Mi0yOTJ6TTEwMDUgMTQ2aC05MTRxLTcgMC0xMiA1dC01IDEydjY5NHEwIDcgNSAxMnQxMiA1aDkxNHE3IDAgMTItNXQ1LTEydi02OTRxMC03LTUtMTJ0LTEyLTV6TTEwOTcgMTY0djY5NHEwIDM3LTI2IDY0dC02NCAyNmgtOTE0cS0zNyAwLTY0LTI2dC0yNi02NHYtNjk0cTAtMzcgMjYtNjR0NjQtMjZoOTE0cTM3IDAgNjQgMjZ0MjYgNjR6XCJcbiAgfSxcbiAgcHJlZmlsbFBhcmFtczogZnVuY3Rpb24gcHJlZmlsbFBhcmFtcyhwbSkge1xuICAgIHZhciBub2RlID0gcG0uc2VsZWN0aW9uLm5vZGU7XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcykgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdO1xuICB9XG59KTtcblxuLyoqXG4gKiBHZXQgYW4gb2Zmc2V0IG1vdmluZyBiYWNrd2FyZCBmcm9tIGEgY3VycmVudCBvZmZzZXQgaW5zaWRlIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUuXG4gKiBAcGFyYW0gIHtpbnR9ICAgIG9mZnNldCBPZmZzZXQgdG8gbW92ZSBmcm9tIGluc2lkZSB0aGUgbm9kZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gYnkgICAgIFNpemUgdG8gZGVsZXRlIGJ5LiBFaXRoZXIgXCJjaGFyXCIgb3IgXCJ3b3JkXCIuXG4gKi9cbmZ1bmN0aW9uIG1vdmVCYWNrd2FyZChwYXJlbnQsIG9mZnNldCwgYnkpIHtcbiAgaWYgKGJ5ICE9IFwiY2hhclwiICYmIGJ5ICE9IFwid29yZFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG1vdGlvbiB1bml0OiBcIiArIGJ5KTtcblxuICB2YXIgY2F0ID0gbnVsbCxcbiAgICAgIGNvdW50ZWQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKG9mZnNldCA9PSAwKSByZXR1cm4gb2Zmc2V0O1xuXG4gICAgdmFyIF9wYXJlbnQkY2h1bmtCZWZvcmUgPSBwYXJlbnQuY2h1bmtCZWZvcmUob2Zmc2V0KTtcblxuICAgIHZhciBzdGFydCA9IF9wYXJlbnQkY2h1bmtCZWZvcmUuc3RhcnQ7XG4gICAgdmFyIG5vZGUgPSBfcGFyZW50JGNodW5rQmVmb3JlLm5vZGU7XG5cbiAgICBpZiAoIW5vZGUuaXNUZXh0KSByZXR1cm4gY2F0ID8gb2Zmc2V0IDogb2Zmc2V0IC0gMTtcblxuICAgIGlmIChieSA9PSBcImNoYXJcIikge1xuICAgICAgZm9yICh2YXIgaSA9IG9mZnNldCAtIHN0YXJ0OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGlmICghKDAsIF9jaGFyLmlzRXh0ZW5kaW5nQ2hhcikobm9kZS50ZXh0LmNoYXJBdChpIC0gMSkpKSByZXR1cm4gb2Zmc2V0IC0gMTtcbiAgICAgICAgb2Zmc2V0LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChieSA9PSBcIndvcmRcIikge1xuICAgICAgLy8gV29yayBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIGJhY2t3YXJkcyB0aHJvdWdoIHRleHQgb2YgYSBzaW5ndWxhclxuICAgICAgLy8gY2hhcmFjdGVyIGNhdGVnb3J5IChlLmcuIFwiY2F0XCIgb2YgXCIjISpcIikgdW50aWwgcmVhY2hpbmcgYSBjaGFyYWN0ZXIgaW4gYVxuICAgICAgLy8gZGlmZmVyZW50IGNhdGVnb3J5IChpLmUuIHRoZSBlbmQgb2YgdGhlIHdvcmQpLlxuICAgICAgZm9yICh2YXIgaSA9IG9mZnNldCAtIHN0YXJ0OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIHZhciBuZXh0Q2hhckNhdCA9ICgwLCBfY2hhci5jaGFyQ2F0ZWdvcnkpKG5vZGUudGV4dC5jaGFyQXQoaSAtIDEpKTtcbiAgICAgICAgaWYgKGNhdCA9PSBudWxsIHx8IGNvdW50ZWQgPT0gMSAmJiBjYXQgPT0gXCJzcGFjZVwiKSBjYXQgPSBuZXh0Q2hhckNhdDtlbHNlIGlmIChjYXQgIT0gbmV4dENoYXJDYXQpIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIG9mZnNldC0tO1xuICAgICAgICBjb3VudGVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVNlbGVjdGlvblwiLFxuICBsYWJlbDogXCJEZWxldGUgdGhlIHNlbGVjdGlvblwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBbXCJCYWNrc3BhY2UoMTApXCIsIFwiRGVsZXRlKDEwKVwiLCBcIk1vZC1CYWNrc3BhY2UoMTApXCIsIFwiTW9kLURlbGV0ZSgxMClcIl0sXG4gIG1hY0tleTogW1wiQ3RybC1IKDEwKVwiLCBcIkFsdC1CYWNrc3BhY2UoMTApXCIsIFwiQ3RybC1EKDEwKVwiLCBcIkN0cmwtQWx0LUJhY2tzcGFjZSgxMClcIiwgXCJBbHQtRGVsZXRlKDEwKVwiLCBcIkFsdC1EKDEwKVwiXVxufSk7XG5cbmZ1bmN0aW9uIGRlbGV0ZUJhcnJpZXIocG0sIGN1dCkge1xuICB2YXIgYXJvdW5kID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpO1xuICB2YXIgYmVmb3JlID0gYXJvdW5kLmNoaWxkKGN1dC5vZmZzZXQgLSAxKSxcbiAgICAgIGFmdGVyID0gYXJvdW5kLmNoaWxkKGN1dC5vZmZzZXQpO1xuICBpZiAoYmVmb3JlLnR5cGUuY2FuQ29udGFpbkNvbnRlbnQoYWZ0ZXIudHlwZSkgJiYgcG0udHIuam9pbihjdXQpLmFwcGx5KGFuZFNjcm9sbCkgIT09IGZhbHNlKSByZXR1cm47XG5cbiAgdmFyIGNvbm4gPSB1bmRlZmluZWQ7XG4gIGlmIChhZnRlci5pc1RleHRibG9jayAmJiAoY29ubiA9IGJlZm9yZS50eXBlLmZpbmRDb25uZWN0aW9uKGFmdGVyLnR5cGUpKSkge1xuICAgIHZhciB0ciA9IHBtLnRyLFxuICAgICAgICBlbmQgPSBjdXQubW92ZSgxKTtcbiAgICB0ci5zdGVwKFwiYW5jZXN0b3JcIiwgY3V0LCBlbmQsIG51bGwsIHsgdHlwZXM6IFtiZWZvcmUudHlwZV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb25uKSksXG4gICAgICBhdHRyczogW2JlZm9yZS5hdHRyc10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb25uLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSkpKSB9KTtcbiAgICB0ci5qb2luKGVuZCk7XG4gICAgdHIuam9pbihjdXQpO1xuICAgIGlmICh0ci5hcHBseShhbmRTY3JvbGwpICE9PSBmYWxzZSkgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbEFmdGVyID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkZyb20pKHBtLmRvYywgY3V0LCAxKTtcbiAgcmV0dXJuIHBtLnRyLmxpZnQoc2VsQWZ0ZXIuZnJvbSwgc2VsQWZ0ZXIudG8pLmFwcGx5KGFuZFNjcm9sbCk7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImpvaW5CYWNrd2FyZFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggdGhlIGJsb2NrIGFib3ZlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb240ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjQuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNC5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPiAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxuICAgIHZhciBiZWZvcmUgPSB1bmRlZmluZWQsXG4gICAgICAgIGN1dCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XG4gICAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKTtcbiAgICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKTtcbiAgICAgIH1cbiAgICB9IC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIHRoaXMsIHRyeSB0byBsaWZ0XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBwbS50ci5saWZ0KGhlYWQpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBkb2Vzbid0IGFsbG93IGNoaWxkcmVuLCBkZWxldGUgaXRcbiAgICBpZiAoYmVmb3JlLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGN1dC5tb3ZlKC0xKSwgY3V0KS5hcHBseShhbmRTY3JvbGwpO1xuXG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgcmV0dXJuIGRlbGV0ZUJhcnJpZXIocG0sIGN1dCk7XG4gIH0sXG4gIGtleTogW1wiQmFja3NwYWNlKDMwKVwiLCBcIk1vZC1CYWNrc3BhY2UoMzApXCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiZGVsZXRlQ2hhckJlZm9yZVwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjUgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uNS5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb241LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGZyb20gPSBtb3ZlQmFja3dhcmQocG0uZG9jLnBhdGgoaGVhZC5wYXRoKSwgaGVhZC5vZmZzZXQsIFwiY2hhclwiKTtcbiAgICByZXR1cm4gcG0udHJbXCJkZWxldGVcIl0obmV3IF9tb2RlbC5Qb3MoaGVhZC5wYXRoLCBmcm9tKSwgaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkJhY2tzcGFjZSg2MClcIixcbiAgbWFjS2V5OiBcIkN0cmwtSCg0MClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVdvcmRCZWZvcmVcIixcbiAgbGFiZWw6IFwiRGVsZXRlIHRoZSB3b3JkIGJlZm9yZSB0aGUgY3Vyc29yXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb242ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjYuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNi5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBmcm9tID0gbW92ZUJhY2t3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcIndvcmRcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgZnJvbSksIGhlYWQpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJNb2QtQmFja3NwYWNlKDQwKVwiLFxuICBtYWNLZXk6IFwiQWx0LUJhY2tzcGFjZSg0MClcIlxufSk7XG5cbmZ1bmN0aW9uIG1vdmVGb3J3YXJkKHBhcmVudCwgb2Zmc2V0LCBieSkge1xuICBpZiAoYnkgIT0gXCJjaGFyXCIgJiYgYnkgIT0gXCJ3b3JkXCIpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbW90aW9uIHVuaXQ6IFwiICsgYnkpO1xuXG4gIHZhciBjYXQgPSBudWxsLFxuICAgICAgY291bnRlZCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBpZiAob2Zmc2V0ID09IHBhcmVudC5zaXplKSByZXR1cm4gb2Zmc2V0O1xuXG4gICAgdmFyIF9wYXJlbnQkY2h1bmtBZnRlciA9IHBhcmVudC5jaHVua0FmdGVyKG9mZnNldCk7XG5cbiAgICB2YXIgc3RhcnQgPSBfcGFyZW50JGNodW5rQWZ0ZXIuc3RhcnQ7XG4gICAgdmFyIG5vZGUgPSBfcGFyZW50JGNodW5rQWZ0ZXIubm9kZTtcblxuICAgIGlmICghbm9kZS5pc1RleHQpIHJldHVybiBjYXQgPyBvZmZzZXQgOiBvZmZzZXQgKyAxO1xuXG4gICAgaWYgKGJ5ID09IFwiY2hhclwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPCBub2RlLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEoMCwgX2NoYXIuaXNFeHRlbmRpbmdDaGFyKShub2RlLnRleHQuY2hhckF0KGkgKyAxKSkpIHJldHVybiBvZmZzZXQgKyAxO1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5ID09IFwid29yZFwiKSB7XG4gICAgICBmb3IgKHZhciBpID0gb2Zmc2V0IC0gc3RhcnQ7IGkgPCBub2RlLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5leHRDaGFyQ2F0ID0gKDAsIF9jaGFyLmNoYXJDYXRlZ29yeSkobm9kZS50ZXh0LmNoYXJBdChpKSk7XG4gICAgICAgIGlmIChjYXQgPT0gbnVsbCB8fCBjb3VudGVkID09IDEgJiYgY2F0ID09IFwic3BhY2VcIikgY2F0ID0gbmV4dENoYXJDYXQ7ZWxzZSBpZiAoY2F0ICE9IG5leHRDaGFyQ2F0KSByZXR1cm4gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgY291bnRlZCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luRm9yd2FyZFwiLFxuICBsYWJlbDogXCJKb2luIHdpdGggdGhlIGJsb2NrIGJlbG93XCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb243ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjcuaGVhZDtcbiAgICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uNy5lbXB0eTtcblxuICAgIGlmICghZW1wdHkgfHwgaGVhZC5vZmZzZXQgPCBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEZpbmQgdGhlIG5vZGUgYWZ0ZXIgdGhpcyBvbmVcbiAgICB2YXIgYWZ0ZXIgPSB1bmRlZmluZWQsXG4gICAgICAgIGN1dCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFhZnRlciAmJiBpID49IDA7IGktLSkge1xuICAgICAgY3V0ID0gaGVhZC5zaG9ydGVuKGksIDEpO1xuICAgICAgdmFyIF9wYXJlbnQgPSBwbS5kb2MucGF0aChjdXQucGF0aCk7XG4gICAgICBpZiAoY3V0Lm9mZnNldCA8IF9wYXJlbnQuc2l6ZSkgYWZ0ZXIgPSBfcGFyZW50LmNoaWxkKGN1dC5vZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCFhZnRlcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgZG9lc24ndCBhbGxvdyBjaGlsZHJlbiwgZGVsZXRlIGl0XG4gICAgaWYgKGFmdGVyLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGN1dCwgY3V0Lm1vdmUoMSkpLmFwcGx5KGFuZFNjcm9sbCk7XG5cbiAgICAvLyBBcHBseSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICByZXR1cm4gZGVsZXRlQmFycmllcihwbSwgY3V0KTtcbiAgfSxcbiAga2V5OiBbXCJEZWxldGUoMzApXCIsIFwiTW9kLURlbGV0ZSgzMClcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJkZWxldGVDaGFyQWZ0ZXJcIixcbiAgbGFiZWw6IFwiRGVsZXRlIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBjdXJzb3JcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjggPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGhlYWQgPSBfcG0kc2VsZWN0aW9uOC5oZWFkO1xuICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb244LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA9PSBwbS5kb2MucGF0aChoZWFkLnBhdGgpLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdG8gPSBtb3ZlRm9yd2FyZChwbS5kb2MucGF0aChoZWFkLnBhdGgpLCBoZWFkLm9mZnNldCwgXCJjaGFyXCIpO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShoZWFkLCBuZXcgX21vZGVsLlBvcyhoZWFkLnBhdGgsIHRvKSkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkRlbGV0ZSg2MClcIixcbiAgbWFjS2V5OiBcIkN0cmwtRCg2MClcIlxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImRlbGV0ZVdvcmRBZnRlclwiLFxuICBsYWJlbDogXCJEZWxldGUgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnNvclwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uOSA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb245LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjkuZW1wdHk7XG5cbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID09IHBtLmRvYy5wYXRoKGhlYWQucGF0aCkuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0byA9IG1vdmVGb3J3YXJkKHBtLmRvYy5wYXRoKGhlYWQucGF0aCksIGhlYWQub2Zmc2V0LCBcIndvcmRcIik7XG4gICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGhlYWQsIG5ldyBfbW9kZWwuUG9zKGhlYWQucGF0aCwgdG8pKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiTW9kLURlbGV0ZSg0MClcIixcbiAgbWFjS2V5OiBbXCJDdHJsLUFsdC1CYWNrc3BhY2UoNDApXCIsIFwiQWx0LURlbGV0ZSg0MClcIiwgXCJBbHQtRCg0MClcIl1cbn0pO1xuXG5mdW5jdGlvbiBqb2luUG9pbnRBYm92ZShwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjEwID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xMC5ub2RlO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xMC5mcm9tO1xuXG4gIGlmIChub2RlKSByZXR1cm4gKDAsIF90cmFuc2Zvcm0uam9pbmFibGVCbG9ja3MpKHBtLmRvYywgZnJvbSkgPyBmcm9tIDogbnVsbDtlbHNlIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luUG9pbnQpKHBtLmRvYywgZnJvbSwgLTEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJqb2luVXBcIixcbiAgbGFiZWw6IFwiSm9pbiB3aXRoIGFib3ZlIGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgcG9pbnQgPSBqb2luUG9pbnRBYm92ZShwbSk7XG4gICAgaWYgKCFwb2ludCkgcmV0dXJuIGZhbHNlO1xuICAgIHBtLnRyLmpvaW4ocG9pbnQpLmFwcGx5KCk7XG4gICAgaWYgKG5vZGUpIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9pbnQubW92ZSgtMSkpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBqb2luUG9pbnRBYm92ZShwbSk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJibG9ja1wiLCBtZW51UmFuazogODAsXG4gIGljb246IHtcbiAgICB3aWR0aDogODAwLCBoZWlnaHQ6IDkwMCxcbiAgICBwYXRoOiBcIk0wIDc1aDgwMHYxMjVoLTgwMHogTTAgODI1aDgwMHYtMTI1aC04MDB6IE0yNTAgNDAwaDEwMHYtMTAwaDEwMHYxMDBoMTAwdjEwMGgtMTAwdjEwMGgtMTAwdi0xMDBoLTEwMHpcIlxuICB9LFxuICBrZXk6IFwiQWx0LVVwXCJcbn0pO1xuXG5mdW5jdGlvbiBqb2luUG9pbnRCZWxvdyhwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjExID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24xMS5ub2RlO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTEudG87XG5cbiAgaWYgKG5vZGUpIHJldHVybiAoMCwgX3RyYW5zZm9ybS5qb2luYWJsZUJsb2NrcykocG0uZG9jLCB0bykgPyB0byA6IG51bGw7ZWxzZSByZXR1cm4gKDAsIF90cmFuc2Zvcm0uam9pblBvaW50KShwbS5kb2MsIHRvLCAxKTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiam9pbkRvd25cIixcbiAgbGFiZWw6IFwiSm9pbiB3aXRoIGJlbG93IGJsb2NrXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIG5vZGUgPSBwbS5zZWxlY3Rpb24ubm9kZTtcbiAgICB2YXIgcG9pbnQgPSBqb2luUG9pbnRCZWxvdyhwbSk7XG4gICAgaWYgKCFwb2ludCkgcmV0dXJuIGZhbHNlO1xuICAgIHBtLnRyLmpvaW4ocG9pbnQpLmFwcGx5KCk7XG4gICAgaWYgKG5vZGUpIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9pbnQubW92ZSgtMSkpO1xuICB9LFxuICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgIHJldHVybiBqb2luUG9pbnRCZWxvdyhwbSk7XG4gIH0sXG4gIGtleTogXCJBbHQtRG93blwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibGlmdFwiLFxuICBsYWJlbDogXCJMaWZ0IG91dCBvZiBlbmNsb3NpbmcgYmxvY2tcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjEyID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjEyLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjEyLnRvO1xuXG4gICAgcmV0dXJuIHBtLnRyLmxpZnQoZnJvbSwgdG8pLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24xMyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24xMy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24xMy50bztcblxuICAgIHJldHVybiAoMCwgX3RyYW5zZm9ybS5jYW5MaWZ0KShwbS5kb2MsIGZyb20sIHRvKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA3NSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNMjE5IDMxMHYzMjlxMCA3LTUgMTJ0LTEyIDVxLTggMC0xMy01bC0xNjQtMTY0cS01LTUtNS0xM3Q1LTEzbDE2NC0xNjRxNS01IDEzLTUgNyAwIDEyIDV0NSAxMnpNMTAyNCA3NDl2MTA5cTAgNy01IDEydC0xMiA1aC05ODdxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg5ODdxNyAwIDEyIDV0NSAxMnpNMTAyNCA1MzB2MTA5cTAgNy01IDEydC0xMiA1aC02MjFxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg2MjFxNyAwIDEyIDV0NSAxMnpNMTAyNCAzMTB2MTA5cTAgNy01IDEydC0xMiA1aC02MjFxLTcgMC0xMi01dC01LTEydi0xMDlxMC03IDUtMTJ0MTItNWg2MjFxNyAwIDEyIDV0NSAxMnpNMTAyNCA5MXYxMDlxMCA3LTUgMTJ0LTEyIDVoLTk4N3EtNyAwLTEyLTV0LTUtMTJ2LTEwOXEwLTcgNS0xMnQxMi01aDk4N3E3IDAgMTIgNXQ1IDEyelwiXG4gIH0sXG4gIGtleTogXCJBbHQtTGVmdFwiXG59KTtcblxuZnVuY3Rpb24gaXNBdFRvcE9mTGlzdEl0ZW0oZG9jLCBmcm9tLCB0bywgbGlzdFR5cGUpIHtcbiAgcmV0dXJuIF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiBmcm9tLnBhdGgubGVuZ3RoID49IDIgJiYgZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAxXSA9PSAwICYmIGxpc3RUeXBlLmNhbkNvbnRhaW4oZG9jLnBhdGgoZnJvbS5wYXRoLnNsaWNlKDAsIGZyb20ucGF0aC5sZW5ndGggLSAxKSkpO1xufVxuXG5mdW5jdGlvbiB3cmFwQ29tbWFuZCh0eXBlLCBuYW1lLCBsYWJlbE5hbWUsIGlzTGlzdCwgc3BlYykge1xuICB2YXIgY29tbWFuZCA9IHtcbiAgICBuYW1lOiBcIndyYXBcIiArIG5hbWUsXG4gICAgbGFiZWw6IFwiV3JhcCBpbiBcIiArIGxhYmVsTmFtZSxcbiAgICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24xNCA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjE0LmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTQudG87XG4gICAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb24xNC5oZWFkO3ZhciBkb0pvaW4gPSBmYWxzZTtcbiAgICAgIGlmIChpc0xpc3QgJiYgaGVhZCAmJiBpc0F0VG9wT2ZMaXN0SXRlbShwbS5kb2MsIGZyb20sIHRvLCB0aGlzKSkge1xuICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgICAgICAgaWYgKGZyb20ucGF0aFtmcm9tLnBhdGgubGVuZ3RoIC0gMl0gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBkb0pvaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHRyID0gcG0udHIud3JhcChmcm9tLCB0bywgdGhpcyk7XG4gICAgICBpZiAoZG9Kb2luKSB0ci5qb2luKGZyb20uc2hvcnRlbihmcm9tLmRlcHRoIC0gMikpO1xuICAgICAgcmV0dXJuIHRyLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24xNSA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjE1LmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTUudG87XG4gICAgICB2YXIgaGVhZCA9IF9wbSRzZWxlY3Rpb24xNS5oZWFkO1xuXG4gICAgICBpZiAoaXNMaXN0ICYmIGhlYWQgJiYgaXNBdFRvcE9mTGlzdEl0ZW0ocG0uZG9jLCBmcm9tLCB0bywgdGhpcykgJiYgZnJvbS5wYXRoW2Zyb20ucGF0aC5sZW5ndGggLSAyXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gKDAsIF90cmFuc2Zvcm0uY2FuV3JhcCkocG0uZG9jLCBmcm9tLCB0bywgdGhpcyk7XG4gICAgfVxuICB9O1xuICBmb3IgKHZhciBrZXkgaW4gc3BlYykge1xuICAgIGNvbW1hbmRba2V5XSA9IHNwZWNba2V5XTtcbiAgfXR5cGUucmVnaXN0ZXIoXCJjb21tYW5kXCIsIGNvbW1hbmQpO1xufVxuXG53cmFwQ29tbWFuZChfbW9kZWwuQnVsbGV0TGlzdCwgXCJCdWxsZXRMaXN0XCIsIFwiYnVsbGV0IGxpc3RcIiwgdHJ1ZSwge1xuICBtZW51R3JvdXA6IFwiYmxvY2tcIiwgbWVudVJhbms6IDQwLFxuICBpY29uOiB7XG4gICAgd2lkdGg6IDc2OCwgaGVpZ2h0OiA4OTYsXG4gICAgcGF0aDogXCJNMCA1MTJoMTI4di0xMjhoLTEyOHYxMjh6TTAgMjU2aDEyOHYtMTI4aC0xMjh2MTI4ek0wIDc2OGgxMjh2LTEyOGgtMTI4djEyOHpNMjU2IDUxMmg1MTJ2LTEyOGgtNTEydjEyOHpNMjU2IDI1Nmg1MTJ2LTEyOGgtNTEydjEyOHpNMjU2IDc2OGg1MTJ2LTEyOGgtNTEydjEyOHpcIlxuICB9LFxuICBrZXk6IFtcIkFsdC1SaWdodCAnKidcIiwgXCJBbHQtUmlnaHQgJy0nXCJdXG59KTtcblxud3JhcENvbW1hbmQoX21vZGVsLk9yZGVyZWRMaXN0LCBcIk9yZGVyZWRMaXN0XCIsIFwib3JkZXJlZCBsaXN0XCIsIHRydWUsIHtcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA0MSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA3NjgsIGhlaWdodDogODk2LFxuICAgIHBhdGg6IFwiTTMyMCA1MTJoNDQ4di0xMjhoLTQ0OHYxMjh6TTMyMCA3NjhoNDQ4di0xMjhoLTQ0OHYxMjh6TTMyMCAxMjh2MTI4aDQ0OHYtMTI4aC00NDh6TTc5IDM4NGg3OHYtMjU2aC0zNmwtODUgMjN2NTBsNDMtMnYxODV6TTE4OSA1OTBjMC0zNi0xMi03OC05Ni03OC0zMyAwLTY0IDYtODMgMTZsMSA2NmMyMS0xMCA0Mi0xNSA2Ny0xNXMzMiAxMSAzMiAyOGMwIDI2LTMwIDU4LTExMCAxMTJ2NTBoMTkydi02N2wtOTEgMmM0OS0zMCA4Ny02NiA4Ny0xMTNsMS0xelwiXG4gIH0sXG4gIGtleTogXCJBbHQtUmlnaHQgJzEnXCJcbn0pO1xuXG53cmFwQ29tbWFuZChfbW9kZWwuQmxvY2tRdW90ZSwgXCJCbG9ja1F1b3RlXCIsIFwiYmxvY2sgcXVvdGVcIiwgZmFsc2UsIHtcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA0NSxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiA2NDAsIGhlaWdodDogODk2LFxuICAgIHBhdGg6IFwiTTAgNDQ4djI1NmgyNTZ2LTI1NmgtMTI4YzAgMCAwLTEyOCAxMjgtMTI4di0xMjhjMCAwLTI1NiAwLTI1NiAyNTZ6TTY0MCAzMjB2LTEyOGMwIDAtMjU2IDAtMjU2IDI1NnYyNTZoMjU2di0yNTZoLTEyOGMwIDAgMC0xMjggMTI4LTEyOHpcIlxuICB9LFxuICBrZXk6IFtcIkFsdC1SaWdodCAnPidcIiwgXCJBbHQtUmlnaHQgJ1xcXCInXCJdXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwibmV3bGluZUluQ29kZVwiLFxuICBsYWJlbDogXCJJbnNlcnQgbmV3bGluZVwiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTYgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTYuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTYudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTYubm9kZTt2YXIgYmxvY2sgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFub2RlICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiAoYmxvY2sgPSBwbS5kb2MucGF0aChmcm9tLnBhdGgpKS50eXBlLmlzQ29kZSAmJiB0by5vZmZzZXQgPCBibG9jay5zaXplKSByZXR1cm4gcG0udHIudHlwZVRleHQoXCJcXG5cIikuYXBwbHkoYW5kU2Nyb2xsKTtlbHNlIHJldHVybiBmYWxzZTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDEwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwiY3JlYXRlUGFyYWdyYXBoTmVhclwiLFxuICBsYWJlbDogXCJDcmVhdGUgYSBwYXJhZ3JhcGggbmVhciB0aGUgc2VsZWN0ZWQgbGVhZiBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTcgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTcuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTcudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTcubm9kZTtcblxuICAgIGlmICghbm9kZSB8fCAhbm9kZS5pc0Jsb2NrIHx8IG5vZGUudHlwZS5jb250YWlucykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzaWRlID0gZnJvbS5vZmZzZXQgPyB0byA6IGZyb207XG4gICAgcG0udHIuaW5zZXJ0KHNpZGUsIHBtLnNjaGVtYS5kZWZhdWx0VGV4dGJsb2NrVHlwZSgpLmNyZWF0ZSgpKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3Moc2lkZS50b1BhdGgoKSwgMCkpO1xuICB9LFxuICBrZXk6IFwiRW50ZXIoMjApXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJsaWZ0RW1wdHlCbG9ja1wiLFxuICBsYWJlbDogXCJNb3ZlIGN1cnJlbnQgYmxvY2sgdXBcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjE4ID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBoZWFkID0gX3BtJHNlbGVjdGlvbjE4LmhlYWQ7XG4gICAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjE4LmVtcHR5O1xuXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDAgfHwgcG0uZG9jLnBhdGgoaGVhZC5wYXRoKS5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGhlYWQuZGVwdGggPiAxKSB7XG4gICAgICB2YXIgc2hvcnRlciA9IGhlYWQuc2hvcnRlbigpO1xuICAgICAgaWYgKHNob3J0ZXIub2Zmc2V0ID4gMCAmJiBzaG9ydGVyLm9mZnNldCA8IHBtLmRvYy5wYXRoKHNob3J0ZXIucGF0aCkuc2l6ZSAtIDEgJiYgcG0udHIuc3BsaXQoc2hvcnRlcikuYXBwbHkoKSAhPT0gZmFsc2UpIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHBtLnRyLmxpZnQoaGVhZCkuYXBwbHkoYW5kU2Nyb2xsKTtcbiAgfSxcbiAga2V5OiBcIkVudGVyKDMwKVwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic3BsaXRCbG9ja1wiLFxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBibG9ja1wiLFxuICBydW46IGZ1bmN0aW9uIHJ1bihwbSkge1xuICAgIHZhciBfcG0kc2VsZWN0aW9uMTkgPSBwbS5zZWxlY3Rpb247XG4gICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMTkuZnJvbTtcbiAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMTkudG87XG4gICAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMTkubm9kZTt2YXIgYmxvY2sgPSBwbS5kb2MucGF0aCh0by5wYXRoKTtcbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgIGlmICghZnJvbS5vZmZzZXQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBwbS50ci5zcGxpdChmcm9tKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdHlwZSA9IHRvLm9mZnNldCA9PSBibG9jay5zaXplID8gcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHBtLnRyW1wiZGVsZXRlXCJdKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCB0eXBlKS5hcHBseShhbmRTY3JvbGwpO1xuICAgIH1cbiAgfSxcbiAga2V5OiBcIkVudGVyKDYwKVwiXG59KTtcblxuX21vZGVsLkxpc3RJdGVtLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic3BsaXRMaXN0SXRlbVwiLFxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBsaXN0IGl0ZW1cIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgX3BtJHNlbGVjdGlvbjIwID0gcG0uc2VsZWN0aW9uO1xuICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIwLmZyb207XG4gICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjIwLnRvO1xuICAgIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjIwLm5vZGU7XG5cbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2sgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIV9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLFxuICAgICAgICBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpO1xuICAgIGlmIChncmFuZFBhcmVudC50eXBlICE9IHRoaXMpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbmV4dFR5cGUgPSB0by5vZmZzZXQgPT0gZ3JhbmRQYXJlbnQuY2hpbGQodG9QYXJlbnQub2Zmc2V0KS5zaXplID8gcG0uc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkgOiBudWxsO1xuICAgIHJldHVybiBwbS50cltcImRlbGV0ZVwiXShmcm9tLCB0bykuc3BsaXQoZnJvbSwgMiwgbmV4dFR5cGUpLmFwcGx5KGFuZFNjcm9sbCk7XG4gIH0sXG4gIGtleTogXCJFbnRlcig1MClcIlxufSk7XG5cbmZ1bmN0aW9uIGFscmVhZHlIYXNCbG9ja1R5cGUoZG9jLCBmcm9tLCB0bywgdHlwZSwgYXR0cnMpIHtcbiAgdmFyIGZvdW5kID0gZmFsc2U7XG4gIGlmICghYXR0cnMpIGF0dHJzID0ge307XG4gIGRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8gfHwgZnJvbSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS5pc1RleHRibG9jaykge1xuICAgICAgaWYgKG5vZGUuaGFzTWFya3VwKHR5cGUsIGF0dHJzKSkgZm91bmQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gYmxvY2tUeXBlQ29tbWFuZCh0eXBlLCBuYW1lLCBsYWJlbE5hbWUsIGF0dHJzLCBrZXkpIHtcbiAgaWYgKCFhdHRycykgYXR0cnMgPSB7fTtcbiAgdHlwZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgbGFiZWw6IFwiQ2hhbmdlIHRvIFwiICsgbGFiZWxOYW1lLFxuICAgIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgICB2YXIgX3BtJHNlbGVjdGlvbjIxID0gcG0uc2VsZWN0aW9uO1xuICAgICAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjEuZnJvbTtcbiAgICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMS50bztcblxuICAgICAgcmV0dXJuIHBtLnRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgdGhpcywgYXR0cnMpLmFwcGx5KGFuZFNjcm9sbCk7XG4gICAgfSxcbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChwbSkge1xuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24yMiA9IHBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjIyLmZyb207XG4gICAgICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjIudG87XG4gICAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24yMi5ub2RlO1xuXG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUuaGFzTWFya3VwKHRoaXMsIGF0dHJzKTtlbHNlIHJldHVybiAhYWxyZWFkeUhhc0Jsb2NrVHlwZShwbS5kb2MsIGZyb20sIHRvLCB0aGlzLCBhdHRycyk7XG4gICAgfSxcbiAgICBrZXk6IGtleVxuICB9KTtcbn1cblxuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDFcIiwgXCJoZWFkaW5nIDFcIiwgeyBsZXZlbDogMSB9LCBcIk1vZC1IICcxJ1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUgyXCIsIFwiaGVhZGluZyAyXCIsIHsgbGV2ZWw6IDIgfSwgXCJNb2QtSCAnMidcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VIM1wiLCBcImhlYWRpbmcgM1wiLCB7IGxldmVsOiAzIH0sIFwiTW9kLUggJzMnXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuSGVhZGluZywgXCJtYWtlSDRcIiwgXCJoZWFkaW5nIDRcIiwgeyBsZXZlbDogNCB9LCBcIk1vZC1IICc0J1wiKTtcbmJsb2NrVHlwZUNvbW1hbmQoX21vZGVsLkhlYWRpbmcsIFwibWFrZUg1XCIsIFwiaGVhZGluZyA1XCIsIHsgbGV2ZWw6IDUgfSwgXCJNb2QtSCAnNSdcIik7XG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5IZWFkaW5nLCBcIm1ha2VINlwiLCBcImhlYWRpbmcgNlwiLCB7IGxldmVsOiA2IH0sIFwiTW9kLUggJzYnXCIpO1xuXG5ibG9ja1R5cGVDb21tYW5kKF9tb2RlbC5QYXJhZ3JhcGgsIFwibWFrZVBhcmFncmFwaFwiLCBcInBhcmFncmFwaFwiLCBudWxsLCBcIk1vZC1QXCIpO1xuYmxvY2tUeXBlQ29tbWFuZChfbW9kZWwuQ29kZUJsb2NrLCBcIm1ha2VDb2RlQmxvY2tcIiwgXCJjb2RlIGJsb2NrXCIsIG51bGwsIFwiTW9kLVxcXFxcIik7XG5cbl9tb2RlbC5Ib3Jpem9udGFsUnVsZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcImluc2VydEhvcml6b250YWxSdWxlXCIsXG4gIGxhYmVsOiBcIkluc2VydCBob3Jpem9udGFsIHJ1bGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICByZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSgpKS5hcHBseShhbmRTY3JvbGwpO1xuICB9LFxuICBrZXk6IFwiTW9kLVNwYWNlXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJ1bmRvXCIsXG4gIGxhYmVsOiBcIlVuZG8gbGFzdCBjaGFuZ2VcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICBwbS5zY3JvbGxJbnRvVmlldygpO3JldHVybiBwbS5oaXN0b3J5LnVuZG8oKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gcG0uaGlzdG9yeS5jYW5VbmRvKCk7XG4gIH0sXG4gIG1lbnVHcm91cDogXCJoaXN0b3J5XCIsIG1lbnVSYW5rOiAxMCxcbiAgaWNvbjoge1xuICAgIHdpZHRoOiAxMDI0LCBoZWlnaHQ6IDEwMjQsXG4gICAgcGF0aDogXCJNNzYxIDEwMjRjMTEzLTIwNiAxMzItNTIwLTMxMy01MDl2MjUzbC0zODQtMzg0IDM4NC0zODR2MjQ4YzUzNC0xMyA1OTQgNDcyIDMxMyA3NzV6XCJcbiAgfSxcbiAga2V5OiBcIk1vZC1aXCJcbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJyZWRvXCIsXG4gIGxhYmVsOiBcIlJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgcG0uc2Nyb2xsSW50b1ZpZXcoKTtyZXR1cm4gcG0uaGlzdG9yeS5yZWRvKCk7XG4gIH0sXG4gIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHBtKSB7XG4gICAgcmV0dXJuIHBtLmhpc3RvcnkuY2FuUmVkbygpO1xuICB9LFxuICBtZW51R3JvdXA6IFwiaGlzdG9yeVwiLCBtZW51UmFuazogMjAsXG4gIGljb246IHtcbiAgICB3aWR0aDogMTAyNCwgaGVpZ2h0OiAxMDI0LFxuICAgIHBhdGg6IFwiTTU3NiAyNDh2LTI0OGwzODQgMzg0LTM4NCAzODR2LTI1M2MtNDQ2LTEwLTQyNyAzMDMtMzEzIDUwOS0yODAtMzAzLTIyMS03ODkgMzEzLTc3NXpcIlxuICB9LFxuICBrZXk6IFtcIk1vZC1ZXCIsIFwiU2hpZnQtTW9kLVpcIl1cbn0pO1xuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJ0ZXh0YmxvY2tUeXBlXCIsXG4gIGxhYmVsOiBcIkNoYW5nZSBibG9jayB0eXBlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtLCB0eXBlKSB7XG4gICAgdmFyIF9wbSRzZWxlY3Rpb24yMyA9IHBtLnNlbGVjdGlvbjtcbiAgICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yMy5mcm9tO1xuICAgIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yMy50bztcblxuICAgIHJldHVybiBwbS50ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIHR5cGUudHlwZSwgdHlwZS5hdHRycykuYXBwbHkoKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICB2YXIgbm9kZSA9IHBtLnNlbGVjdGlvbi5ub2RlO1xuXG4gICAgcmV0dXJuICFub2RlIHx8IG5vZGUuaXNUZXh0YmxvY2s7XG4gIH0sXG4gIHBhcmFtczogW3sgbGFiZWw6IFwiVHlwZVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBsaXN0VGV4dGJsb2NrVHlwZXMsIFwiZGVmYXVsdFwiOiBjdXJyZW50VGV4dGJsb2NrVHlwZSwgZGVmYXVsdExhYmVsOiBcIlR5cGUuLi5cIiB9XSxcbiAgZGlzcGxheTogXCJzZWxlY3RcIixcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiAxMFxufSk7XG5cbl9tb2RlbC5QYXJhZ3JhcGgucHJvdG90eXBlLnRleHRibG9ja1R5cGVzID0gW3sgbGFiZWw6IFwiTm9ybWFsXCIsIHJhbms6IDEwIH1dO1xuX21vZGVsLkNvZGVCbG9jay5wcm90b3R5cGUudGV4dGJsb2NrVHlwZXMgPSBbeyBsYWJlbDogXCJDb2RlXCIsIHJhbms6IDIwIH1dO1xuX21vZGVsLkhlYWRpbmcucHJvdG90eXBlLnRleHRibG9ja1R5cGVzID0gWzEsIDIsIDMsIDQsIDUsIDZdLm1hcChmdW5jdGlvbiAobikge1xuICByZXR1cm4geyBsYWJlbDogXCJIZWFkIFwiICsgbiwgYXR0cnM6IHsgbGV2ZWw6IG4gfSwgcmFuazogMzAgKyBuIH07XG59KTtcblxuZnVuY3Rpb24gbGlzdFRleHRibG9ja1R5cGVzKHBtKSB7XG4gIHZhciBjYWNoZWQgPSBwbS5zY2hlbWEuY2FjaGVkLnRleHRibG9ja1R5cGVzO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIHZhciBmb3VuZCA9IFtdO1xuICBmb3IgKHZhciBfbmFtZTMgaW4gcG0uc2NoZW1hLm5vZGVzKSB7XG4gICAgdmFyIHR5cGUgPSBwbS5zY2hlbWEubm9kZXNbX25hbWUzXTtcbiAgICBpZiAoIXR5cGUudGV4dGJsb2NrVHlwZXMpIGNvbnRpbnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZS50ZXh0YmxvY2tUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSB0eXBlLnRleHRibG9ja1R5cGVzW2ldO1xuICAgICAgKDAsIF91dGlsU29ydGVkaW5zZXJ0MltcImRlZmF1bHRcIl0pKGZvdW5kLCB7IGxhYmVsOiBpbmZvLmxhYmVsLCB2YWx1ZTogeyB0eXBlOiB0eXBlLCBhdHRyczogaW5mby5hdHRycyB9LCByYW5rOiBpbmZvLnJhbmsgfSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucmFuayAtIGIucmFuaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG0uc2NoZW1hLmNhY2hlZC50ZXh0YmxvY2tUeXBlcyA9IGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjdXJyZW50VGV4dGJsb2NrVHlwZShwbSkge1xuICB2YXIgX3BtJHNlbGVjdGlvbjI0ID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZnJvbSA9IF9wbSRzZWxlY3Rpb24yNC5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMjQudG87XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjI0Lm5vZGU7XG5cbiAgaWYgKCFub2RlIHx8IG5vZGUuaXNJbmxpbmUpIHtcbiAgICBpZiAoIV9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSkgcmV0dXJuIG51bGw7XG4gICAgbm9kZSA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCk7XG4gIH0gZWxzZSBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgdHlwZXMgPSBsaXN0VGV4dGJsb2NrVHlwZXMocG0pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRwID0gdHlwZXNbaV0sXG4gICAgICAgIHZhbCA9IHRwLnZhbHVlO1xuICAgIGlmIChub2RlLmhhc01hcmt1cCh2YWwudHlwZSwgdmFsLmF0dHJzKSkgcmV0dXJuIHRwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vZGVBYm92ZVNlbGVjdGlvbihwbSkge1xuICB2YXIgc2VsID0gcG0uc2VsZWN0aW9uLFxuICAgICAgaSA9IDA7XG4gIGlmIChzZWwubm9kZSkgcmV0dXJuICEhc2VsLmZyb20uZGVwdGggJiYgc2VsLmZyb20uc2hvcnRlbigpO1xuICBmb3IgKDsgaSA8IHNlbC5oZWFkLmRlcHRoICYmIGkgPCBzZWwuYW5jaG9yLmRlcHRoOyBpKyspIGlmIChzZWwuaGVhZC5wYXRoW2ldICE9IHNlbC5hbmNob3IucGF0aFtpXSkgYnJlYWs7XG4gIHJldHVybiBpID09IDAgPyBmYWxzZSA6IHNlbC5oZWFkLnNob3J0ZW4oaSAtIDEpO1xufVxuXG5fb3B0aW9ucy5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcbiAgbmFtZTogXCJzZWxlY3RQYXJlbnRCbG9ja1wiLFxuICBsYWJlbDogXCJTZWxlY3QgcGFyZW50IG5vZGVcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVBYm92ZVNlbGVjdGlvbihwbSk7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcG0uc2V0Tm9kZVNlbGVjdGlvbihub2RlKTtcbiAgfSxcbiAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QocG0pIHtcbiAgICByZXR1cm4gbm9kZUFib3ZlU2VsZWN0aW9uKHBtKTtcbiAgfSxcbiAgbWVudUdyb3VwOiBcImJsb2NrXCIsIG1lbnVSYW5rOiA5MCxcbiAgaWNvbjogeyB0ZXh0OiBcIuKsmlwiLCBzdHlsZTogXCJmb250LXdlaWdodDogYm9sZDsgdmVydGljYWwtYWxpZ246IDIwJVwiIH0sXG4gIGtleTogXCJFc2NcIlxufSk7XG5cbmZ1bmN0aW9uIG1vdmVTZWxlY3Rpb25CbG9jayhwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjUgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI1LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNS50bztcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjUubm9kZTtcblxuICB2YXIgc2lkZSA9IGRpciA+IDAgPyB0byA6IGZyb207XG4gIHJldHVybiAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uRnJvbSkocG0uZG9jLCBub2RlICYmIG5vZGUuaXNCbG9jayA/IHNpZGUgOiBzaWRlLnNob3J0ZW4obnVsbCwgZGlyID4gMCA/IDEgOiAwKSwgZGlyKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0QmxvY2tIb3Jpem9udGFsbHkocG0sIGRpcikge1xuICB2YXIgX3BtJHNlbGVjdGlvbjI2ID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgZW1wdHkgPSBfcG0kc2VsZWN0aW9uMjYuZW1wdHk7XG4gIHZhciBub2RlID0gX3BtJHNlbGVjdGlvbjI2Lm5vZGU7XG4gIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbjI2LmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24yNi50bztcblxuICBpZiAoIWVtcHR5ICYmICFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUgJiYgbm9kZS5pc0lubGluZSkge1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24oZGlyID4gMCA/IHRvIDogZnJvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgcGFyZW50ID0gdW5kZWZpbmVkO1xuICBpZiAoIW5vZGUgJiYgKHBhcmVudCA9IHBtLmRvYy5wYXRoKGZyb20ucGF0aCkpICYmIChkaXIgPiAwID8gZnJvbS5vZmZzZXQgPCBwYXJlbnQuc2l6ZSA6IGZyb20ub2Zmc2V0KSkge1xuICAgIHZhciBfcmVmID0gZGlyID4gMCA/IHBhcmVudC5jaHVua0FmdGVyKGZyb20ub2Zmc2V0KSA6IHBhcmVudC5jaHVua0JlZm9yZShmcm9tLm9mZnNldCk7XG5cbiAgICB2YXIgbmV4dE5vZGUgPSBfcmVmLm5vZGU7XG4gICAgdmFyIHN0YXJ0ID0gX3JlZi5zdGFydDtcblxuICAgIGlmIChuZXh0Tm9kZS50eXBlLnNlbGVjdGFibGUgJiYgc3RhcnQgPT0gZnJvbS5vZmZzZXQgLSAoZGlyID4gMCA/IDAgOiAxKSkge1xuICAgICAgcG0uc2V0Tm9kZVNlbGVjdGlvbihkaXIgPCAwID8gZnJvbS5tb3ZlKC0xKSA6IGZyb20pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBuZXh0ID0gbW92ZVNlbGVjdGlvbkJsb2NrKHBtLCBkaXIpO1xuICBpZiAobmV4dCAmJiAobmV4dCBpbnN0YW5jZW9mIF9zZWxlY3Rpb24uTm9kZVNlbGVjdGlvbiB8fCBub2RlKSkge1xuICAgIHBtLnNldFNlbGVjdGlvbkRpcmVjdChuZXh0KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdEJsb2NrTGVmdFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIHRvIHRoZSBsZWZ0XCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIGRvbmUgPSBzZWxlY3RCbG9ja0hvcml6b250YWxseShwbSwgLTEpO1xuICAgIGlmIChkb25lKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFtcIkxlZnRcIiwgXCJNb2QtTGVmdFwiXVxufSk7XG5cbl9vcHRpb25zLmRlZmF1bHRSZWdpc3RyeS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xuICBuYW1lOiBcInNlbGVjdEJsb2NrUmlnaHRcIixcbiAgbGFiZWw6IFwiTW92ZSB0aGUgc2VsZWN0aW9uIG9udG8gb3Igb3V0IG9mIHRoZSBibG9jayB0byB0aGUgcmlnaHRcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrSG9yaXpvbnRhbGx5KHBtLCAxKTtcbiAgICBpZiAoZG9uZSkgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICByZXR1cm4gZG9uZTtcbiAgfSxcbiAga2V5OiBbXCJSaWdodFwiLCBcIk1vZC1SaWdodFwiXVxufSk7XG5cbmZ1bmN0aW9uIHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgZGlyKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMjcgPSBwbS5zZWxlY3Rpb247XG4gIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24yNy5lbXB0eTtcbiAgdmFyIG5vZGUgPSBfcG0kc2VsZWN0aW9uMjcubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMjcuZnJvbTtcbiAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbjI3LnRvO1xuXG4gIGlmICghZW1wdHkgJiYgIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGVhdmluZ1RleHRibG9jayA9IHRydWU7XG4gIGlmICghbm9kZSB8fCBub2RlLmlzSW5saW5lKSBsZWF2aW5nVGV4dGJsb2NrID0gKDAsIF9zZWxlY3Rpb24udmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2spKHBtLCBkaXIgPiAwID8gdG8gOiBmcm9tLCBkaXIpO1xuXG4gIGlmIChsZWF2aW5nVGV4dGJsb2NrKSB7XG4gICAgdmFyIG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2socG0sIGRpcik7XG4gICAgaWYgKG5leHQgJiYgbmV4dCBpbnN0YW5jZW9mIF9zZWxlY3Rpb24uTm9kZVNlbGVjdGlvbikge1xuICAgICAgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KG5leHQpO1xuICAgICAgaWYgKCFub2RlKSBwbS5zZWwubGFzdE5vbk5vZGVQb3MgPSBmcm9tO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKG5vZGUuaXNJbmxpbmUpIHtcbiAgICAoMCwgX3NlbGVjdGlvbi5zZXRET01TZWxlY3Rpb25Ub1BvcykocG0sIGZyb20pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsYXN0ID0gcG0uc2VsLmxhc3ROb25Ob2RlUG9zO1xuICB2YXIgYmV5b25kID0gKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkZyb20pKHBtLmRvYywgZGlyIDwgMCA/IGZyb20gOiB0bywgZGlyKTtcbiAgaWYgKGxhc3QgJiYgYmV5b25kICYmIF9tb2RlbC5Qb3Muc2FtZVBhdGgobGFzdC5wYXRoLCBiZXlvbmQuZnJvbS5wYXRoKSkge1xuICAgICgwLCBfc2VsZWN0aW9uLnNldERPTVNlbGVjdGlvblRvUG9zKShwbSwgbGFzdCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHBtLnNldFNlbGVjdGlvbkRpcmVjdChiZXlvbmQpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tVcFwiLFxuICBsYWJlbDogXCJNb3ZlIHRoZSBzZWxlY3Rpb24gb250byBvciBvdXQgb2YgdGhlIGJsb2NrIGFib3ZlXCIsXG4gIHJ1bjogZnVuY3Rpb24gcnVuKHBtKSB7XG4gICAgdmFyIGRvbmUgPSBzZWxlY3RCbG9ja1ZlcnRpY2FsbHkocG0sIC0xKTtcbiAgICBpZiAoZG9uZSAhPT0gZmFsc2UpIHBtLnNjcm9sbEludG9WaWV3KCk7XG4gICAgcmV0dXJuIGRvbmU7XG4gIH0sXG4gIGtleTogXCJVcFwiXG59KTtcblxuX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XG4gIG5hbWU6IFwic2VsZWN0QmxvY2tEb3duXCIsXG4gIGxhYmVsOiBcIk1vdmUgdGhlIHNlbGVjdGlvbiBvbnRvIG9yIG91dCBvZiB0aGUgYmxvY2sgYmVsb3dcIixcbiAgcnVuOiBmdW5jdGlvbiBydW4ocG0pIHtcbiAgICB2YXIgZG9uZSA9IHNlbGVjdEJsb2NrVmVydGljYWxseShwbSwgMSk7XG4gICAgaWYgKGRvbmUgIT09IGZhbHNlKSBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBkb25lO1xuICB9LFxuICBrZXk6IFwiRG93blwiXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHNpbHZlcjtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQge1xcbiAgcGFkZGluZzogNHB4IDhweCA0cHggMTRweDtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1kcm9wLXRhcmdldCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogMXB4O1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IHVsLnRpZ2h0IHAsIC5Qcm9zZU1pcnJvci1jb250ZW50IG9sLnRpZ2h0IHAge1xcbiAgbWFyZ2luOiAwO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCB1bCwgLlByb3NlTWlycm9yLWNvbnRlbnQgb2wge1xcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBibG9ja3F1b3RlIHtcXG4gIHBhZGRpbmctbGVmdDogMWVtO1xcbiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjZWVlO1xcbiAgbWFyZ2luLWxlZnQ6IDA7IG1hcmdpbi1yaWdodDogMDtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgcHJlIHtcXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZSB7XFxuICBvdXRsaW5lOiAycHggc29saWQgIzhjZjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgcDpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMTpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMjpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoMzpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNDpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNTpmaXJzdC1jaGlsZCxcXG4uUHJvc2VNaXJyb3ItY29udGVudCBoNjpmaXJzdC1jaGlsZCB7XFxuICBtYXJnaW4tdG9wOiAuM2VtO1xcbn1cXG5cXG4vKiBBZGQgc3BhY2UgYXJvdW5kIHRoZSBociB0byBtYWtlIGNsaWNraW5nIGl0IGVhc2llciAqL1xcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGhyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGhlaWdodDogNnB4O1xcbiAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItY29udGVudCBocjphZnRlciB7XFxuICBjb250ZW50OiBcXFwiXFxcIjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDEwcHg7XFxuICByaWdodDogMTBweDtcXG4gIHRvcDogMnB4O1xcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHNpbHZlcjtcXG59XFxuXFxuLlByb3NlTWlycm9yLWNvbnRlbnQgaW1nIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG59XFxuXFxuLyogTWFrZSBzdXJlIGxpIHNlbGVjdGlvbnMgd3JhcCBhcm91bmQgbWFya2VycyAqL1xcblxcbi5Qcm9zZU1pcnJvci1jb250ZW50IGxpIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lOyAvKiBEb24ndCBkbyB3ZWlyZCBzdHVmZiB3aXRoIG1hcmtlciBjbGlja3MgKi9cXG59XFxuLlByb3NlTWlycm9yLWNvbnRlbnQgbGkgPiAqIHtcXG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xcbn1cXG5cXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogLTMycHg7XFxuICByaWdodDogLTJweDsgdG9wOiAtMnB4OyBib3R0b206IC0ycHg7XFxuICBib3JkZXI6IDJweCBzb2xpZCAjOGNmO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYXBwbHlET01DaGFuZ2UgPSBhcHBseURPTUNoYW5nZTtcbmV4cG9ydHMudGV4dENvbnRleHQgPSB0ZXh0Q29udGV4dDtcbmV4cG9ydHMudGV4dEluQ29udGV4dCA9IHRleHRJbkNvbnRleHQ7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfcGFyc2VEb20gPSByZXF1aXJlKFwiLi4vcGFyc2UvZG9tXCIpO1xuXG52YXIgX3RyYW5zZm9ybVRyZWUgPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtL3RyZWVcIik7XG5cbnZhciBfc2VsZWN0aW9uID0gcmVxdWlyZShcIi4vc2VsZWN0aW9uXCIpO1xuXG5mdW5jdGlvbiBpc0F0RW5kKG5vZGUsIHBvcywgZGVwdGgpIHtcbiAgZm9yICh2YXIgaSA9IGRlcHRoIHx8IDA7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gcG9zLnBhdGhbZGVwdGhdO1xuICAgIGlmIChuIDwgbm9kZS5zaXplIC0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIG5vZGUgPSBub2RlLmNoaWxkKG4pO1xuICB9XG4gIHJldHVybiBwb3Mub2Zmc2V0ID09IG5vZGUuc2l6ZTtcbn1cbmZ1bmN0aW9uIGlzQXRTdGFydChwb3MsIGRlcHRoKSB7XG4gIGlmIChwb3Mub2Zmc2V0ID4gMCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVwdGggfHwgMDsgaSA8IHBvcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBvcy5wYXRoW2RlcHRoXSA+IDApIHJldHVybiBmYWxzZTtcbiAgfXJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5lYXJTZWxlY3Rpb24ocG0pIHtcbiAgdmFyIGRvbSA9IHBtLmNvbnRlbnQsXG4gICAgICBub2RlID0gcG0uZG9jO1xuICB2YXIgX3BtJHNlbGVjdGlvbiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG4gIHZhciB0byA9IF9wbSRzZWxlY3Rpb24udG87XG5cbiAgZm9yICh2YXIgZGVwdGggPSAwOzsgZGVwdGgrKykge1xuICAgIHZhciB0b05vZGUgPSBub2RlLmNoaWxkKHRvLnBhdGhbZGVwdGhdKTtcbiAgICB2YXIgZnJvbVN0YXJ0ID0gaXNBdFN0YXJ0KGZyb20sIGRlcHRoICsgMSk7XG4gICAgdmFyIHRvRW5kID0gaXNBdEVuZCh0b05vZGUsIHRvLCBkZXB0aCArIDEpO1xuICAgIGlmIChmcm9tU3RhcnQgfHwgdG9FbmQgfHwgZnJvbS5wYXRoW2RlcHRoXSAhPSB0by5wYXRoW2RlcHRoXSB8fCB0b05vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIHZhciBzdGFydE9mZnNldCA9IGRlcHRoID09IGZyb20uZGVwdGggPyBmcm9tLm9mZnNldCA6IGZyb20ucGF0aFtkZXB0aF07XG4gICAgICBpZiAoZnJvbVN0YXJ0ICYmIHN0YXJ0T2Zmc2V0ID4gMCkgc3RhcnRPZmZzZXQtLTtcbiAgICAgIHZhciBlbmRPZmZzZXQgPSBkZXB0aCA9PSB0by5kZXB0aCA/IHRvLm9mZnNldCA6IHRvLnBhdGhbZGVwdGhdICsgMTtcbiAgICAgIGlmICh0b0VuZCAmJiBlbmRPZmZzZXQgPCBub2RlLnNpemUgLSAxKSBlbmRPZmZzZXQrKztcbiAgICAgIHZhciBwYXJzZWQgPSAoMCwgX3BhcnNlRG9tLmZyb21ET00pKHBtLnNjaGVtYSwgZG9tLCB7IHRvcE5vZGU6IG5vZGUuY29weSgpLFxuICAgICAgICBmcm9tOiBzdGFydE9mZnNldCxcbiAgICAgICAgdG86IGRvbS5jaGlsZE5vZGVzLmxlbmd0aCAtIChub2RlLnNpemUgLSBlbmRPZmZzZXQpIH0pO1xuICAgICAgcGFyc2VkID0gcGFyc2VkLmNvcHkobm9kZS5jb250ZW50LnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5hcHBlbmQocGFyc2VkLmNvbnRlbnQpLmFwcGVuZChub2RlLmNvbnRlbnQuc2xpY2UoZW5kT2Zmc2V0KSkpO1xuICAgICAgZm9yICh2YXIgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHdyYXAgPSBwbS5kb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgaSkpO1xuICAgICAgICBwYXJzZWQgPSB3cmFwLnJlcGxhY2UoZnJvbS5wYXRoW2ldLCBwYXJzZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gICAgbm9kZSA9IHRvTm9kZTtcbiAgICBkb20gPSAoMCwgX3NlbGVjdGlvbi5maW5kQnlQYXRoKShkb20sIGZyb20ucGF0aFtkZXB0aF0sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZShwbSkge1xuICB2YXIgdXBkYXRlZCA9IHBhcnNlTmVhclNlbGVjdGlvbihwbSk7XG4gIHZhciBjaGFuZ2VTdGFydCA9ICgwLCBfbW9kZWwuZmluZERpZmZTdGFydCkocG0uZG9jLmNvbnRlbnQsIHVwZGF0ZWQuY29udGVudCk7XG4gIGlmIChjaGFuZ2VTdGFydCkge1xuICAgIHZhciBjaGFuZ2VFbmQgPSBmaW5kRGlmZkVuZENvbnN0cmFpbmVkKHBtLmRvYy5jb250ZW50LCB1cGRhdGVkLmNvbnRlbnQsIGNoYW5nZVN0YXJ0KTtcbiAgICAvLyBNYXJrIG5vZGVzIHRvdWNoZWQgYnkgdGhpcyBjaGFuZ2UgYXMgJ3RvIGJlIHJlZHJhd24nXG4gICAgcG0ubWFya1JhbmdlRGlydHkocG0uZG9jLnNpYmxpbmdSYW5nZShjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmEpKTtcblxuICAgIHBtLnRyLnJlcGxhY2UoY2hhbmdlU3RhcnQsIGNoYW5nZUVuZC5hLCB1cGRhdGVkLCBjaGFuZ2VTdGFydCwgY2hhbmdlRW5kLmIpLmFwcGx5KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldEJ5KGZpcnN0LCBzZWNvbmQsIHBvcykge1xuICB2YXIgc2FtZSA9ICgwLCBfdHJhbnNmb3JtVHJlZS5zYW1lUGF0aERlcHRoKShmaXJzdCwgc2Vjb25kKTtcbiAgdmFyIGZpcnN0RW5kID0gc2FtZSA9PSBmaXJzdC5kZXB0aCxcbiAgICAgIHNlY29uZEVuZCA9IHNhbWUgPT0gc2Vjb25kLmRlcHRoO1xuICB2YXIgb2ZmID0gKHNlY29uZEVuZCA/IHNlY29uZC5vZmZzZXQgOiBzZWNvbmQucGF0aFtzYW1lXSkgLSAoZmlyc3RFbmQgPyBmaXJzdC5vZmZzZXQgOiBmaXJzdC5wYXRoW3NhbWVdKTtcbiAgdmFyIHNob3J0ZXIgPSBmaXJzdEVuZCA/IHBvcy5tb3ZlKG9mZikgOiBwb3Muc2hvcnRlbihzYW1lLCBvZmYpO1xuICBpZiAoc2Vjb25kRW5kKSByZXR1cm4gc2hvcnRlcjtlbHNlIHJldHVybiBzaG9ydGVyLmV4dGVuZChuZXcgX21vZGVsLlBvcyhzZWNvbmQucGF0aC5zbGljZShzYW1lKSwgc2Vjb25kLm9mZnNldCkpO1xufVxuXG5mdW5jdGlvbiBmaW5kRGlmZkVuZENvbnN0cmFpbmVkKGEsIGIsIHN0YXJ0KSB7XG4gIHZhciBlbmQgPSAoMCwgX21vZGVsLmZpbmREaWZmRW5kKShhLCBiKTtcbiAgaWYgKCFlbmQpIHJldHVybiBlbmQ7XG4gIGlmIChlbmQuYS5jbXAoc3RhcnQpIDwgMCkgcmV0dXJuIHsgYTogc3RhcnQsIGI6IG9mZnNldEJ5KGVuZC5hLCBzdGFydCwgZW5kLmIpIH07XG4gIGlmIChlbmQuYi5jbXAoc3RhcnQpIDwgMCkgcmV0dXJuIHsgYTogb2Zmc2V0QnkoZW5kLmIsIHN0YXJ0LCBlbmQuYSksIGI6IHN0YXJ0IH07XG4gIHJldHVybiBlbmQ7XG59XG5cbi8vIFRleHQtb25seSBxdWVyaWVzIGZvciBjb21wb3NpdGlvbiBldmVudHNcblxuZnVuY3Rpb24gdGV4dENvbnRleHQoZGF0YSkge1xuICB2YXIgcmFuZ2UgPSBnZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApO1xuICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydENvbnRhaW5lcixcbiAgICAgIGVuZCA9IHJhbmdlLmVuZENvbnRhaW5lcjtcbiAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhcnQubm9kZVZhbHVlLFxuICAgICAgICBsZWFkID0gcmFuZ2Uuc3RhcnRPZmZzZXQsXG4gICAgICAgIF9lbmQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgaWYgKGRhdGEgJiYgX2VuZCA+PSBkYXRhLmxlbmd0aCAmJiB2YWx1ZS5zbGljZShfZW5kIC0gZGF0YS5sZW5ndGgsIF9lbmQpID09IGRhdGEpIGxlYWQgPSBfZW5kIC0gZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIHsgaW5zaWRlOiBzdGFydCwgbGVhZDogbGVhZCwgdHJhaWw6IHZhbHVlLmxlbmd0aCAtIF9lbmQgfTtcbiAgfVxuXG4gIHZhciBzaXplQmVmb3JlID0gbnVsbCxcbiAgICAgIHNpemVBZnRlciA9IG51bGw7XG4gIHZhciBiZWZvcmUgPSBzdGFydC5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0IC0gMV0gfHwgbm9kZUJlZm9yZShzdGFydCk7XG4gIHdoaWxlIChiZWZvcmUubGFzdENoaWxkKSBiZWZvcmUgPSBiZWZvcmUubGFzdENoaWxkO1xuICBpZiAoYmVmb3JlICYmIGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgdmFyIHZhbHVlID0gYmVmb3JlLm5vZGVWYWx1ZTtcbiAgICBzaXplQmVmb3JlID0gdmFsdWUubGVuZ3RoO1xuICAgIGlmIChkYXRhICYmIHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIGRhdGEubGVuZ3RoKSA9PSBkYXRhKSBzaXplQmVmb3JlIC09IGRhdGEubGVuZ3RoO1xuICB9XG4gIHZhciBhZnRlciA9IGVuZC5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF0gfHwgbm9kZUFmdGVyKGVuZCk7XG4gIHdoaWxlIChhZnRlci5maXJzdENoaWxkKSBhZnRlciA9IGFmdGVyLmZpcnN0Q2hpbGQ7XG4gIGlmIChhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PSAzKSBzaXplQWZ0ZXIgPSBhZnRlci5ub2RlVmFsdWUubGVuZ3RoO1xuXG4gIHJldHVybiB7IGJlZm9yZTogYmVmb3JlLCBzaXplQmVmb3JlOiBzaXplQmVmb3JlLFxuICAgIGFmdGVyOiBhZnRlciwgc2l6ZUFmdGVyOiBzaXplQWZ0ZXIgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEluQ29udGV4dChjb250ZXh0LCBkZWZsdCkge1xuICBpZiAoY29udGV4dC5pbnNpZGUpIHtcbiAgICB2YXIgX3ZhbCA9IGNvbnRleHQuaW5zaWRlLm5vZGVWYWx1ZTtcbiAgICByZXR1cm4gX3ZhbC5zbGljZShjb250ZXh0LmxlYWQsIF92YWwubGVuZ3RoIC0gY29udGV4dC50cmFpbCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJlZm9yZSA9IGNvbnRleHQuYmVmb3JlLFxuICAgICAgICBhZnRlciA9IGNvbnRleHQuYWZ0ZXIsXG4gICAgICAgIHZhbCA9IFwiXCI7XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBkZWZsdDtcbiAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09IDMpIHZhbCA9IGJlZm9yZS5ub2RlVmFsdWUuc2xpY2UoY29udGV4dC5zaXplQmVmb3JlKTtcbiAgICB2YXIgc2NhbiA9IHNjYW5UZXh0KGJlZm9yZSwgYWZ0ZXIpO1xuICAgIGlmIChzY2FuID09IG51bGwpIHJldHVybiBkZWZsdDtcbiAgICB2YWwgKz0gc2NhbjtcbiAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIubm9kZVR5cGUgPT0gMykge1xuICAgICAgdmFyIHZhbEFmdGVyID0gYWZ0ZXIubm9kZVZhbHVlO1xuICAgICAgdmFsICs9IHZhbEFmdGVyLnNsaWNlKDAsIHZhbEFmdGVyLmxlbmd0aCAtIGNvbnRleHQuc2l6ZUFmdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub2RlQWZ0ZXIobm9kZSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChuZXh0KSB7XG4gICAgICB3aGlsZSAobmV4dC5maXJzdENoaWxkKSBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQpKSByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub2RlQmVmb3JlKG5vZGUpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwcmV2ID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHdoaWxlIChwcmV2Lmxhc3RDaGlsZCkgcHJldiA9IHByZXYubGFzdENoaWxkO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfVxuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQpKSByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FuVGV4dChzdGFydCwgZW5kKSB7XG4gIHZhciB0ZXh0ID0gXCJcIixcbiAgICAgIGN1ciA9IG5vZGVBZnRlcihzdGFydCk7XG4gIGZvciAoOzspIHtcbiAgICBpZiAoY3VyID09IGVuZCkgcmV0dXJuIHRleHQ7XG4gICAgaWYgKCFjdXIpIHJldHVybiBudWxsO1xuICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMykgdGV4dCArPSBjdXIubm9kZVZhbHVlO1xuICAgIGN1ciA9IGN1ci5maXJzdENoaWxkIHx8IG5vZGVBZnRlcihjdXIpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRyYXcgPSBkcmF3O1xuZXhwb3J0cy5yZWRyYXcgPSByZWRyYXc7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfc2VyaWFsaXplRG9tID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS9kb21cIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9tYWluID0gcmVxdWlyZShcIi4vbWFpblwiKTtcblxuLy8gRklYTUUgY2xlYW4gdXAgdGhyZWFkaW5nIG9mIHBhdGggYW5kIG9mZnNldCwgbWF5YmUgcmVtb3ZlIGZyb20gRE9NIHJlbmRlcmVyIGVudGlyZWx5XG5cbmZ1bmN0aW9uIG9wdGlvbnMocGF0aCwgcmFuZ2VzKSB7XG4gIHJldHVybiB7XG4gICAgb25SZW5kZXI6IGZ1bmN0aW9uIG9uUmVuZGVyKG5vZGUsIGRvbSwgb2Zmc2V0KSB7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0ICYmIG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSB7XG4gICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUuaXNCbG9jaykgZG9tLnNldEF0dHJpYnV0ZShcInBtLWxlYWZcIiwgXCJ0cnVlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuaXNCbG9jayAmJiBvZmZzZXQgIT0gbnVsbCkgZG9tLnNldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiLCBvZmZzZXQpO1xuICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKTtcblxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9LFxuICAgIHJlbmRlcklubGluZUZsYXQ6IGZ1bmN0aW9uIHJlbmRlcklubGluZUZsYXQobm9kZSwgZG9tLCBvZmZzZXQpIHtcbiAgICAgIHJhbmdlcy5hZHZhbmNlVG8obmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0KSk7XG4gICAgICB2YXIgZW5kID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0ICsgbm9kZS53aWR0aCk7XG4gICAgICB2YXIgbmV4dEN1dCA9IHJhbmdlcy5uZXh0Q2hhbmdlQmVmb3JlKGVuZCk7XG5cbiAgICAgIHZhciBpbm5lciA9IGRvbSxcbiAgICAgICAgICB3cmFwcGVkID0gdW5kZWZpbmVkO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLm1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlubmVyID0gaW5uZXIuZmlyc3RDaGlsZDtcbiAgICAgIH1pZiAoZG9tLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgZG9tID0gKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgZG9tKTtcbiAgICAgICAgaWYgKCFuZXh0Q3V0KSB3cmFwcGVkID0gZG9tO1xuICAgICAgfVxuICAgICAgaWYgKCF3cmFwcGVkICYmIChuZXh0Q3V0IHx8IHJhbmdlcy5jdXJyZW50Lmxlbmd0aCkpIHtcbiAgICAgICAgd3JhcHBlZCA9IGlubmVyID09IGRvbSA/IGRvbSA9ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIG51bGwsIGlubmVyKSA6IGlubmVyLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgaW5uZXIpKTtcbiAgICAgIH1cblxuICAgICAgZG9tLnNldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiLCBvZmZzZXQpO1xuICAgICAgaWYgKG5vZGUudHlwZS5jb250YWlucyA9PSBudWxsKSBkb20uc2V0QXR0cmlidXRlKFwicG0tbGVhZlwiLCBub2RlLmlzVGV4dCA/IG5vZGUud2lkdGggOiBcInRydWVcIik7XG5cbiAgICAgIHZhciBpbmxpbmVPZmZzZXQgPSAwO1xuICAgICAgd2hpbGUgKG5leHRDdXQpIHtcbiAgICAgICAgdmFyIHNpemUgPSBuZXh0Q3V0IC0gb2Zmc2V0O1xuICAgICAgICB2YXIgc3BsaXQgPSBzcGxpdFNwYW4od3JhcHBlZCwgc2l6ZSk7XG4gICAgICAgIGlmIChyYW5nZXMuY3VycmVudC5sZW5ndGgpIHNwbGl0LmNsYXNzTmFtZSA9IHJhbmdlcy5jdXJyZW50LmpvaW4oXCIgXCIpO1xuICAgICAgICBzcGxpdC5zZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIiwgaW5saW5lT2Zmc2V0KTtcbiAgICAgICAgaW5saW5lT2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIG9mZnNldCArPSBzaXplO1xuICAgICAgICByYW5nZXMuYWR2YW5jZVRvKG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCkpO1xuICAgICAgICBpZiAoIShuZXh0Q3V0ID0gcmFuZ2VzLm5leHRDaGFuZ2VCZWZvcmUoZW5kKSkpIHdyYXBwZWQuc2V0QXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIsIGlubGluZU9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyYW5nZXMuY3VycmVudC5sZW5ndGgpIHdyYXBwZWQuY2xhc3NOYW1lID0gcmFuZ2VzLmN1cnJlbnQuam9pbihcIiBcIik7XG4gICAgICByZXR1cm4gZG9tO1xuICAgIH0sXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50LCBwYXRoOiBwYXRoXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0U3BhbihzcGFuLCBhdCkge1xuICB2YXIgdGV4dE5vZGUgPSBzcGFuLmZpcnN0Q2hpbGQsXG4gICAgICB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICB2YXIgbmV3Tm9kZSA9IHNwYW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKDAsIF9kb20uZWx0KShcInNwYW5cIiwgbnVsbCwgdGV4dC5zbGljZSgwLCBhdCkpLCBzcGFuKTtcbiAgdGV4dE5vZGUubm9kZVZhbHVlID0gdGV4dC5zbGljZShhdCk7XG4gIHJldHVybiBuZXdOb2RlO1xufVxuXG5mdW5jdGlvbiBkcmF3KHBtLCBkb2MpIHtcbiAgcG0uY29udGVudC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIHBtLmNvbnRlbnQuYXBwZW5kQ2hpbGQoKDAsIF9zZXJpYWxpemVEb20udG9ET00pKGRvYywgb3B0aW9ucyhbXSwgcG0ucmFuZ2VzLmFjdGl2ZVJhbmdlVHJhY2tlcigpKSkpO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUcmFpbGluZ0hhY2tzKGRvbSwgbm9kZSkge1xuICB2YXIgbmVlZHMgPSBub2RlLnNpemUgPT0gMCB8fCBub2RlLmxhc3RDaGlsZC50eXBlLmlzQlIgPyBcImJyXCIgOiAhbm9kZS5sYXN0Q2hpbGQuaXNUZXh0ICYmIG5vZGUubGFzdENoaWxkLnR5cGUuY29udGFpbnMgPT0gbnVsbCA/IFwidGV4dFwiIDogbnVsbDtcbiAgdmFyIGxhc3QgPSBkb20ubGFzdENoaWxkO1xuICB2YXIgaGFzID0gIWxhc3QgfHwgbGFzdC5ub2RlVHlwZSAhPSAxIHx8ICFsYXN0Lmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSA/IG51bGwgOiBsYXN0Lm5vZGVOYW1lID09IFwiQlJcIiA/IFwiYnJcIiA6IFwidGV4dFwiO1xuICBpZiAobmVlZHMgIT0gaGFzKSB7XG4gICAgaWYgKGhhcykgZG9tLnJlbW92ZUNoaWxkKGxhc3QpO1xuICAgIGlmIChuZWVkcykgZG9tLmFwcGVuZENoaWxkKG5lZWRzID09IFwiYnJcIiA/ICgwLCBfZG9tLmVsdCkoXCJiclwiLCB7IFwicG0taWdub3JlXCI6IFwidHJhaWxpbmctYnJlYWtcIiB9KSA6ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIHsgXCJwbS1pZ25vcmVcIjogXCJjdXJzb3ItdGV4dFwiIH0sIFwiXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUluKGl0ZXIsIG5vZGUpIHtcbiAgdmFyIGNvcHkgPSBpdGVyLmNvcHkoKTtcbiAgZm9yICh2YXIgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gY29weS5uZXh0KCkudmFsdWU7KSB7XG4gICAgaWYgKGNoaWxkID09IG5vZGUpIHJldHVybiBjaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlUGFzdChkb20pIHtcbiAgdmFyIG5leHQgPSBkb20ubmV4dFNpYmxpbmc7XG4gIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gIHJldHVybiBuZXh0O1xufVxuXG5mdW5jdGlvbiByZWRyYXcocG0sIGRpcnR5LCBkb2MsIHByZXYpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zKFtdLCBwbS5yYW5nZXMuYWN0aXZlUmFuZ2VUcmFja2VyKCkpO1xuXG4gIGZ1bmN0aW9uIHNjYW4oZG9tLCBub2RlLCBwcmV2KSB7XG4gICAgdmFyIGlOb2RlID0gbm9kZS5pdGVyKCksXG4gICAgICAgIGlQcmV2ID0gcHJldi5pdGVyKCksXG4gICAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICB2YXIgZG9tUG9zID0gZG9tLmZpcnN0Q2hpbGQ7XG5cbiAgICBmb3IgKHZhciBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpTm9kZS5uZXh0KCkudmFsdWU7KSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gaU5vZGUub2Zmc2V0IC0gY2hpbGQud2lkdGgsXG4gICAgICAgICAgbWF0Y2hpbmcgPSB1bmRlZmluZWQsXG4gICAgICAgICAgcmV1c2VET00gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIG9wdHMucGF0aC5wdXNoKG9mZnNldCk7XG5cbiAgICAgIGlmIChwQ2hpbGQgPT0gY2hpbGQpIHtcbiAgICAgICAgbWF0Y2hpbmcgPSBwQ2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoaW5nID0gZmluZE5vZGVJbihpUHJldiwgY2hpbGQpKSB7XG4gICAgICAgIHdoaWxlIChwQ2hpbGQgIT0gbWF0Y2hpbmcpIHtcbiAgICAgICAgICBwQ2hpbGQgPSBpUHJldi5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgZG9tUG9zID0gbW92ZVBhc3QoZG9tUG9zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hpbmcgJiYgIWRpcnR5LmdldChtYXRjaGluZykpIHtcbiAgICAgICAgcmV1c2VET00gPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChwQ2hpbGQgJiYgIWNoaWxkLmlzVGV4dCAmJiBjaGlsZC5zYW1lTWFya3VwKHBDaGlsZCkgJiYgZGlydHkuZ2V0KHBDaGlsZCkgIT0gX21haW4uRElSVFlfUkVEUkFXKSB7XG4gICAgICAgIHJldXNlRE9NID0gdHJ1ZTtcbiAgICAgICAgdmFyIGNvbnRlbnROb2RlID0gZG9tUG9zO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgdmFyIGZpcnN0ID0gY29udGVudE5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICBpZiAoIWZpcnN0IHx8ICFmaXJzdC5oYXNBdHRyaWJ1dGUgfHwgZmlyc3QuaGFzQXR0cmlidXRlKFwicG0taWdub3JlXCIpIHx8IGZpcnN0Lmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkgYnJlYWs7XG4gICAgICAgICAgY29udGVudE5vZGUgPSBmaXJzdDtcbiAgICAgICAgfVxuICAgICAgICBzY2FuKGNvbnRlbnROb2RlLCBjaGlsZCwgcENoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZW5kZXJlZCA9ICgwLCBfc2VyaWFsaXplRG9tLnJlbmRlck5vZGVUb0RPTSkoY2hpbGQsIG9wdHMsIG9mZnNldCk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUocmVuZGVyZWQsIGRvbVBvcyk7XG4gICAgICAgIHJldXNlRE9NID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXVzZURPTSkge1xuICAgICAgICBkb21Qb3Muc2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIsIG9mZnNldCk7XG4gICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgcENoaWxkID0gaVByZXYubmV4dCgpLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrKSBvcHRzLnBhdGgucG9wKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHBDaGlsZCkge1xuICAgICAgZG9tUG9zID0gbW92ZVBhc3QoZG9tUG9zKTtcbiAgICAgIHBDaGlsZCA9IGlQcmV2Lm5leHQoKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIGFkanVzdFRyYWlsaW5nSGFja3MoZG9tLCBub2RlKTtcbiAgfVxuICBzY2FuKHBtLmNvbnRlbnQsIGRvYywgcHJldik7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgSW52ZXJ0ZWRTdGVwID0gZnVuY3Rpb24gSW52ZXJ0ZWRTdGVwKHN0ZXAsIHZlcnNpb24sIGlkKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZlcnRlZFN0ZXApO1xuXG4gIHRoaXMuc3RlcCA9IHN0ZXA7XG4gIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gIHRoaXMuaWQgPSBpZDtcbn07XG5cbnZhciBCcmFuY2hSZW1hcHBpbmcgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCcmFuY2hSZW1hcHBpbmcoYnJhbmNoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJyYW5jaFJlbWFwcGluZyk7XG5cbiAgICB0aGlzLmJyYW5jaCA9IGJyYW5jaDtcbiAgICB0aGlzLnJlbWFwID0gbmV3IF90cmFuc2Zvcm0uUmVtYXBwaW5nKCk7XG4gICAgdGhpcy52ZXJzaW9uID0gYnJhbmNoLnZlcnNpb247XG4gICAgdGhpcy5taXJyb3JCdWZmZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJyYW5jaFJlbWFwcGluZywgW3tcbiAgICBrZXk6IFwibW92ZVRvVmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlVG9WZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgIHdoaWxlICh0aGlzLnZlcnNpb24gPiB2ZXJzaW9uKSB0aGlzLmFkZE5leHRNYXAoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTmV4dE1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGROZXh0TWFwKCkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5icmFuY2gubWlycm9yW3RoaXMudmVyc2lvbl07XG4gICAgICB2YXIgbWFwT2Zmc2V0ID0gdGhpcy5icmFuY2gubWFwcy5sZW5ndGggLSAodGhpcy5icmFuY2gudmVyc2lvbiAtIHRoaXMudmVyc2lvbikgLSAxO1xuICAgICAgdmFyIGlkID0gdGhpcy5yZW1hcC5hZGRUb0Zyb250KHRoaXMuYnJhbmNoLm1hcHNbbWFwT2Zmc2V0XSwgdGhpcy5taXJyb3JCdWZmZXJbdGhpcy52ZXJzaW9uXSk7XG4gICAgICAtLXRoaXMudmVyc2lvbjtcbiAgICAgIGlmIChmb3VuZCAhPSBudWxsKSB0aGlzLm1pcnJvckJ1ZmZlcltmb3VuZF0gPSBpZDtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibW92ZVBhc3RTdGVwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVQYXN0U3RlcChyZXN1bHQpIHtcbiAgICAgIHZhciBpZCA9IHRoaXMuYWRkTmV4dE1hcCgpO1xuICAgICAgaWYgKHJlc3VsdCkgdGhpcy5yZW1hcC5hZGRUb0JhY2socmVzdWx0Lm1hcCwgaWQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCcmFuY2hSZW1hcHBpbmc7XG59KSgpO1xuXG52YXIgd29ya1RpbWUgPSAxMDAsXG4gICAgcGF1c2VUaW1lID0gMTUwO1xuXG52YXIgQ29tcHJlc3Npb25Xb3JrZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb21wcmVzc2lvbldvcmtlcihkb2MsIGJyYW5jaCwgY2FsbGJhY2spIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcHJlc3Npb25Xb3JrZXIpO1xuXG4gICAgdGhpcy5icmFuY2ggPSBicmFuY2g7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVtYXAgPSBuZXcgQnJhbmNoUmVtYXBwaW5nKGJyYW5jaCk7XG5cbiAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgIHRoaXMubWFwcyA9IFtdO1xuICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuc3RhcnRWZXJzaW9uID0gYnJhbmNoLnZlcnNpb247XG5cbiAgICB0aGlzLmkgPSBicmFuY2guZXZlbnRzLmxlbmd0aDtcbiAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbXByZXNzaW9uV29ya2VyLCBbe1xuICAgIGtleTogXCJ3b3JrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdvcmsoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG5cbiAgICAgIHZhciBlbmRUaW1lID0gRGF0ZS5ub3coKSArIHdvcmtUaW1lO1xuXG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gMCkgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIHZhciBfZXZlbnQgPSB0aGlzLmJyYW5jaC5ldmVudHNbLS10aGlzLmldLFxuICAgICAgICAgICAgb3V0RXZlbnQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IF9ldmVudC5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBfZXZlbnQkaiA9IF9ldmVudFtqXTtcbiAgICAgICAgICB2YXIgc3RlcCA9IF9ldmVudCRqLnN0ZXA7XG4gICAgICAgICAgdmFyIHN0ZXBWZXJzaW9uID0gX2V2ZW50JGoudmVyc2lvbjtcbiAgICAgICAgICB2YXIgc3RlcElEID0gX2V2ZW50JGouaWQ7XG5cbiAgICAgICAgICB0aGlzLnJlbWFwLm1vdmVUb1ZlcnNpb24oc3RlcFZlcnNpb24pO1xuXG4gICAgICAgICAgdmFyIG1hcHBlZFN0ZXAgPSBzdGVwLm1hcCh0aGlzLnJlbWFwLnJlbWFwKTtcbiAgICAgICAgICBpZiAobWFwcGVkU3RlcCAmJiBpc0RlbFN0ZXAoc3RlcCkpIHtcbiAgICAgICAgICAgIHZhciBleHRyYSA9IDAsXG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGVwLmZyb207XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIG5leHQgPSBfZXZlbnRbaiAtIDFdO1xuICAgICAgICAgICAgICBpZiAobmV4dC52ZXJzaW9uICE9IHN0ZXBWZXJzaW9uIC0gMSB8fCAhaXNEZWxTdGVwKG5leHQuc3RlcCkgfHwgc3RhcnQuY21wKG5leHQuc3RlcC50bykpIGJyZWFrO1xuICAgICAgICAgICAgICBleHRyYSArPSBuZXh0LnN0ZXAudG8ub2Zmc2V0IC0gbmV4dC5zdGVwLmZyb20ub2Zmc2V0O1xuICAgICAgICAgICAgICBzdGFydCA9IG5leHQuc3RlcC5mcm9tO1xuICAgICAgICAgICAgICBzdGVwVmVyc2lvbi0tO1xuICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgIHRoaXMucmVtYXAuYWRkTmV4dE1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dHJhID4gMCkge1xuICAgICAgICAgICAgICB2YXIgX3N0YXJ0ID0gbWFwcGVkU3RlcC5mcm9tLm1vdmUoLWV4dHJhKTtcbiAgICAgICAgICAgICAgbWFwcGVkU3RlcCA9IG5ldyBfdHJhbnNmb3JtLlN0ZXAoXCJyZXBsYWNlXCIsIF9zdGFydCwgbWFwcGVkU3RlcC50bywgX3N0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IG1hcHBlZFN0ZXAgJiYgbWFwcGVkU3RlcC5hcHBseSh0aGlzLmRvYyk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5kb2MgPSByZXN1bHQuZG9jO1xuICAgICAgICAgICAgdGhpcy5tYXBzLnB1c2gocmVzdWx0Lm1hcC5pbnZlcnQoKSk7XG4gICAgICAgICAgICBvdXRFdmVudC5wdXNoKG5ldyBJbnZlcnRlZFN0ZXAobWFwcGVkU3RlcCwgdGhpcy52ZXJzaW9uLCBzdGVwSUQpKTtcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbi0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbWFwLm1vdmVQYXN0U3RlcChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRFdmVudC5sZW5ndGgpIHtcbiAgICAgICAgICBvdXRFdmVudC5yZXZlcnNlKCk7XG4gICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvdXRFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBlbmRUaW1lKSB7XG4gICAgICAgICAgdGhpcy50aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLndvcmsoKTtcbiAgICAgICAgICB9LCBwYXVzZVRpbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaW5pc2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgaWYgKHRoaXMuYWJvcnRlZCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmV2ZW50cy5yZXZlcnNlKCk7XG4gICAgICB0aGlzLm1hcHMucmV2ZXJzZSgpO1xuICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLm1hcHMuY29uY2F0KHRoaXMuYnJhbmNoLm1hcHMuc2xpY2UodGhpcy5icmFuY2gubWFwcy5sZW5ndGggLSAodGhpcy5icmFuY2gudmVyc2lvbiAtIHRoaXMuc3RhcnRWZXJzaW9uKSkpLCB0aGlzLmV2ZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFib3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcHJlc3Npb25Xb3JrZXI7XG59KSgpO1xuXG5mdW5jdGlvbiBpc0RlbFN0ZXAoc3RlcCkge1xuICByZXR1cm4gc3RlcC50eXBlID09IFwicmVwbGFjZVwiICYmIHN0ZXAuZnJvbS5vZmZzZXQgPCBzdGVwLnRvLm9mZnNldCAmJiBfbW9kZWwuUG9zLnNhbWVQYXRoKHN0ZXAuZnJvbS5wYXRoLCBzdGVwLnRvLnBhdGgpICYmICghc3RlcC5wYXJhbSB8fCBzdGVwLnBhcmFtLmNvbnRlbnQuc2l6ZSA9PSAwKTtcbn1cblxudmFyIGNvbXByZXNzU3RlcENvdW50ID0gMTUwO1xuXG52YXIgQnJhbmNoID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQnJhbmNoKG1heERlcHRoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJyYW5jaCk7XG5cbiAgICB0aGlzLm1heERlcHRoID0gbWF4RGVwdGg7XG4gICAgdGhpcy52ZXJzaW9uID0gMDtcbiAgICB0aGlzLm5leHRTdGVwSUQgPSAxO1xuXG4gICAgdGhpcy5tYXBzID0gW107XG4gICAgdGhpcy5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG5cbiAgICB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyA9IDA7XG4gICAgdGhpcy5jb21wcmVzc2luZyA9IG51bGw7XG4gICAgdGhpcy5jb21wcmVzc1RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJyYW5jaCwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoZm9yY2UpIHtcbiAgICAgIGlmIChmb3JjZSB8fCAhdGhpcy5lbXB0eSgpKSB7XG4gICAgICAgIHRoaXMubWFwcy5sZW5ndGggPSB0aGlzLmV2ZW50cy5sZW5ndGggPSB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyA9IDA7XG4gICAgICAgIHRoaXMubWlycm9yID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5ld0V2ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld0V2ZW50KCkge1xuICAgICAgdGhpcy5hYm9ydENvbXByZXNzaW9uKCk7XG4gICAgICB0aGlzLmV2ZW50cy5wdXNoKFtdKTtcbiAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggPiB0aGlzLm1heERlcHRoKSB0aGlzLmV2ZW50cy5zaGlmdCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRNYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTWFwKG1hcCkge1xuICAgICAgaWYgKCF0aGlzLmVtcHR5KCkpIHtcbiAgICAgICAgdGhpcy5tYXBzLnB1c2gobWFwKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uKys7XG4gICAgICAgIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzKys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbXB0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5sZW5ndGggPT0gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkU3RlcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRTdGVwKHN0ZXAsIG1hcCwgaWQpIHtcbiAgICAgIHRoaXMuYWRkTWFwKG1hcCk7XG4gICAgICBpZiAoaWQgPT0gbnVsbCkgaWQgPSB0aGlzLm5leHRTdGVwSUQrKztcbiAgICAgIHRoaXMuZXZlbnRzW3RoaXMuZXZlbnRzLmxlbmd0aCAtIDFdLnB1c2gobmV3IEludmVydGVkU3RlcChzdGVwLCB0aGlzLnZlcnNpb24sIGlkKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFRyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUcmFuc2Zvcm0odHJhbnNmb3JtLCBpZHMpIHtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFuc2Zvcm0uc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGludmVydGVkID0gdHJhbnNmb3JtLnN0ZXBzW2ldLmludmVydCh0cmFuc2Zvcm0uZG9jc1tpXSwgdHJhbnNmb3JtLm1hcHNbaV0pO1xuICAgICAgICB0aGlzLmFkZFN0ZXAoaW52ZXJ0ZWQsIHRyYW5zZm9ybS5tYXBzW2ldLCBpZHMgJiYgaWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wRXZlbnQoZG9jLCBhbGxvd0NvbGxhcHNpbmcpIHtcbiAgICAgIHRoaXMuYWJvcnRDb21wcmVzc2lvbigpO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCk7XG4gICAgICBpZiAoIWV2ZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgdmFyIHJlbWFwID0gbmV3IEJyYW5jaFJlbWFwcGluZyh0aGlzKSxcbiAgICAgICAgICBjb2xsYXBzaW5nID0gYWxsb3dDb2xsYXBzaW5nO1xuICAgICAgdmFyIHRyID0gbmV3IF90cmFuc2Zvcm0uVHJhbnNmb3JtKGRvYyk7XG4gICAgICB2YXIgaWRzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSBldmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgaW52ZXJ0ZWRTdGVwID0gZXZlbnRbaV0sXG4gICAgICAgICAgICBzdGVwID0gaW52ZXJ0ZWRTdGVwLnN0ZXA7XG4gICAgICAgIGlmICghY29sbGFwc2luZyB8fCBpbnZlcnRlZFN0ZXAudmVyc2lvbiAhPSByZW1hcC52ZXJzaW9uKSB7XG4gICAgICAgICAgY29sbGFwc2luZyA9IGZhbHNlO1xuICAgICAgICAgIHJlbWFwLm1vdmVUb1ZlcnNpb24oaW52ZXJ0ZWRTdGVwLnZlcnNpb24pO1xuXG4gICAgICAgICAgc3RlcCA9IHN0ZXAubWFwKHJlbWFwLnJlbWFwKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gc3RlcCAmJiB0ci5zdGVwKHN0ZXApO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlkcy5wdXNoKGludmVydGVkU3RlcC5pZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRNYXAocmVzdWx0Lm1hcCkpIHRoaXMubWlycm9yW3RoaXMudmVyc2lvbl0gPSBpbnZlcnRlZFN0ZXAudmVyc2lvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaSA+IDApIHJlbWFwLm1vdmVQYXN0U3RlcChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmVyc2lvbi0tO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLm1pcnJvclt0aGlzLnZlcnNpb25dO1xuICAgICAgICAgIHRoaXMubWFwcy5wb3AoKTtcbiAgICAgICAgICB0ci5zdGVwKHN0ZXApO1xuICAgICAgICAgIGlkcy5wdXNoKGludmVydGVkU3RlcC5pZCk7XG4gICAgICAgICAgLS1yZW1hcC52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbXB0eSgpKSB0aGlzLmNsZWFyKHRydWUpO1xuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtOiB0ciwgaWRzOiBpZHMgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VmVyc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWZXJzaW9uKCkge1xuICAgICAgcmV0dXJuIHsgaWQ6IHRoaXMubmV4dFN0ZXBJRCwgdmVyc2lvbjogdGhpcy52ZXJzaW9uIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRWZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRWZXJzaW9uKHZlcnNpb24pIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLmV2ZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX2V2ZW50MiA9IHRoaXMuZXZlbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gX2V2ZW50Mi5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIHZhciBzdGVwID0gX2V2ZW50MltqXTtcbiAgICAgICAgICBpZiAoc3RlcC5pZCA9PSB2ZXJzaW9uLmlkKSByZXR1cm4geyBldmVudDogaSwgc3RlcDogaiB9O2Vsc2UgaWYgKHN0ZXAuaWQgPCB2ZXJzaW9uLmlkKSByZXR1cm4geyBldmVudDogaSwgc3RlcDogaiArIDEgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWJhc2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKSB7XG4gICAgICBpZiAodGhpcy5lbXB0eSgpKSByZXR1cm47XG4gICAgICB0aGlzLmFib3J0Q29tcHJlc3Npb24oKTtcblxuICAgICAgdmFyIHN0YXJ0VmVyc2lvbiA9IHRoaXMudmVyc2lvbiAtIHBvc2l0aW9ucy5sZW5ndGg7XG5cbiAgICAgIC8vIFVwZGF0ZSBhbmQgY2xlYW4gdXAgdGhlIGV2ZW50c1xuICAgICAgb3V0OiBmb3IgKHZhciBpID0gdGhpcy5ldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIF9ldmVudDMgPSB0aGlzLmV2ZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IF9ldmVudDMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICB2YXIgc3RlcCA9IF9ldmVudDNbal07XG4gICAgICAgICAgaWYgKHN0ZXAudmVyc2lvbiA8PSBzdGFydFZlcnNpb24pIGJyZWFrIG91dDtcbiAgICAgICAgICB2YXIgb2ZmID0gcG9zaXRpb25zW3N0ZXAudmVyc2lvbiAtIHN0YXJ0VmVyc2lvbiAtIDFdO1xuICAgICAgICAgIGlmIChvZmYgPT0gLTEpIHtcbiAgICAgICAgICAgIF9ldmVudDMuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnYgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzW29mZl0uaW52ZXJ0KHJlYmFzZWRUcmFuc2Zvcm0uZG9jc1tvZmZdLCByZWJhc2VkVHJhbnNmb3JtLm1hcHNbb2ZmXSk7XG4gICAgICAgICAgICBfZXZlbnQzW2pdID0gbmV3IEludmVydGVkU3RlcChpbnYsIHN0YXJ0VmVyc2lvbiArIG5ld01hcHMubGVuZ3RoICsgb2ZmICsgMSwgc3RlcC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN5bmMgdGhlIGFycmF5IG9mIG1hcHNcbiAgICAgIGlmICh0aGlzLm1hcHMubGVuZ3RoID4gcG9zaXRpb25zLmxlbmd0aCkgdGhpcy5tYXBzID0gdGhpcy5tYXBzLnNsaWNlKDAsIHRoaXMubWFwcy5sZW5ndGggLSBwb3NpdGlvbnMubGVuZ3RoKS5jb25jYXQobmV3TWFwcykuY29uY2F0KHJlYmFzZWRUcmFuc2Zvcm0ubWFwcyk7ZWxzZSB0aGlzLm1hcHMgPSByZWJhc2VkVHJhbnNmb3JtLm1hcHMuc2xpY2UoKTtcblxuICAgICAgdGhpcy52ZXJzaW9uID0gc3RhcnRWZXJzaW9uICsgbmV3TWFwcy5sZW5ndGggKyByZWJhc2VkVHJhbnNmb3JtLm1hcHMubGVuZ3RoO1xuXG4gICAgICB0aGlzLnN0ZXBzU2luY2VDb21wcmVzcyArPSBuZXdNYXBzLmxlbmd0aCArIHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHMubGVuZ3RoIC0gcG9zaXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWJvcnRDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydENvbXByZXNzaW9uKCkge1xuICAgICAgaWYgKHRoaXMuY29tcHJlc3NpbmcpIHtcbiAgICAgICAgdGhpcy5jb21wcmVzc2luZy5hYm9ydCgpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW5nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmVlZHNDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZWVkc0NvbXByZXNzaW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RlcHNTaW5jZUNvbXByZXNzID4gY29tcHJlc3NTdGVwQ291bnQgJiYgIXRoaXMuY29tcHJlc3Npbmc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0Q29tcHJlc3Npb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRDb21wcmVzc2lvbihkb2MpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmNvbXByZXNzaW5nID0gbmV3IENvbXByZXNzaW9uV29ya2VyKGRvYywgdGhpcywgZnVuY3Rpb24gKG1hcHMsIGV2ZW50cykge1xuICAgICAgICBfdGhpczIubWFwcyA9IG1hcHM7XG4gICAgICAgIF90aGlzMi5ldmVudHMgPSBldmVudHM7XG4gICAgICAgIF90aGlzMi5taXJyb3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBfdGhpczIuY29tcHJlc3NpbmcgPSBudWxsO1xuICAgICAgICBfdGhpczIuc3RlcHNTaW5jZUNvbXByZXNzID0gMDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wcmVzc2luZy53b3JrKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJyYW5jaDtcbn0pKCk7XG5cbnZhciBjb21wcmVzc0RlbGF5ID0gNzUwO1xuXG52YXIgSGlzdG9yeSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEhpc3RvcnkocG0pIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIaXN0b3J5KTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMuZG9uZSA9IG5ldyBCcmFuY2gocG0ub3B0aW9ucy5oaXN0b3J5RGVwdGgpO1xuICAgIHRoaXMudW5kb25lID0gbmV3IEJyYW5jaChwbS5vcHRpb25zLmhpc3RvcnlEZXB0aCk7XG5cbiAgICB0aGlzLmxhc3RBZGRlZEF0ID0gMDtcbiAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlO1xuXG4gICAgdGhpcy5hbGxvd0NvbGxhcHNpbmcgPSB0cnVlO1xuXG4gICAgcG0ub24oXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKHRyYW5zZm9ybSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIF90aGlzMy5yZWNvcmRUcmFuc2Zvcm0odHJhbnNmb3JtLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhIaXN0b3J5LCBbe1xuICAgIGtleTogXCJyZWNvcmRUcmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3JkVHJhbnNmb3JtKHRyYW5zZm9ybSwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuaWdub3JlVHJhbnNmb3JtKSByZXR1cm47XG5cbiAgICAgIGlmIChvcHRpb25zLmFkZFRvSGlzdG9yeSA9PSBmYWxzZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybS5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIG1hcCA9IHRyYW5zZm9ybS5tYXBzW2ldO1xuICAgICAgICAgIHRoaXMuZG9uZS5hZGRNYXAobWFwKTtcbiAgICAgICAgICB0aGlzLnVuZG9uZS5hZGRNYXAobWFwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51bmRvbmUuY2xlYXIoKTtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3cgPiB0aGlzLmxhc3RBZGRlZEF0ICsgdGhpcy5wbS5vcHRpb25zLmhpc3RvcnlFdmVudERlbGF5KSB0aGlzLmRvbmUubmV3RXZlbnQoKTtcblxuICAgICAgICB0aGlzLmRvbmUuYWRkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkQXQgPSBub3c7XG4gICAgICB9XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bmRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuZG8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaGlmdCh0aGlzLmRvbmUsIHRoaXMudW5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVkb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWRvKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQodGhpcy51bmRvbmUsIHRoaXMuZG9uZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhblVuZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuVW5kbygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbmUuZXZlbnRzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhblJlZG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2FuUmVkbygpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuZG9uZS5ldmVudHMubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoZnJvbSwgdG8pIHtcbiAgICAgIHZhciBldmVudCA9IGZyb20ucG9wRXZlbnQodGhpcy5wbS5kb2MsIHRoaXMuYWxsb3dDb2xsYXBzaW5nKTtcbiAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBldmVudC50cmFuc2Zvcm07XG4gICAgICB2YXIgaWRzID0gZXZlbnQuaWRzO1xuXG4gICAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IHRydWU7XG4gICAgICB0aGlzLnBtLmFwcGx5KHRyYW5zZm9ybSk7XG4gICAgICB0aGlzLmlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRyYW5zZm9ybS5zdGVwcy5sZW5ndGgpIHJldHVybiB0aGlzLnNoaWZ0KGZyb20sIHRvKTtcblxuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRvLm5ld0V2ZW50KCk7XG4gICAgICAgIHRvLmFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIGlkcyk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RBZGRlZEF0ID0gMDtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFZlcnNpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmVyc2lvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbmUuZ2V0VmVyc2lvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiYWNrVG9WZXJzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJhY2tUb1ZlcnNpb24odmVyc2lvbikge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5kb25lLmZpbmRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgaWYgKCFmb3VuZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5kb25lLmV2ZW50c1tmb3VuZC5ldmVudF07XG4gICAgICB2YXIgY29tYmluZWQgPSB0aGlzLmRvbmUuZXZlbnRzLnNsaWNlKGZvdW5kLmV2ZW50ICsgMSkucmVkdWNlKGZ1bmN0aW9uIChjb21iLCBhcnIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWIuY29uY2F0KGFycik7XG4gICAgICB9LCBldmVudC5zbGljZShmb3VuZC5zdGVwKSk7XG4gICAgICB0aGlzLmRvbmUuZXZlbnRzLmxlbmd0aCA9IGZvdW5kLmV2ZW50ICsgKChldmVudC5sZW5ndGggPSBmb3VuZC5zdGVwKSA/IDEgOiAwKTtcbiAgICAgIHRoaXMuZG9uZS5ldmVudHMucHVzaChjb21iaW5lZCk7XG5cbiAgICAgIHRoaXMuc2hpZnQodGhpcy5kb25lKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmViYXNlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWJhc2VkKG5ld01hcHMsIHJlYmFzZWRUcmFuc2Zvcm0sIHBvc2l0aW9ucykge1xuICAgICAgdGhpcy5kb25lLnJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKTtcbiAgICAgIHRoaXMudW5kb25lLnJlYmFzZWQobmV3TWFwcywgcmViYXNlZFRyYW5zZm9ybSwgcG9zaXRpb25zKTtcbiAgICAgIHRoaXMubWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1heWJlU2NoZWR1bGVDb21wcmVzc2lvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXliZVNjaGVkdWxlQ29tcHJlc3Npb24oKSB7XG4gICAgICB0aGlzLm1heWJlU2NoZWR1bGVDb21wcmVzc2lvbkZvckJyYW5jaCh0aGlzLmRvbmUpO1xuICAgICAgdGhpcy5tYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2godGhpcy51bmRvbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXliZVNjaGVkdWxlQ29tcHJlc3Npb25Gb3JCcmFuY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF5YmVTY2hlZHVsZUNvbXByZXNzaW9uRm9yQnJhbmNoKGJyYW5jaCkge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoYnJhbmNoLmNvbXByZXNzVGltZW91dCk7XG4gICAgICBpZiAoYnJhbmNoLm5lZWRzQ29tcHJlc3Npb24oKSkgYnJhbmNoLmNvbXByZXNzVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGJyYW5jaC5uZWVkc0NvbXByZXNzaW9uKCkpIGJyYW5jaC5zdGFydENvbXByZXNzaW9uKF90aGlzNC5wbS5kb2MpO1xuICAgICAgfSwgY29tcHJlc3NEZWxheSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhpc3Rvcnk7XG59KSgpO1xuXG5leHBvcnRzLkhpc3RvcnkgPSBIaXN0b3J5OyIsIi8vICEhIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFByb3NlTWlycm9yIGVkaXRvci4gSXQgY29udGFpbnNcbi8vIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byBlZGl0aW5nLCBzZWxlY3Rpb24sIGFuZCBpbnRlZ3JhdGlvbiB3aXRoXG4vLyB0aGUgYnJvd3Nlci4gYFByb3NlTWlycm9yYCBpcyB0aGUgY2xhc3MgeW91J2xsIHdhbnQgdG8gaW5zdGFudGlhdGVcbi8vIGFuZCBpbnRlcmFjdCB3aXRoIHdoZW4gdXNpbmcgdGhlIGVkaXRvci5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfbWFpbiA9IHJlcXVpcmUoXCIuL21haW5cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb3NlTWlycm9yXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYWluLlByb3NlTWlycm9yO1xuICB9XG59KTtcblxudmFyIF9vcHRpb25zID0gcmVxdWlyZShcIi4vb3B0aW9uc1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmaW5lT3B0aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9vcHRpb25zLmRlZmluZU9wdGlvbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWdpc3RyeVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfb3B0aW9ucy5SZWdpc3RyeTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZhdWx0UmVnaXN0cnlcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX29wdGlvbnMuZGVmYXVsdFJlZ2lzdHJ5O1xuICB9XG59KTtcblxudmFyIF9zZWxlY3Rpb24gPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJhbmdlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zZWxlY3Rpb24uUmFuZ2U7XG4gIH1cbn0pO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJLZXltYXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2tleXMuS2V5bWFwO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImtleU5hbWVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2tleXMua2V5TmFtZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJrZXlOYW1lc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfa2V5cy5rZXlOYW1lcztcbiAgfVxufSk7XG5cbnZhciBfcmFuZ2UgPSByZXF1aXJlKFwiLi9yYW5nZVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFya2VkUmFuZ2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3JhbmdlLk1hcmtlZFJhbmdlO1xuICB9XG59KTtcblxudmFyIF9jb21tYW5kcyA9IHJlcXVpcmUoXCIuL2NvbW1hbmRzXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZpbmVDb21tYW5kXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9jb21tYW5kcy5kZWZpbmVDb21tYW5kO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmluZVBhcmFtSGFuZGxlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29tbWFuZHMuZGVmaW5lUGFyYW1IYW5kbGVyO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbW1hbmRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NvbW1hbmRzLkNvbW1hbmQ7XG4gIH1cbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZGlzcGF0Y2hLZXkgPSBkaXNwYXRjaEtleTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9wYXJzZURvbSA9IHJlcXVpcmUoXCIuLi9wYXJzZS9kb21cIik7XG5cbnZhciBfcGFyc2VUZXh0ID0gcmVxdWlyZShcIi4uL3BhcnNlL3RleHRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVEb20gPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVUZXh0ID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS90ZXh0XCIpO1xuXG52YXIgX3BhcnNlID0gcmVxdWlyZShcIi4uL3BhcnNlXCIpO1xuXG52YXIgX2tleXMgPSByZXF1aXJlKFwiLi9rZXlzXCIpO1xuXG52YXIgX2NhcHR1cmVrZXlzID0gcmVxdWlyZShcIi4vY2FwdHVyZWtleXNcIik7XG5cbnZhciBfZG9tY2hhbmdlID0gcmVxdWlyZShcIi4vZG9tY2hhbmdlXCIpO1xuXG52YXIgX3NlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3NlbGVjdGlvblwiKTtcblxudmFyIHN0b3BTZXEgPSBudWxsO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbiAqIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbiAqL1xudmFyIGhhbmRsZXJzID0ge307XG5cbnZhciBJbnB1dCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0KHBtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnB1dCk7XG5cbiAgICB0aGlzLnBtID0gcG07XG5cbiAgICB0aGlzLmtleVNlcSA9IG51bGw7XG5cbiAgICAvLyBXaGVuIHRoZSB1c2VyIGlzIGNyZWF0aW5nIGEgY29tcG9zZWQgY2hhcmFjdGVyLFxuICAgIC8vIHRoaXMgaXMgc2V0IHRvIGEgQ29tcG9zaW5nIGluc3RhbmNlLlxuICAgIHRoaXMuY29tcG9zaW5nID0gbnVsbDtcbiAgICB0aGlzLnNoaWZ0S2V5ID0gdGhpcy51cGRhdGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5za2lwSW5wdXQgPSAwO1xuXG4gICAgdGhpcy5kcmFnZ2luZ0Zyb20gPSBmYWxzZTtcblxuICAgIHRoaXMua2V5bWFwcyA9IFtdO1xuICAgIHRoaXMuZGVmYXVsdEtleW1hcCA9IG51bGw7XG5cbiAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcblxuICAgIHRoaXMuZHJvcFRhcmdldCA9IHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQoKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1kcm9wLXRhcmdldFwiIH0pKTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIChfZXZlbnQpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gaGFuZGxlcnNbX2V2ZW50XTtcbiAgICAgIHBtLmNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcihfZXZlbnQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyKHBtLCBlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBfZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgIF9sb29wKF9ldmVudCk7XG4gICAgfVxuXG4gICAgcG0ub24oXCJzZWxlY3Rpb25DaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIGtleSBwcmVzcyB0byB0aGUgaW50ZXJuYWwga2V5bWFwcywgd2hpY2ggd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBET00gYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSAge1Byb3NlTWlycm9yfSAgIHBtIFRoZSBlZGl0b3IgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBwcmVzc2VkLlxuICAgKiBAcGFyYW0gIHtLZXlib2FyZEV2ZW50fSBlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gSWYgdGhlIGtleSBuYW1lIGhhcyBhIG1hcHBpbmcgYW5kIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIChcImhhbmRsZWRcIiksXG4gICAqICAgICAgICAgICAgICAgICAgaWYgdGhlIGtleSBuYW1lIG5lZWRzIHRvIGJlIGNvbWJpbmVkIGluIHNlcXVlbmNlIHdpdGggdGhlIG5leHQga2V5IChcIm11bHRpXCIpLFxuICAgKiAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgKFwibm90aGluZ1wiKS5cbiAgICovXG5cbiAgX2NyZWF0ZUNsYXNzKElucHV0LCBbe1xuICAgIGtleTogXCJtYXliZUFib3J0Q29tcG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF5YmVBYm9ydENvbXBvc2l0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY29tcG9zaW5nICYmICF0aGlzLnVwZGF0aW5nQ29tcG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nLmZpbmlzaGVkKSB7XG4gICAgICAgICAgZmluaXNoQ29tcG9zaW5nKHRoaXMucG0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRvZ2dsZSBzZWxlY3Rpb24gdG8gZm9yY2UgZW5kIG9mIGNvbXBvc2l0aW9uXG4gICAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc2tpcElucHV0Kys7XG4gICAgICAgICAgdmFyIHNlbCA9IGdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5wdXQ7XG59KSgpO1xuXG5leHBvcnRzLklucHV0ID0gSW5wdXQ7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KHBtLCBuYW1lLCBlKSB7XG4gIHZhciBzZXEgPSBwbS5pbnB1dC5rZXlTZXE7XG4gIC8vIElmIHRoZSBwcmV2aW91cyBrZXkgc2hvdWxkIGJlIHVzZWQgaW4gc2VxdWVuY2Ugd2l0aCB0aGlzIG9uZSwgbW9kaWZ5IHRoZSBuYW1lIGFjY29yZGluZ2x5LlxuICBpZiAoc2VxKSB7XG4gICAgaWYgKCgwLCBfa2V5cy5pc01vZGlmaWVyS2V5KShuYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHN0b3BTZXEpO1xuICAgIHN0b3BTZXEgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwbS5pbnB1dC5rZXlTZXEgPT0gc2VxKSBwbS5pbnB1dC5rZXlTZXEgPSBudWxsO1xuICAgIH0sIDUwKTtcbiAgICBuYW1lID0gc2VxICsgXCIgXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZShib3VuZCkge1xuICAgIGlmIChib3VuZCA9PT0gZmFsc2UpIHJldHVybiBcIm5vdGhpbmdcIjtcbiAgICBpZiAoYm91bmQgPT0gXCIuLi5cIikgcmV0dXJuIFwibXVsdGlcIjtcbiAgICBpZiAoYm91bmQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJvdW5kKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHJlc3VsdCA9PT0gZmFsc2UgJiYgaSA8IGJvdW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZShib3VuZFtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm91bmQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmVzdWx0ID0gcG0uZXhlY0NvbW1hbmQoYm91bmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBib3VuZChwbSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgPT0gZmFsc2UgPyBmYWxzZSA6IFwiaGFuZGxlZFwiO1xuICB9O1xuXG4gIHZhciByZXN1bHQgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyAhcmVzdWx0ICYmIGkgPCBwbS5pbnB1dC5rZXltYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0ID0gaGFuZGxlKHBtLmlucHV0LmtleW1hcHNbaV0ubWFwLmxvb2t1cChuYW1lLCBwbSkpO1xuICB9aWYgKCFyZXN1bHQpIHJlc3VsdCA9IGhhbmRsZShwbS5iYXNlS2V5bWFwLmxvb2t1cChuYW1lLCBwbSkpIHx8IGhhbmRsZShfY2FwdHVyZWtleXMuY2FwdHVyZUtleXMubG9va3VwKG5hbWUpKTtcblxuICAvLyBJZiB0aGUga2V5IHNob3VsZCBiZSB1c2VkIGluIHNlcXVlbmNlIHdpdGggdGhlIG5leHQga2V5LCBzdG9yZSB0aGUga2V5bmFtZSBpbnRlcm5hbGx5LlxuICBpZiAocmVzdWx0ID09IFwibXVsdGlcIikgcG0uaW5wdXQua2V5U2VxID0gbmFtZTtcblxuICBpZiAocmVzdWx0ID09IFwiaGFuZGxlZFwiIHx8IHJlc3VsdCA9PSBcIm11bHRpXCIpIGUucHJldmVudERlZmF1bHQoKTtcblxuICBpZiAoc2VxICYmICFyZXN1bHQgJiYgL1xcJyQvLnRlc3QobmFtZSkpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuICEhcmVzdWx0O1xufVxuXG5oYW5kbGVycy5rZXlkb3duID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmtleUNvZGUgPT0gMTYpIHBtLmlucHV0LnNoaWZ0S2V5ID0gdHJ1ZTtcbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZykgcmV0dXJuO1xuICB2YXIgbmFtZSA9ICgwLCBfa2V5cy5rZXlOYW1lKShlKTtcbiAgaWYgKG5hbWUgJiYgZGlzcGF0Y2hLZXkocG0sIG5hbWUsIGUpKSByZXR1cm47XG4gIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG59O1xuXG5oYW5kbGVycy5rZXl1cCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAoZS5rZXlDb2RlID09IDE2KSBwbS5pbnB1dC5zaGlmdEtleSA9IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gaW5wdXRUZXh0KHBtLCByYW5nZSwgdGV4dCkge1xuICBpZiAocmFuZ2UuZW1wdHkgJiYgIXRleHQpIHJldHVybiBmYWxzZTtcbiAgdmFyIG1hcmtzID0gcG0uaW5wdXQuc3RvcmVkTWFya3MgfHwgcG0uZG9jLm1hcmtzQXQocmFuZ2UuZnJvbSk7XG4gIHZhciB0ciA9IHBtLnRyO1xuICB0ci5yZXBsYWNlV2l0aChyYW5nZS5mcm9tLCByYW5nZS50bywgcG0uc2NoZW1hLnRleHQodGV4dCwgbWFya3MpKS5hcHBseSgpO1xuICBwbS5zY3JvbGxJbnRvVmlldygpO1xuICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjdGV4dElucHV0XG4gIC8vIEZpcmVkIHdoZW4gdGhlIHVzZXIgdHlwZXMgdGV4dCBpbnRvIHRoZSBlZGl0b3IuXG4gIHBtLnNpZ25hbChcInRleHRJbnB1dFwiLCB0ZXh0KTtcbn1cblxuaGFuZGxlcnMua2V5cHJlc3MgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgaWYgKHBtLmlucHV0LmNvbXBvc2luZyB8fCAhZS5jaGFyQ29kZSB8fCBlLmN0cmxLZXkgJiYgIWUuYWx0S2V5IHx8IF9kb20uYnJvd3Nlci5tYWMgJiYgZS5tZXRhS2V5KSByZXR1cm47XG4gIHZhciBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZSk7XG4gIGlmIChkaXNwYXRjaEtleShwbSwgXCInXCIgKyBjaCArIFwiJ1wiLCBlKSkgcmV0dXJuO1xuICB2YXIgc2VsID0gcG0uc2VsZWN0aW9uO1xuICBpZiAoc2VsLm5vZGUgJiYgc2VsLm5vZGUuY29udGFpbnMgPT0gbnVsbCkge1xuICAgIHBtLnRyW1wiZGVsZXRlXCJdKHNlbC5mcm9tLCBzZWwudG8pLmFwcGx5KCk7XG4gICAgc2VsID0gcG0uc2VsZWN0aW9uO1xuICB9XG4gIGlucHV0VGV4dChwbSwgc2VsLCBjaCk7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbn07XG5cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKSB7XG4gIHZhciBwb3MgPSAoMCwgX3NlbGVjdGlvbi5zZWxlY3RhYmxlTm9kZUFib3ZlKShwbSwgZS50YXJnZXQsIHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9LCB0cnVlKTtcbiAgaWYgKCFwb3MpIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuXG4gIHZhciBfcG0kc2VsZWN0aW9uID0gcG0uc2VsZWN0aW9uO1xuICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uLmZyb207XG5cbiAgaWYgKG5vZGUgJiYgcG9zLmRlcHRoID49IGZyb20uZGVwdGggJiYgcG9zLnNob3J0ZW4oZnJvbS5kZXB0aCkuY21wKGZyb20pID09IDApIHtcbiAgICBpZiAoZnJvbS5kZXB0aCA9PSAwKSByZXR1cm4gcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcbiAgICBwb3MgPSBmcm9tLnNob3J0ZW4oKTtcbiAgfVxuXG4gIHBtLnNldE5vZGVTZWxlY3Rpb24ocG9zKTtcbiAgcG0uZm9jdXMoKTtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG52YXIgbGFzdENsaWNrID0gMDtcblxuaGFuZGxlcnMubW91c2Vkb3duID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmIChlLmN0cmxLZXkpIHJldHVybiBzZWxlY3RDbGlja2VkTm9kZShwbSwgZSk7XG5cbiAgcG0uc2VsLnBvbGxGb3JVcGRhdGUoKTtcblxuICB2YXIgbm93ID0gRGF0ZS5ub3coKSxcbiAgICAgIG11bHRpID0gbm93IC0gbGFzdENsaWNrIDwgNTAwO1xuICBsYXN0Q2xpY2sgPSBub3c7XG4gIGlmIChwbS5pbnB1dC5zaGlmdEtleSB8fCBtdWx0aSkgcmV0dXJuO1xuXG4gIHZhciB4ID0gZS5jbGllbnRYLFxuICAgICAgeSA9IGUuY2xpZW50WSxcbiAgICAgIG1vdmVkID0gZmFsc2U7XG4gIHZhciB1cCA9IGZ1bmN0aW9uIHVwKCkge1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHVwKTtcbiAgICByZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xuICAgIGlmICgoMCwgX3NlbGVjdGlvbi5oYW5kbGVOb2RlQ2xpY2spKHBtLCBlKSkgcmV0dXJuO1xuXG4gICAgdmFyIHBvcyA9ICFtb3ZlZCAmJiAoMCwgX3NlbGVjdGlvbi5zZWxlY3RhYmxlTm9kZUFib3ZlKShwbSwgZS50YXJnZXQsIHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9KTtcbiAgICBpZiAocG9zKSB7XG4gICAgICBwbS5zZXROb2RlU2VsZWN0aW9uKHBvcyk7XG4gICAgICBwbS5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcbiAgdmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGUpIHtcbiAgICBpZiAoIW1vdmVkICYmIChNYXRoLmFicyh4IC0gZS5jbGllbnRYKSA+IDQgfHwgTWF0aC5hYnMoeSAtIGUuY2xpZW50WSkgPiA0KSkgbW92ZWQgPSB0cnVlO1xuICAgIHBtLnNlbC5wb2xsRm9yVXBkYXRlKCk7XG4gIH07XG4gIGFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHVwKTtcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbn07XG5cbmhhbmRsZXJzLnRvdWNoZG93biA9IGZ1bmN0aW9uIChwbSkge1xuICBwbS5zZWwucG9sbEZvclVwZGF0ZSgpO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIHRvIHRyYWNrIHN0YXRlIHdoaWxlIGNyZWF0aW5nIGEgY29tcG9zZWQgY2hhcmFjdGVyLlxuICovXG5cbnZhciBDb21wb3NpbmcgPSBmdW5jdGlvbiBDb21wb3NpbmcocG0sIGRhdGEpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2luZyk7XG5cbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICB0aGlzLmNvbnRleHQgPSAoMCwgX2RvbWNoYW5nZS50ZXh0Q29udGV4dCkoZGF0YSk7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuZW5kRGF0YSA9IG51bGw7XG4gIHZhciByYW5nZSA9IHBtLnNlbGVjdGlvbjtcbiAgaWYgKGRhdGEpIHtcbiAgICB2YXIgcGF0aCA9IHJhbmdlLmhlYWQucGF0aCxcbiAgICAgICAgbGluZSA9IHBtLmRvYy5wYXRoKHBhdGgpLnRleHRDb250ZW50O1xuICAgIHZhciBmb3VuZCA9IGxpbmUuaW5kZXhPZihkYXRhLCByYW5nZS5oZWFkLm9mZnNldCAtIGRhdGEubGVuZ3RoKTtcbiAgICBpZiAoZm91bmQgPiAtMSAmJiBmb3VuZCA8PSByYW5nZS5oZWFkLm9mZnNldCArIGRhdGEubGVuZ3RoKSByYW5nZSA9IG5ldyBfc2VsZWN0aW9uLlRleHRTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3MocGF0aCwgZm91bmQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBmb3VuZCArIGRhdGEubGVuZ3RoKSk7XG4gIH1cbiAgdGhpcy5yYW5nZSA9IHJhbmdlO1xufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb25zdGFydCA9IGZ1bmN0aW9uIChwbSwgZSkge1xuICBpZiAocG0uaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCkpIHJldHVybjtcblxuICBwbS5mbHVzaCgpO1xuICBwbS5pbnB1dC5jb21wb3NpbmcgPSBuZXcgQ29tcG9zaW5nKHBtLCBlLmRhdGEpO1xuICB2YXIgYWJvdmUgPSBwbS5zZWxlY3Rpb24uaGVhZC5zaG9ydGVuKCk7XG4gIHBtLm1hcmtSYW5nZURpcnR5KHsgZnJvbTogYWJvdmUsIHRvOiBhYm92ZS5tb3ZlKDEpIH0pO1xufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIGluZm8gPSBwbS5pbnB1dC5jb21wb3Npbmc7XG4gIGlmIChpbmZvICYmIGluZm8uZGF0YSAhPSBlLmRhdGEpIHtcbiAgICBpbmZvLmRhdGEgPSBlLmRhdGE7XG4gICAgcG0uaW5wdXQudXBkYXRpbmdDb21wb3NpdGlvbiA9IHRydWU7XG4gICAgaW5wdXRUZXh0KHBtLCBpbmZvLnJhbmdlLCBpbmZvLmRhdGEpO1xuICAgIHBtLmlucHV0LnVwZGF0aW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICBpbmZvLnJhbmdlID0gbmV3IF9zZWxlY3Rpb24uVGV4dFNlbGVjdGlvbihpbmZvLnJhbmdlLmZyb20sIGluZm8ucmFuZ2UuZnJvbS5tb3ZlKGluZm8uZGF0YS5sZW5ndGgpKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgdmFyIGluZm8gPSBwbS5pbnB1dC5jb21wb3Npbmc7XG4gIGlmIChpbmZvKSB7XG4gICAgcG0uaW5wdXQuY29tcG9zaW5nLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICBwbS5pbnB1dC5jb21wb3NpbmcuZW5kRGF0YSA9IGUuZGF0YTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwbS5pbnB1dC5jb21wb3NpbmcgPT0gaW5mbykgZmluaXNoQ29tcG9zaW5nKHBtKTtcbiAgICB9LCAyMCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZpbmlzaENvbXBvc2luZyhwbSkge1xuICB2YXIgaW5mbyA9IHBtLmlucHV0LmNvbXBvc2luZztcbiAgdmFyIHRleHQgPSAoMCwgX2RvbWNoYW5nZS50ZXh0SW5Db250ZXh0KShpbmZvLmNvbnRleHQsIGluZm8uZW5kRGF0YSk7XG4gIHZhciByYW5nZSA9ICgwLCBfc2VsZWN0aW9uLnJhbmdlRnJvbURPTUxvb3NlKShwbSk7XG4gIHBtLmVuc3VyZU9wZXJhdGlvbigpO1xuICBwbS5pbnB1dC5jb21wb3NpbmcgPSBudWxsO1xuICBpZiAodGV4dCAhPSBpbmZvLmRhdGEpIGlucHV0VGV4dChwbSwgaW5mby5yYW5nZSwgdGV4dCk7XG4gIGlmIChyYW5nZSAmJiAhcmFuZ2UuZXEocG0uc2VsLnJhbmdlKSkgcG0uc2V0U2VsZWN0aW9uRGlyZWN0KHJhbmdlKTtcbn1cblxuaGFuZGxlcnMuaW5wdXQgPSBmdW5jdGlvbiAocG0pIHtcbiAgaWYgKHBtLmlucHV0LnNraXBJbnB1dCkgcmV0dXJuIC0tcG0uaW5wdXQuc2tpcElucHV0O1xuXG4gIGlmIChwbS5pbnB1dC5jb21wb3NpbmcpIHtcbiAgICBpZiAocG0uaW5wdXQuY29tcG9zaW5nLmZpbmlzaGVkKSBmaW5pc2hDb21wb3NpbmcocG0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBtLnNlbC5zdG9wUG9sbGluZ0ZvclVwZGF0ZSgpO1xuICAoMCwgX2RvbWNoYW5nZS5hcHBseURPTUNoYW5nZSkocG0pO1xuICBwbS5zY3JvbGxJbnRvVmlldygpO1xufTtcblxudmFyIGxhc3RDb3BpZWQgPSBudWxsO1xuXG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIHZhciBfcG0kc2VsZWN0aW9uMiA9IHBtLnNlbGVjdGlvbjtcbiAgdmFyIGZyb20gPSBfcG0kc2VsZWN0aW9uMi5mcm9tO1xuICB2YXIgdG8gPSBfcG0kc2VsZWN0aW9uMi50bztcbiAgdmFyIGVtcHR5ID0gX3BtJHNlbGVjdGlvbjIuZW1wdHk7XG5cbiAgaWYgKGVtcHR5KSByZXR1cm47XG4gIHZhciBmcmFnbWVudCA9IHBtLnNlbGVjdGVkRG9jO1xuICBsYXN0Q29waWVkID0geyBkb2M6IHBtLmRvYywgZnJvbTogZnJvbSwgdG86IHRvLFxuICAgIGh0bWw6ICgwLCBfc2VyaWFsaXplRG9tLnRvSFRNTCkoZnJhZ21lbnQpLFxuICAgIHRleHQ6ICgwLCBfc2VyaWFsaXplVGV4dC50b1RleHQpKGZyYWdtZW50KSB9O1xuXG4gIGlmIChlLmNsaXBib2FyZERhdGEpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO1xuICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGxhc3RDb3BpZWQuaHRtbCk7XG4gICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIGxhc3RDb3BpZWQudGV4dCk7XG4gICAgaWYgKGUudHlwZSA9PSBcImN1dFwiICYmICFlbXB0eSkgcG0udHJbXCJkZWxldGVcIl0oZnJvbSwgdG8pLmFwcGx5KCk7XG4gIH1cbn07XG5cbmhhbmRsZXJzLnBhc3RlID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmICghZS5jbGlwYm9hcmREYXRhKSByZXR1cm47XG4gIHZhciBzZWwgPSBwbS5zZWxlY3Rpb247XG4gIHZhciB0eHQgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gIHZhciBodG1sID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L2h0bWxcIik7XG4gIGlmIChodG1sIHx8IHR4dCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZG9jID0gdW5kZWZpbmVkLFxuICAgICAgICBmcm9tID0gdW5kZWZpbmVkLFxuICAgICAgICB0byA9IHVuZGVmaW5lZDtcbiAgICBpZiAocG0uaW5wdXQuc2hpZnRLZXkgJiYgdHh0KSB7XG4gICAgICBkb2MgPSAoMCwgX3BhcnNlVGV4dC5mcm9tVGV4dCkocG0uc2NoZW1hLCB0eHQpO1xuICAgIH0gZWxzZSBpZiAobGFzdENvcGllZCAmJiAobGFzdENvcGllZC5odG1sID09IGh0bWwgfHwgbGFzdENvcGllZC50ZXh0ID09IHR4dCkpIHtcbiAgICAgIDt2YXIgX2xhc3RDb3BpZWQgPSBsYXN0Q29waWVkO1xuICAgICAgZG9jID0gX2xhc3RDb3BpZWQuZG9jO1xuICAgICAgZnJvbSA9IF9sYXN0Q29waWVkLmZyb207XG4gICAgICB0byA9IF9sYXN0Q29waWVkLnRvO1xuICAgIH0gZWxzZSBpZiAoaHRtbCkge1xuICAgICAgZG9jID0gKDAsIF9wYXJzZURvbS5mcm9tSFRNTCkocG0uc2NoZW1hLCBodG1sKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHBtLnNjaGVtYSwgdHh0LCAoMCwgX3BhcnNlLmtub3duU291cmNlKShcIm1hcmtkb3duXCIpID8gXCJtYXJrZG93blwiIDogXCJ0ZXh0XCIpO1xuICAgIH1cbiAgICBwbS50ci5yZXBsYWNlKHNlbC5mcm9tLCBzZWwudG8sIGRvYywgZnJvbSB8fCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRTdGFydCkoZG9jKS5mcm9tLCB0byB8fCAoMCwgX3NlbGVjdGlvbi5maW5kU2VsZWN0aW9uQXRFbmQpKGRvYykudG8pLmFwcGx5KCk7XG4gICAgcG0uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgfVxufTtcblxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gZnVuY3Rpb24gKHBtLCBlKSB7XG4gIGlmICghZS5kYXRhVHJhbnNmZXIpIHJldHVybjtcblxuICB2YXIgZnJhZ21lbnQgPSBwbS5zZWxlY3RlZERvYztcblxuICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9odG1sXCIsICgwLCBfc2VyaWFsaXplRG9tLnRvSFRNTCkoZnJhZ21lbnQpKTtcbiAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgKDAsIF9zZXJpYWxpemVUZXh0LnRvVGV4dCkoZnJhZ21lbnQpKTtcbiAgcG0uaW5wdXQuZHJhZ2dpbmdGcm9tID0gdHJ1ZTtcbn07XG5cbmhhbmRsZXJzLmRyYWdlbmQgPSBmdW5jdGlvbiAocG0pIHtcbiAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcG0uaW5wdXQuZHJhZ2dpbkZyb20gPSBmYWxzZTtcbiAgfSwgNTApO1xufTtcblxuaGFuZGxlcnMuZHJhZ292ZXIgPSBoYW5kbGVycy5kcmFnZW50ZXIgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB2YXIgY3Vyc29yUG9zID0gcG0ucG9zQXRDb29yZHMoeyBsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZIH0pO1xuICBpZiAoIWN1cnNvclBvcykgcmV0dXJuO1xuICB2YXIgY29vcmRzID0gKDAsIF9zZWxlY3Rpb24uY29vcmRzQXRQb3MpKHBtLCBjdXJzb3JQb3MpO1xuICB2YXIgcmVjdCA9IHBtLndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvb3Jkcy50b3AgLT0gcmVjdC50b3A7XG4gIGNvb3Jkcy5yaWdodCAtPSByZWN0LmxlZnQ7XG4gIGNvb3Jkcy5ib3R0b20gLT0gcmVjdC50b3A7XG4gIGNvb3Jkcy5sZWZ0IC09IHJlY3QubGVmdDtcbiAgdmFyIHRhcmdldCA9IHBtLmlucHV0LmRyb3BUYXJnZXQ7XG4gIHRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICB0YXJnZXQuc3R5bGUubGVmdCA9IGNvb3Jkcy5sZWZ0IC0gMSArIFwicHhcIjtcbiAgdGFyZ2V0LnN0eWxlLnRvcCA9IGNvb3Jkcy50b3AgKyBcInB4XCI7XG4gIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBjb29yZHMuYm90dG9tIC0gY29vcmRzLnRvcCArIFwicHhcIjtcbn07XG5cbmhhbmRsZXJzLmRyYWdsZWF2ZSA9IGZ1bmN0aW9uIChwbSkge1xuICByZXR1cm4gcG0uaW5wdXQuZHJvcFRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcbn07XG5cbmhhbmRsZXJzLmRyb3AgPSBmdW5jdGlvbiAocG0sIGUpIHtcbiAgcG0uaW5wdXQuZHJvcFRhcmdldC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblxuICBpZiAoIWUuZGF0YVRyYW5zZmVyKSByZXR1cm47XG5cbiAgdmFyIGh0bWwgPSB1bmRlZmluZWQsXG4gICAgICB0eHQgPSB1bmRlZmluZWQsXG4gICAgICBkb2MgPSB1bmRlZmluZWQ7XG4gIGlmIChodG1sID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSkgZG9jID0gKDAsIF9wYXJzZURvbS5mcm9tSFRNTCkocG0uc2NoZW1hLCBodG1sLCB7IGRvY3VtZW50OiBkb2N1bWVudCB9KTtlbHNlIGlmICh0eHQgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKSkgZG9jID0gKDAsIF9wYXJzZS5wYXJzZUZyb20pKHBtLnNjaGVtYSwgdHh0LCAoMCwgX3BhcnNlLmtub3duU291cmNlKShcIm1hcmtkb3duXCIpID8gXCJtYXJrZG93blwiIDogXCJ0ZXh0XCIpO1xuXG4gIGlmIChkb2MpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGluc2VydFBvcyA9IHBtLnBvc0F0Q29vcmRzKHsgbGVmdDogZS5jbGllbnRYLCB0b3A6IGUuY2xpZW50WSB9KTtcbiAgICBpZiAoIWluc2VydFBvcykgcmV0dXJuO1xuICAgIHZhciB0ciA9IHBtLnRyO1xuICAgIGlmIChwbS5pbnB1dC5kcmFnZ2luZ0Zyb20gJiYgIWUuY3RybEtleSkge1xuICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICBpbnNlcnRQb3MgPSB0ci5tYXAoaW5zZXJ0UG9zKS5wb3M7XG4gICAgfVxuICAgIHRyLnJlcGxhY2UoaW5zZXJ0UG9zLCBpbnNlcnRQb3MsIGRvYywgKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkF0U3RhcnQpKGRvYykuZnJvbSwgKDAsIF9zZWxlY3Rpb24uZmluZFNlbGVjdGlvbkF0RW5kKShkb2MpLnRvKS5hcHBseSgpO1xuICAgIHBtLnNldFRleHRTZWxlY3Rpb24oaW5zZXJ0UG9zLCB0ci5tYXAoaW5zZXJ0UG9zKS5wb3MpO1xuICAgIHBtLmZvY3VzKCk7XG4gIH1cbn07XG5cbmhhbmRsZXJzLmZvY3VzID0gZnVuY3Rpb24gKHBtKSB7XG4gICgwLCBfZG9tLmFkZENsYXNzKShwbS53cmFwcGVyLCBcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNmb2N1c1xuICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgZ2FpbnMgZm9jdXMuXG4gIHBtLnNpZ25hbChcImZvY3VzXCIpO1xufTtcblxuaGFuZGxlcnMuYmx1ciA9IGZ1bmN0aW9uIChwbSkge1xuICAoMCwgX2RvbS5ybUNsYXNzKShwbS53cmFwcGVyLCBcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNibHVyXG4gIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBsb3NlcyBmb2N1cy5cbiAgcG0uc2lnbmFsKFwiYmx1clwiKTtcbn07IiwiLy8gRnJvbSBDb2RlTWlycm9yLCBzaG91bGQgYmUgZmFjdG9yZWQgaW50byBpdHMgb3duIE5QTSBtb2R1bGVcblxuLy8gZGVjbGFyZV9nbG9iYWw6IG5hdmlnYXRvclxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5rZXlOYW1lID0ga2V5TmFtZTtcbmV4cG9ydHMuaXNNb2RpZmllcktleSA9IGlzTW9kaWZpZXJLZXk7XG5leHBvcnRzLm5vcm1hbGl6ZUtleU5hbWUgPSBub3JtYWxpemVLZXlOYW1lO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIDogZmFsc2U7XG5cbi8vIDo6IE9iamVjdDxzdHJpbmc+XG4vLyBBIG1hcCBmcm9tIGtleSBjb2RlcyB0byBrZXkgbmFtZXMuXG52YXIga2V5TmFtZXMgPSB7XG4gIDM6IFwiRW50ZXJcIiwgODogXCJCYWNrc3BhY2VcIiwgOTogXCJUYWJcIiwgMTM6IFwiRW50ZXJcIiwgMTY6IFwiU2hpZnRcIiwgMTc6IFwiQ3RybFwiLCAxODogXCJBbHRcIixcbiAgMTk6IFwiUGF1c2VcIiwgMjA6IFwiQ2Fwc0xvY2tcIiwgMjc6IFwiRXNjXCIsIDMyOiBcIlNwYWNlXCIsIDMzOiBcIlBhZ2VVcFwiLCAzNDogXCJQYWdlRG93blwiLCAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLCAzNzogXCJMZWZ0XCIsIDM4OiBcIlVwXCIsIDM5OiBcIlJpZ2h0XCIsIDQwOiBcIkRvd25cIiwgNDQ6IFwiUHJpbnRTY3JuXCIsIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIiwgNTk6IFwiO1wiLCA2MTogXCI9XCIsIDkxOiBcIk1vZFwiLCA5MjogXCJNb2RcIiwgOTM6IFwiTW9kXCIsXG4gIDEwNjogXCIqXCIsIDEwNzogXCI9XCIsIDEwOTogXCItXCIsIDExMDogXCIuXCIsIDExMTogXCIvXCIsIDEyNzogXCJEZWxldGVcIixcbiAgMTczOiBcIi1cIiwgMTg2OiBcIjtcIiwgMTg3OiBcIj1cIiwgMTg4OiBcIixcIiwgMTg5OiBcIi1cIiwgMTkwOiBcIi5cIiwgMTkxOiBcIi9cIiwgMTkyOiBcImBcIiwgMjE5OiBcIltcIiwgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIiwgMjIyOiBcIidcIiwgNjMyMzI6IFwiVXBcIiwgNjMyMzM6IFwiRG93blwiLCA2MzIzNDogXCJMZWZ0XCIsIDYzMjM1OiBcIlJpZ2h0XCIsIDYzMjcyOiBcIkRlbGV0ZVwiLFxuICA2MzI3MzogXCJIb21lXCIsIDYzMjc1OiBcIkVuZFwiLCA2MzI3NjogXCJQYWdlVXBcIiwgNjMyNzc6IFwiUGFnZURvd25cIiwgNjMzMDI6IFwiSW5zZXJ0XCJcbn07XG5cbmV4cG9ydHMua2V5TmFtZXMgPSBrZXlOYW1lcztcbi8vIE51bWJlciBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAga2V5TmFtZXNbaSArIDQ4XSA9IGtleU5hbWVzW2kgKyA5Nl0gPSBTdHJpbmcoaSk7XG59IC8vIEFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAga2V5TmFtZXNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xufSAvLyBGdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gIGtleU5hbWVzW2kgKyAxMTFdID0ga2V5TmFtZXNbaSArIDYzMjM1XSA9IFwiRlwiICsgaTtcbn0gLy8gOjogKEtleWJvYXJkRXZlbnQpIOKGkiA/c3RyaW5nXG4vLyBGaW5kIGEgbmFtZSBmb3IgdGhlIGdpdmVuIGtleWRvd24gZXZlbnQuIElmIHRoZSBrZXljb2RlIGluIHRoZVxuLy8gZXZlbnQgaXMgbm90IGtub3duLCB0aGlzIHdpbGwgcmV0dXJuIGBudWxsYC4gT3RoZXJ3aXNlLCBpdCB3aWxsXG4vLyByZXR1cm4gYSBzdHJpbmcgbGlrZSBgXCJTaGlmdC1DbWQtQ3RybC1BbHQtSG9tZVwiYC4gVGhlIHBhcnRzIGJlZm9yZVxuLy8gdGhlIGRhc2hlcyBnaXZlIHRoZSBtb2RpZmllcnMgKGFsd2F5cyBpbiB0aGF0IG9yZGVyLCBpZiBwcmVzZW50KSxcbi8vIGFuZCB0aGUgbGFzdCB3b3JkIGdpdmVzIHRoZSBrZXkgbmFtZSwgd2hpY2ggb25lIG9mIHRoZSBuYW1lcyBpblxuLy8gYGtleU5hbWVzYC5cbi8vXG4vLyBUaGUgY29udmVudGlvbiBmb3Iga2V5cHJlc3MgZXZlbnRzIGlzIHRvIHVzZSB0aGUgcHJlc3NlZCBjaGFyYWN0ZXJcbi8vIGJldHdlZW4gc2luZ2xlIHF1b3Rlcy4gRHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBicm93c2VyIEFQSSxcbi8vIGtleXByZXNzIGV2ZW50cyBjYW4gbm90IGhhdmUgbW9kaWZpZXJzLlxuXG5mdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIHZhciBiYXNlID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV0sXG4gICAgICBuYW1lID0gYmFzZTtcbiAgaWYgKG5hbWUgPT0gbnVsbCB8fCBldmVudC5hbHRHcmFwaEtleSkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGV2ZW50LmFsdEtleSAmJiBiYXNlICE9IFwiQWx0XCIpIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5jdHJsS2V5ICYmIGJhc2UgIT0gXCJDdHJsXCIpIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICBpZiAoZXZlbnQubWV0YUtleSAmJiBiYXNlICE9IFwiQ21kXCIpIG5hbWUgPSBcIkNtZC1cIiArIG5hbWU7XG4gIGlmIChldmVudC5zaGlmdEtleSAmJiBiYXNlICE9IFwiU2hpZnRcIikgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICByZXR1cm4gbmFtZTtcbn1cblxuLy8gOjogKHN0cmluZykg4oaSIGJvb2xcbi8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4ga2V5IG5hbWUgcmVmZXJzIHRvIGEgbW9kaWZpZXIga2V5LlxuXG5mdW5jdGlvbiBpc01vZGlmaWVyS2V5KG5hbWUpIHtcbiAgbmFtZSA9IC9bXi1dKiQvLmV4ZWMobmFtZSlbMF07XG4gIHJldHVybiBuYW1lID09IFwiQ3RybFwiIHx8IG5hbWUgPT0gXCJBbHRcIiB8fCBuYW1lID09IFwiU2hpZnRcIiB8fCBuYW1lID09IFwiTW9kXCI7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBzdHJpbmdcbi8vIE5vcm1hbGl6ZSBhIHNsb3BweSBrZXkgbmFtZSwgd2hpY2ggbWF5IGhhdmUgbW9kaWZpZXJzIGluIHRoZSB3cm9uZ1xuLy8gb3JkZXIgb3IgdXNlIHNob3J0aGFuZHMgZm9yIG1vZGlmaWVycywgdG8gYSBwcm9wZXJseSBmb3JtZWQga2V5XG4vLyBuYW1lLiBVc2VkIHRvIG5vcm1hbGl6ZSBuYW1lcyBwcm92aWRlZCBpbiBrZXltYXBzLlxuLy9cbi8vIE5vdGUgdGhhdCB0aGUgbW9kaWZpZXIgYG1vZGAgaXMgYSBzaG9ydGhhbmQgZm9yIGBDbWRgIG9uIE1hYywgYW5kXG4vLyBgQ3RybGAgb24gb3RoZXIgcGxhdGZvcm1zLlxuXG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUpIHtcbiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISc/JCkvKSxcbiAgICAgIHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICB2YXIgYWx0ID0gdW5kZWZpbmVkLFxuICAgICAgY3RybCA9IHVuZGVmaW5lZCxcbiAgICAgIHNoaWZ0ID0gdW5kZWZpbmVkLFxuICAgICAgY21kID0gdW5kZWZpbmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIHZhciBtb2QgPSBwYXJ0c1tpXTtcbiAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKSBjbWQgPSB0cnVlO2Vsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSkgYWx0ID0gdHJ1ZTtlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSBjdHJsID0gdHJ1ZTtlbHNlIGlmICgvXnMoaGlmdCkkL2kudGVzdChtb2QpKSBzaGlmdCA9IHRydWU7ZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICBpZiAobWFjKSBjbWQgPSB0cnVlO2Vsc2UgY3RybCA9IHRydWU7XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gIH1cbiAgaWYgKGFsdCkgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gIGlmIChjdHJsKSByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gIGlmIChjbWQpIHJlc3VsdCA9IFwiQ21kLVwiICsgcmVzdWx0O1xuICBpZiAoc2hpZnQpIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIDs7IEEga2V5bWFwIGJpbmRzIGEgc2V0IG9mIFtrZXkgbmFtZXNdKCNrZXlOYW1lKSB0byBjb21tYW5kcyBuYW1lc1xuLy8gb3IgZnVuY3Rpb25zLlxuXG52YXIgS2V5bWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKE9iamVjdCwgP09iamVjdClcbiAgLy8gQ29uc3RydWN0IGEga2V5bWFwIHVzaW5nIHRoZSBiaW5kaW5ncyBpbiBga2V5c2AsIHdob3NlIHByb3BlcnRpZXNcbiAgLy8gc2hvdWxkIGJlIFtrZXkgbmFtZXNdKCNrZXlOYW1lKSBvciBzcGFjZS1zZXBhcmF0ZWQgc2VxdWVuY2VzIG9mXG4gIC8vIGtleSBuYW1lcy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgYmluZGluZyB3aWxsIGJlIGZvciBhXG4gIC8vIG11bHRpLXN0cm9rZSBrZXkgY29tYmluYXRpb24uXG4gIC8vXG4gIC8vIFdoZW4gYG9wdGlvbnNgIGhhcyBhIHByb3BlcnR5IGBjYWxsYCwgdGhpcyB3aWxsIGJlIGEgcHJvZ3JhbW1hdGljXG4gIC8vIGtleW1hcCwgbWVhbmluZyB0aGF0IGluc3RlYWQgb2YgbG9va2luZyBrZXlzIHVwIGluIGl0cyBzZXQgb2ZcbiAgLy8gYmluZGluZ3MsIGl0IHdpbGwgcGFzcyB0aGUga2V5IG5hbWUgdG8gYG9wdGlvbnMuY2FsbGAsIGFuZCB1c2VcbiAgLy8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGF0IGNhbGxzIGFzIHRoZSByZXNvbHZlZCBiaW5kaW5nLlxuICAvL1xuICAvLyBgb3B0aW9ucy5uYW1lYCBjYW4gYmUgdXNlZCB0byBnaXZlIHRoZSBrZXltYXAgYSBuYW1lLCBtYWtpbmcgaXRcbiAgLy8gZWFzaWVyIHRvIFtyZW1vdmVdKCNQcm9zZU1pcnJvci5yZW1vdmVLZXltYXApIGZyb20gYW4gZWRpdG9yLlxuXG4gIGZ1bmN0aW9uIEtleW1hcChrZXlzLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEtleW1hcCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuYmluZGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChrZXlzKSBmb3IgKHZhciBrZXluYW1lIGluIGtleXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoa2V5cywga2V5bmFtZSkpIHRoaXMuYWRkQmluZGluZyhrZXluYW1lLCBrZXlzW2tleW5hbWVdKTtcbiAgICB9XG4gIH1cblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpXG4gIC8vIEFkZCBhIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlLlxuXG4gIF9jcmVhdGVDbGFzcyhLZXltYXAsIFt7XG4gICAga2V5OiBcImFkZEJpbmRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQmluZGluZyhrZXluYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIGtleXMgPSBrZXluYW1lLnNwbGl0KC8gKyg/IVxcJyQpLykubWFwKG5vcm1hbGl6ZUtleU5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBfbmFtZSA9IGtleXMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCIgXCIpO1xuICAgICAgICB2YXIgdmFsID0gaSA9PSBrZXlzLmxlbmd0aCAtIDEgPyB2YWx1ZSA6IFwiLi4uXCI7XG4gICAgICAgIHZhciBwcmV2ID0gdGhpcy5iaW5kaW5nc1tfbmFtZV07XG4gICAgICAgIGlmICghcHJldikgdGhpcy5iaW5kaW5nc1tfbmFtZV0gPSB2YWw7ZWxzZSBpZiAocHJldiAhPSB2YWwpIHRocm93IG5ldyBFcnJvcihcIkluY29uc2lzdGVudCBiaW5kaW5ncyBmb3IgXCIgKyBfbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZylcbiAgICAvLyBSZW1vdmUgdGhlIGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUJpbmRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQmluZGluZyhrZXluYW1lKSB7XG4gICAgICB2YXIga2V5cyA9IGtleW5hbWUuc3BsaXQoLyArKD8hXFwnJCkvKS5tYXAobm9ybWFsaXplS2V5TmFtZSk7XG4gICAgICBmb3IgKHZhciBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgX25hbWUyID0ga2V5cy5zbGljZSgwLCBpKS5qb2luKFwiIFwiKTtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYmluZGluZ3NbX25hbWUyXTtcbiAgICAgICAgaWYgKHZhbCA9PSBcIi4uLlwiICYmICF0aGlzLnVudXNlZE11bHRpKF9uYW1lMikpIGJyZWFrO2Vsc2UgaWYgKHZhbCkgZGVsZXRlIHRoaXMuYmluZGluZ3NbX25hbWUyXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW51c2VkTXVsdGlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW51c2VkTXVsdGkobmFtZSkge1xuICAgICAgZm9yICh2YXIgYmluZGluZyBpbiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgIGlmIChiaW5kaW5nLmxlbmd0aCA+IG5hbWUgJiYgYmluZGluZy5pbmRleE9mKG5hbWUpID09IDAgJiYgYmluZGluZy5jaGFyQXQobmFtZS5sZW5ndGgpID09IFwiIFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP2FueSkg4oaSIGFueVxuICAgIC8vIExvb2tzIHVwIHRoZSBnaXZlbiBrZXkgb3Iga2V5IHNlcXVlbmNlIGluIHRoaXMga2V5bWFwLiBSZXR1cm5zXG4gICAgLy8gdGhlIHZhbHVlIHRoZSBrZXkgaXMgYm91bmQgdG8gKHdoaWNoIG1heSBiZSB1bmRlZmluZWQgaWYgaXQgaXNcbiAgICAvLyBub3QgYm91bmQpLCBvciB0aGUgc3RyaW5nIGBcIi4uLlwiYCBpZiB0aGUga2V5IGlzIGEgcHJlZml4IG9mIGFcbiAgICAvLyBtdWx0aS1rZXkgc2VxdWVuY2UgdGhhdCBpcyBib3VuZCBieSB0aGlzIGtleW1hcC5cbiAgfSwge1xuICAgIGtleTogXCJsb29rdXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9va3VwKGtleSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jYWxsID8gdGhpcy5vcHRpb25zLmNhbGwoa2V5LCBjb250ZXh0KSA6IHRoaXMuYmluZGluZ3Nba2V5XTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gS2V5bWFwO1xufSkoKTtcblxuZXhwb3J0cy5LZXltYXAgPSBLZXltYXA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94NCwgX3g1LCBfeDYpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3g0LCBwcm9wZXJ0eSA9IF94NSwgcmVjZWl2ZXIgPSBfeDY7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3g0ID0gcGFyZW50OyBfeDUgPSBwcm9wZXJ0eTsgX3g2ID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxucmVxdWlyZShcIi4vY3NzXCIpO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydCA9IHJlcXVpcmUoXCIuLi91dGlsL3NvcnRlZGluc2VydFwiKTtcblxudmFyIF91dGlsU29ydGVkaW5zZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3V0aWxTb3J0ZWRpbnNlcnQpO1xuXG52YXIgX3V0aWxNYXAgPSByZXF1aXJlKFwiLi4vdXRpbC9tYXBcIik7XG5cbnZhciBfdXRpbEV2ZW50ID0gcmVxdWlyZShcIi4uL3V0aWwvZXZlbnRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF9zZXJpYWxpemVUZXh0ID0gcmVxdWlyZShcIi4uL3NlcmlhbGl6ZS90ZXh0XCIpO1xuXG5yZXF1aXJlKFwiLi4vcGFyc2UvdGV4dFwiKTtcblxudmFyIF9wYXJzZSA9IHJlcXVpcmUoXCIuLi9wYXJzZVwiKTtcblxudmFyIF9zZXJpYWxpemUgPSByZXF1aXJlKFwiLi4vc2VyaWFsaXplXCIpO1xuXG52YXIgX29wdGlvbnMgPSByZXF1aXJlKFwiLi9vcHRpb25zXCIpO1xuXG52YXIgX3NlbGVjdGlvbjIgPSByZXF1aXJlKFwiLi9zZWxlY3Rpb25cIik7XG5cbnZhciBfZHJhdyA9IHJlcXVpcmUoXCIuL2RyYXdcIik7XG5cbnZhciBfaW5wdXQgPSByZXF1aXJlKFwiLi9pbnB1dFwiKTtcblxudmFyIF9oaXN0b3J5ID0gcmVxdWlyZShcIi4vaGlzdG9yeVwiKTtcblxudmFyIF9jb21tYW5kcyA9IHJlcXVpcmUoXCIuL2NvbW1hbmRzXCIpO1xuXG52YXIgX3JhbmdlID0gcmVxdWlyZShcIi4vcmFuZ2VcIik7XG5cbnZhciBfa2V5cyA9IHJlcXVpcmUoXCIuL2tleXNcIik7XG5cbi8vIDs7IFRoaXMgaXMgdGhlIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGluc3RhbmNlcyBvZiB0aGUgZWRpdG9yLiBBXG4vLyBQcm9zZU1pcnJvciBlZGl0b3IgaG9sZHMgYSBbZG9jdW1lbnRdKCNOb2RlKSBhbmQgYVxuLy8gW3NlbGVjdGlvbl0oI1NlbGVjdGlvbiksIGFuZCBkaXNwbGF5cyBhbiBlZGl0YWJsZSBzdXJmYWNlXG4vLyByZXByZXNlbnRpbmcgdGhhdCBkb2N1bWVudCBpbiB0aGUgYnJvd3NlciBkb2N1bWVudC5cbi8vXG4vLyBDb250YWlucyBldmVudCBtZXRob2RzIChgb25gLCBldGMpIGZyb20gdGhlIFtldmVudFxuLy8gbWl4aW5dKCNFdmVudE1peGluKS5cblxudmFyIFByb3NlTWlycm9yID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKE9iamVjdClcbiAgLy8gQ29uc3RydWN0IGEgbmV3IGVkaXRvciBmcm9tIGEgc2V0IG9mIFtvcHRpb25zXSgjZWRpdF9vcHRpb25zKVxuICAvLyBhbmQsIGlmIGl0IGhhcyBhIFtgcGxhY2VgXSgjcGxhY2UpIG9wdGlvbiwgYWRkIGl0IHRvIHRoZVxuICAvLyBkb2N1bWVudC5cblxuICBmdW5jdGlvbiBQcm9zZU1pcnJvcihvcHRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3NlTWlycm9yKTtcblxuICAgIG9wdHMgPSB0aGlzLm9wdGlvbnMgPSAoMCwgX29wdGlvbnMucGFyc2VPcHRpb25zKShvcHRzKTtcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBUaGUgc2NoZW1hIGZvciB0aGlzIGVkaXRvcidzIGRvY3VtZW50LlxuICAgIHRoaXMuc2NoZW1hID0gb3B0cy5zY2hlbWE7XG4gICAgaWYgKG9wdHMuZG9jID09IG51bGwpIG9wdHMuZG9jID0gdGhpcy5zY2hlbWEubm9kZShcImRvY1wiLCBudWxsLCBbdGhpcy5zY2hlbWEubm9kZShcInBhcmFncmFwaFwiKV0pO1xuICAgIC8vIDo6IERPTU5vZGVcbiAgICAvLyBUaGUgZWRpdGFibGUgRE9NIG5vZGUgY29udGFpbmluZyB0aGUgZG9jdW1lbnQuXG4gICAgdGhpcy5jb250ZW50ID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1jb250ZW50XCIgfSk7XG4gICAgLy8gOjogRE9NTm9kZVxuICAgIC8vIFRoZSBvdXRlciBET00gZWxlbWVudCBvZiB0aGUgZWRpdG9yLlxuICAgIHRoaXMud3JhcHBlciA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3JcIiB9LCB0aGlzLmNvbnRlbnQpO1xuICAgIHRoaXMud3JhcHBlci5Qcm9zZU1pcnJvciA9IHRoaXM7XG5cbiAgICBpZiAob3B0cy5wbGFjZSAmJiBvcHRzLnBsYWNlLmFwcGVuZENoaWxkKSBvcHRzLnBsYWNlLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7ZWxzZSBpZiAob3B0cy5wbGFjZSkgb3B0cy5wbGFjZSh0aGlzLndyYXBwZXIpO1xuXG4gICAgdGhpcy5zZXREb2NJbm5lcihvcHRzLmRvY0Zvcm1hdCA/ICgwLCBfcGFyc2UucGFyc2VGcm9tKSh0aGlzLnNjaGVtYSwgb3B0cy5kb2MsIG9wdHMuZG9jRm9ybWF0KSA6IG9wdHMuZG9jKTtcbiAgICAoMCwgX2RyYXcuZHJhdykodGhpcywgdGhpcy5kb2MpO1xuICAgIHRoaXMuY29udGVudC5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIGlmIChvcHRzLmxhYmVsKSB0aGlzLmNvbnRlbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBvcHRzLmxhYmVsKTtcblxuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIEEgbmFtZXNwYWNlIHdoZXJlIG1vZHVsZXMgY2FuIHN0b3JlIHJlZmVyZW5jZXMgdG8gdGhlbXNlbHZlc1xuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvciBpbnN0YW5jZS5cbiAgICB0aGlzLm1vZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgIHRoaXMuZGlydHlOb2RlcyA9IG5ldyBfdXRpbE1hcC5NYXAoKTsgLy8gTWFwcyBub2RlIG9iamVjdCB0byAxIChyZS1zY2FuIGNvbnRlbnQpIG9yIDIgKHJlZHJhdyBlbnRpcmVseSlcbiAgICB0aGlzLmZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNlbCA9IG5ldyBfc2VsZWN0aW9uMi5TZWxlY3Rpb25TdGF0ZSh0aGlzKTtcbiAgICB0aGlzLmFjY3VyYXRlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5pbnB1dCA9IG5ldyBfaW5wdXQuSW5wdXQodGhpcyk7XG5cbiAgICAvLyA6OiBPYmplY3Q8Q29tbWFuZD5cbiAgICAvLyBUaGUgY29tbWFuZHMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IuXG4gICAgdGhpcy5jb21tYW5kcyA9ICgwLCBfY29tbWFuZHMuaW5pdENvbW1hbmRzKSh0aGlzKTtcbiAgICB0aGlzLmNvbW1hbmRLZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICgwLCBfb3B0aW9ucy5pbml0T3B0aW9ucykodGhpcyk7XG4gIH1cblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpXG4gIC8vIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFtvcHRpb25dKCNlZGl0X29wdGlvbnMpLlxuXG4gIF9jcmVhdGVDbGFzcyhQcm9zZU1pcnJvciwgW3tcbiAgICBrZXk6IFwic2V0T3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE9wdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgKDAsIF9vcHRpb25zLnNldE9wdGlvbikodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiBhbnlcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIFtvcHRpb25dKCNlZGl0X29wdGlvbnMpLlxuICB9LCB7XG4gICAga2V5OiBcImdldE9wdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcHRpb24obmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyA6OiBTZWxlY3Rpb25cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNldFRleHRTZWxlY3Rpb25cIixcblxuICAgIC8vIDo6IChQb3MsID9Qb3MpXG4gICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gYSBbdGV4dCBzZWxlY3Rpb25dKCNUZXh0U2VsZWN0aW9uKSBmcm9tXG4gICAgLy8gYGFuY2hvcmAgdG8gYGhlYWRgLCBvciwgaWYgYGhlYWRgIGlzIG51bGwsIGEgY3Vyc29yIHNlbGVjdGlvbiBhdFxuICAgIC8vIGBhbmNob3JgLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXh0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCkge1xuICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3IF9zZWxlY3Rpb24yLlRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcylcbiAgICAvLyBTZXQgdGhlIHNlbGVjdGlvbiB0byBhIG5vZGUgc2VsZWN0aW9uIG9uIHRoZSBub2RlIGFmdGVyIGBwb3NgLlxuICB9LCB7XG4gICAga2V5OiBcInNldE5vZGVTZWxlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Tm9kZVNlbGVjdGlvbihwb3MpIHtcbiAgICAgIHRoaXMuY2hlY2tQb3MocG9zLCBmYWxzZSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5kb2MucGF0aChwb3MucGF0aCk7XG4gICAgICBpZiAocG9zLm9mZnNldCA+PSBwYXJlbnQuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHNldCBhIG5vZGUgc2VsZWN0aW9uIGF0IHRoZSBlbmQgb2YgYSBub2RlXCIpO1xuICAgICAgdmFyIG5vZGUgPSBwYXJlbnQuY2hpbGQocG9zLm9mZnNldCk7XG4gICAgICBpZiAoIW5vZGUudHlwZS5zZWxlY3RhYmxlKSB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc2VsZWN0IGEgbm9uLXNlbGVjdGFibGUgbm9kZVwiKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICB0aGlzLnNlbC5zZXRBbmRTaWduYWwobmV3IF9zZWxlY3Rpb24yLk5vZGVTZWxlY3Rpb24ocG9zLCBwb3MubW92ZSgxKSwgbm9kZSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChTZWxlY3Rpb24pXG4gICAgLy8gU2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBvYmplY3QuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihzZWxlY3Rpb24pIHtcbiAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBfc2VsZWN0aW9uMi5UZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQb3Moc2VsZWN0aW9uLmhlYWQsIHRydWUpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbi5lbXB0eSkgdGhpcy5jaGVja1BvcyhzZWxlY3Rpb24uYW5jaG9yLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tQb3Moc2VsZWN0aW9uLnRvLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkRpcmVjdChzZWxlY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25EaXJlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uRGlyZWN0KHNlbGVjdGlvbikge1xuICAgICAgdGhpcy5lbnN1cmVPcGVyYXRpb24oKTtcbiAgICAgIHRoaXMuaW5wdXQubWF5YmVBYm9ydENvbXBvc2l0aW9uKCk7XG4gICAgICBpZiAoIXNlbGVjdGlvbi5lcSh0aGlzLnNlbC5yYW5nZSkpIHRoaXMuc2VsLnNldEFuZFNpZ25hbChzZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIDo6IChhbnksID9zdHJpbmcpXG4gICAgLy8gUmVwbGFjZSB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQuIFdoZW4gYGZvcm1hdGAgaXMgZ2l2ZW4sIGl0IHNob3VsZFxuICAgIC8vIGJlIGEgW3BhcnNhYmxlIGZvcm1hdF0oI3BhcnNlKSwgYW5kIGB2YWx1ZWAgc2hvdWxkIHNvbWV0aGluZyBpblxuICAgIC8vIHRoYXQgZm9ybWF0LiBJZiBub3QsIGB2YWx1ZWAgc2hvdWxkIGJlIGEgYE5vZGVgLlxuICB9LCB7XG4gICAga2V5OiBcInNldENvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29udGVudCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICBpZiAoZm9ybWF0KSB2YWx1ZSA9ICgwLCBfcGFyc2UucGFyc2VGcm9tKSh0aGlzLnNjaGVtYSwgdmFsdWUsIGZvcm1hdCk7XG4gICAgICB0aGlzLnNldERvYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9zdHJpbmcpIOKGkiBhbnlcbiAgICAvLyBHZXQgdGhlIGVkaXRvcidzIGNvbnRlbnQgaW4gYSBnaXZlbiBmb3JtYXQuIFdoZW4gYGZvcm1hdGAgaXMgbm90XG4gICAgLy8gZ2l2ZW4sIGEgYE5vZGVgIGlzIHJldHVybmVkLiBJZiBpdCBpcyBnaXZlbiwgaXQgc2hvdWxkIGJlIGFuXG4gICAgLy8gZXhpc3RpbmcgW3NlcmlhbGl6YXRpb24gZm9ybWF0XSgjc2VyaWFsaXplKS5cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbnRlbnQoZm9ybWF0KSB7XG4gICAgICByZXR1cm4gZm9ybWF0ID8gKDAsIF9zZXJpYWxpemUuc2VyaWFsaXplVG8pKHRoaXMuZG9jLCBmb3JtYXQpIDogdGhpcy5kb2M7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldERvY0lubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvY0lubmVyKGRvYykge1xuICAgICAgaWYgKGRvYy50eXBlICE9IHRoaXMuc2NoZW1hLm5vZGVzLmRvYykgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHNldCBhIGRvY3VtZW50IHdpdGggYSBkaWZmZXJlbnQgc2NoZW1hXCIpO1xuICAgICAgLy8gOjogTm9kZSBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgX3JhbmdlLlJhbmdlU3RvcmUodGhpcyk7XG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgX2hpc3RvcnkuSGlzdG9yeSh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgP1NlbGVjdGlvbilcbiAgICAvLyBTZXQgdGhlIGVkaXRvcidzIGNvbnRlbnQsIGFuZCBvcHRpb25hbGx5IGluY2x1ZGUgYSBuZXcgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInNldERvY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREb2MoZG9jLCBzZWwpIHtcbiAgICAgIGlmICghc2VsKSBzZWwgPSAoMCwgX3NlbGVjdGlvbjIuZmluZFNlbGVjdGlvbkF0U3RhcnQpKGRvYyk7XG4gICAgICAvLyA6OiAoZG9jOiBOb2RlLCBzZWxlY3Rpb246IFNlbGVjdGlvbikgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2JlZm9yZVNldERvY1xuICAgICAgLy8gRmlyZWQgd2hlbiBbYHNldERvY2BdKCNQcm9zZU1pcnJvci5zZXREb2MpIGlzIGNhbGxlZCwgYmVmb3JlXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgaXMgYWN0dWFsbHkgdXBkYXRlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwiYmVmb3JlU2V0RG9jXCIsIGRvYywgc2VsKTtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLnNldERvY0lubmVyKGRvYyk7XG4gICAgICB0aGlzLnNlbC5zZXQoc2VsLCB0cnVlKTtcbiAgICAgIC8vIDo6IChkb2M6IE5vZGUsIHNlbGVjdGlvbjogU2VsZWN0aW9uKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjc2V0RG9jXG4gICAgICAvLyBGaXJlZCB3aGVuIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLnNldERvYykgaXMgY2FsbGVkLCBhZnRlclxuICAgICAgLy8gdGhlIGRvY3VtZW50IGlzIHVwZGF0ZWQuXG4gICAgICB0aGlzLnNpZ25hbChcInNldERvY1wiLCBkb2MsIHNlbCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZURvY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBtYXBwaW5nLCBzZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB0aGlzLmlucHV0Lm1heWJlQWJvcnRDb21wb3NpdGlvbigpO1xuICAgICAgdGhpcy5yYW5nZXMudHJhbnNmb3JtKG1hcHBpbmcpO1xuICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICB0aGlzLnNlbC5zZXRBbmRTaWduYWwoc2VsZWN0aW9uIHx8IHRoaXMuc2VsLnJhbmdlLm1hcChkb2MsIG1hcHBpbmcpKTtcbiAgICAgIC8vIDo6ICgpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyNjaGFuZ2VcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkLiBTZWVcbiAgICAgIC8vIFtgc2V0RG9jYF0oI1Byb3NlTWlycm9yLmV2ZW50X3NldERvYykgYW5kXG4gICAgICAvLyBbYHRyYW5zZm9ybWBdKCNQcm9zZU1pcnJvci5ldmVudF90cmFuc2Zvcm0pIGZvciBtb3JlIHNwZWNpZmljXG4gICAgICAvLyBjaGFuZ2UtcmVsYXRlZCBldmVudHMuXG4gICAgICB0aGlzLnNpZ25hbChcImNoYW5nZVwiKTtcbiAgICB9XG5cbiAgICAvLyA6OiBFZGl0b3JUcmFuc2Zvcm1cbiAgICAvLyBDcmVhdGUgYW4gZWRpdG9yLSBhbmQgc2VsZWN0aW9uLWF3YXJlIGBUcmFuc2Zvcm1gIGZvciB0aGlzIGVkaXRvci5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseVwiLFxuXG4gICAgLy8gOjogKFRyYW5zZm9ybSwgP09iamVjdCkg4oaSID9UcmFuc2Zvcm1cbiAgICAvLyBBcHBseSBhIHRyYW5zZm9ybWF0aW9uICh3aGljaCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUgd2l0aCB0aGVcbiAgICAvLyBbYHRyYCBnZXR0ZXJdKCNQcm9zZU1pcnJvci50cikpIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgZWRpdG9yLlxuICAgIC8vIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICAgIC8vXG4gICAgLy8gKipgc2VsZWN0aW9uYCoqYDogP1NlbGVjdGlvbmBcbiAgICAvLyAgIDogQSBuZXcgc2VsZWN0aW9uIHRvIHNldCBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZC5cbiAgICAvL1xuICAgIC8vICoqYHNjcm9sbEludG9WaWV3YCoqOiA/Ym9vbFxuICAgIC8vICAgOiBXaGVuIHRydWUsIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlldyBvbiB0aGUgbmV4dFxuICAgIC8vICAgICBbcmVkcmF3XSgjUHJvc2VNaXJyb3IuZmx1c2gpLlxuICAgIC8vXG4gICAgLy8gUmV0dXJucyB0aGUgdHJhbnNmb3JtLCBvciBgZmFsc2VgIGlmIHRoZXJlIHdlcmUgbm8gc3RlcHMgaW4gaXQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5KHRyYW5zZm9ybSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBudWxsT3B0aW9ucyA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKHRyYW5zZm9ybS5kb2MgPT0gdGhpcy5kb2MpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0cmFuc2Zvcm0uZG9jc1swXSAhPSB0aGlzLmRvYyAmJiAoMCwgX21vZGVsLmZpbmREaWZmU3RhcnQpKHRyYW5zZm9ybS5kb2NzWzBdLCB0aGlzLmRvYykpIHRocm93IG5ldyBFcnJvcihcIkFwcGx5aW5nIGEgdHJhbnNmb3JtIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcblxuICAgICAgdGhpcy51cGRhdGVEb2ModHJhbnNmb3JtLmRvYywgdHJhbnNmb3JtLCBvcHRpb25zLnNlbGVjdGlvbik7XG4gICAgICAvLyA6OiAoVHJhbnNmb3JtLCBPYmplY3QpICNwYXRoPVByb3NlTWlycm9yI2V2ZW50cyN0cmFuc2Zvcm1cbiAgICAgIC8vIFNpZ25hbHMgdGhhdCBhIChub24tZW1wdHkpIHRyYW5zZm9ybWF0aW9uIGhhcyBiZWVuIGFwbGllZCB0b1xuICAgICAgLy8gdGhlIGVkaXRvci4gUGFzc2VzIHRoZSBgVHJhbnNmb3JtYCBhbmQgdGhlIG9wdGlvbnMgZ2l2ZW4gdG9cbiAgICAgIC8vIFtgYXBwbHlgXSgjUHJvc2VNaXJyb3IuYXBwbHkpIGFzIGFyZ3VtZW50cyB0byB0aGUgaGFuZGxlci5cbiAgICAgIHRoaXMuc2lnbmFsKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5zY3JvbGxJbnRvVmlldykgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zLCA/Ym9vbClcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsXG4gICAgLy8gYW5kIHRocm93IGFuIGVycm9yIG90aGVyd2lzZS4gV2hlbiBgdGV4dGJsb2NrYCBpcyB0cnVlLCB0aGUgcG9zaXRpb25cbiAgICAvLyBtdXN0IGFsc28gZmFsbCB3aXRoaW4gYSB0ZXh0YmxvY2sgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJjaGVja1Bvc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGVja1Bvcyhwb3MsIHRleHRibG9jaykge1xuICAgICAgaWYgKCF0aGlzLmRvYy5pc1ZhbGlkUG9zKHBvcywgdGV4dGJsb2NrKSkgdGhyb3cgbmV3IEVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBpcyBub3QgdmFsaWQgaW4gY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5zdXJlT3BlcmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuc3VyZU9wZXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbiB8fCB0aGlzLnN0YXJ0T3BlcmF0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0YXJ0T3BlcmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0T3BlcmF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5zZWwuYmVmb3JlU3RhcnRPcCgpO1xuICAgICAgdGhpcy5vcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKHRoaXMpO1xuICAgICAgaWYgKCF0aGlzLmZsdXNoU2NoZWR1bGVkKSB7XG4gICAgICAgICgwLCBfZG9tLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMuZmx1c2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uO1xuICAgIH1cblxuICAgIC8vIDo6ICgpXG4gICAgLy8gRmx1c2ggYW55IHBlbmRpbmcgY2hhbmdlcyB0byB0aGUgRE9NLiBXaGVuIHRoZSBkb2N1bWVudCxcbiAgICAvLyBzZWxlY3Rpb24sIG9yIG1hcmtlZCByYW5nZXMgaW4gYW4gZWRpdG9yIGNoYW5nZSwgdGhlIERPTSBpc24ndFxuICAgIC8vIHVwZGF0ZWQgaW1tZWRpYXRlbHksIGJ1dCByYXRoZXIgc2NoZWR1bGVkIHRvIGJlIHVwZGF0ZWQgdGhlIG5leHRcbiAgICAvLyB0aW1lIHRoZSBicm93c2VyIHJlZHJhd3MgdGhlIHNjcmVlbi4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG9cbiAgICAvLyBmb3JjZSB0aGlzIHRvIGhhcHBlbiBpbW1lZGlhdGVseS4gSXQgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgd2FudCB0byBtZWFzdXJlIHdoZXJlIG9uIHRoZSBzY3JlZW4gYSBwYXJ0IG9mIHRoZVxuICAgIC8vIGRvY3VtZW50IGVuZHMgdXAsIGltbWVkaWF0ZWx5IGFmdGVyIGNoYW5naW5nIHRoZSBkb2N1bWVudC5cbiAgfSwge1xuICAgIGtleTogXCJmbHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLndyYXBwZXIpIHx8ICF0aGlzLm9wZXJhdGlvbikgcmV0dXJuO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZsdXNoaW5nXG4gICAgICAvLyBGaXJlZCB3aGVuIHRoZSBlZGl0b3IgaXMgYWJvdXQgdG8gW2ZsdXNoXSgjUHJvc2VNaXJyb3IuZmx1c2gpXG4gICAgICAvLyBhbiB1cGRhdGUgdG8gdGhlIERPTS5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hpbmdcIik7XG4gICAgICB2YXIgb3AgPSB0aGlzLm9wZXJhdGlvbjtcbiAgICAgIGlmICghb3ApIHJldHVybjtcbiAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSB0cnVlO1xuXG4gICAgICB2YXIgZG9jQ2hhbmdlZCA9IG9wLmRvYyAhPSB0aGlzLmRvYyB8fCB0aGlzLmRpcnR5Tm9kZXMuc2l6ZSxcbiAgICAgICAgICByZWRyYXduID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuaW5wdXQuY29tcG9zaW5nICYmIChkb2NDaGFuZ2VkIHx8IG9wLmNvbXBvc2luZ0F0U3RhcnQpKSB7XG4gICAgICAgICgwLCBfZHJhdy5yZWRyYXcpKHRoaXMsIHRoaXMuZGlydHlOb2RlcywgdGhpcy5kb2MsIG9wLmRvYyk7XG4gICAgICAgIHRoaXMuZGlydHlOb2Rlcy5jbGVhcigpO1xuICAgICAgICByZWRyYXduID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChyZWRyYXduIHx8ICFvcC5zZWwuZXEodGhpcy5zZWwucmFuZ2UpKSAmJiAhdGhpcy5pbnB1dC5jb21wb3NpbmcpIHRoaXMuc2VsLnRvRE9NKG9wLmZvY3VzKTtcblxuICAgICAgaWYgKG9wLnNjcm9sbEludG9WaWV3ICE9PSBmYWxzZSkgKDAsIF9zZWxlY3Rpb24yLnNjcm9sbEludG9WaWV3KSh0aGlzLCBvcC5zY3JvbGxJbnRvVmlldyk7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZHJhd1xuICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgZWRpdG9yIHJlZHJldyBpdHMgZG9jdW1lbnQgaW4gdGhlIERPTS5cbiAgICAgIGlmIChkb2NDaGFuZ2VkKSB0aGlzLnNpZ25hbChcImRyYXdcIik7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjZmx1c2hcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBoYXMgZmluaXNoZWRcbiAgICAgIC8vIFtmbHVzaGluZ10oI1Byb3NlTWlycm9yLmZsdXNoKSBhbiB1cGRhdGUgdG8gdGhlIERPTS4gSWYgeW91XG4gICAgICAvLyBuZWVkIHRvIHJlc3BvbmQgdG8gdGhpcyB3aXRoIGEgRE9NIHVwZGF0ZSBvZiB5b3VyIG93biwgdXNlIHRoaXNcbiAgICAgIC8vIGV2ZW50IHRvIHJlYWQgbGF5b3V0IGZyb20gdGhlIERPTSwgYW5kXG4gICAgICAvLyBbYGZsdXNoZWRgXSgjUHJvc2VNaXJyb3IuZXZlbnRfZmx1c2hlZCkgdG8gdXBkYXRlIHRoZSBET00uXG4gICAgICB0aGlzLnNpZ25hbChcImZsdXNoXCIpO1xuICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2ZsdXNoZWRcbiAgICAgIC8vIEZpcmVkIHdoZW4gdGhlIGVkaXRvciBoYXMgZmluaXNoZWRcbiAgICAgIC8vIFtmbHVzaGluZ10oI1Byb3NlTWlycm9yLmZsdXNoKSBhbiB1cGRhdGUgdG8gdGhlIERPTSwgYWZ0ZXJcbiAgICAgIC8vIFtgZmx1c2hgXSgjUHJvc2VNaXJyb3IuZXZlbnRfZmx1c2gpIGhhcyBmaXJlZC5cbiAgICAgIHRoaXMuc2lnbmFsKFwiZmx1c2hlZFwiKTtcbiAgICAgIHRoaXMuYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoS2V5bWFwLCA/bnVtYmVyKVxuICAgIC8vIEFkZCBhIFtrZXltYXBdKCNLZXltYXApIHRvIHRoZSBlZGl0b3IuIEtleW1hcHMgYWRkZWQgaW4gdGhpcyB3YXlcbiAgICAvLyBhcmUgcXVlcmllZCBiZWZvcmUgdGhlIFtiYXNlIGtleW1hcF0oI2tleW1hcCkuXG4gICAgLy8gVGhlIGByYW5rYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGVuIHRoZXkgYXJlIHF1ZXJpZWRcbiAgICAvLyByZWxhdGl2ZSB0byBvdGhlciBtYXBzIGFkZGVkIGxpa2UgdGhpcy4gTWFwcyB3aXRoIGEgbG93ZXIgcmFua1xuICAgIC8vIGdldCBxdWVyaWVkIGZpcnN0LlxuICB9LCB7XG4gICAga2V5OiBcImFkZEtleW1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRLZXltYXAobWFwKSB7XG4gICAgICB2YXIgcmFuayA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDUwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkodGhpcy5pbnB1dC5rZXltYXBzLCB7IG1hcDogbWFwLCByYW5rOiByYW5rIH0sIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyA6OiAodW5pb248c3RyaW5nLCBLZXltYXA+KVxuICAgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4ga2V5bWFwLCBvciB0aGUga2V5bWFwIHdpdGggdGhlIGdpdmVuIG5hbWUsIGZyb21cbiAgICAvLyB0aGUgZWRpdG9yLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUtleW1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVLZXltYXAobWFwKSB7XG4gICAgICB2YXIgbWFwcyA9IHRoaXMuaW5wdXQua2V5bWFwcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobWFwc1tpXS5tYXAgPT0gbWFwIHx8IG1hcHNbaV0ubWFwLm9wdGlvbnMubmFtZSA9PSBtYXApIHtcbiAgICAgICAgICBtYXBzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXJrUmFuZ2VcIixcblxuICAgIC8vIDo6IChQb3MsIFBvcywgP09iamVjdCkg4oaSIE1hcmtlZFJhbmdlXG4gICAgLy8gQ3JlYXRlIGEgbWFya2VkIHJhbmdlIGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy4gTWFya2VkIHJhbmdlc1xuICAgIC8vIOKAnHRyYWNr4oCdIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB0aGV5IHBvaW50IHRv4oCUYXMgdGhlIGRvY3VtZW50XG4gICAgLy8gY2hhbmdlcywgdGhleSBhcmUgdXBkYXRlZCB0byBtb3ZlLCBncm93LCBhbmQgc2hyaW5rIGFsb25nIHdpdGhcbiAgICAvLyB0aGVpciBjb250ZW50LlxuICAgIC8vXG4gICAgLy8gYG9wdGlvbnNgIG1heSBiZSBhbiBvYmplY3QgY29udGFpbmluZyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgIC8vXG4gICAgLy8gKipgaW5jbHVzaXZlTGVmdGAqKmA6IGJvb2wgPSBmYWxzZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgbGVmdCBzaWRlIG9mIHRoZSByYW5nZSBpcyBpbmNsdXNpdmUuIFdoZW4gaXQgaXMsXG4gICAgLy8gICAgIGNvbnRlbnQgaW5zZXJ0ZWQgYXQgdGhhdCBwb2ludCB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSByYW5nZS5cbiAgICAvLyAgICAgV2hlbiBub3QsIGl0IHdpbGwgYmUgb3V0c2lkZSBvZiB0aGUgcmFuZ2UuXG4gICAgLy9cbiAgICAvLyAqKmBpbmNsdXNpdmVSaWdodGAqKmA6IGJvb2wgPSBmYWxzZWBcbiAgICAvLyAgIDogV2hldGhlciB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgcmFuZ2UgaXMgaW5jbHVzaXZlLlxuICAgIC8vXG4gICAgLy8gKipgcmVtb3ZlV2hlbkVtcHR5YCoqYDogYm9vbCA9IHRydWVgXG4gICAgLy8gICA6IFdoZXRoZXIgdGhlIHJhbmdlIHNob3VsZCBiZSBmb3Jnb3R0ZW4gd2hlbiBpdCBiZWNvbWVzIGVtcHR5XG4gICAgLy8gICAgIChiZWNhdXNlIGFsbCBvZiBpdHMgY29udGVudCB3YXMgZGVsZXRlZCkuXG4gICAgLy9cbiAgICAvLyAqKmBjbGFzc05hbWVgKio6IHN0cmluZ1xuICAgIC8vICAgOiBBIENTUyBjbGFzcyB0byBhZGQgdG8gdGhlIGlubGluZSBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGlzXG4gICAgLy8gICAgIHJhbmdlLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXJrUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY2hlY2tQb3MoZnJvbSk7XG4gICAgICB0aGlzLmNoZWNrUG9zKHRvKTtcbiAgICAgIHZhciByYW5nZSA9IG5ldyBfcmFuZ2UuTWFya2VkUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpO1xuICAgICAgdGhpcy5yYW5nZXMuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrZWRSYW5nZSlcbiAgICAvLyBSZW1vdmUgdGhlIGdpdmVuIHJhbmdlIGZyb20gdGhlIGVkaXRvci5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSYW5nZShyYW5nZSkge1xuICAgICAgdGhpcy5yYW5nZXMucmVtb3ZlUmFuZ2UocmFuZ2UpO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrVHlwZSwgP2Jvb2wsID9PYmplY3QpXG4gICAgLy8gU2V0ICh3aGVuIGB0b2AgaXMgdHJ1ZSksIHVuc2V0IChgdG9gIGlzIGZhbHNlKSwgb3IgdG9nZ2xlIChgdG9gXG4gICAgLy8gaXMgbnVsbCkgdGhlIGdpdmVuIG1hcmsgdHlwZSBvbiB0aGUgc2VsZWN0aW9uLiBXaGVuIHRoZXJlIGlzIGFcbiAgICAvLyBub24tZW1wdHkgc2VsZWN0aW9uLCB0aGUgbWFya3Mgb2YgdGhlIHNlbGVjdGlvbiBhcmUgdXBkYXRlZC4gV2hlblxuICAgIC8vIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBzZXQgb2YgW2FjdGl2ZVxuICAgIC8vIG1hcmtzXSgjUHJvc2VNaXJyb3IuYWN0aXZlTWFya3MpIGlzIHVwZGF0ZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYXJrKHR5cGUsIHRvLCBhdHRycykge1xuICAgICAgdmFyIHNlbCA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgaWYgKHNlbC5lbXB0eSkge1xuICAgICAgICB2YXIgbWFya3MgPSB0aGlzLmFjdGl2ZU1hcmtzKCk7XG4gICAgICAgIGlmICh0byA9PSBudWxsKSB0byA9ICF0eXBlLmlzSW5TZXQobWFya3MpO1xuICAgICAgICBpZiAodG8gJiYgIXRoaXMuZG9jLnBhdGgoc2VsLmhlYWQucGF0aCkudHlwZS5jYW5Db250YWluTWFyayh0eXBlKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlucHV0LnN0b3JlZE1hcmtzID0gdG8gPyB0eXBlLmNyZWF0ZShhdHRycykuYWRkVG9TZXQobWFya3MpIDogdHlwZS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgLy8gOjogKCkgI3BhdGg9UHJvc2VNaXJyb3IjZXZlbnRzI2FjdGl2ZU1hcmtDaGFuZ2VcbiAgICAgICAgLy8gRmlyZWQgd2hlbiB0aGUgc2V0IG9mIFthY3RpdmUgbWFya3NdKCNQcm9zZU1pcnJvci5hY3RpdmVNYXJrcykgY2hhbmdlcy5cbiAgICAgICAgdGhpcy5zaWduYWwoXCJhY3RpdmVNYXJrQ2hhbmdlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRvICE9IG51bGwgPyB0byA6ICF0aGlzLmRvYy5yYW5nZUhhc01hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZSkpIHRoaXMuYXBwbHkodGhpcy50ci5hZGRNYXJrKHNlbC5mcm9tLCBzZWwudG8sIHR5cGUuY3JlYXRlKGF0dHJzKSkpO2Vsc2UgdGhpcy5hcHBseSh0aGlzLnRyLnJlbW92ZU1hcmsoc2VsLmZyb20sIHNlbC50bywgdHlwZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBbTWFya11cbiAgICAvLyBHZXQgdGhlIG1hcmtzIGF0IHRoZSBjdXJzb3IuIEJ5IGRlZmF1bHQsIHRoaXMgeWllbGRzIHRoZSBtYXJrc1xuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBhdCB0aGUgY3Vyc29yLCBhcyBwZXIgYE5vZGUubWFya3NBdGAuXG4gICAgLy8gQnV0IGBzZXRNYXJrYCBtYXkgaGF2ZSBiZWVuIHVzZWQgdG8gY2hhbmdlIHRoZSBzZXQgb2YgYWN0aXZlXG4gICAgLy8gbWFya3MsIGluIHdoaWNoIGNhc2UgdGhhdCBzZXQgaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlTWFya3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aXZlTWFya3MoKSB7XG4gICAgICB2YXIgaGVhZDtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0LnN0b3JlZE1hcmtzIHx8ICgoaGVhZCA9IHRoaXMuc2VsZWN0aW9uLmhlYWQpID8gdGhpcy5kb2MubWFya3NBdChoZWFkKSA6IFtdKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKVxuICAgIC8vIEdpdmUgdGhlIGVkaXRvciBmb2N1cy5cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIGlmICh0aGlzLm9wZXJhdGlvbikgdGhpcy5vcGVyYXRpb24uZm9jdXMgPSB0cnVlO2Vsc2UgdGhpcy5zZWwudG9ET00odHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIGJvb2xcbiAgICAvLyBRdWVyeSB3aGV0aGVyIHRoZSBlZGl0b3IgaGFzIGZvY3VzLlxuICB9LCB7XG4gICAga2V5OiBcImhhc0ZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0ZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMuc2VsLnJhbmdlIGluc3RhbmNlb2YgX3NlbGVjdGlvbjIuTm9kZVNlbGVjdGlvbikgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50O2Vsc2UgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5oYXNGb2N1cykodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQgZmFsbHMgd2l0aGluIHRoZSBzZWxlY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwicG9zQXRDb29yZHNcIixcblxuICAgIC8vIDo6ICh7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcn0pIOKGkiA/UG9zXG4gICAgLy8gSWYgdGhlIGdpdmVuIGNvb3JkaW5hdGVzICh3aGljaCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHRvcFxuICAgIC8vIGxlZnQgY29ybmVyIG9mIHRoZSB3aW5kb3figJRub3QgdGhlIHBhZ2UpIGZhbGwgd2l0aGluIHRoZSBlZGl0YWJsZVxuICAgIC8vIGNvbnRlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkb2N1bWVudCBwb3NpdGlvbiB0aGF0XG4gICAgLy8gY29ycmVzcG9uZHMgdG8gdGhvc2UgY29vcmRpbmF0ZXMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5wb3NBdENvb3JkcykodGhpcywgY29vcmRzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIge3RvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyfVxuICAgIC8vIEZpbmQgdGhlIHNjcmVlbiBjb29yZGluYXRlcyAocmVsYXRpdmUgdG8gdG9wIGxlZnQgY29ybmVyIG9mIHRoZVxuICAgIC8vIHdpbmRvdykgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcImNvb3Jkc0F0UG9zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHBvcykge1xuICAgICAgdGhpcy5jaGVja1Bvcyhwb3MpO1xuICAgICAgcmV0dXJuICgwLCBfc2VsZWN0aW9uMi5jb29yZHNBdFBvcykodGhpcywgcG9zKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP1BvcylcbiAgICAvLyBTY3JvbGwgdGhlIGdpdmVuIHBvc2l0aW9uLCBvciB0aGUgY3Vyc29yIHBvc2l0aW9uIGlmIGBwb3NgIGlzbid0XG4gICAgLy8gZ2l2ZW4sIGludG8gdmlldy5cbiAgfSwge1xuICAgIGtleTogXCJzY3JvbGxJbnRvVmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgIHZhciBwb3MgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzBdO1xuXG4gICAgICBpZiAocG9zKSB0aGlzLmNoZWNrUG9zKHBvcyk7XG4gICAgICB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgdGhpcy5vcGVyYXRpb24uc2Nyb2xsSW50b1ZpZXcgPSBwb3M7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgP1thbnldKSDihpIgYm9vbFxuICAgIC8vIEV4ZWN1dGUgdGhlIG5hbWVkIFtjb21tYW5kXSgjQ29tbWFuZCkuIElmIHRoZSBjb21tYW5kIHRha2VzXG4gICAgLy8gcGFyYW1ldGVycyBhbmQgdGhleSBhcmUgbm90IHBhc3NlZCBoZXJlLCB0aGUgdXNlciB3aWxsIGJlXG4gICAgLy8gcHJvbXB0ZWQgZm9yIHRoZW0uXG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY0NvbW1hbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhlY0NvbW1hbmQobmFtZSwgcGFyYW1zKSB7XG4gICAgICB2YXIgY21kID0gdGhpcy5jb21tYW5kc1tuYW1lXTtcbiAgICAgIHJldHVybiAhIShjbWQgJiYgY21kLmV4ZWModGhpcywgcGFyYW1zKSAhPT0gZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiA/c3RyaW5nXG4gICAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBrZXkgdGhhdCBpcyBib3VuZCB0byB0aGUgZ2l2ZW4gY29tbWFuZCwgaWZcbiAgICAvLyBhbnkuXG4gIH0sIHtcbiAgICBrZXk6IFwia2V5Rm9yQ29tbWFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBrZXlGb3JDb21tYW5kKG5hbWUpIHtcbiAgICAgIHZhciBjYWNoZWQgPSB0aGlzLmNvbW1hbmRLZXlzW25hbWVdO1xuICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgICB2YXIgY21kID0gdGhpcy5jb21tYW5kc1tuYW1lXSxcbiAgICAgICAgICBrZXltYXAgPSB0aGlzLmJhc2VLZXltYXA7XG4gICAgICBpZiAoIWNtZCkgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBudWxsO1xuICAgICAgdmFyIGtleSA9IGNtZC5zcGVjLmtleSB8fCAoX2RvbS5icm93c2VyLm1hYyA/IGNtZC5zcGVjLm1hY0tleSA6IGNtZC5zcGVjLnBjS2V5KTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAga2V5ID0gKDAsIF9rZXlzLm5vcm1hbGl6ZUtleU5hbWUpKEFycmF5LmlzQXJyYXkoa2V5KSA/IGtleVswXSA6IGtleSk7XG4gICAgICAgIHZhciBkZWZsdCA9IGtleW1hcC5iaW5kaW5nc1trZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZsdCkgPyBkZWZsdC5pbmRleE9mKG5hbWUpID4gLTEgOiBkZWZsdCA9PSBuYW1lKSByZXR1cm4gdGhpcy5jb21tYW5kS2V5c1tuYW1lXSA9IGtleTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9rZXkgaW4ga2V5bWFwLmJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBib3VuZCA9IGtleW1hcC5iaW5kaW5nc1tfa2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYm91bmQpID8gYm91bmQuaW5kZXhPZihuYW1lKSA+IC0xIDogYm91bmQgPT0gbmFtZSkgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBfa2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZEtleXNbbmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWdpc3RyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RyeShuYW1lLCBmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5zY2hlbWEucmVnaXN0cnkobmFtZSwgZik7XG4gICAgICB0aGlzLm9wdGlvbnMucmVnaXN0cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWcpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gcmVnLnJlZ2lzdHJ5W25hbWVdO1xuICAgICAgICBpZiAoYXJyYXkpIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGYoYXJyYXlbaV0sIF90aGlzMik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFya1JhbmdlRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya1JhbmdlRGlydHkocmFuZ2UpIHtcbiAgICAgIHRoaXMuZW5zdXJlT3BlcmF0aW9uKCk7XG4gICAgICB2YXIgZGlydHkgPSB0aGlzLmRpcnR5Tm9kZXM7XG4gICAgICB2YXIgZnJvbSA9IHJhbmdlLmZyb20sXG4gICAgICAgICAgdG8gPSByYW5nZS50bztcbiAgICAgIGZvciAodmFyIGRlcHRoID0gMCwgbm9kZSA9IHRoaXMuZG9jOzsgZGVwdGgrKykge1xuICAgICAgICB2YXIgZnJvbUVuZCA9IGRlcHRoID09IGZyb20uZGVwdGgsXG4gICAgICAgICAgICB0b0VuZCA9IGRlcHRoID09IHRvLmRlcHRoO1xuICAgICAgICBpZiAoIWZyb21FbmQgJiYgIXRvRW5kICYmIGZyb20ucGF0aFtkZXB0aF0gPT0gdG8ucGF0aFtkZXB0aF0pIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkKGZyb20ucGF0aFtkZXB0aF0pO1xuICAgICAgICAgIGlmICghZGlydHkuaGFzKGNoaWxkKSkgZGlydHkuc2V0KGNoaWxkLCBESVJUWV9SRVNDQU4pO1xuICAgICAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBmcm9tRW5kID8gZnJvbS5vZmZzZXQgOiBmcm9tLnBhdGhbZGVwdGhdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IHRvRW5kID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtkZXB0aF0gKyAxO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICAgICAgbm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgY1N0YXJ0LCBjRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNTdGFydCA8IGVuZCAmJiBjRW5kID4gc3RhcnQpIGRpcnR5LnNldChjaGlsZCwgRElSVFlfUkVEUkFXKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZS5pdGVyKHN0YXJ0LCBlbmQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoY2hpbGQsIERJUlRZX1JFRFJBVyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgfSkoKTtcblxuICAgICAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLmFjY3VyYXRlU2VsZWN0aW9uKSB0aGlzLmVuc3VyZU9wZXJhdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuc2VsLnJhbmdlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBFZGl0b3JUcmFuc2Zvcm0odGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhc2VLZXltYXBcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMua2V5bWFwIHx8IHRoaXMuZGVmYXVsdEtleW1hcCB8fCAodGhpcy5kZWZhdWx0S2V5bWFwID0gKDAsIF9jb21tYW5kcy5kZWZhdWx0S2V5bWFwKSh0aGlzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGVkRG9jXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICByZXR1cm4gdGhpcy5kb2Muc2xpY2VCZXR3ZWVuKHNlbC5mcm9tLCBzZWwudG8pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBHZXQgdGhlIHRleHQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHNlbGVjdGlvbi5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RlZFRleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAoMCwgX3NlcmlhbGl6ZVRleHQudG9UZXh0KSh0aGlzLnNlbGVjdGVkRG9jKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUHJvc2VNaXJyb3I7XG59KSgpO1xuXG5leHBvcnRzLlByb3NlTWlycm9yID0gUHJvc2VNaXJyb3I7XG52YXIgRElSVFlfUkVTQ0FOID0gMSxcbiAgICBESVJUWV9SRURSQVcgPSAyO1xuXG5leHBvcnRzLkRJUlRZX1JFU0NBTiA9IERJUlRZX1JFU0NBTjtcbmV4cG9ydHMuRElSVFlfUkVEUkFXID0gRElSVFlfUkVEUkFXO1xudmFyIG51bGxPcHRpb25zID0ge307XG5cbigwLCBfdXRpbEV2ZW50LmV2ZW50TWl4aW4pKFByb3NlTWlycm9yKTtcblxudmFyIE9wZXJhdGlvbiA9IGZ1bmN0aW9uIE9wZXJhdGlvbihwbSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3BlcmF0aW9uKTtcblxuICB0aGlzLmRvYyA9IHBtLmRvYztcbiAgdGhpcy5zZWwgPSBwbS5zZWwucmFuZ2U7XG4gIHRoaXMuc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZTtcbiAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICB0aGlzLmNvbXBvc2luZ0F0U3RhcnQgPSAhIXBtLmlucHV0LmNvbXBvc2luZztcbn1cblxuLy8gOzsgI3RvYz1mYWxzZSBBIHNlbGVjdGlvbi1hd2FyZSBleHRlbnNpb24gb2YgYFRyYW5zZm9ybWAuIFVzZVxuLy8gYFByb3NlTWlycm9yLnRyYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG47XG5cbnZhciBFZGl0b3JUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKF9UcmFuc2Zvcm0pIHtcbiAgX2luaGVyaXRzKEVkaXRvclRyYW5zZm9ybSwgX1RyYW5zZm9ybSk7XG5cbiAgZnVuY3Rpb24gRWRpdG9yVHJhbnNmb3JtKHBtKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVkaXRvclRyYW5zZm9ybSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihFZGl0b3JUcmFuc2Zvcm0ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIHBtLmRvYyk7XG4gICAgdGhpcy5wbSA9IHBtO1xuICB9XG5cbiAgLy8gOjogKD9PYmplY3QpIOKGkiA/RWRpdG9yVHJhbnNmb3JtXG4gIC8vIEFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbi4gUmV0dXJucyB0aGUgdHJhbnNmb3JtLCBvciBgZmFsc2VgIGl0IGlzXG4gIC8vIHdhcyBlbXB0eS5cblxuICBfY3JlYXRlQ2xhc3MoRWRpdG9yVHJhbnNmb3JtLCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5wbS5hcHBseSh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyA6OiBTZWxlY3Rpb25cbiAgICAvLyBHZXQgdGhlIGVkaXRvcidzIGN1cnJlbnQgc2VsZWN0aW9uLCBbbWFwcGVkXSgjU2VsZWN0aW9uLm1hcClcbiAgICAvLyB0aHJvdWdoIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlU2VsZWN0aW9uXCIsXG5cbiAgICAvLyA6OiAoP05vZGUsID9ib29sKSDihpIgRWRpdG9yVHJhbnNmb3JtXG4gICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIG9yIGRlbGV0ZSBpdCBpZiBgbm9kZWBcbiAgICAvLyBpcyBudWxsLiBXaGVuIGBpbmhlcml0TWFya3NgIGlzIHRydWUgYW5kIHRoZSBub2RlIGlzIGFuIGlubGluZVxuICAgIC8vIG5vZGUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZSBwbGFjZSB3aGVyZSBpdCBpcyBpbnNlcnRlZC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZVNlbGVjdGlvbihub2RlLCBpbmhlcml0TWFya3MpIHtcbiAgICAgIHZhciBfc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICB2YXIgZW1wdHkgPSBfc2VsZWN0aW9uLmVtcHR5O1xuICAgICAgdmFyIGZyb20gPSBfc2VsZWN0aW9uLmZyb207XG4gICAgICB2YXIgdG8gPSBfc2VsZWN0aW9uLnRvO1xuICAgICAgdmFyIHNlbE5vZGUgPSBfc2VsZWN0aW9uLm5vZGU7dmFyIHBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChub2RlICYmIG5vZGUuaXNJbmxpbmUgJiYgaW5oZXJpdE1hcmtzICE9PSBmYWxzZSkge1xuICAgICAgICB2YXIgbWFya3MgPSBlbXB0eSA/IHRoaXMucG0uaW5wdXQuc3RvcmVkTWFya3MgOiB0aGlzLmRvYy5tYXJrc0F0KGZyb20pO1xuICAgICAgICBub2RlID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBub2RlLnRleHQsIG1hcmtzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbE5vZGUgJiYgc2VsTm9kZS5pc1RleHRibG9jayAmJiBub2RlICYmIG5vZGUuaXNJbmxpbmUpIHtcbiAgICAgICAgLy8gUHV0dGluZyBpbmxpbmUgc3R1ZmYgb250byBhIHNlbGVjdGVkIHRleHRibG9jayBwdXRzIGl0IGluc2lkZVxuICAgICAgICBmcm9tID0gbmV3IF9tb2RlbC5Qb3MoZnJvbS50b1BhdGgoKSwgMCk7XG4gICAgICAgIHRvID0gbmV3IF9tb2RlbC5Qb3MoZnJvbS5wYXRoLCBzZWxOb2RlLnNpemUpO1xuICAgICAgfSBlbHNlIGlmIChzZWxOb2RlKSB7XG4gICAgICAgIC8vIFRoaXMgbm9kZSBjYW4gbm90IHNpbXBseSBiZSByZW1vdmVkL3JlcGxhY2VkLiBSZW1vdmUgaXRzIHBhcmVudCBhcyB3ZWxsXG4gICAgICAgIHdoaWxlIChmcm9tLmRlcHRoICYmIGZyb20ub2Zmc2V0ID09IDAgJiYgKHBhcmVudCA9IHRoaXMuZG9jLnBhdGgoZnJvbS5wYXRoKSkgJiYgZnJvbS5vZmZzZXQgPT0gcGFyZW50LnNpemUgLSAxICYmICFwYXJlbnQudHlwZS5jYW5CZUVtcHR5ICYmICEobm9kZSAmJiBwYXJlbnQudHlwZS5jYW5Db250YWluKG5vZGUpKSkge1xuICAgICAgICAgIGZyb20gPSBmcm9tLnNob3J0ZW4oKTtcbiAgICAgICAgICB0byA9IHRvLnNob3J0ZW4obnVsbCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLmlzQmxvY2sgJiYgdGhpcy5kb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZnJvbS5kZXB0aCAtIDEpKS50eXBlLmNhbkNvbnRhaW4obm9kZSkpIHtcbiAgICAgICAgLy8gSW5zZXJ0aW5nIGEgYmxvY2sgbm9kZSBpbnRvIGEgdGV4dGJsb2NrLiBUcnkgdG8gaW5zZXJ0IGl0IGFib3ZlIGJ5IHNwbGl0dGluZyB0aGUgdGV4dGJsb2NrXG4gICAgICAgIHRoaXNbXCJkZWxldGVcIl0oZnJvbSwgdG8pO1xuICAgICAgICB2YXIgX3BhcmVudCA9IHRoaXMuZG9jLnBhdGgoZnJvbS5wYXRoKTtcbiAgICAgICAgaWYgKGZyb20ub2Zmc2V0ICYmIGZyb20ub2Zmc2V0ICE9IF9wYXJlbnQuc2l6ZSkgdGhpcy5zcGxpdChmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZyb20uc2hvcnRlbihudWxsLCBmcm9tLm9mZnNldCA/IDEgOiAwKSwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlKSByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChmcm9tLCB0bywgbm9kZSk7ZWxzZSByZXR1cm4gdGhpc1tcImRlbGV0ZVwiXShmcm9tLCB0byk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVTZWxlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZykg4oaSIEVkaXRvclRyYW5zZm9ybVxuICAgIC8vIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGEgdGV4dCBub2RlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0cmluZy5cbiAgfSwge1xuICAgIGtleTogXCJ0eXBlVGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0eXBlVGV4dCh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0aW9uKHRoaXMucG0uc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3Rpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0ZXBzLmxlbmd0aCA/IHRoaXMucG0uc2VsZWN0aW9uLm1hcCh0aGlzKSA6IHRoaXMucG0uc2VsZWN0aW9uO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFZGl0b3JUcmFuc2Zvcm07XG59KShfdHJhbnNmb3JtLlRyYW5zZm9ybSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5kZWZpbmVPcHRpb24gPSBkZWZpbmVPcHRpb247XG5leHBvcnRzLnBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucztcbmV4cG9ydHMuaW5pdE9wdGlvbnMgPSBpbml0T3B0aW9ucztcbmV4cG9ydHMuc2V0T3B0aW9uID0gc2V0T3B0aW9uO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG4vLyA7OyBBIHJlZ2lzdHJ5IGlzIGEgbmFtZXNwYWNlIGZvciBbY29tbWFuZHNdKCNDb21tYW5kcyksIGlucHV0XG4vLyBydWxlcywgYW5kIHNvIG9uLiBUaGV5IHByb3ZpZGUgYSB3YXkgdG8gZGVmaW5lIGNvbW1hbmRzIGFuZCBzdWNoIGluXG4vLyBhIHNjb3BlZCB3YXksIHdpdGhvdXQgaGF2aW5nIHRoZW0gc2hvdyB1cCBvbiBhbGwgeW91ciBlZGl0b3JzIGJ5XG4vLyBkZWZhdWx0IGFsbCBvZiBhIHN1ZGRlbi4gU2VlIGFsc28gdGhlIFtgcmVnaXN0cmllc2Bcbi8vIG9wdGlvbl0oI3JlZ2lzdHJpZXMpLlxuXG52YXIgUmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoc3RyaW5nKVxuICAvLyBDcmVhdGUgYSBuZXcgcmVnaXN0cnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblxuICBmdW5jdGlvbiBSZWdpc3RyeShuYW1lKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2lzdHJ5KTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5yZWdpc3RyeSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyA6OiBSZWdpc3RyeVxuICAvLyBUaGUgcmVnaXN0cnkgaW4gd2hpY2ggYnVpbHQtaW4gY29tbWFuZHMgYW5kIGlucHV0IHJ1bGVzIGFyZVxuICAvLyByZWdpc3RlcmVkLiBUaGUgZGVmYXVsdCBjb250ZW50IG9mIHRoZSBgcmVnaXN0cmllc2Agb3B0aW9uLlxuXG4gIC8vIDo6IChzdHJpbmcsICopXG4gIC8vIFJlZ2lzdGVyIGEgbmV3IGl0ZW0gaW4gdGhpcyByZWdpc3RyeS5cblxuICBfY3JlYXRlQ2xhc3MoUmVnaXN0cnksIFt7XG4gICAga2V5OiBcInJlZ2lzdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKG5hbWUsIHZhbHVlKSB7XG4gICAgICA7KHRoaXMucmVnaXN0cnlbbmFtZV0gfHwgKHRoaXMucmVnaXN0cnlbbmFtZV0gPSBbXSkpLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWdpc3RyeTtcbn0pKCk7XG5cbmV4cG9ydHMuUmVnaXN0cnkgPSBSZWdpc3RyeTtcbnZhciBkZWZhdWx0UmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoXCJkZWZhdWx0XCIpO1xuXG5leHBvcnRzLmRlZmF1bHRSZWdpc3RyeSA9IGRlZmF1bHRSZWdpc3RyeTtcblxudmFyIE9wdGlvbiA9IGZ1bmN0aW9uIE9wdGlvbihkZWZhdWx0VmFsdWUsIHVwZGF0ZSwgdXBkYXRlT25Jbml0KSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPcHRpb24pO1xuXG4gIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgdGhpcy51cGRhdGVPbkluaXQgPSB1cGRhdGVPbkluaXQgIT09IGZhbHNlO1xufTtcblxudmFyIG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA6OiAoc3RyaW5nLCBhbnksIChwbTogUHJvc2VNaXJyb3IsIG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlOiBhbnksIGluaXQ6IGJvb2wpLCBib29sKVxuLy8gRGVmaW5lIGEgbmV3IG9wdGlvbi4gVGhlIGB1cGRhdGVgIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbi8vIG9wdGlvbidzIG9sZCBhbmQgbmV3IHZhbHVlIGV2ZXJ5IHRpbWUgdGhlIG9wdGlvbiBpc1xuLy8gW2NoYW5nZWRdKCNQcm9zZU1pcnJvci5zZXRPcHRpb24pLiBXaGVuIGB1cGRhdGVPbkluaXRgIGlzIHRydWUsIGl0XG4vLyBpcyBhbHNvIGNhbGxlZCBvbiBlZGl0b3IgaW5pdCwgd2l0aCBudWxsIGFzIHRoZSBvbGQgdmFsdWUsIGFuZCBhIGZvdXJ0aFxuLy8gYXJndW1lbnQgb2YgdHJ1ZS5cblxuZnVuY3Rpb24gZGVmaW5lT3B0aW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSwgdXBkYXRlLCB1cGRhdGVPbkluaXQpIHtcbiAgb3B0aW9uc1tuYW1lXSA9IG5ldyBPcHRpb24oZGVmYXVsdFZhbHVlLCB1cGRhdGUsIHVwZGF0ZU9uSW5pdCk7XG59XG5cbi8vIDo6IFNjaGVtYSAjcGF0aD1zY2hlbWEgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgW3NjaGVtYV0oI1NjaGVtYSkgdGhhdCB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQgc2hvdWxkIHVzZS5cbmRlZmluZU9wdGlvbihcInNjaGVtYVwiLCBfbW9kZWwuZGVmYXVsdFNjaGVtYSwgZmFsc2UpO1xuXG4vLyA6OiBhbnkgI3BhdGg9ZG9jICNraW5kPW9wdGlvblxuLy8gVGhlIHN0YXJ0aW5nIGRvY3VtZW50LiBVc3VhbGx5IGEgYE5vZGVgLCBidXQgY2FuIGJlIGluIGFub3RoZXJcbi8vIGZvcm1hdCB3aGVuIHRoZSBgZG9jRm9ybWF0YCBvcHRpb24gaXMgYWxzbyBzcGVjaWZpZWQuXG5kZWZpbmVPcHRpb24oXCJkb2NcIiwgbnVsbCwgZnVuY3Rpb24gKHBtLCB2YWx1ZSkge1xuICByZXR1cm4gcG0uc2V0RG9jKHZhbHVlKTtcbn0sIGZhbHNlKTtcblxuLy8gOjogP3N0cmluZyAjcGF0aD1kb2NGb3JtYXQgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBgZG9jYCBvcHRpb24gaXMgZ2l2ZW4uIERlZmF1bHRzIHRvIGBudWxsYFxuLy8gKGEgcmF3IGBOb2RlYCkuXG5kZWZpbmVPcHRpb24oXCJkb2NGb3JtYXRcIiwgbnVsbCk7XG5cbi8vIDo6ID91bmlvbjxET01Ob2RlLCAoRE9NTm9kZSk+ICNwYXRoPXBsYWNlICNraW5kPW9wdGlvblxuLy8gRGV0ZXJtaW5lcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBlZGl0b3IgaW4gdGhlIHBhZ2UuIFdoZW4gYG51bGxgLFxuLy8gdGhlIGVkaXRvciBpcyBub3QgcGxhY2VkLiBXaGVuIGEgRE9NIG5vZGUgaXMgZ2l2ZW4sIHRoZSBlZGl0b3IgaXNcbi8vIGFwcGVuZGVkIHRvIHRoYXQgbm9kZS4gV2hlbiBhIGZ1bmN0aW9uIGlzIGdpdmVuLCBpdCBpcyBjYWxsZWRcbi8vIHdpdGggdGhlIGVkaXRvcidzIHdyYXBwaW5nIERPTSBub2RlLCBhbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UgaXRcbi8vIGludG8gdGhlIGRvY3VtZW50LlxuZGVmaW5lT3B0aW9uKFwicGxhY2VcIiwgbnVsbCk7XG5cbi8vIDo6IEtleW1hcCAjcGF0aD1rZXltYXAgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgYmFzZSBba2V5bWFwXSgjS2V5bWFwKS4gV2hlbiBub3QgZ2l2ZW4sIGEgZGVmYXVsdCBrZXltYXAgaXNcbi8vIHN5bnRoZXNpemVkIGZyb20gdGhlIGRlZmF1bHQga2V5IGJpbmRpbmdzIHByb3ZpZGVkIGJ5IHRoZVxuLy8gW2NvbW1hbmRzXSgjQ29tbWFuZCkgdGhhdCBhcmUgaW4gc2NvcGUgZm9yIHRoZSBlZGl0b3IuXG5kZWZpbmVPcHRpb24oXCJrZXltYXBcIiwgbnVsbCk7XG5cbi8vIDo6IFtSZWdpc3RyeV1cbi8vIFRoZSBzZXQgb2YgW3JlZ2lzdHJpZXNdKCNSZWdpc3RyeSkgdGhlIGVkaXRvciBzaG91bGQgbG9hZCBpdGVtc1xuLy8gZnJvbS5cbmRlZmluZU9wdGlvbihcInJlZ2lzdHJpZXNcIiwgW2RlZmF1bHRSZWdpc3RyeV0sIGZhbHNlKTtcblxuLy8gOjogbnVtYmVyICNwYXRoPWhpc3RvcnlEZXB0aCAja2luZD1vcHRpb25cbi8vIFRoZSBhbW91bnQgb2YgaGlzdG9yeSBldmVudHMgdGhhdCBhcmUgY29sbGVjdGVkIGJlZm9yZSB0aGUgb2xkZXN0XG4vLyBldmVudHMgYXJlIGRpc2NhcmRlZC4gRGVmYXVsdHMgdG8gMTAwLlxuZGVmaW5lT3B0aW9uKFwiaGlzdG9yeURlcHRoXCIsIDEwMCk7XG5cbi8vIDo6IG51bWJlciAjcGF0aD1oaXN0b3J5RXZlbnREZWxheSAja2luZD1vcHRpb25cbi8vIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRoYXQgbXVzdCBwYXNzIGJldHdlZW4gY2hhbmdlcyB0b1xuLy8gc3RhcnQgYSBuZXcgaGlzdG9yeSBldmVudC4gRGVmYXVsdHMgdG8gNTAwLlxuZGVmaW5lT3B0aW9uKFwiaGlzdG9yeUV2ZW50RGVsYXlcIiwgNTAwKTtcblxuLy8gOjogc3RyaW5nICNwYXRoPWNvbW1hbmRQYXJhbUhhbmRsZXIgI2tpbmQ9b3B0aW9uXG4vLyBUaGUgbmFtZSBvZiB0aGUgaGFuZGxlciB1c2VkIHRvIHByb21wdCB0aGUgdXNlciBmb3IgW2NvbW1hbmRcbi8vIHBhcmFtZXRlcnNdKCNDb21tYW5kUGFyYW0pLiBPbmx5IHJlbGV2YW50IHdoZW4gbXVsdGlwbGUgc3VjaFxuLy8gaGFuZGxlcnMgYXJlIGxvYWRlZCwgYW5kIHlvdSB3YW50IHRvIGNob29zZSBiZXR3ZWVuIHRoZW0uXG5kZWZpbmVPcHRpb24oXCJjb21tYW5kUGFyYW1IYW5kbGVyXCIsIFwiZGVmYXVsdFwiKTtcblxuLy8gOjogP3N0cmluZyAjcGF0aD1sYWJlbCAja2luZD1vcHRpb25cbi8vIFRoZSBsYWJlbCBvZiB0aGUgZWRpdG9yLiBXaGVuIHNldCwgdGhlIGVkaXRhYmxlIERPTSBub2RlIGdldHMgYW5cbi8vIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgd2l0aCB0aGlzIHZhbHVlLlxuZGVmaW5lT3B0aW9uKFwibGFiZWxcIiwgbnVsbCk7XG5cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhvYmopIHtcbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBnaXZlbiA9IG9iaiA/IFtvYmpdLmNvbmNhdChvYmoudXNlIHx8IFtdKSA6IFtdO1xuICBvdXRlcjogZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdpdmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3B0IGluIGdpdmVuW2ldKSB7XG4gICAgICAgIHJlc3VsdFtvcHRdID0gZ2l2ZW5baV1bb3B0XTtcbiAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdFtvcHRdID0gb3B0aW9uc1tvcHRdLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbml0T3B0aW9ucyhwbSkge1xuICBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykge1xuICAgIHZhciBkZXNjID0gb3B0aW9uc1tvcHRdO1xuICAgIGlmIChkZXNjLnVwZGF0ZSAmJiBkZXNjLnVwZGF0ZU9uSW5pdCkgZGVzYy51cGRhdGUocG0sIHBtLm9wdGlvbnNbb3B0XSwgbnVsbCwgdHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0T3B0aW9uKHBtLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgZGVzYyA9IG9wdGlvbnNbbmFtZV07XG4gIGlmIChkZXNjLnVwZGF0ZSA9PT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcIk9wdGlvbiAnXCIgKyBuYW1lICsgXCInIGNhbiBub3QgYmUgY2hhbmdlZFwiKTtcbiAgdmFyIG9sZCA9IHBtLm9wdGlvbnNbbmFtZV07XG4gIHBtLm9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgaWYgKGRlc2MudXBkYXRlKSBkZXNjLnVwZGF0ZShwbSwgdmFsdWUsIG9sZCwgZmFsc2UpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfdXRpbEV2ZW50ID0gcmVxdWlyZShcIi4uL3V0aWwvZXZlbnRcIik7XG5cbi8vIDs7IEEgW21hcmtlZCByYW5nZV0oI1Byb3NlTWlycm9yLm1hcmtSYW5nZSkuIEluY2x1ZGVzIHRoZSBtZXRob2RzXG4vLyBmcm9tIHRoZSBbZXZlbnQgbWl4aW5dKCNFdmVudE1peGluKS5cblxudmFyIE1hcmtlZFJhbmdlID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFya2VkUmFuZ2UoZnJvbSwgdG8sIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFya2VkUmFuZ2UpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGN1cnJlbnQgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJhbmdlLiBVcGRhdGVkIHdoZW5ldmVyIHRoZVxuICAgIC8vIGVkaXRvcidzIGRvY3VtZW50IGlzIGNoYW5nZWQuIFNldCB0byBgbnVsbGAgd2hlbiB0aGUgbWFya2VkXG4gICAgLy8gcmFuZ2UgaXMgW3JlbW92ZWRdKCNQcm9zZU1pcnJvci5yZW1vdmVSYW5nZSkuXG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGN1cnJlbnQgZW5kIHBvc2l0aW9uIG9mIHRoZSByYW5nZS4gVXBkYXRlZCB3aGVuZXZlciB0aGVcbiAgICAvLyBlZGl0b3IncyBkb2N1bWVudCBpcyBjaGFuZ2VkLiBTZXQgdG8gYG51bGxgIHdoZW4gdGhlIG1hcmtlZFxuICAgIC8vIHJhbmdlIGlzIFtyZW1vdmVkXSgjUHJvc2VNaXJyb3IucmVtb3ZlUmFuZ2UpLlxuICAgIHRoaXMudG8gPSB0bztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrZWRSYW5nZSwgW3tcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIC8vIDo6IChmcm9tOiBQb3MsIHRvOiBQb3MpICNwYXRoPU1hcmtlZFJhbmdlI2V2ZW50cyNyZW1vdmVkXG4gICAgICAvLyBTaWduYWxsZWQgd2hlbiB0aGUgbWFya2VkIHJhbmdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgZWRpdG9yLlxuICAgICAgdGhpcy5zaWduYWwoXCJyZW1vdmVkXCIsIHRoaXMuZnJvbSwgdGhpcy50by5tYXgodGhpcy5mcm9tKSk7XG4gICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFya2VkUmFuZ2U7XG59KSgpO1xuXG5leHBvcnRzLk1hcmtlZFJhbmdlID0gTWFya2VkUmFuZ2U7XG5cbigwLCBfdXRpbEV2ZW50LmV2ZW50TWl4aW4pKE1hcmtlZFJhbmdlKTtcblxudmFyIFJhbmdlU29ydGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmFuZ2VTb3J0ZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlU29ydGVyKTtcblxuICAgIHRoaXMuc29ydGVkID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmFuZ2VTb3J0ZXIsIFt7XG4gICAga2V5OiBcImZpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZChhdCkge1xuICAgICAgdmFyIG1pbiA9IDAsXG4gICAgICAgICAgbWF4ID0gdGhpcy5zb3J0ZWQubGVuZ3RoO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobWF4IDwgbWluICsgMTApIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gbWluOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnRlZFtpXS5hdC5jbXAoYXQpID49IDApIHJldHVybiBpO1xuICAgICAgICAgIH1yZXR1cm4gbWF4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaWQgPSBtaW4gKyBtYXggPj4gMTtcbiAgICAgICAgaWYgKHRoaXMuc29ydGVkW21pZF0uYXQuY21wKGF0KSA+IDApIG1heCA9IG1pZDtlbHNlIG1pbiA9IG1pZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydChvYmopIHtcbiAgICAgIHRoaXMuc29ydGVkLnNwbGljZSh0aGlzLmZpbmQob2JqLmF0KSwgMCwgb2JqKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZShhdCwgcmFuZ2UpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmZpbmQoYXQpO1xuICAgICAgZm9yICh2YXIgZGlzdCA9IDA7OyBkaXN0KyspIHtcbiAgICAgICAgdmFyIGxlZnRQb3MgPSBwb3MgLSBkaXN0IC0gMSxcbiAgICAgICAgICAgIHJpZ2h0UG9zID0gcG9zICsgZGlzdDtcbiAgICAgICAgaWYgKGxlZnRQb3MgPj0gMCAmJiB0aGlzLnNvcnRlZFtsZWZ0UG9zXS5yYW5nZSA9PSByYW5nZSkge1xuICAgICAgICAgIHRoaXMuc29ydGVkLnNwbGljZShsZWZ0UG9zLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRQb3MgPCB0aGlzLnNvcnRlZC5sZW5ndGggJiYgdGhpcy5zb3J0ZWRbcmlnaHRQb3NdLnJhbmdlID09IHJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5zb3J0ZWQuc3BsaWNlKHJpZ2h0UG9zLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb3J0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29ydCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGN1ciA9IHRoaXMuc29ydGVkW2ldO1xuICAgICAgICB2YXIgYXQgPSBjdXIuYXQgPSBjdXIudHlwZSA9PSBcIm9wZW5cIiA/IGN1ci5yYW5nZS5mcm9tIDogY3VyLnJhbmdlLnRvO1xuICAgICAgICB2YXIgcG9zID0gaTtcbiAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgdGhpcy5zb3J0ZWRbcG9zIC0gMV0uYXQuY21wKGF0KSA+IDApIHtcbiAgICAgICAgICB0aGlzLnNvcnRlZFtwb3NdID0gdGhpcy5zb3J0ZWRbcG9zIC0gMV07XG4gICAgICAgICAgdGhpcy5zb3J0ZWRbLS1wb3NdID0gY3VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlU29ydGVyO1xufSkoKTtcblxudmFyIFJhbmdlU3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSYW5nZVN0b3JlKHBtKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhbmdlU3RvcmUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucmFuZ2VzID0gW107XG4gICAgdGhpcy5zb3J0ZWQgPSBuZXcgUmFuZ2VTb3J0ZXIoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSYW5nZVN0b3JlLCBbe1xuICAgIGtleTogXCJhZGRSYW5nZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSYW5nZShyYW5nZSkge1xuICAgICAgdGhpcy5yYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICB0aGlzLnNvcnRlZC5pbnNlcnQoeyB0eXBlOiBcIm9wZW5cIiwgYXQ6IHJhbmdlLmZyb20sIHJhbmdlOiByYW5nZSB9KTtcbiAgICAgIHRoaXMuc29ydGVkLmluc2VydCh7IHR5cGU6IFwiY2xvc2VcIiwgYXQ6IHJhbmdlLnRvLCByYW5nZTogcmFuZ2UgfSk7XG4gICAgICB0aGlzLnBtLm1hcmtSYW5nZURpcnR5KHJhbmdlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlUmFuZ2UocmFuZ2UpIHtcbiAgICAgIHZhciBmb3VuZCA9IHRoaXMucmFuZ2VzLmluZGV4T2YocmFuZ2UpO1xuICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMuc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgdGhpcy5zb3J0ZWQucmVtb3ZlKHJhbmdlLmZyb20sIHJhbmdlKTtcbiAgICAgICAgdGhpcy5zb3J0ZWQucmVtb3ZlKHJhbmdlLnRvLCByYW5nZSk7XG4gICAgICAgIHRoaXMucG0ubWFya1JhbmdlRGlydHkocmFuZ2UpO1xuICAgICAgICByYW5nZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybShtYXBwaW5nKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2VzW2ldO1xuICAgICAgICByYW5nZS5mcm9tID0gbWFwcGluZy5tYXAocmFuZ2UuZnJvbSwgcmFuZ2Uub3B0aW9ucy5pbmNsdXNpdmVMZWZ0ID8gLTEgOiAxKS5wb3M7XG4gICAgICAgIHJhbmdlLnRvID0gbWFwcGluZy5tYXAocmFuZ2UudG8sIHJhbmdlLm9wdGlvbnMuaW5jbHVzaXZlUmlnaHQgPyAxIDogLTEpLnBvcztcbiAgICAgICAgdmFyIGRpZmYgPSByYW5nZS5mcm9tLmNtcChyYW5nZS50byk7XG4gICAgICAgIGlmIChyYW5nZS5vcHRpb25zLnJlbW92ZVdoZW5FbXB0eSAhPT0gZmFsc2UgJiYgZGlmZiA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVSYW5nZShyYW5nZSk7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAgICAgcmFuZ2UudG8gPSByYW5nZS5mcm9tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNvcnRlZC5yZXNvcnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlUmFuZ2VUcmFja2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGl2ZVJhbmdlVHJhY2tlcigpIHtcbiAgICAgIHJldHVybiBuZXcgUmFuZ2VUcmFja2VyKHRoaXMuc29ydGVkLnNvcnRlZCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlU3RvcmU7XG59KSgpO1xuXG5leHBvcnRzLlJhbmdlU3RvcmUgPSBSYW5nZVN0b3JlO1xuXG52YXIgUmFuZ2VUcmFja2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmFuZ2VUcmFja2VyKHNvcnRlZCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYW5nZVRyYWNrZXIpO1xuXG4gICAgdGhpcy5zb3J0ZWQgPSBzb3J0ZWQ7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMuY3VycmVudCA9IFtdO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJhbmdlVHJhY2tlciwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2VUbyhwb3MpIHtcbiAgICAgIHZhciBuZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5zb3J0ZWQubGVuZ3RoICYmIChuZXh0ID0gdGhpcy5zb3J0ZWRbdGhpcy5wb3NdKS5hdC5jbXAocG9zKSA8PSAwKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBuZXh0LnJhbmdlLm9wdGlvbnMuY2xhc3NOYW1lO1xuICAgICAgICBpZiAoIWNsYXNzTmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChuZXh0LnR5cGUgPT0gXCJvcGVuXCIpIHRoaXMuY3VycmVudC5wdXNoKGNsYXNzTmFtZSk7ZWxzZSB0aGlzLmN1cnJlbnQuc3BsaWNlKHRoaXMuY3VycmVudC5pbmRleE9mKGNsYXNzTmFtZSksIDEpO1xuICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0Q2hhbmdlQmVmb3JlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHRDaGFuZ2VCZWZvcmUocG9zKSB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA9PSB0aGlzLnNvcnRlZC5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc29ydGVkW3RoaXMucG9zXTtcbiAgICAgICAgaWYgKCFuZXh0LnJhbmdlLm9wdGlvbnMuY2xhc3NOYW1lKSB0aGlzLnBvcysrO2Vsc2UgaWYgKG5leHQuYXQuY21wKHBvcykgPj0gMCkgcmV0dXJuIG51bGw7ZWxzZSByZXR1cm4gbmV4dC5hdC5vZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJhbmdlVHJhY2tlcjtcbn0pKCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMucG9zRnJvbURPTSA9IHBvc0Zyb21ET007XG5leHBvcnRzLnJhbmdlRnJvbURPTUxvb3NlID0gcmFuZ2VGcm9tRE9NTG9vc2U7XG5leHBvcnRzLmZpbmRCeVBhdGggPSBmaW5kQnlQYXRoO1xuZXhwb3J0cy5yZXNvbHZlUGF0aCA9IHJlc29sdmVQYXRoO1xuZXhwb3J0cy5oYXNGb2N1cyA9IGhhc0ZvY3VzO1xuZXhwb3J0cy5wb3NBdENvb3JkcyA9IHBvc0F0Q29vcmRzO1xuZXhwb3J0cy5jb29yZHNBdFBvcyA9IGNvb3Jkc0F0UG9zO1xuZXhwb3J0cy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uRnJvbSA9IGZpbmRTZWxlY3Rpb25Gcm9tO1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uTmVhciA9IGZpbmRTZWxlY3Rpb25OZWFyO1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uQXRTdGFydCA9IGZpbmRTZWxlY3Rpb25BdFN0YXJ0O1xuZXhwb3J0cy5maW5kU2VsZWN0aW9uQXRFbmQgPSBmaW5kU2VsZWN0aW9uQXRFbmQ7XG5leHBvcnRzLnNlbGVjdGFibGVOb2RlQWJvdmUgPSBzZWxlY3RhYmxlTm9kZUFib3ZlO1xuZXhwb3J0cy5oYW5kbGVOb2RlQ2xpY2sgPSBoYW5kbGVOb2RlQ2xpY2s7XG5leHBvcnRzLnZlcnRpY2FsTW90aW9uTGVhdmVzVGV4dGJsb2NrID0gdmVydGljYWxNb3Rpb25MZWF2ZXNUZXh0YmxvY2s7XG5leHBvcnRzLnNldERPTVNlbGVjdGlvblRvUG9zID0gc2V0RE9NU2VsZWN0aW9uVG9Qb3M7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBTZWxlY3Rpb25TdGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNlbGVjdGlvblN0YXRlKHBtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTZWxlY3Rpb25TdGF0ZSk7XG5cbiAgICB0aGlzLnBtID0gcG07XG5cbiAgICB0aGlzLnJhbmdlID0gZmluZFNlbGVjdGlvbkF0U3RhcnQocG0uZG9jKTtcbiAgICB0aGlzLmxhc3ROb25Ob2RlUG9zID0gbnVsbDtcblxuICAgIHRoaXMucG9sbFN0YXRlID0gbnVsbDtcbiAgICB0aGlzLnBvbGxUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RBbmNob3JOb2RlID0gdGhpcy5sYXN0SGVhZE5vZGUgPSB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSB0aGlzLmxhc3RIZWFkT2Zmc2V0ID0gbnVsbDtcbiAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcblxuICAgIHBtLmNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5yZWNlaXZlZEZvY3VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2VsZWN0aW9uU3RhdGUsIFt7XG4gICAga2V5OiBcInNldEFuZFNpZ25hbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBbmRTaWduYWwocmFuZ2UsIGNsZWFyTGFzdCkge1xuICAgICAgdGhpcy5zZXQocmFuZ2UsIGNsZWFyTGFzdCk7XG4gICAgICAvLyA6OiAoKSAjcGF0aD1Qcm9zZU1pcnJvciNldmVudHMjc2VsZWN0aW9uQ2hhbmdlXG4gICAgICAvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgZWRpdG9yJ3Mgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAgdGhpcy5wbS5zaWduYWwoXCJzZWxlY3Rpb25DaGFuZ2VcIik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocmFuZ2UsIGNsZWFyTGFzdCkge1xuICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgaWYgKCFyYW5nZS5ub2RlKSB0aGlzLmxhc3ROb25Ob2RlUG9zID0gbnVsbDtcbiAgICAgIGlmIChjbGVhckxhc3QgIT09IGZhbHNlKSB0aGlzLmxhc3RBbmNob3JOb2RlID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9sbEZvclVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb2xsRm9yVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnBtLmlucHV0LmNvbXBvc2luZykgcmV0dXJuO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9sbFRpbWVvdXQpO1xuICAgICAgdGhpcy5wb2xsU3RhdGUgPSBcInVwZGF0ZVwiO1xuICAgICAgdmFyIG4gPSAwLFxuICAgICAgICAgIGNoZWNrID0gZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgIGlmIChfdGhpczIucG0uaW5wdXQuY29tcG9zaW5nKSB7XG4gICAgICAgICAgLy8gQWJvcnRcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpczIucG0ub3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBfdGhpczIucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCAyMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICghX3RoaXMyLnJlYWRVcGRhdGUoKSAmJiArK24gPT0gMSkge1xuICAgICAgICAgICAgX3RoaXMyLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgNTApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuc3RvcFBvbGxpbmdGb3JVcGRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5wb2xsVGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIDIwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFBvbGxpbmdGb3JVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcFBvbGxpbmdGb3JVcGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5wb2xsU3RhdGUgPT0gXCJ1cGRhdGVcIikge1xuICAgICAgICB0aGlzLnBvbGxTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9sbFRvU3luYygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb21DaGFuZ2VkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRvbUNoYW5nZWQoKSB7XG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm4gc2VsLmFuY2hvck5vZGUgIT0gdGhpcy5sYXN0QW5jaG9yTm9kZSB8fCBzZWwuYW5jaG9yT2Zmc2V0ICE9IHRoaXMubGFzdEFuY2hvck9mZnNldCB8fCBzZWwuZm9jdXNOb2RlICE9IHRoaXMubGFzdEhlYWROb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RIZWFkT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9yZURPTVN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3JlRE9NU3RhdGUoKSB7XG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmxhc3RBbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7dGhpcy5sYXN0QW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgICAgIHRoaXMubGFzdEhlYWROb2RlID0gc2VsLmZvY3VzTm9kZTt0aGlzLmxhc3RIZWFkT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWFkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWRVcGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5wbS5pbnB1dC5jb21wb3NpbmcgfHwgIWhhc0ZvY3VzKHRoaXMucG0pIHx8ICF0aGlzLmRvbUNoYW5nZWQoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCksXG4gICAgICAgICAgZG9jID0gdGhpcy5wbS5kb2M7XG4gICAgICB2YXIgYW5jaG9yID0gcG9zRnJvbURPTUlubmVyKHRoaXMucG0sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgIHZhciBoZWFkID0gcG9zRnJvbURPTUlubmVyKHRoaXMucG0sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgICB2YXIgbmV3U2VsID0gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBoZWFkLCB0aGlzLnJhbmdlLmhlYWQgJiYgdGhpcy5yYW5nZS5oZWFkLmNtcChoZWFkKSA8IDAgPyAtMSA6IDEpO1xuICAgICAgaWYgKG5ld1NlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgZG9jLnBhdGgoYW5jaG9yLnBhdGgpLmlzVGV4dGJsb2NrKSBuZXdTZWwgPSBuZXcgVGV4dFNlbGVjdGlvbihhbmNob3IsIG5ld1NlbC5oZWFkKTtcbiAgICAgIHRoaXMuc2V0QW5kU2lnbmFsKG5ld1NlbCk7XG4gICAgICBpZiAobmV3U2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiB8fCBuZXdTZWwuaGVhZC5jbXAoaGVhZCkgfHwgbmV3U2VsLmFuY2hvci5jbXAoYW5jaG9yKSkge1xuICAgICAgICB0aGlzLnRvRE9NKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFyTm9kZSgpO1xuICAgICAgICB0aGlzLnN0b3JlRE9NU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb2xsVG9TeW5jXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvbGxUb1N5bmMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMucG9sbFN0YXRlKSByZXR1cm47XG4gICAgICB0aGlzLnBvbGxTdGF0ZSA9IFwic3luY1wiO1xuICAgICAgdmFyIHN5bmMgPSBmdW5jdGlvbiBzeW5jKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBfdGhpczMucG0uY29udGVudCkge1xuICAgICAgICAgIF90aGlzMy5wb2xsU3RhdGUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghX3RoaXMzLnBtLm9wZXJhdGlvbiAmJiAhX3RoaXMzLnBtLmlucHV0LmNvbXBvc2luZykgX3RoaXMzLnN5bmNET00oKTtcbiAgICAgICAgICBfdGhpczMucG9sbFRpbWVvdXQgPSBzZXRUaW1lb3V0KHN5bmMsIDIwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnBvbGxUaW1lb3V0ID0gc2V0VGltZW91dChzeW5jLCAyMDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzeW5jRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN5bmNET00oKSB7XG4gICAgICBpZiAoIXRoaXMucG0uaW5wdXQuY29tcG9zaW5nICYmIGhhc0ZvY3VzKHRoaXMucG0pICYmIHRoaXMuZG9tQ2hhbmdlZCgpKSB0aGlzLnRvRE9NKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvRE9NXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvRE9NKHRha2VGb2N1cykge1xuICAgICAgaWYgKHRoaXMucmFuZ2UgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB0aGlzLm5vZGVUb0RPTSh0YWtlRm9jdXMpO2Vsc2UgdGhpcy5yYW5nZVRvRE9NKHRha2VGb2N1cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVUb0RPTVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlVG9ET00odGFrZUZvY3VzKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICBpZiAodGFrZUZvY3VzKSB0aGlzLnBtLmNvbnRlbnQuZm9jdXMoKTtcbiAgICAgIHZhciBwb3MgPSB0aGlzLnJhbmdlLmZyb20sXG4gICAgICAgICAgbm9kZSA9IHRoaXMucmFuZ2Uubm9kZTtcbiAgICAgIHZhciBkb20gPSByZXNvbHZlUGF0aCh0aGlzLnBtLmNvbnRlbnQsIHBvcy50b1BhdGgoKSk7XG4gICAgICBpZiAoZG9tID09IHRoaXMubGFzdE5vZGUpIHJldHVybjtcbiAgICAgIHRoaXMuY2xlYXJOb2RlKCk7XG4gICAgICBhZGROb2RlU2VsZWN0aW9uKG5vZGUsIGRvbSk7XG4gICAgICB0aGlzLmxhc3ROb2RlID0gZG9tO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhck5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXJOb2RlKCkge1xuICAgICAgaWYgKHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgY2xlYXJOb2RlU2VsZWN0aW9uKHRoaXMubGFzdE5vZGUpO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhbmdlVG9ET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFuZ2VUb0RPTSh0YWtlRm9jdXMpIHtcbiAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuY2xlYXJOb2RlKCkgJiYgIWhhc0ZvY3VzKHRoaXMucG0pKSB7XG4gICAgICAgIGlmICghdGFrZUZvY3VzKSByZXR1cm47XG4gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05MjE0NDRcbiAgICAgICAgZWxzZSBpZiAoX2RvbS5icm93c2VyLmdlY2tvKSB0aGlzLnBtLmNvbnRlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kb21DaGFuZ2VkKCkpIHJldHVybjtcblxuICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgIHZhciBjb250ZW50ID0gdGhpcy5wbS5jb250ZW50O1xuICAgICAgdmFyIGFuY2hvciA9IERPTUZyb21Qb3MoY29udGVudCwgdGhpcy5yYW5nZS5hbmNob3IpO1xuICAgICAgdmFyIGhlYWQgPSBET01Gcm9tUG9zKGNvbnRlbnQsIHRoaXMucmFuZ2UuaGVhZCk7XG5cbiAgICAgIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlLmFuY2hvci5jbXAodGhpcy5yYW5nZS5oZWFkKSA+IDApIHtcbiAgICAgICAgICB2YXIgdG1wID0gYW5jaG9yO2FuY2hvciA9IGhlYWQ7aGVhZCA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICByYW5nZS5zZXRFbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgIH1cbiAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBpZiAoc2VsLmV4dGVuZCkgc2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgIHRoaXMuc3RvcmVET01TdGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWNlaXZlZEZvY3VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlY2VpdmVkRm9jdXMoKSB7XG4gICAgICBpZiAoIXRoaXMucG9sbFN0YXRlKSB0aGlzLnBvbGxUb1N5bmMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYmVmb3JlU3RhcnRPcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBiZWZvcmVTdGFydE9wKCkge1xuICAgICAgaWYgKHRoaXMucG9sbFN0YXRlID09IFwidXBkYXRlXCIgJiYgdGhpcy5yZWFkVXBkYXRlKCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9sbFRpbWVvdXQpO1xuICAgICAgICB0aGlzLnN0b3BQb2xsaW5nRm9yVXBkYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2VsZWN0aW9uU3RhdGU7XG59KSgpO1xuXG5leHBvcnRzLlNlbGVjdGlvblN0YXRlID0gU2VsZWN0aW9uU3RhdGU7XG5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbihkb20pIHtcbiAgZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGVTZWxlY3Rpb24oX25vZGUsIGRvbSkge1xuICBkb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbn1cblxuZnVuY3Rpb24gd2luZG93UmVjdCgpIHtcbiAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgIHRvcDogMCwgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQgfTtcbn1cblxuLy8gOzsgQW4gZWRpdG9yIHNlbGVjdGlvbi4gQ2FuIGJlIG9uZSBvZiB0d28gc2VsZWN0aW9uIHR5cGVzOlxuLy8gYFRleHRTZWxlY3Rpb25gIGFuZCBgTm9kZVNlbGVjdGlvbmAuIEJvdGggaGF2ZSB0aGUgcHJvcGVydGllc1xuLy8gbGlzdGVkIGhlcmUsIGJ1dCBhbHNvIGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbiAoc3VjaCBhcyB0aGVcbi8vIHNlbGVjdGVkIFtub2RlXSgjTm9kZVNlbGVjdGlvbi5ub2RlKSBvciB0aGVcbi8vIFtoZWFkXSgjVGV4dFNlbGVjdGlvbi5oZWFkKSBhbmQgW2FuY2hvcl0oI1RleHRTZWxlY3Rpb24uYW5jaG9yKSkuXG5cbnZhciBTZWxlY3Rpb24gPSBmdW5jdGlvbiBTZWxlY3Rpb24oKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTZWxlY3Rpb24pO1xufTtcblxuZXhwb3J0cy5TZWxlY3Rpb24gPSBTZWxlY3Rpb247XG5cbi8vIDo6IFBvcyAjcGF0aD1TZWxlY3Rpb24ucHJvdG90eXBlLmZyb21cbi8vIFRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLlxuXG4vLyA6OiBQb3MgI3BhdGg9U2VsZWN0aW9uLnByb3RvdHlwZS50b1xuLy8gVGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uLlxuXG4vLyA6OiBib29sICNwYXRoPVNlbGVjdGlvbi5lbXB0eVxuLy8gVHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIGlzIGFuIGVtcHR5IHRleHQgc2VsZWN0aW9uIChoZWFkIGFuIGFuY2hvclxuLy8gYXJlIHRoZSBzYW1lKS5cblxuLy8gOjogKG90aGVyOiBTZWxlY3Rpb24pIOKGkiBib29sICNwYXRoPVNlbGVjdGlvbi5lcVxuLy8gVGVzdCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHNhbWUgYXMgYW5vdGhlciBzZWxlY3Rpb24uXG5cbi8vIDo6IChkb2M6IE5vZGUsIG1hcHBpbmc6IE1hcHBhYmxlKSDihpIgU2VsZWN0aW9uICNwYXRoPVNlbGVjdGlvbi5tYXBcbi8vIE1hcCB0aGlzIHNlbGVjdGlvbiB0aHJvdWdoIGEgW21hcHBhYmxlXSgjTWFwcGFibGUpIHRoaW5nLiBgZG9jYFxuLy8gc2hvdWxkIGJlIHRoZSBuZXcgZG9jdW1lbnQsIHRvIHdoaWNoIHdlIGFyZSBtYXBwaW5nLlxuXG4vLyA7OyAjdG9jPWZhbHNlIEEgdGV4dCBzZWxlY3Rpb24gcmVwcmVzZW50cyBhIGNsYXNzaWNhbCBlZGl0b3Jcbi8vIHNlbGVjdGlvbiwgd2l0aCBhIGhlYWQgKHRoZSBtb3Zpbmcgc2lkZSkgYW5kIGFuY2hvciAoaW1tb2JpbGVcbi8vIHNpZGUpLCBib3RoIG9mIHdoaWNoIHBvaW50IGludG8gdGV4dGJsb2NrIG5vZGVzLiBJdCBjYW4gYmUgZW1wdHkgKGFcbi8vIHJlZ3VsYXIgY3Vyc29yIHBvc2l0aW9uKS5cblxudmFyIFRleHRTZWxlY3Rpb24gPSAoZnVuY3Rpb24gKF9TZWxlY3Rpb24pIHtcbiAgX2luaGVyaXRzKFRleHRTZWxlY3Rpb24sIF9TZWxlY3Rpb24pO1xuXG4gIC8vIDo6IChQb3MsID9Qb3MpXG4gIC8vIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uLiBXaGVuIGBoZWFkYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzXG4gIC8vIHRvIGBhbmNob3JgLlxuXG4gIGZ1bmN0aW9uIFRleHRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRTZWxlY3Rpb24pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGV4dFNlbGVjdGlvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgLy8gOjogUG9zXG4gICAgLy8gVGhlIHNlbGVjdGlvbidzIGltbW9iaWxlIHNpZGUgKGRvZXMgbm90IG1vdmUgd2hlbiBwcmVzc2luZ1xuICAgIC8vIHNoaWZ0LWFycm93KS5cbiAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAvLyA6OiBQb3NcbiAgICAvLyBUaGUgc2VsZWN0aW9uJ3MgbW9iaWxlIHNpZGUgKHRoZSBzaWRlIHRoYXQgbW92ZXMgd2hlbiBwcmVzc2luZ1xuICAgIC8vIHNoaWZ0LWFycm93KS5cbiAgICB0aGlzLmhlYWQgPSBoZWFkIHx8IGFuY2hvcjtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhXG4gIC8vIHNpbmdsZSBub2RlLiBBbGwgbm9kZXMgbWFya2VkIFtzZWxlY3RhYmxlXSgjTm9kZVR5cGUuc2VsZWN0YWJsZSlcbiAgLy8gY2FuIGJlIHRoZSB0YXJnZXQgb2YgYSBub2RlIHNlbGVjdGlvbi4gSW4gc3VjaCBhbiBvYmplY3QsIGBmcm9tYFxuICAvLyBhbmQgYHRvYCBwb2ludCBkaXJlY3RseSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzZWxlY3RlZCBub2RlLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0U2VsZWN0aW9uLCBbe1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiAhb3RoZXIuaGVhZC5jbXAodGhpcy5oZWFkKSAmJiAhb3RoZXIuYW5jaG9yLmNtcCh0aGlzLmFuY2hvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICB2YXIgaGVhZCA9IG1hcHBpbmcubWFwKHRoaXMuaGVhZCkucG9zO1xuICAgICAgaWYgKCFkb2MucGF0aChoZWFkLnBhdGgpLmlzVGV4dGJsb2NrKSByZXR1cm4gZmluZFNlbGVjdGlvbk5lYXIoZG9jLCBoZWFkKTtcbiAgICAgIHZhciBhbmNob3IgPSBtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikucG9zO1xuICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKGRvYy5wYXRoKGFuY2hvci5wYXRoKS5pc1RleHRibG9jayA/IGFuY2hvciA6IGhlYWQsIGhlYWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yLmNtcCh0aGlzLmhlYWQpID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0ZWQgPyB0aGlzLmhlYWQgOiB0aGlzLmFuY2hvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmVydGVkID8gdGhpcy5hbmNob3IgOiB0aGlzLmhlYWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmNob3IuY21wKHRoaXMuaGVhZCkgPT0gMDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dFNlbGVjdGlvbjtcbn0pKFNlbGVjdGlvbik7XG5cbmV4cG9ydHMuVGV4dFNlbGVjdGlvbiA9IFRleHRTZWxlY3Rpb247XG5cbnZhciBOb2RlU2VsZWN0aW9uID0gKGZ1bmN0aW9uIChfU2VsZWN0aW9uMikge1xuICBfaW5oZXJpdHMoTm9kZVNlbGVjdGlvbiwgX1NlbGVjdGlvbjIpO1xuXG4gIC8vIDo6IChQb3MsIFBvcywgTm9kZSlcbiAgLy8gQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24uIERvZXMgbm90IHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cy4gVXNlIGBQcm9zZU1pcnJvci5zZXROb2RlU2VsZWN0aW9uYCBmb3IgYW4gZWFzaWVyLFxuICAvLyBlcnJvci1jaGVja2luZyB3YXkgdG8gY3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24uXG5cbiAgZnVuY3Rpb24gTm9kZVNlbGVjdGlvbihmcm9tLCB0bywgbm9kZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlU2VsZWN0aW9uKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE5vZGVTZWxlY3Rpb24ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgdGhpcy50byA9IHRvO1xuICAgIC8vIDo6IE5vZGUgVGhlIHNlbGVjdGVkIG5vZGUuXG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhOb2RlU2VsZWN0aW9uLCBbe1xuICAgIGtleTogXCJlcVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcShvdGhlcikge1xuICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiAhdGhpcy5mcm9tLmNtcChvdGhlci5mcm9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgIHZhciBmcm9tID0gbWFwcGluZy5tYXAodGhpcy5mcm9tLCAxKS5wb3M7XG4gICAgICB2YXIgdG8gPSBtYXBwaW5nLm1hcCh0aGlzLnRvLCAtMSkucG9zO1xuICAgICAgaWYgKF9tb2RlbC5Qb3Muc2FtZVBhdGgoZnJvbS5wYXRoLCB0by5wYXRoKSAmJiBmcm9tLm9mZnNldCA9PSB0by5vZmZzZXQgLSAxKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9jLm5vZGVBZnRlcihmcm9tKTtcbiAgICAgICAgaWYgKG5vZGUudHlwZS5zZWxlY3RhYmxlKSByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25OZWFyKGRvYywgZnJvbSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVtcHR5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE5vZGVTZWxlY3Rpb247XG59KShTZWxlY3Rpb24pO1xuXG5leHBvcnRzLk5vZGVTZWxlY3Rpb24gPSBOb2RlU2VsZWN0aW9uO1xuXG5mdW5jdGlvbiBwYXRoRnJvbURPTShwbSwgbm9kZSkge1xuICB2YXIgcGF0aCA9IFtdO1xuICBmb3IgKDsgbm9kZSAhPSBwbS5jb250ZW50Oykge1xuICAgIHZhciBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIik7XG4gICAgaWYgKGF0dHIpIHBhdGgudW5zaGlmdCgrYXR0cik7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZnVuY3Rpb24gd2lkdGhGcm9tRE9NKGRvbSkge1xuICB2YXIgYXR0ciA9IGRvbS5nZXRBdHRyaWJ1dGUoXCJwbS1sZWFmXCIpO1xuICByZXR1cm4gYXR0ciAmJiBhdHRyICE9IFwidHJ1ZVwiID8gK2F0dHIgOiAxO1xufVxuXG5mdW5jdGlvbiBwb3NGcm9tRE9NSW5uZXIocG0sIGRvbSwgZG9tT2Zmc2V0LCBsb29zZSkge1xuICBpZiAoIWxvb3NlICYmIHBtLm9wZXJhdGlvbiAmJiBwbS5kb2MgIT0gcG0ub3BlcmF0aW9uLmRvYykgdGhyb3cgbmV3IEVycm9yKFwiRmV0Y2hpbmcgYSBwb3NpdGlvbiBmcm9tIGFuIG91dGRhdGVkIERPTSBzdHJ1Y3R1cmVcIik7XG5cbiAgdmFyIGV4dHJhT2Zmc2V0ID0gMCxcbiAgICAgIHRhZyA9IHVuZGVmaW5lZDtcbiAgZm9yICg7Oykge1xuICAgIHZhciBhZGp1c3QgPSAwO1xuICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMykge1xuICAgICAgZXh0cmFPZmZzZXQgKz0gZG9tT2Zmc2V0O1xuICAgIH0gZWxzZSBpZiAoZG9tLmhhc0F0dHJpYnV0ZShcInBtLW9mZnNldFwiKSB8fCBkb20gPT0gcG0uY29udGVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0YWcgPSBkb20uZ2V0QXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIpKSB7XG4gICAgICBleHRyYU9mZnNldCArPSArdGFnO1xuICAgICAgYWRqdXN0ID0gLTE7XG4gICAgfSBlbHNlIGlmIChkb21PZmZzZXQgJiYgZG9tT2Zmc2V0ID09IGRvbS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgYWRqdXN0ID0gMTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgIGRvbU9mZnNldCA9IGFkanVzdCA8IDAgPyAwIDogQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChfcGFyZW50LmNoaWxkTm9kZXMsIGRvbSkgKyBhZGp1c3Q7XG4gICAgZG9tID0gX3BhcmVudDtcbiAgfVxuXG4gIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSk7XG4gIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tbGVhZlwiKSkgcmV0dXJuIF9tb2RlbC5Qb3MuZnJvbShwYXRoLCBleHRyYU9mZnNldCArIChkb21PZmZzZXQgPyAxIDogMCkpO1xuXG4gIHZhciBvZmZzZXQgPSAwO1xuICBmb3IgKHZhciBpID0gZG9tT2Zmc2V0IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgY2hpbGQgPSBkb20uY2hpbGROb2Rlc1tpXTtcbiAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMykge1xuICAgICAgaWYgKGxvb3NlKSBleHRyYU9mZnNldCArPSBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodGFnID0gY2hpbGQuZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICBvZmZzZXQgPSArdGFnICsgd2lkdGhGcm9tRE9NKGNoaWxkKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAobG9vc2UgJiYgIWNoaWxkLmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSkge1xuICAgICAgZXh0cmFPZmZzZXQgKz0gY2hpbGQudGV4dENvbnRlbnQubGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3IF9tb2RlbC5Qb3MocGF0aCwgb2Zmc2V0ICsgZXh0cmFPZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBwb3NGcm9tRE9NKHBtLCBub2RlLCBvZmZzZXQpIHtcbiAgaWYgKG9mZnNldCA9PSBudWxsKSB7XG4gICAgb2Zmc2V0ID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcywgbm9kZSk7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuICByZXR1cm4gcG9zRnJvbURPTUlubmVyKHBtLCBub2RlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByYW5nZUZyb21ET01Mb29zZShwbSkge1xuICBpZiAoIWhhc0ZvY3VzKHBtKSkgcmV0dXJuIG51bGw7XG4gIHZhciBzZWwgPSBnZXRTZWxlY3Rpb24oKTtcbiAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHBvc0Zyb21ET01Jbm5lcihwbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQsIHRydWUpLCBwb3NGcm9tRE9NSW5uZXIocG0sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBmaW5kQnlQYXRoKG5vZGUsIG4sIGZyb21FbmQpIHtcbiAgZm9yICh2YXIgY2ggPSBmcm9tRW5kID8gbm9kZS5sYXN0Q2hpbGQgOiBub2RlLmZpcnN0Q2hpbGQ7IGNoOyBjaCA9IGZyb21FbmQgPyBjaC5wcmV2aW91c1NpYmxpbmcgOiBjaC5uZXh0U2libGluZykge1xuICAgIGlmIChjaC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICB2YXIgb2Zmc2V0ID0gY2guZ2V0QXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpO1xuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICB2YXIgZm91bmQgPSBmaW5kQnlQYXRoKGNoLCBuKTtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH0gZWxzZSBpZiAoK29mZnNldCA9PSBuKSB7XG4gICAgICByZXR1cm4gY2g7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYXRoKHBhcmVudCwgcGF0aCkge1xuICB2YXIgbm9kZSA9IHBhcmVudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGZpbmRCeVBhdGgobm9kZSwgcGF0aFtpXSk7XG4gICAgaWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoIFwiICsgcGF0aC5qb2luKFwiL1wiKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGZpbmRCeU9mZnNldChub2RlLCBvZmZzZXQsIGFmdGVyKSB7XG4gIGZ1bmN0aW9uIHNlYXJjaChub2RlKSB7XG4gICAgZm9yICh2YXIgY2ggPSBub2RlLmZpcnN0Q2hpbGQsIGkgPSAwLCBhdHRyID0gdW5kZWZpbmVkOyBjaDsgY2ggPSBjaC5uZXh0U2libGluZywgaSsrKSB7XG4gICAgICBpZiAoY2gubm9kZVR5cGUgIT0gMSkgY29udGludWU7XG4gICAgICBpZiAoYXR0ciA9IGNoLmdldEF0dHJpYnV0ZShcInBtLW9mZnNldFwiKSkge1xuICAgICAgICB2YXIgZGlmZiA9IG9mZnNldCAtICthdHRyLFxuICAgICAgICAgICAgd2lkdGggPSB3aWR0aEZyb21ET00oY2gpO1xuICAgICAgICBpZiAoZGlmZiA+PSAwICYmIChhZnRlciA/IGRpZmYgPD0gd2lkdGggOiBkaWZmIDwgd2lkdGgpKSByZXR1cm4geyBub2RlOiBjaCwgb2Zmc2V0OiBpLCBpbm5lck9mZnNldDogZGlmZiB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNlYXJjaChjaCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWFyY2gobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGxlYWZBdChub2RlLCBvZmZzZXQpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICBpZiAoIWNoaWxkKSByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSByZXR1cm4geyBub2RlOiBjaGlsZCwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICBpZiAoY2hpbGQuaGFzQXR0cmlidXRlKFwicG0taW5uZXItb2Zmc2V0XCIpKSB7XG4gICAgICB2YXIgbm9kZU9mZnNldCA9IDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHZhciBuZXh0U2liID0gY2hpbGQubmV4dFNpYmxpbmcsXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIW5leHRTaWIgfHwgKG5leHRPZmZzZXQgPSArbmV4dFNpYi5nZXRBdHRyaWJ1dGUoXCJwbS1pbm5lci1vZmZzZXRcIikpID49IG9mZnNldCkgYnJlYWs7XG4gICAgICAgIGNoaWxkID0gbmV4dFNpYjtcbiAgICAgICAgbm9kZU9mZnNldCA9IG5leHRPZmZzZXQ7XG4gICAgICB9XG4gICAgICBvZmZzZXQgLT0gbm9kZU9mZnNldDtcbiAgICB9XG4gICAgbm9kZSA9IGNoaWxkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGEgRE9NIGVsZW1lbnQgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBET00gbm9kZS5cbiAqIEBwYXJhbSB7UG9zfSBwb3MgICAgIFRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICBUaGUgRE9NIG5vZGUgYW5kIGNoYXJhY3RlciBvZmZzZXQgaW5zaWRlIHRoZSBub2RlLlxuICovXG5mdW5jdGlvbiBET01Gcm9tUG9zKHBhcmVudCwgcG9zKSB7XG4gIHZhciBkb20gPSByZXNvbHZlUGF0aChwYXJlbnQsIHBvcy5wYXRoKTtcbiAgdmFyIGZvdW5kID0gZmluZEJ5T2Zmc2V0KGRvbSwgcG9zLm9mZnNldCwgdHJ1ZSksXG4gICAgICBpbm5lciA9IHVuZGVmaW5lZDtcbiAgaWYgKCFmb3VuZCkgcmV0dXJuIHsgbm9kZTogZG9tLCBvZmZzZXQ6IDAgfTtcbiAgaWYgKGZvdW5kLm5vZGUuZ2V0QXR0cmlidXRlKFwicG0tbGVhZlwiKSA9PSBcInRydWVcIiB8fCAhKGlubmVyID0gbGVhZkF0KGZvdW5kLm5vZGUsIGZvdW5kLmlubmVyT2Zmc2V0KSkpIHJldHVybiB7IG5vZGU6IGZvdW5kLm5vZGUucGFyZW50Tm9kZSwgb2Zmc2V0OiBmb3VuZC5vZmZzZXQgKyAoZm91bmQuaW5uZXJPZmZzZXQgPyAxIDogMCkgfTtlbHNlIHJldHVybiBpbm5lcjtcbn1cblxuZnVuY3Rpb24gaGFzRm9jdXMocG0pIHtcbiAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgcmV0dXJuIHNlbC5yYW5nZUNvdW50ICYmICgwLCBfZG9tLmNvbnRhaW5zKShwbS5jb250ZW50LCBzZWwuYW5jaG9yTm9kZSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4geCx5IHBvc2l0aW9uIG9uIHRoZSBlZGl0b3IsIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSAge1Byb3NlTWlycm9yfSBwbSAgICAgRWRpdG9yIGluc3RhbmNlLlxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIGNvb3JkcyBUaGUgeCwgeSBjb29yZGluYXRlcy5cbiAqIEByZXR1cm4ge1Bvc31cbiAqL1xuLy8gRklYTUUgZmFpbHMgb24gdGhlIHNwYWNlIGJldHdlZW4gbGluZXNcbi8vIEZJWE1FIHJlZm9ybXVsYXRlIGFzIHNlbGVjdGlvbkF0Q29vcmRzPyBTbyB0aGF0IGl0IGNhbid0IHJldHVybiBudWxsXG5cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzKHBtLCBjb29yZHMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wICsgMSk7XG4gIGlmICghKDAsIF9kb20uY29udGFpbnMpKHBtLmNvbnRlbnQsIGVsZW1lbnQpKSByZXR1cm4gbnVsbDtcblxuICB2YXIgb2Zmc2V0ID0gdW5kZWZpbmVkO1xuICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIGVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAzKSB7XG4gICAgZWxlbWVudCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcbiAgICBvZmZzZXQgPSBvZmZzZXRJblRleHROb2RlKGVsZW1lbnQsIGNvb3Jkcyk7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0SW5FbGVtZW50KGVsZW1lbnQsIGNvb3Jkcyk7XG4gIH1cblxuICByZXR1cm4gcG9zRnJvbURPTShwbSwgZWxlbWVudCwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gdGV4dFJlY3Qobm9kZSwgZnJvbSwgdG8pIHtcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgZnJvbSk7XG4gIHJldHVybiByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBtb2RlbCwgZ2V0IGEgYm91bmRpbmcgYm94IG9mIHRoZSBjaGFyYWN0ZXIgYXRcbiAqIHRoYXQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cuXG4gKlxuICogQHBhcmFtICB7UHJvc2VNaXJyb3J9IHBtIFRoZSBlZGl0b3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtQb3N9ICAgICAgICAgcG9zXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBib3VuZGluZyBib3guXG4gKi9cblxuZnVuY3Rpb24gY29vcmRzQXRQb3MocG0sIHBvcykge1xuICB2YXIgX0RPTUZyb21Qb3MgPSBET01Gcm9tUG9zKHBtLmNvbnRlbnQsIHBvcyk7XG5cbiAgdmFyIG5vZGUgPSBfRE9NRnJvbVBvcy5ub2RlO1xuICB2YXIgb2Zmc2V0ID0gX0RPTUZyb21Qb3Mub2Zmc2V0O1xuXG4gIHZhciBzaWRlID0gdW5kZWZpbmVkLFxuICAgICAgcmVjdCA9IHVuZGVmaW5lZDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgIGlmIChvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgIHJlY3QgPSB0ZXh0UmVjdChub2RlLCBvZmZzZXQsIG9mZnNldCArIDEpO1xuICAgICAgc2lkZSA9IFwibGVmdFwiO1xuICAgIH1cbiAgICBpZiAoKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KSAmJiBvZmZzZXQpIHtcbiAgICAgIHJlY3QgPSB0ZXh0UmVjdChub2RlLCBvZmZzZXQgLSAxLCBvZmZzZXQpO1xuICAgICAgc2lkZSA9IFwicmlnaHRcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgaWYgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgcmVjdCA9IGNoaWxkLm5vZGVUeXBlID09IDMgPyB0ZXh0UmVjdChjaGlsZCwgMCwgY2hpbGQubm9kZVZhbHVlLmxlbmd0aCkgOiBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHNpZGUgPSBcImxlZnRcIjtcbiAgICB9XG4gICAgaWYgKCghcmVjdCB8fCByZWN0LmxlZnQgPT0gcmVjdC5yaWdodCkgJiYgb2Zmc2V0KSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICByZWN0ID0gY2hpbGQubm9kZVR5cGUgPT0gMyA/IHRleHRSZWN0KGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKSA6IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc2lkZSA9IFwicmlnaHRcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgc2lkZSA9IFwibGVmdFwiO1xuICB9XG4gIHZhciB4ID0gcmVjdFtzaWRlXTtcbiAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IHggfTtcbn1cblxudmFyIHNjcm9sbE1hcmdpbiA9IDU7XG5cbmZ1bmN0aW9uIHNjcm9sbEludG9WaWV3KHBtLCBwb3MpIHtcbiAgaWYgKCFwb3MpIHBvcyA9IHBtLnNlbC5yYW5nZS5oZWFkIHx8IHBtLnNlbC5yYW5nZS5mcm9tO1xuICB2YXIgY29vcmRzID0gY29vcmRzQXRQb3MocG0sIHBvcyk7XG4gIGZvciAodmFyIF9wYXJlbnQyID0gcG0uY29udGVudDs7IF9wYXJlbnQyID0gX3BhcmVudDIucGFyZW50Tm9kZSkge1xuICAgIHZhciBhdEJvZHkgPSBfcGFyZW50MiA9PSBkb2N1bWVudC5ib2R5O1xuICAgIHZhciByZWN0ID0gYXRCb2R5ID8gd2luZG93UmVjdCgpIDogX3BhcmVudDIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIG1vdmVYID0gMCxcbiAgICAgICAgbW92ZVkgPSAwO1xuICAgIGlmIChjb29yZHMudG9wIDwgcmVjdC50b3ApIG1vdmVZID0gLShyZWN0LnRvcCAtIGNvb3Jkcy50b3AgKyBzY3JvbGxNYXJnaW4pO2Vsc2UgaWYgKGNvb3Jkcy5ib3R0b20gPiByZWN0LmJvdHRvbSkgbW92ZVkgPSBjb29yZHMuYm90dG9tIC0gcmVjdC5ib3R0b20gKyBzY3JvbGxNYXJnaW47XG4gICAgaWYgKGNvb3Jkcy5sZWZ0IDwgcmVjdC5sZWZ0KSBtb3ZlWCA9IC0ocmVjdC5sZWZ0IC0gY29vcmRzLmxlZnQgKyBzY3JvbGxNYXJnaW4pO2Vsc2UgaWYgKGNvb3Jkcy5yaWdodCA+IHJlY3QucmlnaHQpIG1vdmVYID0gY29vcmRzLnJpZ2h0IC0gcmVjdC5yaWdodCArIHNjcm9sbE1hcmdpbjtcbiAgICBpZiAobW92ZVggfHwgbW92ZVkpIHtcbiAgICAgIGlmIChhdEJvZHkpIHdpbmRvdy5zY3JvbGxCeShtb3ZlWCwgbW92ZVkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobW92ZVkpIF9wYXJlbnQyLnNjcm9sbFRvcCArPSBtb3ZlWTtcbiAgICAgIGlmIChtb3ZlWCkgX3BhcmVudDIuc2Nyb2xsTGVmdCArPSBtb3ZlWDtcbiAgICB9XG4gICAgaWYgKGF0Qm9keSkgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0SW5SZWN0cyhjb29yZHMsIHJlY3RzLCBzdHJpY3QpIHtcbiAgdmFyIHkgPSBjb29yZHMudG9wO1xuICB2YXIgeCA9IGNvb3Jkcy5sZWZ0O1xuXG4gIHZhciBtaW5ZID0gMWU4LFxuICAgICAgbWluWCA9IDFlOCxcbiAgICAgIG9mZnNldCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVjdCA9IHJlY3RzW2ldO1xuICAgIGlmICghcmVjdCB8fCByZWN0LnRvcCA9PSByZWN0LmJvdHRvbSkgY29udGludWU7XG4gICAgdmFyIGRYID0geCA8IHJlY3QubGVmdCA/IHJlY3QubGVmdCAtIHggOiB4ID4gcmVjdC5yaWdodCA/IHggLSByZWN0LnJpZ2h0IDogMDtcbiAgICBpZiAoZFggPiBtaW5YKSBjb250aW51ZTtcbiAgICBpZiAoZFggPCBtaW5YKSB7XG4gICAgICBtaW5YID0gZFg7bWluWSA9IDFlODtcbiAgICB9XG4gICAgdmFyIGRZID0geSA8IHJlY3QudG9wID8gcmVjdC50b3AgLSB5IDogeSA+IHJlY3QuYm90dG9tID8geSAtIHJlY3QuYm90dG9tIDogMDtcbiAgICBpZiAoZFkgPCBtaW5ZKSB7XG4gICAgICBtaW5ZID0gZFk7XG4gICAgICBvZmZzZXQgPSB4IDwgKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IGkgOiBpICsgMTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0cmljdCAmJiAobWluWCB8fCBtaW5ZKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBvZmZzZXQ7XG59XG5cbmZ1bmN0aW9uIG9mZnNldEluVGV4dE5vZGUodGV4dCwgY29vcmRzLCBzdHJpY3QpIHtcbiAgdmFyIGxlbiA9IHRleHQubm9kZVZhbHVlLmxlbmd0aDtcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgdmFyIHJlY3RzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByYW5nZS5zZXRFbmQodGV4dCwgaSArIDEpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHRleHQsIGkpO1xuICAgIHJlY3RzLnB1c2gocmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICB9XG4gIHJldHVybiBvZmZzZXRJblJlY3RzKGNvb3JkcywgcmVjdHMsIHN0cmljdCk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldEluRWxlbWVudChlbGVtZW50LCBjb29yZHMpIHtcbiAgdmFyIHJlY3RzID0gW107XG4gIGZvciAodmFyIGNoaWxkID0gZWxlbWVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgIGlmIChjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJlY3RzLnB1c2goY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2Vsc2UgcmVjdHMucHVzaChudWxsKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0SW5SZWN0cyhjb29yZHMsIHJlY3RzKTtcbn1cblxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbkluKGRvYywgcGF0aCwgb2Zmc2V0LCBkaXIsIHRleHQpIHtcbiAgdmFyIG5vZGUgPSBkb2MucGF0aChwYXRoKTtcbiAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbihuZXcgX21vZGVsLlBvcyhwYXRoLCBvZmZzZXQpKTtcblxuICBmb3IgKHZhciBpID0gb2Zmc2V0ICsgKGRpciA+IDAgPyAwIDogLTEpOyBkaXIgPiAwID8gaSA8IG5vZGUuc2l6ZSA6IGkgPj0gMDsgaSArPSBkaXIpIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgIGlmICghdGV4dCAmJiBjaGlsZC50eXBlLmNvbnRhaW5zID09IG51bGwgJiYgY2hpbGQudHlwZS5zZWxlY3RhYmxlKSByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24obmV3IF9tb2RlbC5Qb3MocGF0aCwgaSksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIGkgKyAxKSwgY2hpbGQpO1xuICAgIHBhdGgucHVzaChpKTtcbiAgICB2YXIgaW5zaWRlID0gZmluZFNlbGVjdGlvbkluKGRvYywgcGF0aCwgZGlyIDwgMCA/IGNoaWxkLnNpemUgOiAwLCBkaXIsIHRleHQpO1xuICAgIGlmIChpbnNpZGUpIHJldHVybiBpbnNpZGU7XG4gICAgcGF0aC5wb3AoKTtcbiAgfVxufVxuXG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIGJpZGkgbW90aW9uIHdoZW4gZGV0ZXJtaW5pbmcgYmxvY2sgc3RhcnQgYW5kIGVuZFxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgZGlyLCB0ZXh0KSB7XG4gIGZvciAodmFyIHBhdGggPSBwb3MucGF0aC5zbGljZSgpLCBvZmZzZXQgPSBwb3Mub2Zmc2V0OzspIHtcbiAgICB2YXIgZm91bmQgPSBmaW5kU2VsZWN0aW9uSW4oZG9jLCBwYXRoLCBvZmZzZXQsIGRpciwgdGV4dCk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgaWYgKCFwYXRoLmxlbmd0aCkgYnJlYWs7XG4gICAgb2Zmc2V0ID0gcGF0aC5wb3AoKSArIChkaXIgPiAwID8gMSA6IDApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25OZWFyKGRvYywgcG9zLCBiaWFzLCB0ZXh0KSB7XG4gIGlmIChiaWFzID09PSB1bmRlZmluZWQpIGJpYXMgPSAxO1xuXG4gIHZhciByZXN1bHQgPSBmaW5kU2VsZWN0aW9uRnJvbShkb2MsIHBvcywgYmlhcywgdGV4dCkgfHwgZmluZFNlbGVjdGlvbkZyb20oZG9jLCBwb3MsIC1iaWFzLCB0ZXh0KTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIlNlYXJjaGluZyBmb3Igc2VsZWN0aW9uIGluIGludmFsaWQgZG9jdW1lbnQgXCIgKyBkb2MpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uQXRTdGFydChub2RlLCBwYXRoLCB0ZXh0KSB7XG4gIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHBhdGggPSBbXTtcblxuICByZXR1cm4gZmluZFNlbGVjdGlvbkluKG5vZGUsIHBhdGguc2xpY2UoKSwgMCwgMSwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25BdEVuZChub2RlLCBwYXRoLCB0ZXh0KSB7XG4gIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHBhdGggPSBbXTtcblxuICByZXR1cm4gZmluZFNlbGVjdGlvbkluKG5vZGUsIHBhdGguc2xpY2UoKSwgbm9kZS5zaXplLCAtMSwgdGV4dCk7XG59XG5cbi8vIDs7ICNwYXRoPU5vZGVUeXBlICNraW5kPWNsYXNzICNub0FuY2hvclxuLy8gWW91IGNhbiBhZGQgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRvIFtub2RlIHR5cGVzXSgjTm9kZVR5cGUpIHRvXG4vLyBpbmZsdWVuY2UgdGhlIHdheSB0aGUgZWRpdG9yIGludGVyYWN0cyB3aXRoIHRoZW0uXG5cbi8vIDo6IChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgZG9tOiBET01Ob2RlLCBjb29yZHM6IHtsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyfSkg4oaSID9Qb3Ncbi8vICNwYXRoPU5vZGVUeXBlLnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGRcbi8vIFNwZWNpZmllcyB0aGF0LCBpZiB0aGlzIG5vZGUgaXMgY2xpY2tlZCwgYSBjaGlsZCBub2RlIG1pZ2h0XG4vLyBhY3R1YWxseSBiZSBtZWFudC4gVGhpcyBpcyB1c2VkIHRvLCBmb3IgZXhhbXBsZSwgbWFrZSBjbGlja2luZyBhXG4vLyBsaXN0IG1hcmtlciAod2hpY2gsIGluIHRoZSBET00sIGlzIHBhcnQgb2YgdGhlIGxpc3Qgbm9kZSkgc2VsZWN0XG4vLyB0aGUgbGlzdCBpdGVtIGl0IGJlbG9uZ3MgdG8uIFNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzIGRvbid0IHJlZmVyIHRvIGEgY2hpbGQgbm9kZSwgb3IgdGhlIFtwb3NpdGlvbl0oI1Bvcylcbi8vIGJlZm9yZSB0aGVjaGlsZCBvdGhlcndpc2UuXG5cbmZ1bmN0aW9uIHNlbGVjdGFibGVOb2RlQWJvdmUocG0sIGRvbSwgY29vcmRzLCBsaWJlcmFsKSB7XG4gIGZvciAoOyBkb20gJiYgZG9tICE9IHBtLmNvbnRlbnQ7IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIHtcbiAgICAgIHZhciBwYXRoID0gcGF0aEZyb21ET00ocG0sIGRvbSksXG4gICAgICAgICAgbm9kZSA9IHBtLmRvYy5wYXRoKHBhdGgpO1xuICAgICAgaWYgKG5vZGUudHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5vZGUudHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQobm9kZSwgcGF0aCwgZG9tLCBjb29yZHMpO1xuICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgLy8gTGVhZiBub2RlcyBhcmUgaW1wbGljaXRseSBjbGlja2FibGVcbiAgICAgIGlmICgobGliZXJhbCB8fCBub2RlLnR5cGUuY29udGFpbnMgPT0gbnVsbCkgJiYgbm9kZS50eXBlLnNlbGVjdGFibGUpIHJldHVybiBfbW9kZWwuUG9zLmZyb20ocGF0aCk7XG4gICAgICBpZiAoIWxpYmVyYWwpIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vLyA6OiAocG06IFByb3NlTWlycm9yLCBldmVudDogTW91c2VFdmVudCwgcGF0aDogW251bWJlcl0sIG5vZGU6IE5vZGUpIOKGkiBib29sXG4vLyAjcGF0aD1Ob2RlVHlwZS5wcm90b3R5cGUuaGFuZGxlQ2xpY2tcbi8vIElmIGEgbm9kZSBpcyBkaXJlY3RseSBjbGlja2VkICh0aGF0IGlzLCB0aGUgY2xpY2sgZGlkbid0IGxhbmQgaW4gYVxuLy8gRE9NIG5vZGUgYmVsb25naW5nIHRvIGEgY2hpbGQgbm9kZSksIGFuZCBpdHMgdHlwZSBoYXMgYVxuLy8gYGhhbmRsZUNsaWNrYCBtZXRob2QsIHRoYXQgbWV0aG9kIGlzIGdpdmVuIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGVcbi8vIGNsaWNrLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHNob3VsZCByZXR1cm4gYGZhbHNlYCBpZiBpdCBkaWRcbi8vIF9ub3RfIGhhbmRsZSB0aGUgY2xpY2suXG4vL1xuLy8gVGhlIGBldmVudGAgcGFzc2VkIGlzIHRoZSBldmVudCBmb3IgYFwibW91c2Vkb3duXCJgLCBidXQgY2FsbGluZ1xuLy8gYHByZXZlbnREZWZhdWx0YCBvbiBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZSB0aGlzIG1ldGhvZCBpcyBvbmx5XG4vLyBjYWxsZWQgYWZ0ZXIgYSBjb3JyZXNwb25kaW5nIGBcIm1vdXNldXBcImAgaGFzIG9jY3VycmVkIGFuZFxuLy8gUHJvc2VNaXJyb3IgaGFzIGRldGVybWluZWQgdGhhdCB0aGlzIGlzIG5vdCBhIGRyYWcgb3IgbXVsdGktY2xpY2tcbi8vIGV2ZW50LlxuXG5mdW5jdGlvbiBoYW5kbGVOb2RlQ2xpY2socG0sIGV2ZW50KSB7XG4gIGZvciAodmFyIGRvbSA9IGV2ZW50LnRhcmdldDsgZG9tICYmIGRvbSAhPSBwbS5jb250ZW50OyBkb20gPSBkb20ucGFyZW50Tm9kZSkge1xuICAgIGlmIChkb20uaGFzQXR0cmlidXRlKFwicG0tb2Zmc2V0XCIpKSB7XG4gICAgICB2YXIgcGF0aCA9IHBhdGhGcm9tRE9NKHBtLCBkb20pLFxuICAgICAgICAgIG5vZGUgPSBwbS5kb2MucGF0aChwYXRoKTtcbiAgICAgIHJldHVybiBub2RlLnR5cGUuaGFuZGxlQ2xpY2sgJiYgbm9kZS50eXBlLmhhbmRsZUNsaWNrKHBtLCBldmVudCwgcGF0aCwgbm9kZSkgIT09IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2ZXJ0aWNhbE1vdGlvbkxlYXZlc1RleHRibG9jayhwbSwgcG9zLCBkaXIpIHtcbiAgdmFyIGRvbSA9IHJlc29sdmVQYXRoKHBtLmNvbnRlbnQsIHBvcy5wYXRoKTtcbiAgdmFyIGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHBtLCBwb3MpO1xuICBmb3IgKHZhciBjaGlsZCA9IGRvbS5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPSAxKSBjb250aW51ZTtcbiAgICB2YXIgYm94ZXMgPSBjaGlsZC5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBib3ggPSBib3hlc1tpXTtcbiAgICAgIGlmIChkaXIgPCAwID8gYm94LmJvdHRvbSA8IGNvb3Jkcy50b3AgOiBib3gudG9wID4gY29vcmRzLmJvdHRvbSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2V0RE9NU2VsZWN0aW9uVG9Qb3MocG0sIHBvcykge1xuICB2YXIgX0RPTUZyb21Qb3MyID0gRE9NRnJvbVBvcyhwbS5jb250ZW50LCBwb3MpO1xuXG4gIHZhciBub2RlID0gX0RPTUZyb21Qb3MyLm5vZGU7XG4gIHZhciBvZmZzZXQgPSBfRE9NRnJvbVBvczIub2Zmc2V0O1xuXG4gIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIHJhbmdlLnNldEVuZChub2RlLCBvZmZzZXQpO1xuICByYW5nZS5zZXRTdGFydChub2RlLCBvZmZzZXQpO1xuICB2YXIgc2VsID0gZ2V0U2VsZWN0aW9uKCk7XG4gIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfaW5wdXRydWxlcyA9IHJlcXVpcmUoXCIuL2lucHV0cnVsZXNcIik7XG5cbi8vIDo6IGJvb2wgI3BhdGg9YXV0b0lucHV0ICNraW5kPW9wdGlvblxuLy8gV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgaW5wdXQgcnVsZXMgc3RvcmVkIHVuZGVyIHRoZVxuLy8gYFwiYXV0b0lucHV0XCJgIG5hbWUgaW4gdGhlIGVkaXRvcidzXG4vLyBbYHJlZ2lzdHJ5YF0oI1Byb3NlTWlycm9yLnJlZ2lzdHJ5KeKAlGJ5IGRlZmF1bHQsIHRoZXNlIGFyZSB0aGluZ3Ncbi8vIGxpa2Ugc21hcnQgcXVvdGVzLCBhbmQgYXV0b21hdGljYWxseSB3cmFwcGluZyBhIGJsb2NrIGluIGEgbGlzdCBpZlxuLy8geW91IHN0YXJ0IGl0IHdpdGggYFwiMS4gXCJgLlxuKDAsIF9lZGl0LmRlZmluZU9wdGlvbikoXCJhdXRvSW5wdXRcIiwgZmFsc2UsIGZ1bmN0aW9uIChwbSwgdmFsKSB7XG4gIGlmIChwbS5tb2QuYXV0b0lucHV0KSB7XG4gICAgcG0ubW9kLmF1dG9JbnB1dC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbnB1dHJ1bGVzLnJlbW92ZUlucHV0UnVsZSkocG0sIG5hbWUpO1xuICAgIH0pO1xuICAgIHBtLm1vZC5hdXRvSW5wdXQgPSBudWxsO1xuICB9XG4gIGlmICh2YWwpIHtcbiAgICBwbS5tb2QuYXV0b0lucHV0ID0gW107XG4gICAgcG0ucmVnaXN0cnkoXCJhdXRvSW5wdXRcIiwgZnVuY3Rpb24gKHJ1bGUsIHR5cGUpIHtcbiAgICAgIHBtLm1vZC5hdXRvSW5wdXQucHVzaChydWxlLm5hbWUpO1xuICAgICAgaWYgKHJ1bGUuaGFuZGxlci5iaW5kKSBydWxlID0gbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShydWxlLm5hbWUsIHJ1bGUubWF0Y2gsIHJ1bGUuZmlsdGVyLCBydWxlLmhhbmRsZXIuYmluZCh0eXBlKSk7XG4gICAgICAoMCwgX2lucHV0cnVsZXMuYWRkSW5wdXRSdWxlKShwbSwgcnVsZSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImVtRGFzaFwiLCAvLS0kLywgXCItXCIsIFwi4oCUXCIpKTtcblxuX2VkaXQuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJvcGVuRG91YmxlUXVvdGVcIiwgL1xccyhcIikkLywgJ1wiJywgXCLigJxcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImNsb3NlRG91YmxlUXVvdGVcIiwgL1wiJC8sICdcIicsIFwi4oCdXCIpKTtcblxuX2VkaXQuZGVmYXVsdFJlZ2lzdHJ5LnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJvcGVuU2luZ2xlUXVvdGVcIiwgL1xccygnKSQvLCBcIidcIiwgXCLigJhcIikpO1xuXG5fZWRpdC5kZWZhdWx0UmVnaXN0cnkucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcImNsb3NlU2luZ2xlUXVvdGVcIiwgLyckLywgXCInXCIsIFwi4oCZXCIpKTtcblxuX21vZGVsLkJsb2NrUXVvdGUucmVnaXN0ZXIoXCJhdXRvSW5wdXRcIiwgbmV3IF9pbnB1dHJ1bGVzLklucHV0UnVsZShcInN0YXJ0QmxvY2tRdW90ZVwiLCAvXlxccyo+ICQvLCBcIiBcIiwgZnVuY3Rpb24gKHBtLCBfLCBwb3MpIHtcbiAgd3JhcEFuZEpvaW4ocG0sIHBvcywgdGhpcyk7XG59KSk7XG5cbl9tb2RlbC5PcmRlcmVkTGlzdC5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRPcmRlcmVkTGlzdFwiLCAvXihcXGQrKVxcLiAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICB2YXIgb3JkZXIgPSArbWF0Y2hbMV07XG4gIHdyYXBBbmRKb2luKHBtLCBwb3MsIHRoaXMsIHsgb3JkZXI6IG9yZGVyIHx8IG51bGwgfSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5zaXplICsgKG5vZGUuYXR0cnMub3JkZXIgfHwgMSkgPT0gb3JkZXI7XG4gIH0pO1xufSkpO1xuXG5fbW9kZWwuQnVsbGV0TGlzdC5yZWdpc3RlcihcImF1dG9JbnB1dFwiLCBuZXcgX2lucHV0cnVsZXMuSW5wdXRSdWxlKFwic3RhcnRCdWxsZXRMaXN0XCIsIC9eXFxzKihbLSsqXSkgJC8sIFwiIFwiLCBmdW5jdGlvbiAocG0sIG1hdGNoLCBwb3MpIHtcbiAgdmFyIGJ1bGxldCA9IG1hdGNoWzFdO1xuICB3cmFwQW5kSm9pbihwbSwgcG9zLCB0aGlzLCBudWxsLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLmF0dHJzLmJ1bGxldCA9PSBidWxsZXQ7XG4gIH0pO1xufSkpO1xuXG5fbW9kZWwuQ29kZUJsb2NrLnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydENvZGVCbG9ja1wiLCAvXmBgYCQvLCBcImBcIiwgZnVuY3Rpb24gKHBtLCBfLCBwb3MpIHtcbiAgc2V0QXMocG0sIHBvcywgdGhpcywgeyBwYXJhbXM6IFwiXCIgfSk7XG59KSk7XG5cbl9tb2RlbC5IZWFkaW5nLnJlZ2lzdGVyKFwiYXV0b0lucHV0XCIsIG5ldyBfaW5wdXRydWxlcy5JbnB1dFJ1bGUoXCJzdGFydEhlYWRpbmdcIiwgL14oI3sxLDZ9KSAkLywgXCIgXCIsIGZ1bmN0aW9uIChwbSwgbWF0Y2gsIHBvcykge1xuICBzZXRBcyhwbSwgcG9zLCB0aGlzLCB7IGxldmVsOiBtYXRjaFsxXS5sZW5ndGggfSk7XG59KSk7XG5cbmZ1bmN0aW9uIHdyYXBBbmRKb2luKHBtLCBwb3MsIHR5cGUpIHtcbiAgdmFyIGF0dHJzID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1szXTtcbiAgdmFyIHByZWRpY2F0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbNF07XG5cbiAgdmFyIGJlZm9yZSA9IHBvcy5zaG9ydGVuKCk7XG4gIHZhciBzaWJsaW5nID0gYmVmb3JlLm9mZnNldCA+IDAgJiYgcG0uZG9jLnBhdGgoYmVmb3JlLnBhdGgpLmNoaWxkKGJlZm9yZS5vZmZzZXQgLSAxKTtcbiAgdmFyIGpvaW4gPSBzaWJsaW5nICYmIHNpYmxpbmcudHlwZS5uYW1lID09IHR5cGUgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNpYmxpbmcpKTtcbiAgdmFyIHRyID0gcG0udHIud3JhcChwb3MsIHBvcywgdHlwZSwgYXR0cnMpO1xuICB2YXIgZGVsUG9zID0gdHIubWFwKHBvcykucG9zO1xuICB0cltcImRlbGV0ZVwiXShuZXcgX21vZGVsLlBvcyhkZWxQb3MucGF0aCwgMCksIGRlbFBvcyk7XG4gIGlmIChqb2luKSB0ci5qb2luKGJlZm9yZSk7XG4gIHRyLmFwcGx5KCk7XG59XG5cbmZ1bmN0aW9uIHNldEFzKHBtLCBwb3MsIHR5cGUsIGF0dHJzKSB7XG4gIHBtLnRyLnNldEJsb2NrVHlwZShwb3MsIHBvcywgdHlwZSwgYXR0cnMpW1wiZGVsZXRlXCJdKG5ldyBfbW9kZWwuUG9zKHBvcy5wYXRoLCAwKSwgcG9zKS5hcHBseSgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuYWRkSW5wdXRSdWxlID0gYWRkSW5wdXRSdWxlO1xuZXhwb3J0cy5yZW1vdmVJbnB1dFJ1bGUgPSByZW1vdmVJbnB1dFJ1bGU7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG4vLyA6OiAoUHJvc2VNaXJyb3IsIElucHV0UnVsZSlcbi8vIEFkZCB0aGUgZ2l2ZW4gW2lucHV0IHJ1bGVdKCNJbnB1dFJ1bGUpIHRvIGFuIGVkaXRvci4gRnJvbSBub3cgb24sXG4vLyB3aGVuZXZlciB0aGUgcnVsZSdzIHBhdHRlcm4gaXMgdHlwZWQsIGl0cyBoYW5kbGVyIGlzIGFjdGl2YXRlZC5cbi8vXG4vLyBOb3RlIHRoYXQgdGhlIGVmZmVjdCBvZiBhbiBpbnB1dCBydWxlIGNhbiBiZSBjYW5jZWxlZCBieSBwcmVzc2luZ1xuLy8gQmFja3NwYWNlIHJpZ2h0IGFmdGVyIGl0IGhhcHBlbnMuXG5cbmZ1bmN0aW9uIGFkZElucHV0UnVsZShwbSwgcnVsZSkge1xuICBpZiAoIXBtLm1vZC5pbnRlcnByZXRJbnB1dCkgcG0ubW9kLmludGVycHJldElucHV0ID0gbmV3IElucHV0UnVsZXMocG0pO1xuICBwbS5tb2QuaW50ZXJwcmV0SW5wdXQuYWRkUnVsZShydWxlKTtcbn1cblxuLy8gOjogKFByb3NlTWlycm9yLCBzdHJpbmcpXG4vLyBSZW1vdmUgdGhlIGlucHV0IHJ1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoYWRkZWQgZWFybGllciB3aXRoXG4vLyBgYWRkSW5wdXRSdWxlYCkgZnJvbSB0aGUgZWRpdG9yLlxuXG5mdW5jdGlvbiByZW1vdmVJbnB1dFJ1bGUocG0sIG5hbWUpIHtcbiAgdmFyIGlpID0gcG0ubW9kLmludGVycHJldElucHV0O1xuICBpZiAoIWlpKSByZXR1cm47XG4gIGlpLnJlbW92ZVJ1bGUobmFtZSk7XG4gIGlmIChpaS5ydWxlcy5sZW5ndGggPT0gMCkge1xuICAgIGlpLnVucmVnaXN0ZXIoKTtcbiAgICBwbS5tb2QuaW50ZXJwcmV0SW5wdXQgPSBudWxsO1xuICB9XG59XG5cbi8vIDs7IElucHV0IHJ1bGVzIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIGRlc2NyaWJpbmcgYSBwaWVjZSBvZiB0ZXh0XG4vLyB0aGF0LCB3aGVuIHR5cGVkLCBjYXVzZXMgc29tZXRoaW5nIHRvIGhhcHBlbi4gVGhpcyBtaWdodCBiZVxuLy8gY2hhbmdpbmcgdHdvIGRhc2hlcyBpbnRvIGFuIGVtZGFzaCwgd3JhcHBpbmcgYSBwYXJhZ3JhcGggc3RhcnRpbmdcbi8vIHdpdGggYFwiPiBcImAgaW50byBhIGJsb2NrcXVvdGUsIG9yIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQuXG5cbnZhciBJbnB1dFJ1bGUgPVxuLy8gOjogKHN0cmluZywgUmVnRXhwLCA/c3RyaW5nLCB1bmlvbjxzdHJpbmcsIChQcm9zZU1pcnJvciwgW3N0cmluZ10sIFBvcyk+KVxuLy8gQ3JlYXRlIGFuIGlucHV0IHJ1bGUuIEl0cyBuYW1lIGlzIHVzZWQgdG8gaWRlbnRpZnkgaXQgKHRvIGRpc2FibGVcbi8vIGl0KS4gVGhlIHJ1bGUgYXBwbGllcyB3aGVuIHRoZSB1c2VyIHR5cGVkIHNvbWV0aGluZyBhbmQgdGhlIHRleHRcbi8vIGRpcmVjdGx5IGluIGZyb250IG9mIHRoZSBjdXJzb3IgbWF0Y2hlcyBgbWF0Y2hgLCB3aGljaCBzaG91bGRcbi8vIHByb2JhYmx5IGVuZCB3aXRoIGAkYC4gWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBmaWx0ZXIsIHdoaWNoXG4vLyBzaG91bGQgYmUgYSBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgYWx3YXlzIGFwcGVhcnMgYXQgdGhlIGVuZCBvZlxuLy8gdGhlIG1hdGNoLCBhbmQgd2lsbCBiZSB1c2VkIHRvIG9ubHkgYXBwbHkgdGhlIHJ1bGUgd2hlbiB0aGVyZSdzXG4vLyBhbiBhY3R1YWwgY2hhbmNlIG9mIGl0IHN1Y2NlZWRpbmcuXG4vL1xuLy8gVGhlIGBoYW5kbGVyYCBjYW4gYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoZWQgdGV4dFxuLy8gd2lsbCBzaW1wbHkgYmUgcmVwbGFjZWQgYnkgdGhhdCBzdHJpbmcsIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGxcbi8vIGJlIGNhbGxlZCB3aXRoIHRoZSBtYXRjaCBhcnJheSBwcm9kdWNlZCBieVxuLy8gW2BSZWdFeHAuZXhlY2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1JlZ0V4cC9leGVjKSxcbi8vIGFuZCBzaG91bGQgcHJvZHVjZSB0aGUgZWZmZWN0IG9mIHRoZSBydWxlLlxuZnVuY3Rpb24gSW5wdXRSdWxlKG5hbWUsIG1hdGNoLCBmaWx0ZXIsIGhhbmRsZXIpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0UnVsZSk7XG5cbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gIHRoaXMubWF0Y2ggPSBtYXRjaDtcbiAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbn07XG5cbmV4cG9ydHMuSW5wdXRSdWxlID0gSW5wdXRSdWxlO1xuXG52YXIgSW5wdXRSdWxlcyA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0UnVsZXMocG0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElucHV0UnVsZXMpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucnVsZXMgPSBbXTtcbiAgICB0aGlzLmNhbmNlbFZlcnNpb24gPSBudWxsO1xuXG4gICAgcG0ub24oXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5vblNlbENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5jYW5jZWxWZXJzaW9uID0gbnVsbDtcbiAgICB9KTtcbiAgICBwbS5vbihcInRleHRJbnB1dFwiLCB0aGlzLm9uVGV4dElucHV0ID0gdGhpcy5vblRleHRJbnB1dC5iaW5kKHRoaXMpKTtcbiAgICBwbS5hZGRLZXltYXAobmV3IF9lZGl0LktleW1hcCh7IEJhY2tzcGFjZTogZnVuY3Rpb24gQmFja3NwYWNlKHBtKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5iYWNrc3BhY2UocG0pO1xuICAgICAgfSB9LCB7IG5hbWU6IFwiaW5wdXRSdWxlc1wiIH0pLCAyMCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW5wdXRSdWxlcywgW3tcbiAgICBrZXk6IFwidW5yZWdpc3RlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkge1xuICAgICAgdGhpcy5wbS5vZmYoXCJzZWxlY3Rpb25DaGFuZ2VcIiwgdGhpcy5vblNlbENoYW5nZSk7XG4gICAgICB0aGlzLnBtLm9mZihcInRleHRJbnB1dFwiLCB0aGlzLm9uVGV4dElucHV0KTtcbiAgICAgIHRoaXMucG0ucmVtb3ZlS2V5bWFwKFwiaW5wdXRSdWxlc1wiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRSdWxlKHJ1bGUpIHtcbiAgICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUnVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVSdWxlKG5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5ydWxlc1tpXS5uYW1lID09IG5hbWUpIHtcbiAgICAgICAgICB0aGlzLnJ1bGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblRleHRJbnB1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvblRleHRJbnB1dCh0ZXh0KSB7XG4gICAgICB2YXIgcG9zID0gdGhpcy5wbS5zZWxlY3Rpb24uaGVhZDtcbiAgICAgIGlmICghcG9zKSByZXR1cm47XG5cbiAgICAgIHZhciB0ZXh0QmVmb3JlID0gdW5kZWZpbmVkLFxuICAgICAgICAgIGlzQ29kZSA9IHVuZGVmaW5lZDtcbiAgICAgIHZhciBsYXN0Q2ggPSB0ZXh0W3RleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXNbaV0sXG4gICAgICAgICAgICBtYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJ1bGUuZmlsdGVyICYmIHJ1bGUuZmlsdGVyICE9IGxhc3RDaCkgY29udGludWU7XG4gICAgICAgIGlmICh0ZXh0QmVmb3JlID09IG51bGwpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgdmFyIF9nZXRDb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzLnBtLmRvYywgcG9zKTtcblxuICAgICAgICAgIHRleHRCZWZvcmUgPSBfZ2V0Q29udGV4dC50ZXh0QmVmb3JlO1xuICAgICAgICAgIGlzQ29kZSA9IF9nZXRDb250ZXh0LmlzQ29kZTtcblxuICAgICAgICAgIGlmIChpc0NvZGUpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2ggPSBydWxlLm1hdGNoLmV4ZWModGV4dEJlZm9yZSkpIHtcbiAgICAgICAgICB2YXIgc3RhcnRWZXJzaW9uID0gdGhpcy5wbS5oaXN0b3J5LmdldFZlcnNpb24oKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuaGFuZGxlciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcG9zLm9mZnNldCAtIChtYXRjaFsxXSB8fCBtYXRjaFswXSkubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IF9tb2RlbC5Qb3MocG9zLnBhdGgsIG9mZnNldCk7XG4gICAgICAgICAgICB2YXIgbWFya3MgPSB0aGlzLnBtLmRvYy5tYXJrc0F0KHBvcyk7XG4gICAgICAgICAgICB0aGlzLnBtLnRyW1wiZGVsZXRlXCJdKHN0YXJ0LCBwb3MpLmluc2VydChzdGFydCwgdGhpcy5wbS5zY2hlbWEudGV4dChydWxlLmhhbmRsZXIsIG1hcmtzKSkuYXBwbHkoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVsZS5oYW5kbGVyKHRoaXMucG0sIG1hdGNoLCBwb3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNhbmNlbFZlcnNpb24gPSBzdGFydFZlcnNpb247XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJhY2tzcGFjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBiYWNrc3BhY2UoKSB7XG4gICAgICBpZiAodGhpcy5jYW5jZWxWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMucG0uaGlzdG9yeS5iYWNrVG9WZXJzaW9uKHRoaXMuY2FuY2VsVmVyc2lvbik7XG4gICAgICAgIHRoaXMuY2FuY2VsVmVyc2lvbiA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElucHV0UnVsZXM7XG59KSgpO1xuXG5mdW5jdGlvbiBnZXRDb250ZXh0KGRvYywgcG9zKSB7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChwb3MucGF0aCk7XG4gIHZhciBpc0NvZGUgPSBwYXJlbnQudHlwZS5pc0NvZGU7XG4gIHZhciB0ZXh0QmVmb3JlID0gXCJcIjtcbiAgZm9yICh2YXIgaSA9IHBhcmVudC5pdGVyKDAsIHBvcy5vZmZzZXQpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICBpZiAoY2hpbGQuaXNUZXh0KSB0ZXh0QmVmb3JlICs9IGNoaWxkLnRleHQ7ZWxzZSB0ZXh0QmVmb3JlID0gXCJcIjtcbiAgICBpZiAoaS5hdEVuZCgpICYmIGNoaWxkLm1hcmtzLnNvbWUoZnVuY3Rpb24gKHN0KSB7XG4gICAgICByZXR1cm4gc3QudHlwZS5pc0NvZGU7XG4gICAgfSkpIGlzQ29kZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHsgdGV4dEJlZm9yZTogdGV4dEJlZm9yZSwgaXNDb2RlOiBpc0NvZGUgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0SWNvbiA9IGdldEljb247XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIHN2Z0NvbGxlY3Rpb24gPSBudWxsO1xudmFyIHN2Z0J1aWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxudmFyIFNWRyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbnZhciBYTElOSyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiO1xuXG5mdW5jdGlvbiBnZXRJY29uKG5hbWUsIGRhdGEpIHtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBub2RlLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3ItaWNvblwiO1xuICBpZiAoZGF0YS5wYXRoKSB7XG4gICAgaWYgKCFzdmdCdWlsdFtuYW1lXSkgYnVpbGRTVkcobmFtZSwgZGF0YSk7XG4gICAgdmFyIHN2ZyA9IG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWRywgXCJzdmdcIikpO1xuICAgIHN2Zy5zdHlsZS53aWR0aCA9IGRhdGEud2lkdGggLyBkYXRhLmhlaWdodCArIFwiZW1cIjtcbiAgICB2YXIgdXNlID0gc3ZnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwidXNlXCIpKTtcbiAgICB1c2Uuc2V0QXR0cmlidXRlTlMoWExJTkssIFwiaHJlZlwiLCBcIiNwbS1pY29uLVwiICsgbmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IGRhdGEudGV4dDtcbiAgICBpZiAoZGF0YS5jc3MpIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGRhdGEuY3NzO1xuICB9XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFNWRyhuYW1lLCBkYXRhKSB7XG4gIGlmICghc3ZnQ29sbGVjdGlvbikge1xuICAgIHN2Z0NvbGxlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN2Z1wiKTtcbiAgICBzdmdDb2xsZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShzdmdDb2xsZWN0aW9uLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICB9XG4gIHZhciBzeW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHLCBcInN5bWJvbFwiKTtcbiAgc3ltLmlkID0gXCJwbS1pY29uLVwiICsgbmFtZTtcbiAgc3ltLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgXCIgKyBkYXRhLndpZHRoICsgXCIgXCIgKyBkYXRhLmhlaWdodCk7XG4gIHZhciBwYXRoID0gc3ltLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkcsIFwicGF0aFwiKSk7XG4gIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBkYXRhLnBhdGgpO1xuICBzdmdDb2xsZWN0aW9uLmFwcGVuZENoaWxkKHN5bSk7XG4gIHN2Z0J1aWx0W25hbWVdID0gdHJ1ZTtcbn1cblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcbi5Qcm9zZU1pcnJvci1pY29uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIGxpbmUtaGVpZ2h0OiAuODtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwYWRkaW5nOiAycHggOHB4O1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItaWNvbi1hY3RpdmUge1xcbiAgYmFja2dyb3VuZDogIzY2NjtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLWljb24gc3ZnIHtcXG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcXG4gIGhlaWdodDogMWVtO1xcbn1cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy5zaG93U2VsZWN0TWVudSA9IHNob3dTZWxlY3RNZW51O1xuZXhwb3J0cy5yZWFkUGFyYW1zID0gcmVhZFBhcmFtcztcbmV4cG9ydHMuY29tbWFuZEdyb3VwcyA9IGNvbW1hbmRHcm91cHM7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX3Rvb2x0aXAgPSByZXF1aXJlKFwiLi90b29sdGlwXCIpO1xuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBfZWRpdCA9IHJlcXVpcmUoXCIuLi9lZGl0XCIpO1xuXG52YXIgX3V0aWxTb3J0ZWRpbnNlcnQgPSByZXF1aXJlKFwiLi4vdXRpbC9zb3J0ZWRpbnNlcnRcIik7XG5cbnZhciBfdXRpbFNvcnRlZGluc2VydDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91dGlsU29ydGVkaW5zZXJ0KTtcblxudmFyIF9pY29ucyA9IHJlcXVpcmUoXCIuL2ljb25zXCIpO1xuXG52YXIgTWVudSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1lbnUocG0sIGRpc3BsYXkpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVudSk7XG5cbiAgICB0aGlzLmRpc3BsYXkgPSBkaXNwbGF5O1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLnBtID0gcG07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudSwgW3tcbiAgICBrZXk6IFwic2hvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93KGNvbnRlbnQsIGRpc3BsYXlJbmZvKSB7XG4gICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmVudGVyKGNvbnRlbnQsIGRpc3BsYXlJbmZvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmRpc3BsYXkucmVzZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW50ZXIoY29udGVudCwgZGlzcGxheUluZm8pIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBwaWVjZXMgPSBbXSxcbiAgICAgICAgICBleHBsb3JlID0gZnVuY3Rpb24gZXhwbG9yZSh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBleHBsb3JlKHZhbHVlW2ldKTtcbiAgICAgICAgICB9cGllY2VzLnB1c2goc2VwYXJhdG9yKTtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsdWUuc2VsZWN0IHx8IHZhbHVlLnNlbGVjdChfdGhpcy5wbSkpIHtcbiAgICAgICAgICBwaWVjZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBleHBsb3JlKGNvbnRlbnQpO1xuICAgICAgLy8gUmVtb3ZlIHN1cGVyZmx1b3VzIHNlcGFyYXRvcnNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGllY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwaWVjZXNbaV0gPT0gc2VwYXJhdG9yICYmIChpID09IDAgfHwgaSA9PSBwaWVjZXMubGVuZ3RoIC0gMSB8fCBwaWVjZXNbaSArIDFdID09IHNlcGFyYXRvcikpIHBpZWNlcy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgIH1pZiAoIXBpZWNlcy5sZW5ndGgpIHJldHVybiB0aGlzLmRpc3BsYXkuY2xlYXIoKTtcblxuICAgICAgdGhpcy5zdGFjay5wdXNoKHBpZWNlcyk7XG4gICAgICB0aGlzLmRyYXcoZGlzcGxheUluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkcmF3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRyYXcoZGlzcGxheUluZm8pIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgY3VyID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJlbmRlcmVkID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1tZW51XCIgfSwgY3VyLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gcmVuZGVySXRlbShpdGVtLCBfdGhpczIpO1xuICAgICAgfSkpO1xuICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID4gMSkgdGhpcy5kaXNwbGF5LmVudGVyKHJlbmRlcmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIubGVhdmUoKTtcbiAgICAgIH0sIGRpc3BsYXlJbmZvKTtlbHNlIHRoaXMuZGlzcGxheS5zaG93KHJlbmRlcmVkLCBkaXNwbGF5SW5mbyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxlYXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxlYXZlKCkge1xuICAgICAgdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgdGhpcy5kcmF3KCk7ZWxzZSB0aGlzLmRpc3BsYXkucmVzZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWN0aXZlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFjay5sZW5ndGggPiAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51O1xufSkoKTtcblxuZXhwb3J0cy5NZW51ID0gTWVudTtcblxudmFyIFRvb2x0aXBEaXNwbGF5ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9vbHRpcERpc3BsYXkodG9vbHRpcCwgcmVzZXRGdW5jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvb2x0aXBEaXNwbGF5KTtcblxuICAgIHRoaXMudG9vbHRpcCA9IHRvb2x0aXA7XG4gICAgdGhpcy5yZXNldEZ1bmMgPSByZXNldEZ1bmM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcERpc3BsYXksIFt7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy50b29sdGlwLmNsb3NlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgaWYgKHRoaXMucmVzZXRGdW5jKSB0aGlzLnJlc2V0RnVuYygpO2Vsc2UgdGhpcy5jbGVhcigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coZG9tLCBpbmZvKSB7XG4gICAgICB0aGlzLnRvb2x0aXAub3Blbihkb20sIGluZm8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcihkb20sIGJhY2ssIGluZm8pIHtcbiAgICAgIHZhciBidXR0b24gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXRvb2x0aXAtYmFja1wiLCB0aXRsZTogXCJCYWNrXCIgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNob3coKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci10b29sdGlwLWJhY2std3JhcHBlclwiIH0sIGRvbSwgYnV0dG9uKSwgaW5mbyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvb2x0aXBEaXNwbGF5O1xufSkoKTtcblxuZXhwb3J0cy5Ub29sdGlwRGlzcGxheSA9IFRvb2x0aXBEaXNwbGF5O1xuXG5mdW5jdGlvbiB0aXRsZShwbSwgY29tbWFuZCkge1xuICB2YXIga2V5ID0gcG0ua2V5Rm9yQ29tbWFuZChjb21tYW5kLm5hbWUpO1xuICByZXR1cm4ga2V5ID8gY29tbWFuZC5sYWJlbCArIFwiIChcIiArIGtleSArIFwiKVwiIDogY29tbWFuZC5sYWJlbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVySWNvbihjb21tYW5kLCBtZW51KSB7XG4gIHZhciBpY29uID0gcmVzb2x2ZUljb24obWVudS5wbSwgY29tbWFuZCk7XG4gIGlmIChjb21tYW5kLmFjdGl2ZShtZW51LnBtKSkgaWNvbi5jbGFzc05hbWUgKz0gXCIgUHJvc2VNaXJyb3ItaWNvbi1hY3RpdmVcIjtcbiAgdmFyIGRvbSA9ICgwLCBfZG9tLmVsdCkoXCJzcGFuXCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVpY29uXCIsIHRpdGxlOiB0aXRsZShtZW51LnBtLCBjb21tYW5kKSB9LCBpY29uKTtcbiAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7ZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIWNvbW1hbmQucGFyYW1zLmxlbmd0aCkge1xuICAgICAgY29tbWFuZC5leGVjKG1lbnUucG0pO1xuICAgICAgbWVudS5yZXNldCgpO1xuICAgIH0gZWxzZSBpZiAoY29tbWFuZC5wYXJhbXMubGVuZ3RoID09IDEgJiYgY29tbWFuZC5wYXJhbXNbMF0udHlwZSA9PSBcInNlbGVjdFwiKSB7XG4gICAgICBzaG93U2VsZWN0TWVudShtZW51LnBtLCBjb21tYW5kLCBkb20pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW51LmVudGVyKHJlYWRQYXJhbXMoY29tbWFuZCkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkb207XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVJY29uKHBtLCBjb21tYW5kKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgaWNvbiA9IGNvbW1hbmQuc3BlYy5pY29uO1xuICAgIGlmICghaWNvbikgYnJlYWs7XG4gICAgaWYgKGljb24uZnJvbSkge1xuICAgICAgY29tbWFuZCA9IHBtLmNvbW1hbmRzW2ljb24uZnJvbV07XG4gICAgICBpZiAoIWNvbW1hbmQpIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKDAsIF9pY29ucy5nZXRJY29uKShjb21tYW5kLm5hbWUsIGljb24pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKDAsIF9pY29ucy5nZXRJY29uKShcImRlZmF1bHRcIiwgeyB0ZXh0OiBcIuKcmFwiIH0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTZWxlY3QoaXRlbSwgbWVudSkge1xuICB2YXIgcGFyYW0gPSBpdGVtLnBhcmFtc1swXTtcbiAgdmFyIHZhbHVlID0gIXBhcmFtW1wiZGVmYXVsdFwiXSA/IG51bGwgOiBwYXJhbVtcImRlZmF1bHRcIl0uY2FsbCA/IHBhcmFtW1wiZGVmYXVsdFwiXShtZW51LnBtKSA6IHBhcmFtW1wiZGVmYXVsdFwiXTtcblxuICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogXCJQcm9zZU1pcnJvci1zZWxlY3QgUHJvc2VNaXJyb3Itc2VsZWN0LWNvbW1hbmQtXCIgKyBpdGVtLm5hbWUsIHRpdGxlOiBpdGVtLmxhYmVsIH0sICF2YWx1ZSA/IHBhcmFtLmRlZmF1bHRMYWJlbCB8fCBcIlNlbGVjdC4uLlwiIDogdmFsdWUuZGlzcGxheSA/IHZhbHVlLmRpc3BsYXkodmFsdWUpIDogdmFsdWUubGFiZWwpO1xuICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHNob3dTZWxlY3RNZW51KG1lbnUucG0sIGl0ZW0sIGRvbSk7XG4gIH0pO1xuICByZXR1cm4gZG9tO1xufVxuXG5mdW5jdGlvbiBzaG93U2VsZWN0TWVudShwbSwgaXRlbSwgZG9tKSB7XG4gIHZhciBwYXJhbSA9IGl0ZW0ucGFyYW1zWzBdO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtLm9wdGlvbnMuY2FsbCA/IHBhcmFtLm9wdGlvbnMocG0pIDogcGFyYW0ub3B0aW9ucztcbiAgdmFyIG1lbnUgPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLXNlbGVjdC1tZW51XCIgfSwgb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgZG9tID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCBudWxsLCBvLmRpc3BsYXkgPyBvLmRpc3BsYXkobykgOiBvLmxhYmVsKTtcbiAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaXRlbS5leGVjKHBtLCBbby52YWx1ZV0pO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbTtcbiAgfSkpO1xuICB2YXIgcG9zID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgYm94ID0gcG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgbWVudS5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgLSBib3gubGVmdCAtIDIgKyBcInB4XCI7XG4gIG1lbnUuc3R5bGUudG9wID0gcG9zLnRvcCAtIGJveC50b3AgLSAyICsgXCJweFwiO1xuXG4gIHZhciBkb25lID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGZpbmlzaCgpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmaW5pc2gpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZmluaXNoKTtcbiAgICBwbS53cmFwcGVyLnJlbW92ZUNoaWxkKG1lbnUpO1xuICB9XG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmaW5pc2gpO1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGZpbmlzaCk7XG4gIHBtLndyYXBwZXIuYXBwZW5kQ2hpbGQobWVudSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckl0ZW0oaXRlbSwgbWVudSkge1xuICB2YXIgZGlzcGxheSA9IGl0ZW0uZGlzcGxheSB8fCBpdGVtLnNwZWMuZGlzcGxheSB8fCBcImljb25cIjtcbiAgaWYgKGRpc3BsYXkgPT0gXCJpY29uXCIpIHJldHVybiByZW5kZXJJY29uKGl0ZW0sIG1lbnUpO2Vsc2UgaWYgKGRpc3BsYXkgPT0gXCJzZWxlY3RcIikgcmV0dXJuIHJlbmRlclNlbGVjdChpdGVtLCBtZW51KTtlbHNlIGlmICghZGlzcGxheSkgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWFuZCBcIiArIGl0ZW0ubmFtZSArIFwiIGNhbiBub3QgYmUgc2hvd24gaW4gYSBtZW51XCIpO2Vsc2UgcmV0dXJuIGRpc3BsYXkuY2FsbChpdGVtLCBtZW51KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJhbUZvcm0ocG0sIGNvbW1hbmQpIHtcbiAgdmFyIHByZWZpbGwgPSBjb21tYW5kLnNwZWMucHJlZmlsbFBhcmFtcyAmJiBjb21tYW5kLnNwZWMucHJlZmlsbFBhcmFtcyhwbSk7XG4gIHZhciBmaWVsZHMgPSBjb21tYW5kLnBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtLCBpKSB7XG4gICAgdmFyIGZpZWxkID0gdW5kZWZpbmVkLFxuICAgICAgICBuYW1lID0gXCJmaWVsZF9cIiArIGk7XG4gICAgdmFyIHZhbCA9IHByZWZpbGwgPyBwcmVmaWxsW2ldIDogcGFyYW1bXCJkZWZhdWx0XCJdIHx8IFwiXCI7XG4gICAgaWYgKHBhcmFtLnR5cGUgPT0gXCJ0ZXh0XCIpIGZpZWxkID0gKDAsIF9kb20uZWx0KShcImlucHV0XCIsIHsgbmFtZTogbmFtZSwgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICBwbGFjZWhvbGRlcjogcGFyYW0ubGFiZWwsXG4gICAgICB2YWx1ZTogdmFsLFxuICAgICAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiIH0pO2Vsc2UgaWYgKHBhcmFtLnR5cGUgPT0gXCJzZWxlY3RcIikgZmllbGQgPSAoMCwgX2RvbS5lbHQpKFwic2VsZWN0XCIsIHsgbmFtZTogbmFtZSB9LCAocGFyYW0ub3B0aW9ucy5jYWxsID8gcGFyYW0ub3B0aW9ucyhwbSkgOiBwYXJhbS5vcHRpb25zKS5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwib3B0aW9uXCIsIHsgdmFsdWU6IG8udmFsdWUsIHNlbGVjdGVkOiBvLnZhbHVlID09IHZhbCB9LCBvLmxhYmVsKTtcbiAgICB9KSk7ZWxzZSAvLyBGSVhNRSBtb3JlIHR5cGVzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBwYXJhbWV0ZXIgdHlwZTogXCIgKyBwYXJhbS50eXBlKTtcbiAgICByZXR1cm4gKDAsIF9kb20uZWx0KShcImRpdlwiLCBudWxsLCBmaWVsZCk7XG4gIH0pO1xuICByZXR1cm4gKDAsIF9kb20uZWx0KShcImZvcm1cIiwgbnVsbCwgZmllbGRzKTtcbn1cblxuZnVuY3Rpb24gZ2F0aGVyUGFyYW1zKHBtLCBjb21tYW5kLCBmb3JtKSB7XG4gIHZhciBiYWQgPSBmYWxzZTtcbiAgdmFyIHBhcmFtcyA9IGNvbW1hbmQucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICB2YXIgdmFsID0gZm9ybS5lbGVtZW50c1tcImZpZWxkX1wiICsgaV0udmFsdWU7XG4gICAgaWYgKHZhbCkgcmV0dXJuIHZhbDtcbiAgICBpZiAocGFyYW1bXCJkZWZhdWx0XCJdID09IG51bGwpIGJhZCA9IHRydWU7ZWxzZSByZXR1cm4gcGFyYW1bXCJkZWZhdWx0XCJdLmNhbGwgPyBwYXJhbVtcImRlZmF1bHRcIl0ocG0pIDogcGFyYW1bXCJkZWZhdWx0XCJdO1xuICB9KTtcbiAgcmV0dXJuIGJhZCA/IG51bGwgOiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIHBhcmFtRm9ybShwbSwgY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgdmFyIGZvcm0gPSBidWlsZFBhcmFtRm9ybShwbSwgY29tbWFuZCksXG4gICAgICBkb25lID0gZmFsc2U7XG5cbiAgdmFyIGZpbmlzaCA9IGZ1bmN0aW9uIGZpbmlzaChyZXN1bHQpIHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN1Ym1pdCA9IGZ1bmN0aW9uIHN1Ym1pdCgpIHtcbiAgICAvLyBGSVhNRSBlcnJvciBtZXNzYWdlc1xuICAgIGZpbmlzaChnYXRoZXJQYXJhbXMocG0sIGNvbW1hbmQsIGZvcm0pKTtcbiAgfTtcbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN1Ym1pdCgpO1xuICB9KTtcbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT0gMjcpIHtcbiAgICAgIGZpbmlzaChudWxsKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSAxMyAmJiAhKGUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHwgZS5zaGlmdEtleSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdCgpO1xuICAgIH1cbiAgfSk7XG4gIC8vIEZJWE1FIHRvbyBoYWNreT9cbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlucHV0ID0gZm9ybS5xdWVyeVNlbGVjdG9yKFwiaW5wdXQsIHRleHRhcmVhXCIpO1xuICAgIGlmIChpbnB1dCkgaW5wdXQuZm9jdXMoKTtcbiAgfSwgMjApO1xuXG4gIHJldHVybiBmb3JtO1xufVxuXG5mdW5jdGlvbiByZWFkUGFyYW1zKGNvbW1hbmQpIHtcbiAgcmV0dXJuIHsgZGlzcGxheTogZnVuY3Rpb24gZGlzcGxheShtZW51KSB7XG4gICAgICByZXR1cm4gcGFyYW1Gb3JtKG1lbnUucG0sIGNvbW1hbmQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgbWVudS5wbS5mb2N1cygpO1xuICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgY29tbWFuZC5leGVjKG1lbnUucG0sIHBhcmFtcyk7XG4gICAgICAgICAgbWVudS5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbnUubGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSB9O1xufVxuXG52YXIgc2VwYXJhdG9yID0ge1xuICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KCkge1xuICAgIHJldHVybiAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnVzZXBhcmF0b3JcIiB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY29tbWFuZEdyb3VwcyhwbSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmFtZXMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbmFtZXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzLm1hcChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICB2YXIgZm91bmQgPSBbXTtcbiAgICBmb3IgKHZhciBfbmFtZSBpbiBwbS5jb21tYW5kcykge1xuICAgICAgdmFyIGNtZCA9IHBtLmNvbW1hbmRzW19uYW1lXTtcbiAgICAgIGlmIChjbWQuc3BlYy5tZW51R3JvdXAgJiYgY21kLnNwZWMubWVudUdyb3VwID09IGdyb3VwKSAoMCwgX3V0aWxTb3J0ZWRpbnNlcnQyW1wiZGVmYXVsdFwiXSkoZm91bmQsIGNtZCwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChhLnNwZWMubWVudVJhbmsgfHwgNTApIC0gKGIuc3BlYy5tZW51UmFuayB8fCA1MCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9vbHRpcFBhcmFtSGFuZGxlcihwbSwgY29tbWFuZCwgY2FsbGJhY2spIHtcbiAgdmFyIHRvb2x0aXAgPSBuZXcgX3Rvb2x0aXAuVG9vbHRpcChwbSwgXCJjZW50ZXJcIik7XG4gIHRvb2x0aXAub3BlbihwYXJhbUZvcm0ocG0sIGNvbW1hbmQsIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICBwbS5mb2N1cygpO1xuICAgIHRvb2x0aXAuY2xvc2UoKTtcbiAgICBjYWxsYmFjayhwYXJhbXMpO1xuICB9KSk7XG59XG5cbigwLCBfZWRpdC5kZWZpbmVQYXJhbUhhbmRsZXIpKFwiZGVmYXVsdFwiLCB0b29sdGlwUGFyYW1IYW5kbGVyKTtcbigwLCBfZWRpdC5kZWZpbmVQYXJhbUhhbmRsZXIpKFwidG9vbHRpcFwiLCB0b29sdGlwUGFyYW1IYW5kbGVyKTtcblxuLy8gRklYTUUgY2hlY2sgZm9yIG9ic29sZXRlIHN0eWxlc1xuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcblxcbi5Qcm9zZU1pcnJvci1tZW51IHtcXG4gIG1hcmdpbjogMCAtNHB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB3aGl0ZS1zcGFjZTogcHJlO1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCAuUHJvc2VNaXJyb3ItbWVudSB7XFxuICB3aWR0aDogLXdlYmtpdC1maXQtY29udGVudDtcXG4gIHdpZHRoOiBmaXQtY29udGVudDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtYmFjay13cmFwcGVyIHtcXG4gIHBhZGRpbmctbGVmdDogMTJweDtcXG59XFxuLlByb3NlTWlycm9yLXRvb2x0aXAtYmFjayB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDVweDsgbGVmdDogNXB4O1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcC1iYWNrOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLCq1xcXCI7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51aWNvbiB7XFxuICBtYXJnaW46IDAgN3B4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudXNlcGFyYXRvciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5Qcm9zZU1pcnJvci1tZW51c2VwYXJhdG9yOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLvuJlcXFwiO1xcbiAgb3BhY2l0eTogMC41O1xcbiAgcGFkZGluZzogMCA0cHg7XFxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3QsIC5Qcm9zZU1pcnJvci1zZWxlY3QtbWVudSB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjNzc3O1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgZm9udC1zaXplOiA5MCU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1zZWxlY3Qge1xcbiAgcGFkZGluZzogMXB4IDEycHggMXB4IDRweDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBtYXJnaW46IDAgOHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LWNvbW1hbmQtdGV4dGJsb2NrVHlwZSB7XFxuICBtaW4td2lkdGg6IDMuMmVtO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0OmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLilr9cXFwiO1xcbiAgY29sb3I6ICM3Nzc7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYmFja2dyb3VuZDogIzQ0NDtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIHBhZGRpbmc6IDJweCAycHg7XFxuICB6LWluZGV4OiAxNTtcXG59XFxuLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdiB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBwYWRkaW5nOiAwIDFlbSAwIDJweDtcXG59XFxuLlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdjpob3ZlciB7XFxuICBiYWNrZ3JvdW5kOiAjNzc3O1xcbn1cXG5cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9lZGl0ID0gcmVxdWlyZShcIi4uL2VkaXRcIik7XG5cbnZhciBfZG9tID0gcmVxdWlyZShcIi4uL2RvbVwiKTtcblxudmFyIF91cGRhdGUgPSByZXF1aXJlKFwiLi91cGRhdGVcIik7XG5cbnZhciBfbWVudSA9IHJlcXVpcmUoXCIuL21lbnVcIik7XG5cbigwLCBfZWRpdC5kZWZpbmVPcHRpb24pKFwibWVudUJhclwiLCBmYWxzZSwgZnVuY3Rpb24gKHBtLCB2YWx1ZSkge1xuICBpZiAocG0ubW9kLm1lbnVCYXIpIHBtLm1vZC5tZW51QmFyLmRldGFjaCgpO1xuICBwbS5tb2QubWVudUJhciA9IHZhbHVlID8gbmV3IE1lbnVCYXIocG0sIHZhbHVlKSA6IG51bGw7XG59KTtcblxudmFyIEJhckRpc3BsYXkgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCYXJEaXNwbGF5KGNvbnRhaW5lciwgcmVzZXRGdW5jKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhckRpc3BsYXkpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5yZXNldEZ1bmMgPSByZXNldEZ1bmM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmFyRGlzcGxheSwgW3tcbiAgICBrZXk6IFwiY2xlYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgdGhpcy5yZXNldEZ1bmMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93KGRvbSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW50ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW50ZXIoZG9tLCBiYWNrKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICBjdXJyZW50LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBjdXJyZW50LnN0eWxlLm9wYWNpdHkgPSBcIjAuNVwiO1xuICAgICAgfVxuICAgICAgdmFyIGJhY2tCdXR0b24gPSAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLW1lbnViYXItYmFja1wiIH0pO1xuICAgICAgYmFja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBiYWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHZhciBhZGRlZCA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1zbGlkaW5nXCIgfSwgYmFja0J1dHRvbiwgZG9tKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGFkZGVkKTtcbiAgICAgIGFkZGVkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBGb3JjZSBsYXlvdXQgZm9yIHRyYW5zaXRpb25cbiAgICAgIGFkZGVkLnN0eWxlLmxlZnQgPSBcIjBcIjtcbiAgICAgIGFkZGVkLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnROb2RlKSBjdXJyZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3VycmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQmFyRGlzcGxheTtcbn0pKCk7XG5cbnZhciBNZW51QmFyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVudUJhcihwbSwgY29uZmlnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZW51QmFyKTtcblxuICAgIHRoaXMucG0gPSBwbTtcblxuICAgIHRoaXMubWVudUVsdCA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhci1pbm5lclwiIH0pO1xuICAgIHRoaXMud3JhcHBlciA9ICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWJhclwiIH0sICgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudVwiLCBzdHlsZTogXCJ2aXNpYmlsaXR5OiBoaWZmZGRlbjsgei1pbmRleDogMTAwXCIgfSwgKDAsIF9kb20uZWx0KShcInNwYW5cIiwgeyBcImNsYXNzXCI6IFwiUHJvc2VNaXJyb3ItbWVudWljb25cIiB9LCAoMCwgX2RvbS5lbHQpKFwiZGl2XCIsIHsgXCJjbGFzc1wiOiBcIlByb3NlTWlycm9yLWljb25cIiB9LCBcInhcIikpKSwgdGhpcy5tZW51RWx0KTtcbiAgICBwbS53cmFwcGVyLmluc2VydEJlZm9yZSh0aGlzLndyYXBwZXIsIHBtLndyYXBwZXIuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLnVwZGF0ZSA9IG5ldyBfdXBkYXRlLk1lbnVVcGRhdGUocG0sIFwic2VsZWN0aW9uQ2hhbmdlIGNoYW5nZSBhY3RpdmVNYXJrQ2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcmVwYXJlVXBkYXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tZW51ID0gbmV3IF9tZW51Lk1lbnUocG0sIG5ldyBCYXJEaXNwbGF5KHRoaXMubWVudUVsdCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlc2V0TWVudSgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMubWVudUl0ZW1zID0gY29uZmlnICYmIGNvbmZpZy5pdGVtcyB8fCAoMCwgX21lbnUuY29tbWFuZEdyb3VwcykocG0sIFwiaW5saW5lXCIsIFwiYmxvY2tcIiwgXCJoaXN0b3J5XCIpO1xuICAgIHRoaXMudXBkYXRlLmZvcmNlKCk7XG5cbiAgICB0aGlzLmZsb2F0aW5nID0gZmFsc2U7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZmxvYXQpIHtcbiAgICAgIHRoaXMudXBkYXRlRmxvYXQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKF90aGlzLnBtLndyYXBwZXIpKSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfdGhpcy5zY3JvbGxGdW5jKTtlbHNlIF90aGlzLnVwZGF0ZUZsb2F0KCk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxGdW5jKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudUJhciwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMudXBkYXRlLmRldGFjaCgpO1xuICAgICAgdGhpcy53cmFwcGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy53cmFwcGVyKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsRnVuYykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5zY3JvbGxGdW5jKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzY3JvbGxDdXJzb3IgPSB0aGlzLnByZXBhcmVTY3JvbGxDdXJzb3IoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMyLm1lbnUuYWN0aXZlKSBfdGhpczIucmVzZXRNZW51KCk7XG4gICAgICAgIGlmIChzY3JvbGxDdXJzb3IpIHNjcm9sbEN1cnNvcigpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRNZW51XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2V0TWVudSgpIHtcbiAgICAgIHRoaXMubWVudS5zaG93KHRoaXMubWVudUl0ZW1zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlRmxvYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlRmxvYXQoKSB7XG4gICAgICB2YXIgZWRpdG9yUmVjdCA9IHRoaXMucG0ud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLmZsb2F0aW5nKSB7XG4gICAgICAgIGlmIChlZGl0b3JSZWN0LnRvcCA+PSAwIHx8IGVkaXRvclJlY3QuYm90dG9tIDwgdGhpcy5tZW51RWx0Lm9mZnNldEhlaWdodCArIDEwKSB7XG4gICAgICAgICAgdGhpcy5mbG9hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMubWVudUVsdC5zdHlsZS5wb3NpdGlvbiA9IHRoaXMubWVudUVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5tZW51RWx0LnN0eWxlLndpZHRoID0gXCJcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJvcmRlciA9ICh0aGlzLnBtLndyYXBwZXIub2Zmc2V0V2lkdGggLSB0aGlzLnBtLndyYXBwZXIuY2xpZW50V2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUubGVmdCA9IGVkaXRvclJlY3QubGVmdCArIGJvcmRlciArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUuZGlzcGxheSA9IGVkaXRvclJlY3QudG9wID4gd2luZG93LmlubmVySGVpZ2h0ID8gXCJub25lXCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZWRpdG9yUmVjdC50b3AgPCAwICYmIGVkaXRvclJlY3QuYm90dG9tID49IHRoaXMubWVudUVsdC5vZmZzZXRIZWlnaHQgKyAxMCkge1xuICAgICAgICAgIHRoaXMuZmxvYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHZhciBtZW51UmVjdCA9IHRoaXMubWVudUVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICB0aGlzLm1lbnVFbHQuc3R5bGUubGVmdCA9IG1lbnVSZWN0LmxlZnQgKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLndpZHRoID0gbWVudVJlY3Qud2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5tZW51RWx0LnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByZXBhcmVTY3JvbGxDdXJzb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJlcGFyZVNjcm9sbEN1cnNvcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMuZmxvYXRpbmcpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFoZWFkKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBjdXJzb3JQb3MgPSB0aGlzLnBtLmNvb3Jkc0F0UG9zKGhlYWQpO1xuICAgICAgdmFyIG1lbnVSZWN0ID0gdGhpcy5tZW51RWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKGN1cnNvclBvcy50b3AgPCBtZW51UmVjdC5ib3R0b20gJiYgY3Vyc29yUG9zLmJvdHRvbSA+IG1lbnVSZWN0LnRvcCkge1xuICAgICAgICB2YXIgX3JldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHNjcm9sbGFibGUgPSBmaW5kV3JhcHBpbmdTY3JvbGxhYmxlKF90aGlzMy5wbS53cmFwcGVyKTtcbiAgICAgICAgICBpZiAoc2Nyb2xsYWJsZSkgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY3JvbGxhYmxlLnNjcm9sbFRvcCAtPSBtZW51UmVjdC5ib3R0b20gLSBjdXJzb3JQb3MudG9wO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWVudUJhcjtcbn0pKCk7XG5cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ1Njcm9sbGFibGUobm9kZSkge1xuICBmb3IgKHZhciBjdXIgPSBub2RlLnBhcmVudE5vZGU7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQpIHJldHVybiBjdXI7XG4gIH1cbn1cblxuKDAsIF9kb20uaW5zZXJ0Q1NTKShcIlxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIG1hcmdpbi1ib3R0b206IDNweDtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGluaGVyaXQ7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXItaW5uZXIge1xcbiAgY29sb3I6ICM2NjY7XFxuICBwYWRkaW5nOiAxcHggNnB4O1xcbiAgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7XFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gIHotaW5kZXg6IDEwO1xcbiAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBpbmhlcml0O1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IGluaGVyaXQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIC5Qcm9zZU1pcnJvci1pY29uLWFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kOiAjZWVlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxuLlByb3NlTWlycm9yLW1lbnViYXIgdGV4dGFyZWEge1xcbiAgYmFja2dyb3VuZDogI2VlZTtcXG4gIGNvbG9yOiBibGFjaztcXG4gIGJvcmRlcjogbm9uZTtcXG4gIG91dGxpbmU6IG5vbmU7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJveC1zaXppbmc6IC1tb3otYm9yZGVyLWJveDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi5Qcm9zZU1pcnJvci1tZW51YmFyIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxuICBwYWRkaW5nOiAwIDRweDtcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXIgZm9ybSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBwYWRkaW5nOiAycHggNHB4O1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhciAuUHJvc2VNaXJyb3ItYmxvY2t0eXBlIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICBtaW4td2lkdGg6IDRlbTtcXG59XFxuLlByb3NlTWlycm9yLW1lbnViYXIgLlByb3NlTWlycm9yLWJsb2NrdHlwZTphZnRlciB7XFxuICBjb2xvcjogI2NjYztcXG59XFxuXFxuLlByb3NlTWlycm9yLW1lbnViYXItc2xpZGluZyB7XFxuICAtd2Via2l0LXRyYW5zaXRpb246IGxlZnQgMC4ycyBlYXNlLW91dDtcXG4gIC1tb3otdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgdHJhbnNpdGlvbjogbGVmdCAwLjJzIGVhc2Utb3V0O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbGVmdDogMTAwJTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94O1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmctbGVmdDogMTZweDtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1hcmdpbi10b3A6IC0xcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogMnB4O1xcbiAgd2lkdGg6IDEwcHg7XFxuICBsZWZ0OiAwO1xcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgc2lsdmVyO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4uUHJvc2VNaXJyb3ItbWVudWJhci1iYWNrOmFmdGVyIHtcXG4gIGNvbnRlbnQ6IFxcXCLCq1xcXCI7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX2RvbSA9IHJlcXVpcmUoXCIuLi9kb21cIik7XG5cbnZhciBwcmVmaXggPSBcIlByb3NlTWlycm9yLXRvb2x0aXBcIjtcblxudmFyIFRvb2x0aXAgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUb29sdGlwKHBtLCBkaXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvb2x0aXApO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMuZGlyID0gZGlyIHx8IFwiYWJvdmVcIjtcbiAgICB0aGlzLnBvaW50ZXIgPSBwbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IHByZWZpeCArIFwiLXBvaW50ZXItXCIgKyB0aGlzLmRpciArIFwiIFwiICsgcHJlZml4ICsgXCItcG9pbnRlclwiIH0pKTtcbiAgICB0aGlzLnBvaW50ZXJXaWR0aCA9IHRoaXMucG9pbnRlckhlaWdodCA9IG51bGw7XG4gICAgdGhpcy5kb20gPSBwbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwgeyBcImNsYXNzXCI6IHByZWZpeCB9KSk7XG4gICAgdGhpcy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRvbS5zdHlsZS5vcGFjaXR5ID09IFwiMFwiKSBfdGhpcy5kb20uc3R5bGUuZGlzcGxheSA9IF90aGlzLnBvaW50ZXIuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubGFzdExlZnQgPSB0aGlzLmxhc3RSaWdodCA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcCwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHRoaXMuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20pO1xuICAgICAgdGhpcy5wb2ludGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb2ludGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTaXplKG5vZGUpIHtcbiAgICAgIHZhciB3cmFwID0gdGhpcy5wbS53cmFwcGVyLmFwcGVuZENoaWxkKCgwLCBfZG9tLmVsdCkoXCJkaXZcIiwge1xuICAgICAgICBcImNsYXNzXCI6IHByZWZpeCxcbiAgICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZVwiXG4gICAgICB9LCBub2RlKSk7XG4gICAgICB2YXIgc2l6ZSA9IHsgd2lkdGg6IHdyYXAub2Zmc2V0V2lkdGgsIGhlaWdodDogd3JhcC5vZmZzZXRIZWlnaHQgfTtcbiAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW4obm9kZSwgcG9zKSB7XG4gICAgICB2YXIgbGVmdCA9IHRoaXMubGFzdExlZnQgPSBwb3MgPyBwb3MubGVmdCA6IHRoaXMubGFzdExlZnQ7XG4gICAgICB2YXIgdG9wID0gdGhpcy5sYXN0VG9wID0gcG9zID8gcG9zLnRvcCA6IHRoaXMubGFzdFRvcDtcblxuICAgICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUobm9kZSk7XG5cbiAgICAgIHZhciBhcm91bmQgPSB0aGlzLnBtLndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGZvciAodmFyIGNoaWxkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgbmV4dCA9IHVuZGVmaW5lZDsgY2hpbGQ7IGNoaWxkID0gbmV4dCkge1xuICAgICAgICBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmIChjaGlsZCAhPSB0aGlzLnBvaW50ZXIpIHRoaXMuZG9tLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKG5vZGUpO1xuXG4gICAgICB0aGlzLmRvbS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5wb2ludGVyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cbiAgICAgIGlmICh0aGlzLnBvaW50ZXJXaWR0aCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucG9pbnRlcldpZHRoID0gdGhpcy5wb2ludGVyLm9mZnNldFdpZHRoIC0gMTtcbiAgICAgICAgdGhpcy5wb2ludGVySGVpZ2h0ID0gdGhpcy5wb2ludGVyLm9mZnNldEhlaWdodCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZG9tLnN0eWxlLndpZHRoID0gc2l6ZS53aWR0aCArIFwicHhcIjtcbiAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHNpemUuaGVpZ2h0ICsgXCJweFwiO1xuXG4gICAgICB2YXIgbWFyZ2luID0gNTtcbiAgICAgIGlmICh0aGlzLmRpciA9PSBcImFib3ZlXCIgfHwgdGhpcy5kaXIgPT0gXCJiZWxvd1wiKSB7XG4gICAgICAgIHZhciB0aXBMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGVmdCAtIHNpemUud2lkdGggLyAyLCB3aW5kb3cuaW5uZXJXaWR0aCAtIHNpemUud2lkdGgpKTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IHRpcExlZnQgLSBhcm91bmQubGVmdCArIFwicHhcIjtcbiAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgLSB0aGlzLnBvaW50ZXJXaWR0aCAvIDIgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLmRpciA9PSBcImFib3ZlXCIpIHtcbiAgICAgICAgICB2YXIgdGlwVG9wID0gdG9wIC0gYXJvdW5kLnRvcCAtIG1hcmdpbiAtIHRoaXMucG9pbnRlckhlaWdodCAtIHNpemUuaGVpZ2h0O1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IHRpcFRvcCArIFwicHhcIjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdGlwVG9wICsgc2l6ZS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYmVsb3dcbiAgICAgICAgICB2YXIgdGlwVG9wID0gdG9wIC0gYXJvdW5kLnRvcCArIG1hcmdpbjtcbiAgICAgICAgICB0aGlzLnBvaW50ZXIuc3R5bGUudG9wID0gdGlwVG9wICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IHRpcFRvcCArIHRoaXMucG9pbnRlckhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpciA9PSBcImxlZnRcIiB8fCB0aGlzLmRpciA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUudG9wID0gdG9wIC0gYXJvdW5kLnRvcCAtIHNpemUuaGVpZ2h0IC8gMiArIFwicHhcIjtcbiAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLnRvcCA9IHRvcCAtIHRoaXMucG9pbnRlckhlaWdodCAvIDIgLSBhcm91bmQudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy5kaXIgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICB2YXIgcG9pbnRlckxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgLSBtYXJnaW4gLSB0aGlzLnBvaW50ZXJXaWR0aDtcbiAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgLSBzaXplLndpZHRoICsgXCJweFwiO1xuICAgICAgICAgIHRoaXMucG9pbnRlci5zdHlsZS5sZWZ0ID0gcG9pbnRlckxlZnQgKyBcInB4XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgICB2YXIgcG9pbnRlckxlZnQgPSBsZWZ0IC0gYXJvdW5kLmxlZnQgKyBtYXJnaW47XG4gICAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IHBvaW50ZXJMZWZ0ICsgdGhpcy5wb2ludGVyV2lkdGggKyBcInB4XCI7XG4gICAgICAgICAgdGhpcy5wb2ludGVyLnN0eWxlLmxlZnQgPSBwb2ludGVyTGVmdCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpciA9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIHZhciBfdG9wID0gTWF0aC5tYXgoYXJvdW5kLnRvcCwgMCksXG4gICAgICAgICAgICBib3R0b20gPSBNYXRoLm1pbihhcm91bmQuYm90dG9tLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgICAgICB2YXIgZnJvbVRvcCA9IChib3R0b20gLSBfdG9wIC0gc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubGVmdCA9IChhcm91bmQud2lkdGggLSBzaXplLndpZHRoKSAvIDIgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnRvcCA9IF90b3AgLSBhcm91bmQudG9wICsgZnJvbVRvcCArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbSkub3BhY2l0eTtcbiAgICAgIGdldENvbXB1dGVkU3R5bGUodGhpcy5wb2ludGVyKS5vcGFjaXR5O1xuICAgICAgdGhpcy5kb20uc3R5bGUub3BhY2l0eSA9IHRoaXMucG9pbnRlci5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUub3BhY2l0eSA9IHRoaXMucG9pbnRlci5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0pKCk7XG5cbmV4cG9ydHMuVG9vbHRpcCA9IFRvb2x0aXA7XG5cbigwLCBfZG9tLmluc2VydENTUykoXCJcXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIC1tb3otYm94LXNpemluZzogYm9yZGVyLSBib3g7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcblxcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2Utb3V0LCBoZWlnaHQgMC40cyBlYXNlLW91dCwgbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgdHJhbnNpdGlvbjogd2lkdGggMC40cyBlYXNlLW91dCwgaGVpZ2h0IDAuNHMgZWFzZS1vdXQsIGxlZnQgMC40cyBlYXNlLW91dCwgdG9wIDAuNHMgZWFzZS1vdXQsIG9wYWNpdHkgMC4ycztcXG4gIG9wYWNpdHk6IDA7XFxuXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICBwYWRkaW5nOiAzcHggN3B4O1xcbiAgbWFyZ2luOiAwO1xcbiAgYmFja2dyb3VuZDogIzQ0NDtcXG4gIGJvcmRlci1jb2xvcjogIzc3NztcXG4gIGNvbG9yOiB3aGl0ZTtcXG5cXG4gIHotaW5kZXg6IDU7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXIge1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgd2lkdGg6IDA7IGhlaWdodDogMDtcXG5cXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogbGVmdCAwLjRzIGVhc2Utb3V0LCB0b3AgMC40cyBlYXNlLW91dCwgb3BhY2l0eSAwLjJzO1xcbiAgLW1vei10cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDAuNHMgZWFzZS1vdXQsIHRvcCAwLjRzIGVhc2Utb3V0LCBvcGFjaXR5IDAuMnM7XFxuICBvcGFjaXR5OiAwO1xcblxcbiAgei1pbmRleDogMTA7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItYWJvdmUge1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkICM0NDQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItYmVsb3cge1xcbiAgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yaWdodDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkICM0NDQ7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwLXBvaW50ZXItcmlnaHQge1xcbiAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJpZ2h0OiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAtcG9pbnRlci1sZWZ0IHtcXG4gIGJvcmRlci10b3A6IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1sZWZ0OiA2cHggc29saWQgIzQ0NDtcXG59XFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXAgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdLFxcbi5Qcm9zZU1pcnJvci10b29sdGlwIHRleHRhcmVhIHtcXG4gIGJhY2tncm91bmQ6ICM2NjY7XFxuICBjb2xvcjogd2hpdGU7XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG4uUHJvc2VNaXJyb3ItdG9vbHRpcCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0ge1xcbiAgcGFkZGluZzogMCA0cHg7XFxufVxcblxcblwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX2VkaXQgPSByZXF1aXJlKFwiLi4vZWRpdFwiKTtcblxudmFyIF9kb20gPSByZXF1aXJlKFwiLi4vZG9tXCIpO1xuXG52YXIgX3VwZGF0ZSA9IHJlcXVpcmUoXCIuL3VwZGF0ZVwiKTtcblxudmFyIF90b29sdGlwID0gcmVxdWlyZShcIi4vdG9vbHRpcFwiKTtcblxudmFyIF9tZW51ID0gcmVxdWlyZShcIi4vbWVudVwiKTtcblxudmFyIGNsYXNzUHJlZml4ID0gXCJQcm9zZU1pcnJvci10b29sdGlwbWVudVwiO1xuXG4oMCwgX2VkaXQuZGVmaW5lT3B0aW9uKShcInRvb2x0aXBNZW51XCIsIGZhbHNlLCBmdW5jdGlvbiAocG0sIHZhbHVlKSB7XG4gIGlmIChwbS5tb2QudG9vbHRpcE1lbnUpIHBtLm1vZC50b29sdGlwTWVudS5kZXRhY2goKTtcbiAgcG0ubW9kLnRvb2x0aXBNZW51ID0gdmFsdWUgPyBuZXcgVG9vbHRpcE1lbnUocG0sIHZhbHVlKSA6IG51bGw7XG59KTtcblxudmFyIFRvb2x0aXBNZW51ID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9vbHRpcE1lbnUocG0sIGNvbmZpZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcE1lbnUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMuaW5saW5lSXRlbXMgPSBjb25maWcgJiYgY29uZmlnLmlubGluZUl0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJpbmxpbmVcIik7XG4gICAgdGhpcy5ibG9ja0l0ZW1zID0gY29uZmlnICYmIGNvbmZpZy5ibG9ja0l0ZW1zIHx8ICgwLCBfbWVudS5jb21tYW5kR3JvdXBzKShwbSwgXCJibG9ja1wiKTtcbiAgICB0aGlzLnNob3dMaW5rcyA9IGNvbmZpZyA/IGNvbmZpZy5zaG93TGlua3MgIT09IGZhbHNlIDogdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQmxvY2tNZW51ID0gY29uZmlnICYmIGNvbmZpZy5zZWxlY3RlZEJsb2NrTWVudTtcbiAgICB0aGlzLnVwZGF0ZSA9IG5ldyBfdXBkYXRlLk1lbnVVcGRhdGUocG0sIFwiY2hhbmdlIHNlbGVjdGlvbkNoYW5nZSBibHVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5wcmVwYXJlVXBkYXRlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnRvb2x0aXAgPSBuZXcgX3Rvb2x0aXAuVG9vbHRpcChwbSwgXCJhYm92ZVwiKTtcbiAgICB0aGlzLm1lbnUgPSBuZXcgX21lbnUuTWVudShwbSwgbmV3IF9tZW51LlRvb2x0aXBEaXNwbGF5KHRoaXMudG9vbHRpcCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnVwZGF0ZS5mb3JjZSgpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgYXQgdGhlIHRvcCBjZW50ZXIgb2YgdGhlIGN1cnJlbnQgRE9NIHNlbGVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cblxuICBfY3JlYXRlQ2xhc3MoVG9vbHRpcE1lbnUsIFt7XG4gICAga2V5OiBcImRldGFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgICB0aGlzLnVwZGF0ZS5kZXRhY2goKTtcbiAgICAgIHRoaXMudG9vbHRpcC5kZXRhY2goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlcGFyZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVwYXJlVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLm1lbnUuYWN0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgdmFyIF9wbSRzZWxlY3Rpb24gPSB0aGlzLnBtLnNlbGVjdGlvbjtcbiAgICAgIHZhciBlbXB0eSA9IF9wbSRzZWxlY3Rpb24uZW1wdHk7XG4gICAgICB2YXIgbm9kZSA9IF9wbSRzZWxlY3Rpb24ubm9kZTtcbiAgICAgIHZhciBmcm9tID0gX3BtJHNlbGVjdGlvbi5mcm9tO1xuICAgICAgdmFyIHRvID0gX3BtJHNlbGVjdGlvbi50bzt2YXIgbGluayA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghdGhpcy5wbS5oYXNGb2N1cygpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi50b29sdGlwLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgIHZhciBfcmV0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgY29vcmRzID0gdG9wT2ZOb2RlU2VsZWN0aW9uKF90aGlzMi5wbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coX3RoaXMyLmJsb2NrSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQgPT09IFwib2JqZWN0XCIpIHJldHVybiBfcmV0LnY7XG4gICAgICB9IGVsc2UgaWYgKCFlbXB0eSkge1xuICAgICAgICB2YXIgX3JldDIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBub2RlID8gdG9wT2ZOb2RlU2VsZWN0aW9uKF90aGlzMi5wbSkgOiB0b3BDZW50ZXJPZlNlbGVjdGlvbigpO1xuICAgICAgICAgIHZhciBzaG93QmxvY2sgPSBfdGhpczIuc2VsZWN0ZWRCbG9ja01lbnUgJiYgX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpICYmIGZyb20ub2Zmc2V0ID09IDAgJiYgdG8ub2Zmc2V0ID09IF90aGlzMi5wbS5kb2MucGF0aChmcm9tLnBhdGgpLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coc2hvd0Jsb2NrID8gW190aGlzMi5pbmxpbmVJdGVtcywgX3RoaXMyLmJsb2NrSXRlbXNdIDogX3RoaXMyLmlubGluZUl0ZW1zLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0MiA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQyLnY7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRCbG9ja01lbnUgJiYgdGhpcy5wbS5kb2MucGF0aChmcm9tLnBhdGgpLnNpemUgPT0gMCkge1xuICAgICAgICB2YXIgX3JldDMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpczIucG0uY29vcmRzQXRQb3MoZnJvbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5tZW51LnNob3coX3RoaXMyLmJsb2NrSXRlbXMsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9yZXQzID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldDMudjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93TGlua3MgJiYgKGxpbmsgPSB0aGlzLmxpbmtVbmRlckN1cnNvcigpKSkge1xuICAgICAgICB2YXIgX3JldDQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjb29yZHMgPSBfdGhpczIucG0uY29vcmRzQXRQb3MoZnJvbSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5zaG93TGluayhsaW5rLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcmV0NCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQ0LnY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIudG9vbHRpcC5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsaW5rVW5kZXJDdXJzb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlua1VuZGVyQ3Vyc29yKCkge1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLnBtLnNlbGVjdGlvbi5oZWFkO1xuICAgICAgaWYgKCFoZWFkKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBtYXJrcyA9IHRoaXMucG0uZG9jLm1hcmtzQXQoaGVhZCk7XG4gICAgICByZXR1cm4gbWFya3MucmVkdWNlKGZ1bmN0aW9uIChmb3VuZCwgbSkge1xuICAgICAgICByZXR1cm4gZm91bmQgfHwgbS50eXBlLm5hbWUgPT0gXCJsaW5rXCIgJiYgbTtcbiAgICAgIH0sIG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93TGlua1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG93TGluayhsaW5rLCBwb3MpIHtcbiAgICAgIHZhciBub2RlID0gKDAsIF9kb20uZWx0KShcImRpdlwiLCB7IFwiY2xhc3NcIjogY2xhc3NQcmVmaXggKyBcIi1saW5rdGV4dFwiIH0sICgwLCBfZG9tLmVsdCkoXCJhXCIsIHsgaHJlZjogbGluay5hdHRycy5ocmVmLCB0aXRsZTogbGluay5hdHRycy50aXRsZSB9LCBsaW5rLmF0dHJzLmhyZWYpKTtcbiAgICAgIHRoaXMudG9vbHRpcC5vcGVuKG5vZGUsIHBvcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRvb2x0aXBNZW51O1xufSkoKTtcblxuZnVuY3Rpb24gdG9wQ2VudGVyT2ZTZWxlY3Rpb24oKSB7XG4gIHZhciByZWN0cyA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApLmdldENsaWVudFJlY3RzKCk7XG4gIHZhciBfcmVjdHMkMCA9IHJlY3RzWzBdO1xuICB2YXIgbGVmdCA9IF9yZWN0cyQwLmxlZnQ7XG4gIHZhciByaWdodCA9IF9yZWN0cyQwLnJpZ2h0O1xuICB2YXIgdG9wID0gX3JlY3RzJDAudG9wO3ZhciBpID0gMTtcbiAgd2hpbGUgKGxlZnQgPT0gcmlnaHQgJiYgcmVjdHMubGVuZ3RoID4gaSkge1xuICAgIDt2YXIgX3JlY3RzID0gcmVjdHNbaSsrXTtcbiAgICBsZWZ0ID0gX3JlY3RzLmxlZnQ7XG4gICAgcmlnaHQgPSBfcmVjdHMucmlnaHQ7XG4gICAgdG9wID0gX3JlY3RzLnRvcDtcbiAgfVxuICBmb3IgKDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlY3RzW2ldLnRvcCA8IHJlY3RzWzBdLmJvdHRvbSAtIDEgJiYgKFxuICAgIC8vIENocm9tZSBidWcgd2hlcmUgYm9ndXMgcmVjdGFuZ2xlcyBhcmUgaW5zZXJ0ZWQgYXQgc3BhbiBib3VuZGFyaWVzXG4gICAgaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IE1hdGguYWJzKHJlY3RzW2kgKyAxXS5sZWZ0IC0gcmVjdHNbaV0ubGVmdCkgPiAxKSkge1xuICAgICAgbGVmdCA9IE1hdGgubWluKGxlZnQsIHJlY3RzW2ldLmxlZnQpO1xuICAgICAgcmlnaHQgPSBNYXRoLm1heChyaWdodCwgcmVjdHNbaV0ucmlnaHQpO1xuICAgICAgdG9wID0gTWF0aC5taW4odG9wLCByZWN0c1tpXS50b3ApO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogKGxlZnQgKyByaWdodCkgLyAyIH07XG59XG5cbmZ1bmN0aW9uIHRvcE9mTm9kZVNlbGVjdGlvbihwbSkge1xuICB2YXIgc2VsZWN0ZWQgPSBwbS5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICBpZiAoIXNlbGVjdGVkKSByZXR1cm4geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgdmFyIGJveCA9IHNlbGVjdGVkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4geyBsZWZ0OiBNYXRoLm1pbigoYm94LmxlZnQgKyBib3gucmlnaHQpIC8gMiwgYm94LmxlZnQgKyAyMCksIHRvcDogYm94LnRvcCB9O1xufVxuXG4oMCwgX2RvbS5pbnNlcnRDU1MpKFwiXFxuXFxuLlByb3NlTWlycm9yLXRvb2x0aXBtZW51LWxpbmt0ZXh0IGEge1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgcGFkZGluZzogMCA1cHg7XFxufVxcblxcbi5Qcm9zZU1pcnJvci10b29sdGlwbWVudS1saW5rdGV4dCBhOmhvdmVyIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG5cIik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIE1JTl9GTFVTSF9ERUxBWSA9IDIwMDtcbnZhciBVUERBVEVfVElNRU9VVCA9IDIwMDtcblxudmFyIE1lbnVVcGRhdGUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNZW51VXBkYXRlKHBtLCBldmVudHMsIHByZXBhcmUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lbnVVcGRhdGUpO1xuXG4gICAgdGhpcy5wbSA9IHBtO1xuICAgIHRoaXMucHJlcGFyZSA9IHByZXBhcmU7XG5cbiAgICB0aGlzLm11c3RVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZUluZm8gPSBudWxsO1xuICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5sYXN0Rmx1c2ggPSAwO1xuXG4gICAgdGhpcy5ldmVudHMgPSBldmVudHMuc3BsaXQoXCIgXCIpO1xuICAgIHRoaXMub25FdmVudCA9IHRoaXMub25FdmVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZm9yY2UgPSB0aGlzLmZvcmNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHJldHVybiBwbS5vbihldmVudCwgX3RoaXMub25FdmVudCk7XG4gICAgfSk7XG4gICAgcG0ub24oXCJmbHVzaFwiLCB0aGlzLm9uRmx1c2ggPSB0aGlzLm9uRmx1c2guYmluZCh0aGlzKSk7XG4gICAgcG0ub24oXCJmbHVzaGVkXCIsIHRoaXMub25GbHVzaGVkID0gdGhpcy5vbkZsdXNoZWQuYmluZCh0aGlzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVudVVwZGF0ZSwgW3tcbiAgICBrZXk6IFwiZGV0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIucG0ub2ZmKGV2ZW50LCBfdGhpczIub25FdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucG0ub2ZmKFwiZmx1c2hcIiwgdGhpcy5vbkZsdXNoKTtcbiAgICAgIHRoaXMucG0ub2ZmKFwiZmx1c2hlZFwiLCB0aGlzLm9uRmx1c2hlZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRmx1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25GbHVzaCgpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHRoaXMubXVzdFVwZGF0ZSAmJiBub3cgLSB0aGlzLmxhc3RGbHVzaCA+PSBNSU5fRkxVU0hfREVMQVkpIHtcbiAgICAgICAgdGhpcy5sYXN0Rmx1c2ggPSBub3c7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGUgPSB0aGlzLnByZXBhcmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25GbHVzaGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRmx1c2hlZCgpIHtcbiAgICAgIGlmICh0aGlzLnVwZGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FdmVudCgpIHtcbiAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5mb3JjZSwgVVBEQVRFX1RJTUVPVVQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZSgpIHtcbiAgICAgIGlmICh0aGlzLnBtLm9wZXJhdGlvbikge1xuICAgICAgICB0aGlzLm9uRXZlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RGbHVzaCA9IERhdGUubm93KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICB2YXIgdXBkYXRlID0gdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGlmICh1cGRhdGUpIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZW51VXBkYXRlO1xufSkoKTtcblxuZXhwb3J0cy5NZW51VXBkYXRlID0gTWVudVVwZGF0ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfc2NoZW1hID0gcmVxdWlyZShcIi4vc2NoZW1hXCIpO1xuXG4vLyA7OyAjdG9jPVwiRGVmYXVsdCBzY2hlbWFcIiBUaGUgZGVmYXVsdCB0b3AtbGV2ZWwgZG9jdW1lbnQgbm9kZSB0eXBlLlxuXG52YXIgRG9jID0gKGZ1bmN0aW9uIChfQmxvY2spIHtcbiAgX2luaGVyaXRzKERvYywgX0Jsb2NrKTtcblxuICBmdW5jdGlvbiBEb2MoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvYyk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihEb2MucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBibG9ja3F1b3RlIG5vZGUgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoRG9jLCBudWxsLCBbe1xuICAgIGtleTogXCJraW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCIuXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERvYztcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkRvYyA9IERvYztcblxudmFyIEJsb2NrUXVvdGUgPSAoZnVuY3Rpb24gKF9CbG9jazIpIHtcbiAgX2luaGVyaXRzKEJsb2NrUXVvdGUsIF9CbG9jazIpO1xuXG4gIGZ1bmN0aW9uIEJsb2NrUXVvdGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb2NrUXVvdGUpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQmxvY2tRdW90ZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IG9yZGVyZWQgbGlzdCBub2RlIHR5cGUuIEhhcyBhIHNpbmdsZSBhdHRyaWJ1dGUsXG4gIC8vIGBvcmRlcmAsIHdoaWNoIGRldGVybWluZXMgdGhlIG51bWJlciBhdCB3aGljaCB0aGUgbGlzdCBzdGFydHNcbiAgLy8gY291bnRpbmcsIGFuZCBkZWZhdWx0cyB0byAxLlxuICByZXR1cm4gQmxvY2tRdW90ZTtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkJsb2NrUXVvdGUgPSBCbG9ja1F1b3RlO1xuXG52YXIgT3JkZXJlZExpc3QgPSAoZnVuY3Rpb24gKF9CbG9jazMpIHtcbiAgX2luaGVyaXRzKE9yZGVyZWRMaXN0LCBfQmxvY2szKTtcblxuICBmdW5jdGlvbiBPcmRlcmVkTGlzdCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3JkZXJlZExpc3QpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoT3JkZXJlZExpc3QucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE9yZGVyZWRMaXN0LCBudWxsLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwibGlzdF9pdGVtXCI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE9yZGVyZWRMaXN0O1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuT3JkZXJlZExpc3QgPSBPcmRlcmVkTGlzdDtcblxuT3JkZXJlZExpc3QuYXR0cmlidXRlcyA9IHsgb3JkZXI6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSh7IFwiZGVmYXVsdFwiOiBcIjFcIiB9KSB9O1xuXG4vLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGJ1bGxldCBsaXN0IG5vZGUgdHlwZS5cblxudmFyIEJ1bGxldExpc3QgPSAoZnVuY3Rpb24gKF9CbG9jazQpIHtcbiAgX2luaGVyaXRzKEJ1bGxldExpc3QsIF9CbG9jazQpO1xuXG4gIGZ1bmN0aW9uIEJ1bGxldExpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1bGxldExpc3QpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoQnVsbGV0TGlzdC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGxpc3QgaXRlbSBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKEJ1bGxldExpc3QsIG51bGwsIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJsaXN0X2l0ZW1cIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQnVsbGV0TGlzdDtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkJ1bGxldExpc3QgPSBCdWxsZXRMaXN0O1xuXG52YXIgTGlzdEl0ZW0gPSAoZnVuY3Rpb24gKF9CbG9jazUpIHtcbiAgX2luaGVyaXRzKExpc3RJdGVtLCBfQmxvY2s1KTtcblxuICBmdW5jdGlvbiBMaXN0SXRlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlzdEl0ZW0pO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTGlzdEl0ZW0ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBob3Jpem9udGFsIHJ1bGUgbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhMaXN0SXRlbSwgbnVsbCwgW3tcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaXN0SXRlbTtcbn0pKF9zY2hlbWEuQmxvY2spO1xuXG5leHBvcnRzLkxpc3RJdGVtID0gTGlzdEl0ZW07XG5cbnZhciBIb3Jpem9udGFsUnVsZSA9IChmdW5jdGlvbiAoX0Jsb2NrNikge1xuICBfaW5oZXJpdHMoSG9yaXpvbnRhbFJ1bGUsIF9CbG9jazYpO1xuXG4gIGZ1bmN0aW9uIEhvcml6b250YWxSdWxlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIb3Jpem9udGFsUnVsZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihIb3Jpem9udGFsUnVsZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGhlYWRpbmcgbm9kZSB0eXBlLiBIYXMgYSBzaW5nbGUgYXR0cmlidXRlXG4gIC8vIGBsZXZlbGAsIHdoaWNoIGluZGljYXRlcyB0aGUgaGVhZGluZyBsZXZlbCwgYW5kIGRlZmF1bHRzIHRvIDEuXG5cbiAgX2NyZWF0ZUNsYXNzKEhvcml6b250YWxSdWxlLCBudWxsLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhvcml6b250YWxSdWxlO1xufSkoX3NjaGVtYS5CbG9jayk7XG5cbmV4cG9ydHMuSG9yaXpvbnRhbFJ1bGUgPSBIb3Jpem9udGFsUnVsZTtcblxudmFyIEhlYWRpbmcgPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2spIHtcbiAgX2luaGVyaXRzKEhlYWRpbmcsIF9UZXh0YmxvY2spO1xuXG4gIGZ1bmN0aW9uIEhlYWRpbmcoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEhlYWRpbmcpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSGVhZGluZy5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gSGVhZGluZztcbn0pKF9zY2hlbWEuVGV4dGJsb2NrKTtcblxuZXhwb3J0cy5IZWFkaW5nID0gSGVhZGluZztcblxuSGVhZGluZy5hdHRyaWJ1dGVzID0geyBsZXZlbDogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiMVwiIH0pIH07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgY29kZSBibG9jayAvIGxpc3Rpbmcgbm9kZSB0eXBlLiBPbmx5XG4vLyBhbGxvd3MgdW5tYXJrZWQgdGV4dCBub2RlcyBpbnNpZGUgb2YgaXQuXG5cbnZhciBDb2RlQmxvY2sgPSAoZnVuY3Rpb24gKF9UZXh0YmxvY2syKSB7XG4gIF9pbmhlcml0cyhDb2RlQmxvY2ssIF9UZXh0YmxvY2syKTtcblxuICBmdW5jdGlvbiBDb2RlQmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvZGVCbG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihDb2RlQmxvY2sucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBwYXJhZ3JhcGggbm9kZSB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhDb2RlQmxvY2ssIFt7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNDb2RlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2RlQmxvY2s7XG59KShfc2NoZW1hLlRleHRibG9jayk7XG5cbmV4cG9ydHMuQ29kZUJsb2NrID0gQ29kZUJsb2NrO1xuXG52YXIgUGFyYWdyYXBoID0gKGZ1bmN0aW9uIChfVGV4dGJsb2NrMykge1xuICBfaW5oZXJpdHMoUGFyYWdyYXBoLCBfVGV4dGJsb2NrMyk7XG5cbiAgZnVuY3Rpb24gUGFyYWdyYXBoKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJhZ3JhcGgpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUGFyYWdyYXBoLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgaW5saW5lIGltYWdlIG5vZGUgdHlwZS4gSGFzIHRoZXNlXG4gIC8vIGF0dHJpYnV0ZXM6XG4gIC8vXG4gIC8vIC0gKipgc3JjYCoqIChyZXF1aXJlZCk6IFRoZSBVUkwgb2YgdGhlIGltYWdlLlxuICAvLyAtICoqYGFsdGAqKjogVGhlIGFsdCB0ZXh0LlxuICAvLyAtICoqYHRpdGxlYCoqOiBUaGUgdGl0bGUgb2YgdGhlIGltYWdlLlxuXG4gIF9jcmVhdGVDbGFzcyhQYXJhZ3JhcGgsIFt7XG4gICAga2V5OiBcImRlZmF1bHRUZXh0YmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQYXJhZ3JhcGg7XG59KShfc2NoZW1hLlRleHRibG9jayk7XG5cbmV4cG9ydHMuUGFyYWdyYXBoID0gUGFyYWdyYXBoO1xuXG52YXIgSW1hZ2UgPSAoZnVuY3Rpb24gKF9JbmxpbmUpIHtcbiAgX2luaGVyaXRzKEltYWdlLCBfSW5saW5lKTtcblxuICBmdW5jdGlvbiBJbWFnZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW1hZ2UpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW1hZ2UucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIEltYWdlO1xufSkoX3NjaGVtYS5JbmxpbmUpO1xuXG5leHBvcnRzLkltYWdlID0gSW1hZ2U7XG5cbkltYWdlLmF0dHJpYnV0ZXMgPSB7XG4gIHNyYzogbmV3IF9zY2hlbWEuQXR0cmlidXRlKCksXG4gIGFsdDogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiXCIgfSksXG4gIHRpdGxlOiBuZXcgX3NjaGVtYS5BdHRyaWJ1dGUoeyBcImRlZmF1bHRcIjogXCJcIiB9KVxufTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBoYXJkIGJyZWFrIG5vZGUgdHlwZS5cblxudmFyIEhhcmRCcmVhayA9IChmdW5jdGlvbiAoX0lubGluZTIpIHtcbiAgX2luaGVyaXRzKEhhcmRCcmVhaywgX0lubGluZTIpO1xuXG4gIGZ1bmN0aW9uIEhhcmRCcmVhaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGFyZEJyZWFrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEhhcmRCcmVhay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSBkZWZhdWx0IGVtcGhhc2lzIG1hcmsgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoSGFyZEJyZWFrLCBbe1xuICAgIGtleTogXCJzZWxlY3RhYmxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzQlJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBIYXJkQnJlYWs7XG59KShfc2NoZW1hLklubGluZSk7XG5cbmV4cG9ydHMuSGFyZEJyZWFrID0gSGFyZEJyZWFrO1xuXG52YXIgRW1NYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUpIHtcbiAgX2luaGVyaXRzKEVtTWFyaywgX01hcmtUeXBlKTtcblxuICBmdW5jdGlvbiBFbU1hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEVtTWFyayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihFbU1hcmsucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgZGVmYXVsdCBzdHJvbmcgbWFyayB0eXBlLlxuXG4gIF9jcmVhdGVDbGFzcyhFbU1hcmssIG51bGwsIFt7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1NYXJrO1xufSkoX3NjaGVtYS5NYXJrVHlwZSk7XG5cbmV4cG9ydHMuRW1NYXJrID0gRW1NYXJrO1xuXG52YXIgU3Ryb25nTWFyayA9IChmdW5jdGlvbiAoX01hcmtUeXBlMikge1xuICBfaW5oZXJpdHMoU3Ryb25nTWFyaywgX01hcmtUeXBlMik7XG5cbiAgZnVuY3Rpb24gU3Ryb25nTWFyaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3Ryb25nTWFyayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTdHJvbmdNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgbGluayBtYXJrIHR5cGUuIEhhcyB0aGVzZSBhdHRyaWJ1dGVzOlxuICAvL1xuICAvLyAtICoqYGhyZWZgKiogKHJlcXVpcmVkKTogVGhlIGxpbmsgdGFyZ2V0LlxuICAvLyAtICoqYHRpdGxlYCoqOiBUaGUgbGluaydzIHRpdGxlLlxuXG4gIF9jcmVhdGVDbGFzcyhTdHJvbmdNYXJrLCBudWxsLCBbe1xuICAgIGtleTogXCJyYW5rXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gNTI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0cm9uZ01hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5TdHJvbmdNYXJrID0gU3Ryb25nTWFyaztcblxudmFyIExpbmtNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGUzKSB7XG4gIF9pbmhlcml0cyhMaW5rTWFyaywgX01hcmtUeXBlMyk7XG5cbiAgZnVuY3Rpb24gTGlua01hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmtNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKExpbmtNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaW5rTWFyaywgbnVsbCwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDUzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaW5rTWFyaztcbn0pKF9zY2hlbWEuTWFya1R5cGUpO1xuXG5leHBvcnRzLkxpbmtNYXJrID0gTGlua01hcms7XG5cbkxpbmtNYXJrLmF0dHJpYnV0ZXMgPSB7XG4gIGhyZWY6IG5ldyBfc2NoZW1hLkF0dHJpYnV0ZSgpLFxuICB0aXRsZTogbmV3IF9zY2hlbWEuQXR0cmlidXRlKHsgXCJkZWZhdWx0XCI6IFwiXCIgfSlcbn07XG5cbi8vIDs7ICN0b2M9ZmFsc2UgVGhlIGRlZmF1bHQgY29kZSBmb250IG1hcmsgdHlwZS5cblxudmFyIENvZGVNYXJrID0gKGZ1bmN0aW9uIChfTWFya1R5cGU0KSB7XG4gIF9pbmhlcml0cyhDb2RlTWFyaywgX01hcmtUeXBlNCk7XG5cbiAgZnVuY3Rpb24gQ29kZU1hcmsoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvZGVNYXJrKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKENvZGVNYXJrLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDo6IFNjaGVtYVNwZWNcbiAgLy8gVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBkZWZhdWx0IHNjaGVtYS5cblxuICBfY3JlYXRlQ2xhc3MoQ29kZU1hcmssIFt7XG4gICAga2V5OiBcImlzQ29kZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwicmFua1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDEwMTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29kZU1hcms7XG59KShfc2NoZW1hLk1hcmtUeXBlKTtcblxuZXhwb3J0cy5Db2RlTWFyayA9IENvZGVNYXJrO1xudmFyIGRlZmF1bHRTcGVjID0gbmV3IF9zY2hlbWEuU2NoZW1hU3BlYyh7XG4gIGRvYzogRG9jLFxuICBibG9ja3F1b3RlOiBCbG9ja1F1b3RlLFxuICBvcmRlcmVkX2xpc3Q6IE9yZGVyZWRMaXN0LFxuICBidWxsZXRfbGlzdDogQnVsbGV0TGlzdCxcbiAgbGlzdF9pdGVtOiBMaXN0SXRlbSxcbiAgaG9yaXpvbnRhbF9ydWxlOiBIb3Jpem9udGFsUnVsZSxcblxuICBwYXJhZ3JhcGg6IFBhcmFncmFwaCxcbiAgaGVhZGluZzogSGVhZGluZyxcbiAgY29kZV9ibG9jazogQ29kZUJsb2NrLFxuXG4gIHRleHQ6IF9zY2hlbWEuVGV4dCxcbiAgaW1hZ2U6IEltYWdlLFxuICBoYXJkX2JyZWFrOiBIYXJkQnJlYWtcbn0sIHtcbiAgZW06IEVtTWFyayxcbiAgc3Ryb25nOiBTdHJvbmdNYXJrLFxuICBsaW5rOiBMaW5rTWFyayxcbiAgY29kZTogQ29kZU1hcmtcbn0pO1xuXG4vLyA6OiBTY2hlbWFcbi8vIFByb3NlTWlycm9yJ3MgZGVmYXVsdCBkb2N1bWVudCBzY2hlbWEuXG52YXIgZGVmYXVsdFNjaGVtYSA9IG5ldyBfc2NoZW1hLlNjaGVtYShkZWZhdWx0U3BlYyk7XG5leHBvcnRzLmRlZmF1bHRTY2hlbWEgPSBkZWZhdWx0U2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5maW5kRGlmZlN0YXJ0ID0gZmluZERpZmZTdGFydDtcbmV4cG9ydHMuZmluZERpZmZFbmQgPSBmaW5kRGlmZkVuZDtcblxudmFyIF9wb3MgPSByZXF1aXJlKFwiLi9wb3NcIik7XG5cbi8vIDo6IChOb2RlLCBOb2RlKSDihpIgP1Bvc1xuLy8gRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggbm9kZXMgYGFgIGFuZCBgYmAgZGlmZmVyLCBvclxuLy8gYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuXG5mdW5jdGlvbiBmaW5kRGlmZlN0YXJ0KGEsIGIpIHtcbiAgdmFyIHBhdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1syXTtcblxuICB2YXIgaUEgPSBhLml0ZXIoKSxcbiAgICAgIGlCID0gYi5pdGVyKCksXG4gICAgICBvZmZzZXQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKGlBLmF0RW5kKCkgfHwgaUIuYXRFbmQoKSkge1xuICAgICAgaWYgKGEuc2l6ZSA9PSBiLnNpemUpIHJldHVybiBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkQSA9IGlBLm5leHQoKSxcbiAgICAgICAgY2hpbGRCID0gaUIubmV4dCgpO1xuICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICBvZmZzZXQgKz0gY2hpbGRBLndpZHRoO2NvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSkgYnJlYWs7XG5cbiAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspIHtcbiAgICAgICAgb2Zmc2V0Kys7XG4gICAgICB9YnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkQS5zaXplIHx8IGNoaWxkQi5zaXplKSB7XG4gICAgICBwYXRoLnB1c2gob2Zmc2V0KTtcbiAgICAgIHZhciBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwYXRoKTtcbiAgICAgIGlmIChpbm5lcikgcmV0dXJuIGlubmVyO1xuICAgICAgcGF0aC5wb3AoKTtcbiAgICB9XG4gICAgb2Zmc2V0ICs9IGNoaWxkQS53aWR0aDtcbiAgfVxuICByZXR1cm4gbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCk7XG59XG5cbi8vIDo6IChOb2RlLCBOb2RlKSDihpIgP3thOiBQb3MsIGI6IFBvc31cbi8vIEZpbmQgdGhlIGZpcnN0IHBvc2l0aW9uLCBzZWFyY2hpbmcgZnJvbSB0aGUgZW5kLCBhdCB3aGljaCBub2RlcyBgYWBcbi8vIGFuZCBgYmAgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb25cbi8vIHdpbGwgbm90IGJlIHRoZSBzYW1lIGluIGJvdGggbm9kZXMsIGFuIG9iamVjdCB3aXRoIHR3byBzZXBhcmF0ZVxuLy8gcG9zaXRpb25zIGlzIHJldHVybmVkLlxuXG5mdW5jdGlvbiBmaW5kRGlmZkVuZChhLCBiKSB7XG4gIHZhciBwYXRoQSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzJdO1xuICB2YXIgcGF0aEIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDMgfHwgYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1szXTtcblxuICB2YXIgaUEgPSBhLnJldmVyc2VJdGVyKCksXG4gICAgICBpQiA9IGIucmV2ZXJzZUl0ZXIoKTtcbiAgdmFyIG9mZkEgPSBhLnNpemUsXG4gICAgICBvZmZCID0gYi5zaXplO1xuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoaUEuYXRFbmQoKSB8fCBpQi5hdEVuZCgpKSB7XG4gICAgICBpZiAoYS5zaXplID09IGIuc2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGNoaWxkQSA9IGlBLm5leHQoKSxcbiAgICAgICAgY2hpbGRCID0gaUIubmV4dCgpO1xuICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICBvZmZBIC09IGNoaWxkQS53aWR0aDtvZmZCIC09IGNoaWxkQi53aWR0aDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSkgYnJlYWs7XG5cbiAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgdmFyIHNhbWUgPSAwLFxuICAgICAgICAgIG1pblNpemUgPSBNYXRoLm1pbihjaGlsZEEudGV4dC5sZW5ndGgsIGNoaWxkQi50ZXh0Lmxlbmd0aCk7XG4gICAgICB3aGlsZSAoc2FtZSA8IG1pblNpemUgJiYgY2hpbGRBLnRleHRbY2hpbGRBLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdID09IGNoaWxkQi50ZXh0W2NoaWxkQi50ZXh0Lmxlbmd0aCAtIHNhbWUgLSAxXSkge1xuICAgICAgICBzYW1lKys7b2ZmQS0tO29mZkItLTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvZmZBIC09IGNoaWxkQS53aWR0aDtvZmZCIC09IGNoaWxkQi53aWR0aDtcbiAgICBpZiAoY2hpbGRBLnNpemUgfHwgY2hpbGRCLnNpemUpIHtcbiAgICAgIHBhdGhBLnB1c2gob2ZmQSk7cGF0aEIucHVzaChvZmZCKTtcbiAgICAgIHZhciBpbm5lciA9IGZpbmREaWZmRW5kKGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcGF0aEEsIHBhdGhCKTtcbiAgICAgIGlmIChpbm5lcikgcmV0dXJuIGlubmVyO1xuICAgICAgcGF0aEEucG9wKCk7cGF0aEIucG9wKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGE6IG5ldyBfcG9zLlBvcyhwYXRoQSwgb2ZmQSksIGI6IG5ldyBfcG9zLlBvcyhwYXRoQiwgb2ZmQikgfTtcbn0iLCIvLyA7OyBBIGZyYWdtZW50IGlzIGFuIGFic3RyYWN0IHR5cGUgdXNlZCB0byByZXByZXNlbnQgYSBub2RlJ3Ncbi8vIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuIEl0IHRyaWVzIHRvIGhpZGUgY29uc2lkZXJhdGlvbnMgYWJvdXRcbi8vIHRoZSBhY3R1YWwgd2F5IGluIHdoaWNoIHRoZSBjaGlsZCBub2RlcyBhcmUgc3RvcmVkLCBzbyB0aGF0XG4vLyBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIChub2RlcyB0aGF0IG9ubHkgY29udGFpbiBzaW1wbGUgbm9kZXNcbi8vIHZlcnN1cyBub2RlcyB0aGF0IGFsc28gY29udGFpbiB0ZXh0KSBjYW4gYmUgYXBwcm9hY2hlZCB1c2luZyB0aGVcbi8vIHNhbWUgQVBJLlxuLy9cbi8vIEZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIFRoYXQgbWVhbnMgeW91IHNob3VsZFxuLy8gX25vdF8gbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudCwgYnV0IGNyZWF0ZSBuZXcgaW5zdGFuY2VzXG4vLyB3aGVuZXZlciBuZWVkZWQuIFRoZSBBUEkgdHJpZXMgdG8gbWFrZSB0aGlzIGVhc3kuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gxNiwgX3gxNywgX3gxOCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDE2LCBwcm9wZXJ0eSA9IF94MTcsIHJlY2VpdmVyID0gX3gxODsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeDE2ID0gcGFyZW50OyBfeDE3ID0gcHJvcGVydHk7IF94MTggPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBGcmFnbWVudCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZyYWdtZW50KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGcmFnbWVudCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRnJhZ21lbnQsIFt7XG4gICAga2V5OiBcImFwcGVuZFwiLFxuXG4gICAgLy8gOjogKEZyYWdtZW50LCBudW1iZXIsIG51bWJlcikg4oaSIEZyYWdtZW50XG4gICAgLy8gQ3JlYXRlIGEgZnJhZ21lbnQgdGhhdCBjb21iaW5lcyB0aGlzIG9uZSB3aXRoIGFub3RoZXIgZnJhZ21lbnQuXG4gICAgLy8gVGFrZXMgY2FyZSBvZiBtZXJnaW5nIGFkamFjZW50IHRleHQgbm9kZXMgYW5kIGNhbiBhbHNvIG1lcmdlXG4gICAgLy8g4oCcb3BlbuKAnSBub2RlcyBhdCB0aGUgYm91bmRhcnkuIGBqb2luTGVmdGAgYW5kIGBqb2luUmlnaHRgIGdpdmUgdGhlXG4gICAgLy8gZGVwdGggdG8gd2hpY2ggdGhlIGxlZnQgYW5kIHJpZ2h0IGZyYWdtZW50cyBhcmUgb3Blbi4gSWYgb3BlblxuICAgIC8vIG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3VwIGFyZSBmb3VuZCBvbiBib3RoIHNpZGVzLCB0aGV5IGFyZVxuICAgIC8vIGpvaW5lZC4gSWYgbm90LCB0aGUgb3BlbiBub2RlcyBhcmUgW2Nsb3NlZF0oI05vZGUuY2xvc2UpLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBlbmQob3RoZXIpIHtcbiAgICAgIHZhciBqb2luTGVmdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgam9pblJpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKCF0aGlzLnNpemUpIHJldHVybiBqb2luUmlnaHQgPyBvdGhlci5yZXBsYWNlKDAsIG90aGVyLmZpcnN0Q2hpbGQuY2xvc2Uoam9pblJpZ2h0IC0gMSwgXCJzdGFydFwiKSkgOiBvdGhlcjtcbiAgICAgIGlmICghb3RoZXIuc2l6ZSkgcmV0dXJuIGpvaW5MZWZ0ID8gdGhpcy5yZXBsYWNlKHRoaXMuc2l6ZSAtIDEsIHRoaXMubGFzdENoaWxkLmNsb3NlKGpvaW5MZWZ0IC0gMSwgXCJlbmRcIikpIDogdGhpcztcbiAgICAgIHJldHVybiB0aGlzLmFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb25jYXRlbmF0ZSBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcblxuICAgIC8vIDo6ICgpIOKGkiBzdHJpbmdcbiAgICAvLyBSZXR1cm4gYSBkZWJ1Z2dpbmcgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZnJhZ21lbnQuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHN0ciArPSAoc3RyID8gXCIsIFwiIDogXCJcIikgKyBuLnRvU3RyaW5nKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgbnVtYmVyLCA/KE5vZGUpIOKGkiBOb2RlKSDihpIgW05vZGVdXG4gICAgLy8gUHJvZHVjZSBhbiBhcnJheSB3aXRoIHRoZSBjaGlsZCBub2RlcyBiZXR3ZWVuIHRoZSBnaXZlblxuICAgIC8vIGJvdW5kYXJpZXMsIG9wdGlvbmFsbHkgbWFwcGluZyBhIGZ1bmN0aW9uIG92ZXIgdGhlbS5cbiAgfSwge1xuICAgIGtleTogXCJ0b0FycmF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvQXJyYXkoZnJvbSwgdG8sIGYpIHtcbiAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQpIGZyb20gPSAwO1xuICAgICAgaWYgKHRvID09PSB1bmRlZmluZWQpIHRvID0gdGhpcy5zaXplO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBpdGVyID0gdGhpcy5pdGVyKGZyb20sIHRvKSwgbiA9IHVuZGVmaW5lZDsgbiA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICByZXN1bHQucHVzaChmID8gZihuKSA6IG4pO1xuICAgICAgfXJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKChOb2RlKSDihpIgTm9kZSkg4oaSIEZyYWdtZW50XG4gICAgLy8gUHJvZHVjZSBhIG5ldyBGcmFnbWVudCBieSBtYXBwaW5nIGFsbCB0aGlzIGZyYWdtZW50J3MgY2hpbGRyZW5cbiAgICAvLyB0aHJvdWdoIGEgZnVuY3Rpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChmKSB7XG4gICAgICAvLyBGSVhNRSBqb2luIHRleHQgbm9kZXM/XG4gICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbUFycmF5KHRoaXMudG9BcnJheSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgZikpO1xuICAgIH1cblxuICAgIC8vIDo6ICgoTm9kZSkg4oaSIGJvb2wpIOKGkiBib29sXG4gICAgLy8gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybmVkIGB0cnVlYCBmb3IgYW55IG9mXG4gICAgLy8gdGhlIGZyYWdtZW50J3MgY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwic29tZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzb21lKGYpIHtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoKSwgbiA9IHVuZGVmaW5lZDsgbiA9IGl0ZXIubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBpZiAoZihuKSkgcmV0dXJuIG47XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGRlcHRoLCBzaWRlKSB7XG4gICAgICB2YXIgY2hpbGQgPSBzaWRlID09IFwic3RhcnRcIiA/IHRoaXMuZmlyc3RDaGlsZCA6IHRoaXMubGFzdENoaWxkO1xuICAgICAgdmFyIGNsb3NlZCA9IGNoaWxkLmNsb3NlKGRlcHRoIC0gMSwgc2lkZSk7XG4gICAgICBpZiAoY2xvc2VkID09IGNoaWxkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2Uoc2lkZSA9PSBcInN0YXJ0XCIgPyAwIDogdGhpcy5zaXplIC0gMSwgY2xvc2VkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZXNCZXR3ZWVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgcGF0aCwgcGFyZW50KSB7XG4gICAgICB2YXIgbW9yZUZyb20gPSBmcm9tICYmIGZyb20uZGVwdGggPiBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBtb3JlVG8gPSB0byAmJiB0by5kZXB0aCA+IHBhdGgubGVuZ3RoO1xuICAgICAgdmFyIHN0YXJ0ID0gbW9yZUZyb20gPyBmcm9tLnBhdGhbcGF0aC5sZW5ndGhdIDogZnJvbSA/IGZyb20ub2Zmc2V0IDogMDtcbiAgICAgIHZhciBlbmQgPSBtb3JlVG8gPyB0by5wYXRoW3BhdGgubGVuZ3RoXSArIDEgOiB0byA/IHRvLm9mZnNldCA6IHRoaXMuc2l6ZTtcbiAgICAgIGZvciAodmFyIGl0ZXIgPSB0aGlzLml0ZXIoc3RhcnQsIGVuZCksIG5vZGUgPSB1bmRlZmluZWQ7IG5vZGUgPSBpdGVyLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgdmFyIHN0YXJ0T2Zmc2V0ID0gaXRlci5vZmZzZXQgLSBub2RlLndpZHRoO1xuICAgICAgICBwYXRoLnB1c2goc3RhcnRPZmZzZXQpO1xuICAgICAgICBub2RlLm5vZGVzQmV0d2Vlbihtb3JlRnJvbSAmJiBzdGFydE9mZnNldCA9PSBzdGFydCA/IGZyb20gOiBudWxsLCBtb3JlVG8gJiYgaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsLCBmLCBwYXRoLCBwYXJlbnQpO1xuICAgICAgICBwYXRoLnBvcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zKSDihpIgRnJhZ21lbnRcbiAgICAvLyBTbGljZSBvdXQgdGhlIHN1Yi1mcmFnbWVudCBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgIC8vIGBudWxsYCBjYW4gYmUgcGFzc2VkIGZvciBlaXRoZXIgdG8gaW5kaWNhdGUgdGhlIHNsaWNlIHNob3VsZCBnb1xuICAgIC8vIGFsbCB0aGUgd2F5IHRvIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZUJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICAgIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIHZhciBtb3JlRnJvbSA9IGZyb20gJiYgZnJvbS5kZXB0aCA+IGRlcHRoLFxuICAgICAgICAgIG1vcmVUbyA9IHRvICYmIHRvLmRlcHRoID4gZGVwdGg7XG4gICAgICB2YXIgc3RhcnQgPSBtb3JlRnJvbSA/IGZyb20ucGF0aFtkZXB0aF0gOiBmcm9tID8gZnJvbS5vZmZzZXQgOiAwO1xuICAgICAgdmFyIGVuZCA9IG1vcmVUbyA/IHRvLnBhdGhbZGVwdGhdICsgMSA6IHRvID8gdG8ub2Zmc2V0IDogdGhpcy5zaXplO1xuICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICBmb3IgKHZhciBpdGVyID0gdGhpcy5pdGVyKHN0YXJ0LCBlbmQpLCBub2RlID0gdW5kZWZpbmVkOyBub2RlID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICAgIHZhciBwYXNzRnJvbSA9IG1vcmVGcm9tICYmIGl0ZXIub2Zmc2V0IC0gbm9kZS53aWR0aCA9PSBzdGFydCA/IGZyb20gOiBudWxsO1xuICAgICAgICB2YXIgcGFzc1RvID0gbW9yZVRvICYmIGl0ZXIub2Zmc2V0ID09IGVuZCA/IHRvIDogbnVsbDtcbiAgICAgICAgaWYgKHBhc3NGcm9tIHx8IHBhc3NUbykgbm9kZSA9IG5vZGUuc2xpY2VCZXR3ZWVuKHBhc3NGcm9tLCBwYXNzVG8sIGRlcHRoICsgMSk7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9kZXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChTY2hlbWEsIE9iamVjdCkg4oaSIEZyYWdtZW50XG4gICAgLy8gRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInRleHRDb250ZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgdGV4dCA9IFwiXCI7XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIHRleHQgKz0gbi50ZXh0Q29udGVudDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gdGhpcy5mcm9tQXJyYXkodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKSA6IGVtcHR5RnJhZ21lbnQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtOb2RlXSkg4oaSIEZyYWdtZW50XG4gICAgLy8gQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcImZyb21BcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgIGlmICghYXJyYXkubGVuZ3RoKSByZXR1cm4gZW1wdHlGcmFnbWVudDtcbiAgICAgIHZhciBoYXNUZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJheVtpXS5pc1RleHQpIGhhc1RleHQgPSB0cnVlO1xuICAgICAgfXJldHVybiBuZXcgKGhhc1RleHQgPyBUZXh0RnJhZ21lbnQgOiBGbGF0RnJhZ21lbnQpKGFycmF5KTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+KSDihpIgRnJhZ21lbnRcbiAgICAvLyBDcmVhdGUgYSBmcmFnbWVudCBmcm9tIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNldFxuICAgIC8vIG9mIG5vZGVzLiBGb3IgYG51bGxgLCBpdCByZXR1cm5zIHRoZSBlbXB0eSBmcmFnbWVudC4gRm9yIGFcbiAgICAvLyBmcmFnbWVudCwgdGhlIGZyYWdtZW50IGl0c2VsZi4gRm9yIGEgbm9kZSBvciBhcnJheSBvZiBub2RlcywgYVxuICAgIC8vIGZyYWdtZW50IGNvbnRhaW5pbmcgdGhvc2Ugbm9kZXMuXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKG5vZGVzKSB7XG4gICAgICBpZiAoIW5vZGVzKSByZXR1cm4gZW1wdHlGcmFnbWVudDtcbiAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KSByZXR1cm4gbm9kZXM7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkoQXJyYXkuaXNBcnJheShub2RlcykgPyBub2RlcyA6IFtub2Rlc10pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGcmFnbWVudDtcbn0pKCk7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcblxudmFyIGl0ZXJFbmQgPSB7IGRvbmU6IHRydWUgfTtcblxudmFyIEZsYXRJdGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZsYXRJdGVyYXRvcihhcnJheSwgcG9zLCBlbmQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmxhdEl0ZXJhdG9yKTtcblxuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLnBvcyA9IHBvcztcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhGbGF0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSgpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LCB0aGlzLnBvcywgdGhpcy5lbmQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhdEVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdEVuZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcyA9PSB0aGlzLmVuZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zID09IHRoaXMuZW5kID8gaXRlckVuZCA6IHRoaXMuYXJyYXlbdGhpcy5wb3MrK107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGbGF0SXRlcmF0b3I7XG59KSgpO1xuXG52YXIgUmV2ZXJzZUZsYXRJdGVyYXRvciA9IChmdW5jdGlvbiAoX0ZsYXRJdGVyYXRvcikge1xuICBfaW5oZXJpdHMoUmV2ZXJzZUZsYXRJdGVyYXRvciwgX0ZsYXRJdGVyYXRvcik7XG5cbiAgZnVuY3Rpb24gUmV2ZXJzZUZsYXRJdGVyYXRvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmV2ZXJzZUZsYXRJdGVyYXRvcik7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihSZXZlcnNlRmxhdEl0ZXJhdG9yLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIDs7ICNmb3J3YXJkPUZyYWdtZW50XG5cbiAgX2NyZWF0ZUNsYXNzKFJldmVyc2VGbGF0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcIm5leHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcyA9PSB0aGlzLmVuZCA/IGl0ZXJFbmQgOiB0aGlzLmFycmF5Wy0tdGhpcy5wb3NdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXZlcnNlRmxhdEl0ZXJhdG9yO1xufSkoRmxhdEl0ZXJhdG9yKTtcblxudmFyIEZsYXRGcmFnbWVudCA9IChmdW5jdGlvbiAoX0ZyYWdtZW50KSB7XG4gIF9pbmhlcml0cyhGbGF0RnJhZ21lbnQsIF9GcmFnbWVudCk7XG5cbiAgZnVuY3Rpb24gRmxhdEZyYWdtZW50KGNvbnRlbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmxhdEZyYWdtZW50KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEZsYXRGcmFnbWVudC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgfVxuXG4gIC8vIDo6IEZyYWdtZW50XG4gIC8vIEFuIGVtcHR5IGZyYWdtZW50LiBJbnRlbmRlZCB0byBiZSByZXVzZWQgd2hlbmV2ZXIgYSBub2RlIGRvZXNuJ3RcbiAgLy8gY29udGFpbiBhbnl0aGluZyAocmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBmcmFnbWVudCBmb3JcbiAgLy8gZWFjaCBsZWFmIG5vZGUpLlxuXG4gIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgLy8gQ3JlYXRlIGEgZm9yd2FyZCBpdGVyYXRvciBvdmVyIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudC4gQW5cbiAgLy8gZXhwbGljaXQgc3RhcnQgYW5kIGVuZCBvZmZzZXQgY2FuIGJlIGdpdmVuIHRvIGhhdmUgdGhlIGl0ZXJhdG9yXG4gIC8vIGdvIG92ZXIgb25seSBwYXJ0IG9mIHRoZSBjb250ZW50LiBJZiBhbiBpdGVyYXRpb24gYm91bmQgZmFsbHNcbiAgLy8gd2l0aGluIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IHRoYXQgaXMgd2l0aGluIHRoZSBib3VuZHMgaXNcbiAgLy8geWllbGRlZC5cblxuICBfY3JlYXRlQ2xhc3MoRmxhdEZyYWdtZW50LCBbe1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoKSB7XG4gICAgICB2YXIgc3RhcnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzBdO1xuICAgICAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIG5ldyBGbGF0SXRlcmF0b3IodGhpcy5jb250ZW50LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gICAgLy8gQ3JlYXRlIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudC4gQW5cbiAgICAvLyBleHBsaWNpdCBzdGFydCBhbmQgZW5kIG9mZnNldCBjYW4gYmUgZ2l2ZW4gdG8gaGF2ZSB0aGUgaXRlcmF0b3JcbiAgICAvLyBnbyBvdmVyIG9ubHkgcGFydCBvZiB0aGUgY29udGVudC4gKipOb3RlKio6IGBzdGFydGAgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIGBlbmRgLCB3aGVuIHBhc3NlZC5cbiAgfSwge1xuICAgIGtleTogXCJyZXZlcnNlSXRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXZlcnNlSXRlcigpIHtcbiAgICAgIHZhciBzdGFydCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICByZXR1cm4gbmV3IFJldmVyc2VGbGF0SXRlcmF0b3IodGhpcy5jb250ZW50LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgbWF4aW11bSBvZmZzZXQgaW4gdGhpcyBmcmFnbWVudC5cbiAgfSwge1xuICAgIGtleTogXCJjaGlsZFwiLFxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBvZmZzZXQuIE1pZ2h0IHJldHVybiBhIHRleHQgbm9kZSB0aGF0XG4gICAgLy8gc3RyZXRjaGVzIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgdGhlIG9mZnNldC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICBpZiAob2ZmIDwgMCB8fCBvZmYgPj0gdGhpcy5jb250ZW50Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKFwiT2Zmc2V0IFwiICsgb2ZmICsgXCIgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtvZmZdO1xuICAgIH1cblxuICAgIC8vIDo6ICgobm9kZTogTm9kZSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpKVxuICAgIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUgaW4gdGhlIGZyYWdtZW50LCBwYXNzaW5nIGl0XG4gICAgLy8gdGhlIG5vZGUsIGl0cyBzdGFydCBvZmZzZXQsIGFuZCBpdHMgZW5kIG9mZnNldC5cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goZikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZih0aGlzLmNvbnRlbnRbaV0sIGksIGkgKyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldC4gUmV0dXJucyBhbiBvYmplY3RcbiAgICAvLyBjb250YWluaW5nIHRoZSBub2RlIGFzIHdlbGwgYXMgaXRzIHN0YXJ0IGluZGV4LiBPZmZzZXQgc2hvdWxkIGJlXG4gICAgLy8gZ3JlYXRlciB0aGFuIHplcm8uXG4gIH0sIHtcbiAgICBrZXk6IFwiY2h1bmtCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtCZWZvcmUob2ZmKSB7XG4gICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNoaWxkKG9mZiAtIDEpLCBzdGFydDogb2ZmIC0gMSB9O1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIpIOKGkiB7c3RhcnQ6IG51bWJlciwgbm9kZTogTm9kZX1cbiAgICAvLyBGaW5kIHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBvZmZzZXQuIFJldHVybnMgYW4gb2JqZWN0XG4gICAgLy8gY29udGFpbmluZyB0aGUgbm9kZSBhcyB3ZWxsIGFzIGl0cyBzdGFydCBpbmRleC4gT2Zmc2V0IHNob3VsZCBiZVxuICAgIC8vIGxlc3MgdGhhbiB0aGUgZnJhZ21lbnQncyBzaXplLlxuICB9LCB7XG4gICAga2V5OiBcImNodW5rQWZ0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2h1bmtBZnRlcihvZmYpIHtcbiAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY2hpbGQob2ZmKSwgc3RhcnQ6IG9mZiB9O1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIsID9udW1iZXIpIOKGkiBGcmFnbWVudFxuICAgIC8vIFJldHVybiBhIGZyYWdtZW50IHdpdGggb25seSB0aGUgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gb2Zmc2V0cy5cbiAgICAvLyBXaGVuIGB0b2AgaXMgbm90IGdpdmVuLCB0aGUgc2xpY2Ugd2lsbCBnbyB0byB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKGZyb20pIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgcmV0dXJuIG5ldyBGbGF0RnJhZ21lbnQodGhpcy5jb250ZW50LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgTm9kZSkg4oaSIEZyYWdtZW50XG4gICAgLy8gUmV0dXJuIGEgZnJhZ21lbnQgaW4gd2hpY2ggdGhlIG5vZGUgYXQgdGhlIGdpdmVuIG9mZnNldCBpc1xuICAgIC8vIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLiBUaGUgbm9kZSwgYXMgd2VsbCBhcyB0aGUgb25lIGl0XG4gICAgLy8gcmVwbGFjZXMsIHNob3VsZCBub3QgYmUgdGV4dCBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcGxhY2Uob2Zmc2V0LCBub2RlKSB7XG4gICAgICBpZiAobm9kZS5pc1RleHQpIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50IHRvIHJlcGxhY2Ugc2hvdWxkIGJlIGEgbm9uLXRleHQgbm9kZVwiKTtcbiAgICAgIHZhciBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICBjb3B5W29mZnNldF0gPSBub2RlO1xuICAgICAgcmV0dXJuIG5ldyBGbGF0RnJhZ21lbnQoY29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZElubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KSB7XG4gICAgICB2YXIgbGFzdCA9IHRoaXMuY29udGVudC5sZW5ndGggLSAxLFxuICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoMCwgbGFzdCk7XG4gICAgICB2YXIgYmVmb3JlID0gdGhpcy5jb250ZW50W2xhc3RdLFxuICAgICAgICAgIGFmdGVyID0gb3RoZXIuZmlyc3RDaGlsZDtcbiAgICAgIGlmIChqb2luTGVmdCA+IDAgJiYgam9pblJpZ2h0ID4gMCAmJiBiZWZvcmUuc2FtZU1hcmt1cChhZnRlcikpIGNvbnRlbnQucHVzaChiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIGpvaW5MZWZ0IC0gMSwgam9pblJpZ2h0IC0gMSkpO2Vsc2UgY29udGVudC5wdXNoKGJlZm9yZS5jbG9zZShqb2luTGVmdCAtIDEsIFwiZW5kXCIpLCBhZnRlci5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKTtcbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQob3RoZXIudG9BcnJheShhZnRlci53aWR0aCkpKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gICAgLy8gQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gVGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImZpcnN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyA6OiA/Tm9kZVxuICAgIC8vIFRoZSBsYXN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImxhc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRmxhdEZyYWdtZW50O1xufSkoRnJhZ21lbnQpO1xuXG52YXIgZW1wdHlGcmFnbWVudCA9IG5ldyBGbGF0RnJhZ21lbnQoW10pO1xuXG5leHBvcnRzLmVtcHR5RnJhZ21lbnQgPSBlbXB0eUZyYWdtZW50O1xuXG52YXIgVGV4dEl0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGV4dEl0ZXJhdG9yKGZyYWdtZW50LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSB7XG4gICAgdmFyIHBvcyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMyB8fCBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IC0xIDogYXJndW1lbnRzWzNdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRJdGVyYXRvcik7XG5cbiAgICB0aGlzLmZyYWcgPSBmcmFnbWVudDtcbiAgICB0aGlzLm9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgIHRoaXMucG9zID0gcG9zO1xuICAgIHRoaXMuZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHRJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZnJhZywgdGhpcy5vZmZzZXQsIHRoaXMuZW5kT2Zmc2V0LCB0aGlzLnBvcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0RW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0RW5kKCkge1xuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAodGhpcy5wb3MgPT0gLTEpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbml0KCk7XG4gICAgICAgIGlmIChzdGFydCkgcmV0dXJuIHN0YXJ0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0ID8gaXRlckVuZCA6IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZHZhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkdmFuY2UoKSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhZy5jb250ZW50W3RoaXMucG9zKytdLFxuICAgICAgICAgIGVuZCA9IHRoaXMub2Zmc2V0ICsgbm9kZS53aWR0aDtcbiAgICAgIGlmIChlbmQgPiB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICBub2RlID0gbm9kZS5jb3B5KG5vZGUudGV4dC5zbGljZSgwLCB0aGlzLmVuZE9mZnNldCAtIHRoaXMub2Zmc2V0KSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICB3aGlsZSAob2Zmc2V0IDwgdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFt0aGlzLnBvcysrXSxcbiAgICAgICAgICAgIGVuZCA9IG9mZnNldCArIG5vZGUud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPT0gdGhpcy5vZmZzZXQpIGJyZWFrO1xuICAgICAgICBpZiAoZW5kID4gdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICB2YXIgc2xpY2VFbmQgPSBub2RlLndpZHRoO1xuICAgICAgICAgIGlmIChlbmQgPiB0aGlzLmVuZE9mZnNldCkge1xuICAgICAgICAgICAgc2xpY2VFbmQgPSB0aGlzLmVuZE9mZnNldCAtIG9mZnNldDtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuZW5kT2Zmc2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZS5jb3B5KG5vZGUudGV4dC5zbGljZSh0aGlzLm9mZnNldCAtIG9mZnNldCwgc2xpY2VFbmQpKTtcbiAgICAgICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHRJdGVyYXRvcjtcbn0pKCk7XG5cbnZhciBSZXZlcnNlVGV4dEl0ZXJhdG9yID0gKGZ1bmN0aW9uIChfVGV4dEl0ZXJhdG9yKSB7XG4gIF9pbmhlcml0cyhSZXZlcnNlVGV4dEl0ZXJhdG9yLCBfVGV4dEl0ZXJhdG9yKTtcblxuICBmdW5jdGlvbiBSZXZlcnNlVGV4dEl0ZXJhdG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZXZlcnNlVGV4dEl0ZXJhdG9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFJldmVyc2VUZXh0SXRlcmF0b3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJldmVyc2VUZXh0SXRlcmF0b3IsIFt7XG4gICAga2V5OiBcImFkdmFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWR2YW5jZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5mcmFnLmNvbnRlbnRbLS10aGlzLnBvc10sXG4gICAgICAgICAgZW5kID0gdGhpcy5vZmZzZXQgLSBub2RlLndpZHRoO1xuICAgICAgaWYgKGVuZCA8IHRoaXMuZW5kT2Zmc2V0KSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMuZW5kT2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgdGhpcy5vZmZzZXQgPSBlbmQ7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdGhpcy5wb3MgPSB0aGlzLmZyYWcuY29udGVudC5sZW5ndGg7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5mcmFnLnNpemU7XG4gICAgICB3aGlsZSAob2Zmc2V0ID4gdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmZyYWcuY29udGVudFstLXRoaXMucG9zXSxcbiAgICAgICAgICAgIGVuZCA9IG9mZnNldCAtIG5vZGUud2lkdGg7XG4gICAgICAgIGlmIChlbmQgPT0gdGhpcy5vZmZzZXQpIGJyZWFrO1xuICAgICAgICBpZiAoZW5kIDwgdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICBpZiAoZW5kIDwgdGhpcy5lbmRPZmZzZXQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKHRoaXMuZW5kT2Zmc2V0IC0gZW5kLCB0aGlzLm9mZnNldCAtIGVuZCkpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5lbmRPZmZzZXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNvcHkobm9kZS50ZXh0LnNsaWNlKDAsIHRoaXMub2Zmc2V0IC0gZW5kKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZW5kO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmV2ZXJzZVRleHRJdGVyYXRvcjtcbn0pKFRleHRJdGVyYXRvcik7XG5cbnZhciBUZXh0RnJhZ21lbnQgPSAoZnVuY3Rpb24gKF9GcmFnbWVudDIpIHtcbiAgX2luaGVyaXRzKFRleHRGcmFnbWVudCwgX0ZyYWdtZW50Mik7XG5cbiAgZnVuY3Rpb24gVGV4dEZyYWdtZW50KGNvbnRlbnQsIHNpemUpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dEZyYWdtZW50KTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHRGcmFnbWVudC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB0aGlzLnNpemUgPSBzaXplIHx8IDA7XG4gICAgaWYgKHNpemUgPT0gbnVsbCkgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNpemUgKz0gY29udGVudFtpXS53aWR0aDtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dEZyYWdtZW50LCBbe1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoKSB7XG4gICAgICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB0aGlzLnNpemUgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgVGV4dEl0ZXJhdG9yKHRoaXMsIGZyb20sIHRvKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV2ZXJzZUl0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV2ZXJzZUl0ZXIoKSB7XG4gICAgICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHJldHVybiBuZXcgUmV2ZXJzZVRleHRJdGVyYXRvcih0aGlzLCBmcm9tLCB0byk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNoaWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoaWxkKG9mZikge1xuICAgICAgaWYgKG9mZiA8IDAgfHwgb2ZmID49IHRoaXMuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiT2Zmc2V0IFwiICsgb2ZmICsgXCIgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGN1ck9mZiA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jb250ZW50W2ldO1xuICAgICAgICBjdXJPZmYgKz0gY2hpbGQud2lkdGg7XG4gICAgICAgIGlmIChjdXJPZmYgPiBvZmYpIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGYpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBvZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXTtcbiAgICAgICAgZihjaGlsZCwgb2ZmLCBvZmYgKz0gY2hpbGQud2lkdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIGlmICghb2ZmKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaHVuayBiZWZvcmUgc3RhcnQgb2Ygbm9kZVwiKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXJPZmYgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY29udGVudFtpXSxcbiAgICAgICAgICAgIGVuZCA9IGN1ck9mZiArIGNoaWxkLndpZHRoO1xuICAgICAgICBpZiAoZW5kID49IG9mZikgcmV0dXJuIHsgbm9kZTogY2hpbGQsIHN0YXJ0OiBjdXJPZmYgfTtcbiAgICAgICAgY3VyT2ZmID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0FmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQWZ0ZXIob2ZmKSB7XG4gICAgICBpZiAob2ZmID09IHRoaXMuc2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2h1bmsgYWZ0ZXIgZW5kIG9mIG5vZGVcIik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgY3VyT2ZmID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sXG4gICAgICAgICAgICBlbmQgPSBjdXJPZmYgKyBjaGlsZC53aWR0aDtcbiAgICAgICAgaWYgKGVuZCA+IG9mZikgcmV0dXJuIHsgbm9kZTogY2hpbGQsIHN0YXJ0OiBjdXJPZmYgfTtcbiAgICAgICAgY3VyT2ZmID0gZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzbGljZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzbGljZSgpIHtcbiAgICAgIHZhciBmcm9tID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBlbXB0eUZyYWdtZW50O1xuICAgICAgcmV0dXJuIG5ldyBUZXh0RnJhZ21lbnQodGhpcy50b0FycmF5KGZyb20sIHRvKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlcGxhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZShvZmYsIG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmlzVGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgdG8gcmVwbGFjZSBzaG91bGQgYmUgYSBub24tdGV4dCBub2RlXCIpO1xuICAgICAgdmFyIGN1ck5vZGUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgaW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICBmb3IgKHZhciBjdXJPZmYgPSAwOyBjdXJPZmYgPCBvZmY7IGluZGV4KyspIHtcbiAgICAgICAgY3VyTm9kZSA9IHRoaXMuY29udGVudFtpbmRleF07XG4gICAgICAgIGN1ck9mZiArPSBjdXJOb2RlLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGN1ck5vZGUuaXNUZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IHJlcGxhY2UgdGV4dCBjb250ZW50IHdpdGggcmVwbGFjZSBtZXRob2RcIik7XG4gICAgICB2YXIgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgY29weVtpbmRleF0gPSBub2RlO1xuICAgICAgcmV0dXJuIG5ldyBUZXh0RnJhZ21lbnQoY29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZElubmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGVuZElubmVyKG90aGVyLCBqb2luTGVmdCwgam9pblJpZ2h0KSB7XG4gICAgICB2YXIgbGFzdCA9IHRoaXMuY29udGVudC5sZW5ndGggLSAxLFxuICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoMCwgbGFzdCk7XG4gICAgICB2YXIgYmVmb3JlID0gdGhpcy5jb250ZW50W2xhc3RdLFxuICAgICAgICAgIGFmdGVyID0gb3RoZXIuZmlyc3RDaGlsZDtcbiAgICAgIHZhciBzYW1lID0gYmVmb3JlLnNhbWVNYXJrdXAoYWZ0ZXIpO1xuICAgICAgaWYgKHNhbWUgJiYgYmVmb3JlLmlzVGV4dCkgY29udGVudC5wdXNoKGJlZm9yZS5jb3B5KGJlZm9yZS50ZXh0ICsgYWZ0ZXIudGV4dCkpO2Vsc2UgaWYgKHNhbWUgJiYgam9pbkxlZnQgPiAwICYmIGpvaW5SaWdodCA+IDApIGNvbnRlbnQucHVzaChiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIGpvaW5MZWZ0IC0gMSwgam9pblJpZ2h0IC0gMSkpO2Vsc2UgY29udGVudC5wdXNoKGJlZm9yZS5jbG9zZShqb2luTGVmdCAtIDEsIFwiZW5kXCIpLCBhZnRlci5jbG9zZShqb2luUmlnaHQgLSAxLCBcInN0YXJ0XCIpKTtcbiAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQob3RoZXIudG9BcnJheShhZnRlci53aWR0aCkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpcnN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsYXN0Q2hpbGRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgPyB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dEZyYWdtZW50O1xufSkoRnJhZ21lbnQpO1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gIC8vIDo6ICgpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAvLyBBIGZyYWdtZW50IGlzIGl0ZXJhYmxlLCBpbiB0aGUgRVM2IHNlbnNlLlxuICBGcmFnbWVudC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVyKCk7XG4gIH07XG4gIEZsYXRJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IFRleHRJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0iLCIvLyAhIVxuLy8gVGhpcyBtb2R1bGUgZGVmaW5lcyBQcm9zZU1pcnJvcidzIGRvY3VtZW50IG1vZGVsLCB0aGUgZGF0YVxuLy8gc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGFuZCBpbnNwZWN0IGNvbnRlbnQgZG9jdW1lbnRzLiBJdFxuLy8gaW5jbHVkZXM6XG4vL1xuLy8gKiBUaGUgW25vZGVdKCNOb2RlKSB0eXBlIHRoYXQgcmVwcmVzZW50cyBkb2N1bWVudCBlbGVtZW50c1xuLy9cbi8vICogVGhlIFtzY2hlbWFdKCNTY2hlbWEpIHR5cGVzIHVzZWQgdG8gdGFnIGFuZCBjb25zdHJhaW4gdGhlXG4vLyAgIGRvY3VtZW50IHN0cnVjdHVyZVxuLy9cbi8vICogVGhlIGRhdGEgdHlwZSBmb3IgZG9jdW1lbnQgW3Bvc2l0aW9uc10oI1Bvcylcbi8vXG4vLyBUaGlzIG1vZHVsZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGJyb3dzZXIgQVBJIGJlaW5nIGF2YWlsYWJsZVxuLy8gKGkuZS4geW91IGNhbiBsb2FkIGl0IGludG8gYW55IEphdmFTY3JpcHQgZW52aXJvbm1lbnQpLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9ub2RlID0gcmVxdWlyZShcIi4vbm9kZVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm9kZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfbm9kZS5Ob2RlO1xuICAgICAgICB9XG59KTtcblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJGcmFnbWVudFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhZ21lbnQuRnJhZ21lbnQ7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZW1wdHlGcmFnbWVudFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhZ21lbnQuZW1wdHlGcmFnbWVudDtcbiAgICAgICAgfVxufSk7XG5cbnZhciBfbWFyayA9IHJlcXVpcmUoXCIuL21hcmtcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1hcmtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX21hcmsuTWFyaztcbiAgICAgICAgfVxufSk7XG5cbnZhciBfc2NoZW1hID0gcmVxdWlyZShcIi4vc2NoZW1hXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFTcGVjXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuU2NoZW1hU3BlYztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTY2hlbWFcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWE7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2NoZW1hRXJyb3JcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3NjaGVtYS5TY2hlbWFFcnJvcjtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb2RlVHlwZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLk5vZGVUeXBlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuQmxvY2s7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVGV4dGJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuVGV4dGJsb2NrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIklubGluZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLklubGluZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUZXh0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWEuVGV4dDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXJrVHlwZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLk1hcmtUeXBlO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkF0dHJpYnV0ZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc2NoZW1hLkF0dHJpYnV0ZTtcbiAgICAgICAgfVxufSk7XG5cbnZhciBfZGVmYXVsdHNjaGVtYSA9IHJlcXVpcmUoXCIuL2RlZmF1bHRzY2hlbWFcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRTY2hlbWFcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuZGVmYXVsdFNjaGVtYTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEb2NcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuRG9jO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJsb2NrUXVvdGVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuQmxvY2tRdW90ZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJPcmRlcmVkTGlzdFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5PcmRlcmVkTGlzdDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJCdWxsZXRMaXN0XCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkJ1bGxldExpc3Q7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlzdEl0ZW1cIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuTGlzdEl0ZW07XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSG9yaXpvbnRhbFJ1bGVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSG9yaXpvbnRhbFJ1bGU7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUGFyYWdyYXBoXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLlBhcmFncmFwaDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIZWFkaW5nXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkhlYWRpbmc7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29kZUJsb2NrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkNvZGVCbG9jaztcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJbWFnZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5JbWFnZTtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJIYXJkQnJlYWtcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRzY2hlbWEuSGFyZEJyZWFrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZGVNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkNvZGVNYXJrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5FbU1hcms7XG4gICAgICAgIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3Ryb25nTWFya1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdHNjaGVtYS5TdHJvbmdNYXJrO1xuICAgICAgICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxpbmtNYXJrXCIsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0c2NoZW1hLkxpbmtNYXJrO1xuICAgICAgICB9XG59KTtcblxudmFyIF9wb3MgPSByZXF1aXJlKFwiLi9wb3NcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBvc1wiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcG9zLlBvcztcbiAgICAgICAgfVxufSk7XG5cbnZhciBfZGlmZiA9IHJlcXVpcmUoXCIuL2RpZmZcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmREaWZmU3RhcnRcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RpZmYuZmluZERpZmZTdGFydDtcbiAgICAgICAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmaW5kRGlmZkVuZFwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGlmZi5maW5kRGlmZkVuZDtcbiAgICAgICAgfVxufSk7IiwiLy8gOzsgQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuLy8gc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGEgdHlwZVxuLy8gYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlciBpbmZvcm1hdGlvblxuLy8gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkIHRocm91Z2ggYVxuLy8gYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuLy8gYXR0cmlidXRlcyB0aGV5IGhhdmUuXG5cInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTWFyayA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1hcmsodHlwZSwgYXR0cnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFyayk7XG5cbiAgICAvLyA6OiBNYXJrVHlwZVxuICAgIC8vIFRoZSB0eXBlIG9mIHRoaXMgbWFyay5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIC8vIDo6IE9iamVjdFxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmsuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICB9XG5cbiAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAvLyBDb252ZXJ0IHRoaXMgbWFyayB0byBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbi5cblxuICBfY3JlYXRlQ2xhc3MoTWFyaywgW3tcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgIGlmICh0aGlzLnR5cGUuaW5zdGFuY2UpIHJldHVybiB0aGlzLnR5cGUubmFtZTtcbiAgICAgIHZhciBvYmogPSB7IF86IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICBmb3IgKHZhciBhdHRyIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgb2JqW2F0dHJdID0gdGhpcy5hdHRyc1thdHRyXTtcbiAgICAgIH1yZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIC8vIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIG9yIGFub3RoZXIgb2YgaXRzIHR5cGVcbiAgICAvLyBpcyBhbHJlYWR5IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICB9LCB7XG4gICAga2V5OiBcImFkZFRvU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG90aGVyID0gc2V0W2ldO1xuICAgICAgICBpZiAob3RoZXIudHlwZSA9PSB0aGlzLnR5cGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5lcShvdGhlcikpIHJldHVybiBzZXQ7ZWxzZSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdCh0aGlzKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyLnR5cGUucmFuayA+IHRoaXMudHlwZS5yYW5rKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdCh0aGlzKS5jb25jYXQoc2V0LnNsaWNlKGkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXQuY29uY2F0KHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIC8vIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZyb21TZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSBpZiAodGhpcy5lcShzZXRbaV0pKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJblNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0luU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZXEoc2V0W2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICB9cmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChNYXJrKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaGFzIHRoZSBzYW1lIHR5cGUgYW5kIGF0dHJpYnV0ZXMgYXNcbiAgICAvLyBhbm90aGVyIG1hcmsuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgIGlmIChvdGhlci5hdHRyc1thdHRyXSAhPSB0aGlzLmF0dHJzW2F0dHJdKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSwgW01hcmtdKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0d28gc2V0cyBvZiBtYXJrcyBhcmUgaWRlbnRpY2FsLlxuICB9XSwgW3tcbiAgICBrZXk6IFwic2FtZVNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lU2V0KGEsIGIpIHtcbiAgICAgIGlmIChhID09IGIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFhW2ldLmVxKGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gOjogKD91bmlvbjxNYXJrLCBbTWFya10+KSDihpIgW01hcmtdXG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVybHkgc29ydGVkIG1hcmsgc2V0IGZyb20gbnVsbCwgYSBzaW5nbGUgbWFyaywgb3IgYW5cbiAgICAvLyB1bnNvcnRlZCBhcnJheSBvZiBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJzZXRGcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZyb20obWFya3MpIHtcbiAgICAgIGlmICghbWFya3MgfHwgbWFya3MubGVuZ3RoID09IDApIHJldHVybiBlbXB0eTtcbiAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspIHJldHVybiBbbWFya3NdO1xuICAgICAgdmFyIGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgY29weS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnR5cGUucmFuayAtIGIudHlwZS5yYW5rO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFyaztcbn0pKCk7XG5cbmV4cG9ydHMuTWFyayA9IE1hcms7XG5cbnZhciBlbXB0eSA9IFtdOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDgsIF94OSwgX3gxMCkgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeDgsIHByb3BlcnR5ID0gX3g5LCByZWNlaXZlciA9IF94MTA7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3g4ID0gcGFyZW50OyBfeDkgPSBwcm9wZXJ0eTsgX3gxMCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9mcmFnbWVudCA9IHJlcXVpcmUoXCIuL2ZyYWdtZW50XCIpO1xuXG52YXIgX21hcmsgPSByZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG52YXIgX3BvcyA9IHJlcXVpcmUoXCIuL3Bvc1wiKTtcblxudmFyIGVtcHR5QXJyYXkgPSBbXSxcbiAgICBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLy8gOzsgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcbi8vIFByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuLy8gY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuLy9cbi8vIE5vZGVzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcy4gSW5zdGVhZCBvZiBjaGFuZ2luZyB0aGVtLCB5b3Vcbi8vIGNyZWF0ZSBuZXcgb25lcyB3aXRoIHRoZSBjb250ZW50IHlvdSB3YW50LiBPbGQgb25lcyBrZWVwIHBvaW50aW5nXG4vLyBhdCB0aGUgb2xkIGRvY3VtZW50IHNoYXBlLiBUaGlzIGlzIG1hZGUgY2hlYXBlciBieSBzaGFyaW5nXG4vLyBzdHJ1Y3R1cmUgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgZGF0YSBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3aGljaCBhXG4vLyB0cmVlIHNoYXBlIGxpa2UgdGhpcyAod2l0aG91dCBiYWNrIHBvaW50ZXJzKSBtYWtlcyBlYXN5LlxuLy9cbi8vICoqTmV2ZXIqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LlxuXG52YXIgTm9kZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuXG4gICAgLy8gOjogTm9kZVR5cGVcbiAgICAvLyBUaGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBpcy5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gOjogT2JqZWN0XG4gICAgLy8gQW4gb2JqZWN0IG1hcHBpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHN0cmluZyB2YWx1ZXMuIFRoZSBraW5kIG9mXG4gICAgLy8gYXR0cmlidXRlcyBhbGxvd2VkIGFuZCByZXF1aXJlZCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbm9kZVxuICAgIC8vIHR5cGUuXG4gICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuXG4gICAgLy8gOjogRnJhZ21lbnRcbiAgICAvLyBUaGUgbm9kZSdzIGNvbnRlbnQuXG4gICAgdGhpcy5jb250ZW50ID0gY29udGVudCB8fCBfZnJhZ21lbnQuZW1wdHlGcmFnbWVudDtcblxuICAgIC8vIDo6IFtNYXJrXVxuICAgIC8vIFRoZSBtYXJrcyAodGhpbmdzIGxpa2Ugd2hldGhlciBpdCBpcyBlbXBoYXNpemVkIG9yIHBhcnQgb2YgYVxuICAgIC8vIGxpbmspIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuXG4gICAgdGhpcy5tYXJrcyA9IG1hcmtzIHx8IGVtcHR5QXJyYXk7XG4gIH1cblxuICAvLyA6OiBudW1iZXJcbiAgLy8gVGhlIHNpemUgb2YgdGhlIG5vZGUncyBjb250ZW50LCB3aGljaCBpcyB0aGUgbWF4aW11bSBvZmZzZXQgaW5cbiAgLy8gdGhlIG5vZGUuIEZvciBub2RlcyB0aGF0IGRvbid0IGNvbnRhaW4gdGV4dCwgdGhpcyBpcyBhbHNvIHRoZVxuICAvLyBudW1iZXIgb2YgY2hpbGQgbm9kZXMgdGhhdCB0aGUgbm9kZSBoYXMuXG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGUsIFt7XG4gICAga2V5OiBcImNoaWxkXCIsXG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIgTm9kZVxuICAgIC8vIFJldHJpZXZlIHRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBOb3RlIHRoYXQgdGhpcyBpcyAqKm5vdCoqXG4gICAgLy8gdGhlIGFwcHJvcHJpYXRlIHdheSB0byBsb29wIG92ZXIgYSBub2RlLiBgY2hpbGRgJ3MgY29tcGxleGl0eSBtYXlcbiAgICAvLyBiZSBub24tY29uc3RhbnQgZm9yIHNvbWUgbm9kZXMsIGFuZCBpdCB3aWxsIHJldHVybiB0aGUgc2FtZSBub2RlXG4gICAgLy8gbXVsdGlwbGUgdGltZXMgd2hlbiBjYWxsaW5nIGl0IGZvciBkaWZmZXJlbnQgb2Zmc2V0cyB3aXRoaW4gYVxuICAgIC8vIHRleHQgbm9kZS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hpbGQob2ZmKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkKG9mZik7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIsID9udW1iZXIpIOKGkiBJdGVyYXRvcjxOb2RlPlxuICAgIC8vIENyZWF0ZSBhbiBpdGVyYXRvciBvdmVyIHRoaXMgbm9kZSdzIGNoaWxkcmVuLCBvcHRpb25hbGx5IHN0YXJ0aW5nXG4gICAgLy8gYW5kIGVuZGluZyBhdCBhIGdpdmVuIG9mZnNldC5cbiAgfSwge1xuICAgIGtleTogXCJpdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXIoc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5pdGVyKHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgSXRlcmF0b3I8Tm9kZT5cbiAgICAvLyBDcmVhdGUgYSByZXZlcnNlIGl0ZXJhdG9yIChpdGVyYXRpbmcgZnJvbSB0aGUgbm9kZSdzIGVuZCB0b3dhcmRzXG4gICAgLy8gaXRzIHN0YXJ0KSBvdmVyIHRoaXMgbm9kZSdzIGNoaWxkcmVuLCBvcHRpb25hbGx5IHN0YXJ0aW5nIGFuZFxuICAgIC8vIGVuZGluZyBhdCBhIGdpdmVuIG9mZnNldC4gKipOb3RlKio6IGlmIGdpdmVuLCBgc3RhcnRgIHNob3VsZCBiZVxuICAgIC8vIGdyZWF0ZXIgdGhhbiAob3IgZXF1YWwpIHRvIGBlbmRgLlxuICB9LCB7XG4gICAga2V5OiBcInJldmVyc2VJdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJldmVyc2VJdGVyKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQucmV2ZXJzZUl0ZXIoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIHtzdGFydDogbnVtYmVyLCBub2RlOiBOb2RlfVxuICAgIC8vIEZpbmQgdGhlIG5vZGUgdGhhdCBzaXRzIGJlZm9yZSBhIGdpdmVuIG9mZnNldC4gQ2FuIGJlIHVzZWQgdG9cbiAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0IG5vZGUgY292ZXJzIGEgZ2l2ZW4gb2Zmc2V0LiBUaGUgYHN0YXJ0YFxuICAgIC8vIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGVcbiAgICAvLyByZXR1cm5lZCBub2RlLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBvZmZzZXQgMC5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0JlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaHVua0JlZm9yZShvZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY2h1bmtCZWZvcmUob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAobnVtYmVyKSDihpIge3N0YXJ0OiBudW1iZXIsIG5vZGU6IE5vZGV9XG4gICAgLy8gRmluZCB0aGUgbm9kZSB0aGF0IHNpdHMgYWZ0ZXIgYSBnaXZlbiBvZmZzZXQuIFRoZSBgc3RhcnRgXG4gICAgLy8gcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZVxuICAgIC8vIHJldHVybmVkIG5vZGUuIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIG9mZnNldFxuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJjaHVua0FmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNodW5rQWZ0ZXIob2ZmKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LmNodW5rQWZ0ZXIob2ZmKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoKG5vZGU6IE5vZGUsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSlcbiAgICAvLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBjaGlsZCBub2RlLiBUaGUgZnVuY3Rpb24gd2lsbCBiZVxuICAgIC8vIGdpdmVuIHRoZSBub2RlLCBhcyB3ZWxsIGFzIGl0cyBzdGFydCBhbmQgZW5kIG9mZnNldHMsIGFzXG4gICAgLy8gYXJndW1lbnRzLlxuICB9LCB7XG4gICAga2V5OiBcImZvckVhY2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChmKSB7XG4gICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChmKTtcbiAgICB9XG5cbiAgICAvLyA6OiBzdHJpbmdcbiAgICAvLyBDb25jYXRlbmF0ZSBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwic2FtZU1hcmt1cFwiLFxuXG4gICAgLy8gOjogKE5vZGUpIOKGkiBib29sXG4gICAgLy8gQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIC8vIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVNYXJrdXAob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSwgP09iamVjdCwgP1tNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIC8vIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgfSwge1xuICAgIGtleTogXCJoYXNNYXJrdXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzTWFya3VwKHR5cGUsIGF0dHJzLCBtYXJrcykge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmIE5vZGUuc2FtZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzIHx8IGVtcHR5QXR0cnMpICYmIF9tYXJrLk1hcmsuc2FtZVNldCh0aGlzLm1hcmtzLCBtYXJrcyB8fCBlbXB0eUFycmF5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuXG4gICAgLy8gOjogKD9GcmFnbWVudCkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSBzYW1lIG1hcmt1cCBhcyB0aGlzIG5vZGUsIGNvbnRhaW5pbmdcbiAgICAvLyB0aGUgZ2l2ZW4gY29udGVudCAob3IgZW1wdHksIGlmIG5vIGNvbnRlbnQgaXMgZ2l2ZW4pLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzBdO1xuXG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoW01hcmtdKSDihpIgTm9kZVxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlLCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBub2RlJ3Mgb3duIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgP251bWJlcikg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGVcbiAgICAvLyBnaXZlbiBvZmZzZXRzLiBJZiBgdG9gIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInNsaWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKGZyb20sIHRvKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cblxuICAgIC8vIDo6IChudW1iZXIsIG51bWJlciwgRnJhZ21lbnQpIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUgd2l0aCB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlblxuICAgIC8vIG9mZnNldHMgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGZyYWdtZW50LlxuICB9LCB7XG4gICAga2V5OiBcInNwbGljZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoZnJvbSwgdG8sIHJlcGxhY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LnNsaWNlKDAsIGZyb20pLmFwcGVuZChyZXBsYWNlKS5hcHBlbmQodGhpcy5jb250ZW50LnNsaWNlKHRvKSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChGcmFnbWVudCwgP251bWJlciwgP251bWJlcikg4oaSIE5vZGVcbiAgICAvLyBbQXBwZW5kXSgjRnJhZ21lbnQuYXBwZW5kKSB0aGUgZ2l2ZW4gZnJhZ21lbnQgdG8gdGhpcyBub2RlJ3NcbiAgICAvLyBjb250ZW50LCBhbmQgY3JlYXRlIGEgbmV3IG5vZGUgd2l0aCB0aGUgcmVzdWx0LlxuICB9LCB7XG4gICAga2V5OiBcImFwcGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBlbmQoZnJhZ21lbnQpIHtcbiAgICAgIHZhciBqb2luTGVmdCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMV07XG4gICAgICB2YXIgam9pblJpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuYXBwZW5kKGZyYWdtZW50LCBqb2luTGVmdCwgam9pblJpZ2h0KSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgTm9kZSkg4oaSIE5vZGVcbiAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBjaGlsZCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0XG4gICAgLy8gcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuICoqTm90ZSoqOiBUaGUgb2Zmc2V0IHNob3VsZCBub3QgZmFsbFxuICAgIC8vIHdpdGhpbiBhIHRleHQgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJyZXBsYWNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcGxhY2UocG9zLCBub2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5yZXBsYWNlKHBvcywgbm9kZSkpO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSwgTm9kZSkg4oaSIE5vZGVcbiAgICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIHRoZSBkZXNjZW5kYW50IGF0IGBwYXRoYCByZXBsYWNlZFxuICAgIC8vIGJ5IHRoZSBnaXZlbiByZXBsYWNlbWVudCBub2RlLiBUaGlzIHdpbGwgY29weSBhcyBtYW55IHN1Yi1ub2RlcyBhc1xuICAgIC8vIHRoZXJlIGFyZSBlbGVtZW50cyBpbiBgcGF0aGAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVwbGFjZURlZXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZURlZXAocGF0aCwgbm9kZSkge1xuICAgICAgdmFyIGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblxuICAgICAgaWYgKGRlcHRoID09IHBhdGgubGVuZ3RoKSByZXR1cm4gbm9kZTtcbiAgICAgIHZhciBwb3MgPSBwYXRoW2RlcHRoXTtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UocG9zLCB0aGlzLmNoaWxkKHBvcykucmVwbGFjZURlZXAocGF0aCwgbm9kZSwgZGVwdGggKyAxKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlciwgc3RyaW5nKSDihpIgTm9kZVxuICAgIC8vIOKAnENsb3Nl4oCdIHRoaXMgbm9kZSBieSBtYWtpbmcgc3VyZSB0aGF0LCBpZiBpdCBpcyBlbXB0eSwgYW5kIGlzIG5vdFxuICAgIC8vIGFsbG93ZWQgdG8gYmUgc28sIGl0IGhhcyBpdHMgZGVmYXVsdCBjb250ZW50IGluc2VydGVkLiBXaGVuIGRlcHRoXG4gICAgLy8gaXMgZ3JlYXRlciB0aGFuIHplcm8sIHN1Yi1ub2RlcyBhdCB0aGUgZ2l2ZW4gc2lkZSAod2hpY2ggY2FuIGJlXG4gICAgLy8gYFwic3RhcnRcImAgb3IgYFwiZW5kXCJgKSBhcmUgY2xvc2VkIHRvby4gUmV0dXJucyBpdHNlbGYgaWYgbm8gd29ya1xuICAgIC8vIGlzIG5lY2Vzc2FyeSwgb3IgYSBjbG9zZWQgY29weSBpZiBzb21ldGhpbmcgZGlkIG5lZWQgdG8gaGFwcGVuLlxuICB9LCB7XG4gICAga2V5OiBcImNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGRlcHRoLCBzaWRlKSB7XG4gICAgICBpZiAoZGVwdGggPT0gMCAmJiB0aGlzLnNpemUgPT0gMCAmJiAhdGhpcy50eXBlLmNhbkJlRW1wdHkpIHJldHVybiB0aGlzLmNvcHkodGhpcy50eXBlLmRlZmF1bHRDb250ZW50KCkpO1xuICAgICAgdmFyIGNsb3NlZENvbnRlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGVwdGggPiAwICYmIChjbG9zZWRDb250ZW50ID0gdGhpcy5jb250ZW50LmNsb3NlKGRlcHRoIC0gMSwgc2lkZSkpICE9IHRoaXMuY29udGVudCkgcmV0dXJuIHRoaXMuY29weShjbG9zZWRDb250ZW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIDo6IChbbnVtYmVyXSkg4oaSIE5vZGVcbiAgICAvLyBHZXQgdGhlIGRlc2NlbmRhbnQgbm9kZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWRcbiAgICAvLyBhcyBhIHNlcmllcyBvZiBvZmZzZXRzIGludG8gc3VjY2Vzc2l2ZWx5IGRlZXBlciBub2Rlcy5cbiAgfSwge1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdGgoX3BhdGgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlID0gdGhpczsgaSA8IF9wYXRoLmxlbmd0aDsgbm9kZSA9IG5vZGUuY2hpbGQoX3BhdGhbaV0pLCBpKyspIHt9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoUG9zKSDihpIgTm9kZVxuICAgIC8vIEdldCB0aGUgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVBZnRlcihwb3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGgocG9zLnBhdGgpLmNoaWxkKHBvcy5vZmZzZXQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXRoTm9kZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0aE5vZGVzKHBhdGgpIHtcbiAgICAgIHZhciBub2RlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChpID09IHBhdGgubGVuZ3RoKSBicmVhaztcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQocGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP2Jvb2wpIOKGkiBib29sXG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIHZhbGlkIGluIHRoaXMgbm9kZS4gV2hlblxuICAgIC8vIGByZXF1aXJlVGV4dGJsb2NrYCBpcyB0cnVlLCBvbmx5IHBvc2l0aW9ucyBpbnNpZGUgdGV4dGJsb2NrcyBhcmVcbiAgICAvLyBjb25zaWRlcmVkIHZhbGlkLlxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRQb3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNWYWxpZFBvcyhwb3MsIHJlcXVpcmVUZXh0YmxvY2spIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBub2RlID0gdGhpczs7IGkrKykge1xuICAgICAgICBpZiAoaSA9PSBwb3MucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAocmVxdWlyZVRleHRibG9jayAmJiAhbm9kZS5pc1RleHRibG9jaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBwb3Mub2Zmc2V0IDw9IG5vZGUuc2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbiA9IHBvcy5wYXRoW2ldO1xuICAgICAgICAgIGlmIChuID49IG5vZGUuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKG4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgUG9zKSDihpIge2Zyb206IFBvcywgdG86IFBvc31cbiAgICAvLyBGaW5kcyB0aGUgbmFycm93ZXN0IHNpYmxpbmcgcmFuZ2UgKHR3byBwb3NpdGlvbnMgdGhhdCBib3RoIHBvaW50XG4gICAgLy8gaW50byB0aGUgc2FtZSBub2RlKSB0aGF0IGVuY2xvc2VzIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gIH0sIHtcbiAgICBrZXk6IFwic2libGluZ1JhbmdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpYmxpbmdSYW5nZShmcm9tLCB0bykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGUgPSB0aGlzOzsgaSsrKSB7XG4gICAgICAgIGlmIChub2RlLmlzVGV4dGJsb2NrKSB7XG4gICAgICAgICAgdmFyIHBhdGggPSBmcm9tLnBhdGguc2xpY2UoMCwgaSAtIDEpLFxuICAgICAgICAgICAgICBvZmZzZXQgPSBmcm9tLnBhdGhbaSAtIDFdO1xuICAgICAgICAgIHJldHVybiB7IGZyb206IG5ldyBfcG9zLlBvcyhwYXRoLCBvZmZzZXQpLCB0bzogbmV3IF9wb3MuUG9zKHBhdGgsIG9mZnNldCArIDEpIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZyb21FbmQgPSBpID09IGZyb20ucGF0aC5sZW5ndGgsXG4gICAgICAgICAgICB0b0VuZCA9IGkgPT0gdG8ucGF0aC5sZW5ndGg7XG4gICAgICAgIHZhciBsZWZ0ID0gZnJvbUVuZCA/IGZyb20ub2Zmc2V0IDogZnJvbS5wYXRoW2ldO1xuICAgICAgICB2YXIgcmlnaHQgPSB0b0VuZCA/IHRvLm9mZnNldCA6IHRvLnBhdGhbaV07XG4gICAgICAgIGlmIChmcm9tRW5kIHx8IHRvRW5kIHx8IGxlZnQgIT0gcmlnaHQpIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IGZyb20ucGF0aC5zbGljZSgwLCBpKTtcbiAgICAgICAgICByZXR1cm4geyBmcm9tOiBuZXcgX3Bvcy5Qb3MocGF0aCwgbGVmdCksIHRvOiBuZXcgX3Bvcy5Qb3MocGF0aCwgcmlnaHQgKyAodG9FbmQgPyAwIDogMSkpIH07XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQobGVmdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOjogKD9Qb3MsID9Qb3MsIChub2RlOiBOb2RlLCBwYXRoOiBbbnVtYmVyXSwgcGFyZW50OiBOb2RlKSlcbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuIHR3byBwb3NpdGlvbnMsIGNhbGxpbmdcbiAgICAvLyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgbm9kZSwgdGhlIHBhdGggdG93YXJkcyBpdCwgYW5kIGl0cyBwYXJlbnRcbiAgICAvLyBub2RlLCBhcyBhcmd1bWVudHMuIGBmcm9tYCBhbmQgYHRvYCBtYXkgYmUgYG51bGxgIHRvIGRlbm90ZVxuICAgIC8vIHN0YXJ0aW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBvciBlbmRpbmcgYXQgaXRzIGVuZC4gTm90ZSB0aGF0XG4gICAgLy8gdGhlIHBhdGggcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBpcyBtdXRhdGVkIGFzIGl0ZXJhdGlvblxuICAgIC8vIGNvbnRpbnVlcywgc28gaWYgeW91IHdhbnQgdG8gcHJlc2VydmUgaXQsIG1ha2UgYSBjb3B5LlxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVzQmV0d2VlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgIHZhciBwYXRoID0gYXJndW1lbnRzLmxlbmd0aCA8PSAzIHx8IGFyZ3VtZW50c1szXSA9PT0gdW5kZWZpbmVkID8gW10gOiBhcmd1bWVudHNbM107XG4gICAgICB2YXIgcGFyZW50ID0gYXJndW1lbnRzLmxlbmd0aCA8PSA0IHx8IGFyZ3VtZW50c1s0XSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1s0XTtcblxuICAgICAgaWYgKGYodGhpcywgcGF0aCwgcGFyZW50KSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHBhdGgsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zLCAobm9kZTogTm9kZSwgcGF0aDogW251bWJlcl0sIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBwYXJlbnQ6IE5vZGUpKVxuICAgIC8vIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIHRoZSB0d29cbiAgICAvLyBnaXZlbiBwb3NpdGlvbnMuIFBhc3MgbnVsbCBmb3IgYGZyb21gIG9yIGB0b2AgdG8gc3RhcnQgb3IgZW5kIGF0XG4gICAgLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJpbmxpbmVOb2Rlc0JldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmKSB7XG4gICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUsIHBhdGgsIHBhcmVudCkge1xuICAgICAgICBpZiAobm9kZS5pc0lubGluZSkge1xuICAgICAgICAgIHZhciBsYXN0ID0gcGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgIGYobm9kZSwgcGF0aC5zbGljZSgwLCBsYXN0KSwgcGF0aFtsYXN0XSwgcGF0aFtsYXN0XSArIG5vZGUud2lkdGgsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zKSDihpIgTm9kZVxuICAgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgbm9kZSBjb250YWluaW5nIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlblxuICAgIC8vIGBmcm9tYCBhbmQgYHRvYC4gWW91IGNhbiBwYXNzIGBudWxsYCBmb3IgZWl0aGVyIG9mIHRoZW0gdG8gc3RhcnRcbiAgICAvLyBvciBlbmQgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJzbGljZUJldHdlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2xpY2VCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzJdO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5zbGljZUJldHdlZW4oZnJvbSwgdG8sIGRlcHRoKSk7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcykg4oaSIFtNYXJrXVxuICAgIC8vIEdldCB0aGUgbWFya3Mgb2YgdGhlIG5vZGUgYmVmb3JlIHRoZSBnaXZlbiBwb3NpdGlvbiBvciwgaWYgdGhhdFxuICAgIC8vIHBvc2l0aW9uIGlzIGF0IHRoZSBzdGFydCBvZiBhIG5vbi1lbXB0eSBub2RlLCB0aG9zZSBvZiB0aGUgbm9kZVxuICAgIC8vIGFmdGVyIGl0LlxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtzQXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya3NBdChwb3MpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhdGgocG9zLnBhdGgpO1xuICAgICAgaWYgKCFwYXJlbnQuaXNUZXh0YmxvY2sgfHwgIXBhcmVudC5zaXplKSByZXR1cm4gZW1wdHlBcnJheTtcbiAgICAgIHJldHVybiBwYXJlbnQuY2h1bmtCZWZvcmUocG9zLm9mZnNldCB8fCAxKS5ub2RlLm1hcmtzO1xuICAgIH1cblxuICAgIC8vIDo6ICg/UG9zLCA/UG9zLCBNYXJrVHlwZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgYSBtYXJrIG9mIHRoZSBnaXZlbiB0eXBlIG9jY3VycyBpbiB0aGlzIGRvY3VtZW50XG4gICAgLy8gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgfSwge1xuICAgIGtleTogXCJyYW5nZUhhc01hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmFuZ2VIYXNNYXJrKGZyb20sIHRvLCB0eXBlKSB7XG4gICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodHlwZS5pc0luU2V0KG5vZGUubWFya3MpKSBmb3VuZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSB3aGVuIHRoaXMgaXMgYSBibG9jayAobm9uLWlubGluZSBub2RlKVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG5cbiAgICAvLyA6OiAoKSDihpIgc3RyaW5nXG4gICAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgLy8gcHVycG9zZXMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSkgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZygpICsgXCIpXCI7XG4gICAgICByZXR1cm4gd3JhcE1hcmtzKHRoaXMubWFya3MsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBSZXR1cm4gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgb2JqID0geyB0eXBlOiB0aGlzLnR5cGUubmFtZSB9O1xuICAgICAgZm9yICh2YXIgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgIG9iai5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZSkgb2JqLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9KU09OKCk7XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIG9iai5tYXJrcyA9IHRoaXMubWFya3MubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBuLnRvSlNPTigpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBub2RlIG9iamVjdCBhcyBhbiBpdGVyYXRvciByZXN1bHRcbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemU7XG4gICAgfVxuXG4gICAgLy8gOjogbnVtYmVyXG4gICAgLy8gVGhlIHdpZHRoIG9mIHRoaXMgbm9kZS4gQWx3YXlzIDEgZm9yIG5vbi10ZXh0IG5vZGVzLCBhbmQgdGhlXG4gICAgLy8gbGVuZ3RoIG9mIHRoZSB0ZXh0IGZvciB0ZXh0IG5vZGVzLlxuICB9LCB7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dENvbnRlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gOjogP05vZGVcbiAgICAvLyBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RDaGlsZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkO1xuICAgIH1cblxuICAgIC8vIDo6ID9Ob2RlXG4gICAgLy8gUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgLy8gY2hpbGRyZW4uXG4gIH0sIHtcbiAgICBrZXk6IFwibGFzdENoaWxkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHRibG9jayBub2RlLCBhIGJsb2NrIG5vZGUgd2l0aCBpbmxpbmVcbiAgICAvLyBjb250ZW50LlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzVGV4dGJsb2NrO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhbiBpbmxpbmUgbm9kZSAoYSB0ZXh0IG5vZGUgb3IgYSBub2RlIHRoYXQgY2FuXG4gICAgLy8gYXBwZWFyIGFtb25nIHRleHQpLlxuICB9LCB7XG4gICAga2V5OiBcImlzSW5saW5lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLmlzSW5saW5lO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuaXNUZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgTm9kZVxuICAgIC8vIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9XSwgW3tcbiAgICBrZXk6IFwic2FtZUF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNhbWVBdHRycyhhLCBiKSB7XG4gICAgICBpZiAoYSA9PSBiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGZvciAodmFyIHByb3AgaW4gYSkge1xuICAgICAgICBpZiAoYVtwcm9wXSAhPT0gYltwcm9wXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfXJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgIHZhciB0eXBlID0gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSk7XG4gICAgICB2YXIgY29udGVudCA9IGpzb24udGV4dCAhPSBudWxsID8ganNvbi50ZXh0IDogX2ZyYWdtZW50LkZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KTtcbiAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShqc29uLmF0dHJzLCBjb250ZW50LCBqc29uLm1hcmtzICYmIGpzb24ubWFya3MubWFwKHNjaGVtYS5tYXJrRnJvbUpTT04pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZTtcbn0pKCk7XG5cbmV4cG9ydHMuTm9kZSA9IE5vZGU7XG5cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gOjogKCkg4oaSIEl0ZXJhdG9yPE5vZGU+XG4gIC8vIEEgZnJhZ21lbnQgaXMgaXRlcmFibGUsIGluIHRoZSBFUzYgc2Vuc2UuXG4gIE5vZGUucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcigpO1xuICB9O1xufVxuXG4vLyA7OyAjZm9yd2FyZD1Ob2RlXG5cbnZhciBUZXh0Tm9kZSA9IChmdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKFRleHROb2RlLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gVGV4dE5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHROb2RlKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHROb2RlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCB0eXBlLCBhdHRycywgbnVsbCwgbWFya3MpO1xuICAgIC8vIDo6ID9zdHJpbmdcbiAgICAvLyBGb3IgdGV4dCBub2RlcywgdGhpcyBjb250YWlucyB0aGUgbm9kZSdzIHRleHQgY29udGVudC5cbiAgICB0aGlzLnRleHQgPSBjb250ZW50O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHROb2RlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXh0KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMudGV4dCwgbWFya3MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgdmFyIGJhc2UgPSBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0Tm9kZS5wcm90b3R5cGUpLCBcInRvSlNPTlwiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgICAgYmFzZS50ZXh0ID0gdGhpcy50ZXh0O1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRleHRDb250ZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHROb2RlO1xufSkoTm9kZSk7XG5cbmV4cG9ydHMuVGV4dE5vZGUgPSBUZXh0Tm9kZTtcblxuZnVuY3Rpb24gd3JhcE1hcmtzKG1hcmtzLCBzdHIpIHtcbiAgZm9yICh2YXIgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgc3RyID0gbWFya3NbaV0udHlwZS5uYW1lICsgXCIoXCIgKyBzdHIgKyBcIilcIjtcbiAgfXJldHVybiBzdHI7XG59IiwiLy8gOzsgSW5zdGFuY2VzIG9mIHRoZSBgUG9zYCBjbGFzcyByZXByZXNlbnQgcG9zaXRpb25zIGluIGEgZG9jdW1lbnQuXG4vLyBBIHBvc2l0aW9uIGFuIGFycmF5IG9mIGludGVnZXJzIHRoYXQgZGVzY3JpYmUgYSBwYXRoIHRvIHRoZSB0YXJnZXRcbi8vIG5vZGUgKHNlZSBgTm9kZS5wYXRoYCkgYW5kIGFuIGludGVnZXIgb2Zmc2V0IGludG8gdGhhdCB0YXJnZXQgbm9kZS5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFBvcyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6IChwYXRoOiBbbnVtYmVyXSwgbnVtYmVyKVxuXG4gIGZ1bmN0aW9uIFBvcyhwYXRoLCBvZmZzZXQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zKTtcblxuICAgIC8vIDo6IFtudW1iZXJdIFRoZSBwYXRoIHRvIHRoZSB0YXJnZXQgbm9kZS5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIC8vIDo6IG51bWJlciBUaGUgb2Zmc2V0IGludG8gdGhlIHRhcmdldCBub2RlLlxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICB9XG5cbiAgLy8gOzsgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoIG9mIHRoZSBmb3JtXG4gIC8vIGBcIjAvMjoxMFwiYCwgd2hlcmUgdGhlIG51bWJlcnMgYmVmb3JlIHRoZSBjb2xvbiBhcmUgdGhlIHBhdGgsIGFuZFxuICAvLyB0aGUgbnVtYmVyIGFmdGVyIGl0IGlzIHRoZSBvZmZzZXQuXG5cbiAgX2NyZWF0ZUNsYXNzKFBvcywgW3tcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLmpvaW4oXCIvXCIpICsgXCI6XCIgKyB0aGlzLm9mZnNldDtcbiAgICB9XG5cbiAgICAvLyA6OiBudW1iZXJcbiAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwb3NpdGlvbidzIHBhdGguXG4gIH0sIHtcbiAgICBrZXk6IFwibWF4XCIsXG5cbiAgICAvLyA6OiAoUG9zKSDihpIgUG9zXG4gICAgLy8gUmV0dXJuIHRoZSBncmVhdGVyIG9mIHR3byBwb3NpdGlvbnMuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1heChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY21wKG90aGVyKSA+IDAgPyB0aGlzIDogb3RoZXI7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcykg4oaSIFBvc1xuICAgIC8vIFJldHVybiB0aGUgbGVzc2VyIG9mIHR3byBwb3NpdGlvbnMuXG4gIH0sIHtcbiAgICBrZXk6IFwibW1pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtbWluKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbXAob3RoZXIpIDwgMCA/IHRoaXMgOiBvdGhlcjtcbiAgICB9XG5cbiAgICAvLyA6OiAoW251bWJlcl0sIFtudW1iZXJdKSDihpIgYm9vbFxuICAgIC8vIENvbXBhcmVzIHR3byBwYXRocyBhbmQgcmV0dXJucyB0cnVlIHdoZW4gdGhleSBhcmUgdGhlIHNhbWUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY21wXCIsXG5cbiAgICAvLyA6OiAoUG9zKSDihpIgbnVtYmVyXG4gICAgLy8gQ29tcGFyZXMgdGhpcyBwb3NpdGlvbiB0byBhbm90aGVyIHBvc2l0aW9uLCBhbmQgcmV0dXJucyBhIG51bWJlci5cbiAgICAvLyBPZiB0aGlzIHJlc3VsdCBudW1iZXIsIG9ubHkgdGhlIHNpZ24gaXMgc2lnbmlmaWNhbnQuIEl0IGlzXG4gICAgLy8gbmVnYXRpdmUgaWYgdGhpcyBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gdGhlIG90aGVyIG9uZSwgemVybyBpZlxuICAgIC8vIHRoZXkgYXJlIHRoZSBzYW1lLCBhbmQgcG9zaXRpdmUgaWYgdGhpcyBwb3NpdGlvbiBpcyBncmVhdGVyLlxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbXAob3RoZXIpIHtcbiAgICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm4gMDtcbiAgICAgIHJldHVybiBQb3MuY21wKHRoaXMucGF0aCwgdGhpcy5vZmZzZXQsIG90aGVyLnBhdGgsIG90aGVyLm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3J0ZW5cIixcblxuICAgIC8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gcG9pbnRpbmcgaW50byBhIHBhcmVudCBvZiB0aGlzIHBvc2l0aW9uJ3NcbiAgICAvLyB0YXJnZXQuIFdoZW4gYHRvYCBpcyBnaXZlbiwgaXQgZGV0ZXJtaW5lcyB0aGUgbmV3IGxlbmd0aCBvZiB0aGVcbiAgICAvLyBwYXRoLiBCeSBkZWZhdWx0LCB0aGUgcGF0aCBiZWNvbWVzIG9uZSBzaG9ydGVyLiBUaGUgYG9mZnNldGBcbiAgICAvLyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIGluIHRoaXMgcGFyZW50IHRoZVxuICAgIC8vIHBvc2l0aW9uIHBvaW50cy4gQnkgZGVmYXVsdCwgaXQgcG9pbnRzIGJlZm9yZSB0aGUgb2xkIHRhcmdldC4gWW91XG4gICAgLy8gY2FuIHBhc3MgYSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBpbnRlZ2VyIHRvIG1vdmUgaXQgYmFja3dhcmQgb3JcbiAgICAvLyBmb3J3YXJkICgqKm5vdGUqKjogdGhpcyBtZXRob2QgcGVyZm9ybXMgbm8gYm91bmRzIGNoZWNraW5nKS5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvcnRlbigpIHtcbiAgICAgIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgaWYgKHRvID49IHRoaXMuZGVwdGgpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIFBvcy5zaG9ydGVuKHRoaXMucGF0aCwgdG8sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gOjogKG51bWJlcikg4oaSIFBvc1xuICAgIC8vIENyZWF0ZSBhIHBvc2l0aW9uIHdpdGggYW4gb2Zmc2V0IG1vdmVkIHJlbGF0aXZlIHRvIHRoaXNcbiAgICAvLyBwb3NpdGlvbidzIG9mZnNldC4gRm9yIGV4YW1wbGUgbW92aW5nIGAwLzE6MTBgIGJ5IGAtMmAgeWllbGRzXG4gICAgLy8gYDAvMTo4YC5cbiAgfSwge1xuICAgIGtleTogXCJtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoYnkpIHtcbiAgICAgIHJldHVybiBuZXcgUG9zKHRoaXMucGF0aCwgdGhpcy5vZmZzZXQgKyBieSk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9udW1iZXIpIOKGkiBbbnVtYmVyXVxuICAgIC8vIENvbnZlcnQgdGhpcyBwb3NpdGlvbiB0byBhbiBhcnJheSBvZiBudW1iZXJzIChpbmNsdWRpbmcgaXRzXG4gICAgLy8gb2Zmc2V0KS4gT3B0aW9uYWxseSBwYXNzIGFuIGFyZ3VtZW50IHRvIGFkanVzdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAgLy8gb2Zmc2V0LlxuICB9LCB7XG4gICAga2V5OiBcInRvUGF0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1BhdGgoKSB7XG4gICAgICB2YXIgbW92ZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIHJldHVybiB0aGlzLnBhdGguY29uY2F0KHRoaXMub2Zmc2V0ICsgbW92ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dGVuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRlbmQocG9zKSB7XG4gICAgICB2YXIgcGF0aCA9IHRoaXMucGF0aC5zbGljZSgpLFxuICAgICAgICAgIGFkZCA9IHRoaXMub2Zmc2V0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3MucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRoLnB1c2gocG9zLnBhdGhbaV0gKyBhZGQpO1xuICAgICAgICBhZGQgPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQb3MocGF0aCwgcG9zLm9mZnNldCArIGFkZCk7XG4gICAgfVxuXG4gICAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAgIC8vIENvbnZlcnQgdGhlIHBvc2l0aW9uIHRvIGEgSlNPTi1zYWZlIHJlcHJlc2VudGF0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyA6OiAoW251bWJlcl0sID9udW1iZXIpIOKGkiBQb3NcbiAgICAvLyBCdWlsZCBhIHBvc2l0aW9uIGZyb20gYW4gYXJyYXkgb2YgbnVtYmVycyAoYXMgaW5cbiAgICAvLyBbYHRvUGF0aGBdKCNQb3MudG9QYXRoKSksIHRha2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBhc1xuICAgIC8vIG9mZnNldCBhbmQgb3B0aW9uYWxseSBtb3ZpbmcgaXQgYnkgYG1vdmVgLlxuICB9LCB7XG4gICAga2V5OiBcImRlcHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXRoLmxlbmd0aDtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjbXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY21wKHBhdGhBLCBvZmZzZXRBLCBwYXRoQiwgb2Zmc2V0Qikge1xuICAgICAgdmFyIGxlbkEgPSBwYXRoQS5sZW5ndGgsXG4gICAgICAgICAgbGVuQiA9IHBhdGhCLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBlbmQgPSBNYXRoLm1pbihsZW5BLCBsZW5CKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIHZhciBkaWZmID0gcGF0aEFbaV0gLSBwYXRoQltpXTtcbiAgICAgICAgaWYgKGRpZmYgIT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgICB9XG4gICAgICBpZiAobGVuQSA+IGxlbkIpIHJldHVybiBvZmZzZXRCIDw9IHBhdGhBW2ldID8gMSA6IC0xO2Vsc2UgaWYgKGxlbkIgPiBsZW5BKSByZXR1cm4gb2Zmc2V0QSA8PSBwYXRoQltpXSA/IC0xIDogMTtlbHNlIHJldHVybiBvZmZzZXRBIC0gb2Zmc2V0QjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2FtZVBhdGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZVBhdGgocGF0aEEsIHBhdGhCKSB7XG4gICAgICBpZiAocGF0aEEubGVuZ3RoICE9IHBhdGhCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aEFbaV0gIT09IHBhdGhCW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICB9cmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3J0ZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvcnRlbihwYXRoKSB7XG4gICAgICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzFdO1xuICAgICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiB8fCBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cbiAgICAgIGlmICh0byA9PSBudWxsKSB0byA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgICAgIHJldHVybiBuZXcgUG9zKHBhdGguc2xpY2UoMCwgdG8pLCBwYXRoW3RvXSArIG9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShhcnJheSkge1xuICAgICAgdmFyIG1vdmUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzFdO1xuXG4gICAgICBpZiAoIWFycmF5Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGEgcG9zIGZyb20gYW4gZW1wdHkgYXJyYXlcIik7XG4gICAgICByZXR1cm4gbmV3IFBvcyhhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKSwgYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0gKyBtb3ZlKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgUG9zXG4gICAgLy8gQ3JlYXRlIGEgcG9zaXRpb24gZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gIH0sIHtcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oanNvbikge1xuICAgICAgcmV0dXJuIG5ldyBQb3MoanNvbi5wYXRoLCBqc29uLm9mZnNldCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvcztcbn0pKCk7XG5cbmV4cG9ydHMuUG9zID0gUG9zOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBzbGljZUl0ZXJhdG9yKGFyciwgaSkgeyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9IHJldHVybiBmdW5jdGlvbiAoYXJyLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgcmV0dXJuIGFycjsgfSBlbHNlIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpIHsgcmV0dXJuIHNsaWNlSXRlcmF0b3IoYXJyLCBpKTsgfSBlbHNlIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH0gfTsgfSkoKTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeDIsIF94MywgX3g0KSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94MiwgcHJvcGVydHkgPSBfeDMsIHJlY2VpdmVyID0gX3g0OyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94MiA9IHBhcmVudDsgX3gzID0gcHJvcGVydHk7IF94NCA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfbm9kZSA9IHJlcXVpcmUoXCIuL25vZGVcIik7XG5cbnZhciBfZnJhZ21lbnQgPSByZXF1aXJlKFwiLi9mcmFnbWVudFwiKTtcblxudmFyIF9tYXJrID0gcmVxdWlyZShcIi4vbWFya1wiKTtcblxudmFyIF91dGlsRXJyb3IgPSByZXF1aXJlKFwiLi4vdXRpbC9lcnJvclwiKTtcblxuLy8gOzsgI3RvYz1mYWxzZSBUaGUgZXhjZXB0aW9uIHR5cGUgdXNlZCB0byBzaWduYWwgc2NoZW1hLXJlbGF0ZWRcbi8vIGVycm9ycy5cblxudmFyIFNjaGVtYUVycm9yID0gKGZ1bmN0aW9uIChfUHJvc2VNaXJyb3JFcnJvcikge1xuICBfaW5oZXJpdHMoU2NoZW1hRXJyb3IsIF9Qcm9zZU1pcnJvckVycm9yKTtcblxuICBmdW5jdGlvbiBTY2hlbWFFcnJvcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2NoZW1hRXJyb3IpO1xuXG4gICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2NoZW1hRXJyb3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIFNjaGVtYUVycm9yO1xufSkoX3V0aWxFcnJvci5Qcm9zZU1pcnJvckVycm9yKTtcblxuZXhwb3J0cy5TY2hlbWFFcnJvciA9IFNjaGVtYUVycm9yO1xuXG5mdW5jdGlvbiBmaW5kS2luZHModHlwZSwgbmFtZSwgc2NoZW1hLCBvdmVycmlkZSkge1xuICBmdW5jdGlvbiBzZXQoc3ViLCBzdXApIHtcbiAgICBpZiAoc3ViIGluIHNjaGVtYS5raW5kcykge1xuICAgICAgaWYgKHNjaGVtYS5raW5kc1tzdWJdID09IHN1cCkgcmV0dXJuO1xuICAgICAgU2NoZW1hRXJyb3IucmFpc2UoXCJJbmNvbnNpc3RlbnQgc3VwZXJraW5kcyBmb3Iga2luZCBcIiArIHN1YiArIFwiOiBcIiArIHN1cCArIFwiIGFuZCBcIiArIHNjaGVtYS5raW5kc1tzdWJdKTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5zdWJLaW5kKHN1Yiwgc3VwKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJDb25mbGljdGluZyBraW5kIGhpZXJhcmNoeSB0aHJvdWdoIFwiICsgc3ViICsgXCIgYW5kIFwiICsgc3VwKTtcbiAgICBzY2hlbWEua2luZHNbc3ViXSA9IHN1cDtcbiAgfVxuXG4gIGZvciAodmFyIGN1ciA9IHR5cGU7OyBjdXIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VyKSkge1xuICAgIHZhciBjdXJLaW5kID0gb3ZlcnJpZGUgIT0gbnVsbCAmJiBjdXIgPT0gdHlwZSA/IG92ZXJyaWRlIDogY3VyLmtpbmQ7XG4gICAgaWYgKGN1cktpbmQgIT0gbnVsbCkge1xuICAgICAgdmFyIF8kJGV4ZWMgPSAvXiguKj8pKFxcLik/JC8uZXhlYyhjdXJLaW5kKTtcblxuICAgICAgdmFyIF8kJGV4ZWMyID0gX3NsaWNlZFRvQXJyYXkoXyQkZXhlYywgMyk7XG5cbiAgICAgIHZhciBfID0gXyQkZXhlYzJbMF07XG4gICAgICB2YXIga2luZCA9IF8kJGV4ZWMyWzFdO1xuICAgICAgdmFyIGVuZCA9IF8kJGV4ZWMyWzJdO1xuXG4gICAgICBpZiAoa2luZCkge1xuICAgICAgICBzZXQobmFtZSwga2luZCk7XG4gICAgICAgIG5hbWUgPSBraW5kO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBzZXQobmFtZSwgbnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gOzsgTm9kZSB0eXBlcyBhcmUgb2JqZWN0cyBhbGxvY2F0ZWQgb25jZSBwZXIgYFNjaGVtYWBcbi8vIGFuZCB1c2VkIHRvIHRhZyBgTm9kZWAgaW5zdGFuY2VzIHdpdGggYSB0eXBlLiBUaGV5IGFyZVxuLy8gaW5zdGFuY2VzIG9mIHN1Yi10eXBlcyBvZiB0aGlzIGNsYXNzLCBhbmQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dFxuLy8gdGhlIG5vZGUgdHlwZSAoaXRzIG5hbWUsIGl0cyBhbGxvd2VkIGF0dHJpYnV0ZXMsIG1ldGhvZHMgZm9yXG4vLyBzZXJpYWxpemluZyBpdCB0byB2YXJpb3VzIGZvcm1hdHMsIGluZm9ybWF0aW9uIHRvIGd1aWRlXG4vLyBkZXNlcmlhbGl6YXRpb24sIGFuZCBzbyBvbikuXG5cbnZhciBOb2RlVHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGVUeXBlKG5hbWUsIGNvbnRhaW5zLCBhdHRycywgc2NoZW1hKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGVUeXBlKTtcblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIFRoZSBuYW1lIHRoZSBub2RlIHR5cGUgaGFzIGluIHRoaXMgc2NoZW1hLlxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgLy8gOjogP3N0cmluZ1xuICAgIC8vIFRoZSBraW5kIG9mIG5vZGVzIHRoaXMgbm9kZSBtYXkgY29udGFpbi4gYG51bGxgIG1lYW5zIGl0J3MgYVxuICAgIC8vIGxlYWYgbm9kZS5cbiAgICB0aGlzLmNvbnRhaW5zID0gY29udGFpbnM7XG4gICAgLy8gOjogT2JqZWN0PEF0dHJpYnV0ZT5cbiAgICAvLyBUaGUgYXR0cmlidXRlcyBhbGxvd2VkIG9uIHRoaXMgbm9kZSB0eXBlLlxuICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBBIGxpbmsgYmFjayB0byB0aGUgYFNjaGVtYWAgdGhlIG5vZGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuZGVmYXVsdEF0dHJzID0gZ2V0RGVmYXVsdEF0dHJzKGF0dHJzKTtcbiAgfVxuXG4gIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gIC8vIFRoZSBkZWZhdWx0IHNldCBvZiBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIGEgZ2l2ZW4gdHlwZS4gTm90ZVxuICAvLyB0aGF0IHNjaGVtYXMgbWF5IGFkZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5zdGFuY2VzIG9mIHRoZVxuICAvLyB0eXBlLlxuXG4gIC8vIDo6IGJvb2xcbiAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgYmxvY2sgdHlwZS5cblxuICBfY3JlYXRlQ2xhc3MoTm9kZVR5cGUsIFt7XG4gICAga2V5OiBcImNhbkNvbnRhaW5GcmFnbWVudFwiLFxuXG4gICAgLy8gOjogKEZyYWdtZW50KSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgY291bGQgYmUgY29udGFpbmVkXG4gICAgLy8gaW4gdGhpcyBub2RlIHR5cGUuXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5GcmFnbWVudChmcmFnbWVudCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIG9rID0gdHJ1ZTtcbiAgICAgIGZyYWdtZW50LmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKCFfdGhpcy5jYW5Db250YWluKG4pKSBvayA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2s7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGUpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGNvdWxkIGJlIGNvbnRhaW5lZCBpbiB0aGlzIG5vZGUgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJjYW5Db250YWluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW4obm9kZSkge1xuICAgICAgaWYgKCF0aGlzLmNhbkNvbnRhaW5UeXBlKG5vZGUudHlwZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXRoaXMuY2FuQ29udGFpbk1hcmsobm9kZS5tYXJrc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1yZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTWFyaykg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW5cbiAgICAvLyBtYXJrLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5NYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5NYXJrKG1hcmspIHtcbiAgICAgIHZhciBjb250YWlucyA9IHRoaXMuY29udGFpbnNNYXJrcztcbiAgICAgIGlmIChjb250YWlucyA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoY29udGFpbnMpIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGFpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zW2ldID09IG1hcmsubmFtZSkgcmV0dXJuIHRydWU7XG4gICAgICB9cmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgY2FuIGNvbnRhaW4gbm9kZXMgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5UeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5UeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5zdWJLaW5kKHR5cGUubmFtZSwgdGhpcy5jb250YWlucyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGVUeXBlKSDihpIgYm9vbFxuICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgbm9kZXMgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBub2RlXG4gICAgLy8gdHlwZSBhcmUgYSBzdWItdHlwZSBvZiB0aGUgbm9kZXMgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluIHRoaXNcbiAgICAvLyB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImNhbkNvbnRhaW5Db250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbkNvbnRhaW5Db250ZW50KHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5zdWJLaW5kKHR5cGUuY29udGFpbnMsIHRoaXMuY29udGFpbnMpO1xuICAgIH1cblxuICAgIC8vIDo6IChOb2RlVHlwZSkg4oaSIFtOb2RlVHlwZV1cbiAgICAvLyBGaW5kIGEgc2V0IG9mIGludGVybWVkaWF0ZSBub2RlIHR5cGVzLCBwb3NzaWJseSBlbXB0eSwgdGhhdCBoYXZlXG4gICAgLy8gdG8gYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGlzIHR5cGUgYW5kIGBvdGhlcmAgdG8gcHV0IGEgbm9kZSBvZlxuICAgIC8vIHR5cGUgYG90aGVyYCBpbnRvIHRoaXMgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJmaW5kQ29ubmVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kQ29ubmVjdGlvbihvdGhlcikge1xuICAgICAgLy8gRklYTUUgc29tZWhvdyBkZWZpbmUgYW4gb3JkZXIgaW4gd2hpY2ggdGhlc2UgYXJlIHRyaWVkXG4gICAgICBpZiAodGhpcy5jYW5Db250YWluVHlwZShvdGhlcikpIHJldHVybiBbXTtcblxuICAgICAgdmFyIHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdmFyIGFjdGl2ZSA9IFt7IGZyb206IHRoaXMsIHZpYTogW10gfV07XG4gICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IGFjdGl2ZS5zaGlmdCgpO1xuICAgICAgICBmb3IgKHZhciBfbmFtZSBpbiB0aGlzLnNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgIHZhciB0eXBlID0gdGhpcy5zY2hlbWEubm9kZXNbX25hbWVdO1xuICAgICAgICAgIGlmICh0eXBlLmRlZmF1bHRBdHRycyAmJiAhKHR5cGUuY29udGFpbnMgaW4gc2VlbikgJiYgY3VycmVudC5mcm9tLmNhbkNvbnRhaW5UeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICB2YXIgdmlhID0gY3VycmVudC52aWEuY29uY2F0KHR5cGUpO1xuICAgICAgICAgICAgaWYgKHR5cGUuY2FuQ29udGFpblR5cGUob3RoZXIpKSByZXR1cm4gdmlhO1xuICAgICAgICAgICAgYWN0aXZlLnB1c2goeyBmcm9tOiB0eXBlLCB2aWE6IHZpYSB9KTtcbiAgICAgICAgICAgIHNlZW5bdHlwZS5jb250YWluc10gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEF0dHJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpIHtcbiAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5kZWZhdWx0QXR0cnMpIHJldHVybiB0aGlzLmRlZmF1bHRBdHRycztlbHNlIHJldHVybiBfYnVpbGRBdHRycyh0aGlzLmF0dHJzLCBhdHRycywgdGhpcywgY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gOjogKD9PYmplY3QsID9GcmFnbWVudCwgP1tNYXJrXSkg4oaSIE5vZGVcbiAgICAvLyBDcmVhdGUgYSBgTm9kZWAgb2YgdGhpcyB0eXBlLiBUaGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmVcbiAgICAvLyBjaGVja2VkIGFuZCBkZWZhdWx0ZWQgKHlvdSBjYW4gcGFzcyBgbnVsbGAgdG8gdXNlIHRoZSB0eXBlJ3NcbiAgICAvLyBkZWZhdWx0cyBlbnRpcmVseSwgaWYgbm8gcmVxdWlyZWQgYXR0cmlidXRlcyBleGlzdCkuIGBjb250ZW50YFxuICAgIC8vIG1heSBiZSBhIGBGcmFnbWVudGAsIGEgbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIG9yXG4gICAgLy8gYG51bGxgLiBTaW1pbGFybHkgYG1hcmtzYCBtYXkgYmUgYG51bGxgIHRvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4gICAgLy8gc2V0IG9mIG1hcmtzLlxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IF9ub2RlLk5vZGUodGhpcywgdGhpcy5idWlsZEF0dHJzKGF0dHJzLCBjb250ZW50KSwgX2ZyYWdtZW50LkZyYWdtZW50LmZyb20oY29udGVudCksIF9tYXJrLk1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVBdXRvRmlsbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVBdXRvRmlsbChhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgIGlmICgoIWNvbnRlbnQgfHwgY29udGVudC5sZW5ndGggPT0gMCkgJiYgIXRoaXMuY2FuQmVFbXB0eSkgY29udGVudCA9IHRoaXMuZGVmYXVsdENvbnRlbnQoKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBhbGxvd2VkIHRvIGJlIGVtcHR5LlxuICB9LCB7XG4gICAga2V5OiBcImlzQmxvY2tcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgdGV4dGJsb2NrIHR5cGUsIGEgYmxvY2sgdGhhdCBjb250YWlucyBpbmxpbmVcbiAgICAvLyBjb250ZW50LlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dGJsb2NrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogYm9vbFxuICAgIC8vIFRydWUgaWYgdGhpcyBpcyBhbiBpbmxpbmUgdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJpc0lubGluZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBUcnVlIGlmIHRoaXMgaXMgdGhlIHRleHQgbm9kZSB0eXBlLlxuICB9LCB7XG4gICAga2V5OiBcImlzVGV4dFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDo6IGJvb2xcbiAgICAvLyBDb250cm9scyB3aGV0aGVyIG5vZGVzIG9mIHRoaXMgdHlwZSBjYW4gYmUgc2VsZWN0ZWQgKGFzIGEgdXNlclxuICAgIC8vIG5vZGUgc2VsZWN0aW9uKS5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RhYmxlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyA6OiBib29sXG4gICAgLy8gQ29udHJvbHMgd2hldGhlciB0aGlzIG5vZGUgdHlwZSBpcyBsb2NrZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwibG9ja2VkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gQ29udHJvbHMgdGhlIF9raW5kXyBvZiB0aGUgbm9kZSwgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgdmFsaWRcbiAgICAvLyBwYXJlbnQvY2hpbGQgcmVsYXRpb25zLiBDYW4gYmUgYSB3b3JkLCB3aGljaCBhZGRzIHRoYXQga2luZCB0b1xuICAgIC8vIHRoZSBzZXQgb2Yga2luZHMgb2YgdGhlIHN1cGVyY2xhc3MsIGEgd29yZCBmb2xsb3dlZCBieSBhIGRvdCwgdG9cbiAgICAvLyBpZ25vcmUgdGhlIGtpbmRzIG9mIHRoZSBzdXBlcmNsYXNzIGFuZCB1c2Ugb25seSB0aGF0IHdvcmQgKGFsb25nXG4gICAgLy8gd2l0aCB0aGUgbm9kZSdzIG5hbWUpIGFzIGtpbmQsIG9yIG9ubHkgYSBkb3QsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAgLy8gb25seSBraW5kIHRoZSBub2RlIGhhcyBpcyBpdHMgb3duIG5hbWUuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2FuQmVFbXB0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcblxuICAgIC8vIDo6IHVuaW9uPGJvb2wsIFtzdHJpbmddPlxuICAgIC8vIFRoZSBtYXJrIHR5cGVzIHRoYXQgY2hpbGQgbm9kZXMgb2YgdGhpcyBub2RlIG1heSBoYXZlLiBgZmFsc2VgXG4gICAgLy8gbWVhbnMgbm8gbWFya3MsIGB0cnVlYCBtZWFucyBhbnkgbWFyaywgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAvLyBjYW4gYmUgdXNlZCB0byBleHBsaWNpdGx5IGxpc3QgdGhlIGFsbG93ZWQgbWFyayB0eXBlcy5cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJjb21waWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBpbGUodHlwZXMsIHNjaGVtYSkge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBmb3IgKHZhciBfbmFtZTIgaW4gdHlwZXMpIHtcbiAgICAgICAgdmFyIGluZm8gPSB0eXBlc1tfbmFtZTJdO1xuICAgICAgICB2YXIgdHlwZSA9IGluZm8udHlwZSB8fCBTY2hlbWFFcnJvci5yYWlzZShcIk1pc3Npbmcgbm9kZSB0eXBlIGZvciBcIiArIF9uYW1lMik7XG4gICAgICAgIGZpbmRLaW5kcyh0eXBlLCBfbmFtZTIsIHNjaGVtYSwgaW5mby5raW5kKTtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gXCJjb250YWluc1wiIGluIGluZm8gPyBpbmZvLmNvbnRhaW5zIDogdHlwZS5jb250YWlucztcbiAgICAgICAgdmFyIGF0dHJzID0gdHlwZS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoaW5mby5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgYXR0cnMgPSBjb3B5T2JqKGF0dHJzKTtcbiAgICAgICAgICBmb3IgKHZhciBhTmFtZSBpbiBpbmZvLmF0dHJpYnV0ZXMpIGF0dHJzW2FOYW1lXSA9IGluZm8uYXR0cmlidXRlc1thTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W19uYW1lMl0gPSBuZXcgdHlwZShfbmFtZTIsIGNvbnRhaW5zLCBhdHRycywgc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9uYW1lMyBpbiByZXN1bHQpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5zID0gcmVzdWx0W19uYW1lM10uY29udGFpbnM7XG4gICAgICAgIGlmIChjb250YWlucyAmJiAhKGNvbnRhaW5zIGluIHNjaGVtYS5raW5kcykpIFNjaGVtYUVycm9yLnJhaXNlKFwiTm9kZSB0eXBlIFwiICsgX25hbWUzICsgXCIgaXMgc3BlY2lmaWVkIHRvIGNvbnRhaW4gbm9uLWV4aXN0aW5nIGtpbmQgXCIgKyBjb250YWlucyk7XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3VsdC5kb2MpIFNjaGVtYUVycm9yLnJhaXNlKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ2RvYycgdHlwZVwiKTtcbiAgICAgIGlmICghcmVzdWx0LnRleHQpIFNjaGVtYUVycm9yLnJhaXNlKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ3RleHQnIHR5cGVcIik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKHN0cmluZywgKilcbiAgICAvLyBSZWdpc3RlciBhbiBlbGVtZW50IGluIHRoaXMgdHlwZSdzIHJlZ2lzdHJ5LiBUaGF0IGlzLCBhZGQgYHZhbHVlYFxuICAgIC8vIHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYG5hbWVgIGluIHRoZSByZWdpc3RyeSBzdG9yZWQgaW5cbiAgICAvLyB0eXBlJ3MgYHByb3RvdHlwZWAuIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gYXR0YWNoIHRoaW5ncyBsaWtlXG4gICAgLy8gY29tbWFuZHMgYW5kIHBhcnNpbmcgc3RyYXRlZ2llcyB0byBub2RlIHR5cGVzLiBTZWUgYFNjaGVtYS5yZWdpc3RyeWAuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciByZWdpc3RyeSA9IHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwicmVnaXN0cnlcIikgPyB0aGlzLnByb3RvdHlwZS5yZWdpc3RyeSA6IHRoaXMucHJvdG90eXBlLnJlZ2lzdHJ5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsocmVnaXN0cnlbbmFtZV0gfHwgKHJlZ2lzdHJ5W25hbWVdID0gW10pKS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlVHlwZTtcbn0pKCk7XG5cbmV4cG9ydHMuTm9kZVR5cGUgPSBOb2RlVHlwZTtcbk5vZGVUeXBlLmF0dHJpYnV0ZXMgPSB7fTtcblxuLy8gOzsgI3RvYz1mYWxzZSBCYXNlIHR5cGUgZm9yIGJsb2NrIG5vZGV0eXBlcy5cblxudmFyIEJsb2NrID0gKGZ1bmN0aW9uIChfTm9kZVR5cGUpIHtcbiAgX2luaGVyaXRzKEJsb2NrLCBfTm9kZVR5cGUpO1xuXG4gIGZ1bmN0aW9uIEJsb2NrKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCbG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCbG9jay5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIEJhc2UgdHlwZSBmb3IgdGV4dGJsb2NrIG5vZGUgdHlwZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKEJsb2NrLCBbe1xuICAgIGtleTogXCJkZWZhdWx0Q29udGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0Q29udGVudCgpIHtcbiAgICAgIHZhciBpbm5lciA9IHRoaXMuc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkuY3JlYXRlKCk7XG4gICAgICB2YXIgY29ubiA9IHRoaXMuZmluZENvbm5lY3Rpb24oaW5uZXIudHlwZSk7XG4gICAgICBpZiAoIWNvbm4pIFNjaGVtYUVycm9yLnJhaXNlKFwiQ2FuJ3QgY3JlYXRlIGRlZmF1bHQgY29udGVudCBmb3IgXCIgKyB0aGlzLm5hbWUpO1xuICAgICAgZm9yICh2YXIgaSA9IGNvbm4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaW5uZXIgPSBjb25uW2ldLmNyZWF0ZShudWxsLCBpbm5lcik7XG4gICAgICB9cmV0dXJuIF9mcmFnbWVudC5GcmFnbWVudC5mcm9tKGlubmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNCbG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkJlRW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zID09IG51bGw7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiY29udGFpbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtpbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImJsb2NrLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCbG9jaztcbn0pKE5vZGVUeXBlKTtcblxuZXhwb3J0cy5CbG9jayA9IEJsb2NrO1xuXG52YXIgVGV4dGJsb2NrID0gKGZ1bmN0aW9uIChfQmxvY2spIHtcbiAgX2luaGVyaXRzKFRleHRibG9jaywgX0Jsb2NrKTtcblxuICBmdW5jdGlvbiBUZXh0YmxvY2soKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHRibG9jayk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0YmxvY2sucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBCYXNlIHR5cGUgZm9yIGlubGluZSBub2RlIHR5cGVzLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0YmxvY2ssIFt7XG4gICAga2V5OiBcImNvbnRhaW5zTWFya3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1RleHRibG9ja1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbkJlRW1wdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpbmxpbmVcIjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dGJsb2NrO1xufSkoQmxvY2spO1xuXG5leHBvcnRzLlRleHRibG9jayA9IFRleHRibG9jaztcblxudmFyIElubGluZSA9IChmdW5jdGlvbiAoX05vZGVUeXBlMikge1xuICBfaW5oZXJpdHMoSW5saW5lLCBfTm9kZVR5cGUyKTtcblxuICBmdW5jdGlvbiBJbmxpbmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIElubGluZSk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihJbmxpbmUucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gOzsgI3RvYz1mYWxzZSBUaGUgdGV4dCBub2RlIHR5cGUuXG5cbiAgX2NyZWF0ZUNsYXNzKElubGluZSwgW3tcbiAgICBrZXk6IFwiaXNJbmxpbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNvbnRhaW5zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwia2luZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaW5saW5lLlwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBJbmxpbmU7XG59KShOb2RlVHlwZSk7XG5cbmV4cG9ydHMuSW5saW5lID0gSW5saW5lO1xuXG52YXIgVGV4dCA9IChmdW5jdGlvbiAoX0lubGluZSkge1xuICBfaW5oZXJpdHMoVGV4dCwgX0lubGluZSk7XG5cbiAgZnVuY3Rpb24gVGV4dCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dCk7XG5cbiAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZXh0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIEF0dHJpYnV0ZSBkZXNjcmlwdG9yc1xuXG4gIC8vIDs7IEF0dHJpYnV0ZXMgYXJlIG5hbWVkIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIGFuZCBtYXJrcy5cbiAgLy8gRWFjaCBub2RlIHR5cGUgb3IgbWFyayB0eXBlIGhhcyBhIGZpeGVkIHNldCBvZiBhdHRyaWJ1dGVzLCB3aGljaFxuICAvLyBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdXNlZCB0byBjb250cm9sLlxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0LCBbe1xuICAgIGtleTogXCJjcmVhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBfbm9kZS5UZXh0Tm9kZSh0aGlzLCB0aGlzLmJ1aWxkQXR0cnMoYXR0cnMsIGNvbnRlbnQpLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdGFibGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNUZXh0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dDtcbn0pKElubGluZSk7XG5cbmV4cG9ydHMuVGV4dCA9IFRleHQ7XG5cbnZhciBBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoT2JqZWN0KVxuICAvLyBDcmVhdGUgYW4gYXR0cmlidXRlLiBgb3B0aW9uc2AgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlXG4gIC8vIHNldHRpbmdzIGZvciB0aGUgYXR0cmlidXRlcy4gVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmVcbiAgLy8gc3VwcG9ydGVkOlxuICAvL1xuICAvLyAqKmBkZWZhdWx0YCoqOiBgP3N0cmluZ2BcbiAgLy8gOiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRvIGNob29zZSB3aGVuIG5vXG4gIC8vICAgZXhwbGljaXQgdmFsdWUgaXMgcHJvdmlkZWQuXG4gIC8vXG4gIC8vICoqYGNvbXB1dGVgKio6IGA/KEZyYWdtZW50KSDihpIgc3RyaW5nYFxuICAvLyA6IEEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgZnJvbVxuICAvLyAgIHRoZSBub2RlJ3MgY29udGVudC5cbiAgLy9cbiAgLy8gQXR0cmlidXRlcyB0aGF0IGhhdmUgbm8gZGVmYXVsdCBvciBjb21wdXRlIHByb3BlcnR5IG11c3QgYmVcbiAgLy8gcHJvdmlkZWQgd2hlbmV2ZXIgYSBub2RlIG9yIG1hcmsgb2YgYSB0eXBlIHRoYXQgaGFzIHRoZW0gaXNcbiAgLy8gY3JlYXRlZC5cblxuICBmdW5jdGlvbiBBdHRyaWJ1dGUoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdHRyaWJ1dGUpO1xuXG4gICAgdGhpc1tcImRlZmF1bHRcIl0gPSBvcHRpb25zW1wiZGVmYXVsdFwiXTtcbiAgICB0aGlzLmNvbXB1dGUgPSBvcHRpb25zLmNvbXB1dGU7XG4gICAgdGhpcy5yZWdpc3RyeSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyBNYXJrc1xuXG4gIC8vIDs7IExpa2Ugbm9kZXMsIG1hcmtzICh3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIHRvIHNpZ25pZnlcbiAgLy8gdGhpbmdzIGxpa2UgZW1waGFzaXMgb3IgYmVpbmcgcGFydCBvZiBhIGxpbmspIGFyZSB0YWdnZWQgd2l0aCB0eXBlXG4gIC8vIG9iamVjdHMsIHdoaWNoIGFyZSBpbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG5cbiAgLy8gOjogKHN0cmluZywgKilcbiAgLy8gUmVnaXN0ZXIgYSB2YWx1ZSBpbiB0aGlzIGF0dHJpYnV0ZSdzIHJlZ2lzdHJ5LiBTZWVcbiAgLy8gYE5vZGVUeXBlLnJlZ2lzdGVyYCBhbmQgYFNjaGVtYS5yZWdpc3RyeWAuXG5cbiAgX2NyZWF0ZUNsYXNzKEF0dHJpYnV0ZSwgW3tcbiAgICBrZXk6IFwicmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXIobmFtZSwgdmFsdWUpIHtcbiAgICAgIDsodGhpcy5yZWdpc3RyeVtuYW1lXSB8fCAodGhpcy5yZWdpc3RyeVtuYW1lXSA9IFtdKSkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEF0dHJpYnV0ZTtcbn0pKCk7XG5cbmV4cG9ydHMuQXR0cmlidXRlID0gQXR0cmlidXRlO1xuXG52YXIgTWFya1R5cGUgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXJrVHlwZShuYW1lLCBhdHRycywgcmFuaywgc2NoZW1hKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hcmtUeXBlKTtcblxuICAgIC8vIDo6IHN0cmluZ1xuICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBtYXJrIHR5cGUuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAvLyA6OiBPYmplY3Q8QXR0cmlidXRlPlxuICAgIC8vIFRoZSBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIHR5cGUgb2YgbWFyay5cbiAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICAvLyA6OiBTY2hlbWFcbiAgICAvLyBUaGUgc2NoZW1hIHRoYXQgdGhpcyBtYXJrIHR5cGUgaW5zdGFuY2UgaXMgcGFydCBvZi5cbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB2YXIgZGVmYXVsdHMgPSBnZXREZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzICYmIG5ldyBfbWFyay5NYXJrKHRoaXMsIGRlZmF1bHRzKTtcbiAgfVxuXG4gIC8vIDo6IE9iamVjdDxBdHRyaWJ1dGU+XG4gIC8vIFRoZSBkZWZhdWx0IHNldCBvZiBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIGEgbWFyayB0eXBlLiBCeVxuICAvLyBkZWZhdWx0LCB0aGlzIHJldHVybnMgYW4gZW1wdHkgb2JqZWN0LlxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBNYXJrIHR5cGUgcmFua3MgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBtYXJrXG4gIC8vIGFycmF5cyBhcmUgc29ydGVkLiAoSWYgbXVsdGlwbGUgbWFyayB0eXBlcyBlbmQgdXAgd2l0aCB0aGUgc2FtZVxuICAvLyByYW5rLCB0aGV5IHN0aWxsIGdldCBhIGZpeGVkIG9yZGVyIGluIHRoZSBzY2hlbWEsIGJ1dCB0aGVyZSdzIG5vXG4gIC8vIGd1YXJhbnRlZSB3aGF0IGl0IHdpbGwgYmUuKVxuXG4gIF9jcmVhdGVDbGFzcyhNYXJrVHlwZSwgW3tcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTWFya1xuICAgIC8vIENyZWF0ZSBhIG1hcmsgb2YgdGhpcyB0eXBlLiBgYXR0cnNgIG1heSBiZSBgbnVsbGAgb3IgYW4gb2JqZWN0XG4gICAgLy8gY29udGFpbmluZyBvbmx5IHNvbWUgb2YgdGhlIG1hcmsncyBhdHRyaWJ1dGVzLiBUaGUgb3RoZXJzLCBpZlxuICAgIC8vIHRoZXkgaGF2ZSBkZWZhdWx0cywgd2lsbCBiZSBhZGRlZC5cbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlKGF0dHJzKSB7XG4gICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIG5ldyBfbWFyay5NYXJrKHRoaXMsIF9idWlsZEF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCB0aGlzKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUZyb21TZXRcIixcblxuICAgIC8vIDo6IChbTWFya10pIOKGkiBbTWFya11cbiAgICAvLyBXaGVuIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldCwgYSBuZXcgc2V0XG4gICAgLy8gd2l0aG91dCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgc2V0IGlzIHJldHVybmVkLlxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKSByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFtNYXJrXSkg4oaSIGJvb2xcbiAgICAvLyBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldC5cbiAgfSwge1xuICAgIGtleTogXCJpc0luU2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzSW5TZXQoc2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2V0W2ldLnR5cGUgPT0gdGhpcykgcmV0dXJuIHNldFtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXRPcmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPcmRlcihtYXJrcykge1xuICAgICAgdmFyIHNvcnRlZCA9IFtdO1xuICAgICAgZm9yICh2YXIgX25hbWU0IGluIG1hcmtzKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKHsgbmFtZTogX25hbWU0LCByYW5rOiBtYXJrc1tfbmFtZTRdLnR5cGUucmFuayB9KTtcbiAgICAgIH1zb3J0ZWQuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5yYW5rIC0gYi5yYW5rO1xuICAgICAgfSk7XG4gICAgICB2YXIgcmFua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmFua3Nbc29ydGVkW2ldLm5hbWVdID0gaTtcbiAgICAgIH1yZXR1cm4gcmFua3M7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBpbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZShtYXJrcywgc2NoZW1hKSB7XG4gICAgICB2YXIgb3JkZXIgPSB0aGlzLmdldE9yZGVyKG1hcmtzKTtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yICh2YXIgX25hbWU1IGluIG1hcmtzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbWFya3NbX25hbWU1XTtcbiAgICAgICAgdmFyIGF0dHJzID0gaW5mby5hdHRyaWJ1dGVzIHx8IGluZm8udHlwZS5hdHRyaWJ1dGVzO1xuICAgICAgICByZXN1bHRbX25hbWU1XSA9IG5ldyBpbmZvLnR5cGUoX25hbWU1LCBhdHRycywgb3JkZXJbX25hbWU1XSwgc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhbmtcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiA1MDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWFya1R5cGU7XG59KSgpO1xuXG5leHBvcnRzLk1hcmtUeXBlID0gTWFya1R5cGU7XG5NYXJrVHlwZS5hdHRyaWJ1dGVzID0ge307XG5cbi8vIDo6IChzdHJpbmcsICopXG4vLyBSZWdpc3RlciBhIG1ldGFkYXRhIGVsZW1lbnQgZm9yIHRoaXMgbWFyayB0eXBlLiBTZWUgYWxzb1xuLy8gYE5vZGVUeXBlLnJlZ2lzdGVyYC5cbk1hcmtUeXBlLnJlZ2lzdGVyID0gTm9kZVR5cGUucmVnaXN0ZXI7XG5cbi8vIFNjaGVtYSBzcGVjaWZpY2F0aW9ucyBhcmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgc3BlY2lmeSBhIHNjaGVtYSAtLVxuLy8gYSBzZXQgb2Ygbm9kZSB0eXBlcywgdGhlaXIgbmFtZXMsIGF0dHJpYnV0ZXMsIGFuZCBuZXN0aW5nIGJlaGF2aW9yLlxuXG5mdW5jdGlvbiBjb3B5T2JqKG9iaiwgZikge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcHJvcF0gPSBmID8gZihvYmpbcHJvcF0pIDogb2JqW3Byb3BdO1xuICB9cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV3JhcHBlZChvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEZ1bmN0aW9uID8geyB0eXBlOiBvYmogfSA6IG9iajtcbn1cblxuZnVuY3Rpb24gb3ZlcmxheU9iaihvYmosIG92ZXJsYXkpIHtcbiAgdmFyIGNvcHkgPSBjb3B5T2JqKG9iaik7XG4gIGZvciAodmFyIF9uYW1lNiBpbiBvdmVybGF5KSB7XG4gICAgdmFyIGluZm8gPSBlbnN1cmVXcmFwcGVkKG92ZXJsYXlbX25hbWU2XSk7XG4gICAgaWYgKGluZm8gPT0gbnVsbCkge1xuICAgICAgZGVsZXRlIGNvcHlbX25hbWU2XTtcbiAgICB9IGVsc2UgaWYgKGluZm8udHlwZSkge1xuICAgICAgY29weVtfbmFtZTZdID0gaW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGV4aXN0aW5nID0gY29weVtfbmFtZTZdID0gY29weU9iaihjb3B5W19uYW1lNl0pO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBpbmZvKSB7XG4gICAgICAgIGV4aXN0aW5nW3Byb3BdID0gaW5mb1twcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIDs7IEEgc2NoZW1hIHNwZWNpZmljYXRpb24gaXMgYSBibHVlcHJpbnQgZm9yIGFuIGFjdHVhbFxuLy8gYFNjaGVtYWAuIEl0IG1hcHMgbmFtZXMgdG8gbm9kZSBhbmQgbWFyayB0eXBlcywgYWxvbmdcbi8vIHdpdGggZXh0cmEgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFuZCBjaGFuZ2VzXG4vLyB0byBub2RlIGtpbmRzIGFuZCByZWxhdGlvbnMuXG4vL1xuLy8gQSBzcGVjaWZpY2F0aW9uIGNvbnNpc3RzIG9mIGFuIG9iamVjdCB0aGF0IG1hcHMgbm9kZSBuYW1lcyB0byBub2RlXG4vLyB0eXBlIGNvbnN0cnVjdG9ycyBhbmQgYW5vdGhlciBzaW1pbGFyIG9iamVjdCBtYXBwaW5nIG1hcmsgbmFtZXMgdG9cbi8vIG1hcmsgdHlwZSBjb25zdHJ1Y3RvcnMuXG4vL1xuLy8gRm9yIGZsZXhpYmlsaXR5IGFuZCByZXVzYWJpbGl0eSwgbm9kZSBhbmQgbWFyayB0eXBlIGNsYXNzZXMgZG8gbm90XG4vLyBkZWNsYXJlIHRoZWlyIG93biBuYW1lLiBJbnN0ZWFkLCBlYWNoIHNjaGVtYSB0aGF0IGluY2x1ZGVzIHRoZW0gY2FuXG4vLyBhc3NpZ24gYSBuYW1lIHRvIHRoZW0sIGFzIHdlbGwgYXMgb3ZlcnJpZGUgdGhlaXJcbi8vIFtraW5kXSgjTm9kZVR5cGUua2luZCkgYW5kIFtjb250YWluZWQga2luZF0oI05vZGVUeXBlLmNvbnRhaW5zKSwgb3Jcbi8vIGFkZGluZyBleHRyYSBbYXR0cmlidXRlc10oI05vZGVUeXBlLmF0dHJpYnV0ZXMpLlxuXG52YXIgU2NoZW1hU3BlYyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6ICg/T2JqZWN0PHt0eXBlOiBOb2RlVHlwZX0+LCA/T2JqZWN0PHt0eXBlOiBNYXJrVHlwZX0+KVxuICAvLyBDcmVhdGUgYSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBmcm9tIHNjcmF0Y2guIFRoZSBhcmd1bWVudHMgbWFwXG4gIC8vIG5vZGUgbmFtZXMgdG8gbm9kZSB0eXBlIGNvbnN0cnVjdG9ycyBhbmQgbWFyayBuYW1lcyB0byBtYXJrIHR5cGVcbiAgLy8gY29uc3RydWN0b3JzLiBUaGVpciBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIHRoZSB0eXBlXG4gIC8vIGNvbnN0cnVjdG9ycyB0aGVtc2VsdmVzLCBvciBvYmplY3RzIHdpdGggYSB0eXBlIGNvbnN0cnVjdG9yIHVuZGVyXG4gIC8vIHRoZWlyIGB0eXBlYCBwcm9wZXJ0eSwgYW5kIG9wdGlvbmFsbHkgdGhlc2Ugb3RoZXIgcHJvcGVydGllczpcbiAgLy9cbiAgLy8gKipgY29udGFpbnNgKipgOiBzdHJpbmdgXG4gIC8vICAgOiBPbmx5IHZhbGlkIGZvciBgbm9kZXNgLiBUaGUgW2tpbmRdKCNOb2RlVHlwZS5raW5kKSBvZiB0aGVcbiAgLy8gICAgIG5vZGVzIHRoYXQgdGhpcyBub2RlIGNhbiBjb250YWluIGluIHRoaXMgc2NoZW1hLlxuICAvL1xuICAvLyAqKmBraW5kYCoqYDogc3RyaW5nYFxuICAvLyAgOiBPbmx5IHZhbGlkIGZvciBgbm9kZXNgLiBPdmVycmlkZXMgdGhlIGtpbmQgb2YgdGhpcyBub2RlIGluXG4gIC8vICAgIHRoaXMgc2NoZW1hLiBTYW1lIGZvcm1hdCBhcyBgTm9kZVR5cGUua2luZGAuXG4gIC8vXG4gIC8vICoqYGF0dHJpYnV0ZXNgKipgOiBPYmplY3Q8QXR0cmlidXRlPmBcbiAgLy8gICA6IEV4dHJhIGF0dHJpYnV0ZXMgdG8gYXR0YWNoIHRvIHRoaXMgbm9kZSBpbiB0aGlzIHNjaGVtYS5cblxuICBmdW5jdGlvbiBTY2hlbWFTcGVjKG5vZGVzLCBtYXJrcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWFTcGVjKTtcblxuICAgIHRoaXMubm9kZXMgPSBub2RlcyA/IGNvcHlPYmoobm9kZXMsIGVuc3VyZVdyYXBwZWQpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLm1hcmtzID0gbWFya3MgPyBjb3B5T2JqKG1hcmtzLCBlbnN1cmVXcmFwcGVkKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICAvLyBGb3Igbm9kZSB0eXBlcyB3aGVyZSBhbGwgYXR0cnMgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgKG9yIHdoaWNoIGRvbid0XG4gIC8vIGhhdmUgYW55IGF0dHJpYnV0ZXMpLCBidWlsZCB1cCBhIHNpbmdsZSByZXVzYWJsZSBkZWZhdWx0IGF0dHJpYnV0ZVxuICAvLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbiAgLy8gYXR0cmlidXRlcy5cblxuICAvLyA6OiAoP09iamVjdDw/e3R5cGU6IE5vZGVUeXBlfT4sID9PYmplY3Q8P3t0eXBlOiBNYXJrVHlwZX0+KSDihpIgU2NoZW1hU3BlY1xuICAvLyBCYXNlIGEgbmV3IHNjaGVtYSBzcGVjIG9uIHRoaXMgb25lIGJ5IHNwZWNpZnlpbmcgbm9kZXMgYW5kIG1hcmtzXG4gIC8vIHRvIGFkZCwgY2hhbmdlLCBvciByZW1vdmUuXG4gIC8vXG4gIC8vIFdoZW4gYG5vZGVzYCBpcyBwYXNzZWQsIGl0IHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyB0eXBlIG5hbWVzXG4gIC8vIHRvIGVpdGhlciBgbnVsbGAsIHRvIGRlbGV0ZSB0aGUgdHlwZSBvZiB0aGF0IG5hbWUsIHRvIGFcbiAgLy8gYE5vZGVUeXBlYCwgdG8gYWRkIG9yIHJlcGxhY2UgdGhlIG5vZGUgdHlwZSBvZiB0aGF0IG5hbWUsIG9yIHRvXG4gIC8vIGFuIG9iamVjdCBjb250YWluaW5nIFtleHRlbnNpb25cbiAgLy8gcHJvcGVydGllc10oI1NjaGVtYVNwZWNfY29uc3RydWN0b3IpLCB0byBhZGQgdG8gdGhlIGV4aXN0aW5nXG4gIC8vIGRlc2NyaXB0aW9uIG9mIHRoYXQgbm9kZSB0eXBlLlxuICAvL1xuICAvLyBTaW1pbGFybHksIGBtYXJrc2AgY2FuIGJlIGFuIG9iamVjdCB0byBhZGQsIGNoYW5nZSwgb3IgcmVtb3ZlXG4gIC8vIG1hcmtzIGluIHRoZSBzY2hlbWEuXG5cbiAgX2NyZWF0ZUNsYXNzKFNjaGVtYVNwZWMsIFt7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUobm9kZXMsIG1hcmtzKSB7XG4gICAgICByZXR1cm4gbmV3IFNjaGVtYVNwZWMobm9kZXMgPyBvdmVybGF5T2JqKHRoaXMubm9kZXMsIG5vZGVzKSA6IHRoaXMubm9kZXMsIG1hcmtzID8gb3ZlcmxheU9iaih0aGlzLm1hcmtzLCBtYXJrcykgOiB0aGlzLm1hcmtzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoP3VuaW9uPHN0cmluZywgKG5hbWU6IHN0cmluZywgdHlwZTogTm9kZVR5cGUpIOKGkiBib29sPiwgc3RyaW5nLCBBdHRyaWJ1dGUpIOKGkiBTY2hlbWFTcGVjXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBzcGVjIHdpdGggYXR0cmlidXRlcyBhZGRlZCB0byBzZWxlY3RlZCBub2RlXG4gICAgLy8gdHlwZXMuIGBmaWx0ZXJgIGNhbiBiZSBgbnVsbGAsIHRvIGFkZCB0aGUgYXR0cmlidXRlIHRvIGFsbCBub2RlXG4gICAgLy8gdHlwZXMsIGEgc3RyaW5nLCB0byBhZGQgaXQgb25seSB0byB0aGUgbmFtZWQgbm9kZSB0eXBlLCBvciBhXG4gICAgLy8gcHJlZGljYXRlIGZ1bmN0aW9uLCB0byBhZGQgaXQgdG8gbm9kZSB0eXBlcyB0aGF0IHBhc3MgdGhlXG4gICAgLy8gcHJlZGljYXRlLlxuICAgIC8vXG4gICAgLy8gVGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCBhbG9uZ3NpZGUgdGhlIG5vZGUgdHlwZSdzIFtkZWZhdWx0XG4gICAgLy8gYXR0cmlidXRlc10oI05vZGVUeXBlLmF0dHJpYnV0ZXMpLlxuICB9LCB7XG4gICAga2V5OiBcImFkZEF0dHJpYnV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRBdHRyaWJ1dGUoZmlsdGVyLCBhdHRyTmFtZSwgYXR0cikge1xuICAgICAgdmFyIGNvcHkgPSBjb3B5T2JqKHRoaXMubm9kZXMpO1xuICAgICAgZm9yICh2YXIgX25hbWU3IGluIGNvcHkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT0gXCJzdHJpbmdcIiA/IGZpbHRlciA9PSBfbmFtZTcgOiB0eXBlb2YgZmlsdGVyID09IFwiZnVuY3Rpb25cIiA/IGZpbHRlcihfbmFtZTcsIGNvcHlbX25hbWU3XSkgOiBmaWx0ZXIgPyBmaWx0ZXIgPT0gY29weVtfbmFtZTddIDogdHJ1ZSkge1xuICAgICAgICAgIHZhciBpbmZvID0gY29weVtfbmFtZTddID0gY29weU9iaihjb3B5W19uYW1lN10pOyhpbmZvLmF0dHJpYnV0ZXMgfHwgKGluZm8uYXR0cmlidXRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVthdHRyTmFtZV0gPSBhdHRyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNjaGVtYVNwZWMoY29weSwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjaGVtYVNwZWM7XG59KSgpO1xuXG5leHBvcnRzLlNjaGVtYVNwZWMgPSBTY2hlbWFTcGVjO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEF0dHJzKGF0dHJzKSB7XG4gIHZhciBkZWZhdWx0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAodmFyIGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgdmFyIGF0dHIgPSBhdHRyc1thdHRyTmFtZV07XG4gICAgaWYgKGF0dHJbXCJkZWZhdWx0XCJdID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHRzW2F0dHJOYW1lXSA9IGF0dHJbXCJkZWZhdWx0XCJdO1xuICB9XG4gIHJldHVybiBkZWZhdWx0cztcbn1cblxuZnVuY3Rpb24gX2J1aWxkQXR0cnMoYXR0clNwZWMsIGF0dHJzLCBhcmcxLCBhcmcyKSB7XG4gIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAodmFyIF9uYW1lOCBpbiBhdHRyU3BlYykge1xuICAgIHZhciB2YWx1ZSA9IGF0dHJzICYmIGF0dHJzW19uYW1lOF07XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHZhciBhdHRyID0gYXR0clNwZWNbX25hbWU4XTtcbiAgICAgIGlmIChhdHRyW1wiZGVmYXVsdFwiXSAhPSBudWxsKSB2YWx1ZSA9IGF0dHJbXCJkZWZhdWx0XCJdO2Vsc2UgaWYgKGF0dHIuY29tcHV0ZSkgdmFsdWUgPSBhdHRyLmNvbXB1dGUoYXJnMSwgYXJnMik7ZWxzZSBTY2hlbWFFcnJvci5yYWlzZShcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBfbmFtZTgpO1xuICAgIH1cbiAgICBidWlsdFtfbmFtZThdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGJ1aWx0O1xufVxuXG4vLyA7OyBFYWNoIGRvY3VtZW50IGlzIGJhc2VkIG9uIGEgc2luZ2xlIHNjaGVtYSwgd2hpY2ggcHJvdmlkZXMgdGhlXG4vLyBub2RlIGFuZCBtYXJrIHR5cGVzIHRoYXQgaXQgaXMgbWFkZSB1cCBvZiAod2hpY2gsIGluIHR1cm4sXG4vLyBkZXRlcm1pbmUgdGhlIHN0cnVjdHVyZSBpdCBpcyBhbGxvd2VkIHRvIGhhdmUpLlxuXG52YXIgU2NoZW1hID0gKGZ1bmN0aW9uICgpIHtcbiAgLy8gOjogKFNjaGVtYVNwZWMpXG4gIC8vIENvbnN0cnVjdCBhIHNjaGVtYSBmcm9tIGEgc3BlY2lmaWNhdGlvbi5cblxuICBmdW5jdGlvbiBTY2hlbWEoc3BlYykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWEpO1xuXG4gICAgLy8gOjogU2NoZW1hU3BlY1xuICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIG9uIHdoaWNoIHRoZSBzY2hlbWEgaXMgYmFzZWQuXG4gICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB0aGlzLmtpbmRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAvLyA6OiBPYmplY3Q8Tm9kZVR5cGU+XG4gICAgLy8gQW4gb2JqZWN0IG1hcHBpbmcgdGhlIHNjaGVtYSdzIG5vZGUgbmFtZXMgdG8gbm9kZSB0eXBlIG9iamVjdHMuXG4gICAgdGhpcy5ub2RlcyA9IE5vZGVUeXBlLmNvbXBpbGUoc3BlYy5ub2RlcywgdGhpcyk7XG4gICAgLy8gOjogT2JqZWN0PE1hcmtUeXBlPlxuICAgIC8vIEEgbWFwIGZyb20gbWFyayBuYW1lcyB0byBtYXJrIHR5cGUgb2JqZWN0cy5cbiAgICB0aGlzLm1hcmtzID0gTWFya1R5cGUuY29tcGlsZShzcGVjLm1hcmtzLCB0aGlzKTtcbiAgICAvLyA6OiBPYmplY3RcbiAgICAvLyBBbiBvYmplY3QgZm9yIHN0b3Jpbmcgd2hhdGV2ZXIgdmFsdWVzIG1vZHVsZXMgbWF5IHdhbnQgdG9cbiAgICAvLyBjb21wdXRlIGFuZCBjYWNoZSBwZXIgc2NoZW1hLiAoSWYgeW91IHdhbnQgdG8gc3RvcmUgc29tZXRoaW5nXG4gICAgLy8gaW4gaXQsIHRyeSB0byB1c2UgcHJvcGVydHkgbmFtZXMgdW5saWtlbHkgdG8gY2xhc2guKVxuICAgIHRoaXMuY2FjaGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMubm9kZUZyb21KU09OID0gdGhpcy5ub2RlRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgICB0aGlzLm1hcmtGcm9tSlNPTiA9IHRoaXMubWFya0Zyb21KU09OLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyA6OiAodW5pb248c3RyaW5nLCBOb2RlVHlwZT4sID9PYmplY3QsID91bmlvbjxGcmFnbWVudCwgTm9kZSwgW05vZGVdPiwgP1tNYXJrXSkg4oaSIE5vZGVcbiAgLy8gQ3JlYXRlIGEgbm9kZSBpbiB0aGlzIHNjaGVtYS4gVGhlIGB0eXBlYCBtYXkgYmUgYSBzdHJpbmcgb3IgYVxuICAvLyBgTm9kZVR5cGVgIGluc3RhbmNlLiBBdHRyaWJ1dGVzIHdpbGwgYmUgZXh0ZW5kZWRcbiAgLy8gd2l0aCBkZWZhdWx0cywgYGNvbnRlbnRgIG1heSBiZSBhIGBGcmFnbWVudGAsXG4gIC8vIGBudWxsYCwgYSBgTm9kZWAsIG9yIGFuIGFycmF5IG9mIG5vZGVzLlxuICAvL1xuICAvLyBXaGVuIGNyZWF0aW5nIGEgdGV4dCBub2RlLCBgY29udGVudGAgc2hvdWxkIGJlIGEgc3RyaW5nIGFuZCBpc1xuICAvLyBpbnRlcnByZXRlZCBhcyB0aGUgbm9kZSdzIHRleHQuXG4gIC8vXG4gIC8vIFRoaXMgbWV0aG9kIGlzIGJvdW5kIHRvIHRoZSBTY2hlbWEsIG1lYW5pbmcgeW91IGRvbid0IGhhdmUgdG9cbiAgLy8gY2FsbCBpdCBhcyBhIG1ldGhvZCwgYnV0IGNhbiBwYXNzIGl0IHRvIGhpZ2hlci1vcmRlciBmdW5jdGlvbnNcbiAgLy8gYW5kIHN1Y2guXG5cbiAgX2NyZWF0ZUNsYXNzKFNjaGVtYSwgW3tcbiAgICBrZXk6IFwibm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlKHR5cGUsIGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpIHR5cGUgPSB0aGlzLm5vZGVUeXBlKHR5cGUpO2Vsc2UgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5vZGVUeXBlKSkgU2NoZW1hRXJyb3IucmFpc2UoXCJJbnZhbGlkIG5vZGUgdHlwZTogXCIgKyB0eXBlKTtlbHNlIGlmICh0eXBlLnNjaGVtYSAhPSB0aGlzKSBTY2hlbWFFcnJvci5yYWlzZShcIk5vZGUgdHlwZSBmcm9tIGRpZmZlcmVudCBzY2hlbWEgdXNlZCAoXCIgKyB0eXBlLm5hbWUgKyBcIilcIik7XG5cbiAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsID9bTWFya10pIOKGkiBOb2RlXG4gICAgLy8gQ3JlYXRlIGEgdGV4dCBub2RlIGluIHRoZSBzY2hlbWEuIFRoaXMgbWV0aG9kIGlzIGJvdW5kIHRvIHRoZSBTY2hlbWEuXG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0ZXh0KF90ZXh0LCBtYXJrcykge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMudGV4dC5jcmVhdGUobnVsbCwgX3RleHQsIF9tYXJrLk1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiA/Tm9kZVR5cGVcbiAgICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgdGV4dGJsb2NrIHR5cGUgZm9yIHRoaXMgc2NoZW1hLCBvciBgbnVsbGAgaWZcbiAgICAvLyBpdCBkb2VzIG5vdCBjb250YWluIGEgbm9kZSB0eXBlIHdpdGggYSBgZGVmYXVsdFRleHRibG9ja2BcbiAgICAvLyBwcm9wZXJ0eS5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0VGV4dGJsb2NrVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZhdWx0VGV4dGJsb2NrVHlwZSgpIHtcbiAgICAgIHZhciBjYWNoZWQgPSB0aGlzLmNhY2hlZC5kZWZhdWx0VGV4dGJsb2NrVHlwZTtcbiAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAgIGZvciAodmFyIF9uYW1lOSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVzW19uYW1lOV0uZGVmYXVsdFRleHRibG9jaykgcmV0dXJuIHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlID0gdGhpcy5ub2Rlc1tfbmFtZTldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkLmRlZmF1bHRUZXh0YmxvY2tUeXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCA/T2JqZWN0KSDihpIgTWFya1xuICAgIC8vIENyZWF0ZSBhIG1hcmsgd2l0aCB0aGUgbmFtZWQgdHlwZVxuICB9LCB7XG4gICAga2V5OiBcIm1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFyayhuYW1lLCBhdHRycykge1xuICAgICAgdmFyIHNwZWMgPSB0aGlzLm1hcmtzW25hbWVdIHx8IFNjaGVtYUVycm9yLnJhaXNlKFwiTm8gbWFyayBuYW1lZCBcIiArIG5hbWUpO1xuICAgICAgcmV0dXJuIHNwZWMuY3JlYXRlKGF0dHJzKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoT2JqZWN0KSDihpIgTm9kZVxuICAgIC8vIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIC8vIGJvdW5kLlxuICB9LCB7XG4gICAga2V5OiBcIm5vZGVGcm9tSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub2RlRnJvbUpTT04oanNvbikge1xuICAgICAgcmV0dXJuIF9ub2RlLk5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuXG4gICAgLy8gOjogKE9iamVjdCkg4oaSIE1hcmtcbiAgICAvLyBEZXNlcmlhbGl6ZSBhIG1hcmsgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICAvLyBib3VuZC5cbiAgfSwge1xuICAgIGtleTogXCJtYXJrRnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFya0Zyb21KU09OKGpzb24pIHtcbiAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5tYXJrKGpzb24pO1xuICAgICAgcmV0dXJuIHRoaXMubWFyayhqc29uLl8sIGpzb24pO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcpIOKGkiBOb2RlVHlwZVxuICAgIC8vIEdldCB0aGUgYE5vZGVUeXBlYCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgaW5cbiAgICAvLyB0aGlzIHNjaGVtYSwgb3IgcmFpc2UgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gIH0sIHtcbiAgICBrZXk6IFwibm9kZVR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9kZVR5cGUobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbmFtZV0gfHwgU2NoZW1hRXJyb3IucmFpc2UoXCJVbmtub3duIG5vZGUgdHlwZTogXCIgKyBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCBzdHJpbmcpIOKGkiBib29sXG4gICAgLy8gVGVzdCB3aGV0aGVyIGEgbm9kZSBraW5kIGlzIGEgc3ViLWtpbmQgb2YgYW5vdGhlciBraW5kLlxuICB9LCB7XG4gICAga2V5OiBcInN1YktpbmRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViS2luZChzdWIsIHN1cCkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoc3ViID09IHN1cCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHN1YiA9IHRoaXMua2luZHNbc3ViXTtcbiAgICAgICAgaWYgKCFzdWIpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA6OiAoc3RyaW5nLCAodmFsdWU6ICosIHNvdXJjZTogdW5pb248Tm9kZVR5cGUsIE1hcmtUeXBlLCBBdHRyaWJ1dGU+KSlcbiAgICAvLyBSZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCBpdGVtcyB1bmRlciB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoaXNcbiAgICAvLyBzY2hlbWEuIFRoZSBnaXZlbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggaXRlbSBhbmQsIGFzXG4gICAgLy8gYSBzZWNvbmQgYXJndW1lbnQsIHRoZSBlbGVtZW504oCUbm9kZSB0eXBlLCBtYXJrIHR5cGUsIG9yXG4gICAgLy8gYXR0cmlidXRl4oCUdGhhdCBpdCB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuICB9LCB7XG4gICAga2V5OiBcInJlZ2lzdHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdHJ5KG5hbWUsIGYpIHtcbiAgICAgIHZhciBhdHRyc1NlZW4gPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgIHZhciBvYmogPSBpID8gdGhpcy5tYXJrcyA6IHRoaXMubm9kZXM7XG4gICAgICAgIGZvciAodmFyIHRuYW1lIGluIG9iaikge1xuICAgICAgICAgIHZhciB0eXBlID0gb2JqW3RuYW1lXTtcbiAgICAgICAgICBpZiAodHlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJyZWdpc3RyeVwiKSkge1xuICAgICAgICAgICAgdmFyIHJlZyA9IHR5cGUucmVnaXN0cnlbbmFtZV07XG4gICAgICAgICAgICBpZiAocmVnKSBmb3IgKHZhciBqID0gMDsgaiA8IHJlZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBmKHJlZ1tqXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIGFuYW1lIGluIHR5cGUuYXR0cnMpIHtcbiAgICAgICAgICAgIHZhciBhdHRyID0gdHlwZS5hdHRyc1thbmFtZV0sXG4gICAgICAgICAgICAgICAgcmVnID0gYXR0ci5yZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgICAgIGlmIChyZWcgJiYgYXR0cnNTZWVuLmluZGV4T2YoYXR0cikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgYXR0cnNTZWVuLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVnLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZihyZWdbal0sIGF0dHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjaGVtYTtcbn0pKCk7XG5cbmV4cG9ydHMuU2NoZW1hID0gU2NoZW1hOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmV4cG9ydHMuZnJvbURPTSA9IGZyb21ET007XG5leHBvcnRzLmZyb21IVE1MID0gZnJvbUhUTUw7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9pbmRleFwiKTtcblxuLy8gOjogKFNjaGVtYSwgRE9NTm9kZSwgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlIGRvY3VtZW50IGZyb20gdGhlIGNvbnRlbnQgb2YgYSBET00gbm9kZS4gVG8gcGFzcyBhbiBleHBsaWNpdFxuLy8gcGFyZW50IGRvY3VtZW50IChmb3IgZXhhbXBsZSwgd2hlbiBub3QgaW4gYSBicm93c2VyIHdpbmRvd1xuLy8gZW52aXJvbm1lbnQsIHdoZXJlIHdlIHNpbXBseSB1c2UgdGhlIGdsb2JhbCBkb2N1bWVudCksIHBhc3MgaXQgYXNcbi8vIHRoZSBgZG9jdW1lbnRgIHByb3BlcnR5IG9mIGBvcHRpb25zYC5cblxuZnVuY3Rpb24gZnJvbURPTShzY2hlbWEsIGRvbSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIGNvbnRleHQgPSBuZXcgRE9NUGFyc2VTdGF0ZShzY2hlbWEsIG9wdGlvbnMudG9wTm9kZSB8fCBzY2hlbWEubm9kZShcImRvY1wiKSwgb3B0aW9ucyk7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuZnJvbSA/IGRvbS5jaGlsZE5vZGVzW29wdGlvbnMuZnJvbV0gOiBkb20uZmlyc3RDaGlsZDtcbiAgdmFyIGVuZCA9IG9wdGlvbnMudG8gIT0gbnVsbCAmJiBkb20uY2hpbGROb2Rlc1tvcHRpb25zLnRvXSB8fCBudWxsO1xuICBjb250ZXh0LmFkZEFsbChzdGFydCwgZW5kLCB0cnVlKTtcbiAgdmFyIGRvYyA9IHVuZGVmaW5lZDtcbiAgd2hpbGUgKGNvbnRleHQuc3RhY2subGVuZ3RoKSBkb2MgPSBjb250ZXh0LmxlYXZlKCk7XG4gIHJldHVybiBkb2M7XG59XG5cbi8vIDs7ICNwYXRoPURPTVBhcnNlU3BlYyAja2luZD1pbnRlcmZhY2UgI3RvYz1mYWxzZVxuLy8gVG8gZGVmaW5lIHRoZSB3YXkgW25vZGVdKCNOb2RlVHlwZSkgYW5kIFttYXJrXSgjTWFya1R5cGUpIHR5cGVzIGFyZVxuLy8gcGFyc2VkLCB5b3UgY2FuIGFzc29jaWF0ZSBvbmUgb3IgbW9yZSBET00gcGFyc2luZyBzcGVjaWZpY2F0aW9ucyB0b1xuLy8gdGhlbSB1c2luZyB0aGUgW2ByZWdpc3RlcmBdKCNOb2RlVHlwZS5yZWdpc3RlcikgbWV0aG9kIHdpdGggdGhlXG4vLyBgcGFyc2VET01gIHByb3BlcnR5IG5hbWUuIEVhY2ggb2YgdGhlbSBkZWZpbmVzIGEgcGFyc2luZyBzdHJhdGVneVxuLy8gZm9yIGEgY2VydGFpbiB0eXBlIG9mIERPTSBub2RlLlxuLy9cbi8vIE5vdGUgdGhhdCBgQXR0cmlidXRlYHMgbWF5IGFsc28gY29udGFpbiBhIGBwYXJzZURPTWAgcHJvcGVydHksXG4vLyB3aGljaCBzaG91bGQgX25vdF8gYmUgYSBgRE9NUGFyc2VTcGVjYCwgYnV0IHNpbXBseSBhIGZ1bmN0aW9uIHRoYXRcbi8vIGNvbXB1dGVzIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBmcm9tIGEgRE9NIG5vZGUuXG5cbi8vIDo6ID9zdHJpbmcgI3BhdGg9RE9NUGFyc2VTcGVjLnRhZ1xuLy8gVGhlIChsb3dlci1jYXNlKSB0YWcgbmFtZSBmb3Igd2hpY2ggdG8gYWN0aXZhdGUgdGhpcyBwYXJzZXIuIFdoZW5cbi8vIG5vdCBnaXZlbiwgaXQgaXMgYWN0aXZhdGVkIGZvciBhbGwgbm9kZXMuXG5cbi8vIDo6ID9udW1iZXIgI3BhdGg9RE9NUGFyc2VTcGVjLnJhbmtcbi8vIFRoZSBwcmVjZWRlbmNlIG9mIHRoaXMgcGFyc2luZyBzdHJhdGVneS4gU2hvdWxkIGJlIGEgbnVtYmVyIGJldHdlZW5cbi8vIDAgYW5kIDEwMCwgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuIHRoaXMgcGFyc2VyIGdldHMgYSBjaGFuY2UgcmVsYXRpdmVcbi8vIHRvIG90aGVycyB0aGF0IGFwcGx5IHRvIHRoZSBub2RlIChsb3cgcmFua3MgZ28gZmlyc3QpLiBEZWZhdWx0cyB0b1xuLy8gNTAuXG5cbi8vIDo6IHVuaW9uPHN0cmluZywgKGRvbTogRE9NTm9kZSwgc3RhdGU6IERPTVBhcnNlU3RhdGUpIOKGkiA/Ym9vbD4gI3BhdGg9RE9NUGFyc2VTcGVjLnBhcnNlXG4vLyBUaGUgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBET00gbm9kZSwgcGFyc2VzIGl0LCB1cGRhdGluZyB0aGUgcGFyc2Vcbi8vIHN0YXRlLiBJdCBzaG91bGQgcmV0dXJuICh0aGUgZXhhY3QgdmFsdWUpIGBmYWxzZWAgd2hlbiBpdCB3YW50cyB0b1xuLy8gaW5kaWNhdGUgdGhhdCBpdCB3YXMgbm90IGFibGUgdG8gcGFyc2UgdGhpcyBub2RlLiBUaGlzIGZ1bmN0aW9uIGlzXG4vLyBjYWxsZWQgaW4gc3VjaCBhIHdheSB0aGF0IGB0aGlzYCBpcyBib3VuZCB0byB0aGUgdHlwZSB0aGF0IHRoZVxuLy8gcGFyc2Ugc3BlYyB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuLy9cbi8vIFdoZW4gdGhpcyBpcyBzZXQgdG8gdGhlIHN0cmluZyBgXCJibG9ja1wiYCwgdGhlIGNvbnRlbnQgb2YgdGhlIERPTVxuLy8gbm9kZSBpcyBwYXJzZWQgYXMgdGhlIGNvbnRlbnQgaW4gYSBub2RlIG9mIHRoZSB0eXBlIHRoYXQgdGhpcyBzcGVjXG4vLyB3YXMgYXNzb2NpYXRlZCB3aXRoLlxuLy9cbi8vIFdoZW4gc2V0IHRvIHRoZSBzdHJpbmcgYFwibWFya1wiYCwgdGhlIGNvbnRlbnQgb2YgdGhlIERPTSBub2RlIGlzXG4vLyBwYXJzZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGUgbWFyayB0aGF0IHRoaXMgc3BlYyB3YXMgYXNzb2NpYXRlZFxuLy8gd2l0aCBhZGRlZCB0byB0aGVpciBtYXJrcy5cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwiZG9tXCIsIGZyb21ET00pO1xuXG4vLyA6OiAoU2NoZW1hLCBzdHJpbmcsID9PYmplY3QpIOKGkiBOb2RlXG4vLyBQYXJzZXMgdGhlIEhUTUwgaW50byBhIERPTSwgYW5kIHRoZW4gY2FsbHMgdGhyb3VnaCB0byBgZnJvbURPTWAuXG5cbmZ1bmN0aW9uIGZyb21IVE1MKHNjaGVtYSwgaHRtbCwgb3B0aW9ucykge1xuICB2YXIgd3JhcCA9IChvcHRpb25zICYmIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50KS5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB3cmFwLmlubmVySFRNTCA9IGh0bWw7XG4gIHJldHVybiBmcm9tRE9NKHNjaGVtYSwgd3JhcCwgb3B0aW9ucyk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lU291cmNlKShcImh0bWxcIiwgZnJvbUhUTUwpO1xuXG52YXIgYmxvY2tFbGVtZW50cyA9IHtcbiAgYWRkcmVzczogdHJ1ZSwgYXJ0aWNsZTogdHJ1ZSwgYXNpZGU6IHRydWUsIGJsb2NrcXVvdGU6IHRydWUsIGNhbnZhczogdHJ1ZSxcbiAgZGQ6IHRydWUsIGRpdjogdHJ1ZSwgZGw6IHRydWUsIGZpZWxkc2V0OiB0cnVlLCBmaWdjYXB0aW9uOiB0cnVlLCBmaWd1cmU6IHRydWUsXG4gIGZvb3RlcjogdHJ1ZSwgZm9ybTogdHJ1ZSwgaDE6IHRydWUsIGgyOiB0cnVlLCBoMzogdHJ1ZSwgaDQ6IHRydWUsIGg1OiB0cnVlLFxuICBoNjogdHJ1ZSwgaGVhZGVyOiB0cnVlLCBoZ3JvdXA6IHRydWUsIGhyOiB0cnVlLCBsaTogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9sOiB0cnVlLFxuICBvdXRwdXQ6IHRydWUsIHA6IHRydWUsIHByZTogdHJ1ZSwgc2VjdGlvbjogdHJ1ZSwgdGFibGU6IHRydWUsIHRmb290OiB0cnVlLCB1bDogdHJ1ZVxufTtcblxudmFyIG5vTWFya3MgPSBbXTtcblxuLy8gOzsgI3RvYz1mYWxzZSBBIHN0YXRlIG9iamVjdCB1c2VkIHRvIHRyYWNrIGNvbnRleHQgZHVyaW5nIGEgcGFyc2UsXG4vLyBhbmQgdG8gZXhwb3NlIG1ldGhvZHMgdG8gY3VzdG9tIHBhcnNpbmcgZnVuY3Rpb25zLlxuXG52YXIgRE9NUGFyc2VTdGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERPTVBhcnNlU3RhdGUoc2NoZW1hLCB0b3BOb2RlLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERPTVBhcnNlU3RhdGUpO1xuXG4gICAgLy8gOjogT2JqZWN0IFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGlzIHBhcnNlLlxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gOjogU2NoZW1hIFRoZSBzY2hlbWEgdGhhdCB3ZSBhcmUgcGFyc2luZyBpbnRvLlxuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLm1hcmtzID0gbm9NYXJrcztcbiAgICB0aGlzLmNsb3NpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVudGVyKHRvcE5vZGUudHlwZSwgdG9wTm9kZS5hdHRycyk7XG4gICAgdGhpcy5ub2RlSW5mbyA9IG5vZGVJbmZvKHNjaGVtYSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRE9NUGFyc2VTdGF0ZSwgW3tcbiAgICBrZXk6IFwicGFyc2VBdHRyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUF0dHJzKGRvbSwgdHlwZSwgYXR0cnMpIHtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gdHlwZS5hdHRycykge1xuICAgICAgICB2YXIgZGVzYyA9IHR5cGUuYXR0cnNbYXR0cl07XG4gICAgICAgIGlmIChkZXNjLnBhcnNlRE9NICYmICghYXR0cnMgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgYXR0cikpKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gZGVzYy5wYXJzZURPTShkb20sIHRoaXMub3B0aW9ucywgZGVzYywgdHlwZSk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghYXR0cnMpIGF0dHJzID0ge307XG4gICAgICAgICAgICBhdHRyc1thdHRyXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRET01cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkRE9NKGRvbSkge1xuICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgIC8vIEZJWE1FIGRlZmluZSBhIGNvaGVyZW50IHN0cmF0ZWd5IGZvciBkZWFsaW5nIHdpdGggdHJhaWxpbmcsIGxlYWRpbmcsIGFuZCBtdWx0aXBsZSBzcGFjZXMgKHRoaXMgaXNuJ3Qgb25lKVxuICAgICAgICB2YXIgdmFsdWUgPSBkb20ubm9kZVZhbHVlO1xuICAgICAgICB2YXIgX3RvcCA9IHRoaXMudG9wLFxuICAgICAgICAgICAgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKC9cXFMvLnRlc3QodmFsdWUpIHx8IF90b3AudHlwZS5pc1RleHRibG9jaykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG4gICAgICAgICAgaWYgKC9eXFxzLy50ZXN0KHZhbHVlKSAmJiAobGFzdCA9IF90b3AuY29udGVudFtfdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV0pICYmIGxhc3QudHlwZS5uYW1lID09IFwidGV4dFwiICYmIC9cXHMkLy50ZXN0KGxhc3QudGV4dCkpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgICAgICAgaWYgKHZhbHVlKSB0aGlzLmluc2VydCh0aGlzLnNjaGVtYS50ZXh0KHZhbHVlLCB0aGlzLm1hcmtzKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tLm5vZGVUeXBlICE9IDEgfHwgZG9tLmhhc0F0dHJpYnV0ZShcInBtLWlnbm9yZVwiKSkge1xuICAgICAgICAvLyBJZ25vcmUgbm9uLXRleHQgbm9uLWVsZW1lbnQgbm9kZXNcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMucGFyc2VOb2RlVHlwZShkb20pKSB7XG4gICAgICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwpO1xuICAgICAgICAgIHZhciBfbmFtZSA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChibG9ja0VsZW1lbnRzLmhhc093blByb3BlcnR5KF9uYW1lKSAmJiB0aGlzLnRvcC50eXBlID09IHRoaXMuc2NoZW1hLmRlZmF1bHRUZXh0YmxvY2tUeXBlKCkpIHRoaXMuY2xvc2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidHJ5UGFyc2Vyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cnlQYXJzZXJzKHBhcnNlcnMsIGRvbSkge1xuICAgICAgaWYgKHBhcnNlcnMpIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFyc2VyID0gcGFyc2Vyc1tpXTtcbiAgICAgICAgaWYgKHBhcnNlci5wYXJzZS5jYWxsKHBhcnNlci50eXBlLCBkb20sIHRoaXMpICE9PSBmYWxzZSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlTm9kZVR5cGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VOb2RlVHlwZShkb20pIHtcbiAgICAgIHJldHVybiB0aGlzLnRyeVBhcnNlcnModGhpcy5ub2RlSW5mb1tkb20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sIGRvbSkgfHwgdGhpcy50cnlQYXJzZXJzKHRoaXMubm9kZUluZm8uXywgZG9tKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEFsbChmcm9tLCB0bywgc3luYykge1xuICAgICAgdmFyIHN0YWNrID0gc3luYyAmJiB0aGlzLnN0YWNrLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBkb20gPSBmcm9tOyBkb20gIT0gdG87IGRvbSA9IGRvbS5uZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmFkZERPTShkb20pO1xuICAgICAgICBpZiAoc3luYyAmJiBibG9ja0VsZW1lbnRzLmhhc093blByb3BlcnR5KGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkgdGhpcy5zeW5jKHN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZG9DbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb0Nsb3NlKCkge1xuICAgICAgaWYgKCF0aGlzLmNsb3NpbmcgfHwgdGhpcy5zdGFjay5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgICB2YXIgbGVmdCA9IHRoaXMubGVhdmUoKTtcbiAgICAgIHRoaXMuZW50ZXIobGVmdC50eXBlLCBsZWZ0LmF0dHJzKTtcbiAgICAgIHRoaXMuY2xvc2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0KG5vZGUpIHtcbiAgICAgIGlmICh0aGlzLnRvcC50eXBlLmNhbkNvbnRhaW4obm9kZSkpIHtcbiAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5zdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHZhciByb3V0ZSA9IHRoaXMuc3RhY2tbaV0udHlwZS5maW5kQ29ubmVjdGlvbihub2RlLnR5cGUpO1xuICAgICAgICAgIGlmICghcm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChpID09IHRoaXMuc3RhY2subGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5kb0Nsb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IGkgKyAxKSB0aGlzLmxlYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm91dGUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMuZW50ZXIocm91dGVbal0pO1xuICAgICAgICAgIH1pZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvcC5jb250ZW50LnB1c2gobm9kZSk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyA6OiAoRE9NTm9kZSwgTm9kZVR5cGUsID9PYmplY3QsIFtOb2RlXSkg4oaSIE5vZGVcbiAgICAvLyBJbnNlcnQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCBiYXNlZCBvblxuICAgIC8vIGBkb21gLCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0RnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRGcm9tKGRvbSwgdHlwZSwgYXR0cnMsIGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc2VydCh0eXBlLmNyZWF0ZUF1dG9GaWxsKHRoaXMucGFyc2VBdHRycyhkb20sIHR5cGUsIGF0dHJzKSwgY29udGVudCwgdGhpcy5tYXJrcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlcih0eXBlLCBhdHRycykge1xuICAgICAgaWYgKHRoaXMubWFya3MubGVuZ3RoKSB0aGlzLm1hcmtzID0gbm9NYXJrcztcbiAgICAgIHRoaXMuc3RhY2sucHVzaCh7IHR5cGU6IHR5cGUsIGF0dHJzOiBhdHRycywgY29udGVudDogW10gfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVudGVyRnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRlckZyb20oZG9tLCB0eXBlLCBhdHRycykge1xuICAgICAgdGhpcy5lbnRlcih0eXBlLCB0aGlzLnBhcnNlQXR0cnMoZG9tLCB0eXBlLCBhdHRycykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsZWF2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsZWF2ZSgpIHtcbiAgICAgIHZhciB0b3AgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgdmFyIG5vZGUgPSB0b3AudHlwZS5jcmVhdGVBdXRvRmlsbCh0b3AuYXR0cnMsIHRvcC5jb250ZW50KTtcbiAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCkgdGhpcy5pbnNlcnQobm9kZSk7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3luY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzeW5jKHN0YWNrKSB7XG4gICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiBzdGFjay5sZW5ndGgpIHRoaXMubGVhdmUoKTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBvbmUgPSB0aGlzLnN0YWNrW25dLFxuICAgICAgICAgICAgdHdvID0gc3RhY2tbbl07XG4gICAgICAgIGlmIChvbmUudHlwZSA9PSB0d28udHlwZSAmJiBfbW9kZWwuTm9kZS5zYW1lQXR0cnMob25lLmF0dHJzLCB0d28uYXR0cnMpKSBicmVhaztcbiAgICAgICAgdGhpcy5sZWF2ZSgpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IHRoaXMuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHZhciBhZGQgPSBzdGFja1t0aGlzLnN0YWNrLmxlbmd0aF07XG4gICAgICAgIHRoaXMuZW50ZXIoYWRkLnR5cGUsIGFkZC5hdHRycyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpIHRoaXMubWFya3MgPSBub01hcmtzO1xuICAgICAgdGhpcy5jbG9zaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gOjogKERPTU5vZGUsIE5vZGVUeXBlLCA/T2JqZWN0KVxuICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyBvZiBgZG9tYCBhcyBjaGlsZHJlbiBvZiBhIG5vZGUgb2YgdGhlIGdpdmVuXG4gICAgLy8gdHlwZS5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwSW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcEluKGRvbSwgdHlwZSwgYXR0cnMpIHtcbiAgICAgIHRoaXMuZW50ZXJGcm9tKGRvbSwgdHlwZSwgYXR0cnMpO1xuICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwsIHRydWUpO1xuICAgICAgdGhpcy5sZWF2ZSgpO1xuICAgIH1cblxuICAgIC8vIDo6IChET01Ob2RlLCBNYXJrKVxuICAgIC8vIFBhcnNlIHRoZSBjb250ZW50cyBvZiBgZG9tYCwgd2l0aCBgbWFya2AgYWRkZWQgdG8gdGhlIHNldCBvZlxuICAgIC8vIGN1cnJlbnQgbWFya3MuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcE1hcmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcE1hcmsoZG9tLCBtYXJrKSB7XG4gICAgICB2YXIgb2xkID0gdGhpcy5tYXJrcztcbiAgICAgIHRoaXMubWFya3MgPSAobWFyay5pbnN0YW5jZSB8fCBtYXJrKS5hZGRUb1NldChvbGQpO1xuICAgICAgdGhpcy5hZGRBbGwoZG9tLmZpcnN0Q2hpbGQsIG51bGwpO1xuICAgICAgdGhpcy5tYXJrcyA9IG9sZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9wXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBET01QYXJzZVN0YXRlO1xufSkoKTtcblxuZnVuY3Rpb24gbm9kZUluZm8oc2NoZW1hKSB7XG4gIHJldHVybiBzY2hlbWEuY2FjaGVkLnBhcnNlRE9NTm9kZXMgfHwgKHNjaGVtYS5jYWNoZWQucGFyc2VET01Ob2RlcyA9IHN1bW1hcml6ZU5vZGVJbmZvKHNjaGVtYSkpO1xufVxuXG5mdW5jdGlvbiBzdW1tYXJpemVOb2RlSW5mbyhzY2hlbWEpIHtcbiAgdmFyIHRhZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0YWdzLl8gPSBbXTtcbiAgc2NoZW1hLnJlZ2lzdHJ5KFwicGFyc2VET01cIiwgZnVuY3Rpb24gKGluZm8sIHR5cGUpIHtcbiAgICB2YXIgdGFnID0gaW5mby50YWcgfHwgXCJfXCI7XG4gICAgdmFyIHBhcnNlID0gaW5mby5wYXJzZTtcbiAgICBpZiAocGFyc2UgPT0gXCJibG9ja1wiKSBwYXJzZSA9IGZ1bmN0aW9uIChkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwSW4oZG9tLCB0aGlzKTtcbiAgICB9O2Vsc2UgaWYgKHBhcnNlID09IFwibWFya1wiKSBwYXJzZSA9IGZ1bmN0aW9uIChkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwTWFyayhkb20sIHRoaXMpO1xuICAgIH07KHRhZ3NbdGFnXSB8fCAodGFnc1t0YWddID0gW10pKS5wdXNoKHtcbiAgICAgIHR5cGU6IHR5cGUsIHBhcnNlOiBwYXJzZSxcbiAgICAgIHJhbms6IGluZm8ucmFuayA9PSBudWxsID8gNTAgOiBpbmZvLnJhbmtcbiAgICB9KTtcbiAgfSk7XG4gIGZvciAodmFyIHRhZyBpbiB0YWdzKSB7XG4gICAgdGFnc1t0YWddLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLnJhbmsgLSBiLnJhbms7XG4gICAgfSk7XG4gIH1yZXR1cm4gdGFncztcbn1cblxuX21vZGVsLlBhcmFncmFwaC5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInBcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkJsb2NrUXVvdGUucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJibG9ja3F1b3RlXCIsIHBhcnNlOiBcImJsb2NrXCIgfSk7XG5cbnZhciBfbG9vcCA9IGZ1bmN0aW9uIChpKSB7XG4gIF9tb2RlbC5IZWFkaW5nLnJlZ2lzdGVyKFwicGFyc2VET01cIiwge1xuICAgIHRhZzogXCJoXCIgKyBpLFxuICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgICBzdGF0ZS53cmFwSW4oZG9tLCB0aGlzLCB7IGxldmVsOiBpIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mb3IgKHZhciBpID0gMTsgaSA8PSA2OyBpKyspIHtcbiAgX2xvb3AoaSk7XG59X21vZGVsLkhvcml6b250YWxSdWxlLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiaHJcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkNvZGVCbG9jay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInByZVwiLCBwYXJzZTogZnVuY3Rpb24gcGFyc2UoZG9tLCBzdGF0ZSkge1xuICAgIHZhciBwYXJhbXMgPSBkb20uZmlyc3RDaGlsZCAmJiAvXmNvZGUkL2kudGVzdChkb20uZmlyc3RDaGlsZC5ub2RlTmFtZSkgJiYgZG9tLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgaWYgKHBhcmFtcyAmJiAvZmVuY2UvLnRlc3QocGFyYW1zKSkge1xuICAgICAgdmFyIGZvdW5kID0gW10sXG4gICAgICAgICAgcmUgPSAvKD86XnxcXHMpbGFuZy0oXFxTKykvZyxcbiAgICAgICAgICBtID0gdW5kZWZpbmVkO1xuICAgICAgd2hpbGUgKG0gPSByZS50ZXN0KHBhcmFtcykpIGZvdW5kLnB1c2gobVsxXSk7XG4gICAgICBwYXJhbXMgPSBmb3VuZC5qb2luKFwiIFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyYW1zID0gbnVsbDtcbiAgICB9XG4gICAgdmFyIHRleHQgPSBkb20udGV4dENvbnRlbnQ7XG4gICAgc3RhdGUuaW5zZXJ0RnJvbShkb20sIHRoaXMsIHsgcGFyYW1zOiBwYXJhbXMgfSwgdGV4dCA/IFtzdGF0ZS5zY2hlbWEudGV4dCh0ZXh0KV0gOiBbXSk7XG4gIH0gfSk7XG5cbl9tb2RlbC5CdWxsZXRMaXN0LnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwidWxcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLk9yZGVyZWRMaXN0LnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwib2xcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICB2YXIgYXR0cnMgPSB7IG9yZGVyOiBkb20uZ2V0QXR0cmlidXRlKFwic3RhcnRcIikgfHwgMSB9O1xuICAgIHN0YXRlLndyYXBJbihkb20sIHRoaXMsIGF0dHJzKTtcbiAgfSB9KTtcblxuX21vZGVsLkxpc3RJdGVtLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwibGlcIiwgcGFyc2U6IFwiYmxvY2tcIiB9KTtcblxuX21vZGVsLkhhcmRCcmVhay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImJyXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgc3RhdGUuaW5zZXJ0RnJvbShkb20sIHRoaXMpO1xuICB9IH0pO1xuXG5fbW9kZWwuSW1hZ2UucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJpbWdcIiwgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGRvbSwgc3RhdGUpIHtcbiAgICBzdGF0ZS5pbnNlcnRGcm9tKGRvbSwgdGhpcywge1xuICAgICAgc3JjOiBkb20uZ2V0QXR0cmlidXRlKFwic3JjXCIpLFxuICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSB8fCBudWxsLFxuICAgICAgYWx0OiBkb20uZ2V0QXR0cmlidXRlKFwiYWx0XCIpIHx8IG51bGxcbiAgICB9KTtcbiAgfSB9KTtcblxuLy8gSW5saW5lIHN0eWxlIHRva2Vuc1xuXG5fbW9kZWwuTGlua01hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJhXCIsIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShkb20sIHN0YXRlKSB7XG4gICAgdmFyIGhyZWYgPSBkb20uZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICBpZiAoIWhyZWYpIHJldHVybiBmYWxzZTtcbiAgICBzdGF0ZS53cmFwTWFyayhkb20sIHRoaXMuY3JlYXRlKHsgaHJlZjogaHJlZiwgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSB9KSk7XG4gIH0gfSk7XG5cbl9tb2RlbC5FbU1hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJpXCIsIHBhcnNlOiBcIm1hcmtcIiB9KTtcbl9tb2RlbC5FbU1hcmsucmVnaXN0ZXIoXCJwYXJzZURPTVwiLCB7IHRhZzogXCJlbVwiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5cbl9tb2RlbC5TdHJvbmdNYXJrLnJlZ2lzdGVyKFwicGFyc2VET01cIiwgeyB0YWc6IFwiYlwiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5fbW9kZWwuU3Ryb25nTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcInN0cm9uZ1wiLCBwYXJzZTogXCJtYXJrXCIgfSk7XG5cbl9tb2RlbC5Db2RlTWFyay5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHsgdGFnOiBcImNvZGVcIiwgcGFyc2U6IFwibWFya1wiIH0pOyIsIi8vICEhIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSB3YXkgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBwYXJzZXJzIGZyb21cbi8vIHZhcmlvdXMgaW5wdXQgZm9ybWF0cyB0byBQcm9zZU1pcnJvcidzIFtkb2N1bWVudCBmb3JtYXRdKCNOb2RlKS4gVG9cbi8vIGxvYWQgdGhlIGFjdHVhbCBwYXJzZXJzLCB5b3UgbmVlZCB0byBpbXBvcnQgcGFyc2VyIG1vZHVsZXMgbGlrZVxuLy8gYHBhcnNlL2RvbWAgb3IgYHBhcnNlL21hcmtkb3duYCwgd2hpY2ggd2lsbCB0aGVuIHJlZ2lzdGVyXG4vLyB0aGVtc2VsdmVzIGhlcmUsIGFzIHdlbGwgYXMgZXhwb3J0IHNwZWNpYWwtcHVycG9zZSBwYXJzaW5nXG4vLyBmdW5jdGlvbnMuXG4vL1xuLy8gVGhlc2UgYXJlIHRoZSBwYXJzZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbjpcbi8vXG4vLyAqKmBcImpzb25cImAqKlxuLy8gICA6IFRoZSB0b3AtbGV2ZWwgbW9kdWxlIGRlZmluZXMgYSBzaW5nbGUgcGFyc2VyIGBcImpzb25cImAsIHdoaWNoXG4vLyAgICAgdXNlcyBgTm9kZS5mcm9tSlNPTmAgdG8gcGFyc2UgSlNPTiBkYXRhLlxuLy9cbi8vICoqYFwiZG9tXCJgKipcbi8vICAgOiBQYXJzZXMgW0RPTVxuLy8gICAgIG5vZGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZSkuXG4vLyAgICAgRGVmaW5lZCBpbiBgcGFyc2UvZG9tYC4gU2VlIGBmcm9tRE9NYC5cbi8vXG4vLyAqKmBcImh0bWxcImAqKlxuLy8gICA6IFBhcnNlcyBzdHJpbmdzIG9mIEhUTUwgY29udGVudC4gRGVmaW5lZCBpbiBgcGFyc2UvZG9tYC5cbi8vXG4vLyAqKmBcIm1hcmtkb3duXCJgKipcbi8vICAgOiBQYXJzZXMgc3RyaW5ncyBvZlxuLy8gICAgIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKS1mb3JtYXR0ZWQgdGV4dC4gRGVmaW5lZCBpblxuLy8gICAgIGBwYXJzZS9tYXJrZG93bmAuIFNlZSBgZnJvbU1hcmtkb3duYC5cbi8vXG4vLyAqKmBcInRleHRcImAqKlxuLy8gICA6IFNpbXBseSBzcGxpdHMgYSBzdHJpbmcgb2YgdGV4dCBvbiBibGFuayBsaW5lcyBhbmQgY3JlYXRlcyBhXG4vLyAgICAgZG9jdW1lbnQgY29udGFpbmluZyB0aG9zZSBsaW5lcyBhcyBwYXJhZ3JhcGhzLiBEZWZpbmVkIGluXG4vLyAgICAgYHBhcnNlL3RleHRgLiBTZWUgYGZyb21UZXh0YC5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnBhcnNlRnJvbSA9IHBhcnNlRnJvbTtcbmV4cG9ydHMua25vd25Tb3VyY2UgPSBrbm93blNvdXJjZTtcbmV4cG9ydHMuZGVmaW5lU291cmNlID0gZGVmaW5lU291cmNlO1xudmFyIHBhcnNlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyA6OiAoU2NoZW1hLCBhbnksIHN0cmluZywgP09iamVjdCkg4oaSIE5vZGVcbi8vIFBhcnNlIGRvY3VtZW50IGB2YWx1ZWAgZnJvbSB0aGUgZm9ybWF0IG5hbWVkIGJ5IGBmb3JtYXRgLiBJZlxuLy8gYG9wdGlvbnNgIGlzIGdpdmVuLCBpdCBpcyBwYXNzZWQgYWxvbmcgdG8gdGhlIHBhcnNlciBmdW5jdGlvbi5cblxuZnVuY3Rpb24gcGFyc2VGcm9tKHNjaGVtYSwgdmFsdWUsIGZvcm1hdCwgb3B0aW9ucykge1xuICB2YXIgY29udmVydGVyID0gcGFyc2Vyc1tmb3JtYXRdO1xuICBpZiAoIWNvbnZlcnRlcikgdGhyb3cgbmV3IEVycm9yKFwiU291cmNlIGZvcm1hdCBcIiArIGZvcm1hdCArIFwiIG5vdCBkZWZpbmVkXCIpO1xuICByZXR1cm4gY29udmVydGVyKHNjaGVtYSwgdmFsdWUsIG9wdGlvbnMpO1xufVxuXG4vLyA6OiAoc3RyaW5nKSDihpIgYm9vbFxuLy8gUXVlcnkgd2hldGhlciBhIHBhcnNlciBmb3IgdGhlIG5hbWVkIGZvcm1hdCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuXG5mdW5jdGlvbiBrbm93blNvdXJjZShmb3JtYXQpIHtcbiAgcmV0dXJuICEhcGFyc2Vyc1tmb3JtYXRdO1xufVxuXG4vLyA6OiAoc3RyaW5nLCAoU2NoZW1hLCBhbnksID9PYmplY3QpIOKGkiBOb2RlKVxuLy8gUmVnaXN0ZXIgYSBwYXJzZXIgZnVuY3Rpb24gZm9yIGBmb3JtYXRgLlxuXG5mdW5jdGlvbiBkZWZpbmVTb3VyY2UoZm9ybWF0LCBmdW5jKSB7XG4gIHBhcnNlcnNbZm9ybWF0XSA9IGZ1bmM7XG59XG5cbmRlZmluZVNvdXJjZShcImpzb25cIiwgZnVuY3Rpb24gKHNjaGVtYSwganNvbikge1xuICByZXR1cm4gc2NoZW1hLm5vZGVGcm9tSlNPTihqc29uKTtcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5mcm9tVGV4dCA9IGZyb21UZXh0O1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbi8vIEZJWE1FIGlzIGl0IG1lYW5pbmdmdWwgdG8gdHJ5IGFuZCBhdHRhY2ggdGV4dC1wYXJzaW5nIGluZm9ybWF0aW9uXG4vLyB0byBub2RlIHR5cGVzP1xuXG4vLyA6OiAoU2NoZW1hLCBzdHJpbmcpIOKGkiBOb2RlXG4vLyBDb252ZXJ0IGEgc3RyaW5nIGludG8gYSBzaW1wbGUgUHJvc2VNaXJyb3IgZG9jdW1lbnQuXG5cbmZ1bmN0aW9uIGZyb21UZXh0KHNjaGVtYSwgdGV4dCkge1xuICB2YXIgYmxvY2tzID0gdGV4dC50cmltKCkuc3BsaXQoL1xcbnsyLH0vKTtcbiAgdmFyIG5vZGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwYW5zID0gW107XG4gICAgdmFyIHBhcnRzID0gYmxvY2tzW2ldLnNwbGl0KFwiXFxuXCIpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChqKSBzcGFucy5wdXNoKHNjaGVtYS5ub2RlKFwiaGFyZF9icmVha1wiKSk7XG4gICAgICBpZiAocGFydHNbal0pIHNwYW5zLnB1c2goc2NoZW1hLnRleHQocGFydHNbal0pKTtcbiAgICB9XG4gICAgbm9kZXMucHVzaChzY2hlbWEubm9kZShcInBhcmFncmFwaFwiLCBudWxsLCBzcGFucykpO1xuICB9XG4gIGlmICghbm9kZXMubGVuZ3RoKSBub2Rlcy5wdXNoKHNjaGVtYS5ub2RlKFwicGFyYWdyYXBoXCIpKTtcbiAgcmV0dXJuIHNjaGVtYS5ub2RlKFwiZG9jXCIsIG51bGwsIG5vZGVzKTtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVTb3VyY2UpKFwidGV4dFwiLCBmcm9tVGV4dCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZXhwb3J0cy50b0RPTSA9IHRvRE9NO1xuZXhwb3J0cy5yZW5kZXJOb2RlVG9ET00gPSByZW5kZXJOb2RlVG9ET007XG5leHBvcnRzLnRvSFRNTCA9IHRvSFRNTDtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG4vLyA7OyAjdG9jPWZhbHNlIE9iamVjdCB1c2VkIHRvIHRvIGV4cG9zZSByZWxldmFudCB2YWx1ZXMgYW5kIG1ldGhvZHNcbi8vIHRvIERPTSBzZXJpYWxpemVyIGZ1bmN0aW9ucy5cblxudmFyIERPTVNlcmlhbGl6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBET01TZXJpYWxpemVyKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRE9NU2VyaWFsaXplcik7XG5cbiAgICAvLyA6OiBPYmplY3QgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBzZXJpYWxpemVyLlxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gOjogRE9NRG9jdW1lbnQgVGhlIERPTSBkb2N1bWVudCBpbiB3aGljaCB3ZSBhcmUgd29ya2luZy5cbiAgICB0aGlzLmRvYyA9IHRoaXMub3B0aW9ucy5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQ7XG4gIH1cblxuICAvLyA6OiAoTm9kZSwgP09iamVjdCkg4oaSIERPTUZyYWdtZW50XG4gIC8vIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gbm9kZSB0byBhIERPTSBmcmFnbWVudC4gV2hlbiBub3RcbiAgLy8gaW4gdGhlIGJyb3dzZXIsIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiwgY29udGFpbmluZyBhIERPTSBkb2N1bWVudCxcbiAgLy8gc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemUgY2FuIGNyZWF0ZSBub2Rlcy5cbiAgLy9cbiAgLy8gVG8gZGVmaW5lIHJlbmRlcmluZyBiZWhhdmlvciBmb3IgeW91ciBvd24gW25vZGVdKCNOb2RlVHlwZSkgYW5kXG4gIC8vIFttYXJrXSgjTWFya1R5cGUpIHR5cGVzLCBnaXZlIHRoZW0gYSBgc2VyaWFsaXplRE9NYCBtZXRob2QuIFRoaXNcbiAgLy8gbWV0aG9kIGlzIHBhc3NlZCBhIGBOb2RlYCBhbmQgYSBgRE9NU2VyaWFsaXplcmAsIGFuZCBzaG91bGQgcmV0dXJuXG4gIC8vIHRoZSBbRE9NXG4gIC8vIG5vZGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlKSB0aGF0XG4gIC8vIHJlcHJlc2VudHMgdGhpcyBub2RlIGFuZCBpdHMgY29udGVudC4gRm9yIG1hcmtzLCB0aGF0IHNob3VsZCBiZSBhblxuICAvLyBpbmxpbmUgd3JhcHBpbmcgbm9kZSBsaWtlIGA8YT5gIG9yIGA8c3Ryb25nPmAuXG4gIC8vXG4gIC8vIEluZGl2aWR1YWwgYXR0cmlidXRlcyBjYW4gYWxzbyBkZWZpbmUgc2VyaWFsaXphdGlvbiBiZWhhdmlvci4gSWYgYW5cbiAgLy8gYEF0dHJpYnV0ZWAgb2JqZWN0IGhhcyBhIGBzZXJpYWxpemVET01gIG1ldGhvZCwgdGhhdCB3aWxsIGJlIGNhbGxlZFxuICAvLyB3aXRoIHRoZSBET00gbm9kZSByZXByZXNlbnRpbmcgdGhlIG5vZGUgdGhhdCB0aGUgYXR0cmlidXRlIGFwcGxpZXNcbiAgLy8gdG8gYW5kIHRoZSBhdHR0cmlidXRlJ3MgdmFsdWUsIHNvIHRoYXQgaXQgY2FuIHNldCBhZGRpdGlvbmFsIERPTVxuICAvLyBhdHRyaWJ1dGVzIG9uIHRoZSBET00gbm9kZS5cblxuICAvLyA6OiAoc3RyaW5nLCA/T2JqZWN0LCAuLi51bmlvbjxzdHJpbmcsIERPTU5vZGU+KSDihpIgRE9NTm9kZVxuICAvLyBDcmVhdGUgYSBET00gbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgd2l0aCAob3B0aW9uYWxseSkgdGhlIGdpdmVuXG4gIC8vIGF0dHJpYnV0ZXMgYW5kIGNvbnRlbnQuIENvbnRlbnQgZWxlbWVudHMgbWF5IGJlIHN0cmluZ3MgKGZvciB0ZXh0XG4gIC8vIG5vZGVzKSBvciBvdGhlciBET00gbm9kZXMuXG5cbiAgX2NyZWF0ZUNsYXNzKERPTVNlcmlhbGl6ZXIsIFt7XG4gICAga2V5OiBcImVsdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbHQodHlwZSwgYXR0cnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgaWYgKGF0dHJzKSBmb3IgKHZhciBfbmFtZSBpbiBhdHRycykge1xuICAgICAgICBpZiAoX25hbWUgPT0gXCJzdHlsZVwiKSByZXN1bHQuc3R5bGUuY3NzVGV4dCA9IGF0dHJzW19uYW1lXTtlbHNlIGlmIChhdHRyc1tfbmFtZV0pIHJlc3VsdC5zZXRBdHRyaWJ1dGUoX25hbWUsIGF0dHJzW19uYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZW50ID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBjb250ZW50W19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdC5hcHBlbmRDaGlsZCh0eXBlb2YgY29udGVudFtpXSA9PSBcInN0cmluZ1wiID8gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoY29udGVudFtpXSkgOiBjb250ZW50W2ldKTtcbiAgICAgIH1yZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJOb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck5vZGUobm9kZSwgb2Zmc2V0KSB7XG4gICAgICB2YXIgZG9tID0gbm9kZS50eXBlLnNlcmlhbGl6ZURPTShub2RlLCB0aGlzKTtcbiAgICAgIGZvciAodmFyIGF0dHIgaW4gbm9kZS50eXBlLmF0dHJzKSB7XG4gICAgICAgIHZhciBkZXNjID0gbm9kZS50eXBlLmF0dHJzW2F0dHJdO1xuICAgICAgICBpZiAoZGVzYy5zZXJpYWxpemVET00pIGRlc2Muc2VyaWFsaXplRE9NKGRvbSwgbm9kZS5hdHRyc1thdHRyXSwgdGhpcywgbm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9uUmVuZGVyKSBkb20gPSB0aGlzLm9wdGlvbnMub25SZW5kZXIobm9kZSwgZG9tLCBvZmZzZXQpIHx8IGRvbTtcbiAgICAgIHJldHVybiBkb207XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckNvbnRlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyQ29udGVudChub2RlLCB3aGVyZSkge1xuICAgICAgaWYgKCF3aGVyZSkgd2hlcmUgPSB0aGlzLmRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHRoaXMucmVuZGVyQmxvY2tzSW50byhub2RlLCB3aGVyZSk7ZWxzZSBpZiAodGhpcy5vcHRpb25zLnJlbmRlcklubGluZUZsYXQpIHRoaXMucmVuZGVySW5saW5lRmxhdEludG8obm9kZSwgd2hlcmUpO2Vsc2UgdGhpcy5yZW5kZXJJbmxpbmVJbnRvKG5vZGUsIHdoZXJlKTtcbiAgICAgIHJldHVybiB3aGVyZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQmxvY2tzSW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJCbG9ja3NJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSBwYXJlbnQuaXRlcigpLCBjaGlsZCA9IHVuZGVmaW5lZDsgY2hpbGQgPSBpLm5leHQoKS52YWx1ZTspIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB0aGlzLm9wdGlvbnMucGF0aC5wdXNoKGkub2Zmc2V0IC0gY2hpbGQud2lkdGgpO1xuICAgICAgICB3aGVyZS5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIGkub2Zmc2V0IC0gY2hpbGQud2lkdGgpKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXRoKSB0aGlzLm9wdGlvbnMucGF0aC5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVySW5saW5lSW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJbmxpbmVJbnRvKHBhcmVudCwgd2hlcmUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB0b3AgPSB3aGVyZTtcbiAgICAgIHZhciBhY3RpdmUgPSBbXTtcbiAgICAgIHBhcmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGtlZXAgPSAwO1xuICAgICAgICBmb3IgKDsga2VlcCA8IE1hdGgubWluKGFjdGl2ZS5sZW5ndGgsIG5vZGUubWFya3MubGVuZ3RoKTsgKytrZWVwKSBpZiAoIW5vZGUubWFya3Nba2VlcF0uZXEoYWN0aXZlW2tlZXBdKSkgYnJlYWs7XG4gICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgIGFjdGl2ZS5wb3AoKTtcbiAgICAgICAgICB0b3AgPSB0b3AucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCA8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGFkZCA9IG5vZGUubWFya3NbYWN0aXZlLmxlbmd0aF07XG4gICAgICAgICAgYWN0aXZlLnB1c2goYWRkKTtcbiAgICAgICAgICB0b3AgPSB0b3AuYXBwZW5kQ2hpbGQoX3RoaXMucmVuZGVyTWFyayhhZGQpKTtcbiAgICAgICAgfVxuICAgICAgICB0b3AuYXBwZW5kQ2hpbGQoX3RoaXMucmVuZGVyTm9kZShub2RlLCBvZmZzZXQpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJJbmxpbmVGbGF0SW50b1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJJbmxpbmVGbGF0SW50byhwYXJlbnQsIHdoZXJlKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcGFyZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIHN0YXJ0KSB7XG4gICAgICAgIHZhciBkb20gPSBfdGhpczIucmVuZGVyTm9kZShub2RlLCBzdGFydCk7XG4gICAgICAgIGRvbSA9IF90aGlzMi53cmFwSW5saW5lRmxhdChkb20sIG5vZGUubWFya3MpO1xuICAgICAgICBkb20gPSBfdGhpczIub3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KG5vZGUsIGRvbSwgc3RhcnQpIHx8IGRvbTtcbiAgICAgICAgd2hlcmUuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJNYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck1hcmsobWFyaykge1xuICAgICAgdmFyIGRvbSA9IG1hcmsudHlwZS5zZXJpYWxpemVET00obWFyaywgdGhpcyk7XG4gICAgICBmb3IgKHZhciBhdHRyIGluIG1hcmsudHlwZS5hdHRycykge1xuICAgICAgICB2YXIgZGVzYyA9IG1hcmsudHlwZS5hdHRyc1thdHRyXTtcbiAgICAgICAgaWYgKGRlc2Muc2VyaWFsaXplRE9NKSBkZXNjLnNlcmlhbGl6ZURPTShkb20sIG1hcmsuYXR0cnNbYXR0cl0sIHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcElubGluZUZsYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcElubGluZUZsYXQoZG9tLCBtYXJrcykge1xuICAgICAgZm9yICh2YXIgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciB3cmFwID0gdGhpcy5yZW5kZXJNYXJrKG1hcmtzW2ldKTtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICBkb20gPSB3cmFwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG5cbiAgICAvLyA6OiAoTm9kZSwgc3RyaW5nLCA/T2JqZWN0KSDihpIgRE9NTm9kZVxuICAgIC8vIFJlbmRlciB0aGUgY29udGVudCBvZiBQcm9zZU1pcnJvciBub2RlIGludG8gYSBET00gbm9kZSB3aXRoIHRoZVxuICAgIC8vIGdpdmVuIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzLlxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckFzKG5vZGUsIHRhZ05hbWUsIHRhZ0F0dHJzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDb250ZW50KG5vZGUsIHRoaXMuZWx0KHRhZ05hbWUsIHRhZ0F0dHJzKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERPTVNlcmlhbGl6ZXI7XG59KSgpO1xuXG5mdW5jdGlvbiB0b0RPTShub2RlKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgcmV0dXJuIG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpLnJlbmRlckNvbnRlbnQobm9kZSk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lVGFyZ2V0KShcImRvbVwiLCB0b0RPTSk7XG5cbi8vIDo6IChOb2RlLCA/T2JqZWN0KSDihpIgRE9NTm9kZVxuLy8gU2VyaWFsaXplIGEgZ2l2ZW4gbm9kZSB0byBhIERPTSBub2RlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkXG4vLyB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4vLyBkb2N1bWVudC5cblxuZnVuY3Rpb24gcmVuZGVyTm9kZVRvRE9NKG5vZGUsIG9wdGlvbnMsIG9mZnNldCkge1xuICB2YXIgc2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpO1xuICB2YXIgZG9tID0gc2VyaWFsaXplci5yZW5kZXJOb2RlKG5vZGUsIG9mZnNldCk7XG4gIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgZG9tID0gc2VyaWFsaXplci53cmFwSW5saW5lRmxhdChkb20sIG5vZGUubWFya3MpO1xuICAgIGlmIChzZXJpYWxpemVyLm9wdGlvbnMucmVuZGVySW5saW5lRmxhdCkgZG9tID0gb3B0aW9ucy5yZW5kZXJJbmxpbmVGbGF0KG5vZGUsIGRvbSwgb2Zmc2V0KSB8fCBkb207XG4gIH1cbiAgcmV0dXJuIGRvbTtcbn1cblxuLy8gOjogKE5vZGUsID9PYmplY3QpIOKGkiBzdHJpbmdcbi8vIFNlcmlhbGl6ZSBhIG5vZGUgYXMgYW4gSFRNTCBzdHJpbmcuIEdvZXMgdGhyb3VnaCBgdG9ET01gIGFuZCB0aGVuXG4vLyBzZXJpYWxpemVzIHRoZSByZXN1bHQuIEFnYWluLCB5b3UgbXVzdCBwYXNzIGEgYGRvY3VtZW50YCBvcHRpb25cbi8vIHdoZW4gbm90IGluIHRoZSBicm93c2VyLlxuXG5mdW5jdGlvbiB0b0hUTUwobm9kZSwgb3B0aW9ucykge1xuICB2YXIgc2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKG9wdGlvbnMpO1xuICB2YXIgd3JhcCA9IHNlcmlhbGl6ZXIuZWx0KFwiZGl2XCIpO1xuICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIucmVuZGVyQ29udGVudChub2RlKSk7XG4gIHJldHVybiB3cmFwLmlubmVySFRNTDtcbn1cblxuKDAsIF9pbmRleC5kZWZpbmVUYXJnZXQpKFwiaHRtbFwiLCB0b0hUTUwpO1xuXG4vLyBCbG9jayBub2Rlc1xuXG5mdW5jdGlvbiBkZWYoY2xzLCBtZXRob2QpIHtcbiAgY2xzLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBtZXRob2Q7XG59XG5cbmRlZihfbW9kZWwuQmxvY2tRdW90ZSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJibG9ja3F1b3RlXCIpO1xufSk7XG5cbl9tb2RlbC5CbG9ja1F1b3RlLnByb3RvdHlwZS5jb3VudENvb3Jkc0FzQ2hpbGQgPSBmdW5jdGlvbiAoXywgcGF0aCwgZG9tLCBjb29yZHMpIHtcbiAgdmFyIGNoaWxkQm94ID0gZG9tLmZpcnN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGlmIChjb29yZHMubGVmdCA8IGNoaWxkQm94LmxlZnQgLSAyKSByZXR1cm4gX21vZGVsLlBvcy5mcm9tKHBhdGgpO1xufTtcblxuZGVmKF9tb2RlbC5CdWxsZXRMaXN0LCBmdW5jdGlvbiAobm9kZSwgcykge1xuICByZXR1cm4gcy5yZW5kZXJBcyhub2RlLCBcInVsXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuT3JkZXJlZExpc3QsIGZ1bmN0aW9uIChub2RlLCBzKSB7XG4gIHJldHVybiBzLnJlbmRlckFzKG5vZGUsIFwib2xcIiwgeyBzdGFydDogbm9kZS5hdHRycy5vcmRlciAhPSBcIjFcIiAmJiBub2RlLmF0dHJzLm9yZGVyIH0pO1xufSk7XG5cbl9tb2RlbC5PcmRlcmVkTGlzdC5wcm90b3R5cGUuY291bnRDb29yZHNBc0NoaWxkID0gX21vZGVsLkJ1bGxldExpc3QucHJvdG90eXBlLmNvdW50Q29vcmRzQXNDaGlsZCA9IGZ1bmN0aW9uIChfLCBwYXRoLCBkb20sIGNvb3Jkcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gZG9tLmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKCFjaGlsZC5oYXNBdHRyaWJ1dGUoXCJwbS1vZmZzZXRcIikpIGNvbnRpbnVlO1xuICAgIHZhciBjaGlsZEJveCA9IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChjb29yZHMubGVmdCA+IGNoaWxkQm94LmxlZnQgLSAyKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2hpbGRCb3gudG9wIDw9IGNvb3Jkcy50b3AgJiYgY2hpbGRCb3guYm90dG9tID49IGNvb3Jkcy50b3ApIHJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBpKTtcbiAgfVxufTtcblxuZGVmKF9tb2RlbC5MaXN0SXRlbSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJsaVwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLkhvcml6b250YWxSdWxlLCBmdW5jdGlvbiAoXywgcykge1xuICByZXR1cm4gcy5lbHQoXCJoclwiKTtcbn0pO1xuXG5kZWYoX21vZGVsLlBhcmFncmFwaCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJwXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuSGVhZGluZywgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMucmVuZGVyQXMobm9kZSwgXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsKTtcbn0pO1xuXG5kZWYoX21vZGVsLkNvZGVCbG9jaywgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgdmFyIGNvZGUgPSBzLnJlbmRlckFzKG5vZGUsIFwiY29kZVwiKTtcbiAgaWYgKG5vZGUuYXR0cnMucGFyYW1zICE9IG51bGwpIGNvZGUuY2xhc3NOYW1lID0gXCJmZW5jZSBcIiArIG5vZGUuYXR0cnMucGFyYW1zLnJlcGxhY2UoLyhefFxccyspL2csIFwiJCZsYW5nLVwiKTtcbiAgcmV0dXJuIHMuZWx0KFwicHJlXCIsIG51bGwsIGNvZGUpO1xufSk7XG5cbi8vIElubGluZSBjb250ZW50XG5cbmRlZihfbW9kZWwuVGV4dCwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMuZG9jLmNyZWF0ZVRleHROb2RlKG5vZGUudGV4dCk7XG59KTtcblxuZGVmKF9tb2RlbC5JbWFnZSwgZnVuY3Rpb24gKG5vZGUsIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiaW1nXCIsIHtcbiAgICBzcmM6IG5vZGUuYXR0cnMuc3JjLFxuICAgIGFsdDogbm9kZS5hdHRycy5hbHQsXG4gICAgdGl0bGU6IG5vZGUuYXR0cnMudGl0bGVcbiAgfSk7XG59KTtcblxuZGVmKF9tb2RlbC5IYXJkQnJlYWssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImJyXCIpO1xufSk7XG5cbi8vIElubGluZSBzdHlsZXNcblxuZGVmKF9tb2RlbC5FbU1hcmssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImVtXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuU3Ryb25nTWFyaywgZnVuY3Rpb24gKF8sIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwic3Ryb25nXCIpO1xufSk7XG5cbmRlZihfbW9kZWwuQ29kZU1hcmssIGZ1bmN0aW9uIChfLCBzKSB7XG4gIHJldHVybiBzLmVsdChcImNvZGVcIik7XG59KTtcblxuZGVmKF9tb2RlbC5MaW5rTWFyaywgZnVuY3Rpb24gKG1hcmssIHMpIHtcbiAgcmV0dXJuIHMuZWx0KFwiYVwiLCB7IGhyZWY6IG1hcmsuYXR0cnMuaHJlZixcbiAgICB0aXRsZTogbWFyay5hdHRycy50aXRsZSB9KTtcbn0pOyIsIi8vICEhIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgd2F5IHRvIHJlZ2lzdGVyIGFuZCBhY2Nlc3MgZnVuY3Rpb25zIHRoYXRcbi8vIHNlcmlhbGl6ZSBQcm9zZU1pcnJvciBbZG9jdW1lbnRzXSgjTm9kZSkgdG8gdmFyaW91cyBmb3JtYXRzLiBUb1xuLy8gbG9hZCB0aGUgYWN0dWFsIHNlcmlhbGl6ZXJzLCB5b3UgbmVlZCB0byBpbmNsdWRlIHN1Ym1vZHVsZXMgb2YgdGhpc1xuLy8gbW9kdWxlIChvciAzcmQgcGFydHkgc2VyaWFsaXphdGlvbiBtb2R1bGVzKSwgd2hpY2ggd2lsbCByZWdpc3RlclxuLy8gdGhlbXNlbHZlcyB0byB0aGlzIG1vZHVsZS5cbi8vXG4vLyBUaGVzZSBhcmUgdGhlIHNlcmlhbGl6ZXJzIGRlZmluZWQ6XG4vL1xuLy8gKipgXCJqc29uXCJgKipcbi8vICAgOiBVc2UgYE5vZGUudG9KU09OYCB0byBzZXJpYWxpemUgdGhlIG5vZGUgYXMgSlNPTi4gRGVmaW5lZCBieSB0aGVcbi8vICAgICB0b3AtbGV2ZWwgYHNlcmlhbGl6ZWAgbW9kdWxlLlxuLy9cbi8vICoqYFwiZG9tXCJgKipcbi8vICAgOiBTZXJpYWxpemUgdG8gYSBbRE9NXG4vLyAgICAgZnJhZ21lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50KS5cbi8vICAgICBEZWZpbmVkIGluIGBzZXJpYWxpemUvZG9tYC4gU2VlIGB0b0RPTWAuXG4vL1xuLy8gKipgXCJodG1sXCJgKipcbi8vICAgOiBTZXJpYWxpemUgdG8gSFRNTCB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvZG9tYC4gU2VlIGB0b0hUTUxgLlxuLy9cbi8vICoqYFwibWFya2Rvd25cImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykgbWFya2VkLXVwXG4vLyAgICAgdGV4dC4gRGVmaW5lZCBpbiBgc2VyaWFsaXplL21hcmtkb3duYC4gU2VlIGB0b01hcmtkb3duYC5cbi8vXG4vLyAqKmBcInRleHRcImAqKlxuLy8gICA6IFNlcmlhbGl6ZSB0byBwbGFpbiB0ZXh0LiBEZWZpbmVkIGluIGBzZXJpYWxpemUvdGV4dGAuIFNlZSBgdG9UZXh0YC5cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnNlcmlhbGl6ZVRvID0gc2VyaWFsaXplVG87XG5leHBvcnRzLmtub3duVGFyZ2V0ID0ga25vd25UYXJnZXQ7XG5leHBvcnRzLmRlZmluZVRhcmdldCA9IGRlZmluZVRhcmdldDtcbnZhciBzZXJpYWxpemVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIDo6IChOb2RlLCBzdHJpbmcsID9PYmplY3QpIOKGkiBhbnlcbi8vIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gZG9jdW1lbnQgdG8gdGhlIGdpdmVuIGZvcm1hdC4gSWYgYG9wdGlvbnNgIGlzXG4vLyBnaXZlbiwgaXQgd2lsbCBiZSBwYXNzZWQgYWxvbmcgdG8gdGhlIHNlcmlhbGl6ZXIgZnVuY3Rpb24uXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRvKGRvYywgZm9ybWF0LCBvcHRpb25zKSB7XG4gIHZhciBjb252ZXJ0ZXIgPSBzZXJpYWxpemVyc1tmb3JtYXRdO1xuICBpZiAoIWNvbnZlcnRlcikgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IGZvcm1hdCBcIiArIGZvcm1hdCArIFwiIG5vdCBkZWZpbmVkXCIpO1xuICByZXR1cm4gY29udmVydGVyKGRvYywgb3B0aW9ucyk7XG59XG5cbi8vIDo6IChzdHJpbmcpIOKGkiBib29sXG4vLyBRdWVyeSB3aGV0aGVyIGEgZ2l2ZW4gc2VyaWFsaXphdGlvbiBmb3JtYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cblxuZnVuY3Rpb24ga25vd25UYXJnZXQoZm9ybWF0KSB7XG4gIHJldHVybiAhIXNlcmlhbGl6ZXJzW2Zvcm1hdF07XG59XG5cbi8vIDo6IChzdHJpbmcsIChOb2RlLCA/T2JqZWN0KSDihpIgYW55KVxuLy8gUmVnaXN0ZXIgYSBmdW5jdGlvbiBhcyB0aGUgc2VyaWFsaXplciBmb3IgYGZvcm1hdGAuXG5cbmZ1bmN0aW9uIGRlZmluZVRhcmdldChmb3JtYXQsIGZ1bmMpIHtcbiAgc2VyaWFsaXplcnNbZm9ybWF0XSA9IGZ1bmM7XG59XG5cbmRlZmluZVRhcmdldChcImpzb25cIiwgZnVuY3Rpb24gKGRvYykge1xuICByZXR1cm4gZG9jLnRvSlNPTigpO1xufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRvVGV4dCA9IHRvVGV4dDtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG5fbW9kZWwuQmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQgPSBmdW5jdGlvbiAobm9kZSkge1xuICB2YXIgYWNjdW0gPSBcIlwiO1xuICBub2RlLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGFjY3VtICs9IGNoaWxkLnR5cGUuc2VyaWFsaXplVGV4dChjaGlsZCk7XG4gIH0pO1xuICByZXR1cm4gYWNjdW07XG59O1xuXG5fbW9kZWwuVGV4dGJsb2NrLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIHRleHQgPSBfbW9kZWwuQmxvY2sucHJvdG90eXBlLnNlcmlhbGl6ZVRleHQobm9kZSk7XG4gIHJldHVybiB0ZXh0ICYmIHRleHQgKyBcIlxcblxcblwiO1xufTtcblxuX21vZGVsLklubGluZS5wcm90b3R5cGUuc2VyaWFsaXplVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFwiXCI7XG59O1xuXG5fbW9kZWwuSGFyZEJyZWFrLnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gXCJcXG5cIjtcbn07XG5cbl9tb2RlbC5UZXh0LnByb3RvdHlwZS5zZXJpYWxpemVUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGV4dDtcbn07XG5cbi8vIDo6IChOb2RlKSDihpIgc3RyaW5nXG4vLyBTZXJpYWxpemUgYSBub2RlIGFzIGEgcGxhaW4gdGV4dCBzdHJpbmcuXG5cbmZ1bmN0aW9uIHRvVGV4dChkb2MpIHtcbiAgcmV0dXJuIGRvYy50eXBlLnNlcmlhbGl6ZVRleHQoZG9jKS50cmltKCk7XG59XG5cbigwLCBfaW5kZXguZGVmaW5lVGFyZ2V0KShcInRleHRcIiwgdG9UZXh0KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuTGlmdCA9IGNhbkxpZnQ7XG5leHBvcnRzLmNhbldyYXAgPSBjYW5XcmFwO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF90cmVlID0gcmVxdWlyZShcIi4vdHJlZVwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYGFuY2VzdG9yYCoqXG4vLyAgICA6IENoYW5nZSB0aGUgc3RhY2sgb2Ygbm9kZXMgdGhhdCB3cmFwIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudFxuLy8gICAgICBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCwgd2hpY2ggbXVzdCBwb2ludCBpbnRvIHRoZSBzYW1lIHBhcmVudFxuLy8gICAgICBub2RlLlxuLy9cbi8vICAgICAgVGhlIHNldCBvZiBhbmNlc3RvcnMgdG8gcmVwbGFjZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgZGVwdGhgXG4vLyAgICAgIHByb3BlcnR5IG9mIHRoZSBzdGVwJ3MgcGFyYW1ldGVyLiBJZiB0aGlzIGlzIGdyZWF0ZXIgdGhhblxuLy8gICAgICB6ZXJvLCBgZnJvbWAgYW5kIGB0b2AgbXVzdCBwb2ludCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG4vLyAgICAgIHN0YWNrIG9mIG5vZGVzLCBvZiB0aGF0IGRlcHRoLCBzaW5jZSB0aGlzIHN0ZXAgd2lsbCBub3Qgc3BsaXRcbi8vICAgICAgbm9kZXMuXG4vL1xuLy8gICAgICBUaGUgc2V0IG9mIG5ldyBhbmNlc3RvcnMgdG8gd3JhcCB3aXRoIGlzIGRldGVybWluZWQgYnkgdGhlXG4vLyAgICAgIGB0eXBlc2AgYW5kIGBhdHRyc2AgcHJvcGVydGllcyBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgZmlyc3Rcbi8vICAgICAgc2hvdWxkIGJlIGFuIGFycmF5IG9mIGBOb2RlVHlwZWBzLCBhbmQgdGhlIHNlY29uZCwgb3B0aW9uYWxseSxcbi8vICAgICAgYW4gYXJyYXkgb2YgYXR0cmlidXRlIG9iamVjdHMuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiYW5jZXN0b3JcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgdmFyIGZyb20gPSBzdGVwLmZyb20sXG4gICAgICAgIHRvID0gc3RlcC50bztcbiAgICBpZiAoISgwLCBfdHJlZS5pc0ZsYXRSYW5nZSkoZnJvbSwgdG8pKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdG9QYXJlbnQgPSBmcm9tLnBhdGgsXG4gICAgICAgIHN0YXJ0ID0gZnJvbS5vZmZzZXQsXG4gICAgICAgIGVuZCA9IHRvLm9mZnNldDtcbiAgICB2YXIgX3N0ZXAkcGFyYW0gPSBzdGVwLnBhcmFtO1xuICAgIHZhciBfc3RlcCRwYXJhbSRkZXB0aCA9IF9zdGVwJHBhcmFtLmRlcHRoO1xuICAgIHZhciBkZXB0aCA9IF9zdGVwJHBhcmFtJGRlcHRoID09PSB1bmRlZmluZWQgPyAwIDogX3N0ZXAkcGFyYW0kZGVwdGg7XG4gICAgdmFyIF9zdGVwJHBhcmFtJHR5cGVzID0gX3N0ZXAkcGFyYW0udHlwZXM7XG4gICAgdmFyIHR5cGVzID0gX3N0ZXAkcGFyYW0kdHlwZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogX3N0ZXAkcGFyYW0kdHlwZXM7XG4gICAgdmFyIF9zdGVwJHBhcmFtJGF0dHJzID0gX3N0ZXAkcGFyYW0uYXR0cnM7XG4gICAgdmFyIGF0dHJzID0gX3N0ZXAkcGFyYW0kYXR0cnMgPT09IHVuZGVmaW5lZCA/IFtdIDogX3N0ZXAkcGFyYW0kYXR0cnM7XG5cbiAgICB2YXIgaW5uZXIgPSBkb2MucGF0aChmcm9tLnBhdGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykge1xuICAgICAgaWYgKHN0YXJ0ID4gMCB8fCBlbmQgPCBkb2MucGF0aCh0b1BhcmVudCkuc2l6ZSB8fCB0b1BhcmVudC5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICBzdGFydCA9IHRvUGFyZW50W3RvUGFyZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgZW5kID0gc3RhcnQgKyAxO1xuICAgICAgdG9QYXJlbnQgPSB0b1BhcmVudC5zbGljZSgwLCB0b1BhcmVudC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09IDAgJiYgdHlwZXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHRvUGFyZW50KSxcbiAgICAgICAgcGFyZW50U2l6ZSA9IHBhcmVudC5zaXplLFxuICAgICAgICBuZXdQYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudC50eXBlLmxvY2tlZCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHR5cGVzLmxlbmd0aCkge1xuICAgICAgdmFyIF9yZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdFdyYXBwZXIgPSB0eXBlc1t0eXBlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBpbm5lci5jb250ZW50LnNsaWNlKGZyb20ub2Zmc2V0LCB0by5vZmZzZXQpO1xuICAgICAgICBpZiAoIXBhcmVudC50eXBlLmNhbkNvbnRhaW5UeXBlKHR5cGVzWzBdKSB8fCBjb250ZW50LnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gIWxhc3RXcmFwcGVyLmNhbkNvbnRhaW4obik7XG4gICAgICAgIH0pIHx8ICFpbm5lci5zaXplICYmICFsYXN0V3JhcHBlci5jYW5CZUVtcHR5IHx8IGxhc3RXcmFwcGVyLmxvY2tlZCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHY6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICB2YXIgbm9kZSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSB0eXBlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIG5vZGUgPSB0eXBlc1tpXS5jcmVhdGUoYXR0cnNbaV0sIG5vZGUgfHwgY29udGVudCk7XG4gICAgICAgIH1uZXdQYXJlbnQgPSBwYXJlbnQuc3BsaWNlKHN0YXJ0LCBlbmQsIF9tb2RlbC5GcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGlmICh0eXBlb2YgX3JldCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIF9yZXQudjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFwYXJlbnQudHlwZS5jYW5Db250YWluRnJhZ21lbnQoaW5uZXIuY29udGVudCkgfHwgIWlubmVyLnNpemUgJiYgc3RhcnQgPT0gMCAmJiBlbmQgPT0gcGFyZW50LnNpemUgJiYgIXBhcmVudC50eXBlLmNhbkJlRW1wdHkpIHJldHVybiBudWxsO1xuICAgICAgbmV3UGFyZW50ID0gcGFyZW50LnNwbGljZShzdGFydCwgZW5kLCBpbm5lci5jb250ZW50KTtcbiAgICB9XG4gICAgdmFyIGNvcHkgPSBkb2MucmVwbGFjZURlZXAodG9QYXJlbnQsIG5ld1BhcmVudCk7XG5cbiAgICB2YXIgdG9Jbm5lciA9IHRvUGFyZW50LnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdG9Jbm5lci5wdXNoKGkgPyAwIDogc3RhcnQpO1xuICAgIH12YXIgc3RhcnRPZklubmVyID0gbmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgdHlwZXMubGVuZ3RoID8gMCA6IHN0YXJ0KTtcbiAgICB2YXIgcmVwbGFjZWQgPSBudWxsO1xuICAgIHZhciBpbnNlcnRlZFNpemUgPSB0eXBlcy5sZW5ndGggPyAxIDogdG8ub2Zmc2V0IC0gZnJvbS5vZmZzZXQ7XG4gICAgaWYgKGRlcHRoICE9IHR5cGVzLmxlbmd0aCB8fCBkZXB0aCA+IDEgfHwgdHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIHBvc0JlZm9yZSA9IG5ldyBfbW9kZWwuUG9zKHRvUGFyZW50LCBzdGFydCk7XG4gICAgICB2YXIgcG9zQWZ0ZXIxID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIGVuZCksXG4gICAgICAgICAgcG9zQWZ0ZXIyID0gbmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIHN0YXJ0ICsgaW5zZXJ0ZWRTaXplKTtcbiAgICAgIHZhciBlbmRPZklubmVyID0gbmV3IF9tb2RlbC5Qb3ModG9Jbm5lciwgc3RhcnRPZklubmVyLm9mZnNldCArICh0by5vZmZzZXQgLSBmcm9tLm9mZnNldCkpO1xuICAgICAgcmVwbGFjZWQgPSBbbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShwb3NCZWZvcmUsIGZyb20sIHBvc0JlZm9yZSwgc3RhcnRPZklubmVyKSwgbmV3IF9tYXAuUmVwbGFjZWRSYW5nZSh0bywgcG9zQWZ0ZXIxLCBlbmRPZklubmVyLCBwb3NBZnRlcjIsIHBvc0FmdGVyMSwgcG9zQWZ0ZXIyKV07XG4gICAgfVxuICAgIHZhciBtb3ZlZCA9IFtuZXcgX21hcC5Nb3ZlZFJhbmdlKGZyb20sIHRvLm9mZnNldCAtIGZyb20ub2Zmc2V0LCBzdGFydE9mSW5uZXIpXTtcbiAgICBpZiAoZW5kIC0gc3RhcnQgIT0gaW5zZXJ0ZWRTaXplKSBtb3ZlZC5wdXNoKG5ldyBfbWFwLk1vdmVkUmFuZ2UobmV3IF9tb2RlbC5Qb3ModG9QYXJlbnQsIGVuZCksIHBhcmVudFNpemUgLSBlbmQsIG5ldyBfbW9kZWwuUG9zKHRvUGFyZW50LCBzdGFydCArIGluc2VydGVkU2l6ZSkpKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbmV3IF9tYXAuUG9zTWFwKG1vdmVkLCByZXBsYWNlZCkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBvbGREb2MsIG1hcCkge1xuICAgIHZhciB0eXBlcyA9IFtdLFxuICAgICAgICBhdHRycyA9IFtdO1xuICAgIGlmIChzdGVwLnBhcmFtLmRlcHRoKSBmb3IgKHZhciBpID0gMDsgaSA8IHN0ZXAucGFyYW0uZGVwdGg7IGkrKykge1xuICAgICAgdmFyIF9wYXJlbnQgPSBvbGREb2MucGF0aChzdGVwLmZyb20ucGF0aC5zbGljZSgwLCBzdGVwLmZyb20ucGF0aC5sZW5ndGggLSBpKSk7XG4gICAgICB0eXBlcy51bnNoaWZ0KF9wYXJlbnQudHlwZSk7XG4gICAgICBhdHRycy51bnNoaWZ0KF9wYXJlbnQuYXR0cnMpO1xuICAgIH1cbiAgICB2YXIgbmV3RnJvbSA9IG1hcC5tYXAoc3RlcC5mcm9tKS5wb3M7XG4gICAgdmFyIG5ld1RvID0gc3RlcC5mcm9tLmNtcChzdGVwLnRvKSA/IG1hcC5tYXAoc3RlcC50bywgLTEpLnBvcyA6IG5ld0Zyb207XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwiYW5jZXN0b3JcIiwgbmV3RnJvbSwgbmV3VG8sIG51bGwsIHsgZGVwdGg6IHN0ZXAucGFyYW0udHlwZXMgPyBzdGVwLnBhcmFtLnR5cGVzLmxlbmd0aCA6IDAsXG4gICAgICB0eXBlczogdHlwZXMsIGF0dHJzOiBhdHRycyB9KTtcbiAgfSxcbiAgcGFyYW1Ub0pTT046IGZ1bmN0aW9uIHBhcmFtVG9KU09OKHBhcmFtKSB7XG4gICAgcmV0dXJuIHsgZGVwdGg6IHBhcmFtLmRlcHRoLFxuICAgICAgdHlwZXM6IHBhcmFtLnR5cGVzICYmIHBhcmFtLnR5cGVzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5uYW1lO1xuICAgICAgfSksXG4gICAgICBhdHRyczogcGFyYW0uYXR0cnMgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4geyBkZXB0aDoganNvbi5kZXB0aCxcbiAgICAgIHR5cGVzOiBqc29uLnR5cGVzICYmIGpzb24udHlwZXMubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEubm9kZVR5cGUobik7XG4gICAgICB9KSxcbiAgICAgIGF0dHJzOiBqc29uLmF0dHJzIH07XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjYW5CZUxpZnRlZChkb2MsIHJhbmdlKSB7XG4gIHZhciBjb250ZW50ID0gW2RvYy5wYXRoKHJhbmdlLmZyb20ucGF0aCldLFxuICAgICAgdW53cmFwID0gZmFsc2U7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgcGFyZW50RGVwdGggPSAtMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIChfbm9kZSwgaSkge1xuICAgICAgaWYgKCFjb250ZW50LnNvbWUoZnVuY3Rpb24gKGlubmVyKSB7XG4gICAgICAgIHJldHVybiAhX25vZGUudHlwZS5jYW5Db250YWluQ29udGVudChpbm5lci50eXBlKTtcbiAgICAgIH0pKSBwYXJlbnREZXB0aCA9IGk7XG4gICAgICBfbm9kZSA9IF9ub2RlLmNoaWxkKHJhbmdlLmZyb20ucGF0aFtpXSk7XG4gICAgICBub2RlID0gX25vZGU7XG4gICAgfTtcblxuICAgIGZvciAodmFyIG5vZGUgPSBkb2MsIGkgPSAwOyBpIDwgcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfbG9vcChub2RlLCBpKTtcbiAgICB9XG4gICAgaWYgKHBhcmVudERlcHRoID4gLTEpIHJldHVybiB7IHBhdGg6IHJhbmdlLmZyb20ucGF0aC5zbGljZSgwLCBwYXJlbnREZXB0aCksIHVud3JhcDogdW53cmFwIH07XG4gICAgaWYgKHVud3JhcCB8fCAhY29udGVudFswXS5pc0Jsb2NrKSByZXR1cm4gbnVsbDtcbiAgICBjb250ZW50ID0gY29udGVudFswXS5jb250ZW50LnNsaWNlKHJhbmdlLmZyb20ub2Zmc2V0LCByYW5nZS50by5vZmZzZXQpO1xuICAgIHVud3JhcCA9IHRydWU7XG4gIH1cbn1cblxuLy8gOjogKE5vZGUsIFBvcywgP1Bvcykg4oaSIGJvb2xcbi8vIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbnMnIFtzaWJsaW5nXG4vLyByYW5nZV0oI05vZGUuc2libGluZ1JhbmdlKSwgb3IgYW55IG9mIGl0cyBhbmNlc3RvciBub2RlcywgY2FuIGJlXG4vLyBsaWZ0ZWQgb3V0IG9mIGEgcGFyZW50LlxuXG5mdW5jdGlvbiBjYW5MaWZ0KGRvYywgZnJvbSwgdG8pIHtcbiAgdmFyIHJhbmdlID0gZG9jLnNpYmxpbmdSYW5nZShmcm9tLCB0byB8fCBmcm9tKTtcbiAgdmFyIGZvdW5kID0gY2FuQmVMaWZ0ZWQoZG9jLCByYW5nZSk7XG4gIGlmIChmb3VuZCkgcmV0dXJuIHsgZm91bmQ6IGZvdW5kLCByYW5nZTogcmFuZ2UgfTtcbn1cblxuLy8gOjogKFBvcywgP1Bvcykg4oaSIFRyYW5zZm9ybVxuLy8gTGlmdCB0aGUgbmVhcmVzdCBsaWZ0YWJsZSBhbmNlc3RvciBvZiB0aGUgW3NpYmxpbmdcbi8vIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpIG9mIHRoZSBnaXZlbiBwb3NpdGlvbnMgb3V0IG9mIGl0c1xuLy8gcGFyZW50IChvciBkbyBub3RoaW5nIGlmIG5vIHN1Y2ggbm9kZSBleGlzdHMpLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAoZnJvbSkge1xuICB2YXIgdG8gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBmcm9tIDogYXJndW1lbnRzWzFdO1xuICByZXR1cm4gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuID0gY2FuTGlmdCh0aGlzLmRvYywgZnJvbSwgdG8pO1xuICAgIGlmICghY2FuKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZm91bmQgPSBjYW4uZm91bmQ7XG4gICAgdmFyIHJhbmdlID0gY2FuLnJhbmdlO1xuXG4gICAgdmFyIGRlcHRoID0gcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCAtIGZvdW5kLnBhdGgubGVuZ3RoO1xuICAgIHZhciByYW5nZU5vZGUgPSBmb3VuZC51bndyYXAgJiYgdGhpcy5kb2MucGF0aChyYW5nZS5mcm9tLnBhdGgpO1xuXG4gICAgZm9yICh2YXIgZCA9IDAsIHBvcyA9IHJhbmdlLnRvOzsgZCsrKSB7XG4gICAgICBpZiAocG9zLm9mZnNldCA8IHRoaXMuZG9jLnBhdGgocG9zLnBhdGgpLnNpemUpIHtcbiAgICAgICAgdGhpcy5zcGxpdChwb3MsIGRlcHRoIC0gZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGQgPT0gZGVwdGggLSAxKSBicmVhaztcbiAgICAgIHBvcyA9IHBvcy5zaG9ydGVuKG51bGwsIDEpO1xuICAgIH1cbiAgICBmb3IgKHZhciBkID0gMCwgcG9zID0gcmFuZ2UuZnJvbTs7IGQrKykge1xuICAgICAgaWYgKHBvcy5vZmZzZXQgPiAwKSB7XG4gICAgICAgIHRoaXMuc3BsaXQocG9zLCBkZXB0aCAtIGQpO1xuICAgICAgICB2YXIgY3V0ID0gcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCAtIGRlcHRoLFxuICAgICAgICAgICAgcGF0aCA9IHBvcy5wYXRoLnNsaWNlKDAsIGN1dCkuY29uY2F0KHBvcy5wYXRoW2N1dF0gKyAxKTtcbiAgICAgICAgd2hpbGUgKHBhdGgubGVuZ3RoIDwgcmFuZ2UuZnJvbS5wYXRoLmxlbmd0aCkgcGF0aC5wdXNoKDApO1xuICAgICAgICByYW5nZSA9IHsgZnJvbTogbmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIHRvOiBuZXcgX21vZGVsLlBvcyhwYXRoLCByYW5nZS50by5vZmZzZXQgLSByYW5nZS5mcm9tLm9mZnNldCkgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZCA9PSBkZXB0aCAtIDEpIGJyZWFrO1xuICAgICAgcG9zID0gcG9zLnNob3J0ZW4oKTtcbiAgICB9XG4gICAgaWYgKGZvdW5kLnVud3JhcCkge1xuICAgICAgZm9yICh2YXIgaSA9IHJhbmdlLnRvLm9mZnNldCAtIDE7IGkgPiByYW5nZS5mcm9tLm9mZnNldDsgaS0tKSB7XG4gICAgICAgIHRoaXMuam9pbihuZXcgX21vZGVsLlBvcyhyYW5nZS5mcm9tLnBhdGgsIGkpKTtcbiAgICAgIH12YXIgc2l6ZSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gcmFuZ2VOb2RlLml0ZXIocmFuZ2UuZnJvbS5vZmZzZXQsIHJhbmdlLnRvLm9mZnNldCksIGNoaWxkID0gdW5kZWZpbmVkOyBjaGlsZCA9IGkubmV4dCgpLnZhbHVlOykge1xuICAgICAgICBzaXplICs9IGNoaWxkLnNpemU7XG4gICAgICB9dmFyIHBhdGggPSByYW5nZS5mcm9tLnBhdGguY29uY2F0KHJhbmdlLmZyb20ub2Zmc2V0KTtcbiAgICAgIHJhbmdlID0geyBmcm9tOiBuZXcgX21vZGVsLlBvcyhwYXRoLCAwKSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHNpemUpIH07XG4gICAgICArK2RlcHRoO1xuICAgIH1cbiAgICB0aGlzLnN0ZXAoXCJhbmNlc3RvclwiLCByYW5nZS5mcm9tLCByYW5nZS50bywgbnVsbCwgeyBkZXB0aDogZGVwdGggfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG4vLyA6OiAoTm9kZSwgUG9zLCA/UG9zLCBOb2RlVHlwZSkg4oaSIGJvb2xcbi8vIERldGVybWluZXMgd2hldGhlciB0aGUgW3NpYmxpbmcgcmFuZ2VdKCNOb2RlLnNpYmxpbmdSYW5nZSkgb2YgdGhlXG4vLyBnaXZlbiBwb3NpdGlvbnMgY2FuIGJlIHdyYXBwZWQgaW4gdGhlIGdpdmVuIG5vZGUgdHlwZS5cblxuZnVuY3Rpb24gY2FuV3JhcChkb2MsIGZyb20sIHRvLCB0eXBlKSB7XG4gIHZhciByYW5nZSA9IGRvYy5zaWJsaW5nUmFuZ2UoZnJvbSwgdG8gfHwgZnJvbSk7XG4gIGlmIChyYW5nZS5mcm9tLm9mZnNldCA9PSByYW5nZS50by5vZmZzZXQpIHJldHVybiBudWxsO1xuICB2YXIgcGFyZW50ID0gZG9jLnBhdGgocmFuZ2UuZnJvbS5wYXRoKTtcbiAgdmFyIGFyb3VuZCA9IHBhcmVudC50eXBlLmZpbmRDb25uZWN0aW9uKHR5cGUpO1xuICB2YXIgaW5zaWRlID0gdHlwZS5maW5kQ29ubmVjdGlvbihwYXJlbnQuY2hpbGQocmFuZ2UuZnJvbS5vZmZzZXQpLnR5cGUpO1xuICBpZiAoYXJvdW5kICYmIGluc2lkZSkgcmV0dXJuIHsgcmFuZ2U6IHJhbmdlLCBhcm91bmQ6IGFyb3VuZCwgaW5zaWRlOiBpbnNpZGUgfTtcbn1cblxuLy8gOjogKFBvcywgP1BvcywgTm9kZVR5cGUsID9PYmplY3QpIOKGkiBUcmFuc2Zvcm1cbi8vIFdyYXAgdGhlIFtzaWJsaW5nIHJhbmdlXSgjTm9kZS5zaWJsaW5nUmFuZ2UpIG9mIHRoZSBnaXZlbiBwb3NpdGlvbnNcbi8vIGluIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyAoaWZcbi8vIHBvc3NpYmxlKS5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0eXBlLCB3cmFwQXR0cnMpIHtcbiAgdmFyIGNhbiA9IGNhbldyYXAodGhpcy5kb2MsIGZyb20sIHRvLCB0eXBlKTtcbiAgaWYgKCFjYW4pIHJldHVybiB0aGlzO1xuICB2YXIgcmFuZ2UgPSBjYW4ucmFuZ2U7XG4gIHZhciBhcm91bmQgPSBjYW4uYXJvdW5kO1xuICB2YXIgaW5zaWRlID0gY2FuLmluc2lkZTtcblxuICB2YXIgdHlwZXMgPSBhcm91bmQuY29uY2F0KHR5cGUpLmNvbmNhdChpbnNpZGUpO1xuICB2YXIgYXR0cnMgPSBhcm91bmQubWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSkuY29uY2F0KHdyYXBBdHRycykuY29uY2F0KGluc2lkZS5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9KSk7XG4gIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIHJhbmdlLmZyb20sIHJhbmdlLnRvLCBudWxsLCB7IHR5cGVzOiB0eXBlcywgYXR0cnM6IGF0dHJzIH0pO1xuICBpZiAoaW5zaWRlLmxlbmd0aCkge1xuICAgIHZhciB0b0lubmVyID0gcmFuZ2UuZnJvbS5wYXRoLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcm91bmQubGVuZ3RoICsgaW5zaWRlLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgdG9Jbm5lci5wdXNoKGkgPyAwIDogcmFuZ2UuZnJvbS5vZmZzZXQpO1xuICAgIH1mb3IgKHZhciBpID0gcmFuZ2UudG8ub2Zmc2V0IC0gMSAtIHJhbmdlLmZyb20ub2Zmc2V0OyBpID4gMDsgaS0tKSB7XG4gICAgICB0aGlzLnNwbGl0KG5ldyBfbW9kZWwuUG9zKHRvSW5uZXIsIGkpLCBpbnNpZGUubGVuZ3RoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCA/UG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gU2V0IHRoZSB0eXBlIG9mIGFsbCB0ZXh0YmxvY2tzIChwYXJ0bHkpIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIHRvXG4vLyB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc2V0QmxvY2tUeXBlID0gZnVuY3Rpb24gKGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0byB8fCBmcm9tLCBmdW5jdGlvbiAobm9kZSwgcGF0aCkge1xuICAgIGlmIChub2RlLmlzVGV4dGJsb2NrICYmICFub2RlLmhhc01hcmt1cCh0eXBlLCBhdHRycykpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICAvLyBFbnN1cmUgYWxsIG1hcmt1cCB0aGF0IGlzbid0IGFsbG93ZWQgaW4gdGhlIG5ldyBub2RlIHR5cGUgaXMgY2xlYXJlZFxuICAgICAgX3RoaXMuY2xlYXJNYXJrdXAobmV3IF9tb2RlbC5Qb3MocGF0aCwgMCksIG5ldyBfbW9kZWwuUG9zKHBhdGgsIG5vZGUuc2l6ZSksIHR5cGUpO1xuICAgICAgX3RoaXMuc3RlcChcImFuY2VzdG9yXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBfdGhpcy5kb2MucGF0aChwYXRoKS5zaXplKSwgbnVsbCwgeyBkZXB0aDogMSwgdHlwZXM6IFt0eXBlXSwgYXR0cnM6IFthdHRyc10gfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyA6OiAoUG9zLCBOb2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gQ2hhbmdlIHRoZSB0eXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSBub2RlIGFmdGVyIGBwb3NgLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldE5vZGVUeXBlID0gZnVuY3Rpb24gKHBvcywgdHlwZSwgYXR0cnMpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLmRvYy5ub2RlQWZ0ZXIocG9zKTtcbiAgdmFyIHBhdGggPSBwb3MudG9QYXRoKCk7XG4gIHRoaXMuc3RlcChcImFuY2VzdG9yXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIDApLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBub2RlLnNpemUpLCBudWxsLCB7IGRlcHRoOiAxLCB0eXBlczogW3R5cGVdLCBhdHRyczogW2F0dHJzXSB9KTtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5yZXF1aXJlKFwiLi9tYXJrXCIpO1xuXG5yZXF1aXJlKFwiLi9zcGxpdFwiKTtcblxucmVxdWlyZShcIi4vcmVwbGFjZVwiKTtcblxuLy8gISEgVGhpcyBtb2R1bGUgZGVmaW5lcyBhIHdheSB0byB0cmFuc2Zvcm0gZG9jdW1lbnRzLiBUcmFuc2Zvcm1pbmdcbi8vIGhhcHBlbnMgaW4gYFN0ZXBgcywgd2hpY2ggYXJlIGF0b21pYywgd2VsbC1kZWZpbmVkIG1vZGlmaWNhdGlvbnMgdG9cbi8vIGEgZG9jdW1lbnQuIFtBcHBseWluZ10oYFN0ZXAuYXBwbHlgKSBhIHN0ZXAgcHJvZHVjZXMgYSBuZXcgZG9jdW1lbnRcbi8vIGFuZCBhIFtwb3NpdGlvbiBtYXBdKCNQb3NNYXApIHRoYXQgbWFwcyBwb3NpdGlvbnMgaW4gdGhlIG9sZFxuLy8gZG9jdW1lbnQgdG8gcG9zaXRpb24gaW4gdGhlIG5ldyBkb2N1bWVudC4gU3RlcHMgY2FuIGJlXG4vLyBbaW52ZXJ0ZWRdKCNTdGVwLmludmVydCkgdG8gY3JlYXRlIGEgc3RlcCB0aGF0IHVuZG9lcyB0aGVpciBlZmZlY3QsXG4vLyBhbmQgY2hhaW5lZCB0b2dldGhlciBpbiBhIGNvbnZlbmllbmNlIG9iamVjdCBjYWxsZWQgYSBgVHJhbnNmb3JtYC5cbi8vXG4vLyBUaGlzIG1vZHVsZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGJyb3dzZXIgQVBJIGJlaW5nIGF2YWlsYWJsZVxuLy8gKGkuZS4geW91IGNhbiBsb2FkIGl0IGludG8gYW55IEphdmFTY3JpcHQgZW52aXJvbm1lbnQpLlxuLy9cbi8vIFRoZXNlIGFyZSB0aGUgdHlwZXMgb2Ygc3RlcHMgZGVmaW5lZDpcbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFuc2Zvcm1cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3RyYW5zZm9ybS5UcmFuc2Zvcm07XG4gIH1cbn0pO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTdGVwXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdGVwLlN0ZXA7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3RlcFJlc3VsdFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3RlcC5TdGVwUmVzdWx0O1xuICB9XG59KTtcblxudmFyIF9hbmNlc3RvciA9IHJlcXVpcmUoXCIuL2FuY2VzdG9yXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjYW5MaWZ0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hbmNlc3Rvci5jYW5MaWZ0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNhbldyYXBcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FuY2VzdG9yLmNhbldyYXA7XG4gIH1cbn0pO1xuXG52YXIgX2pvaW4gPSByZXF1aXJlKFwiLi9qb2luXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJqb2luUG9pbnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2pvaW4uam9pblBvaW50O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImpvaW5hYmxlQmxvY2tzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9qb2luLmpvaW5hYmxlQmxvY2tzO1xuICB9XG59KTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBvc01hcFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWFwLlBvc01hcDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNYXBSZXN1bHRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21hcC5NYXBSZXN1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVtYXBwaW5nXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9tYXAuUmVtYXBwaW5nO1xuICB9XG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuam9pbmFibGVCbG9ja3MgPSBqb2luYWJsZUJsb2NrcztcbmV4cG9ydHMuam9pblBvaW50ID0gam9pblBvaW50O1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG52YXIgX3RyYW5zZm9ybSA9IHJlcXVpcmUoXCIuL3RyYW5zZm9ybVwiKTtcblxudmFyIF9zdGVwID0gcmVxdWlyZShcIi4vc3RlcFwiKTtcblxudmFyIF9tYXAgPSByZXF1aXJlKFwiLi9tYXBcIik7XG5cbi8vICEhICoqYGpvaW5gKipcbi8vICAgOiBKb2luIHR3byBibG9jayBlbGVtZW50cyB0b2dldGhlci4gYGZyb21gIGFuZCBgdG9gIG11c3QgcG9pbnQgYXRcbi8vICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBhbmQgc3RhcnQgb2YgdGhlIHNlY29uZCBlbGVtZW50IChzbyB0aGF0XG4vLyAgICAgdGhlIGludGVudGlvbiBpcyBwcmVzZXJ2ZWQgZXZlbiB3aGVuIHRoZSBwb3NpdGlvbnMgYXJlIG1hcHBlZCkuXG5cbl9zdGVwLlN0ZXAuZGVmaW5lKFwiam9pblwiLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseShkb2MsIHN0ZXApIHtcbiAgICB2YXIgYmVmb3JlID0gZG9jLnBhdGgoc3RlcC5mcm9tLnBhdGgpO1xuICAgIHZhciBhZnRlciA9IGRvYy5wYXRoKHN0ZXAudG8ucGF0aCk7XG4gICAgaWYgKHN0ZXAuZnJvbS5vZmZzZXQgPCBiZWZvcmUuc2l6ZSB8fCBzdGVwLnRvLm9mZnNldCA+IDAgfHwgIWJlZm9yZS50eXBlLmNhbkNvbnRhaW5GcmFnbWVudChhZnRlci5jb250ZW50KSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBGcm9tID0gc3RlcC5mcm9tLnBhdGgsXG4gICAgICAgIHBUbyA9IHN0ZXAudG8ucGF0aDtcbiAgICB2YXIgbGFzdCA9IHBGcm9tLmxlbmd0aCAtIDEsXG4gICAgICAgIG9mZnNldCA9IHBGcm9tW2xhc3RdICsgMTtcbiAgICBpZiAocEZyb20ubGVuZ3RoICE9IHBUby5sZW5ndGggfHwgcEZyb20ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ICE9IHBUb1tsYXN0XSkgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgIGlmIChwRnJvbVtpXSAhPSBwVG9baV0pIHJldHVybiBudWxsO1xuICAgIH12YXIgdGFyZ2V0UGF0aCA9IHBGcm9tLnNsaWNlKDAsIGxhc3QpO1xuICAgIHZhciB0YXJnZXQgPSBkb2MucGF0aCh0YXJnZXRQYXRoKSxcbiAgICAgICAgb2xkU2l6ZSA9IHRhcmdldC5zaXplO1xuICAgIGlmICh0YXJnZXQudHlwZS5sb2NrZWQpIHJldHVybiBudWxsO1xuICAgIHZhciBqb2luZWQgPSBiZWZvcmUuYXBwZW5kKGFmdGVyLmNvbnRlbnQpO1xuICAgIHZhciBjb3B5ID0gZG9jLnJlcGxhY2VEZWVwKHRhcmdldFBhdGgsIHRhcmdldC5zcGxpY2Uob2Zmc2V0IC0gMSwgb2Zmc2V0ICsgMSwgX21vZGVsLkZyYWdtZW50LmZyb20oam9pbmVkKSkpO1xuXG4gICAgdmFyIG1hcCA9IG5ldyBfbWFwLlBvc01hcChbbmV3IF9tYXAuTW92ZWRSYW5nZShzdGVwLnRvLCBhZnRlci5zaXplLCBzdGVwLmZyb20pLCBuZXcgX21hcC5Nb3ZlZFJhbmdlKG5ldyBfbW9kZWwuUG9zKHRhcmdldFBhdGgsIG9mZnNldCArIDEpLCBvbGRTaXplIC0gb2Zmc2V0IC0gMSwgbmV3IF9tb2RlbC5Qb3ModGFyZ2V0UGF0aCwgb2Zmc2V0KSldLCBbbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShzdGVwLmZyb20sIHN0ZXAudG8sIHN0ZXAuZnJvbSwgc3RlcC5mcm9tLCBzdGVwLnRvLnNob3J0ZW4oKSldKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQoY29weSwgbWFwKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgb2xkRG9jKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgc3RlcC5mcm9tLCBvbGREb2MucGF0aChzdGVwLnRvLnBhdGgpLmNvcHkoKSk7XG4gIH1cbn0pO1xuXG4vLyA6OiAoTm9kZSwgUG9zKSDihpIgYm9vbFxuLy8gVGVzdCB3aGV0aGVyIHRoZSBibG9ja3MgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIHBvc2l0aW9uIGNhbiBiZVxuLy8gam9pbmVkLlxuXG5mdW5jdGlvbiBqb2luYWJsZUJsb2Nrcyhkb2MsIHBvcykge1xuICBpZiAocG9zLm9mZnNldCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwYXJlbnQgPSBkb2MucGF0aChwb3MucGF0aCk7XG4gIGlmIChwYXJlbnQuaXNUZXh0YmxvY2sgfHwgcG9zLm9mZnNldCA9PSBwYXJlbnQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgdHlwZSA9IHBhcmVudC5jaGlsZChwb3Mub2Zmc2V0IC0gMSkudHlwZTtcbiAgcmV0dXJuICF0eXBlLmlzVGV4dGJsb2NrICYmIHR5cGUuY29udGFpbnMgJiYgdHlwZSA9PSBwYXJlbnQuY2hpbGQocG9zLm9mZnNldCkudHlwZTtcbn1cblxuLy8gOjogKE5vZGUsIFBvcywgP251bWJlcikg4oaSID9Qb3Ncbi8vIEZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbi8vIGJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxuLy8gcG9pbnQsIGlmIGFueS5cblxuZnVuY3Rpb24gam9pblBvaW50KGRvYywgcG9zKSB7XG4gIHZhciBkaXIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyAtMSA6IGFyZ3VtZW50c1syXTtcblxuICBmb3IgKDs7KSB7XG4gICAgaWYgKGpvaW5hYmxlQmxvY2tzKGRvYywgcG9zKSkgcmV0dXJuIHBvcztcbiAgICBpZiAocG9zLmRlcHRoID09IDApIHJldHVybiBudWxsO1xuICAgIHBvcyA9IHBvcy5zaG9ydGVuKG51bGwsIGRpciA8IDAgPyAwIDogMSk7XG4gIH1cbn1cblxuLy8gOjogKFBvcykg4oaSIFRyYW5zZm9ybVxuLy8gSm9pbiB0aGUgYmxvY2tzIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChhdCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5kb2MucGF0aChhdC5wYXRoKTtcbiAgaWYgKGF0Lm9mZnNldCA9PSAwIHx8IGF0Lm9mZnNldCA9PSBwYXJlbnQuc2l6ZSB8fCBwYXJlbnQuaXNUZXh0YmxvY2spIHJldHVybiB0aGlzO1xuICB0aGlzLnN0ZXAoXCJqb2luXCIsIG5ldyBfbW9kZWwuUG9zKGF0LnBhdGguY29uY2F0KGF0Lm9mZnNldCAtIDEpLCBwYXJlbnQuY2hpbGQoYXQub2Zmc2V0IC0gMSkuc2l6ZSksIG5ldyBfbW9kZWwuUG9zKGF0LnBhdGguY29uY2F0KGF0Lm9mZnNldCksIDApKTtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbi8vIDs7ICNraW5kPWludGVyZmFjZSAjcGF0aD1NYXBwYWJsZSAjdG9jPWZhbHNlXG4vLyBUaGVyZSBhcmUgdmFyaW91cyB0aGluZ3MgdGhhdCBwb3NpdGlvbnMgY2FuIGJlIG1hcHBlZCB0aHJvdWdoLlxuLy8gV2UnbGwgZGVub3RlIHRob3NlIGFzICdtYXBwYWJsZScuIFRoaXMgaXMgbm90IGFuIGFjdHVhbCBjbGFzcyBpblxuLy8gdGhlIGNvZGViYXNlLCBvbmx5IGFuIGFncmVlZC1vbiBpbnRlcmZhY2UuXG5cbi8vIDo6IChwb3M6IFBvcywgYmlhczogP251bWJlcikg4oaSIE1hcFJlc3VsdFxuLy8gI3BhdGg9TWFwcGFibGUubWFwXG4vLyBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgb2JqZWN0LiBXaGVuIGdpdmVuLCB0aGUgYGJpYXNgXG4vLyBkZXRlcm1pbmVzIGluIHdoaWNoIGRpcmVjdGlvbiB0byBtb3ZlIHdoZW4gYSBjaHVuayBvZiBjb250ZW50IGlzXG4vLyBpbnNlcnRlZCBhdCBvciBhcm91bmQgdGhlIG1hcHBlZCBwb3NpdGlvbi5cblxudmFyIE1vdmVkUmFuZ2UgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNb3ZlZFJhbmdlKHN0YXJ0LCBzaXplKSB7XG4gICAgdmFyIGRlc3QgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vdmVkUmFuZ2UpO1xuXG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNb3ZlZFJhbmdlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBcIlttb3ZlZCBcIiArIHRoaXMuc3RhcnQgKyBcIitcIiArIHRoaXMuc2l6ZSArIFwiIHRvIFwiICsgdGhpcy5kZXN0ICsgXCJdXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBfbW9kZWwuUG9zKHRoaXMuc3RhcnQucGF0aCwgdGhpcy5zdGFydC5vZmZzZXQgKyB0aGlzLnNpemUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNb3ZlZFJhbmdlO1xufSkoKTtcblxuZXhwb3J0cy5Nb3ZlZFJhbmdlID0gTW92ZWRSYW5nZTtcblxudmFyIFNpZGUgPSBmdW5jdGlvbiBTaWRlKGZyb20sIHRvLCByZWYpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNpZGUpO1xuXG4gIHRoaXMuZnJvbSA9IGZyb207XG4gIHRoaXMudG8gPSB0bztcbiAgdGhpcy5yZWYgPSByZWY7XG59O1xuXG52YXIgUmVwbGFjZWRSYW5nZSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlcGxhY2VkUmFuZ2UoZnJvbSwgdG8sIG5ld0Zyb20sIG5ld1RvKSB7XG4gICAgdmFyIHJlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IGZyb20gOiBhcmd1bWVudHNbNF07XG4gICAgdmFyIG5ld1JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNSB8fCBhcmd1bWVudHNbNV0gPT09IHVuZGVmaW5lZCA/IG5ld0Zyb20gOiBhcmd1bWVudHNbNV07XG4gICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVwbGFjZWRSYW5nZSk7XG5cbiAgICAgIHRoaXMuYmVmb3JlID0gbmV3IFNpZGUoZnJvbSwgdG8sIHJlZik7XG4gICAgICB0aGlzLmFmdGVyID0gbmV3IFNpZGUobmV3RnJvbSwgbmV3VG8sIG5ld1JlZik7XG4gICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZXBsYWNlZFJhbmdlLCBbe1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBcIltyZXBsYWNlZCBcIiArIHRoaXMuYmVmb3JlLmZyb20gKyBcIi1cIiArIHRoaXMuYmVmb3JlLnRvICsgXCIgd2l0aCBcIiArIHRoaXMuYWZ0ZXIuZnJvbSArIFwiLVwiICsgdGhpcy5hZnRlci50byArIFwiXVwiO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXBsYWNlZFJhbmdlO1xufSkoKTtcblxuZXhwb3J0cy5SZXBsYWNlZFJhbmdlID0gUmVwbGFjZWRSYW5nZTtcblxudmFyIGVtcHR5ID0gW107XG5cbmZ1bmN0aW9uIG9mZnNldEZyb20oYmFzZSwgcG9zKSB7XG4gIGlmIChwb3MucGF0aC5sZW5ndGggPiBiYXNlLnBhdGgubGVuZ3RoKSB7XG4gICAgdmFyIHBhdGggPSBbcG9zLnBhdGhbYmFzZS5wYXRoLmxlbmd0aF0gLSBiYXNlLm9mZnNldF07XG4gICAgZm9yICh2YXIgaSA9IGJhc2UucGF0aC5sZW5ndGggKyAxOyBpIDwgcG9zLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhdGgucHVzaChwb3MucGF0aFtpXSk7XG4gICAgfXJldHVybiBuZXcgX21vZGVsLlBvcyhwYXRoLCBwb3Mub2Zmc2V0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IF9tb2RlbC5Qb3MoW10sIHBvcy5vZmZzZXQgLSBiYXNlLm9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwVGhyb3VnaChtYXAsIHBvcywgYmlhcywgYmFjaykge1xuICBpZiAoYmlhcyA9PT0gdW5kZWZpbmVkKSBiaWFzID0gMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5yZXBsYWNlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciByYW5nZSA9IG1hcC5yZXBsYWNlZFtpXSxcbiAgICAgICAgc2lkZSA9IGJhY2sgPyByYW5nZS5hZnRlciA6IHJhbmdlLmJlZm9yZTtcbiAgICB2YXIgbGVmdCA9IHVuZGVmaW5lZCxcbiAgICAgICAgcmlnaHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKChsZWZ0ID0gcG9zLmNtcChzaWRlLmZyb20pKSA+PSAwICYmIChyaWdodCA9IHBvcy5jbXAoc2lkZS50bykpIDw9IDApIHtcbiAgICAgIHZhciBvdGhlciA9IGJhY2sgPyByYW5nZS5iZWZvcmUgOiByYW5nZS5hZnRlcjtcbiAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KGJpYXMgPCAwID8gb3RoZXIuZnJvbSA6IG90aGVyLnRvLCAhIShsZWZ0ICYmIHJpZ2h0KSwgeyByYW5nZUlEOiBpLCBvZmZzZXQ6IG9mZnNldEZyb20oc2lkZS5yZWYsIHBvcykgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAubW92ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBtYXAubW92ZWRbaV07XG4gICAgdmFyIHN0YXJ0ID0gYmFjayA/IHJhbmdlLmRlc3QgOiByYW5nZS5zdGFydDtcbiAgICBpZiAocG9zLmNtcChzdGFydCkgPj0gMCAmJiBfbW9kZWwuUG9zLmNtcChwb3MucGF0aCwgcG9zLm9mZnNldCwgc3RhcnQucGF0aCwgc3RhcnQub2Zmc2V0ICsgcmFuZ2Uuc2l6ZSkgPD0gMCkge1xuICAgICAgdmFyIGRlc3QgPSBiYWNrID8gcmFuZ2Uuc3RhcnQgOiByYW5nZS5kZXN0O1xuICAgICAgdmFyIGRlcHRoID0gc3RhcnQuZGVwdGg7XG4gICAgICBpZiAocG9zLmRlcHRoID4gZGVwdGgpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGRlc3Qub2Zmc2V0ICsgKHBvcy5wYXRoW2RlcHRoXSAtIHN0YXJ0Lm9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KG5ldyBfbW9kZWwuUG9zKGRlc3QucGF0aC5jb25jYXQob2Zmc2V0KS5jb25jYXQocG9zLnBhdGguc2xpY2UoZGVwdGggKyAxKSksIHBvcy5vZmZzZXQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KG5ldyBfbW9kZWwuUG9zKGRlc3QucGF0aCwgZGVzdC5vZmZzZXQgKyAocG9zLm9mZnNldCAtIHN0YXJ0Lm9mZnNldCkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IE1hcFJlc3VsdChwb3MpO1xufVxuXG4vLyA7OyBBIHBvc2l0aW9uIG1hcCwgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2F5IHBvc2l0aW9ucyBpblxuLy8gdGhlIHByZS1zdGVwIHZlcnNpb24gb2YgYSBkb2N1bWVudCBjb3JyZXNwb25kIHRvIHBvc2l0aW9ucyBpbiB0aGVcbi8vIHBvc3Qtc3RlcCB2ZXJzaW9uLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYE1hcHBhYmxlYC5cblxudmFyIFBvc01hcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvc01hcChtb3ZlZCwgcmVwbGFjZWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zTWFwKTtcblxuICAgIHRoaXMubW92ZWQgPSBtb3ZlZCB8fCBlbXB0eTtcbiAgICB0aGlzLnJlcGxhY2VkID0gcmVwbGFjZWQgfHwgZW1wdHk7XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIFRoZSByZXR1cm4gdmFsdWUgb2YgbWFwcGluZyBhIHBvc2l0aW9uLlxuXG4gIF9jcmVhdGVDbGFzcyhQb3NNYXAsIFt7XG4gICAga2V5OiBcInJlY292ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVjb3ZlcihvZmZzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VkW29mZnNldC5yYW5nZUlEXS5hZnRlci5yZWYuZXh0ZW5kKG9mZnNldC5vZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBNYXBSZXN1bHRcbiAgICAvLyBNYXAgdGhlIGdpdmVuIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXAuIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhblxuICAgIC8vIGJlIHVzZWQgdG8gY29udHJvbCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdHJhbnNmb3JtIGluc2VydGVkXG4gICAgLy8gY29udGVudCBhdCAob3IgYXJvdW5kKSB0aGlzIHBvc2l0aW9u4oCUaWYgYGJpYXNgIGlzIG5lZ2F0aXZlLCB0aGUgYVxuICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB0aGUgaW5zZXJ0ZWQgY29udGVudCB3aWxsIGJlIHJldHVybmVkLCBpZiBpdCBpc1xuICAgIC8vIHBvc2l0aXZlLCBhIHBvc2l0aW9uIGFmdGVyIHRoZSBpbnNlcnRpb24gaXMgcmV0dXJuZWQuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hcChwb3MsIGJpYXMpIHtcbiAgICAgIHJldHVybiBtYXBUaHJvdWdoKHRoaXMsIHBvcywgYmlhcywgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBQb3NNYXBcbiAgICAvLyBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcC4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCB0b1xuICAgIC8vIG1hcCBwb3NpdGlvbnMgaW4gdGhlIHBvc3Qtc3RlcCBkb2N1bWVudCB0byB0aGUgcHJlLXN0ZXAgZG9jdW1lbnQuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52ZXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmVydCgpIHtcbiAgICAgIHJldHVybiBuZXcgSW52ZXJ0ZWRQb3NNYXAodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMubW92ZWQuY29uY2F0KHRoaXMucmVwbGFjZWQpLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3NNYXA7XG59KSgpO1xuXG5leHBvcnRzLlBvc01hcCA9IFBvc01hcDtcblxudmFyIE1hcFJlc3VsdCA9IGZ1bmN0aW9uIE1hcFJlc3VsdChwb3MpIHtcbiAgdmFyIGRlbGV0ZWQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGFyZ3VtZW50c1sxXTtcbiAgdmFyIHJlY292ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBudWxsIDogYXJndW1lbnRzWzJdO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNYXBSZXN1bHQpO1xuXG4gIC8vIDo6IFBvcyBUaGUgbWFwcGVkIHZlcnNpb24gb2YgdGhlIHBvc2l0aW9uLlxuICB0aGlzLnBvcyA9IHBvcztcbiAgLy8gOjogYm9vbCBUZWxscyB5b3Ugd2hldGhlciB0aGUgcG9zaXRpb24gd2FzIGRlbGV0ZWQsIHRoYXQgaXMsXG4gIC8vIHdoZXRoZXIgdGhlIHN0ZXAgcmVtb3ZlZCBpdHMgc3Vycm91bmRpbmdzIGZyb20gdGhlIGRvY3VtZW50LlxuICB0aGlzLmRlbGV0ZWQgPSBkZWxldGVkO1xuICB0aGlzLnJlY292ZXIgPSByZWNvdmVyO1xufTtcblxuZXhwb3J0cy5NYXBSZXN1bHQgPSBNYXBSZXN1bHQ7XG5cbnZhciBJbnZlcnRlZFBvc01hcCA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludmVydGVkUG9zTWFwKG1hcCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnZlcnRlZFBvc01hcCk7XG5cbiAgICB0aGlzLmlubmVyID0gbWFwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEludmVydGVkUG9zTWFwLCBbe1xuICAgIGtleTogXCJyZWNvdmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlY292ZXIob2Zmc2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lci5yZXBsYWNlZFtvZmZzZXQucmFuZ2VJRF0uYmVmb3JlLnJlZi5leHRlbmQob2Zmc2V0Lm9mZnNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICByZXR1cm4gbWFwVGhyb3VnaCh0aGlzLmlubmVyLCBwb3MsIGJpYXMsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZlcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW52ZXJ0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5uZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFwiLVwiICsgdGhpcy5pbm5lcjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52ZXJ0ZWRQb3NNYXA7XG59KSgpO1xuXG52YXIgbnVsbE1hcCA9IG5ldyBQb3NNYXAoKTtcblxuZXhwb3J0cy5udWxsTWFwID0gbnVsbE1hcDtcbi8vIDs7IEEgcmVtYXBwaW5nIHJlcHJlc2VudHMgYSBwaXBlbGluZSBvZiB6ZXJvIG9yIG1vcmUgbWFwcGluZ3MuIEl0XG4vLyBpcyBhIHNwZWNpYWxpemVkIGRhdGEgc3RydWN0dXJlZCB1c2VkIHRvIG1hbmFnZSBtYXBwaW5nIHRocm91Z2ggYVxuLy8gc2VyaWVzIG9mIHN0ZXBzLCB0eXBpY2FsbHkgaW5jbHVkaW5nIGludmVydGVkIGFuZCBub24taW52ZXJ0ZWRcbi8vIHZlcnNpb25zIG9mIHRoZSBzYW1lIHN0ZXAuIChUaGlzIGNvbWVzIHVwIHdoZW4g4oCYcmViYXNpbmfigJkgc3RlcHMgZm9yXG4vLyBjb2xsYWJvcmF0aW9uIG9yIGhpc3RvcnkgbWFuYWdlbWVudC4pIFRoaXMgY2xhc3MgaW1wbGVtZW50c1xuLy8gYE1hcHBhYmxlYC5cblxudmFyIFJlbWFwcGluZyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIDo6ICg/W1Bvc01hcF0sID9bUG9zTWFwXSlcblxuICBmdW5jdGlvbiBSZW1hcHBpbmcoKSB7XG4gICAgdmFyIGhlYWQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyBbXSA6IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgdGFpbCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzFdO1xuICAgIHZhciBtaXJyb3IgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgfHwgYXJndW1lbnRzWzJdID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYXJndW1lbnRzWzJdO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbWFwcGluZyk7XG5cbiAgICAvLyA6OiBbUG9zTWFwXVxuICAgIC8vIFRoZSBtYXBzIGluIHRoZSBoZWFkIG9mIHRoZSBtYXBwaW5nIGFyZSBhcHBsaWVkIHRvIGlucHV0XG4gICAgLy8gcG9zaXRpb25zIGZpcnN0LCBiYWNrLXRvLWZyb250LiBTbyB0aGUgbWFwIGF0IHRoZSBlbmQgb2YgdGhpc1xuICAgIC8vIGFycmF5IChpZiBhbnkpIGlzIHRoZSB2ZXJ5IGZpcnN0IG9uZSBhcHBsaWVkLlxuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgLy8gVGhlIG1hcHMgaW4gdGhlIHRhaWwgYXJlIGFwcGxpZWQgbGFzdCwgZnJvbnQtdG8tYmFjay5cbiAgICB0aGlzLnRhaWwgPSB0YWlsO1xuICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICB9XG5cbiAgLy8gOjogKFBvc01hcCwgP251bWJlcikg4oaSIG51bWJlclxuICAvLyBBZGQgYSBtYXAgdG8gdGhlIG1hcHBpbmcncyBmcm9udC4gSWYgdGhpcyBtYXAgaXMgdGhlIG1pcnJvciBpbWFnZVxuICAvLyAocHJvZHVjZWQgYnkgYW4gaW52ZXJ0ZWQgc3RlcCkgb2YgYW5vdGhlciBtYXAgaW4gdGhpcyBtYXBwaW5nLFxuICAvLyB0aGF0IG1hcCdzIGlkIChhcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBvclxuICAvLyBbYGFkZFRvQmFja2BdKCNSZW1hcHBpbmcuYWRkVG9CYWNrKSkgc2hvdWxkIGJlIHBhc3NlZCBhcyBhIHNlY29uZFxuICAvLyBwYXJhbWV0ZXIgdG8gcmVnaXN0ZXIgdGhlIGNvcnJlc3BvbmRlbmNlLlxuXG4gIF9jcmVhdGVDbGFzcyhSZW1hcHBpbmcsIFt7XG4gICAga2V5OiBcImFkZFRvRnJvbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVG9Gcm9udChtYXAsIGNvcnIpIHtcbiAgICAgIHRoaXMuaGVhZC5wdXNoKG1hcCk7XG4gICAgICB2YXIgaWQgPSAtdGhpcy5oZWFkLmxlbmd0aDtcbiAgICAgIGlmIChjb3JyICE9IG51bGwpIHRoaXMubWlycm9yW2lkXSA9IGNvcnI7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvc01hcCwgP251bWJlcikg4oaSIG51bWJlclxuICAgIC8vIEFkZCBhIG1hcCB0byB0aGUgbWFwcGluZydzIGJhY2suIElmIHRoZSBtYXAgaXMgdGhlIG1pcnJvciBpbWFnZVxuICAgIC8vIG9mIGFub3RoZXIgbWFwcGluZyBpbiB0aGlzIG9iamVjdCwgdGhlIGlkIG9mIHRoYXQgbWFwIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCB0byByZWdpc3RlciB0aGUgY29ycmVzcG9uZGVuY2UuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVG9CYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvQmFjayhtYXAsIGNvcnIpIHtcbiAgICAgIHRoaXMudGFpbC5wdXNoKG1hcCk7XG4gICAgICB2YXIgaWQgPSB0aGlzLnRhaWwubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChjb3JyICE9IG51bGwpIHRoaXMubWlycm9yW2NvcnJdID0gaWQ7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoaWQpIHtcbiAgICAgIHJldHVybiBpZCA8IDAgPyB0aGlzLmhlYWRbLWlkIC0gMV0gOiB0aGlzLnRhaWxbaWRdO1xuICAgIH1cblxuICAgIC8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBNYXBSZXN1bHRcbiAgICAvLyBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgcmVtYXBwaW5nLCBvcHRpb25hbGx5IHBhc3NpbmcgYSBiaWFzXG4gICAgLy8gZGlyZWN0aW9uLlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBpID0gLXRoaXMuaGVhZC5sZW5ndGg7IGkgPCB0aGlzLnRhaWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG1hcCA9IHRoaXMuZ2V0KGkpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbWFwLm1hcChwb3MsIGJpYXMpO1xuICAgICAgICBpZiAocmVzdWx0LnJlY292ZXIpIHtcbiAgICAgICAgICB2YXIgY29yciA9IHRoaXMubWlycm9yW2ldO1xuICAgICAgICAgIGlmIChjb3JyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGkgPSBjb3JyO1xuICAgICAgICAgICAgcG9zID0gdGhpcy5nZXQoY29ycikucmVjb3ZlcihyZXN1bHQucmVjb3Zlcik7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kZWxldGVkKSBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQocG9zLCBkZWxldGVkKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVtYXBwaW5nO1xufSkoKTtcblxuZXhwb3J0cy5SZW1hcHBpbmcgPSBSZW1hcHBpbmc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfdHJhbnNmb3JtID0gcmVxdWlyZShcIi4vdHJhbnNmb3JtXCIpO1xuXG52YXIgX3N0ZXAgPSByZXF1aXJlKFwiLi9zdGVwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG4vLyAhIVxuLy8gKipgYWRkTWFya2AqKlxuLy8gICA6IEFkZCB0aGUgYE1hcmtgIGdpdmVuIGFzIHRoZSBzdGVwJ3MgcGFyYW1ldGVyIHRvIGFsbFxuLy8gICAgIGlubGluZSBjb250ZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gICh3aGVuIGFsbG93ZWQpLlxuLy9cbi8vICoqYHJlbW92ZU1hcmtgKipcbi8vICAgOiBSZW1vdmUgdGhlIGBNYXJrYCBnaXZlbiBhcyB0aGUgc3RlcCdzIHBhcmFtZXRlciBmcm9tIGFsbCBpbmxpbmVcbi8vICAgICBjb250ZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLlxuXG5fc3RlcC5TdGVwLmRlZmluZShcImFkZE1hcmtcIiwge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkoZG9jLCBzdGVwKSB7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KCgwLCBfdHJlZS5jb3B5U3RydWN0dXJlKShkb2MsIHN0ZXAuZnJvbSwgc3RlcC50bywgZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgICBpZiAoIW5vZGUudHlwZS5jYW5Db250YWluTWFyayhzdGVwLnBhcmFtKSkgcmV0dXJuIG5vZGU7XG4gICAgICByZXR1cm4gKDAsIF90cmVlLmNvcHlJbmxpbmUpKG5vZGUsIGZyb20sIHRvLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHN0ZXAucGFyYW0uYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBfb2xkRG9jLCBtYXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJyZW1vdmVNYXJrXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIG51bGwsIHN0ZXAucGFyYW0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0udG9KU09OKCk7XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbik7XG4gIH1cbn0pO1xuXG4vLyA6OiAoUG9zLCBQb3MsIE1hcmspIOKGkiBUcmFuc2Zvcm1cbi8vIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuYWRkTWFyayA9IGZ1bmN0aW9uIChmcm9tLCB0bywgbWFyaykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciByZW1vdmVkID0gW10sXG4gICAgICBhZGRlZCA9IFtdLFxuICAgICAgcmVtb3ZpbmcgPSBudWxsLFxuICAgICAgYWRkaW5nID0gbnVsbDtcbiAgdGhpcy5kb2MuaW5saW5lTm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmdW5jdGlvbiAoX3JlZiwgcGF0aCwgc3RhcnQsIGVuZCwgcGFyZW50KSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZi5tYXJrcztcblxuICAgIGlmIChtYXJrLmlzSW5TZXQobWFya3MpIHx8ICFwYXJlbnQudHlwZS5jYW5Db250YWluTWFyayhtYXJrLnR5cGUpKSB7XG4gICAgICBhZGRpbmcgPSByZW1vdmluZyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBybSA9IG1hcmsudHlwZS5pc0luU2V0KG1hcmtzKTtcbiAgICAgIGlmIChybSkge1xuICAgICAgICBpZiAocmVtb3ZpbmcgJiYgcmVtb3ZpbmcucGFyYW0uZXEocm0pKSB7XG4gICAgICAgICAgcmVtb3ZpbmcudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92aW5nID0gbmV3IF9zdGVwLlN0ZXAoXCJyZW1vdmVNYXJrXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgbnVsbCwgcm0pO1xuICAgICAgICAgIHJlbW92ZWQucHVzaChyZW1vdmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVtb3ZpbmcpIHtcbiAgICAgICAgcmVtb3ZpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFkZGluZykge1xuICAgICAgICBhZGRpbmcudG8gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkaW5nID0gbmV3IF9zdGVwLlN0ZXAoXCJhZGRNYXJrXCIsIG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgbnVsbCwgbWFyayk7XG4gICAgICAgIGFkZGVkLnB1c2goYWRkaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZW1vdmVkLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gX3RoaXMuc3RlcChzKTtcbiAgfSk7XG4gIGFkZGVkLmZvckVhY2goZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gX3RoaXMuc3RlcChzKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJyZW1vdmVNYXJrXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcFJlc3VsdCgoMCwgX3RyZWUuY29weVN0cnVjdHVyZSkoZG9jLCBzdGVwLmZyb20sIHN0ZXAudG8sIGZ1bmN0aW9uIChub2RlLCBmcm9tLCB0bykge1xuICAgICAgcmV0dXJuICgwLCBfdHJlZS5jb3B5SW5saW5lKShub2RlLCBmcm9tLCB0bywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubWFyayhzdGVwLnBhcmFtLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uIGludmVydChzdGVwLCBfb2xkRG9jLCBtYXApIHtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJhZGRNYXJrXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIG51bGwsIHN0ZXAucGFyYW0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0udG9KU09OKCk7XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbik7XG4gIH1cbn0pO1xuXG4vLyA6OiAoUG9zLCBQb3MsIHVuaW9uPE1hcmssIE1hcmtUeXBlPikg4oaSIFRyYW5zZm9ybVxuLy8gUmVtb3ZlIHRoZSBnaXZlbiBtYXJrLCBvciBhbGwgbWFya3Mgb2YgdGhlIGdpdmVuIHR5cGUsIGZyb20gaW5saW5lXG4vLyBub2RlcyBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5yZW1vdmVNYXJrID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHZhciBtYXJrID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyIHx8IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFyZ3VtZW50c1syXTtcblxuICB2YXIgbWF0Y2hlZCA9IFtdLFxuICAgICAgc3RlcCA9IDA7XG4gIHRoaXMuZG9jLmlubGluZU5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKF9yZWYyLCBwYXRoLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZjIubWFya3M7XG5cbiAgICBzdGVwKys7XG4gICAgdmFyIHRvUmVtb3ZlID0gbnVsbDtcbiAgICBpZiAobWFyayBpbnN0YW5jZW9mIF9tb2RlbC5NYXJrVHlwZSkge1xuICAgICAgdmFyIGZvdW5kID0gbWFyay5pc0luU2V0KG1hcmtzKTtcbiAgICAgIGlmIChmb3VuZCkgdG9SZW1vdmUgPSBbZm91bmRdO1xuICAgIH0gZWxzZSBpZiAobWFyaykge1xuICAgICAgaWYgKG1hcmsuaXNJblNldChtYXJrcykpIHRvUmVtb3ZlID0gW21hcmtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b1JlbW92ZSA9IG1hcmtzO1xuICAgIH1cbiAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcm0gPSB0b1JlbW92ZVtpXSxcbiAgICAgICAgICAgIGZvdW5kID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgbSA9IG1hdGNoZWRbal07XG4gICAgICAgICAgaWYgKG0uc3RlcCA9PSBzdGVwIC0gMSAmJiBybS5lcShtYXRjaGVkW2pdLnN0eWxlKSkgZm91bmQgPSBtO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIGZvdW5kLnRvID0gbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKTtcbiAgICAgICAgICBmb3VuZC5zdGVwID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRjaGVkLnB1c2goeyBzdHlsZTogcm0sIGZyb206IG5ldyBfbW9kZWwuUG9zKHBhdGgsIHN0YXJ0KSwgdG86IG5ldyBfbW9kZWwuUG9zKHBhdGgsIGVuZCksIHN0ZXA6IHN0ZXAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBtYXRjaGVkLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gX3RoaXMyLnN0ZXAoXCJyZW1vdmVNYXJrXCIsIG0uZnJvbSwgbS50bywgbnVsbCwgbS5zdHlsZSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIFBvcywgP05vZGVUeXBlKSDihpIgVHJhbnNmb3JtXG4vLyBSZW1vdmUgYWxsIG1hcmtzIGFuZCBub24tdGV4dCBpbmxpbmUgbm9kZXMsIG9yIGlmIGBuZXdQYXJlbnRgIGlzXG4vLyBnaXZlbiwgYWxsIG1hcmtzIGFuZCBpbmxpbmUgbm9kZXMgdGhhdCBtYXkgbm90IGFwcGVhciBhcyBjb250ZW50IG9mXG4vLyBgbmV3UGFyZW50YCwgZnJvbSB0aGUgZ2l2ZW4gcmFuZ2UuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuY2xlYXJNYXJrdXAgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIG5ld1BhcmVudCkge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB2YXIgZGVsU3RlcHMgPSBbXTsgLy8gTXVzdCBiZSBhY2N1bXVsYXRlZCBhbmQgYXBwbGllZCBpbiBpbnZlcnNlIG9yZGVyXG4gIHRoaXMuZG9jLmlubGluZU5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZnVuY3Rpb24gKF9yZWYzLCBwYXRoLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIG1hcmtzID0gX3JlZjMubWFya3M7XG4gICAgdmFyIHR5cGUgPSBfcmVmMy50eXBlO1xuXG4gICAgaWYgKG5ld1BhcmVudCA/ICFuZXdQYXJlbnQuY2FuQ29udGFpblR5cGUodHlwZSkgOiAhdHlwZS5pc1RleHQpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKCk7XG4gICAgICB2YXIgX2Zyb20gPSBuZXcgX21vZGVsLlBvcyhwYXRoLCBzdGFydCk7XG4gICAgICBkZWxTdGVwcy5wdXNoKG5ldyBfc3RlcC5TdGVwKFwicmVwbGFjZVwiLCBfZnJvbSwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgZW5kKSwgX2Zyb20pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hcmsgPSBtYXJrc1tpXTtcbiAgICAgIGlmICghbmV3UGFyZW50IHx8ICFuZXdQYXJlbnQuY2FuQ29udGFpbk1hcmsobWFyay50eXBlKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgpO1xuICAgICAgICBfdGhpczMuc3RlcChcInJlbW92ZU1hcmtcIiwgbmV3IF9tb2RlbC5Qb3MocGF0aCwgc3RhcnQpLCBuZXcgX21vZGVsLlBvcyhwYXRoLCBlbmQpLCBudWxsLCBtYXJrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciBpID0gZGVsU3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB0aGlzLnN0ZXAoZGVsU3RlcHNbaV0pO1xuICB9cmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG52YXIgX3RyZWUgPSByZXF1aXJlKFwiLi90cmVlXCIpO1xuXG4vLyAhISAqKmByZXBsYWNlYCoqXG5cbi8vICAgOiBEZWxldGUgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIGFuZFxuLy8gICAgIG9wdGlvbmFsbHkgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgY2h1bmsgb2YgY29udGVudC4gYHBvc2AgbXVzdFxuLy8gICAgIHBvaW50IGF0IHRoZSDigJhyb2904oCZIGF0IHdoaWNoIHRoZSBjdXQgc3RhcnRz4oCUYSBwb3NpdGlvbiBiZXR3ZWVuXG4vLyAgICAgYW5kIGFib3ZlIGBmcm9tYCBhbmQgYHRvYC5cbi8vXG4vLyAgICAgV2hlbiBuZXcgY29udGVudCBpcyB0byBiZSBpbnNlcnRlZCwgdGhlIHN0ZXAncyBwYXJhbWV0ZXIgc2hvdWxkXG4vLyAgICAgYmUgYW4gb2JqZWN0IG9mIHNoYXBlIGB7Y29udGVudDogYFtgRnJhZ21lbnRgXSgjRnJhZ21lbnQpYCxcbi8vICAgICBvcGVuTGVmdDogbnVtYmVyLCBvcGVuUmlnaHQ6IG51bWJlcn1gLiBUaGUgc3RlcCB3aWxsIGluc2VydCB0aGVcbi8vICAgICBnaXZlbiBjb250ZW50IGF0IHRoZSByb290IG9mIHRoZSBjdXQsIGFuZCBgb3BlbkxlZnRgIGFuZFxuLy8gICAgIGBvcGVuUmlnaHRgIGluZGljYXRlIGhvdyBtdWNoIG9mIHRoZSBjb250ZW50IG9uIGJvdGggc2lkZXNcbi8vICAgICBzaG91bGQgYmUgY29uc2lkZWQg4oCYb3BlbuKAmS5cbi8vXG4vLyAgICAgQSByZXBsYWNlIHN0ZXAgd2lsbCB0cnkgdG8gam9pbiBvcGVuIG5vZGVzIG9uIGJvdGggc2lkZXMgb2YgdGhlXG4vLyAgICAgY3V0LiBUaGF0IGlzLCBub2RlcyBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgdGhhdCBhcmUgcGFydGlhbGx5XG4vLyAgICAgY3V0IG9mZiBieSBgZnJvbWAgYW5kIGB0b2AsIGFuZCBub2RlcyBhdCB0aGUgc2lkZXMgb2YgdGhlXG4vLyAgICAgcmVwbGFjZW1lbnQgY29udGVudCBhcyBzcGVjaWZpY2VkIGJ5IGBvcGVuTGVmdGAgYW5kXG4vLyAgICAgYG9wZW5SaWdodGAuIEZvciBleGFtcGxlLCBpZiBgb3BlbkxlZnRgIGlzIDIsIHRoZSBmaXJzdCBub2RlIG9mXG4vLyAgICAgdGhlIHJlcGxhY2VtZW50IGNvbnRlbnQgYXMgd2VsbCBhcyBpdHMgZmlyc3QgY2hpbGQgaXNcbi8vICAgICBjb25zaWRlcmVkIG9wZW4uIFdoZW5ldmVyIHR3byBvcGVuIG5vZGVzIHdpdGggdGhlIHNhbWVcbi8vICAgICBbbWFya3VwXSgjTm9kZS5zYW1lTWFya3VwKSBlbmQgdXAgbmV4dCB0byBlYWNoIG90aGVyLCB0aGV5IGFyZVxuLy8gICAgIGpvaW5lZC4gT3BlbiBub2RlcyB0aGF0IGFyZW4ndCBqb2luZWQgYXJlIFtjbG9zZWRdKCNOb2RlLmNsb3NlKVxuLy8gICAgIHRvIGVuc3VyZSB0aGVpciBjb250ZW50IChvciBsYWNrIG9mIGl0KSBpcyB2YWxpZC5cblxuZnVuY3Rpb24gZmluZE1vdmVkQ2h1bmtzKG9sZE5vZGUsIG9sZFBhdGgsIG5ld05vZGUsIHN0YXJ0RGVwdGgpIHtcbiAgdmFyIG1vdmVkID0gW107XG4gIHZhciBuZXdQYXRoID0gb2xkUGF0aC5wYXRoLnNsaWNlKDAsIHN0YXJ0RGVwdGgpO1xuXG4gIGZvciAodmFyIGRlcHRoID0gc3RhcnREZXB0aDs7IGRlcHRoKyspIHtcbiAgICB2YXIgam9pbmVkID0gZGVwdGggPT0gb2xkUGF0aC5kZXB0aCA/IDAgOiAxO1xuICAgIHZhciBjdXQgPSBkZXB0aCA9PSBvbGRQYXRoLmRlcHRoID8gb2xkUGF0aC5vZmZzZXQgOiBvbGRQYXRoLnBhdGhbZGVwdGhdO1xuICAgIHZhciBhZnRlckN1dCA9IG9sZE5vZGUuc2l6ZSAtIGN1dDtcbiAgICB2YXIgbmV3T2Zmc2V0ID0gbmV3Tm9kZS5zaXplIC0gYWZ0ZXJDdXQ7XG5cbiAgICB2YXIgZnJvbSA9IG9sZFBhdGguc2hvcnRlbihkZXB0aCwgam9pbmVkKTtcbiAgICB2YXIgdG8gPSBuZXcgX21vZGVsLlBvcyhuZXdQYXRoLCBuZXdPZmZzZXQgKyBqb2luZWQpO1xuICAgIGlmIChmcm9tLmNtcCh0bykpIG1vdmVkLnB1c2gobmV3IF9tYXAuTW92ZWRSYW5nZShmcm9tLCBhZnRlckN1dCAtIGpvaW5lZCwgdG8pKTtcblxuICAgIGlmICgham9pbmVkKSByZXR1cm4gbW92ZWQ7XG5cbiAgICBvbGROb2RlID0gb2xkTm9kZS5jaGlsZChjdXQpO1xuICAgIG5ld05vZGUgPSBuZXdOb2RlLmNoaWxkKG5ld09mZnNldCk7XG4gICAgbmV3UGF0aCA9IG5ld1BhdGguY29uY2F0KG5ld09mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZShub2RlLCBmcm9tLCB0bywgcm9vdCwgcmVwbCkge1xuICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDUgfHwgYXJndW1lbnRzWzVdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzVdO1xuXG4gIGlmIChkZXB0aCA9PSByb290Lmxlbmd0aCkge1xuICAgIHZhciBiZWZvcmUgPSBub2RlLnNsaWNlQmV0d2VlbihudWxsLCBmcm9tLCBkZXB0aCk7XG4gICAgdmFyIGFmdGVyID0gbm9kZS5zbGljZUJldHdlZW4odG8sIG51bGwsIGRlcHRoKSxcbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgIGlmICghYmVmb3JlLnR5cGUuY2FuQ29udGFpbkZyYWdtZW50KHJlcGwuY29udGVudCkpIHJldHVybiBudWxsO1xuICAgIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSkgcmVzdWx0ID0gYmVmb3JlLmFwcGVuZChyZXBsLmNvbnRlbnQsIGZyb20uZGVwdGggLSBkZXB0aCwgcmVwbC5vcGVuTGVmdCkuYXBwZW5kKGFmdGVyLmNvbnRlbnQsIHJlcGwub3BlblJpZ2h0LCB0by5kZXB0aCAtIGRlcHRoKTtlbHNlIHJlc3VsdCA9IGJlZm9yZS5hcHBlbmQoYWZ0ZXIuY29udGVudCwgZnJvbS5kZXB0aCAtIGRlcHRoLCB0by5kZXB0aCAtIGRlcHRoKTtcbiAgICBpZiAoIXJlc3VsdC5zaXplICYmICFyZXN1bHQudHlwZS5jYW5CZUVtcHR5KSByZXN1bHQgPSByZXN1bHQuY29weShyZXN1bHQudHlwZS5kZWZhdWx0Q29udGVudCgpKTtcbiAgICByZXR1cm4geyBkb2M6IHJlc3VsdCwgbW92ZWQ6IGZpbmRNb3ZlZENodW5rcyhub2RlLCB0bywgcmVzdWx0LCBkZXB0aCkgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcG9zID0gcm9vdFtkZXB0aF07XG4gICAgdmFyIHJlc3VsdCA9IHJlcGxhY2Uobm9kZS5jaGlsZChwb3MpLCBmcm9tLCB0bywgcm9vdCwgcmVwbCwgZGVwdGggKyAxKTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHsgZG9jOiBub2RlLnJlcGxhY2UocG9zLCByZXN1bHQuZG9jKSwgbW92ZWQ6IHJlc3VsdC5tb3ZlZCB9O1xuICB9XG59XG5cbnZhciBudWxsUmVwbCA9IHsgY29udGVudDogX21vZGVsLmVtcHR5RnJhZ21lbnQsIG9wZW5MZWZ0OiAwLCBvcGVuUmlnaHQ6IDAgfTtcblxuX3N0ZXAuU3RlcC5kZWZpbmUoXCJyZXBsYWNlXCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciByb290UG9zID0gc3RlcC5wb3MsXG4gICAgICAgIHJvb3QgPSByb290UG9zLnBhdGg7XG4gICAgaWYgKHN0ZXAuZnJvbS5kZXB0aCA8IHJvb3QubGVuZ3RoIHx8IHN0ZXAudG8uZGVwdGggPCByb290Lmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb290Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoc3RlcC5mcm9tLnBhdGhbaV0gIT0gcm9vdFtpXSB8fCBzdGVwLnRvLnBhdGhbaV0gIT0gcm9vdFtpXSkgcmV0dXJuIG51bGw7XG4gICAgfXZhciByZXN1bHQgPSByZXBsYWNlKGRvYywgc3RlcC5mcm9tLCBzdGVwLnRvLCByb290UG9zLnBhdGgsIHN0ZXAucGFyYW0gfHwgbnVsbFJlcGwpO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgb3V0ID0gcmVzdWx0LmRvYztcbiAgICB2YXIgbW92ZWQgPSByZXN1bHQubW92ZWQ7XG5cbiAgICB2YXIgZW5kID0gbW92ZWQubGVuZ3RoID8gbW92ZWRbbW92ZWQubGVuZ3RoIC0gMV0uZGVzdCA6IHN0ZXAudG87XG4gICAgdmFyIHJlcGxhY2VkID0gbmV3IF9tYXAuUmVwbGFjZWRSYW5nZShzdGVwLmZyb20sIHN0ZXAudG8sIHN0ZXAuZnJvbSwgZW5kLCByb290UG9zLCByb290UG9zKTtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXBSZXN1bHQob3V0LCBuZXcgX21hcC5Qb3NNYXAobW92ZWQsIFtyZXBsYWNlZF0pKTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbiBpbnZlcnQoc3RlcCwgb2xkRG9jLCBtYXApIHtcbiAgICB2YXIgZGVwdGggPSBzdGVwLnBvcy5kZXB0aDtcbiAgICByZXR1cm4gbmV3IF9zdGVwLlN0ZXAoXCJyZXBsYWNlXCIsIHN0ZXAuZnJvbSwgbWFwLm1hcChzdGVwLnRvKS5wb3MsIHN0ZXAuZnJvbS5zaG9ydGVuKGRlcHRoKSwge1xuICAgICAgY29udGVudDogb2xkRG9jLnBhdGgoc3RlcC5wb3MucGF0aCkuY29udGVudC5zbGljZUJldHdlZW4oc3RlcC5mcm9tLCBzdGVwLnRvLCBkZXB0aCksXG4gICAgICBvcGVuTGVmdDogc3RlcC5mcm9tLmRlcHRoIC0gZGVwdGgsXG4gICAgICBvcGVuUmlnaHQ6IHN0ZXAudG8uZGVwdGggLSBkZXB0aFxuICAgIH0pO1xuICB9LFxuICBwYXJhbVRvSlNPTjogZnVuY3Rpb24gcGFyYW1Ub0pTT04ocGFyYW0pIHtcbiAgICByZXR1cm4gcGFyYW0gJiYgeyBjb250ZW50OiBwYXJhbS5jb250ZW50LnNpemUgJiYgcGFyYW0uY29udGVudC50b0pTT04oKSxcbiAgICAgIG9wZW5MZWZ0OiBwYXJhbS5vcGVuTGVmdCwgb3BlblJpZ2h0OiBwYXJhbS5vcGVuUmlnaHQgfTtcbiAgfSxcbiAgcGFyYW1Gcm9tSlNPTjogZnVuY3Rpb24gcGFyYW1Gcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICByZXR1cm4ganNvbiAmJiB7IGNvbnRlbnQ6IF9tb2RlbC5GcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCksXG4gICAgICBvcGVuTGVmdDoganNvbi5vcGVuTGVmdCwgb3BlblJpZ2h0OiBqc29uLm9wZW5SaWdodCB9O1xuICB9XG59KTtcblxuZnVuY3Rpb24gc2hpZnRGcm9tU3RhY2soc3RhY2ssIGRlcHRoKSB7XG4gIHZhciBzaGlmdGVkID0gc3RhY2tbZGVwdGhdID0gc3RhY2tbZGVwdGhdLnNwbGljZSgwLCAxLCBfbW9kZWwuZW1wdHlGcmFnbWVudCk7XG4gIGZvciAodmFyIGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgc2hpZnRlZCA9IHN0YWNrW2ldID0gc3RhY2tbaV0ucmVwbGFjZSgwLCBzaGlmdGVkKTtcbiAgfVxufVxuXG4vLyBGSVhNRSBmaW5kIGEgbm90IHNvIGhvcnJpYmx5IGNvbmZ1c2luZyB3YXkgdG8gZXhwcmVzcyB0aGlzXG5mdW5jdGlvbiBidWlsZEluc2VydGVkKG5vZGVzTGVmdCwgc291cmNlLCBzdGFydCwgZW5kKSB7XG4gIHZhciBzbGljZWQgPSBzb3VyY2Uuc2xpY2VCZXR3ZWVuKHN0YXJ0LCBlbmQpO1xuICB2YXIgbm9kZXNSaWdodCA9IFtdO1xuICBmb3IgKHZhciBub2RlID0gc2xpY2VkLCBpID0gMDsgaSA8PSBzdGFydC5wYXRoLmxlbmd0aDsgaSsrLCBub2RlID0gbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZXNSaWdodC5wdXNoKG5vZGUpO1xuICB9dmFyIHNhbWUgPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoc3RhcnQsIGVuZCk7XG4gIHZhciBzZWFyY2hMZWZ0ID0gbm9kZXNMZWZ0Lmxlbmd0aCAtIDEsXG4gICAgICBzZWFyY2hSaWdodCA9IG5vZGVzUmlnaHQubGVuZ3RoIC0gMTtcbiAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgdmFyIGlubmVyID0gbm9kZXNSaWdodFtzZWFyY2hSaWdodF07XG4gIGlmIChpbm5lci5pc1RleHRibG9jayAmJiBpbm5lci5zaXplICYmIG5vZGVzTGVmdFtzZWFyY2hMZWZ0XS5pc1RleHRibG9jaykge1xuICAgIHJlc3VsdCA9IG5vZGVzTGVmdFtzZWFyY2hMZWZ0LS1dLmNvcHkoaW5uZXIuY29udGVudCk7XG4gICAgLS1zZWFyY2hSaWdodDtcbiAgICBzaGlmdEZyb21TdGFjayhub2Rlc1JpZ2h0LCBzZWFyY2hSaWdodCk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1JpZ2h0W3NlYXJjaFJpZ2h0XSxcbiAgICAgICAgdHlwZSA9IG5vZGUudHlwZSxcbiAgICAgICAgbWF0Y2hlZCA9IG51bGw7XG4gICAgdmFyIG91dHNpZGUgPSBzZWFyY2hSaWdodCA8PSBzYW1lO1xuICAgIGZvciAodmFyIGkgPSBzZWFyY2hMZWZ0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGxlZnQgPSBub2Rlc0xlZnRbaV07XG4gICAgICBpZiAob3V0c2lkZSA/IGxlZnQudHlwZS5jYW5Db250YWluQ29udGVudChub2RlLnR5cGUpIDogbGVmdC50eXBlID09IHR5cGUpIHtcbiAgICAgICAgbWF0Y2hlZCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWF0Y2hlZCAhPSBudWxsKSB7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXN1bHQgPSBub2Rlc0xlZnRbbWF0Y2hlZF0uY29weShub2RlLmNvbnRlbnQpO1xuICAgICAgICBzZWFyY2hMZWZ0ID0gbWF0Y2hlZCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoc2VhcmNoTGVmdCA+PSBtYXRjaGVkKSB7XG4gICAgICAgICAgdmFyIHdyYXAgPSBub2Rlc0xlZnRbc2VhcmNoTGVmdF07XG4gICAgICAgICAgdmFyIGNvbnRlbnQgPSBfbW9kZWwuRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgICAgICAgIHJlc3VsdCA9IHdyYXAuY29weShzZWFyY2hMZWZ0ID09IG1hdGNoZWQgPyBjb250ZW50LmFwcGVuZChub2RlLmNvbnRlbnQpIDogY29udGVudCk7XG4gICAgICAgICAgc2VhcmNoTGVmdC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXRjaGVkICE9IG51bGwgfHwgbm9kZS5zaXplID09IDApIHtcbiAgICAgIGlmIChvdXRzaWRlKSBicmVhaztcbiAgICAgIGlmIChzZWFyY2hSaWdodCkgc2hpZnRGcm9tU3RhY2sobm9kZXNSaWdodCwgc2VhcmNoUmlnaHQgLSAxKTtcbiAgICB9XG4gICAgc2VhcmNoUmlnaHQtLTtcbiAgfVxuXG4gIHZhciByZXBsID0geyBjb250ZW50OiByZXN1bHQgPyByZXN1bHQuY29udGVudCA6IF9tb2RlbC5lbXB0eUZyYWdtZW50LFxuICAgIG9wZW5MZWZ0OiBzdGFydC5kZXB0aCAtIHNlYXJjaFJpZ2h0LFxuICAgIG9wZW5SaWdodDogZW5kLmRlcHRoIC0gc2VhcmNoUmlnaHQgfTtcbiAgcmV0dXJuIHsgcmVwbDogcmVwbCwgZGVwdGg6IHNlYXJjaExlZnQgKyAxIH07XG59XG5cbmZ1bmN0aW9uIG1vdmVUZXh0KHRyLCBkb2MsIGJlZm9yZSwgYWZ0ZXIpIHtcbiAgdmFyIHJvb3QgPSAoMCwgX3RyZWUuc2FtZVBhdGhEZXB0aCkoYmVmb3JlLCBhZnRlcik7XG4gIHZhciBjdXRBdCA9IGFmdGVyLnNob3J0ZW4obnVsbCwgMSk7XG4gIHdoaWxlIChjdXRBdC5wYXRoLmxlbmd0aCA+IHJvb3QgJiYgZG9jLnBhdGgoY3V0QXQucGF0aCkuc2l6ZSA9PSAxKSBjdXRBdCA9IGN1dEF0LnNob3J0ZW4obnVsbCwgMSk7XG4gIHRyLnNwbGl0KGN1dEF0LCBjdXRBdC5wYXRoLmxlbmd0aCAtIHJvb3QpO1xuICB2YXIgc3RhcnQgPSBhZnRlcixcbiAgICAgIGVuZCA9IG5ldyBfbW9kZWwuUG9zKHN0YXJ0LnBhdGgsIGRvYy5wYXRoKHN0YXJ0LnBhdGgpLnNpemUpO1xuICB2YXIgcGFyZW50ID0gZG9jLnBhdGgoc3RhcnQucGF0aC5zbGljZSgwLCByb290KSk7XG4gIHZhciB3YW50ZWQgPSBwYXJlbnQucGF0aE5vZGVzKGJlZm9yZS5wYXRoLnNsaWNlKHJvb3QpKTtcbiAgdmFyIGV4aXN0aW5nID0gcGFyZW50LnBhdGhOb2RlcyhzdGFydC5wYXRoLnNsaWNlKHJvb3QpKTtcbiAgd2hpbGUgKHdhbnRlZC5sZW5ndGggJiYgZXhpc3RpbmcubGVuZ3RoICYmIHdhbnRlZFswXS5zYW1lTWFya3VwKGV4aXN0aW5nWzBdKSkge1xuICAgIHdhbnRlZC5zaGlmdCgpO1xuICAgIGV4aXN0aW5nLnNoaWZ0KCk7XG4gIH1cbiAgaWYgKGV4aXN0aW5nLmxlbmd0aCB8fCB3YW50ZWQubGVuZ3RoKSB0ci5zdGVwKFwiYW5jZXN0b3JcIiwgc3RhcnQsIGVuZCwgbnVsbCwge1xuICAgIGRlcHRoOiBleGlzdGluZy5sZW5ndGgsXG4gICAgdHlwZXM6IHdhbnRlZC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLnR5cGU7XG4gICAgfSksXG4gICAgYXR0cnM6IHdhbnRlZC5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmF0dHJzO1xuICAgIH0pXG4gIH0pO1xuICBmb3IgKHZhciBpID0gcm9vdDsgaSA8IGJlZm9yZS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgdHIuam9pbihiZWZvcmUuc2hvcnRlbihpLCAxKSk7XG4gIH1cbn1cblxuLy8gOjogKFBvcywgUG9zKSDihpIgVHJhbnNmb3JtXG4vLyBEZWxldGUgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIGlmIChmcm9tLmNtcCh0bykpIHRoaXMucmVwbGFjZShmcm9tLCB0byk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gOjogKFBvcywgUG9zLCBOb2RlLCBQb3MsIFBvcykg4oaSIFRyYW5zZm9ybVxuLy8gUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbi8vIHBhcnQgb2YgdGhlIGBzb3VyY2VgIGJldHdlZW4gYHN0YXJ0YCBhbmQgYGVuZGAuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc291cmNlLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXBsID0gdW5kZWZpbmVkLFxuICAgICAgZGVwdGggPSB1bmRlZmluZWQsXG4gICAgICBkb2MgPSB0aGlzLmRvYyxcbiAgICAgIG1heERlcHRoID0gKDAsIF90cmVlLnNhbWVQYXRoRGVwdGgpKGZyb20sIHRvKTtcbiAgaWYgKHNvdXJjZSkge1xuICAgIDtcbiAgICB2YXIgX2J1aWxkSW5zZXJ0ZWQgPSBidWlsZEluc2VydGVkKGRvYy5wYXRoTm9kZXMoZnJvbS5wYXRoKSwgc291cmNlLCBzdGFydCwgZW5kKTtcblxuICAgIHJlcGwgPSBfYnVpbGRJbnNlcnRlZC5yZXBsO1xuICAgIGRlcHRoID0gX2J1aWxkSW5zZXJ0ZWQuZGVwdGg7XG5cbiAgICB3aGlsZSAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgaWYgKHJlcGwuY29udGVudC5zaXplKSByZXBsID0geyBjb250ZW50OiBfbW9kZWwuRnJhZ21lbnQuZnJvbShkb2MucGF0aChmcm9tLnBhdGguc2xpY2UoMCwgZGVwdGgpKS5jb3B5KHJlcGwuY29udGVudCkpLFxuICAgICAgICBvcGVuTGVmdDogcmVwbC5vcGVuTGVmdCArIDEsIG9wZW5SaWdodDogcmVwbC5vcGVuUmlnaHQgKyAxIH07XG4gICAgICBkZXB0aC0tO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXBsID0gbnVsbFJlcGw7XG4gICAgZGVwdGggPSBtYXhEZXB0aDtcbiAgfVxuICB2YXIgcm9vdCA9IGZyb20uc2hvcnRlbihkZXB0aCksXG4gICAgICBkb2NBZnRlciA9IGRvYyxcbiAgICAgIGFmdGVyID0gdG87XG4gIGlmIChyZXBsLmNvbnRlbnQuc2l6ZSB8fCAoMCwgX3RyZWUucmVwbGFjZUhhc0VmZmVjdCkoZG9jLCBmcm9tLCB0bykpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5zdGVwKFwicmVwbGFjZVwiLCBmcm9tLCB0bywgcm9vdCwgcmVwbCk7XG4gICAgZG9jQWZ0ZXIgPSByZXN1bHQuZG9jO1xuICAgIGFmdGVyID0gcmVzdWx0Lm1hcC5tYXAodG8pLnBvcztcbiAgfVxuXG4gIC8vIElmIG5vIHRleHQgbm9kZXMgYmVmb3JlIG9yIGFmdGVyIGVuZCBvZiByZXBsYWNlbWVudCwgZG9uJ3QgZ2x1ZSB0ZXh0XG4gIGlmICghZG9jLnBhdGgodG8ucGF0aCkuaXNUZXh0YmxvY2spIHJldHVybiB0aGlzO1xuICBpZiAoIShyZXBsLmNvbnRlbnQuc2l6ZSA/IHNvdXJjZS5wYXRoKGVuZC5wYXRoKS5pc1RleHRibG9jayA6IGRvYy5wYXRoKGZyb20ucGF0aCkuaXNUZXh0YmxvY2spKSByZXR1cm4gdGhpcztcblxuICB2YXIgbm9kZXNBZnRlciA9IGRvYy5wYXRoKHJvb3QucGF0aCkucGF0aE5vZGVzKHRvLnBhdGguc2xpY2UoZGVwdGgpKS5zbGljZSgxKTtcbiAgdmFyIG5vZGVzQmVmb3JlID0gdW5kZWZpbmVkO1xuICBpZiAocmVwbC5jb250ZW50LnNpemUpIHtcbiAgICB2YXIgaW5zZXJ0ZWQgPSByZXBsLmNvbnRlbnQ7XG4gICAgbm9kZXNCZWZvcmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGwub3BlblJpZ2h0OyBpKyspIHtcbiAgICAgIHZhciBsYXN0ID0gaW5zZXJ0ZWQuY2hpbGQoaW5zZXJ0ZWQuc2l6ZSAtIDEpO1xuICAgICAgbm9kZXNCZWZvcmUucHVzaChsYXN0KTtcbiAgICAgIGluc2VydGVkID0gbGFzdC5jb250ZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub2Rlc0JlZm9yZSA9IGRvYy5wYXRoKHJvb3QucGF0aCkucGF0aE5vZGVzKGZyb20ucGF0aC5zbGljZShkZXB0aCkpLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKG5vZGVzQmVmb3JlLmxlbmd0aCAmJiAobm9kZXNBZnRlci5sZW5ndGggIT0gbm9kZXNCZWZvcmUubGVuZ3RoIHx8ICFub2Rlc0FmdGVyLmV2ZXJ5KGZ1bmN0aW9uIChuLCBpKSB7XG4gICAgcmV0dXJuIG4uc2FtZU1hcmt1cChub2Rlc0JlZm9yZVtpXSk7XG4gIH0pKSkge1xuICAgIHZhciBfYWZ0ZXIkc2hvcnRlbiA9IGFmdGVyLnNob3J0ZW4ocm9vdC5kZXB0aCk7XG5cbiAgICB2YXIgcGF0aCA9IF9hZnRlciRzaG9ydGVuLnBhdGg7XG4gICAgdmFyIG9mZnNldCA9IF9hZnRlciRzaG9ydGVuLm9mZnNldDt2YXIgYmVmb3JlID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIG5vZGUgPSBkb2NBZnRlci5wYXRoKHBhdGgpLCBpID0gMDs7IGkrKykge1xuICAgICAgaWYgKGkgPT0gbm9kZXNCZWZvcmUubGVuZ3RoKSB7XG4gICAgICAgIGJlZm9yZSA9IG5ldyBfbW9kZWwuUG9zKHBhdGgsIG9mZnNldCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKG9mZnNldCAtIDEpO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQob2Zmc2V0IC0gMSk7XG4gICAgICBvZmZzZXQgPSBub2RlLnNpemU7XG4gICAgfVxuICAgIG1vdmVUZXh0KHRoaXMsIGRvY0FmdGVyLCBiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIFBvcywgdW5pb248RnJhZ21lbnQsIE5vZGUsIFtOb2RlXT4pIOKGkiBUcmFuc2Zvcm1cbi8vIFJlcGxhY2UgdGhlIGdpdmVuIHNpYmxpbmcgcmFuZ2UgKHBvc2l0aW9uIHBvbnRpbmcgaW50byB0aGUgc2FtZVxuLy8gcGFyZW50KSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYSBmcmFnbWVudCwgbm9kZSwgb3Jcbi8vIGFycmF5IG9mIG5vZGVzLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLnJlcGxhY2VXaXRoID0gZnVuY3Rpb24gKGZyb20sIHRvLCBjb250ZW50KSB7XG4gIGlmICghKGNvbnRlbnQgaW5zdGFuY2VvZiBfbW9kZWwuRnJhZ21lbnQpKSBjb250ZW50ID0gX21vZGVsLkZyYWdtZW50LmZyb20oY29udGVudCk7XG4gIGlmICghX21vZGVsLlBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gdGhpcztcbiAgdGhpcy5zdGVwKFwicmVwbGFjZVwiLCBmcm9tLCB0bywgZnJvbSwgeyBjb250ZW50OiBjb250ZW50LCBvcGVuTGVmdDogMCwgb3BlblJpZ2h0OiAwIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIDo6IChQb3MsIHVuaW9uPEZyYWdtZW50LCBOb2RlLCBbTm9kZV0+KSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGBwb3NgLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChwb3MsIGNvbnRlbnQpIHtcbiAgcmV0dXJuIHRoaXMucmVwbGFjZVdpdGgocG9zLCBwb3MsIGNvbnRlbnQpO1xufTtcblxuLy8gOjogKFBvcywgc3RyaW5nKSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIHRleHQgYXQgYHBvc2AsIGluaGVyaXRpbmcgdGhlIG1hcmtzIG9mIHRoZVxuLy8gZXhpc3RpbmcgY29udGVudCBhdCB0aGF0IHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydFRleHQgPSBmdW5jdGlvbiAocG9zLCB0ZXh0KSB7XG4gIHJldHVybiB0aGlzLmluc2VydChwb3MsIHRoaXMuZG9jLnR5cGUuc2NoZW1hLnRleHQodGV4dCwgdGhpcy5kb2MubWFya3NBdChwb3MpKSk7XG59O1xuXG4vLyA6OiAoUG9zLCBOb2RlKSDihpIgVHJhbnNmb3JtXG4vLyBJbnNlcnQgdGhlIGdpdmVuIG5vZGUgYXQgYHBvc2AsIGluaGVyaXRpbmcgdGhlIG1hcmtzIG9mIHRoZVxuLy8gZXhpc3RpbmcgY29udGVudCBhdCB0aGF0IHBvc2l0aW9uLlxuX3RyYW5zZm9ybS5UcmFuc2Zvcm0ucHJvdG90eXBlLmluc2VydElubGluZSA9IGZ1bmN0aW9uIChwb3MsIG5vZGUpIHtcbiAgcmV0dXJuIHRoaXMuaW5zZXJ0KHBvcywgbm9kZS5tYXJrKHRoaXMuZG9jLm1hcmtzQXQocG9zKSkpO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9tb2RlbCA9IHJlcXVpcmUoXCIuLi9tb2RlbFwiKTtcblxudmFyIF90cmFuc2Zvcm0gPSByZXF1aXJlKFwiLi90cmFuc2Zvcm1cIik7XG5cbnZhciBfc3RlcCA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyAhISAqKmBzcGxpdGAqKlxuLy8gICA6IFNwbGl0IGEgYmxvY2sgbm9kZSBhdCBgcG9zYC4gVGhlIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIG1heSBiZVxuLy8gICAgIGB7dHlwZSwgP2F0dHJzfWAgb2JqZWN0IGdpdmluZyB0aGUgbm9kZSB0eXBlIGFuZCBvcHRpb25hbGx5IHRoZVxuLy8gICAgIGF0dHJpYnV0ZXMgb2YgdGhlIG5vZGUgY3JlYXRlZCB0byBob2xkIHRoZSBjb250ZW50IGFmdGVyIHRoZVxuLy8gICAgIHNwbGl0LlxuXG5fc3RlcC5TdGVwLmRlZmluZShcInNwbGl0XCIsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KGRvYywgc3RlcCkge1xuICAgIHZhciBwb3MgPSBzdGVwLnBvcztcbiAgICBpZiAocG9zLmRlcHRoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgdmFyIF9wb3Mkc2hvcnRlbiA9IHBvcy5zaG9ydGVuKCk7XG5cbiAgICB2YXIgcGFyZW50UGF0aCA9IF9wb3Mkc2hvcnRlbi5wYXRoO1xuICAgIHZhciBvZmZzZXQgPSBfcG9zJHNob3J0ZW4ub2Zmc2V0O1xuXG4gICAgdmFyIHBhcmVudCA9IGRvYy5wYXRoKHBhcmVudFBhdGgpO1xuICAgIHZhciB0YXJnZXQgPSBwYXJlbnQuY2hpbGQob2Zmc2V0KSxcbiAgICAgICAgdGFyZ2V0U2l6ZSA9IHRhcmdldC5zaXplO1xuXG4gICAgdmFyIF9yZWYgPSBzdGVwLnBhcmFtIHx8IHRhcmdldDtcblxuICAgIHZhciB0eXBlQWZ0ZXIgPSBfcmVmLnR5cGU7XG4gICAgdmFyIGF0dHJzQWZ0ZXIgPSBfcmVmLmF0dHJzO1xuXG4gICAgdmFyIHNwbGl0QXQgPSBwb3Mub2Zmc2V0O1xuICAgIGlmIChzcGxpdEF0ID09IDAgJiYgIXRhcmdldC50eXBlLmNhbkJlRW1wdHkgfHwgdGFyZ2V0LnR5cGUubG9ja2VkIHx8IHNwbGl0QXQgPT0gdGFyZ2V0LnNpemUgJiYgIXR5cGVBZnRlci5jYW5CZUVtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3UGFyZW50ID0gcGFyZW50LnNwbGljZShvZmZzZXQsIG9mZnNldCArIDEsIF9tb2RlbC5GcmFnbWVudC5mcm9tKFt0YXJnZXQuc2xpY2UoMCwgc3BsaXRBdCksIHR5cGVBZnRlci5jcmVhdGUoYXR0cnNBZnRlciwgdGFyZ2V0LmNvbnRlbnQuc2xpY2Uoc3BsaXRBdCkpXSkpO1xuICAgIHZhciBjb3B5ID0gZG9jLnJlcGxhY2VEZWVwKHBhcmVudFBhdGgsIG5ld1BhcmVudCk7XG5cbiAgICB2YXIgZGVzdCA9IG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGguY29uY2F0KG9mZnNldCArIDEpLCAwKTtcbiAgICB2YXIgbWFwID0gbmV3IF9tYXAuUG9zTWFwKFtuZXcgX21hcC5Nb3ZlZFJhbmdlKHBvcywgdGFyZ2V0U2l6ZSAtIHBvcy5vZmZzZXQsIGRlc3QpLCBuZXcgX21hcC5Nb3ZlZFJhbmdlKG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGgsIG9mZnNldCArIDEpLCBuZXdQYXJlbnQuc2l6ZSAtIDIgLSBvZmZzZXQsIG5ldyBfbW9kZWwuUG9zKHBhcmVudFBhdGgsIG9mZnNldCArIDIpKV0sIFtuZXcgX21hcC5SZXBsYWNlZFJhbmdlKHBvcywgcG9zLCBwb3MsIGRlc3QsIHBvcywgcG9zLnNob3J0ZW4obnVsbCwgMSkpXSk7XG4gICAgcmV0dXJuIG5ldyBfc3RlcC5TdGVwUmVzdWx0KGNvcHksIG1hcCk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24gaW52ZXJ0KHN0ZXAsIF9vbGREb2MsIG1hcCkge1xuICAgIHJldHVybiBuZXcgX3N0ZXAuU3RlcChcImpvaW5cIiwgc3RlcC5wb3MsIG1hcC5tYXAoc3RlcC5wb3MpLnBvcyk7XG4gIH0sXG4gIHBhcmFtVG9KU09OOiBmdW5jdGlvbiBwYXJhbVRvSlNPTihwYXJhbSkge1xuICAgIHJldHVybiBwYXJhbSAmJiB7IHR5cGU6IHBhcmFtLnR5cGUubmFtZSwgYXR0cnM6IHBhcmFtLmF0dHJzIH07XG4gIH0sXG4gIHBhcmFtRnJvbUpTT046IGZ1bmN0aW9uIHBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgcmV0dXJuIGpzb24gJiYgeyB0eXBlOiBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKSwgYXR0cnM6IGpzb24uYXR0cnMgfTtcbiAgfVxufSk7XG5cbi8vIDo6IChQb3MsID9udW1iZXIsID9Ob2RlVHlwZSwgP09iamVjdCkg4oaSIFRyYW5zZm9ybVxuLy8gU3BsaXQgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhbmQgb3B0aW9uYWxseSwgaWYgYGRlcHRoYCBpc1xuLy8gZ3JlYXRlciB0aGFuIG9uZSwgYW55IG51bWJlciBvZiBub2RlcyBhYm92ZSB0aGF0LiBCeSBkZWZhdWx0LCB0aGUgcGFydFxuLy8gc3BsaXQgb2ZmIHdpbGwgaW5oZXJpdCB0aGUgbm9kZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCBub2RlLiBUaGlzIGNhblxuLy8gYmUgY2hhbmdlZCBieSBwYXNzaW5nIGB0eXBlQWZ0ZXJgIGFuZCBgYXR0cnNBZnRlcmAuXG5fdHJhbnNmb3JtLlRyYW5zZm9ybS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiAocG9zLCBkZXB0aCwgdHlwZUFmdGVyLCBhdHRyc0FmdGVyKSB7XG4gIGlmIChkZXB0aCA9PT0gdW5kZWZpbmVkKSBkZXB0aCA9IDE7XG5cbiAgaWYgKGRlcHRoID09IDApIHJldHVybiB0aGlzO1xuICBmb3IgKHZhciBpID0gMDs7IGkrKykge1xuICAgIHRoaXMuc3RlcChcInNwbGl0XCIsIG51bGwsIG51bGwsIHBvcywgdHlwZUFmdGVyICYmIHsgdHlwZTogdHlwZUFmdGVyLCBhdHRyczogYXR0cnNBZnRlciB9KTtcbiAgICBpZiAoaSA9PSBkZXB0aCAtIDEpIHJldHVybiB0aGlzO1xuICAgIHR5cGVBZnRlciA9IG51bGw7XG4gICAgcG9zID0gcG9zLnNob3J0ZW4obnVsbCwgMSk7XG4gIH1cbn07XG5cbi8vIDo6IChQb3MsID9udW1iZXIpIOKGkiBUcmFuc2Zvcm1cbi8vIFNwbGl0IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgX2lmXyB0aGF0IHBvc2l0aW9uIGlzbid0IGFscmVhZHkgYXRcbi8vIHRoZSBzdGFydCBvciBlbmQgb2YgYSBub2RlLiBJZiBgZGVwdGhgIGlzIGdyZWF0ZXIgdGhhbiBvbmUsIGFsc28gZG9cbi8vIHNvIGZvciBwYXJlbnQgcG9zaXRpb25zIGFib3ZlIHRoZSBnaXZlbiBwb3NpdGlvbi5cbl90cmFuc2Zvcm0uVHJhbnNmb3JtLnByb3RvdHlwZS5zcGxpdElmTmVlZGVkID0gZnVuY3Rpb24gKHBvcykge1xuICB2YXIgZGVwdGggPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAxIDogYXJndW1lbnRzWzFdO1xuXG4gIGZvciAodmFyIG9mZiA9IDA7IG9mZiA8IGRlcHRoOyBvZmYrKykge1xuICAgIHZhciBoZXJlID0gcG9zLnNob3J0ZW4ocG9zLmRlcHRoIC0gb2ZmKTtcbiAgICBpZiAoaGVyZS5vZmZzZXQgJiYgaGVyZS5vZmZzZXQgPCB0aGlzLmRvYy5wYXRoKGhlcmUucGF0aCkuc2l6ZSkgdGhpcy5zdGVwKFwic3BsaXRcIiwgbnVsbCwgbnVsbCwgaGVyZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBfbW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyA7OyBBIHN0ZXAgb2JqZWN0IHdyYXBzIGFuIGF0b21pYyBvcGVyYXRpb24uIEl0IGdlbmVyYWxseSBhcHBsaWVzXG4vLyBvbmx5IHRvIHRoZSBkb2N1bWVudCBpdCB3YXMgY3JlYXRlZCBmb3IsIHNpbmNlIHRoZSBwb3NpdGlvbnNcbi8vIGFzc29jaWF0ZWQgd2l0aCBpdCB3aWxsIG9ubHkgbWFrZSBzZW5zZSBmb3IgdGhhdCBkb2N1bWVudC5cblxudmFyIFN0ZXAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoc3RyaW5nLCA/UG9zLCA/UG9zLCA/UG9zLCA/YW55KVxuICAvLyBCdWlsZCBhIHN0ZXAuIFRoZSB0eXBlIHNob3VsZCBuYW1lIGEgW2RlZmluZWRdKFN0ZXAuZGVmaW5lKSBzdGVwXG4gIC8vIHR5cGUsIGFuZCB0aGUgc2hhcGUgb2YgdGhlIHBvc2l0aW9ucyBhbmQgcGFyYW1ldGVyIHNob3VsZCBiZVxuICAvLyBhcHByb3ByaWF0ZSBmb3IgdGhhdCB0eXBlLlxuXG4gIGZ1bmN0aW9uIFN0ZXAodHlwZSwgZnJvbSwgdG8sIHBvcykge1xuICAgIHZhciBwYXJhbSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBhcmd1bWVudHNbNF07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RlcCk7XG5cbiAgICBpZiAoISh0eXBlIGluIHN0ZXBzKSkgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzdGVwIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgLy8gOjogc3RyaW5nXG4gICAgLy8gVGhlIHR5cGUgb2YgdGhlIHN0ZXAuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIHN0YXJ0IG9mIHRoZSBzdGVwJ3MgcmFuZ2UsIGlmIGFueS4gV2hpY2ggb2YgdGhlIHRocmVlXG4gICAgLy8gb3B0aW9uYWwgcG9zaXRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHN0ZXAgYSBnaXZlbiBzdGVwIHR5cGVcbiAgICAvLyB1c2VzIGRpZmZlcnMuIFRoZSB3YXkgZWFjaCBvZiB0aGVzZSBwb3NpdGlvbnMgaXMgbWFwcGVkIHdoZW5cbiAgICAvLyB0aGUgc3RlcCBpcyBtYXBwZWQgb3ZlciBhIFtwb3NpdGlvbiBtYXBwaW5nXSgjUG9zTWFwKSBkZXBlbmRzXG4gICAgLy8gb24gaXRzIHJvbGUuXG4gICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGVuZCBvZiB0aGUgc3RlcCdzIHJhbmdlLlxuICAgIHRoaXMudG8gPSB0bztcbiAgICAvLyA6OiA/UG9zXG4gICAgLy8gVGhlIGJhc2UgcG9zaXRpb24gZm9yIHRoaXMgc3RlcC5cbiAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAvLyA6OiA/YW55XG4gICAgLy8gRXh0cmEgc3RlcC10eXBlLXNwZWNpZmljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RlcC5cbiAgICB0aGlzLnBhcmFtID0gcGFyYW07XG4gIH1cblxuICAvLyA7OyAjdG9jPWZhbHNlIE9iamVjdHMgb2YgdGhpcyB0eXBlIGFyZSByZXR1cm5lZCBhcyB0aGUgcmVzdWx0IG9mXG4gIC8vIGFwcGx5aW5nIGEgdHJhbnNmb3JtIHN0ZXAgdG8gYSBkb2N1bWVudC5cblxuICAvLyA6OiAoTm9kZSkg4oaSID9TdGVwUmVzdWx0XG4gIC8vIEFwcGxpZXMgdGhpcyBzdGVwIHRvIHRoZSBnaXZlbiBkb2N1bWVudCwgcmV0dXJuaW5nIGEgcmVzdWx0XG4gIC8vIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50ICh0aGUgaW5wdXQgZG9jdW1lbnQgaXMgbm90XG4gIC8vIGNoYW5nZWQpIGFuZCBhIGBQb3NNYXBgLiBJZiB0aGUgc3RlcCBjb3VsZCBub3QgbWVhbmluZ2Z1bGx5IGJlXG4gIC8vIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGRvY3VtZW50LCB0aGlzIHJldHVybnMgYG51bGxgLlxuXG4gIF9jcmVhdGVDbGFzcyhTdGVwLCBbe1xuICAgIGtleTogXCJhcHBseVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseShkb2MpIHtcbiAgICAgIHJldHVybiBzdGVwc1t0aGlzLnR5cGVdLmFwcGx5KGRvYywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gOjogKE5vZGUsIFBvc01hcCkg4oaSIFN0ZXBcbiAgICAvLyBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIHN0ZXAuIE5lZWRzIHRoZSBkb2N1bWVudCBhcyBpdFxuICAgIC8vIHdhcyBiZWZvcmUgdGhlIHN0ZXAsIGFzIHdlbGwgYXMgYFBvc01hcGAgY3JlYXRlZCBieSBhcHBseWluZyB0aGVcbiAgICAvLyBzdGVwIHRvIHRoYXQgZG9jdW1lbnQsIGFzIGlucHV0LlxuICB9LCB7XG4gICAga2V5OiBcImludmVydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnZlcnQob2xkRG9jLCBtYXApIHtcbiAgICAgIHJldHVybiBzdGVwc1t0aGlzLnR5cGVdLmludmVydCh0aGlzLCBvbGREb2MsIG1hcCk7XG4gICAgfVxuXG4gICAgLy8gOjogKE1hcHBhYmxlKSDihpIgP1N0ZXBcbiAgICAvLyBNYXAgdGhpcyBzdGVwIHRocm91Z2ggYSBtYXBwYWJsZSB0aGluZywgcmV0dXJuaW5nIGVpdGhlciBhXG4gICAgLy8gdmVyc2lvbiBvZiB0aGF0IHN0ZXAgd2l0aCBpdHMgcG9zaXRpb25zIGFkanVzdGVkLCBvciBgbnVsbGAgaWZcbiAgICAvLyB0aGUgc3RlcCB3YXMgZW50aXJlbHkgZGVsZXRlZCBieSB0aGUgbWFwcGluZy5cbiAgfSwge1xuICAgIGtleTogXCJtYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKHJlbWFwcGluZykge1xuICAgICAgdmFyIGFsbERlbGV0ZWQgPSB0cnVlO1xuICAgICAgdmFyIGZyb20gPSBudWxsLFxuICAgICAgICAgIHRvID0gbnVsbCxcbiAgICAgICAgICBwb3MgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5mcm9tKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZW1hcHBpbmcubWFwKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgIGZyb20gPSByZXN1bHQucG9zO1xuICAgICAgICBpZiAoIXJlc3VsdC5kZWxldGVkKSBhbGxEZWxldGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50bykge1xuICAgICAgICBpZiAodGhpcy50by5jbXAodGhpcy5mcm9tKSA9PSAwKSB7XG4gICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByZW1hcHBpbmcubWFwKHRoaXMudG8sIC0xKTtcbiAgICAgICAgICB0byA9IHJlc3VsdC5wb3MubWF4KGZyb20pO1xuICAgICAgICAgIGlmICghcmVzdWx0LmRlbGV0ZWQpIGFsbERlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucG9zKSB7XG4gICAgICAgIGlmIChmcm9tICYmIHRoaXMucG9zLmNtcCh0aGlzLmZyb20pID09IDApIHtcbiAgICAgICAgICBwb3MgPSBmcm9tO1xuICAgICAgICB9IGVsc2UgaWYgKHRvICYmIHRoaXMucG9zLmNtcCh0aGlzLnRvKSA9PSAwKSB7XG4gICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHJlbWFwcGluZy5tYXAodGhpcy5wb3MsIDEpO1xuICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgICAgaWYgKCFyZXN1bHQuZGVsZXRlZCkgYWxsRGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxsRGVsZXRlZCA/IG51bGwgOiBuZXcgU3RlcCh0aGlzLnR5cGUsIGZyb20sIHRvLCBwb3MsIHRoaXMucGFyYW0pO1xuICAgIH1cblxuICAgIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgICAvLyBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzdGVwLlxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICB2YXIgaW1wbCA9IHN0ZXBzW3RoaXMudHlwZV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGZyb206IHRoaXMuZnJvbSxcbiAgICAgICAgdG86IHRoaXMudG8sXG4gICAgICAgIHBvczogdGhpcy5wb3MsXG4gICAgICAgIHBhcmFtOiBpbXBsLnBhcmFtVG9KU09OID8gaW1wbC5wYXJhbVRvSlNPTih0aGlzLnBhcmFtKSA6IHRoaXMucGFyYW1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gOjogKFNjaGVtYSwgT2JqZWN0KSDihpIgU3RlcFxuICAgIC8vIERlc2VyaWFsaXplIGEgc3RlcCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICB9XSwgW3tcbiAgICBrZXk6IFwiZnJvbUpTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICB2YXIgaW1wbCA9IHN0ZXBzW2pzb24udHlwZV07XG4gICAgICByZXR1cm4gbmV3IFN0ZXAoanNvbi50eXBlLCBqc29uLmZyb20gJiYgX21vZGVsLlBvcy5mcm9tSlNPTihqc29uLmZyb20pLCBqc29uLnRvICYmIF9tb2RlbC5Qb3MuZnJvbUpTT04oanNvbi50byksIGpzb24ucG9zICYmIF9tb2RlbC5Qb3MuZnJvbUpTT04oanNvbi5wb3MpLCBpbXBsLnBhcmFtRnJvbUpTT04gPyBpbXBsLnBhcmFtRnJvbUpTT04oc2NoZW1hLCBqc29uLnBhcmFtKSA6IGpzb24ucGFyYW0pO1xuICAgIH1cblxuICAgIC8vIDo6IChzdHJpbmcsIE9iamVjdClcbiAgICAvLyBEZWZpbmUgYSBuZXcgdHlwZSBvZiBzdGVwLiBJbXBsZW1lbnRhdGlvbiBzaG91bGQgaGF2ZSB0aGVcbiAgICAvLyBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAvL1xuICAgIC8vICoqYGFwcGx5YCoqYChkb2M6IE5vZGUsIHN0ZXA6IFN0ZXApIOKGkiA/U3RlcFJlc3VsdFxuICAgIC8vICAgOiBBcHBsaWVzIHRoZSBzdGVwIHRvIGEgZG9jdW1lbnQuXG4gICAgLy8gKipgaW52ZXJ0YCoqYChzdGVwOiBTdGVwLCBvbGREb2M6IE5vZGUsIG1hcDogUG9zTWFwKSDihpIgU3RlcFxuICAgIC8vICAgOiBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGUgc3RlcC5cbiAgICAvLyAqKmBwYXJhbVRvSlNPTmAqKmAocGFyYW06ID9hbnkpIOKGkiA/T2JqZWN0XG4gICAgLy8gICA6IFNlcmlhbGl6ZSB0aGlzIHN0ZXAgdHlwZSdzIHBhcmFtZXRlciB0byBKU09OLlxuICAgIC8vICoqYHBhcmFtRnJvbUpTT05gKipgKHNjaGVtYTogU2NoZW1hLCBqc29uOiA/T2JqZWN0KSDihpIgP2FueVxuICAgIC8vICAgOiBEZXNlcmlhbGl6ZSB0aGlzIHN0ZXAgdHlwZSdzIHBhcmFtZXRlciBmcm9tIEpTT04uXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmluZSh0eXBlLCBpbXBsZW1lbnRhdGlvbikge1xuICAgICAgc3RlcHNbdHlwZV0gPSBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RlcDtcbn0pKCk7XG5cbmV4cG9ydHMuU3RlcCA9IFN0ZXA7XG5cbnZhciBTdGVwUmVzdWx0ID0gZnVuY3Rpb24gU3RlcFJlc3VsdChkb2MpIHtcbiAgdmFyIG1hcCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSB8fCBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IF9tYXAubnVsbE1hcCA6IGFyZ3VtZW50c1sxXTtcblxuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RlcFJlc3VsdCk7XG5cbiAgLy8gOjogTm9kZSBUaGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQuXG4gIHRoaXMuZG9jID0gZG9jO1xuICAvLyA6OiBQb3NNYXBcbiAgLy8gVGhlIHBvc2l0aW9uIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGVcbiAgLy8gb2xkIGFuZCB0aGUgbmV3IGRvY3VtZW50LlxuICB0aGlzLm1hcCA9IG1hcDtcbn07XG5cbmV4cG9ydHMuU3RlcFJlc3VsdCA9IFN0ZXBSZXN1bHQ7XG5cbnZhciBzdGVwcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIF9zdGVwMiA9IHJlcXVpcmUoXCIuL3N0ZXBcIik7XG5cbnZhciBfbWFwID0gcmVxdWlyZShcIi4vbWFwXCIpO1xuXG4vLyA7OyBBIGNoYW5nZSB0byBhIGRvY3VtZW50IG9mdGVuIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mXG4vLyBbc3RlcHNdKCNTdGVwKS4gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbnZlbmllbmNlIGFic3RyYWN0aW9uIHRvXG4vLyBidWlsZCB1cCBhbmQgdHJhY2sgc3VjaCBhbiBhcnJheSBvZiBzdGVwcy4gQSBgVHJhbnNmb3JtYCBvYmplY3Rcbi8vIGltcGxlbWVudHMgYE1hcHBhYmxlYC5cbi8vXG4vLyBUaGUgaGlnaC1sZXZlbCB0cmFuc2Zvcm1pbmcgbWV0aG9kcyByZXR1cm4gdGhlIGBUcmFuc2Zvcm1gIG9iamVjdFxuLy8gaXRzZWxmLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNoYWluZWQuXG5cbnZhciBUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICAvLyA6OiAoTm9kZSlcbiAgLy8gQ3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG5cbiAgZnVuY3Rpb24gVHJhbnNmb3JtKGRvYykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFuc2Zvcm0pO1xuXG4gICAgLy8gOjogW1N0ZXBdXG4gICAgLy8gVGhlIGFjY3VtdWxhdGVkIHN0ZXBzLlxuICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAvLyA6OiBbTm9kZV1cbiAgICAvLyBUaGUgaW5kaXZpZHVhbCBkb2N1bWVudCB2ZXJzaW9ucy4gQWx3YXlzIGhhcyBhIGxlbmd0aCBvbmUgbW9yZVxuICAgIC8vIHRoYW4gYHN0ZXBzYCwgc2luY2UgaXQgYWxzbyBpbmNsdWRlcyB0aGUgb3JpZ2luYWwgc3RhcnRpbmdcbiAgICAvLyBkb2N1bWVudC5cbiAgICB0aGlzLmRvY3MgPSBbZG9jXTtcbiAgICAvLyA6OiBbUG9zTWFwXVxuICAgIC8vIFRoZSBwb3NpdGlvbiBtYXBzIHByb2R1Y2VkIGJ5IHRoZSBzdGVwcy4gSGFzIHRoZSBzYW1lIGxlbmd0aCBhc1xuICAgIC8vIGBzdGVwc2AuXG4gICAgdGhpcy5tYXBzID0gW107XG4gIH1cblxuICAvLyA6OiBOb2RlXG4gIC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50LlxuXG4gIF9jcmVhdGVDbGFzcyhUcmFuc2Zvcm0sIFt7XG4gICAga2V5OiBcInN0ZXBcIixcblxuICAgIC8vIDo6IChTdGVwKSDihpIgP1N0ZXBSZXN1bHRcbiAgICAvLyBBZGQgYSBzdGVwIHRvIHRoaXMgdHJhbnNmb3JtYXRpb24uIElmIHRoZSBzdGVwIGNhbiBiZVxuICAgIC8vIFthcHBsaWVkXSgjU3RlcC5hcHBseSkgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIHRoZSByZXN1bHQgb2ZcbiAgICAvLyBhcHBseWluZyBpdCBpcyByZXR1cm5lZCwgYW5kIGFuIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlXG4gICAgLy8gW2BzdGVwc2BdKCNUcmFuc2Zvcm0uc3RlcHMpLCBbYGRvY3NgXSgjVHJhbnNmb3JtLmRvY3MpLCBhbmRcbiAgICAvLyBbYG1hcHNgXSgjVHJhbnNmb3JtLm1hcHMpIGFycmF5cy5cbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RlcChfc3RlcCwgZnJvbSwgdG8sIHBvcywgcGFyYW0pIHtcbiAgICAgIGlmICh0eXBlb2YgX3N0ZXAgPT0gXCJzdHJpbmdcIikgX3N0ZXAgPSBuZXcgX3N0ZXAyLlN0ZXAoX3N0ZXAsIGZyb20sIHRvLCBwb3MsIHBhcmFtKTtcbiAgICAgIHZhciByZXN1bHQgPSBfc3RlcC5hcHBseSh0aGlzLmRvYyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc3RlcHMucHVzaChfc3RlcCk7XG4gICAgICAgIHRoaXMubWFwcy5wdXNoKHJlc3VsdC5tYXApO1xuICAgICAgICB0aGlzLmRvY3MucHVzaChyZXN1bHQuZG9jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gOjogKFBvcywgP251bWJlcikg4oaSIE1hcFJlc3VsdFxuICAgIC8vIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhlIHdob2xlIHRyYW5zZm9ybWF0aW9uIChhbGwgdGhlIHBvc2l0aW9uXG4gICAgLy8gbWFwcyBpbiBbYG1hcHNgXSgjVHJhbnNmb3JtLm1hcHMpKSwgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAocG9zLCBiaWFzKSB7XG4gICAgICB2YXIgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMubWFwc1tpXS5tYXAocG9zLCBiaWFzKTtcbiAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgICAgaWYgKHJlc3VsdC5kZWxldGVkKSBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgX21hcC5NYXBSZXN1bHQocG9zLCBkZWxldGVkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZG9jXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2NzW3RoaXMuZG9jcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICAvLyA6OiBOb2RlXG4gICAgLy8gVGhlIG9yaWdpbmFsIGlucHV0IGRvY3VtZW50LlxuICB9LCB7XG4gICAga2V5OiBcImJlZm9yZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jc1swXTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNmb3JtO1xufSkoKTtcblxuZXhwb3J0cy5UcmFuc2Zvcm0gPSBUcmFuc2Zvcm07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvcHlTdHJ1Y3R1cmUgPSBjb3B5U3RydWN0dXJlO1xuZXhwb3J0cy5jb3B5SW5saW5lID0gY29weUlubGluZTtcbmV4cG9ydHMuaXNGbGF0UmFuZ2UgPSBpc0ZsYXRSYW5nZTtcbmV4cG9ydHMucmVwbGFjZUhhc0VmZmVjdCA9IHJlcGxhY2VIYXNFZmZlY3Q7XG5leHBvcnRzLnNhbWVQYXRoRGVwdGggPSBzYW1lUGF0aERlcHRoO1xuXG52YXIgX21vZGVsID0gcmVxdWlyZShcIi4uL21vZGVsXCIpO1xuXG5mdW5jdGlvbiBjb3B5U3RydWN0dXJlKG5vZGUsIGZyb20sIHRvLCBmKSB7XG4gIHZhciBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gNCB8fCBhcmd1bWVudHNbNF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbNF07XG5cbiAgaWYgKG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICByZXR1cm4gZihub2RlLCBmcm9tID8gZnJvbS5vZmZzZXQgOiAwLCB0byA/IHRvLm9mZnNldCA6IG5vZGUuc2l6ZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFub2RlLnNpemUpIHJldHVybiBub2RlO1xuICAgIHZhciBzdGFydCA9IGZyb20gPyBmcm9tLnBhdGhbZGVwdGhdIDogMDtcbiAgICB2YXIgZW5kID0gdG8gPyB0by5wYXRoW2RlcHRoXSArIDEgOiBub2RlLnNpemU7XG4gICAgdmFyIGNvbnRlbnQgPSBub2RlLmNvbnRlbnQudG9BcnJheSgwLCBzdGFydCk7XG4gICAgZm9yICh2YXIgaXRlciA9IG5vZGUuaXRlcihzdGFydCwgZW5kKSwgY2hpbGQgPSB1bmRlZmluZWQ7IGNoaWxkID0gaXRlci5uZXh0KCkudmFsdWU7KSB7XG4gICAgICB2YXIgcGFzc0Zyb20gPSBpdGVyLm9mZnNldCAtIGNoaWxkLndpZHRoID09IHN0YXJ0ID8gZnJvbSA6IG51bGw7XG4gICAgICB2YXIgcGFzc1RvID0gaXRlci5vZmZzZXQgPT0gZW5kID8gdG8gOiBudWxsO1xuICAgICAgY29udGVudC5wdXNoKGNvcHlTdHJ1Y3R1cmUoY2hpbGQsIHBhc3NGcm9tLCBwYXNzVG8sIGYsIGRlcHRoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5jb3B5KF9tb2RlbC5GcmFnbWVudC5mcm9tQXJyYXkoY29udGVudC5jb25jYXQobm9kZS5jb250ZW50LnRvQXJyYXkoZW5kKSkpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5SW5saW5lKG5vZGUsIGZyb20sIHRvLCBmKSB7XG4gIHJldHVybiBub2RlLnNwbGljZShmcm9tLCB0bywgbm9kZS5jb250ZW50LnNsaWNlKGZyb20sIHRvKS5tYXAoZikpO1xufVxuXG5mdW5jdGlvbiBpc0ZsYXRSYW5nZShmcm9tLCB0bykge1xuICBpZiAoZnJvbS5wYXRoLmxlbmd0aCAhPSB0by5wYXRoLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZyb20ucGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tLnBhdGhbaV0gIT0gdG8ucGF0aFtpXSkgcmV0dXJuIGZhbHNlO1xuICB9cmV0dXJuIGZyb20ub2Zmc2V0IDw9IHRvLm9mZnNldDtcbn1cblxuZnVuY3Rpb24gY2FuQmVKb2luZWQobm9kZSwgb2Zmc2V0LCBkZXB0aCkge1xuICBpZiAoIWRlcHRoIHx8IG9mZnNldCA9PSAwIHx8IG9mZnNldCA9PSBub2RlLnNpemUpIHJldHVybiBmYWxzZTtcbiAgdmFyIGxlZnQgPSBub2RlLmNoaWxkKG9mZnNldCAtIDEpLFxuICAgICAgcmlnaHQgPSBub2RlLmNoaWxkKG9mZnNldCk7XG4gIHJldHVybiBsZWZ0LnNhbWVNYXJrdXAocmlnaHQpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzRWZmZWN0KGRvYywgZnJvbSwgdG8pIHtcbiAgZm9yICh2YXIgZGVwdGggPSAwLCBub2RlID0gZG9jOzsgZGVwdGgrKykge1xuICAgIHZhciBmcm9tRW5kID0gZGVwdGggPT0gZnJvbS5kZXB0aCxcbiAgICAgICAgdG9FbmQgPSBkZXB0aCA9PSB0by5kZXB0aDtcbiAgICBpZiAoZnJvbUVuZCB8fCB0b0VuZCB8fCBmcm9tLnBhdGhbZGVwdGhdICE9IHRvLnBhdGhbZGVwdGhdKSB7XG4gICAgICB2YXIgZ2FwU3RhcnQgPSB1bmRlZmluZWQsXG4gICAgICAgICAgZ2FwRW5kID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGZyb21FbmQpIHtcbiAgICAgICAgZ2FwU3RhcnQgPSBmcm9tLm9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdhcFN0YXJ0ID0gZnJvbS5wYXRoW2RlcHRoXSArIDE7XG4gICAgICAgIGZvciAodmFyIGkgPSBkZXB0aCArIDEsIG4gPSBub2RlLmNoaWxkKGdhcFN0YXJ0IC0gMSk7IGkgPD0gZnJvbS5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGkgPT0gZnJvbS5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGZyb20ub2Zmc2V0IDwgbi5zaXplKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZyb20ucGF0aFtpXSArIDEgPCBuLnNpemUpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbiA9IG4uY2hpbGQoZnJvbS5wYXRoW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b0VuZCkge1xuICAgICAgICBnYXBFbmQgPSB0by5vZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnYXBFbmQgPSB0by5wYXRoW2RlcHRoXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IGRlcHRoICsgMTsgaSA8PSB0by5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKChpID09IHRvLnBhdGgubGVuZ3RoID8gdG8ub2Zmc2V0IDogdG8ucGF0aFtpXSkgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdhcFN0YXJ0ICE9IGdhcEVuZCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gY2FuQmVKb2luZWQobm9kZSwgZ2FwU3RhcnQsIE1hdGgubWluKGZyb20uZGVwdGgsIHRvLmRlcHRoKSAtIGRlcHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQoZnJvbS5wYXRoW2RlcHRoXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhbWVQYXRoRGVwdGgoYSwgYikge1xuICBmb3IgKHZhciBpID0gMDs7IGkrKykge1xuICAgIGlmIChpID09IGEucGF0aC5sZW5ndGggfHwgaSA9PSBiLnBhdGgubGVuZ3RoIHx8IGEucGF0aFtpXSAhPSBiLnBhdGhbaV0pIHJldHVybiBpO1xuICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgUHJvc2VNaXJyb3JFcnJvciA9IChmdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0cyhQcm9zZU1pcnJvckVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIFByb3NlTWlycm9yRXJyb3IobWVzc2FnZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQcm9zZU1pcnJvckVycm9yKTtcblxuICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFByb3NlTWlycm9yRXJyb3IucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICAgIGlmICh0aGlzLm1lc3NhZ2UgIT0gbWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5uYW1lKTtlbHNlIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IobWVzc2FnZSkuc3RhY2s7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFByb3NlTWlycm9yRXJyb3IsIFt7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgfHwgZnVuY3Rpb25OYW1lKHRoaXMuY29uc3RydWN0b3IpIHx8IFwiUHJvc2VNaXJyb3JFcnJvclwiO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcInJhaXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJhaXNlKG1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyB0aGlzKG1lc3NhZ2UpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQcm9zZU1pcnJvckVycm9yO1xufSkoRXJyb3IpO1xuXG5leHBvcnRzLlByb3NlTWlycm9yRXJyb3IgPSBQcm9zZU1pcnJvckVycm9yO1xuXG5mdW5jdGlvbiBmdW5jdGlvbk5hbWUoZikge1xuICB2YXIgbWF0Y2ggPSAvXmZ1bmN0aW9uIChcXHcrKS8uZXhlYyhmLnRvU3RyaW5nKCkpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59IiwiLy8gOzsgI3BhdGg9RXZlbnRNaXhpbiAja2luZD1pbnRlcmZhY2Vcbi8vIEEgc2V0IG9mIG1ldGhvZHMgZm9yIG9iamVjdHMgdGhhdCBlbWl0IGV2ZW50cy4gQWRkZWQgYnkgY2FsbGluZ1xuLy8gYGV2ZW50TWl4aW5gIG9uIGEgY29uc3RydWN0b3IuXG5cblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5ldmVudE1peGluID0gZXZlbnRNaXhpbjtcbnZhciBtZXRob2RzID0ge1xuICAvLyA6OiAodHlwZTogc3RyaW5nLCBoYW5kbGVyOiAoLi4uYXJnczogW2FueV0pKSAjcGF0aD1FdmVudE1peGluLm9uXG4gIC8vIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBldmVudCB0eXBlLlxuICBvbjogZnVuY3Rpb24gb24odHlwZSwgZikge1xuICAgIHZhciBtYXAgPSB0aGlzLl9oYW5kbGVycyB8fCAodGhpcy5faGFuZGxlcnMgPSB7fSk7XG4gICAgdmFyIGFyciA9IG1hcFt0eXBlXSB8fCAobWFwW3R5cGVdID0gW10pO1xuICAgIGFyci5wdXNoKGYpO1xuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiBbYW55XSkpICNwYXRoPUV2ZW50TWl4aW4ub2ZmXG4gIC8vIFVucmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUuXG4gIG9mZjogZnVuY3Rpb24gb2ZmKHR5cGUsIGYpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5faGFuZGxlcnMgJiYgdGhpcy5faGFuZGxlcnNbdHlwZV07XG4gICAgaWYgKGFycikgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChhcnJbaV0gPT0gZikge1xuICAgICAgICBhcnIuc3BsaWNlKGksIDEpO2JyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyA6OiAodHlwZTogc3RyaW5nLCAuLi5hcmdzOiBbYW55XSkgI3BhdGg9RXZlbnRNaXhpbi5zaWduYWxcbiAgLy8gU2lnbmFsIGFuIGV2ZW50IG9mIHRoZSBnaXZlbiB0eXBlLCBwYXNzaW5nIGFueSBudW1iZXIgb2ZcbiAgLy8gYXJndW1lbnRzLiBXaWxsIGNhbGwgdGhlIGhhbmRsZXJzIGZvciB0aGUgZXZlbnQsIHBhc3NpbmcgdGhlbSB0aGVcbiAgLy8gYXJndW1lbnRzLlxuICBzaWduYWw6IGZ1bmN0aW9uIHNpZ25hbCh0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbHVlcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHZhbHVlc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGFycikgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGFycltpXS5hcHBseShhcnIsIHZhbHVlcyk7XG4gICAgfVxuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcsIC4uLmFyZ3M6IFthbnldKSAjcGF0aD1FdmVudE1peGluLnNpZ25hbEhhbmRsZWFibGVcbiAgLy8gU2lnbmFsIGEgaGFuZGxlYWJsZSBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZS4gQWxsIGhhbmRsZXJzIGZvciB0aGVcbiAgLy8gZXZlbnQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCB1bnRpbCBvbmUgb2YgdGhlbVxuICAvLyByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIG5vdCB0aGUgdmFsdWUgYGZhbHNlYC4gV2hlbiB0aGF0XG4gIC8vIGhhcHBlbnMsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhhdCBoYW5kbGVyIGlzIHJldHVybmVkLiBJZiB0aGF0XG4gIC8vIGRvZXMgbm90IGhhcHBlbiwgYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAgc2lnbmFsSGFuZGxlYWJsZTogZnVuY3Rpb24gc2lnbmFsSGFuZGxlYWJsZSh0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICB2YWx1ZXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBhcnJbaV0uYXBwbHkoYXJyLCB2YWx1ZXMpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9cmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8vIDo6ICh0eXBlOiBzdHJpbmcpIOKGkiBib29sICNwYXRoPUV2ZW50TWl4aW4uaGFzSGFuZGxlclxuICAvLyBRdWVyeSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZS5cbiAgaGFzSGFuZGxlcjogZnVuY3Rpb24gaGFzSGFuZGxlcih0eXBlKSB7XG4gICAgdmFyIGFyciA9IHRoaXMuX2hhbmRsZXJzICYmIHRoaXMuX2hhbmRsZXJzW3R5cGVdO1xuICAgIHJldHVybiBhcnIgJiYgYXJyLmxlbmd0aCA+IDA7XG4gIH1cbn07XG5cbi8vIDo6ICgoKSlcbi8vIEFkZCB0aGUgbWV0aG9kcyBpbiB0aGUgYEV2ZW50TWl4aW5gIGludGVyZmFjZSB0byB0aGUgcHJvdG90eXBlXG4vLyBvYmplY3Qgb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLlxuXG5mdW5jdGlvbiBldmVudE1peGluKGN0b3IpIHtcbiAgdmFyIHByb3RvID0gY3Rvci5wcm90b3R5cGU7XG4gIGZvciAodmFyIHByb3AgaW4gbWV0aG9kcykgaWYgKG1ldGhvZHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHByb3RvW3Byb3BdID0gbWV0aG9kc1twcm9wXTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTWFwID0gd2luZG93Lk1hcCB8fCAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfY2xhc3MoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIF9jbGFzcyk7XG5cbiAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhfY2xhc3MsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgICBpZiAoZm91bmQgPiAtMSkgdGhpcy5jb250ZW50W2ZvdW5kICsgMV0gPSB2YWx1ZTtlbHNlIHRoaXMuY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgICByZXR1cm4gZm91bmQgPT0gLTEgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnRbZm91bmQgKyAxXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoa2V5KSA+IC0xO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoa2V5KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50W2ldID09PSBrZXkpIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuY29udGVudC5sZW5ndGggPSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCAvIDI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIF9jbGFzcztcbn0pKCk7XG5leHBvcnRzLk1hcCA9IE1hcDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc29ydGVkSW5zZXJ0O1xuXG5mdW5jdGlvbiBzb3J0ZWRJbnNlcnQoYXJyYXksIGVsdCwgY29tcGFyZSkge1xuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIGlmIChjb21wYXJlKGFycmF5W2ldLCBlbHQpID4gMCkgYnJlYWs7XG4gIGFycmF5LnNwbGljZShpLCAwLCBlbHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsImltcG9ydCB7UHJvc2VNaXJyb3J9IGZyb20gXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9lZGl0XCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQgXCIuLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tZW51L3Rvb2x0aXBtZW51XCJcclxuaW1wb3J0IFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51YmFyXCJcclxuaW1wb3J0IFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvaW5wdXRydWxlcy9hdXRvaW5wdXRcIlxyXG4gICBcclxuaW1wb3J0IHtEb2MsIFRleHRibG9jaywgQmxvY2tRdW90ZSwgT3JkZXJlZExpc3QsIEJ1bGxldExpc3QsIExpc3RJdGVtLCBIb3Jpem9udGFsUnVsZSxcclxuXHRQYXJhZ3JhcGgsIEhlYWRpbmcsIFRleHQsIEhhcmRCcmVhayxcclxuXHRFbU1hcmssIFN0cm9uZ01hcmssIExpbmtNYXJrLCBDb2RlTWFyaywgU2NoZW1hLCBTY2hlbWFTcGVjfSBmcm9tIFwiLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5cclxuaW1wb3J0IHtJbnB1dCwgVGV4dEZpZWxkLCBUZXh0QXJlYSwgQ2hlY2tCb3gsIFJhZGlvQnV0dG9uLCBTZWxlY3QsIFxyXG5cdElGcmFtZSwgSW5saW5lTWF0aCwgQmxvY2tNYXRoLCBJbWFnZSwgU3ByZWFkU2hlZXQsQ2FycnlGb3J3YXJkLFxyXG5cdENob2ljZSwgTXVsdGlwbGVDaG9pY2UsIFNjYWxlLCBDaGVja0l0ZW0sIENoZWNrTGlzdCwgV2lkZ2V0fSBmcm9tIFwiLi93aWRnZXRzXCJcclxuXHJcblxyXG5jb25zdCB3aWRnZXRzU3BlYyA9IG5ldyBTY2hlbWFTcGVjKHtcclxuXHRkb2M6IERvYyxcclxuXHRibG9ja3F1b3RlOiBCbG9ja1F1b3RlLFxyXG5cdG9yZGVyZWRfbGlzdDogT3JkZXJlZExpc3QsXHJcblx0YnVsbGV0X2xpc3Q6IEJ1bGxldExpc3QsXHJcblx0bGlzdF9pdGVtOiBMaXN0SXRlbSxcclxuXHRob3Jpem9udGFsX3J1bGU6IEhvcml6b250YWxSdWxlLFxyXG5cclxuXHRwYXJhZ3JhcGg6IFBhcmFncmFwaCxcclxuXHRoZWFkaW5nOiBIZWFkaW5nLFxyXG5cclxuXHR0ZXh0OiBUZXh0LFxyXG5cdGltYWdlOiBJbWFnZSxcclxuXHRoYXJkX2JyZWFrOiBIYXJkQnJlYWssXHJcblx0XHJcblx0aW5wdXQ6IElucHV0LFxyXG5cdHRleHRmaWVsZDogVGV4dEZpZWxkLFxyXG5cdHRleHRhcmVhOiBUZXh0QXJlYSxcclxuXHRjaGVja2JveDogQ2hlY2tCb3gsXHJcblx0cmFkaW9idXR0b246IFJhZGlvQnV0dG9uLFxyXG5cdHNlbGVjdDogU2VsZWN0LFxyXG5cdGlubGluZW1hdGg6IElubGluZU1hdGgsXHJcblx0YmxvY2ttYXRoOiBCbG9ja01hdGgsXHJcblx0aWZyYW1lOiBJRnJhbWUsXHJcblx0Y2Fycnlmb3J3YXJkOiBDYXJyeUZvcndhcmQsXHJcblx0Y2hvaWNlOiBDaG9pY2UsXHJcblx0bXVsdGlwbGVjaG9pY2U6IE11bHRpcGxlQ2hvaWNlLFxyXG5cdHNjYWxlOiBTY2FsZSxcclxuXHRjaGVja2l0ZW06IENoZWNrSXRlbSxcclxuXHRjaGVja2xpc3Q6IENoZWNrTGlzdCxcclxuXHRzcHJlYWRzaGVldDogU3ByZWFkU2hlZXQsXHJcblx0d2lkZ2V0OiBXaWRnZXRcclxufSwge1xyXG5cdGVtOiBFbU1hcmssXHJcblx0c3Ryb25nOiBTdHJvbmdNYXJrLFxyXG5cdGxpbms6IExpbmtNYXJrLFxyXG5cdGNvZGU6IENvZGVNYXJrXHJcbn0pXHJcblxyXG5jb25zdCB3aWRnZXRTY2hlbWEgPSBuZXcgU2NoZW1hKHdpZGdldHNTcGVjKVxyXG5cclxubGV0IHBtID0gd2luZG93LnBtID0gbmV3IFByb3NlTWlycm9yKHtcclxuICBwbGFjZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlZGl0b3JcIiksXHJcbiAgbWVudUJhcjogdHJ1ZSxcclxuICBkb2M6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29udGVudFwiKS5pbm5lckhUTUwsXHJcbiAgZG9jRm9ybWF0OiBcImh0bWxcIixcclxuICBzY2hlbWE6IHdpZGdldFNjaGVtYSxcclxuICBhdXRvSW5wdXQ6IHRydWVcclxufSlcclxuXHJcbmluc2VydENTUyhgXHJcblx0XHRcclxuZGl2LlByb3NlTWlycm9yLXNlbGVjdC1tZW51IHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgYmFja2dyb3VuZDogI0VFRTtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgcGFkZGluZzogMnB4IDJweDtcclxuICB6LWluZGV4OiAxNTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLXNlbGVjdC1tZW51IGRpdiB7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHBhZGRpbmc6IDAgMWVtIDAgMnB4O1xyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3Itc2VsZWN0LW1lbnUgZGl2OmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxufVxyXG5cclxuZGl2LlByb3NlTWlycm9yLW1lbnUgZm9ybSB7XHJcblx0YmFja2dyb3VuZDogI0VFRTtcclxuXHR3aWR0aDogMzAwcHg7XHJcblx0Ym9yZGVyOiAxcHggc29saWQgI0FBQVxyXG59XHJcblxyXG5kaXYuUHJvc2VNaXJyb3ItbWVudSBmb3JtIHNlbGVjdCB7XHJcblx0YmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcbmRpdi5Qcm9zZU1pcnJvci1tZW51YmFyLXNsaWRpbmcge1xyXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICAtbW96LXRyYW5zaXRpb246IHJpZ2h0IDAuMnMgZWFzZS1vdXQ7XHJcbiAgdHJhbnNpdGlvbjogcmlnaHQgMC4ycyBlYXNlLW91dDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgbGVmdDogMTAwJTtcclxuICB3aWR0aDogMTAwJTtcclxuICBib3gtc2l6aW5nOiAtbW96LWJvcmRlci1ib3g7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcblxyXG5gKVxyXG5cclxuIiwiaW1wb3J0IHtyZWFkUGFyYW1zfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7c2VsZWN0YWJsZU5vZGVBYm92ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2VkaXQvc2VsZWN0aW9uXCJcclxuXHJcbmV4cG9ydCBjb25zdCBhbmRTY3JvbGwgPSB7c2Nyb2xsSW50b1ZpZXc6IHRydWV9XHJcblxyXG5NYXRoSmF4Lkh1Yi5RdWV1ZShmdW5jdGlvbiAoKSB7XHJcbiAgICBNYXRoSmF4Lkh1Yi5Db25maWcoe1xyXG4gICAgXHR0ZXgyamF4OiB7XHJcbiAgICAgICAgXHRkaXNwbGF5TWF0aDogWyBbXCJcXFxcW1wiLFwiXFxcXF1cIl0gXSwgXHJcbiAgICAgICAgXHRpbmxpbmVNYXRoOiBbIFtcIlxcXFwoXCIsXCJcXFxcKVwiXSBdLFxyXG4gICAgICAgIFx0cHJvY2Vzc0VzY2FwZXM6IHRydWVcclxuICAgIFx0fSxcclxuICAgIFx0ZGlzcGxheUFsaWduOlwibGVmdFwiXHJcblx0fSlcclxufSlcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZQYXJzZXIodHlwZSx0YWcsY2xzKSB7XHJcblx0dHlwZS5yZWdpc3RlcihcInBhcnNlRE9NXCIsIHtcclxuXHRcdHRhZzogdGFnLFxyXG5cdFx0cmFuazogMjUsXHJcblx0XHRwYXJzZTogKGRvbSwgY29udGV4dCwgdHlwZSwgYXR0cnMpID0+IHtcclxuXHRcdFx0bGV0IGNvbnRhaW5zID0gZG9tLmNsYXNzTGlzdC5jb250YWlucyhjbHMpXHJcblx0XHRcdGlmICghY29udGFpbnMpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRjb250ZXh0Lmluc2VydEZyb20oZG9tLCB0eXBlLCBhdHRycylcclxuXHRcdH1cclxuXHR9KVx0XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHBtLCBlKSB7XHJcblx0ICBsZXQgcG9zID0gc2VsZWN0YWJsZU5vZGVBYm92ZShwbSwgZS50YXJnZXQsIHtsZWZ0OiBlLmNsaWVudFgsIHRvcDogZS5jbGllbnRZfSwgdHJ1ZSlcclxuXHQgIGlmICghcG9zKSByZXR1cm4gcG0uc2VsLnBvbGxGb3JVcGRhdGUoKVxyXG5cclxuXHQgIGxldCB7bm9kZSwgZnJvbX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgIGlmIChub2RlICYmIHBvcy5kZXB0aCA+PSBmcm9tLmRlcHRoICYmIHBvcy5zaG9ydGVuKGZyb20uZGVwdGgpLmNtcChmcm9tKSA9PSAwKSB7XHJcblx0ICAgIGlmIChmcm9tLmRlcHRoID09IDApIHJldHVybiBwbS5zZWwucG9sbEZvclVwZGF0ZSgpXHJcblx0ICAgIHBvcyA9IGZyb20uc2hvcnRlbigpXHJcblx0ICB9XHJcblxyXG5cdCAgcG0uc2V0Tm9kZVNlbGVjdGlvbihwb3MpXHJcblx0ICBwbS5mb2N1cygpXHJcblx0ICBlLnByZXZlbnREZWZhdWx0KClcclxuXHR9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmUGFyYW1zQ2xpY2sodHlwZSkge1xyXG5cdHR5cGUucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gKHBtLCBlLCBwYXRoLCBub2RlKSA9PiB7XHJcblx0XHRsZXQgbWVudSA9IHBtLm1vZC5tZW51QmFyLm1lbnVcclxuXHRcdGxldCBjbWQgPSBwbS5jb21tYW5kc1tcImluc2VydFwiK3R5cGUubmFtZV1cclxuXHRcdGlmIChtZW51ICYmIGNtZCkge1xyXG5cdFx0XHRzZWxlY3RDbGlja2VkTm9kZShwbSxlKVxyXG5cdFx0XHRtZW51LmVudGVyKHJlYWRQYXJhbXMoY21kKSlcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9IGVsc2VcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG4gXHJcbmV4cG9ydCBjbGFzcyBCbG9ja01hdGggZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuQmxvY2tNYXRoLmF0dHJpYnV0ZXMgPSB7XHJcblx0dGV4OiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKEJsb2NrTWF0aCxcImRpdlwiLFwid2lkZ2V0cy1ibG9ja21hdGhcIilcclxuXHJcbkJsb2NrTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwiZGl2XCIsIHtjbGFzczogXCJ3aWRnZXRzLWJsb2NrbWF0aFwifSwgXCJcXFxcW1wiK25vZGUuYXR0cnMudGV4K1wiXFxcXF1cIik7XHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkOyBcclxufVxyXG5cclxuQmxvY2tNYXRoLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRCbG9ja01hdGhcIixcclxuXHRsYWJlbDogXCJCbG9ja01hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCJ9XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuICAgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgICBpZiAobm9kZSlcclxuICAgICAgICByZXR1cm4gW25vZGUuYXR0cnMudGV4XVxyXG4gICAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soQmxvY2tNYXRoKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWJsb2NrbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG4gXHJcbmxldCBjYXJyeU9wdGlvbnMgPSBbXVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2FycnlPcHRpb25zKG5hbWVzKSB7XHJcblx0cmV0dXJuIG5hbWVzLm1hcCh3ID0+ICh7dmFsdWU6IHcsIGxhYmVsOiB3fSkpXHJcbn1cclxuIFxyXG5leHBvcnQgY2xhc3MgQ2FycnlGb3J3YXJkIGV4dGVuZHMgSW5saW5lIHt9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbkNhcnJ5Rm9yd2FyZC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKVxyXG59XHJcblxyXG5kZWZQYXJzZXIoQ2FycnlGb3J3YXJkLFwidGhpbmtzcGFjZVwiLFwid2lkZ2V0cy1jYXJyeWZvcndhcmRcIilcclxuXHJcbkNhcnJ5Rm9yd2FyZC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0cmV0dXJuIGVsdChcInRoaW5rc3BhY2VcIix7Y2xhc3M6IFwid2lkZ2V0cy1jYXJyeWZvcndhcmRcIiwgbmFtZTogbm9kZS5hdHRycy5uYW1lfSxcclxuXHRcdGVsdChcImltZ1wiLHtzcmM6IFwiZm9yd2FyZC5wbmdcIiwgd2lkdGg6MTYsIGhlaWdodDoxNiwgdGl0bGU6XCJDYXJyeSBmb3J3YXJkIFwiK25vZGUuYXR0cnMubmFtZX0pXHJcblx0KVxyXG59XHJcblxyXG5DYXJyeUZvcndhcmQucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydENhcnJ5Rm9yd2FyZFwiLFxyXG5cdGxhYmVsOiBcIkNhcnJ5Rm9yd2FyZFwiLFxyXG5cdHJ1bihwbSwgbmFtZSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJJbnB1dCBuYW1lXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IGNhcnJ5T3B0aW9ucyB9XHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuICBcdFx0cG0uY29tbWFuZHMuaW5zZXJ0Q2FycnlGb3J3YXJkLnNwZWMucGFyYW1zWzBdLm9wdGlvbnMgPSBnZXRDYXJyeU9wdGlvbnMoW1widGVzdDFcIixcInRlc3QyXCJdKVxyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKSB7XHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWVdXHJcblx0ICAgIH1cclxuXHQgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soQ2FycnlGb3J3YXJkKVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNhcnJ5Zm9yd2FyZCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0F0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge0lucHV0fSBmcm9tIFwiLi9pbnB1dFwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIENoZWNrQm94IGV4dGVuZHMgSW5wdXQge31cclxuXHJcbkNoZWNrQm94LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiY2hlY2tib3hcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiAxfSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1jaGVja2JveFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrQm94LFwiaW5wdXRcIixcIndpZGdldHMtY2hlY2tib3hcIilcclxuXHJcbi8vIENoZWNrYm94IGluaGVyaXRzIHNlcmlhbGl6ZXIgZnJvbSBpbnB1dFxyXG5cclxuXHJcbkNoZWNrQm94LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRDaGVja0JveFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrQm94XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBsYWJlbCwgbG9jKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lLCBsYWJlbCwgbG9jfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGFiZWwsIG5vZGUuYXR0cnMubG9jXVxyXG5cdH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKENoZWNrQm94KVxyXG5cclxuaW5zZXJ0Q1NTKGBcclxuXHJcbi53aWRnZXRzLWNoZWNrYm94IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LCBpbnNlcnRDU1N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9kb21cIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGVja0l0ZW0gZXh0ZW5kcyBQYXJhZ3JhcGgge1xyXG5cdHN0YXRpYyBnZXQga2luZCgpIHsgcmV0dXJuIFwiLlwiIH1cclxuXHJcblx0Y3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xyXG5cdFx0aWYgKGF0dHJzLnZhbHVlID4gMCkgY29udGVudCA9IFt0aGlzLnNjaGVtYS5ub2RlKFwiY2hlY2tib3hcIixhdHRycyldXHJcblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcylcclxuXHR9XHJcbn1cclxuXHJcbkNoZWNrSXRlbS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpXHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQ2hlY2tMaXN0IGV4dGVuZHMgQmxvY2sge1xyXG5cdHN0YXRpYyBnZXQgY29udGFpbnMoKSB7IHJldHVybiBcImNoZWNraXRlbVwiIH1cclxufVxyXG5cclxuQ2hlY2tMaXN0LmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdGxheW91dDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJ2ZXJ0aWNhbFwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKENoZWNrSXRlbSxcImRpdlwiLFwid2lkZ2V0cy1jaGVja2l0ZW1cIilcclxuZGVmUGFyc2VyKENoZWNrTGlzdCxcImRpdlwiLFwid2lkZ2V0cy1jaGVja2xpc3RcIilcclxuXHJcbkNoZWNrSXRlbS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwicFwiLCB7XHJcblx0bmFtZTogbm9kZS5hdHRycy5uYW1lK1wiLVwiK25vZGUuYXR0cnMudmFsdWUsIFxyXG5cdHZhbHVlOiBub2RlLmF0dHJzLnZhbHVlLFxyXG5cdGNsYXNzOiBcIndpZGdldHMtY2hlY2tpdGVtXCJcclxufSlcclxuXHJcbkNoZWNrTGlzdC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiZGl2XCIse1xyXG5cdG5hbWU6IG5vZGUuYXR0cnMubmFtZSxcclxuXHRsYXlvdXQ6IG5vZGUuYXR0cnMubGF5b3V0LFxyXG5cdGNsYXNzOiBcIndpZGdldHMtY2hlY2tsaXN0XCJcclxufSlcclxuXHJcbkNoZWNrSXRlbS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdCAgbmFtZTogXCJzcGxpdENoZWNraXRlbVwiLFxyXG5cdCAgbGFiZWw6IFwiU3BsaXQgdGhlIGN1cnJlbnQgY2hlY2tpdGVtXCIsXHJcblx0ICBydW4ocG0pIHtcclxuXHQgICAgbGV0IHtub2RlLCBmcm9tLCB0b30gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIVBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2VcclxuXHQgICAgbGV0IHRvUGFyZW50ID0gZnJvbS5zaG9ydGVuKCksIGdyYW5kUGFyZW50ID0gcG0uZG9jLnBhdGgodG9QYXJlbnQucGF0aClcclxuXHQgICAgY29uc29sZS5sb2coZ3JhbmRQYXJlbnQudHlwZS5uYW1lKVxyXG5cdCAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZS5uYW1lICE9IFwiY2hlY2tsaXN0XCIpIHJldHVybiBmYWxzZVxyXG5cdCAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLCB7bmFtZTogZ3JhbmRQYXJlbnQuYXR0cnMubmFtZSwgdmFsdWU6IGdyYW5kUGFyZW50LnNpemV9KS5hcHBseShhbmRTY3JvbGwpXHJcblx0ICB9LFxyXG5cdCAga2V5OiBcIkVudGVyKDUwKVwiXHJcblx0fSlcclxuXHJcblxyXG5DaGVja0xpc3QucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuXHRuYW1lOiBcImluc2VydENoZWNrTGlzdFwiLFxyXG5cdGxhYmVsOiBcIkNoZWNrTGlzdFwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgbGF5b3V0KSB7XHJcblx0XHRsZXQgY2hraXRlbSA9IHBtLnNjaGVtYS5ub2Rlcy5jaGVja2l0ZW0uY3JlYXRlKHtuYW1lOm5hbWUsIHZhbHVlOiAwfSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuXHRcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtuYW1lOm5hbWUrXCItMFwiLCBsYXlvdXQ6bGF5b3V0fSxjaGtpdGVtKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxheW91dCAodmVydGljYWwsIGhvcml6b250YWwpXCIsIHR5cGU6IFwic2VsZWN0XCIsIG9wdGlvbnM6IFtcclxuICAgICBcdCAgICB7dmFsdWU6IFwiaG9yaXpvbnRhbFwiLCBsYWJlbDogXCJob3Jpem9udGFsXCJ9LFxyXG4gICAgIFx0ICAgIHt2YWx1ZTogXCJ2ZXJ0aWNhbFwiLCBsYWJlbDogXCJ2ZXJ0aWNhbFwifVxyXG4gICAgIFx0ICBdfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMubGF5b3V0XVxyXG5cdCB9XHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuICBuYW1lOiBcInNwbGl0Q2hlY2tJdGVtXCIsXHJcbiAgbGFiZWw6IFwiU3BsaXQgdGhlIGN1cnJlbnQgY2hlY2tpdGVtXCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge25vZGUsIGZyb20sIHRvfSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgZnJvbS5wYXRoLmxlbmd0aCA8IDIgfHwgIVBvcy5zYW1lUGF0aChmcm9tLnBhdGgsIHRvLnBhdGgpKSByZXR1cm4gZmFsc2VcclxuICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcbiAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hlY2tpdGVtLCB7XHJcbiAgICBcdG5hbWU6IGdyYW5kUGFyZW50LmF0dHJzLm5hbWUrXCItXCIrZ3JhbmRQYXJlbnQuc2l6ZSwgXHJcbiAgICBcdHZhbHVlOiBncmFuZFBhcmVudC5zaXplfSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIH0sXHJcbiAga2V5OiBcIkVudGVyKDUwKVwiXHJcbn0pXHJcblxyXG5DaGVja0l0ZW0ucmVnaXN0ZXIoXCJjb21tYW5kXCIsIHtcclxuICBuYW1lOiBcImRlbGV0ZUNoZWNrSXRlbVwiLFxyXG4gIGxhYmVsOiBcImRlbGV0ZSB0aGlzIGNoZWNraXRlbSBvciBjaGVja2xpc3RcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7aGVhZCwgZW1wdHl9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoIWVtcHR5IHx8IGhlYWQub2Zmc2V0ID4gMSkgcmV0dXJuIGZhbHNlXHJcbiAgICAvLyBGaW5kIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9uZVxyXG4gICAgbGV0IGJlZm9yZSwgY3V0XHJcbiAgICBmb3IgKGxldCBpID0gaGVhZC5wYXRoLmxlbmd0aCAtIDE7ICFiZWZvcmUgJiYgaSA+PSAwOyBpLS0pIGlmIChoZWFkLnBhdGhbaV0gPiAwKSB7XHJcbiAgICAgIGN1dCA9IGhlYWQuc2hvcnRlbihpKVxyXG4gICAgICBiZWZvcmUgPSBwbS5kb2MucGF0aChjdXQucGF0aCkuY2hpbGQoY3V0Lm9mZnNldCAtIDEpXHJcbiAgICB9XHJcblx0bGV0IG1jID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQpXHJcbiAgICAvLyBpZiB0b3AgY2hvaWNlLCBkZWxldGUgd2hvbGUgcXVlc3Rpb24gaWYgb25seSBvbmUgY2hvaWNlXHJcbiAgICBpZiAobWMudHlwZS5uYW1lID09IFwiY2hlY2tpdGVtXCIpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsIGN1dC5tb3ZlKDEpKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgXHQvLyBkb24ndCBkZWxldGUgcXVlc3Rpb24gaWYgbW9yZSB0aGFuIG9uZSBjaG9pY2VcclxuICAgIFx0aWYgKG1jLnNpemUgPT0gMSkge1xyXG4gICAgIFx0XHRyZXR1cm4gcG0udHIuZGVsZXRlKGN1dCxjdXQubW92ZSgxKSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gICAgXHR9IGVsc2VcclxuICAgIFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSxcclxuICBrZXk6IFtcIkJhY2tzcGFjZSg1MClcIiwgXCJNb2QtQmFja3NwYWNlKDUwKVwiXVxyXG59KVxyXG5cclxuXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtY2hlY2tpdGVtIHt9XHJcbi53aWRnZXRzLWNoZWNrbGlzdCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0Jsb2NrLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgSUZyYW1lIGV4dGVuZHMgQmxvY2sge31cclxuXHJcbklGcmFtZS5hdHRyaWJ1dGVzID0ge1xyXG5cdHNyYzogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDpcIlwifSksXHJcblx0d2lkdGg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IDIwMH0pLFxyXG5cdGhlaWdodDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogMjAwfSlcclxufVxyXG5cclxuZGVmUGFyc2VyKElGcmFtZSwgXCJpZnJhbWVcIiwgXCJ3aWRnZXRzLWlmcmFtZVwiKVxyXG5cclxuSUZyYW1lLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSwgcykgPT4gcy5yZW5kZXJBcyhub2RlLCBcImlmcmFtZVwiLHsgXHJcblx0c3JjOiBub2RlLmF0dHJzLnNyYyxcclxuXHR3aWR0aDogbm9kZS5hdHRycy53aWR0aCxcclxuXHRoZWlnaHQ6IG5vZGUuYXR0cnMuaGVpZ2h0LFxyXG5cdGNvbnRlbnQ6IFwidGV4dC9odG1sO2NoYXJzZXQ9VVRGLThcIixcclxuXHRjbGFzczogXCJpZnJhbWVcIixcclxuXHRmcmFtZWJvcmRlcjogXCIxXCIsXHJcblx0YWxsb3dmdWxsc2NyZWVuOiBcIjFcIlxyXG59KVxyXG5cclxuSUZyYW1lLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRJRnJhbWVcIixcclxuXHRsYWJlbDogXCJzaG93IHdlYnNpdGVzLCB5b3VUdWJlLCBHb29nbGVNYXBzLC4uLlwiLFxyXG5cdHJ1bihwbSwgc3JjLCB3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5yZXBsYWNlU2VsZWN0aW9uKHRoaXMuY3JlYXRlKHtzcmMsIHdpZHRoLCBoZWlnaHR9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTGluayAod2Vic2l0ZSwgeW91VHViZSwgR29vZ2xlIE1hcHMgLi4uKVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIldpZHRoIGluIHBpeGVsc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogMjAwIH0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIkhlaWdodCBpbiBwaXhlbHNcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDIwMCB9LFxyXG5cdF0sXHJcbiAgXHRwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy53aWR0aCwgbm9kZS5hdHRycy5oZWlnaHRdXHJcbiAgICB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhJRnJhbWUpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaWZyYW1lIHt9XHJcblxyXG5gKSIsImltcG9ydCB7SW5saW5lLCBBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0LGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlIGV4dGVuZHMgSW5saW5lIHt9XHJcbkltYWdlLmF0dHJpYnV0ZXMgPSB7XHJcbiAgc3JjOiBuZXcgQXR0cmlidXRlLFxyXG4gIGFsdDogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCJcIn0pLFxyXG4gIHRpdGxlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSksXHJcbiAgY2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy1pbWdcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbWFnZSwgXCJpbWdcIiwgXCJ3aWRnZXRzLWltZ1wiKVxyXG5cclxuSW1hZ2UucHJvdG90eXBlLnNlcmlhbGl6ZURPTSA9IChub2RlLCBzKSA9PiBzLnJlbmRlckFzKG5vZGUsIFwiaW1nXCIsIG5vZGUuYXR0cnMpXHJcblxyXG5JbWFnZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiaW5zZXJ0SW1hZ2VcIixcclxuICBsYWJlbDogXCJJbnNlcnQgaW1hZ2VcIixcclxuICBydW4ocG0sIHNyYywgYWx0LCB0aXRsZSkge1xyXG4gICAgcmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe3NyYywgdGl0bGUsIGFsdH0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBwYXJhbXM6IFtcclxuICAgIHtsYWJlbDogXCJJbWFnZSBVUkxcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAge2xhYmVsOiBcIkRlc2NyaXB0aW9uIC8gYWx0ZXJuYXRpdmUgdGV4dFwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCJcIn0sXHJcbiAgICB7bGFiZWw6IFwiVGl0bGVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiXCJ9XHJcbiAgXSxcclxuICBzZWxlY3QocG0pIHtcclxuICAgIHJldHVybiBwbS5kb2MucGF0aChwbS5zZWxlY3Rpb24uZnJvbS5wYXRoKS50eXBlLmNhbkNvbnRhaW5UeXBlKHRoaXMpXHJcbiAgfSxcclxuICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT0gdGhpcylcclxuICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnNyYywgbm9kZS5hdHRycy5hbHQsIG5vZGUuYXR0cnMudGl0bGVdXHJcbiAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soSW1hZ2UpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW1hZ2Uge31cclxuXHJcbmApIiwiZXhwb3J0IHtCbG9ja01hdGh9IGZyb20gXCIuL2Jsb2NrbWF0aFwiXHJcbmV4cG9ydCB7Q2hlY2tCb3h9IGZyb20gXCIuL2NoZWNrYm94XCJcclxuZXhwb3J0IHtDaGVja0xpc3QsIENoZWNrSXRlbX0gZnJvbSBcIi4vY2hlY2tsaXN0XCJcclxuZXhwb3J0IHtJRnJhbWV9IGZyb20gXCIuL2lmcmFtZVwiXHJcbmV4cG9ydCB7SW5saW5lTWF0aH0gZnJvbSBcIi4vaW5saW5lbWF0aFwiXHJcbmV4cG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuZXhwb3J0IHtNdWx0aXBsZUNob2ljZSwgQ2hvaWNlfSBmcm9tIFwiLi9tdWx0aXBsZWNob2ljZVwiXHJcbmV4cG9ydCB7UmFkaW9CdXR0b259IGZyb20gXCIuL3JhZGlvYnV0dG9uXCJcclxuZXhwb3J0IHtTY2FsZX0gZnJvbSBcIi4vc2NhbGVcIlxyXG5leHBvcnQge1NlbGVjdH0gZnJvbSBcIi4vc2VsZWN0XCJcclxuZXhwb3J0IHtUZXh0QXJlYX0gZnJvbSBcIi4vdGV4dGFyZWFcIlxyXG5leHBvcnQge1RleHRGaWVsZH0gZnJvbSBcIi4vdGV4dGZpZWxkXCJcclxuZXhwb3J0IHtJbWFnZX0gZnJvbSBcIi4vaW1hZ2VcIlxyXG5leHBvcnQge1NwcmVhZFNoZWV0fSBmcm9tIFwiLi9zcHJlYWRzaGVldFwiXHJcbmV4cG9ydCB7Q2FycnlGb3J3YXJkfSBmcm9tIFwiLi9jYXJyeWZvcndhcmRcIlxyXG5leHBvcnQge1dpZGdldH0gZnJvbSBcIi4vd2lkZ2V0XCJcclxuIiwiaW1wb3J0IHtJbmxpbmUsIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsIGluc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElubGluZU1hdGggZXh0ZW5kcyBJbmxpbmUge31cclxuXHJcbklubGluZU1hdGguYXR0cmlidXRlcyA9IHtcclxuXHR0ZXg6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiXCJ9KVxyXG59IFxyXG5cclxuZGVmUGFyc2VyKElubGluZU1hdGgsIFwic3BhblwiLCBcIndpZGdldHMtaW5saW5lbWF0aFwiKVxyXG5cclxuSW5saW5lTWF0aC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwic3BhblwiLCB7Y2xhc3M6IFwid2lkZ2V0cy1pbmxpbmVtYXRoXCJ9LCBcIiBcXFxcKFwiK25vZGUuYXR0cnMudGV4K1wiXFxcXCkgXCIpXHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHRNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJEZWxheVwiLE1hdGhKYXguQ2FsbGJhY2ssMTAwXSxbXCJUeXBlc2V0XCIsTWF0aEpheC5IdWIsbm9kZS5yZW5kZXJlZF0pXHJcblx0fVxyXG5cdHJldHVybiBub2RlLnJlbmRlcmVkO1xyXG59XHJcblxyXG5cclxuSW5saW5lTWF0aC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0SW5saW5lTWF0aFwiLFxyXG5cdGxhYmVsOiBcIklubGluZU1hdGhcIixcclxuXHRydW4ocG0sIHRleCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7dGV4fSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIkxhdGV4IEV4cHJlc3Npb25cIiwgdHlwZTogXCJ0ZXh0XCIgfVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcbiAgICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuICAgICAgaWYgKG5vZGUpXHJcbiAgICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLnRleF1cclxuICAgIH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKElubGluZU1hdGgpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtaW5saW5lbWF0aCB7fVxyXG5cclxuYCkiLCJpbXBvcnQge0lubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2luc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIElucHV0IGV4dGVuZHMgSW5saW5lIHt9XHJcblxyXG5JbnB1dC5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInRleHRcIn0pLFxyXG5cdHZhbHVlOiBuZXcgQXR0cmlidXRlKCksXHJcbn1cclxuXHJcbmRlZlBhcnNlcihJbnB1dCxcIndpZGdldHMtaW5wdXRcIilcclxuXHJcbklucHV0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJpbnB1dFwiLG5vZGUuYXR0cnMpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cdFx0XHJcbi53aWRnZXRzLWlucHV0IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIFBhcmFncmFwaCwgQXR0cmlidXRlLCBQb3N9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBDaG9pY2UgZXh0ZW5kcyBQYXJhZ3JhcGgge1xyXG5cdHN0YXRpYyBnZXQga2luZCgpIHsgcmV0dXJuIFwiLlwiIH1cclxuXHJcblx0Y3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xyXG5cdFx0aWYgKGF0dHJzLnZhbHVlID4gMCkgY29udGVudCA9IFt0aGlzLnNjaGVtYS5ub2RlKFwicmFkaW9idXR0b25cIixhdHRycyldXHJcblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlKGF0dHJzLCBjb250ZW50LCBtYXJrcylcclxuXHR9XHJcbn1cclxuXHJcbkNob2ljZS5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUNob2ljZSBleHRlbmRzIEJsb2NrIHtcclxuXHRzdGF0aWMgZ2V0IGNvbnRhaW5zKCkgeyByZXR1cm4gXCJjaG9pY2VcIn1cclxufVxyXG5cclxuTXVsdGlwbGVDaG9pY2UuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKClcclxufVxyXG5cclxuXHJcbmRlZlBhcnNlcihDaG9pY2UsXCJwXCIsXCJ3aWRnZXRzLWNob2ljZVwiKVxyXG5kZWZQYXJzZXIoTXVsdGlwbGVDaG9pY2UsXCJkaXZcIixcIndpZGdldHMtbXVsdGlwbGVjaG9pY2VcIilcclxuXHJcbkNob2ljZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwicFwiLCB7bmFtZTogbm9kZS5hdHRycy5uYW1lLCB2YWx1ZTogbm9kZS5hdHRycy52YWx1ZSwgY2xhc3M6IFwid2lkZ2V0cy1jaG9pY2VcIn0pXHJcblxyXG5NdWx0aXBsZUNob2ljZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gKG5vZGUscykgPT4gcy5yZW5kZXJBcyhub2RlLFwiZGl2XCIse25hbWU6IG5vZGUuYXR0cnMubmFtZSwgY2xhc3M6IFwid2lkZ2V0cy1tdWx0aXBsZWNob2ljZVwifSlcclxuXHJcbkNob2ljZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwic3BsaXRDaG9pY2VcIixcclxuICBsYWJlbDogXCJTcGxpdCB0aGUgY3VycmVudCBjaG9pY2VcIixcclxuICBydW4ocG0pIHtcclxuICAgIGxldCB7bm9kZSwgZnJvbSwgdG99ID0gcG0uc2VsZWN0aW9uXHJcbiAgICBpZiAoKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB8fCBmcm9tLnBhdGgubGVuZ3RoIDwgMiB8fCAhUG9zLnNhbWVQYXRoKGZyb20ucGF0aCwgdG8ucGF0aCkpIHJldHVybiBmYWxzZVxyXG4gICAgIGxldCB0b1BhcmVudCA9IGZyb20uc2hvcnRlbigpLCBncmFuZFBhcmVudCA9IHBtLmRvYy5wYXRoKHRvUGFyZW50LnBhdGgpXHJcbiAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZS5uYW1lICE9IFwibXVsdGlwbGVjaG9pY2VcIikgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gcG0udHIuZGVsZXRlKGZyb20sIHRvKS5zcGxpdChmcm9tLCAxLCBwbS5zY2hlbWEubm9kZXMuY2hvaWNlLCB7bmFtZTogZ3JhbmRQYXJlbnQuYXR0cnMubmFtZSwgdmFsdWU6IGdyYW5kUGFyZW50LnNpemV9KS5hcHBseShhbmRTY3JvbGwpXHJcbiAgfSxcclxuICBrZXk6IFwiRW50ZXIoNTApXCJcclxufSlcclxuXHJcbkNob2ljZS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG4gIG5hbWU6IFwiZGVsZXRlQ2hvaWNlXCIsXHJcbiAgbGFiZWw6IFwiZGVsZXRlIHRoaXMgY2hvaWNlIG9yIG11bHRpcGxlY2hvaWNlXCIsXHJcbiAgcnVuKHBtKSB7XHJcbiAgICBsZXQge2hlYWQsIGVtcHR5fSA9IHBtLnNlbGVjdGlvblxyXG4gICAgaWYgKCFlbXB0eSB8fCBoZWFkLm9mZnNldCA+IDEpIHJldHVybiBmYWxzZVxyXG4gICAgLy8gRmluZCB0aGUgbm9kZSBiZWZvcmUgdGhpcyBvbmVcclxuICAgIGxldCBiZWZvcmUsIGN1dFxyXG4gICAgZm9yIChsZXQgaSA9IGhlYWQucGF0aC5sZW5ndGggLSAxOyAhYmVmb3JlICYmIGkgPj0gMDsgaS0tKSBpZiAoaGVhZC5wYXRoW2ldID4gMCkge1xyXG4gICAgICBjdXQgPSBoZWFkLnNob3J0ZW4oaSlcclxuICAgICAgYmVmb3JlID0gcG0uZG9jLnBhdGgoY3V0LnBhdGgpLmNoaWxkKGN1dC5vZmZzZXQgLSAxKVxyXG4gICAgfVxyXG5cdGxldCBtYyA9IHBtLmRvYy5wYXRoKGN1dC5wYXRoKS5jaGlsZChjdXQub2Zmc2V0KVxyXG4gICAgLy8gaWYgdG9wIGNob2ljZSwgZGVsZXRlIHdob2xlIHF1ZXN0aW9uIGlmIG9ubHkgb25lIGNob2ljZVxyXG4gICAgaWYgKG1jLnR5cGUubmFtZSA9PSBcImNob2ljZVwiKSB7XHJcbiAgICBcdHJldHVybiBwbS50ci5kZWxldGUoY3V0LCBjdXQubW92ZSgxKSkuYXBwbHkoKVxyXG4gICAgfSBlbHNlIHtcclxuICAgIFx0Ly8gZG9uJ3QgZGVsZXRlIHF1ZXN0aW9uIGlmIG1vcmUgdGhhbiBvbmUgY2hvaWNlXHJcbiAgICBcdGlmIChtYy5zaXplID09IDEpIHtcclxuICAgICBcdFx0cmV0dXJuIHBtLnRyLmRlbGV0ZShjdXQsY3V0Lm1vdmUoMSkpLmFwcGx5KClcclxuICAgIFx0fSBlbHNlXHJcbiAgICBcdFx0cmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAga2V5OiBbXCJCYWNrc3BhY2UoNTApXCIsIFwiTW9kLUJhY2tzcGFjZSg1MClcIl1cclxufSlcclxuXHJcbk11bHRpcGxlQ2hvaWNlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydE11bHRpcGxlQ2hvaWNlXCIsXHJcblx0bGFiZWw6IFwiTXVsdGlwbGVDaG9pY2VcIixcclxuXHRydW4ocG0sIG5hbWUpIHtcclxuICAgIFx0bGV0IHtmcm9tfSA9IHBtLnNlbGVjdGlvblxyXG5cdFx0bGV0IGNob2ljZSA9IHBtLnNjaGVtYS5ub2RlKFwiY2hvaWNlXCIse25hbWU6IG5hbWUsIHZhbHVlOiAwfSlcclxuXHRcdHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWU6IG5hbWV9LCBjaG9pY2UpKS5hcHBseShhbmRTY3JvbGwpXHJcblx0XHQvL2ZpbmQgcGF0aCBvZiBuZXh0IHNpYmxpbmdcclxuLypcdFx0bGV0IGxlbiA9IGZyb20ucGF0aC5sZW5ndGgtMVxyXG5cdFx0bGV0IHNpYiA9IGZyb20ucGF0aFtsZW5dXHJcblx0XHRsZXQgcGZyb20gPSBmcm9tLnBhdGguc3BsaWNlKDAsbGVuKS5jb25jYXQoc2liKzEpIFxyXG5cdCAgICBwbS5zZXRUZXh0U2VsZWN0aW9uKGZyb20pXHJcbiovXHJcblx0XHRyZXR1cm4gdHJ1ZVxyXG5cdH0sXHJcblx0c2VsZWN0KHBtKSB7XHJcblx0XHRjb25zb2xlLmxvZyhcInNlbGVjdFwiKVxyXG5cdFx0cmV0dXJuIHBtLmRvYy5wYXRoKHBtLnNlbGVjdGlvbi5mcm9tLnBhdGgpLnR5cGUuY2FuQ29udGFpblR5cGUodGhpcylcclxuXHR9LFxyXG5cdHBhcmFtczogW1xyXG5cdFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWVdXHJcblx0IH1cclxufSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1jaG9pY2Uge31cclxuLndpZGdldHMtbXVsdGlwbGVjaG9pY2Uge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXJ9IGZyb20gXCIuLi91dGlsc1wiXHJcbmltcG9ydCB7SW5wdXR9IGZyb20gXCIuL2lucHV0XCJcclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRpb0J1dHRvbiBleHRlbmRzIElucHV0IHt9XHJcblxyXG5SYWRpb0J1dHRvbi5hdHRyaWJ1dGVzID0ge1xyXG5cdG5hbWU6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHR0eXBlOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcInJhZGlvXCJ9KSxcclxuXHR2YWx1ZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdGNsYXNzOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIndpZGdldHMtcmFkaW9idXR0b25cIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihSYWRpb0J1dHRvbixcImlucHV0XCIsXCJ3aWRnZXRzLXJhZGlvYnV0dG9uXCIpXHJcblxyXG4vLyBpbmhlcml0cyBzZXJpYWxpemVyIGZyb20gaW5wdXRcclxuXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtcmFkaW9idXR0b24ge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCwgaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2NhbGUgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU2NhbGUuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0c3RhcnR2YWx1ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIxXCJ9KSxcclxuXHRzdGFydGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImxvd1wifSksXHJcblx0ZW5kdmFsdWU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwiMTBcIn0pLFxyXG5cdGVuZGxhYmVsOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcImhpZ2hcIn0pLFxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2NhbGUsXCJkaXZcIixcInNjYWxlXCIpXHJcblxyXG5TY2FsZS5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0bGV0IGRvbSA9IGVsdChcImRpdlwiLHtjbGFzczogXCJ3aWRnZXRzLXNjYWxlXCJ9KVxyXG5cdGRvbS5hcHBlbmRDaGlsZChlbHQoXCJzcGFuXCIsIG51bGwsIG5vZGUuYXR0cnMuc3RhcnRsYWJlbCtcIiBcIikpXHJcblx0bGV0IHN0YXJ0VmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSlcclxuXHRsZXQgZW5kVmFsID0gTnVtYmVyKG5vZGUuYXR0cnMuZW5kdmFsdWUpXHJcblx0aWYgKHN0YXJ0VmFsIDwgZW5kVmFsKVxyXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0VmFsOyBpIDw9IGVuZFZhbDsgaSsrKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRlbHNlXHJcblx0XHRmb3IgKGxldCBpID0gc3RhcnRWYWw7IGkgPj0gIGVuZFZhbDsgaS0tKSB7XHJcblx0XHRcdGRvbS5hcHBlbmRDaGlsZChcclxuXHRcdFx0XHRlbHQoXCJzcGFuXCIse2NsYXNzOiBcIndpZGdldHMtc2NhbGVpdGVtXCJ9LFxyXG5cdFx0XHRcdFx0ZWx0KFwiaW5wdXRcIix7bmFtZTpub2RlLmF0dHJzLm5hbWUsIHR5cGU6XCJyYWRpb1wiLCB2YWx1ZTppfSksXHJcblx0XHRcdFx0XHRpLnRvU3RyaW5nKClcclxuXHRcdFx0XHQpXHJcblx0XHRcdClcclxuXHRcdH1cclxuXHRkb20uYXBwZW5kQ2hpbGQoZWx0KFwic3BhblwiLCBudWxsLCBcIiBcIitub2RlLmF0dHJzLmVuZGxhYmVsKSlcclxuXHRyZXR1cm4gZG9tXHJcbn1cclxuXHJcblNjYWxlLnJlZ2lzdGVyKFwiY29tbWFuZFwiLHtcclxuXHRuYW1lOiBcImluc2VydFNjYWxlXCIsXHJcblx0bGFiZWw6IFwiU2NhbGVcIixcclxuXHRydW4ocG0sIG5hbWUsIHN0YXJ0dmFsdWUsIHN0YXJ0bGFiZWwsIGVuZHZhbHVlLCBlbmRsYWJlbCkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxzdGFydHZhbHVlLHN0YXJ0bGFiZWwsZW5kdmFsdWUsZW5kbGFiZWx9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlN0YXJ0IHZhbHVlXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiAxfSxcclxuICAgICBcdHsgbGFiZWw6IFwiU3RhcnQgbGFiZWxcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwibWluXCJ9LFxyXG4gICAgIFx0eyBsYWJlbDogXCJFbmQgdmFsdWVcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IDEwfSxcclxuICAgICBcdHsgbGFiZWw6IFwiRW5kIGxhYmVsXCIsIHR5cGU6IFwidGV4dFwiLCBkZWZhdWx0OiBcIm1heFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc3RhcnR2YWx1ZSwgbm9kZS5hdHRycy5zdGFydGxhYmVsLCBub2RlLmF0dHJzLmVuZHZhbHVlLCBub2RlLmF0dHJzLmVuZGxhYmVsXVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTY2FsZSlcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy1zY2FsZWl0ZW0ge31cdFx0XHJcbi53aWRnZXRzLXNjYWxlIHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIElubGluZSwgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2VsdCwgaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgSW5saW5lIHt9XHJcblxyXG5TZWxlY3QuYXR0cmlidXRlcyA9IHtcclxuXHRuYW1lOiBuZXcgQXR0cmlidXRlKCksXHJcblx0b3B0aW9uczogbmV3IEF0dHJpYnV0ZSgpLFxyXG4gICAgbXVsdGlwbGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwic2luZ2xlXCJ9KVxyXG59XHJcblxyXG5kZWZQYXJzZXIoU2VsZWN0LFwic2VsZWN0XCIsXCJ3aWRnZXRzLXNlbGVjdFwiKVxyXG5cclxuU2VsZWN0LnByb3RvdHlwZS5zZXJpYWxpemVET00gPSBub2RlID0+IHtcclxuXHRsZXQgc2VsZWN0aW9uID0gbm9kZS5hdHRycy5tdWx0aXBsZSA9PSBcIm11bHRpcGxlXCJcclxuXHRsZXQgc2VsZWN0ID0gZWx0KFwic2VsZWN0XCIse25hbWU6IG5vZGUuYXR0cnMubmFtZSwgY2xhc3M6IFwid2lkZ2V0cy1zZWxlY3RcIiwgc2l6ZTogMSwgbXVsdGlwbGU6IHNlbGVjdGlvbn0pXHJcblx0bm9kZS5hdHRycy5vcHRpb25zLnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24ob3B0aW9uKSB7XHJcblx0XHRzZWxlY3QuYXBwZW5kQ2hpbGQoZWx0KFwib3B0aW9uXCIsIHt2YWx1ZTogb3B0aW9uLnRyaW0oKX0sIG9wdGlvbikpXHJcblx0fSlcclxuXHRyZXR1cm4gc2VsZWN0XHJcbn1cclxuXHJcblNlbGVjdC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0U2VsZWN0XCIsXHJcblx0bGFiZWw6IFwiU2VsZWN0XCIsXHJcblx0cnVuKHBtLCBuYW1lLCBvcHRpb25zLCBtdWx0aXBsZSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxvcHRpb25zLG11bHRpcGxlfSkpLmFwcGx5KGFuZFNjcm9sbClcclxuICBcdH0sXHJcblx0cGFyYW1zOiBbXHJcbiAgICAgXHR7IGxhYmVsOiBcIk5hbWVcIiwgdHlwZTogXCJ0ZXh0XCJ9LFxyXG4gICAgICBcdHsgbGFiZWw6IFwiT3B0aW9ucyAoY29tbWEgc2VwYXJhdGVkKVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlNlbGVjdGlvbiAoc2luZ2xlIG9yIG11bHRpcGxlKVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBbXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcIm11bHRpcGxlXCIsIGxhYmVsOlwibXVsdGlwbGVcIn0sXHJcbiAgICAgXHQgICAge3ZhbHVlOiBcInNpbmdsZVwiLCBsYWJlbDpcInNpbmdsZVwifVxyXG4gICAgIFx0XX1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG5cdCAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcblx0ICAgIGlmIChub2RlKSB7XHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMub3B0aW9ucywgbm9kZS5hdHRycy5tdWx0aXBsZV1cclxuXHQgICAgfVxyXG5cdCB9XHJcbn0pXHJcblxyXG5kZWZQYXJhbXNDbGljayhTZWxlY3QpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtc2VsZWN0IHt9XHJcblxyXG5gKSIsImltcG9ydCB7QmxvY2ssIEF0dHJpYnV0ZX0gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L21vZGVsXCJcclxuaW1wb3J0IHtlbHQsaW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtkZWZQYXJzZXIsIGRlZlBhcmFtc0NsaWNrLCBhbmRTY3JvbGx9IGZyb20gXCIuLi91dGlsc1wiXHJcblxyXG5leHBvcnQgY2xhc3MgU3ByZWFkU2hlZXQgZXh0ZW5kcyBCbG9jayB7fVxyXG5cclxuU3ByZWFkU2hlZXQuYXR0cmlidXRlcyA9IHtcclxuXHRkYXRhOiBuZXcgQXR0cmlidXRlKHtkZWZhdWx0OiBcIlwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFNwcmVhZFNoZWV0LFwiZGl2XCIsXCJ3aWRnZXRzLXNwcmVhZHNoZWV0XCIpXHJcblxyXG5TcHJlYWRTaGVldC5wcm90b3R5cGUuc2VyaWFsaXplRE9NID0gbm9kZSA9PiB7XHJcblx0aWYgKG5vZGUucmVuZGVyZWQpIHtcclxuXHRcdG5vZGUucmVuZGVyZWQgPSBub2RlLnJlbmRlcmVkLmNsb25lTm9kZSh0cnVlKVxyXG5cdH0gZWxzZSB7XHJcblx0XHRub2RlLnJlbmRlcmVkID0gZWx0KFwiZGl2XCIsIHtcclxuXHRcdFx0aWQ6IFwic3ByZWFkc2hlZXRcIiwgXHJcblx0XHRcdGNsYXNzOiBcIndpZGdldHMtc3ByZWFkc2hlZXRcIlxyXG5cdFx0fSk7XHJcblx0XHQvLyB3YWl0IHVudGlsIG5vZGUgaXMgYXR0YWNoZWQgdG8gZG9jdW1lbnQgdG8gcmVuZGVyXHJcblx0XHR3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0bGV0IGRhdGEgPSBbXHJcblx0ICAgICAgICAgICAgW1wiXCIsIFwiRm9yZFwiLCBcIlZvbHZvXCIsIFwiVG95b3RhXCIsIFwiSG9uZGFcIl0sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNFwiLCAxMCwgMTEsIDEyLCAxM10sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNVwiLCAyMCwgMTEsIDE0LCAxM10sXHJcblx0ICAgICAgICAgICAgW1wiMjAxNlwiLCAzMCwgMTUsIDEyLCAxM11cclxuXHQgICAgICAgIF07XHJcblx0XHJcblx0ICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwcmVhZHNoZWV0Jyk7XHJcblx0ICAgICAgICBsZXQgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcclxuXHQgICAgICAgIFx0ZGF0YTogZGF0YSxcclxuXHQgICAgICAgICAgICBtaW5TcGFyZVJvd3M6IDEsXHJcblx0ICAgICAgICAgICAgcm93SGVhZGVyczogdHJ1ZSxcclxuXHQgICAgICAgICAgICBjb2xIZWFkZXJzOiB0cnVlLFxyXG5cdCAgICAgICAgICAgIGNvbnRleHRNZW51OiB0cnVlXHJcblx0ICAgICAgICB9KTtcclxuXHRcdH0sIDEwMClcclxuXHR9XHJcblx0cmV0dXJuIG5vZGUucmVuZGVyZWQ7IFxyXG59XHJcblxyXG5TcHJlYWRTaGVldC5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0U3ByZWFkU2hlZXRcIixcclxuXHRsYWJlbDogXCJTcHJlYWRTaGVldFwiLFxyXG5cdHJ1bihwbSwgZGF0YSkge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7ZGF0YX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJMaW5rIHRvIGRhdGEgY3N2IChmaXhlZCBmb3IgZGVtbylcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiY2Fycy5jc3ZcIn1cclxuXHRdLFxyXG4gICAgcHJlZmlsbFBhcmFtcyhwbSkge1xyXG4gICAgICBsZXQge25vZGV9ID0gcG0uc2VsZWN0aW9uXHJcbiAgICAgIGlmIChub2RlKVxyXG4gICAgICAgIHJldHVybiBbbm9kZS5hdHRycy5kYXRhXVxyXG4gICAgfVxyXG59KVxyXG5cclxuZGVmUGFyYW1zQ2xpY2soU3ByZWFkU2hlZXQpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtc3ByZWFkc2hlZXQge31cclxuXHJcbmApIiwiaW1wb3J0IHtCbG9jaywgQXR0cmlidXRlfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbW9kZWxcIlxyXG5pbXBvcnQge2luc2VydENTU30gZnJvbSBcIi4uLy4uLy4uLy4uL2dpdC9wcm9zZW1pcnJvci9kaXN0L2RvbVwiXHJcbmltcG9ydCB7ZGVmUGFyc2VyLCBkZWZQYXJhbXNDbGljaywgYW5kU2Nyb2xsfSBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRBcmVhIGV4dGVuZHMgQmxvY2sge31cclxuXHJcblRleHRBcmVhLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHJvd3M6IG5ldyBBdHRyaWJ1dGUoKSxcclxuXHRjb2xzOiBuZXcgQXR0cmlidXRlKCksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0YXJlYVwifSlcclxufVxyXG5cclxuZGVmUGFyc2VyKFRleHRBcmVhLFwiaW5wdXRcIixcIndpZGdldHMtdGV4dGFyZWFcIilcclxuXHJcblRleHRBcmVhLnByb3RvdHlwZS5zZXJpYWxpemVET00gPSAobm9kZSxzKSA9PiBzLnJlbmRlckFzKG5vZGUsXCJ0ZXh0YXJlYVwiLG5vZGUuYXR0cnMpXHJcblxyXG5UZXh0QXJlYS5yZWdpc3RlcihcImNvbW1hbmRcIiwge1xyXG5cdG5hbWU6IFwiaW5zZXJ0VGV4dEFyZWFcIixcclxuXHRsYWJlbDogXCJUZXh0QXJlYVwiLFxyXG5cdHJ1bihwbSwgbmFtZSwgcm93cywgY29scykge1xyXG4gICAgXHRyZXR1cm4gcG0udHIucmVwbGFjZVNlbGVjdGlvbih0aGlzLmNyZWF0ZSh7bmFtZSxyb3dzLGNvbHN9KSkuYXBwbHkoYW5kU2Nyb2xsKVxyXG4gIFx0fSxcclxuXHRwYXJhbXM6IFtcclxuICAgICBcdHsgbGFiZWw6IFwiTmFtZVwiLCB0eXBlOiBcInRleHRcIn0sXHJcbiAgICAgXHR7IGxhYmVsOiBcIlJvd3NcIiwgdHlwZTogXCJ0ZXh0XCIsIGRlZmF1bHQ6IFwiNFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiQ29sdW1uc1wiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwifVxyXG5cdF0sXHJcbiAgICBwcmVmaWxsUGFyYW1zKHBtKSB7XHJcblx0ICAgIGxldCB7bm9kZX0gPSBwbS5zZWxlY3Rpb25cclxuXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMucm93cywgbm9kZS5hdHRycy5jb2xzXVxyXG5cdCB9XHJcbn0pIFxyXG5cclxuZGVmUGFyYW1zQ2xpY2soVGV4dEFyZWEpXHJcblxyXG5pbnNlcnRDU1MoYFxyXG5cclxuLndpZGdldHMtdGV4dGFyZWEge31cclxuXHJcbmApIiwiaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7aW5zZXJ0Q1NTfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuaW1wb3J0IHtJbnB1dH0gZnJvbSBcIi4vaW5wdXRcIlxyXG5pbXBvcnQge2RlZlBhcnNlciwgZGVmUGFyYW1zQ2xpY2ssIGFuZFNjcm9sbH0gZnJvbSBcIi4uL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBJbnB1dCB7fVxyXG5cclxuVGV4dEZpZWxkLmF0dHJpYnV0ZXMgPSB7XHJcblx0bmFtZTogbmV3IEF0dHJpYnV0ZSgpLFxyXG5cdHR5cGU6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwidGV4dFwifSksXHJcblx0c2l6ZTogbmV3IEF0dHJpYnV0ZSh7ZGVmYXVsdDogXCIyMFwifSksXHJcblx0Y2xhc3M6IG5ldyBBdHRyaWJ1dGUoe2RlZmF1bHQ6IFwid2lkZ2V0cy10ZXh0ZmllbGRcIn0pXHJcbn1cclxuXHJcbmRlZlBhcnNlcihUZXh0RmllbGQsXCJpbnB1dFwiLFwid2lkZ2V0cy10ZXh0ZmllbGRcIilcclxuXHJcbi8vIHNlcmlhbGl6ZXIgaW5oZXJpdHMgZnJvbSBpbnB1dFxyXG5cclxuVGV4dEZpZWxkLnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRUZXh0RmllbGRcIixcclxuXHRsYWJlbDogXCJUZXh0RmllbGRcIixcclxuXHRydW4ocG0sIG5hbWUsIHNpemUpIHtcclxuICAgIFx0cmV0dXJuIHBtLnRyLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5jcmVhdGUoe25hbWUsc2l6ZX0pKS5hcHBseShhbmRTY3JvbGwpXHJcbiAgXHR9LFxyXG5cdHBhcmFtczogW1xyXG4gICAgIFx0eyBsYWJlbDogXCJOYW1lXCIsIHR5cGU6IFwidGV4dFwifSxcclxuICAgICBcdHsgbGFiZWw6IFwiU2l6ZVwiLCB0eXBlOiBcInRleHRcIiwgZGVmYXVsdDogXCIyMFwiIH0sXHJcblx0XSxcclxuICAgIHByZWZpbGxQYXJhbXMocG0pIHtcclxuXHQgICAgbGV0IHtub2RlfSA9IHBtLnNlbGVjdGlvblxyXG4gXHQgICAgaWYgKG5vZGUpXHJcblx0ICAgICAgcmV0dXJuIFtub2RlLmF0dHJzLm5hbWUsIG5vZGUuYXR0cnMuc2l6ZSBdXHJcblx0IH1cclxufSlcclxuXHJcbmRlZlBhcmFtc0NsaWNrKFRleHRGaWVsZClcclxuXHJcbmluc2VydENTUyhgXHJcblxyXG4ud2lkZ2V0cy10ZXh0ZmllbGQge31cclxuXHJcbmApIiwiaW1wb3J0IHtyZWFkUGFyYW1zfSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvbWVudS9tZW51XCJcclxuaW1wb3J0IHtUZXh0YmxvY2t9IGZyb20gXCIuLi8uLi8uLi8uLi9naXQvcHJvc2VtaXJyb3IvZGlzdC9tb2RlbFwiXHJcbmltcG9ydCB7ZWx0fSBmcm9tIFwiLi4vLi4vLi4vLi4vZ2l0L3Byb3NlbWlycm9yL2Rpc3QvZG9tXCJcclxuXHJcbmNvbnN0IHdpZGdldHMgPSBbXCJJbWFnZVwiLCBcIlRleHRGaWVsZFwiLCBcIlRleHRBcmVhXCIsIFwiQ2hlY2tCb3hcIiwgXCJTZWxlY3RcIiwgXCJDYXJyeUZvcndhcmRcIixcclxuICAgICAgICAgICAgICAgICBcIklGcmFtZVwiLCBcIklubGluZU1hdGhcIiwgXCJCbG9ja01hdGhcIiwgXCJTcHJlYWRTaGVldFwiLFxyXG4gICAgICAgICAgICAgICAgIFwiTXVsdGlwbGVDaG9pY2VcIiwgXCJTY2FsZVwiLCBcIkNoZWNrTGlzdFwiXVxyXG5cclxuIGNvbnN0IGluc2VydFdpZGdldCA9IHdpZGdldHMubWFwKHcgPT4gKHtcclxuIFx0dmFsdWU6IFwiaW5zZXJ0XCIrdyxcclxuIFx0ZGlzcGxheTogKCkgPT4geyByZXR1cm4gZWx0KFwic3BhblwiLG51bGwsIHcpfVxyXG4gfSkpXHJcblxyXG5leHBvcnQgY2xhc3MgV2lkZ2V0IGV4dGVuZHMgVGV4dGJsb2NrIHt9XHJcbiBcclxuV2lkZ2V0LnJlZ2lzdGVyKFwiY29tbWFuZFwiLCB7XHJcblx0bmFtZTogXCJpbnNlcnRXaWRnZXRcIixcclxuXHRsYWJlbDogXCJJbnNlcnQuLi5cIixcclxuXHRzZWxlY3QocG0pIHtyZXR1cm4gdHJ1ZX0sXHJcblx0cGFyYW1zOiBbXHJcblx0ICAgICB7bmFtZTogXCJXaWRnZXQgdHlwZVwiLCB0eXBlOiBcInNlbGVjdFwiLCBvcHRpb25zOiBpbnNlcnRXaWRnZXQsIGRlZmF1bHRMYWJlbDogXCJJbnNlcnQuLi5cIn1cclxuXHRdLFxyXG5cdHJ1bihwbSwgdHlwZSkge1xyXG5cdFx0bGV0IG1lbnUgPSBwbS5tb2QubWVudUJhci5tZW51XHJcblx0XHRsZXQgY21kID0gcG0uY29tbWFuZHNbdHlwZV1cclxuXHRcdGlmIChtZW51ICYmIGNtZCkgbWVudS5lbnRlcihyZWFkUGFyYW1zKGNtZCkpXHJcblx0fSxcclxuXHRkaXNwbGF5OiBcInNlbGVjdFwiLFxyXG5cdG1lbnVHcm91cDogXCJibG9ja1wiLFxyXG5cdG1lbnVSYW5rOiA5OVxyXG59KVxyXG5cclxuIFxyXG4iXX0=