import { e } from "./chunk-KVKFRDRF.js"; import { ge } from "./chunk-O6L55DMN.js"; import "./chunk-FNDTTSSL.js"; import "./chunk-KE6WE6IM.js"; import "./chunk-KRMUJIEJ.js"; import "./chunk-YFT6OQ5R.js"; import { B } from "./chunk-USOO7D3G.js"; import "./chunk-F73GDDKZ.js"; import "./chunk-LK7GAOJV.js"; import "./chunk-GCDLWRBO.js"; import { createBaseVNode, createCommentVNode, createElementBlock, defineComponent, getCurrentInstance, onMounted, openBlock, reactive, ref, toDisplayString, watch } from "./chunk-YI6SOFIT.js"; import "./chunk-PLDDJCW6.js"; // node_modules/@fast-crud/fast-extends/dist/fs-json-editor-985ed0b5.mjs var bt = { exports: {} }; (function(Je, it) { (function(Ye, ot) { Je.exports = ot(); })(self, function() { return ot = { 897: function(le, m, D) { D.d(m, { x: function() { return Y; } }); var U = D(2602), x = D(9791), H = D(7907); function z(P) { return (z = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(N) { return typeof N; } : function(N) { return N && typeof Symbol == "function" && N.constructor === Symbol && N !== Symbol.prototype ? "symbol" : typeof N; })(P); } function j(P, N) { for (var A = 0; A < N.length; A++) { var f = N[A]; f.enumerable = f.enumerable || false, f.configurable = true, "value" in f && (f.writable = true), Object.defineProperty(P, function(R) { return R = function(y, C) { if (z(y) !== "object" || y === null) return y; var d = y[Symbol.toPrimitive]; if (d === void 0) return (C === "string" ? String : Number)(y); if (d = d.call(y, C || "default"), z(d) !== "object") return d; throw new TypeError("@@toPrimitive must return a primitive value."); }(R, "string"), z(R) === "symbol" ? R : String(R); }(f.key), f); } } var Y = function() { function P(f, C) { if (!(this instanceof P)) throw new TypeError("Cannot call a class as a function"); this.dom = {}; var y = this, h = this.dom, C = (this.anchor = void 0, this.items = f, this.eventListeners = {}, this.selection = void 0, this.onClose = C ? C.close : void 0, this.limitHeight = !!C && C.limitHeight, document.createElement("div")), d = (C.className = "jsoneditor-contextmenu-root", h.root = C, document.createElement("div")), C = (d.className = "jsoneditor-contextmenu", h.menu = d, C.appendChild(d), document.createElement("ul")), d = (C.className = "jsoneditor-menu", d.appendChild(C), h.list = C, h.items = [], document.createElement("button")), h = (d.type = "button", h.focusButton = d, document.createElement("li")); h.style.overflow = "hidden", h.style.height = "0", h.appendChild(d), C.appendChild(h), function l(n, o, i) { i.forEach(function(a) { var r, e2, t, s, c, p; a.type === "separator" ? ((c = document.createElement("div")).className = "jsoneditor-separator", (e2 = document.createElement("li")).appendChild(c), n.appendChild(e2)) : (r = {}, c = document.createElement("li"), n.appendChild(c), (e2 = document.createElement("button")).type = "button", e2.className = a.className, r.button = e2, a.title && (e2.title = a.title), a.click && (e2.onclick = function(g) { g.preventDefault(), y.hide(), a.click(); }), c.appendChild(e2), a.submenu ? ((s = document.createElement("div")).className = "jsoneditor-icon", e2.appendChild(s), (s = document.createElement("div")).className = "jsoneditor-text" + (a.click ? "" : " jsoneditor-right-margin"), s.appendChild(document.createTextNode(a.text)), e2.appendChild(s), (t = a.click ? (e2.className += " jsoneditor-default", (s = document.createElement("button")).type = "button", (r.buttonExpand = s).className = "jsoneditor-expand", (p = document.createElement("div")).className = "jsoneditor-expand", s.appendChild(p), c.appendChild(s), a.submenuTitle && (s.title = a.submenuTitle), s) : ((p = document.createElement("div")).className = "jsoneditor-expand", e2.appendChild(p), e2)).onclick = function(g) { g.preventDefault(), y._onExpandItem(r), t.focus(); }, r.subItems = s = [], p = document.createElement("ul"), (r.ul = p).className = "jsoneditor-menu", p.style.height = "0", c.appendChild(p), l(p, s, a.submenu)) : ((c = document.createElement("div")).className = "jsoneditor-icon", e2.appendChild(c), (p = document.createElement("div")).className = "jsoneditor-text", p.appendChild(document.createTextNode((0, H.Iu)(a.text))), e2.appendChild(p)), o.push(r)); }); }(C, this.dom.items, f), this.maxHeight = 0, f.forEach(function(l) { l = 24 * (f.length + (l.submenu ? l.submenu.length : 0)), y.maxHeight = Math.max(y.maxHeight, l); }); } var N, A; return N = P, (A = [{ key: "_getVisibleButtons", value: function() { var f = [], R = this; return this.dom.items.forEach(function(y) { f.push(y.button), y.buttonExpand && f.push(y.buttonExpand), y.subItems && y === R.expandedItem && y.subItems.forEach(function(C) { f.push(C.button), C.buttonExpand && f.push(C.buttonExpand); }); }), f; } }, { key: "show", value: function(f, o, y) { this.hide(); var C = true, h = f.parentNode, d = f.getBoundingClientRect(), h = h.getBoundingClientRect(), l = o.getBoundingClientRect(), n = this, o = (this.dom.absoluteAnchor = (0, U.w)(f, o, function() { n.hide(); }), d.bottom + this.maxHeight < l.bottom || d.top - this.maxHeight > l.top && (C = false), y ? 0 : d.top - h.top); C ? (y = f.offsetHeight, this.dom.menu.style.left = "0", this.dom.menu.style.top = o + y + "px", this.dom.menu.style.bottom = "") : (this.dom.menu.style.left = "0", this.dom.menu.style.top = "", this.dom.menu.style.bottom = "0px"), this.limitHeight && (h = C ? l.bottom - d.bottom - 10 : d.top - l.top - 10, this.dom.list.style.maxHeight = h + "px", this.dom.list.style.overflowY = "auto"), this.dom.absoluteAnchor.appendChild(this.dom.root), this.selection = (0, x.getSelection)(), this.anchor = f, setTimeout(function() { n.dom.focusButton.focus(); }, 0), P.visibleMenu && P.visibleMenu.hide(), P.visibleMenu = this; } }, { key: "hide", value: function() { this.dom.absoluteAnchor && (this.dom.absoluteAnchor.destroy(), delete this.dom.absoluteAnchor), this.dom.root.parentNode && (this.dom.root.parentNode.removeChild(this.dom.root), this.onClose) && this.onClose(), P.visibleMenu === this && (P.visibleMenu = void 0); } }, { key: "_onExpandItem", value: function(f) { var R, y = this, C = f === this.expandedItem, d = this.expandedItem; d && (d.ul.style.height = "0", d.ul.style.padding = "", setTimeout(function() { y.expandedItem !== d && (d.ul.style.display = "", x.removeClassName)(d.ul.parentNode, "jsoneditor-selected"); }, 300), this.expandedItem = void 0), C || ((R = f.ul).style.display = "block", R.clientHeight, setTimeout(function() { if (y.expandedItem === f) { for (var h = 0, l = 0; l < R.childNodes.length; l++) h += R.childNodes[l].clientHeight; R.style.height = h + "px", R.style.padding = "5px 10px"; } }, 0), (0, x.addClassName)(R.parentNode, "jsoneditor-selected"), this.expandedItem = f); } }, { key: "_onKeyDown", value: function(f) { var R, y, C, d, h = f.target, l = f.which, n = false; l === 27 ? (this.selection && (0, x.setSelection)(this.selection), this.anchor && this.anchor.focus(), this.hide(), n = true) : l === 9 ? f.shiftKey ? (y = (R = this._getVisibleButtons()).indexOf(h)) === 0 && (R[R.length - 1].focus(), n = true) : (y = (R = this._getVisibleButtons()).indexOf(h)) === R.length - 1 && (R[0].focus(), n = true) : l === 37 ? (h.className === "jsoneditor-expand" && (y = (R = this._getVisibleButtons()).indexOf(h), C = R[y - 1]) && C.focus(), n = true) : l === 38 ? (y = (R = this._getVisibleButtons()).indexOf(h), (C = (C = (C = R[y - 1]) && C.className === "jsoneditor-expand" ? R[y - 2] : C) || R[R.length - 1]) && C.focus(), n = true) : l === 39 ? (y = (R = this._getVisibleButtons()).indexOf(h), (d = R[y + 1]) && d.className === "jsoneditor-expand" && d.focus(), n = true) : l === 40 && (y = (R = this._getVisibleButtons()).indexOf(h), (d = (d = (d = R[y + 1]) && d.className === "jsoneditor-expand" ? R[y + 2] : d) || R[0]) && (d.focus(), n = true), n = true), n && (f.stopPropagation(), f.preventDefault()); } }]) && j(N.prototype, A), Object.defineProperty(N, "prototype", { writable: false }), P; }(); Y.visibleMenu = void 0; }, 6436: function(le, m, D) { function U(z) { return (U = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(j) { return typeof j; } : function(j) { return j && typeof Symbol == "function" && j.constructor === Symbol && j !== Symbol.prototype ? "symbol" : typeof j; })(z); } function x(z, j) { for (var Y = 0; Y < j.length; Y++) { var P = j[Y]; P.enumerable = P.enumerable || false, P.configurable = true, "value" in P && (P.writable = true), Object.defineProperty(z, function(N) { return N = function(A, f) { if (U(A) !== "object" || A === null) return A; var R = A[Symbol.toPrimitive]; if (R === void 0) return (f === "string" ? String : Number)(A); if (R = R.call(A, f || "default"), U(R) !== "object") return R; throw new TypeError("@@toPrimitive must return a primitive value."); }(N, "string"), U(N) === "symbol" ? N : String(N); }(P.key), P); } } D.d(m, { Q: function() { return H; } }); var H = function() { function z(N) { if (!(this instanceof z)) throw new TypeError("Cannot call a class as a function"); this.errorTableVisible = N.errorTableVisible, this.onToggleVisibility = N.onToggleVisibility, this.onFocusLine = N.onFocusLine || function() { }, this.onChangeHeight = N.onChangeHeight, this.dom = {}; var N = document.createElement("div"), A = (N.className = "jsoneditor-validation-errors-container", this.dom.validationErrorsContainer = N, document.createElement("div")), N = (A.style.display = "none", A.className = "jsoneditor-additional-errors fadein", A.textContent = "Scroll for more ▿", this.dom.additionalErrorsIndication = A, N.appendChild(A), document.createElement("span")), A = (N.className = "jsoneditor-validation-error-icon", N.style.display = "none", this.dom.validationErrorIcon = N, document.createElement("span")); A.className = "jsoneditor-validation-error-count", A.style.display = "none", this.dom.validationErrorCount = A, this.dom.parseErrorIndication = document.createElement("span"), this.dom.parseErrorIndication.className = "jsoneditor-parse-error-icon", this.dom.parseErrorIndication.style.display = "none"; } var j, Y; return j = z, (Y = [{ key: "getErrorTable", value: function() { return this.dom.validationErrorsContainer; } }, { key: "getErrorCounter", value: function() { return this.dom.validationErrorCount; } }, { key: "getWarningIcon", value: function() { return this.dom.validationErrorIcon; } }, { key: "getErrorIcon", value: function() { return this.dom.parseErrorIndication; } }, { key: "toggleTableVisibility", value: function() { this.errorTableVisible = !this.errorTableVisible, this.onToggleVisibility(this.errorTableVisible); } }, { key: "setErrors", value: function(P, N) { var A, f, R = this, y = (this.dom.validationErrors && (this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors), this.dom.validationErrors = null, this.dom.additionalErrorsIndication.style.display = "none"), this.errorTableVisible && 0 < P.length ? ((y = document.createElement("div")).className = "jsoneditor-validation-errors", (f = document.createElement("table")).className = "jsoneditor-text-errors", y.appendChild(f), A = document.createElement("tbody"), f.appendChild(A), P.forEach(function(C) { isNaN(C.line) ? C.dataPath && (h = N.find(function(o) { return o.path === C.dataPath; })) && (d = h.line + 1) : d = C.line; var d, h = document.createElement("tr"), l = (h.className = isNaN(d) ? "" : "jump-to-line", C.type === "error" ? h.className += " parse-error" : h.className += " validation-error", document.createElement("td")), n = document.createElement("button"), n = (n.className = "jsoneditor-schema-error", l.appendChild(n), h.appendChild(l), document.createElement("td")); n.style = "white-space: nowrap;", n.textContent = isNaN(d) ? "" : "Ln " + d, h.appendChild(n), typeof C == "string" ? ((l = document.createElement("td")).colSpan = 2, (n = document.createElement("pre")).appendChild(document.createTextNode(C)), l.appendChild(n), h.appendChild(l)) : ((n = document.createElement("td")).appendChild(document.createTextNode(C.dataPath || "")), h.appendChild(n), l = document.createElement("td"), (n = document.createElement("pre")).appendChild(document.createTextNode(C.message.replace(/
/gi, ` `))), l.appendChild(n), h.appendChild(l)), h.onclick = function() { R.onFocusLine(d); }, A.appendChild(h); }), this.dom.validationErrors = y, this.dom.validationErrorsContainer.appendChild(y), this.dom.additionalErrorsIndication.title = P.length + " errors total", this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight ? (this.dom.additionalErrorsIndication.style.display = "block", this.dom.validationErrorsContainer.onscroll = function() { R.dom.additionalErrorsIndication.style.display = 0 < R.dom.validationErrorsContainer.clientHeight && R.dom.validationErrorsContainer.scrollTop === 0 ? "block" : "none"; }) : this.dom.validationErrorsContainer.onscroll = void 0, f = this.dom.validationErrorsContainer.clientHeight + (this.dom.statusBar ? this.dom.statusBar.clientHeight : 0), this.onChangeHeight(f)) : this.onChangeHeight(0), P.filter(function(C) { return C.type !== "error"; }).length); 0 < y ? (this.dom.validationErrorCount.style.display = "inline", this.dom.validationErrorCount.innerText = y, this.dom.validationErrorCount.onclick = this.toggleTableVisibility.bind(this), this.dom.validationErrorIcon.style.display = "inline", this.dom.validationErrorIcon.title = y + " schema validation error(s) found", this.dom.validationErrorIcon.onclick = this.toggleTableVisibility.bind(this)) : (this.dom.validationErrorCount.style.display = "none", this.dom.validationErrorIcon.style.display = "none"), P.some(function(C) { return C.type === "error"; }) ? (f = P[0].line, this.dom.parseErrorIndication.style.display = "block", this.dom.parseErrorIndication.title = isNaN(f) ? "parse error - check that the json is valid" : "parse error on line " + f, this.dom.parseErrorIndication.onclick = this.toggleTableVisibility.bind(this)) : this.dom.parseErrorIndication.style.display = "none"; } }]) && x(j.prototype, Y), Object.defineProperty(j, "prototype", { writable: false }), z; }(); }, 2474: function(le, m, D) { function U(z) { return (U = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(j) { return typeof j; } : function(j) { return j && typeof Symbol == "function" && j.constructor === Symbol && j !== Symbol.prototype ? "symbol" : typeof j; })(z); } function x(z, j) { for (var Y = 0; Y < j.length; Y++) { var P = j[Y]; P.enumerable = P.enumerable || false, P.configurable = true, "value" in P && (P.writable = true), Object.defineProperty(z, function(N) { return N = function(A, f) { if (U(A) !== "object" || A === null) return A; var R = A[Symbol.toPrimitive]; if (R === void 0) return (f === "string" ? String : Number)(A); if (R = R.call(A, f || "default"), U(R) !== "object") return R; throw new TypeError("@@toPrimitive must return a primitive value."); }(N, "string"), U(N) === "symbol" ? N : String(N); }(P.key), P); } } D.d(m, { R: function() { return H; } }); var H = function() { function z(P) { if (!(this instanceof z)) throw new TypeError("Cannot call a class as a function"); if (this.target = P.target || null, !this.target) throw new Error('FocusTracker constructor called without a "target" to track.'); this.onFocus = typeof P.onFocus == "function" ? P.onFocus : null, this.onBlur = typeof P.onBlur == "function" ? P.onBlur : null, this._onClick = this._onEvent.bind(this), this._onKeyUp = (function(N) { N.which !== 9 && N.keyCode !== 9 || this._onEvent(N); }).bind(this), this._onBlur = this._onEvent.bind(this), this.focusFlag = false, this.firstEventFlag = true, (this.onFocus || this.onBlur) && (document.addEventListener("click", this._onClick), document.addEventListener("keyup", this._onKeyUp), document.addEventListener("blur", this._onBlur)); } var j, Y; return j = z, (Y = [{ key: "destroy", value: function() { document.removeEventListener("click", this._onClick), document.removeEventListener("keyup", this._onKeyUp), document.removeEventListener("blur", this._onBlur), this._onEvent({ target: document.body }); } }, { key: "_onEvent", value: function(P) { P = P.target, P = P === this.target || !(!this.target.contains(P) && !this.target.contains(document.activeElement)), P ? this.focusFlag || (this.onFocus && this.onFocus({ type: "focus", target: this.target }), this.focusFlag = true) : (this.focusFlag || this.firstEventFlag) && (this.onBlur && this.onBlur({ type: "blur", target: this.target }), this.focusFlag = false, this.firstEventFlag) && (this.firstEventFlag = false); } }]) && x(j.prototype, Y), Object.defineProperty(j, "prototype", { writable: false }), z; }(); }, 3161: function(le, m, D) { var U = D(8170), x = D(8037), H = D(8038).treeModeMixins, z = D(8458).textModeMixins, j = D(341).previewModeMixins, R = D(9791), Y = R.clear, P = R.extend, N = R.getInnerText, A = R.getInternetExplorerVersion, f = R.parse, R = D(2744).tryRequireAjv, y = D(2558).showTransformModal, C = D(6210).showSortModal, d = R(); function h(l, n, o) { if (!(this instanceof h)) throw new Error('JSONEditor constructor called without "new".'); var i = A(); if (i !== -1 && i < 9) throw new Error("Unsupported browser, IE9 or newer required. Please install the newest version of your browser."); n && (n.error && (n.onError = n.error, delete n.error), n.change && (n.onChange = n.change, delete n.change), n.editable && (n.onEditable = n.editable, delete n.editable), n.onChangeJSON && (n.mode === "text" || n.mode === "code" || n.modes && (n.modes.indexOf("text") !== -1 || n.modes.indexOf("code"))), n) && Object.keys(n).forEach(function(a) { h.VALID_OPTIONS.indexOf(a); }), arguments.length && this._create(l, n, o); } h.modes = {}, h.prototype.DEBOUNCE_INTERVAL = 150, h.VALID_OPTIONS = ["ajv", "schema", "schemaRefs", "templates", "ace", "theme", "autocomplete", "onChange", "onChangeJSON", "onChangeText", "onExpand", "onEditable", "onError", "onEvent", "onModeChange", "onNodeName", "onValidate", "onCreateMenu", "onSelectionChange", "onTextSelectionChange", "onClassName", "onFocus", "onBlur", "colorPicker", "onColorPicker", "timestampTag", "timestampFormat", "escapeUnicode", "history", "search", "mode", "modes", "name", "indentation", "sortObjectKeys", "navigationBar", "statusBar", "mainMenuBar", "languages", "language", "enableSort", "enableTransform", "limitDragging", "maxVisibleChilds", "onValidationError", "modalAnchor", "popupAnchor", "createQuery", "executeQuery", "queryDescription", "allowSchemaSuggestions", "showErrorTable"], h.prototype._create = function(l, n, o) { this.container = l, this.options = n || {}, this.json = o || {}, l = this.options.mode || this.options.modes && this.options.modes[0] || "tree", this.setMode(l); }, h.prototype.destroy = function() { }, h.prototype.set = function(l) { this.json = l; }, h.prototype.get = function() { return this.json; }, h.prototype.setText = function(l) { this.json = f(l); }, h.prototype.getText = function() { return JSON.stringify(this.json); }, h.prototype.setName = function(l) { this.options || (this.options = {}), this.options.name = l; }, h.prototype.getName = function() { return this.options && this.options.name; }, h.prototype.setMode = function(l) { if (l !== this.options.mode || !this.create) { var n = this.container, o = P({}, this.options), i = o.mode, a = (o.mode = l, h.modes[l]); if (!a) throw new Error('Unknown mode "' + o.mode + '"'); var r = a.data === "text", e2 = this.getName(), t = this[r ? "getText" : "get"](); if (this.destroy(), Y(this), P(this, a.mixin), this.create(n, o), this.setName(e2), this[r ? "setText" : "set"](t), typeof a.load == "function") try { a.load.call(this); } catch { } if (typeof o.onModeChange == "function" && l !== i) try { o.onModeChange(l, i); } catch { } } }, h.prototype.getMode = function() { return this.options.mode; }, h.prototype._onError = function(l) { this.options && typeof this.options.onError == "function" ? this.options.onError(l) : window.alert(l.toString()); }, h.prototype.setSchema = function(l, n) { if (l) { var o; try { this.options.ajv ? o = this.options.ajv : ((o = d({ allErrors: true, verbose: true, schemaId: "auto", $data: true })).addMetaSchema(D(7171)), o.addMetaSchema(D(6273))); } catch { } if (o) { if (n) { for (var i in n) o.removeSchema(i), n[i] && o.addSchema(n[i], i); this.options.schemaRefs = n; } this.validateSchema = o.compile(l), this.options.schema = l, this.options.schemaRefs = n, this.validate(); } } else this.validateSchema = null, this.options.schema = null, this.options.schemaRefs = null, this.validate(); this.refresh(), typeof this._onSchemaChange == "function" && this._onSchemaChange(l, n); }, h.prototype.validate = function() { }, h.prototype.refresh = function() { }, (h.registerMode = function(l) { var n; if (Array.isArray(l)) for (a = 0; a < l.length; a++) h.registerMode(l[a]); else { if (!("mode" in l)) throw new Error('Property "mode" missing'); if (!("mixin" in l)) throw new Error('Property "mixin" missing'); if (!("data" in l)) throw new Error('Property "data" missing'); var o = l.mode; if (o in h.modes) throw new Error('Mode "' + o + '" already registered'); if (typeof l.mixin.create != "function") throw new Error('Required function "create" missing on mixin'); for (var i = ["setMode", "registerMode", "modes"], a = 0; a < i.length; a++) if ((n = i[a]) in l.mixin) throw new Error('Reserved property "' + n + '" not allowed in mixin'); h.modes[o] = l; } })(H), h.registerMode(z), h.registerMode(j), h.ace = U, h.Ajv = d, h.VanillaPicker = x, h.showTransformModal = y, h.showSortModal = C, h.getInnerText = N, le.exports = h.default = h; }, 6617: function(le, m, D) { D.d(m, { x: function() { return j; } }); var U = D(897), x = D(7907); function H(Y) { return (H = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(P) { return typeof P; } : function(P) { return P && typeof Symbol == "function" && P.constructor === Symbol && P !== Symbol.prototype ? "symbol" : typeof P; })(Y); } function z(Y, P) { for (var N = 0; N < P.length; N++) { var A = P[N]; A.enumerable = A.enumerable || false, A.configurable = true, "value" in A && (A.writable = true), Object.defineProperty(Y, function(f) { return f = function(R, y) { if (H(R) !== "object" || R === null) return R; var C = R[Symbol.toPrimitive]; if (C === void 0) return (y === "string" ? String : Number)(R); if (C = C.call(R, y || "default"), H(C) !== "object") return C; throw new TypeError("@@toPrimitive must return a primitive value."); }(f, "string"), H(f) === "symbol" ? f : String(f); }(A.key), A); } } var j = function() { function Y(A, f, R, y) { if (!(this instanceof Y)) throw new TypeError("Cannot call a class as a function"); for (var C = { code: { text: (0, x.Iu)("modeCodeText"), title: (0, x.Iu)("modeCodeTitle"), click: function() { y("code"); } }, form: { text: (0, x.Iu)("modeFormText"), title: (0, x.Iu)("modeFormTitle"), click: function() { y("form"); } }, text: { text: (0, x.Iu)("modeTextText"), title: (0, x.Iu)("modeTextTitle"), click: function() { y("text"); } }, tree: { text: (0, x.Iu)("modeTreeText"), title: (0, x.Iu)("modeTreeTitle"), click: function() { y("tree"); } }, view: { text: (0, x.Iu)("modeViewText"), title: (0, x.Iu)("modeViewTitle"), click: function() { y("view"); } }, preview: { text: (0, x.Iu)("modePreviewText"), title: (0, x.Iu)("modePreviewTitle"), click: function() { y("preview"); } } }, d = [], h = 0; h < f.length; h++) { var l = f[h], n = C[l]; if (!n) throw new Error('Unknown mode "' + l + '"'); n.className = "jsoneditor-type-modes" + (R === l ? " jsoneditor-selected" : ""), d.push(n); } var i = C[R]; if (!i) throw new Error('Unknown mode "' + R + '"'); var i = i.text, o = document.createElement("button"), i = (o.type = "button", o.className = "jsoneditor-modes jsoneditor-separator", o.textContent = i + " ▾", o.title = (0, x.Iu)("modeEditorTitle"), o.onclick = function() { new U.x(d).show(o, A); }, document.createElement("div")); i.className = "jsoneditor-modes", i.style.position = "relative", i.appendChild(o), A.appendChild(i), this.dom = { container: A, box: o, frame: i }; } var P, N; return P = Y, (N = [{ key: "focus", value: function() { this.dom.box.focus(); } }, { key: "destroy", value: function() { this.dom && this.dom.frame && this.dom.frame.parentNode && this.dom.frame.parentNode.removeChild(this.dom.frame), this.dom = null; } }]) && z(P.prototype, N), Object.defineProperty(P, "prototype", { writable: false }), Y; }(); }, 8170: function(le, m, D) { var U; if (window.ace) U = window.ace; else try { U = D(6225), D(4091), D(3330), D(4317); var x = D(7923); U.config.setModuleUrl("ace/mode/json_worker", x); } catch { } le.exports = U; }, 4864: function() { window.ace.define("ace/theme/jsoneditor", ["require", "exports", "module", "ace/lib/dom"], function(le, m, D) { m.isDark = false, m.cssClass = "ace-jsoneditor", m.cssText = `.ace-jsoneditor .ace_gutter { background: #ebebeb; color: #333 } .ace-jsoneditor.ace_editor { line-height: 1.3; background-color: #fff; } .ace-jsoneditor .ace_print-margin { width: 1px; background: #e8e8e8 } .ace-jsoneditor .ace_scroller { background-color: #FFFFFF } .ace-jsoneditor .ace_text-layer { color: gray } .ace-jsoneditor .ace_variable { color: #1a1a1a } .ace-jsoneditor .ace_cursor { border-left: 2px solid #000000 } .ace-jsoneditor .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } .ace-jsoneditor .ace_marker-layer .ace_selection { background: lightgray } .ace-jsoneditor.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px #FFFFFF; border-radius: 2px } .ace-jsoneditor .ace_marker-layer .ace_step { background: rgb(255, 255, 0) } .ace-jsoneditor .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid #BFBFBF } .ace-jsoneditor .ace_marker-layer .ace_active-line { background: #FFFBD1 } .ace-jsoneditor .ace_gutter-active-line { background-color : #dcdcdc } .ace-jsoneditor .ace_marker-layer .ace_selected-word { border: 1px solid lightgray } .ace-jsoneditor .ace_invisible { color: #BFBFBF } .ace-jsoneditor .ace_keyword, .ace-jsoneditor .ace_meta, .ace-jsoneditor .ace_support.ace_constant.ace_property-value { color: #AF956F } .ace-jsoneditor .ace_keyword.ace_operator { color: #484848 } .ace-jsoneditor .ace_keyword.ace_other.ace_unit { color: #96DC5F } .ace-jsoneditor .ace_constant.ace_language { color: darkorange } .ace-jsoneditor .ace_constant.ace_numeric { color: red } .ace-jsoneditor .ace_constant.ace_character.ace_entity { color: #BF78CC } .ace-jsoneditor .ace_invalid { color: #FFFFFF; background-color: #FF002A; } .ace-jsoneditor .ace_fold { background-color: #AF956F; border-color: #000000 } .ace-jsoneditor .ace_storage, .ace-jsoneditor .ace_support.ace_class, .ace-jsoneditor .ace_support.ace_function, .ace-jsoneditor .ace_support.ace_other, .ace-jsoneditor .ace_support.ace_type { color: #C52727 } .ace-jsoneditor .ace_string { color: green } .ace-jsoneditor .ace_comment { color: #BCC8BA } .ace-jsoneditor .ace_entity.ace_name.ace_tag, .ace-jsoneditor .ace_entity.ace_other.ace_attribute-name { color: #606060 } .ace-jsoneditor .ace_markup.ace_underline { text-decoration: underline } .ace-jsoneditor .ace_indent-guide { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y }`, le("../lib/dom").importCssString(m.cssText, m.cssClass); }); }, 6589: function(le, m) { (D = { trace: function() { }, yy: {}, symbols_: { error: 2, JSONString: 3, STRING: 4, JSONNumber: 5, NUMBER: 6, JSONNullLiteral: 7, NULL: 8, JSONBooleanLiteral: 9, TRUE: 10, FALSE: 11, JSONText: 12, JSONValue: 13, EOF: 14, JSONObject: 15, JSONArray: 16, "{": 17, "}": 18, JSONMemberList: 19, JSONMember: 20, ":": 21, ",": 22, "[": 23, "]": 24, JSONElementList: 25, $accept: 0, $end: 1 }, terminals_: { 2: "error", 4: "STRING", 6: "NUMBER", 8: "NULL", 10: "TRUE", 11: "FALSE", 14: "EOF", 17: "{", 18: "}", 21: ":", 22: ",", 23: "[", 24: "]" }, productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]], performAction: function(U, x, H, z, j, Y, P) { var N = Y.length - 1; switch (j) { case 1: this.$ = U.replace(/\\(\\|")/g, "$1").replace(/\\n/g, ` `).replace(/\\r/g, "\r").replace(/\\t/g, " ").replace(/\\v/g, "\v").replace(/\\f/g, "\f").replace(/\\b/g, "\b"); break; case 2: this.$ = Number(U); break; case 3: this.$ = null; break; case 4: this.$ = true; break; case 5: this.$ = false; break; case 6: return this.$ = Y[N - 1]; case 13: this.$ = {}; break; case 14: this.$ = Y[N - 1]; break; case 15: this.$ = [Y[N - 2], Y[N]]; break; case 16: this.$ = {}, this.$[Y[N][0]] = Y[N][1]; break; case 17: this.$ = Y[N - 2], Y[N - 2][Y[N][0]] = Y[N][1]; break; case 18: this.$ = []; break; case 19: this.$ = Y[N - 1]; break; case 20: this.$ = [Y[N]]; break; case 21: this.$ = Y[N - 2], Y[N - 2].push(Y[N]); } }, table: [{ 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 12: 1, 13: 2, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 1: [3] }, { 14: [1, 16] }, { 14: [2, 7], 18: [2, 7], 22: [2, 7], 24: [2, 7] }, { 14: [2, 8], 18: [2, 8], 22: [2, 8], 24: [2, 8] }, { 14: [2, 9], 18: [2, 9], 22: [2, 9], 24: [2, 9] }, { 14: [2, 10], 18: [2, 10], 22: [2, 10], 24: [2, 10] }, { 14: [2, 11], 18: [2, 11], 22: [2, 11], 24: [2, 11] }, { 14: [2, 12], 18: [2, 12], 22: [2, 12], 24: [2, 12] }, { 14: [2, 3], 18: [2, 3], 22: [2, 3], 24: [2, 3] }, { 14: [2, 4], 18: [2, 4], 22: [2, 4], 24: [2, 4] }, { 14: [2, 5], 18: [2, 5], 22: [2, 5], 24: [2, 5] }, { 14: [2, 1], 18: [2, 1], 21: [2, 1], 22: [2, 1], 24: [2, 1] }, { 14: [2, 2], 18: [2, 2], 22: [2, 2], 24: [2, 2] }, { 3: 20, 4: [1, 12], 18: [1, 17], 19: 18, 20: 19 }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 23, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15], 24: [1, 21], 25: 22 }, { 1: [2, 6] }, { 14: [2, 13], 18: [2, 13], 22: [2, 13], 24: [2, 13] }, { 18: [1, 24], 22: [1, 25] }, { 18: [2, 16], 22: [2, 16] }, { 21: [1, 26] }, { 14: [2, 18], 18: [2, 18], 22: [2, 18], 24: [2, 18] }, { 22: [1, 28], 24: [1, 27] }, { 22: [2, 20], 24: [2, 20] }, { 14: [2, 14], 18: [2, 14], 22: [2, 14], 24: [2, 14] }, { 3: 20, 4: [1, 12], 20: 29 }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 30, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 14: [2, 19], 18: [2, 19], 22: [2, 19], 24: [2, 19] }, { 3: 5, 4: [1, 12], 5: 6, 6: [1, 13], 7: 3, 8: [1, 9], 9: 4, 10: [1, 10], 11: [1, 11], 13: 31, 15: 7, 16: 8, 17: [1, 14], 23: [1, 15] }, { 18: [2, 17], 22: [2, 17] }, { 18: [2, 15], 22: [2, 15] }, { 22: [2, 21], 24: [2, 21] }], defaultActions: { 16: [2, 6] }, parseError: function(U, x) { throw new Error(U); }, parse: function(U) { var x = this, H = [0], z = [null], j = [], Y = this.table, P = "", N = 0, A = 0, f = 0, R = (this.lexer.setInput(U), this.lexer.yy = this.yy, this.yy.lexer = this.lexer, this.lexer.yylloc === void 0 && (this.lexer.yylloc = {}), this.lexer.yylloc); function y() { var s = x.lexer.lex() || 1; return s = typeof s != "number" && x.symbols_[s] || s; } j.push(R), typeof this.yy.parseError == "function" && (this.parseError = this.yy.parseError); for (var C, d, h, l, n, o, i, a, r, e2 = {}; ; ) { if (h = H[H.length - 1], (l = this.defaultActions[h] || (C == null && (C = y()), Y[h] && Y[h][C])) === void 0 || !l.length || !l[0]) { if (!f) { for (n in a = [], Y[h]) this.terminals_[n] && 2 < n && a.push("'" + this.terminals_[n] + "'"); var t = "", t = this.lexer.showPosition ? "Parse error on line " + (N + 1) + `: ` + this.lexer.showPosition() + ` Expecting ` + a.join(", ") + ", got '" + this.terminals_[C] + "'" : "Parse error on line " + (N + 1) + ": Unexpected " + (C == 1 ? "end of input" : "'" + (this.terminals_[C] || C) + "'"); this.parseError(t, { text: this.lexer.match, token: this.terminals_[C] || C, line: this.lexer.yylineno, loc: R, expected: a }); } if (f == 3) { if (C == 1) throw new Error(t || "Parsing halted."); A = this.lexer.yyleng, P = this.lexer.yytext, N = this.lexer.yylineno, R = this.lexer.yylloc, C = y(); } for (; !(2 .toString() in Y[h]); ) { if (h == 0) throw new Error(t || "Parsing halted."); r = 1, H.length = H.length - 2 * r, z.length = z.length - r, j.length = j.length - r, h = H[H.length - 1]; } d = C, C = 2, l = Y[h = H[H.length - 1]] && Y[h][2], f = 3; } if (l[0] instanceof Array && 1 < l.length) throw new Error("Parse Error: multiple actions possible at state: " + h + ", token: " + C); switch (l[0]) { case 1: H.push(C), z.push(this.lexer.yytext), j.push(this.lexer.yylloc), H.push(l[1]), C = null, d ? (C = d, d = null) : (A = this.lexer.yyleng, P = this.lexer.yytext, N = this.lexer.yylineno, R = this.lexer.yylloc, 0 < f && f--); break; case 2: if (o = this.productions_[l[1]][1], e2.$ = z[z.length - o], e2._$ = { first_line: j[j.length - (o || 1)].first_line, last_line: j[j.length - 1].last_line, first_column: j[j.length - (o || 1)].first_column, last_column: j[j.length - 1].last_column }, (i = this.performAction.call(e2, P, A, N, this.yy, l[1], z, j)) !== void 0) return i; o && (H = H.slice(0, -1 * o * 2), z = z.slice(0, -1 * o), j = j.slice(0, -1 * o)), H.push(this.productions_[l[1]][0]), z.push(e2.$), j.push(e2._$), i = Y[H[H.length - 2]][H[H.length - 1]], H.push(i); break; case 3: return true; } } return true; } }).lexer = { EOF: 1, parseError: function(U, x) { if (!this.yy.parseError) throw new Error(U); this.yy.parseError(U, x); }, setInput: function(U) { return this._input = U, this._more = this._less = this.done = false, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = "", this.conditionStack = ["INITIAL"], this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }, this; }, input: function() { var U = this._input[0]; return this.yytext += U, this.yyleng++, this.match += U, this.matched += U, U.match(/\n/) && this.yylineno++, this._input = this._input.slice(1), U; }, unput: function(U) { return this._input = U + this._input, this; }, more: function() { return this._more = true, this; }, less: function(U) { this._input = this.match.slice(U) + this._input; }, pastInput: function() { var U = this.matched.substr(0, this.matched.length - this.match.length); return (20 < U.length ? "..." : "") + U.substr(-20).replace(/\n/g, ""); }, upcomingInput: function() { var U = this.match; return U.length < 20 && (U += this._input.substr(0, 20 - U.length)), (U.substr(0, 20) + (20 < U.length ? "..." : "")).replace(/\n/g, ""); }, showPosition: function() { var U = this.pastInput(), x = new Array(U.length + 1).join("-"); return U + this.upcomingInput() + ` ` + x + "^"; }, next: function() { if (this.done) return this.EOF; this._input || (this.done = true), this._more || (this.yytext = "", this.match = ""); for (var U, x, H, z, j = this._currentRules(), Y = 0; Y < j.length && (!(x = this._input.match(this.rules[j[Y]])) || U && !(x[0].length > U[0].length) || (U = x, H = Y, this.options.flex)); Y++) ; return U ? ((z = U[0].match(/\n.*/g)) && (this.yylineno += z.length), this.yylloc = { first_line: this.yylloc.last_line, last_line: this.yylineno + 1, first_column: this.yylloc.last_column, last_column: z ? z[z.length - 1].length - 1 : this.yylloc.last_column + U[0].length }, this.yytext += U[0], this.match += U[0], this.yyleng = this.yytext.length, this._more = false, this._input = this._input.slice(U[0].length), this.matched += U[0], z = this.performAction.call(this, this.yy, this, j[H], this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = false), z || void 0) : this._input === "" ? this.EOF : void this.parseError("Lexical error on line " + (this.yylineno + 1) + `. Unrecognized text. ` + this.showPosition(), { text: "", token: null, line: this.yylineno }); }, lex: function() { var U = this.next(); return U !== void 0 ? U : this.lex(); }, begin: function(U) { this.conditionStack.push(U); }, popState: function() { return this.conditionStack.pop(); }, _currentRules: function() { return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; }, topState: function() { return this.conditionStack[this.conditionStack.length - 2]; }, pushState: function(U) { this.begin(U); }, options: {}, performAction: function(U, x, H, z) { switch (H) { case 0: break; case 1: return 6; case 2: return x.yytext = x.yytext.substr(1, x.yyleng - 2), 4; case 3: return 17; case 4: return 18; case 5: return 23; case 6: return 24; case 7: return 22; case 8: return 21; case 9: return 10; case 10: return 11; case 11: return 8; case 12: return 14; case 13: return "INVALID"; } }, rules: [/^(?:\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/, /^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/, /^(?:\{)/, /^(?:\})/, /^(?:\[)/, /^(?:\])/, /^(?:,)/, /^(?::)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:null\b)/, /^(?:$)/, /^(?:.)/], conditions: { INITIAL: { rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], inclusive: true } } }; var D; m.parser = D, m.parse = D.parse.bind(D); }, 3879: function(le) { function m() { } m.prototype = { on: function(N, A) { this._events = this._events || {}, this._events[N] = this._events[N] || [], this._events[N].push(A); }, off: function(N, A) { this._events = this._events || {}, N in this._events && this._events[N].splice(this._events[N].indexOf(A), 1); }, emit: function(N) { if (this._events = this._events || {}, N in this._events) for (var A = 0; A < this._events[N].length; A++) this._events[N][A].apply(this, Array.prototype.slice.call(arguments, 1)); } }, m.mixin = function(N) { for (var A = ["on", "off", "emit"], f = 0; f < A.length; f++) typeof N == "function" ? N.prototype[A[f]] = m.prototype[A[f]] : N[A[f]] = m.prototype[A[f]]; return N; }; var D = { escapeRegExp: function(N) { var A = /[\\^$.*+?()[\]{}|]/g, f = new RegExp(A.source); return N && f.test(N) ? N.replace(A, "\\$&") : N; }, extend: function(N, A) { for (var f in A) { var R; A.hasOwnProperty(f) && ((R = A[f]) && Object.prototype.toString.call(R) === "[object Object]" ? (N[f] = N[f] || {}, D.extend(N[f], R)) : N[f] = R); } return N; }, each: function(N, A, f) { if (Object.prototype.toString.call(N) === "[object Object]") for (var R in N) Object.prototype.hasOwnProperty.call(N, R) && A.call(f, R, N[R], N); else for (var y = 0, C = N.length; y < C; y++) A.call(f, y, N[y], N); }, createElement: function(N, A) { var f, R = document.createElement(N); if (A && Object.prototype.toString.call(A) === "[object Object]") for (f in A) f in R ? R[f] = A[f] : f === "html" ? R.innerHTML = A[f] : R.setAttribute(f, A[f]); return R; }, hasClass: function(N, A) { if (N) return N.classList ? N.classList.contains(A) : !!N.className && !!N.className.match(new RegExp("(\\s|^)" + A + "(\\s|$)")); }, addClass: function(N, A) { D.hasClass(N, A) || (N.classList ? N.classList.add(A) : N.className = N.className.trim() + " " + A); }, removeClass: function(N, A) { D.hasClass(N, A) && (N.classList ? N.classList.remove(A) : N.className = N.className.replace(new RegExp("(^|\\s)" + A.split(" ").join("|") + "(\\s|$)", "gi"), " ")); }, closest: function(N, A) { return N && N !== document.body && (A(N) ? N : D.closest(N.parentNode, A)); }, isInt: function(N) { return typeof N == "number" && isFinite(N) && Math.floor(N) === N; }, debounce: function(N, A, f) { var R; return function() { var y = this, C = arguments, d = f && !R; clearTimeout(R), R = setTimeout(function() { R = null, f || N.apply(y, C); }, A), d && N.apply(y, C); }; }, rect: function(R, C) { var f = window, R = R.getBoundingClientRect(), y = C ? f.pageXOffset : 0, C = C ? f.pageYOffset : 0; return { bottom: R.bottom + C, height: R.height, left: R.left + y, right: R.right + y, top: R.top + C, width: R.width }; }, includes: function(N, A) { return -1 < N.indexOf(A); }, startsWith: function(N, A) { return N.substr(0, A.length) === A; }, truncate: function(N) { for (; N.firstChild; ) N.removeChild(N.firstChild); } }; function U(N, A) { return N.hasOwnProperty(A) && (N[A] === true || N[A].length); } function x(N, A, f) { N.parentNode ? N.parentNode.parentNode || A.appendChild(N.parentNode) : A.appendChild(N), D.removeClass(N, "excluded"), f || (N.textContent = N.textContent); } function H() { var N, A; this.items.length && (N = document.createDocumentFragment(), this.config.pagination ? (A = this.pages.slice(0, this.pageIndex), D.each(A, function(f, R) { D.each(R, function(y, C) { x(C, N, this.customOption); }, this); }, this)) : D.each(this.items, function(f, R) { x(R, N, this.customOption); }, this), N.childElementCount && (D.removeClass(this.items[this.navIndex], "active"), this.navIndex = (N.querySelector(".selectr-option.selected") || N.querySelector(".selectr-option")).idx, D.addClass(this.items[this.navIndex], "active")), this.tree.appendChild(N)); } function z(N, A) { A = A || N; var f = { class: "selectr-option", role: "treeitem", "aria-selected": false }; return this.customOption ? f.html = this.config.renderOption(A) : f.textContent = N.textContent, (A = D.createElement("li", f)).idx = N.idx, this.items.push(A), N.defaultSelected && this.defaultSelected.push(N.idx), N.disabled && (A.disabled = true, D.addClass(A, "disabled")), A; } function j() { var N, A = this.tree, f = A.scrollTop; A.scrollHeight - A.offsetHeight <= f && this.pageIndex < this.pages.length && (N = document.createDocumentFragment(), D.each(this.pages[this.pageIndex], function(R, y) { x(y, N, this.customOption); }, this), A.appendChild(N), this.pageIndex++, this.emit("selectr.paginate", { items: this.items.length, total: this.data.length, page: this.pageIndex, pages: this.pages.length })); } function Y() { (this.config.searchable || this.config.taggable) && (this.input.value = null, this.searching = false, this.config.searchable && D.removeClass(this.inputContainer, "active"), D.hasClass(this.container, "notice") && (D.removeClass(this.container, "notice"), D.addClass(this.container, "open"), this.input.focus()), D.each(this.items, function(N, A) { D.removeClass(A, "excluded"), this.customOption || (A.textContent = A.textContent); }, this)); } function P(N, A) { if (!N) throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string."); if (typeof (this.el = N) == "string" && (this.el = document.querySelector(N)), this.el === null) throw new Error("The element you passed to Selectr can not be found."); if (this.el.nodeName.toLowerCase() !== "select") throw new Error("The element you passed to Selectr is not a HTMLSelectElement."); this.render(A); } P.prototype.render = function(N) { var A; this.rendered || ((this.el.selectr = this).config = D.extend({ defaultSelected: true, width: "auto", disabled: false, disabledMobile: false, searchable: true, clearable: false, sortSelected: false, allowDeselect: false, closeOnScroll: false, nativeDropdown: false, nativeKeyboard: false, placeholder: "Select an option...", taggable: false, tagPlaceholder: "Enter a tag...", messages: { noResults: "No results.", noOptions: "No options available.", maxSelections: "A maximum of {max} items can be selected.", tagDuplicate: "That tag is already in use.", searchPlaceholder: "Search options..." } }, N), this.originalType = this.el.type, this.originalIndex = this.el.tabIndex, this.defaultSelected = [], this.originalOptionCount = this.el.options.length, (this.config.multiple || this.config.taggable) && (this.el.multiple = true), this.disabled = U(this.config, "disabled"), this.opened = false, this.config.taggable && (this.config.searchable = false), this.navigating = false, this.mobileDevice = false, !this.config.disabledMobile && /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent) && (this.mobileDevice = true), this.customOption = this.config.hasOwnProperty("renderOption") && typeof this.config.renderOption == "function", this.customSelected = this.config.hasOwnProperty("renderSelection") && typeof this.config.renderSelection == "function", this.supportsEventPassiveOption = this.detectEventPassiveOption(), m.mixin(this), (function() { this.requiresPagination = this.config.pagination && 0 < this.config.pagination, U(this.config, "width") && (D.isInt(this.config.width) ? this.width = this.config.width + "px" : this.config.width === "auto" ? this.width = "100%" : D.includes(this.config.width, "%") && (this.width = this.config.width)), this.container = D.createElement("div", { class: "selectr-container" }), this.config.customClass && D.addClass(this.container, this.config.customClass), this.mobileDevice ? D.addClass(this.container, "selectr-mobile") : D.addClass(this.container, "selectr-desktop"), this.el.tabIndex = -1, this.config.nativeDropdown || this.mobileDevice ? D.addClass(this.el, "selectr-visible") : D.addClass(this.el, "selectr-hidden"), this.selected = D.createElement("div", { class: "selectr-selected", disabled: this.disabled, tabIndex: 0, "aria-expanded": false }), this.label = D.createElement(this.el.multiple ? "ul" : "span", { class: "selectr-label" }); var f = D.createElement("div", { class: "selectr-options-container" }); if (this.tree = D.createElement("ul", { class: "selectr-options", role: "tree", "aria-hidden": true, "aria-expanded": false }), this.notice = D.createElement("div", { class: "selectr-notice" }), this.el.setAttribute("aria-hidden", true), this.disabled && (this.el.disabled = true), this.el.multiple ? (D.addClass(this.label, "selectr-tags"), D.addClass(this.container, "multiple"), this.tags = [], this.selectedValues = this.config.defaultSelected ? this.getSelectedProperties("value") : [], this.selectedIndexes = this.getSelectedProperties("idx")) : (this.selectedValue = null, this.selectedIndex = -1), this.selected.appendChild(this.label), this.config.clearable && (this.selectClear = D.createElement("button", { class: "selectr-clear", type: "button" }), this.container.appendChild(this.selectClear), D.addClass(this.container, "clearable")), this.config.taggable) { var R = D.createElement("li", { class: "input-tag" }); if (this.input = D.createElement("input", { class: "selectr-tag-input", placeholder: this.config.tagPlaceholder, tagIndex: 0, autocomplete: "off", autocorrect: "off", autocapitalize: "off", spellcheck: "false", role: "textbox", type: "search" }), R.appendChild(this.input), this.label.appendChild(R), D.addClass(this.container, "taggable"), this.tagSeperators = [","], this.config.tagSeperators) { this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators); for (var y = [], C = 0; C < this.tagSeperators.length; C++) y.push(D.escapeRegExp(this.tagSeperators[C])); this.tagSeperatorsRegex = new RegExp(y.join("|"), "i"); } else this.tagSeperatorsRegex = new RegExp(",", "i"); } this.config.searchable && (this.input = D.createElement("input", { class: "selectr-input", tagIndex: -1, autocomplete: "off", autocorrect: "off", autocapitalize: "off", spellcheck: "false", role: "textbox", type: "search", placeholder: this.config.messages.searchPlaceholder }), this.inputClear = D.createElement("button", { class: "selectr-input-clear", type: "button" }), this.inputContainer = D.createElement("div", { class: "selectr-input-container" }), this.inputContainer.appendChild(this.input), this.inputContainer.appendChild(this.inputClear), f.appendChild(this.inputContainer)), f.appendChild(this.notice), f.appendChild(this.tree), this.items = [], this.options = [], this.el.options.length && (this.options = [].slice.call(this.el.options)); var d, h, l, n = false, o = 0; this.el.children.length && D.each(this.el.children, function(a, r) { r.nodeName === "OPTGROUP" ? (n = D.createElement("ul", { class: "selectr-optgroup", role: "group", html: "
  • " + r.label + "
  • " }), D.each(r.children, function(e2, t) { t.idx = o, n.appendChild(z.call(this, t, n)), o++; }, this)) : (r.idx = o, z.call(this, r), o++); }, this), this.config.data && Array.isArray(this.config.data) && (d = !(this.data = []), n = false, o = 0, D.each(this.config.data, function(a, r) { U(r, "children") ? (d = D.createElement("optgroup", { label: r.text }), n = D.createElement("ul", { class: "selectr-optgroup", role: "group", html: "
  • " + r.text + "
  • " }), D.each(r.children, function(e2, t) { (h = new Option(t.text, t.value, false, t.hasOwnProperty("selected") && t.selected === true)).disabled = U(t, "disabled"), this.options.push(h), d.appendChild(h), h.idx = o, n.appendChild(z.call(this, h, t)), this.data[o] = t, o++; }, this), this.el.appendChild(d)) : ((h = new Option(r.text, r.value, false, r.hasOwnProperty("selected") && r.selected === true)).disabled = U(r, "disabled"), this.options.push(h), h.idx = o, z.call(this, h, r), this.data[o] = r, o++); }, this)), this.setSelected(true); for (var i = this.navIndex = 0; i < this.items.length; i++) if (l = this.items[i], !D.hasClass(l, "disabled")) { D.addClass(l, "active"), this.navIndex = i; break; } this.requiresPagination && (this.pageIndex = 1, this.paginate()), this.container.appendChild(this.selected), this.container.appendChild(f), this.placeEl = D.createElement("div", { class: "selectr-placeholder" }), this.setPlaceholder(), this.selected.appendChild(this.placeEl), this.disabled && this.disable(), this.el.parentNode.insertBefore(this.container, this.el), this.container.appendChild(this.el); }).call(this), this.bindEvents(), this.update(), this.optsRect = D.rect(this.tree), this.rendered = true, this.el.multiple || (this.el.selectedIndex = this.selectedIndex), A = this, setTimeout(function() { A.emit("selectr.init"); }, 20)); }, P.prototype.getSelected = function() { return this.el.querySelectorAll("option:checked"); }, P.prototype.getSelectedProperties = function(N) { var A = this.getSelected(); return [].slice.call(A).map(function(f) { return f[N]; }).filter(function(f) { return f != null; }); }, P.prototype.detectEventPassiveOption = function() { var N = false; try { var A = Object.defineProperty({}, "passive", { get: function() { N = true; } }); window.addEventListener("test", null, A); } catch { } return N; }, P.prototype.bindEvents = function() { var N, A = this; this.events = {}, this.events.dismiss = (function(f) { f = f.target, this.container.contains(f) || !this.opened && !D.hasClass(this.container, "notice") || this.close(); }).bind(this), this.events.navigate = (function(f) { if (f = f || window.event, this.items.length && this.opened && D.includes([13, 38, 40], f.which)) { if (f.preventDefault(), f.which === 13) return !(this.noResults || this.config.taggable && 0 < this.input.value.length) && this.change(this.navIndex); var R, y = this.items[this.navIndex], C = this.navIndex; switch (f.which) { case 38: (R = 0) < this.navIndex && this.navIndex--; break; case 40: this.navIndex < this.items.length - (R = 1) && this.navIndex++; } for (this.navigating = true; D.hasClass(this.items[this.navIndex], "disabled") || D.hasClass(this.items[this.navIndex], "excluded"); ) { if (!(0 < this.navIndex && this.navIndex < this.items.length - 1)) { this.navIndex = C; break; } if (R ? this.navIndex++ : this.navIndex--, this.searching) { if (this.navIndex > this.tree.lastElementChild.idx) { this.navIndex = this.tree.lastElementChild.idx; break; } if (this.navIndex < this.tree.firstElementChild.idx) { this.navIndex = this.tree.firstElementChild.idx; break; } } } f = D.rect(this.items[this.navIndex]), R ? (this.navIndex === 0 ? this.tree.scrollTop = 0 : f.top + f.height > this.optsRect.top + this.optsRect.height && (this.tree.scrollTop = this.tree.scrollTop + (f.top + f.height - (this.optsRect.top + this.optsRect.height))), this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination && j.call(this)) : this.navIndex === 0 ? this.tree.scrollTop = 0 : f.top - this.optsRect.top < 0 && (this.tree.scrollTop = this.tree.scrollTop + (f.top - this.optsRect.top)), y && D.removeClass(y, "active"), D.addClass(this.items[this.navIndex], "active"); } else this.navigating = false; }).bind(this), this.events.reset = this.reset.bind(this), (this.config.nativeDropdown || this.mobileDevice) && (this.container.addEventListener("touchstart", function(f) { f.changedTouches[0].target === A.el && A.toggle(); }, !!this.supportsEventPassiveOption && { passive: true }), this.container.addEventListener("click", function(f) { f.target === A.el && A.toggle(); }), this.el.addEventListener("change", function(f) { f.__selfTriggered || (A.el.multiple ? (f = A.getSelectedProperties("idx"), f = function(R, y) { for (var C, d = [], h = R.slice(0), l = 0; l < y.length; l++) -1 < (C = h.indexOf(y[l])) ? h.splice(C, 1) : d.push(y[l]); return [d, h]; }(A.selectedIndexes, f), D.each(f[0], function(R, y) { A.select(y); }, A), D.each(f[1], function(R, y) { A.deselect(y); }, A)) : -1 < A.el.selectedIndex && A.select(A.el.selectedIndex)); })), this.config.nativeDropdown && this.container.addEventListener("keydown", function(f) { f.key === "Enter" && A.selected === document.activeElement && (A.toggle(), setTimeout(function() { A.el.focus(); }, 200)); }), this.selected.addEventListener("click", function(f) { A.disabled || A.toggle(), f.preventDefault(); }), this.config.nativeKeyboard && (N = "", this.selected.addEventListener("keydown", function(f) { var R; A.disabled || A.selected !== document.activeElement || f.altKey || f.ctrlKey || f.metaKey || (f.key === " " || !A.opened && -1 < ["Enter", "ArrowUp", "ArrowDown"].indexOf(f.key) ? (A.toggle(), f.preventDefault(), f.stopPropagation()) : f.key.length <= 2 && String[String.fromCodePoint ? "fromCodePoint" : "fromCharCode"](f.key[String.codePointAt ? "codePointAt" : "charCodeAt"](0)) === f.key && (A.config.multiple ? (A.open(), A.config.searchable && (A.input.value = f.key, A.input.focus(), A.search(null, true))) : (N += f.key, (R = A.search(N, true)) && R.length && (A.clear(), A.setValue(R[0].value)), setTimeout(function() { N = ""; }, 1e3)), f.preventDefault(), f.stopPropagation())); }), this.container.addEventListener("keyup", function(f) { A.opened && f.key === "Escape" && (A.close(), f.stopPropagation(), A.selected.focus()); })), this.label.addEventListener("click", function(f) { D.hasClass(f.target, "selectr-tag-remove") && A.deselect(f.target.parentNode.idx); }), this.selectClear && this.selectClear.addEventListener("click", this.clear.bind(this)), this.tree.addEventListener("mousedown", function(f) { f.preventDefault(); }), this.tree.addEventListener("click", function(f) { var R = D.closest(f.target, function(y) { return y && D.hasClass(y, "selectr-option"); }); R && !D.hasClass(R, "disabled") && (D.hasClass(R, "selected") ? (A.el.multiple || !A.el.multiple && A.config.allowDeselect) && A.deselect(R.idx) : A.select(R.idx), A.opened && !A.el.multiple) && A.close(), f.preventDefault(), f.stopPropagation(); }), this.tree.addEventListener("mouseover", function(f) { !D.hasClass(f.target, "selectr-option") || D.hasClass(f.target, "disabled") || (D.removeClass(A.items[A.navIndex], "active"), D.addClass(f.target, "active"), A.navIndex = [].slice.call(A.items).indexOf(f.target)); }), this.config.searchable && (this.input.addEventListener("focus", function(f) { A.searching = true; }), this.input.addEventListener("blur", function(f) { A.searching = false; }), this.input.addEventListener("keyup", function(f) { A.search(), A.config.taggable || (this.value.length ? D.addClass(this.parentNode, "active") : D.removeClass(this.parentNode, "active")); }), this.inputClear.addEventListener("click", function(f) { A.input.value = null, Y.call(A), A.tree.childElementCount || H.call(A); })), this.config.taggable && this.input.addEventListener("keyup", function(f) { var R, y; A.search(), A.config.taggable && this.value.length && (R = this.value.trim()).length && (f.which === 13 || A.tagSeperatorsRegex.test(R)) && (f = R.replace(A.tagSeperatorsRegex, ""), (y = (f = (f = D.escapeRegExp(f)).trim()).length ? A.add({ value: f, textContent: f, selected: true }, true) : y) ? (A.close(), Y.call(A)) : (this.value = "", A.setMessage(A.config.messages.tagDuplicate))); }), this.update = D.debounce(function() { A.opened && A.config.closeOnScroll && A.close(), A.width && (A.container.style.width = A.width), A.invert(); }, 50), this.requiresPagination && (this.paginateItems = D.debounce(function() { j.call(this); }, 50), this.tree.addEventListener("scroll", this.paginateItems.bind(this))), document.addEventListener("click", this.events.dismiss), window.addEventListener("keydown", this.events.navigate), window.addEventListener("resize", this.update), window.addEventListener("scroll", this.update), this.on("selectr.destroy", function() { document.removeEventListener("click", this.events.dismiss), window.removeEventListener("keydown", this.events.navigate), window.removeEventListener("resize", this.update), window.removeEventListener("scroll", this.update); }), this.el.form && (this.el.form.addEventListener("reset", this.events.reset), this.on("selectr.destroy", function() { this.el.form.removeEventListener("reset", this.events.reset); })); }, P.prototype.setSelected = function(N) { var A; this.config.data || this.el.multiple || !this.el.options.length || (this.el.selectedIndex !== 0 || this.el.options[0].defaultSelected || this.config.defaultSelected || (this.el.selectedIndex = -1), this.selectedIndex = this.el.selectedIndex, -1 < this.selectedIndex && this.select(this.selectedIndex)), this.config.multiple && this.originalType === "select-one" && !this.config.data && this.el.options[0].selected && !this.el.options[0].defaultSelected && (this.el.options[0].selected = false), D.each(this.options, function(f, R) { R.selected && R.defaultSelected && this.select(R.idx); }, this), this.config.selectedValue && this.setValue(this.config.selectedValue), this.config.data && (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0 && 0 < this.config.data.length && this.select(0), A = 0, D.each(this.config.data, function(f, R) { U(R, "children") ? D.each(R.children, function(y, C) { C.hasOwnProperty("selected") && C.selected === true && this.select(A), A++; }, this) : (R.hasOwnProperty("selected") && R.selected === true && this.select(A), A++); }, this)); }, P.prototype.destroy = function() { this.rendered && (this.emit("selectr.destroy"), this.originalType === "select-one" && (this.el.multiple = false), this.config.data && (this.el.innerHTML = ""), D.removeClass(this.el, "selectr-hidden"), this.container.parentNode.replaceChild(this.el, this.container), this.rendered = false, delete this.el.selectr); }, P.prototype.change = function(N) { var A = this.items[N], f = this.options[N]; f.disabled || (f.selected && D.hasClass(A, "selected") ? this.deselect(N) : this.select(N), this.opened && !this.el.multiple && this.close()); }, P.prototype.select = function(N) { var A = this.items[N], f = [].slice.call(this.el.options), R = this.options[N]; if (this.el.multiple) { if (D.includes(this.selectedIndexes, N)) return false; if (this.config.maxSelections && this.tags.length === this.config.maxSelections) return this.setMessage(this.config.messages.maxSelections.replace("{max}", this.config.maxSelections), true), false; this.selectedValues.push(R.value), this.selectedIndexes.push(N), (function(C) { var d, h = this, l = document.createDocumentFragment(), n = this.options[C.idx], o = this.data ? this.data[C.idx] : n, i = { class: "selectr-tag" }, o = (this.customSelected ? i.html = this.config.renderSelection(o) : i.textContent = n.textContent, D.createElement("li", i)), i = D.createElement("button", { class: "selectr-tag-remove", type: "button" }); o.appendChild(i), o.idx = C.idx, o.tag = n.value, this.tags.push(o), this.config.sortSelected ? (i = this.tags.slice(), d = function(a, r) { a.replace(/(\d+)|(\D+)/g, function(e2, t, s) { r.push([t || 1 / 0, s || ""]); }); }, i.sort(function(a, r) { var e2, t, s = [], c = []; for (h.config.sortSelected === true ? (e2 = a.tag, t = r.tag) : h.config.sortSelected === "text" && (e2 = a.textContent, t = r.textContent), d(e2, s), d(t, c); s.length && c.length; ) { var g = s.shift(), p = c.shift(), g = g[0] - p[0] || g[1].localeCompare(p[1]); if (g) return g; } return s.length - c.length; }), D.each(i, function(a, r) { l.appendChild(r); }), this.label.innerHTML = "") : l.appendChild(o), this.config.taggable ? this.label.insertBefore(l, this.input.parentNode) : this.label.appendChild(l); }).call(this, A); } else { var y = this.data ? this.data[N] : R; this.customSelected ? this.label.innerHTML = this.config.renderSelection(y) : this.label.textContent = R.textContent, this.selectedValue = R.value, this.selectedIndex = N, D.each(this.options, function(C, d) { var h = this.items[C]; C !== N && (h && D.removeClass(h, "selected"), d.selected = false, d.removeAttribute("selected")); }, this); } D.includes(f, R) || this.el.add(R), A.setAttribute("aria-selected", true), D.addClass(A, "selected"), D.addClass(this.container, "has-selected"), R.selected = true, R.setAttribute("selected", ""), this.emit("selectr.change", R), this.emit("selectr.select", R), "createEvent" in document ? ((y = document.createEvent("HTMLEvents")).initEvent("change", true, true), y.__selfTriggered = true, this.el.dispatchEvent(y)) : this.el.fireEvent("onchange"); }, P.prototype.deselect = function(N, A) { var f = this.items[N], R = this.options[N]; if (this.el.multiple) { var y = this.selectedIndexes.indexOf(N), y = (this.selectedIndexes.splice(y, 1), this.selectedValues.indexOf(R.value)); this.selectedValues.splice(y, 1), (function(C) { var d = false; D.each(this.tags, function(h, l) { l.idx === C.idx && (d = l); }, this), d && (this.label.removeChild(d), this.tags.splice(this.tags.indexOf(d), 1)); }).call(this, f), this.tags.length || D.removeClass(this.container, "has-selected"); } else { if (!A && !this.config.clearable && !this.config.allowDeselect) return false; this.label.innerHTML = "", this.selectedValue = null, this.el.selectedIndex = this.selectedIndex = -1, D.removeClass(this.container, "has-selected"); } this.items[N].setAttribute("aria-selected", false), D.removeClass(this.items[N], "selected"), R.selected = false, R.removeAttribute("selected"), this.emit("selectr.change", null), this.emit("selectr.deselect", R), "createEvent" in document ? ((y = document.createEvent("HTMLEvents")).initEvent("change", true, true), y.__selfTriggered = true, this.el.dispatchEvent(y)) : this.el.fireEvent("onchange"); }, P.prototype.setValue = function(N) { var A = Array.isArray(N); if (A || (N = N.toString().trim()), !this.el.multiple && A) return false; D.each(this.options, function(f, R) { (A && -1 < N.indexOf(R.value) || R.value === N) && this.change(R.idx); }, this); }, P.prototype.getValue = function(N, A) { var f, R; return this.el.multiple ? N ? this.selectedIndexes.length && (R = { values: [] }, D.each(this.selectedIndexes, function(y, C) { C = this.options[C], R.values[y] = { value: C.value, text: C.textContent }; }, this)) : R = this.selectedValues.slice() : R = N ? { value: (f = this.options[this.selectedIndex]).value, text: f.textContent } : this.selectedValue, R = N && A ? JSON.stringify(R) : R; }, P.prototype.add = function(N, A) { if (N) { if (this.data = this.data || [], this.items = this.items || [], this.options = this.options || [], Array.isArray(N)) D.each(N, function(y, C) { this.add(C, A); }, this); else if (Object.prototype.toString.call(N) === "[object Object]") { if (A) { var f = false; if (D.each(this.options, function(y, C) { C.value.toLowerCase() === N.value.toLowerCase() && (f = true); }), f) return false; } var R = D.createElement("option", N); return this.data.push(N), this.mobileDevice && this.el.add(R), this.options.push(R), R.idx = 0 < this.options.length ? this.options.length - 1 : 0, z.call(this, R), N.selected && this.select(R.idx), this.setPlaceholder(), R; } return this.config.pagination && this.paginate(), true; } }, P.prototype.remove = function(N) { var A, f = []; Array.isArray(N) ? D.each(N, function(R, y) { D.isInt(y) ? f.push(this.getOptionByIndex(y)) : typeof y == "string" && f.push(this.getOptionByValue(y)); }, this) : D.isInt(N) ? f.push(this.getOptionByIndex(N)) : typeof N == "string" && f.push(this.getOptionByValue(N)), f.length && (D.each(f, function(R, y) { A = y.idx, this.el.remove(y), this.options.splice(A, 1), y = this.items[A].parentNode, y && y.removeChild(this.items[A]), this.items.splice(A, 1), D.each(this.options, function(C, d) { d.idx = C, this.items[C].idx = C; }, this); }, this), this.setPlaceholder(), this.config.pagination) && this.paginate(); }, P.prototype.removeAll = function() { this.clear(true), D.each(this.el.options, function(N, A) { this.el.remove(A); }, this), D.truncate(this.tree), this.items = [], this.options = [], this.data = [], this.navIndex = 0, this.requiresPagination && (this.requiresPagination = false, this.pageIndex = 1, this.pages = []), this.setPlaceholder(); }, P.prototype.search = function(N, A) { var f, R, y, C, d; if (!this.navigating) return f = false, N || (N = this.input.value, f = true, this.removeMessage(), D.truncate(this.tree)), R = [], y = document.createDocumentFragment(), 0 < (N = N.trim().toLowerCase()).length ? (C = A ? D.startsWith : D.includes, D.each(this.options, function(h, l) { var n, o, i, a, r = this.items[l.idx]; C(l.textContent.trim().toLowerCase(), N) && !l.disabled ? (R.push({ text: l.textContent, value: l.value }), f && (x(r, y, this.customOption), D.removeClass(r, "excluded"), !this.customOption) && (n = N, i = (l = l).textContent, n = new RegExp(n, "ig"), a = n.exec(i)) && (l.innerHTML = "", (o = document.createElement("span")).classList.add("selectr-match"), o.textContent = a[0], l.appendChild(document.createTextNode(i.substring(0, a.index))), l.appendChild(o), l.appendChild(document.createTextNode(i.substring(n.lastIndex))))) : f && D.addClass(r, "excluded"); }, this), f && (y.childElementCount ? (A = this.items[this.navIndex], d = y.querySelector(".selectr-option:not(.excluded)"), this.noResults = false, D.removeClass(A, "active"), this.navIndex = d.idx, D.addClass(d, "active")) : this.config.taggable || (this.noResults = true, this.setMessage(this.config.messages.noResults)), this.tree.appendChild(y))) : H.call(this), R; }, P.prototype.toggle = function() { this.disabled || (this.opened ? this.close() : this.open()); }, P.prototype.open = function() { var N = this; if (!this.options.length) return false; this.opened || this.emit("selectr.open"), this.opened = true, this.mobileDevice || this.config.nativeDropdown ? (D.addClass(this.container, "native-open"), this.config.data && D.each(this.options, function(A, f) { this.el.add(f); }, this)) : (D.addClass(this.container, "open"), H.call(this), this.invert(), this.tree.scrollTop = 0, D.removeClass(this.container, "notice"), this.selected.setAttribute("aria-expanded", true), this.tree.setAttribute("aria-hidden", false), this.tree.setAttribute("aria-expanded", true), this.config.searchable && !this.config.taggable && setTimeout(function() { N.input.focus(), N.input.tabIndex = 0; }, 10)); }, P.prototype.close = function() { var N; this.opened && this.emit("selectr.close"), this.opened = false, this.navigating = false, this.mobileDevice || this.config.nativeDropdown ? D.removeClass(this.container, "native-open") : (N = D.hasClass(this.container, "notice"), this.config.searchable && !N && (this.input.blur(), this.input.tabIndex = -1, this.searching = false), N && (D.removeClass(this.container, "notice"), this.notice.textContent = ""), D.removeClass(this.container, "open"), D.removeClass(this.container, "native-open"), this.selected.setAttribute("aria-expanded", false), this.tree.setAttribute("aria-hidden", true), this.tree.setAttribute("aria-expanded", false), D.truncate(this.tree), Y.call(this)); }, P.prototype.enable = function() { this.disabled = false, this.el.disabled = false, this.selected.tabIndex = this.originalIndex, this.el.multiple && D.each(this.tags, function(N, A) { A.lastElementChild.tabIndex = 0; }), D.removeClass(this.container, "selectr-disabled"); }, P.prototype.disable = function(N) { N || (this.el.disabled = true), this.selected.tabIndex = -1, this.el.multiple && D.each(this.tags, function(A, f) { f.lastElementChild.tabIndex = -1; }), this.disabled = true, D.addClass(this.container, "selectr-disabled"); }, P.prototype.reset = function() { this.disabled || (this.clear(), this.setSelected(true), D.each(this.defaultSelected, function(N, A) { this.select(A); }, this), this.emit("selectr.reset")); }, P.prototype.clear = function(N, A) { var f; this.el.multiple ? this.selectedIndexes.length && (f = this.selectedIndexes.slice(), A ? this.deselect(f.slice(-1)[0]) : D.each(f, function(R, y) { this.deselect(y); }, this)) : -1 < this.selectedIndex && this.deselect(this.selectedIndex, N), this.emit("selectr.clear"); }, P.prototype.serialise = function(N) { var A = []; return D.each(this.options, function(f, R) { var y = { value: R.value, text: R.textContent }; R.selected && (y.selected = true), R.disabled && (y.disabled = true), A[f] = y; }), N ? JSON.stringify(A) : A; }, P.prototype.serialize = function(N) { return this.serialise(N); }, P.prototype.setPlaceholder = function(N) { N = N || this.config.placeholder || this.el.getAttribute("placeholder"), this.options.length || (N = this.config.messages.noOptions), this.placeEl.innerHTML = N; }, P.prototype.paginate = function() { var N; if (this.items.length) return (N = this).pages = this.items.map(function(A, f) { return f % N.config.pagination == 0 ? N.items.slice(f, f + N.config.pagination) : null; }).filter(function(A) { return A; }), this.pages; }, P.prototype.setMessage = function(N, A) { A && this.close(), D.addClass(this.container, "notice"), this.notice.textContent = N; }, P.prototype.removeMessage = function() { D.removeClass(this.container, "notice"), this.notice.innerHTML = ""; }, P.prototype.invert = function() { var N = D.rect(this.selected), A = this.tree.parentNode.offsetHeight, f = window.innerHeight; N.top + N.height + A > f ? (D.addClass(this.container, "inverted"), this.isInverted = true) : (D.removeClass(this.container, "inverted"), this.isInverted = false), this.optsRect = D.rect(this.tree); }, P.prototype.getOptionByIndex = function(N) { return this.options[N]; }, P.prototype.getOptionByValue = function(N) { for (var A = false, f = 0, R = this.options.length; f < R; f++) if (this.options[f].value.trim() === N.toString().trim()) { A = this.options[f]; break; } return A; }, le.exports = P; }, 4188: function(le, m, D) { D.d(m, { EX: function() { return x; }, WF: function() { return H; }, oW: function() { return z; }, qD: function() { return U; } }); var U = document.body, x = 10485760, H = 2e4, z = 2147483648; }, 2602: function(le, m, D) { D.d(m, { w: function() { return x; } }); var U = D(9791); function x(H, z, j) { var Y, P = 3 < arguments.length && arguments[3] !== void 0 && arguments[3], N = typeof (f = H).getRootNode == "function" ? f.getRootNode() : window, A = {}, f = H.getBoundingClientRect(), R = z.getBoundingClientRect(), y = document.createElement("div"); function C() { if (y && y.parentNode) { for (var h in y.parentNode.removeChild(y), A) l = h, Object.prototype.hasOwnProperty.call(A, l) && ((l = A[h]) && (0, U.removeEventListener)(N, h, l), delete A[h]); typeof j == "function" && j(H); } var l; } function d(h) { (h = h.target) === y || (0, U.isChildOf)(h, y) || C(); } return y.className = "jsoneditor-anchor", y.style.position = "absolute", y.style.left = f.left - R.left + "px", y.style.top = f.top - R.top + "px", y.style.width = f.width - 2 + "px", y.style.height = f.height - 2 + "px", y.style.boxSizing = "border-box", z.appendChild(y), A.mousedown = (0, U.addEventListener)(N, "mousedown", d), A.mousewheel = (0, U.addEventListener)(N, "mousewheel", d), P && (Y = null, y.onmouseover = function() { clearTimeout(Y), Y = null; }, y.onmouseout = function() { Y = Y || setTimeout(C, 200); }), y.destroy = C, y; } }, 7923: function(le) { le.exports = "data:application/javascript;base64,Im5vIHVzZSBzdHJpY3QiOwohKGZ1bmN0aW9uKHdpbmRvdykgewppZiAodHlwZW9mIHdpbmRvdy53aW5kb3cgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmRvY3VtZW50KQogICAgcmV0dXJuOwppZiAod2luZG93LnJlcXVpcmUgJiYgd2luZG93LmRlZmluZSkKICAgIHJldHVybjsKCmlmICghd2luZG93LmNvbnNvbGUpIHsKICAgIHdpbmRvdy5jb25zb2xlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnc30pOwogICAgfTsKICAgIHdpbmRvdy5jb25zb2xlLmVycm9yID0KICAgIHdpbmRvdy5jb25zb2xlLndhcm4gPSAKICAgIHdpbmRvdy5jb25zb2xlLmxvZyA9CiAgICB3aW5kb3cuY29uc29sZS50cmFjZSA9IHdpbmRvdy5jb25zb2xlOwp9CndpbmRvdy53aW5kb3cgPSB3aW5kb3c7CndpbmRvdy5hY2UgPSB3aW5kb3c7Cgp3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZpbGUsIGxpbmUsIGNvbCwgZXJyKSB7CiAgICBwb3N0TWVzc2FnZSh7dHlwZTogImVycm9yIiwgZGF0YTogewogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgZGF0YTogZXJyICYmIGVyci5kYXRhLAogICAgICAgIGZpbGU6IGZpbGUsCiAgICAgICAgbGluZTogbGluZSwgCiAgICAgICAgY29sOiBjb2wsCiAgICAgICAgc3RhY2s6IGVyciAmJiBlcnIuc3RhY2sKICAgIH19KTsKfTsKCndpbmRvdy5ub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgewogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZigiISIpICE9PSAtMSkgewogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBjaHVua3NbMV0pOwogICAgfQogICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIHJlcXVpcmVzCiAgICBpZiAobW9kdWxlTmFtZS5jaGFyQXQoMCkgPT0gIi4iKSB7CiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7CiAgICAgICAgbW9kdWxlTmFtZSA9IChiYXNlID8gYmFzZSArICIvIiA6ICIiKSArIG1vZHVsZU5hbWU7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lLnJlcGxhY2UoL15cLlwvLywgIiIpLnJlcGxhY2UoL1wvXC5cLy8sICIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCAiIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gbW9kdWxlTmFtZTsKfTsKCndpbmRvdy5yZXF1aXJlID0gZnVuY3Rpb24gcmVxdWlyZShwYXJlbnRJZCwgaWQpIHsKICAgIGlmICghaWQpIHsKICAgICAgICBpZCA9IHBhcmVudElkOwogICAgICAgIHBhcmVudElkID0gbnVsbDsKICAgIH0KICAgIGlmICghaWQuY2hhckF0KQogICAgICAgIHRocm93IG5ldyBFcnJvcigid29ya2VyLmpzIHJlcXVpcmUoKSBhY2NlcHRzIG9ubHkgKHBhcmVudElkLCBpZCkgYXMgYXJndW1lbnRzIik7CgogICAgaWQgPSB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CgogICAgdmFyIG1vZHVsZSA9IHdpbmRvdy5yZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgIAogICAgaWYgKCF3aW5kb3cucmVxdWlyZS50bG5zKQogICAgICAgIHJldHVybiBjb25zb2xlLmxvZygidW5hYmxlIHRvIGxvYWQgIiArIGlkKTsKICAgIAogICAgdmFyIHBhdGggPSByZXNvbHZlTW9kdWxlSWQoaWQsIHdpbmRvdy5yZXF1aXJlLnRsbnMpOwogICAgaWYgKHBhdGguc2xpY2UoLTMpICE9ICIuanMiKSBwYXRoICs9ICIuanMiOwogICAgCiAgICB3aW5kb3cucmVxdWlyZS5pZCA9IGlkOwogICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7fTsgLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIG9uIGJyb2tlbiBtb2R1bGVzCiAgICBpbXBvcnRTY3JpcHRzKHBhdGgpOwogICAgcmV0dXJuIHdpbmRvdy5yZXF1aXJlKHBhcmVudElkLCBpZCk7Cn07CmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVJZChpZCwgcGF0aHMpIHsKICAgIHZhciB0ZXN0UGF0aCA9IGlkLCB0YWlsID0gIiI7CiAgICB3aGlsZSAodGVzdFBhdGgpIHsKICAgICAgICB2YXIgYWxpYXMgPSBwYXRoc1t0ZXN0UGF0aF07CiAgICAgICAgaWYgKHR5cGVvZiBhbGlhcyA9PSAic3RyaW5nIikgewogICAgICAgICAgICByZXR1cm4gYWxpYXMgKyB0YWlsOwogICAgICAgIH0gZWxzZSBpZiAoYWxpYXMpIHsKICAgICAgICAgICAgcmV0dXJuICBhbGlhcy5sb2NhdGlvbi5yZXBsYWNlKC9cLyokLywgIi8iKSArICh0YWlsIHx8IGFsaWFzLm1haW4gfHwgYWxpYXMubmFtZSk7CiAgICAgICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICB2YXIgaSA9IHRlc3RQYXRoLmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgaWYgKGkgPT09IC0xKSBicmVhazsKICAgICAgICB0YWlsID0gdGVzdFBhdGguc3Vic3RyKGkpICsgdGFpbDsKICAgICAgICB0ZXN0UGF0aCA9IHRlc3RQYXRoLnNsaWNlKDAsIGkpOwogICAgfQogICAgcmV0dXJuIGlkOwp9CndpbmRvdy5yZXF1aXJlLm1vZHVsZXMgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9OwoKd2luZG93LmRlZmluZSA9IGZ1bmN0aW9uKGlkLCBkZXBzLCBmYWN0b3J5KSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgZmFjdG9yeSA9IGRlcHM7CiAgICAgICAgaWYgKHR5cGVvZiBpZCAhPSAic3RyaW5nIikgewogICAgICAgICAgICBkZXBzID0gaWQ7CiAgICAgICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgZGVwcyA9IFtdOwogICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IGZhY3RvcnksCiAgICAgICAgICAgIGluaXRpYWxpemVkOiB0cnVlCiAgICAgICAgfTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFkZXBzLmxlbmd0aCkKICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkZXBlbmRlbmNpZXMsIHdlIGluamVjdCAicmVxdWlyZSIsICJleHBvcnRzIiBhbmQKICAgICAgICAvLyAibW9kdWxlIiBhcyBkZXBlbmRlbmNpZXMsIHRvIHByb3ZpZGUgQ29tbW9uSlMgY29tcGF0aWJpbGl0eS4KICAgICAgICBkZXBzID0gWyJyZXF1aXJlIiwgImV4cG9ydHMiLCAibW9kdWxlIl07CgogICAgdmFyIHJlcSA9IGZ1bmN0aW9uKGNoaWxkSWQpIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVpcmUoaWQsIGNoaWxkSWQpOwogICAgfTsKCiAgICB3aW5kb3cucmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsKICAgICAgICBleHBvcnRzOiB7fSwKICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciByZXR1cm5FeHBvcnRzID0gZmFjdG9yeS5hcHBseSh0aGlzLCBkZXBzLnNsaWNlKDAsIGZhY3RvcnkubGVuZ3RoKS5tYXAoZnVuY3Rpb24oZGVwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcCkgewogICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgInJlcXVpcmUiLCAiZXhwb3J0cyIgYW5kICJtb2R1bGUiIGFyZW4ndCBhY3R1YWwKICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIHdlIG11c3QgaGFuZGxlIHRoZW0gc2VwZXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjYXNlICJyZXF1aXJlIjogcmV0dXJuIHJlcTsKICAgICAgICAgICAgICAgICAgICBjYXNlICJleHBvcnRzIjogcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIm1vZHVsZSI6ICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBmb3IgYWxsIG90aGVyIGRlcGVuZGVuY2llcywgd2UgY2FuIGp1c3QgZ28gYWhlYWQgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSB0aGVtLgogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gcmVxKGRlcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKHJldHVybkV4cG9ydHMpCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7CiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgfQogICAgfTsKfTsKd2luZG93LmRlZmluZS5hbWQgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9Owp3aW5kb3cuaW5pdEJhc2VVcmxzICA9IGZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsKICAgIGZvciAodmFyIGkgaW4gdG9wTGV2ZWxOYW1lc3BhY2VzKQogICAgICAgIHRoaXMucmVxdWlyZS50bG5zW2ldID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwp9OwoKd2luZG93LmluaXRTZW5kZXIgPSBmdW5jdGlvbiBpbml0U2VuZGVyKCkgewoKICAgIHZhciBFdmVudEVtaXR0ZXIgPSB3aW5kb3cucmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwogICAgdmFyIG9vcCA9IHdpbmRvdy5yZXF1aXJlKCJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn07Cgp2YXIgbWFpbiA9IHdpbmRvdy5tYWluID0gbnVsbDsKdmFyIHNlbmRlciA9IHdpbmRvdy5zZW5kZXIgPSBudWxsOwoKd2luZG93Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fc2lnbmFsKG1zZy5ldmVudCwgbXNnLmRhdGEpOwogICAgfQogICAgZWxzZSBpZiAobXNnLmNvbW1hbmQpIHsKICAgICAgICBpZiAobWFpblttc2cuY29tbWFuZF0pCiAgICAgICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgICAgICBlbHNlIGlmICh3aW5kb3dbbXNnLmNvbW1hbmRdKQogICAgICAgICAgICB3aW5kb3dbbXNnLmNvbW1hbmRdLmFwcGx5KHdpbmRvdywgbXNnLmFyZ3MpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbW1hbmQ6IiArIG1zZy5jb21tYW5kKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7CiAgICAgICAgd2luZG93LmluaXRCYXNlVXJscyhtc2cudGxucyk7CiAgICAgICAgc2VuZGVyID0gd2luZG93LnNlbmRlciA9IHdpbmRvdy5pbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gdGhpcy5yZXF1aXJlKG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOwogICAgICAgIG1haW4gPSB3aW5kb3cubWFpbiA9IG5ldyBjbGF6eihzZW5kZXIpOwogICAgfQp9Owp9KSh0aGlzKTsKCmFjZS5kZWZpbmUoImFjZS9saWIvb29wIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY3Rvciwgc3VwZXJDdG9yKSB7CiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjsKICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7CiAgICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICAgICAgdmFsdWU6IGN0b3IsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgfQogICAgfSk7Cn07CmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbiAob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQogICAgcmV0dXJuIG9iajsKfTsKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbiAocHJvdG8sIG1peGluKSB7CiAgICBleHBvcnRzLm1peGluKHByb3RvLCBtaXhpbik7Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9hcHBseV9kZWx0YSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwpmdW5jdGlvbiB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsIGVycm9yVGV4dCkgewogICAgY29uc29sZS5sb2coIkludmFsaWQgRGVsdGE6IiwgZGVsdGEpOwogICAgdGhyb3cgIkludmFsaWQgRGVsdGE6ICIgKyBlcnJvclRleHQ7Cn0KZnVuY3Rpb24gcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBwb3NpdGlvbikgewogICAgcmV0dXJuIHBvc2l0aW9uLnJvdyA+PSAwICYmIHBvc2l0aW9uLnJvdyA8IGRvY0xpbmVzLmxlbmd0aCAmJgogICAgICAgIHBvc2l0aW9uLmNvbHVtbiA+PSAwICYmIHBvc2l0aW9uLmNvbHVtbiA8PSBkb2NMaW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDsKfQpmdW5jdGlvbiB2YWxpZGF0ZURlbHRhKGRvY0xpbmVzLCBkZWx0YSkgewogICAgaWYgKGRlbHRhLmFjdGlvbiAhPSAiaW5zZXJ0IiAmJiBkZWx0YS5hY3Rpb24gIT0gInJlbW92ZSIpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuYWN0aW9uIG11c3QgYmUgJ2luc2VydCcgb3IgJ3JlbW92ZSciKTsKICAgIGlmICghKGRlbHRhLmxpbmVzIGluc3RhbmNlb2YgQXJyYXkpKQogICAgICAgIHRocm93RGVsdGFFcnJvcihkZWx0YSwgImRlbHRhLmxpbmVzIG11c3QgYmUgYW4gQXJyYXkiKTsKICAgIGlmICghZGVsdGEuc3RhcnQgfHwgIWRlbHRhLmVuZCkKICAgICAgICB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsICJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7CiAgICB2YXIgc3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIGlmICghcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBkZWx0YS5zdGFydCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTsKICAgIHZhciBlbmQgPSBkZWx0YS5lbmQ7CiAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmUiICYmICFwb3NpdGlvbkluRG9jdW1lbnQoZG9jTGluZXMsIGVuZCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7CiAgICB2YXIgbnVtUmFuZ2VSb3dzID0gZW5kLnJvdyAtIHN0YXJ0LnJvdzsKICAgIHZhciBudW1SYW5nZUxhc3RMaW5lQ2hhcnMgPSAoZW5kLmNvbHVtbiAtIChudW1SYW5nZVJvd3MgPT0gMCA/IHN0YXJ0LmNvbHVtbiA6IDApKTsKICAgIGlmIChudW1SYW5nZVJvd3MgIT0gZGVsdGEubGluZXMubGVuZ3RoIC0gMSB8fCBkZWx0YS5saW5lc1tudW1SYW5nZVJvd3NdLmxlbmd0aCAhPSBudW1SYW5nZUxhc3RMaW5lQ2hhcnMpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpOwp9CmV4cG9ydHMuYXBwbHlEZWx0YSA9IGZ1bmN0aW9uIChkb2NMaW5lcywgZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICB2YXIgc3RhcnRDb2x1bW4gPSBkZWx0YS5zdGFydC5jb2x1bW47CiAgICB2YXIgbGluZSA9IGRvY0xpbmVzW3Jvd10gfHwgIiI7CiAgICBzd2l0Y2ggKGRlbHRhLmFjdGlvbikgewogICAgICAgIGNhc2UgImluc2VydCI6CiAgICAgICAgICAgIHZhciBsaW5lcyA9IGRlbHRhLmxpbmVzOwogICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZGVsdGEubGluZXNbMF0gKyBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtyb3csIDFdLmNvbmNhdChkZWx0YS5saW5lcyk7CiAgICAgICAgICAgICAgICBkb2NMaW5lcy5zcGxpY2UuYXBwbHkoZG9jTGluZXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgZG9jTGluZXNbcm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGRvY0xpbmVzW3Jvd107CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3cgKyBkZWx0YS5saW5lcy5sZW5ndGggLSAxXSArPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmVtb3ZlIjoKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IGRlbHRhLmVuZC5jb2x1bW47CiAgICAgICAgICAgIHZhciBlbmRSb3cgPSBkZWx0YS5lbmQucm93OwogICAgICAgICAgICBpZiAocm93ID09PSBlbmRSb3cpIHsKICAgICAgICAgICAgICAgIGRvY0xpbmVzW3Jvd10gPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jTGluZXMuc3BsaWNlKHJvdywgZW5kUm93IC0gcm93ICsgMSwgbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZG9jTGluZXNbZW5kUm93XS5zdWJzdHJpbmcoZW5kQ29sdW1uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwp2YXIgRXZlbnRFbWl0dGVyID0ge307CnZhciBzdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsgfTsKdmFyIHByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9OwpFdmVudEVtaXR0ZXIuX2VtaXQgPQogICAgRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZSkgewogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwgKHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB7fSk7CiAgICAgICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8ICh0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB7fSk7CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsKICAgICAgICB2YXIgZGVmYXVsdEhhbmRsZXIgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBlICE9ICJvYmplY3QiIHx8ICFlKQogICAgICAgICAgICBlID0ge307CiAgICAgICAgaWYgKCFlLnR5cGUpCiAgICAgICAgICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgICAgICBpZiAoIWUuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IHN0b3BQcm9wYWdhdGlvbjsKICAgICAgICBpZiAoIWUucHJldmVudERlZmF1bHQpCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsaXN0ZW5lcnNbaV0oZSwgdGhpcyk7CiAgICAgICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKGUsIHRoaXMpOwogICAgfTsKRXZlbnRFbWl0dGVyLl9zaWduYWwgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlKSB7CiAgICB2YXIgbGlzdGVuZXJzID0gKHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge30pW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICByZXR1cm47CiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQogICAgICAgIGxpc3RlbmVyc1tpXShlLCB0aGlzKTsKfTsKRXZlbnRFbWl0dGVyLm9uY2UgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMub24oZXZlbnROYW1lLCBmdW5jdGlvbiBuZXdDYWxsYmFjaygpIHsKICAgICAgICBfc2VsZi5vZmYoZXZlbnROYW1lLCBuZXdDYWxsYmFjayk7CiAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIH0pOwogICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgICBjYWxsYmFjayA9IHJlc29sdmU7CiAgICAgICAgfSk7CiAgICB9Cn07CkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnM7CiAgICBpZiAoIWhhbmRsZXJzKQogICAgICAgIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0geyBfZGlzYWJsZWRfOiB7fSB9OwogICAgaWYgKGhhbmRsZXJzW2V2ZW50TmFtZV0pIHsKICAgICAgICB2YXIgb2xkID0gaGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICAgICAgaWYgKCFkaXNhYmxlZCkKICAgICAgICAgICAgaGFuZGxlcnMuX2Rpc2FibGVkX1tldmVudE5hbWVdID0gZGlzYWJsZWQgPSBbXTsKICAgICAgICBkaXNhYmxlZC5wdXNoKG9sZCk7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQogICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwpFdmVudEVtaXR0ZXIucmVtb3ZlRGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzOwogICAgaWYgKCFoYW5kbGVycykKICAgICAgICByZXR1cm47CiAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICBpZiAoaGFuZGxlcnNbZXZlbnROYW1lXSA9PSBjYWxsYmFjaykgewogICAgICAgIGlmIChkaXNhYmxlZCkKICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0SGFuZGxlcihldmVudE5hbWUsIGRpc2FibGVkLnBvcCgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQp9OwpFdmVudEVtaXR0ZXIub24gPQogICAgRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaywgY2FwdHVyaW5nKSB7CiAgICAgICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107CiAgICAgICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSA9PSAtMSkKICAgICAgICAgICAgbGlzdGVuZXJzW2NhcHR1cmluZyA/ICJ1bnNoaWZ0IiA6ICJwdXNoIl0oY2FsbGJhY2spOwogICAgICAgIHJldHVybiBjYWxsYmFjazsKICAgIH07CkV2ZW50RW1pdHRlci5vZmYgPQogICAgRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KICAgICAgICBFdmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9OwogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKQogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfTsKRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsKICAgIGlmICghZXZlbnROYW1lKQogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkKICAgICAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzKQogICAgICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gdW5kZWZpbmVkOwp9OwpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3JhbmdlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBjb21wYXJlUG9pbnRzID0gZnVuY3Rpb24gKHAxLCBwMikgewogICAgcmV0dXJuIHAxLnJvdyAtIHAyLnJvdyB8fCBwMS5jb2x1bW4gLSBwMi5jb2x1bW47Cn07CnZhciBSYW5nZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsKICAgICAgICB0aGlzLnN0YXJ0ID0gewogICAgICAgICAgICByb3c6IHN0YXJ0Um93LAogICAgICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVuZCA9IHsKICAgICAgICAgICAgcm93OiBlbmRSb3csCiAgICAgICAgICAgIGNvbHVtbjogZW5kQ29sdW1uCiAgICAgICAgfTsKICAgIH0KICAgIFJhbmdlLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09PSByYW5nZS5zdGFydC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5lbmQucm93ID09PSByYW5nZS5lbmQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09PSByYW5nZS5zdGFydC5jb2x1bW4gJiYKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID09PSByYW5nZS5lbmQuY29sdW1uOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsKICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDA7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAsIGVuZCA9IHJhbmdlLmVuZCwgc3RhcnQgPSByYW5nZS5zdGFydDsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7CiAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAtMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uIChwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWluc1JhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmVSYW5nZShyYW5nZSk7CiAgICAgICAgcmV0dXJuIChjbXAgPT0gLTEgfHwgY21wID09IDAgfHwgY21wID09IDEpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pc0VuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnNldEVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pbnNpZGVFbmQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8IHRoaXMuc3RhcnQuY29sdW1uID8gLTEgOiAoY29sdW1uID4gdGhpcy5lbmQuY29sdW1uID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOwogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb21wYXJlRW5kID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jbGlwUm93cyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KQogICAgICAgICAgICB2YXIgZW5kID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiBmaXJzdFJvdywgY29sdW1uOiAwIH07CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykKICAgICAgICAgICAgdmFyIHN0YXJ0ID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogZmlyc3RSb3csIGNvbHVtbjogMCB9OwogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT09IHRoaXMuZW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLmVuZC5jb2x1bW4gPT0gMCkKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdyAtIDEpLCAwKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIHRoaXMuZW5kLnJvdywgMCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbiAoc2Vzc2lvbikgewogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9IHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOwogICAgICAgIHZhciBzY3JlZW5Qb3NFbmQgPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7CiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuc3RhcnQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiArPSBjb2x1bW47CiAgICAgICAgdGhpcy5lbmQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLmVuZC5jb2x1bW4gKz0gY29sdW1uOwogICAgfTsKICAgIHJldHVybiBSYW5nZTsKfSgpKTsKUmFuZ2UuZnJvbVBvaW50cyA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKUmFuZ2UuY29tcGFyZVBvaW50cyA9IGNvbXBhcmVQb2ludHM7ClJhbmdlLmNvbXBhcmVQb2ludHMgPSBmdW5jdGlvbiAocDEsIHAyKSB7CiAgICByZXR1cm4gcDEucm93IC0gcDIucm93IHx8IHAxLmNvbHVtbiAtIHAyLmNvbHVtbjsKfTsKZXhwb3J0cy5SYW5nZSA9IFJhbmdlOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvYW5jaG9yIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7CnZhciBBbmNob3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBBbmNob3IoZG9jLCByb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuYXR0YWNoKGRvYyk7CiAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsKICAgIH0KICAgIEFuY2hvci5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmdldERvY3VtZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50OwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICBpZiAoZGVsdGEuc3RhcnQucm93ID09IGRlbHRhLmVuZC5yb3cgJiYgZGVsdGEuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGRlbHRhLnN0YXJ0LnJvdyA+IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBvaW50ID0gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHsgcm93OiB0aGlzLnJvdywgY29sdW1uOiB0aGlzLmNvbHVtbiB9LCB0aGlzLiRpbnNlcnRSaWdodCk7CiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb2ludC5yb3csIHBvaW50LmNvbHVtbiwgdHJ1ZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbiwgbm9DbGlwKSB7CiAgICAgICAgdmFyIHBvczsKICAgICAgICBpZiAobm9DbGlwKSB7CiAgICAgICAgICAgIHBvcyA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIG9sZCA9IHsKICAgICAgICAgICAgcm93OiB0aGlzLnJvdywKICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbgogICAgICAgIH07CiAgICAgICAgdGhpcy5yb3cgPSBwb3Mucm93OwogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9mZigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKGRvYykgewogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2MgfHwgdGhpcy5kb2N1bWVudDsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBwb3MgPSB7fTsKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH07CiAgICByZXR1cm4gQW5jaG9yOwp9KCkpOwpBbmNob3IucHJvdG90eXBlLiRpbnNlcnRSaWdodCA9IGZhbHNlOwpvb3AuaW1wbGVtZW50KEFuY2hvci5wcm90b3R5cGUsIEV2ZW50RW1pdHRlcik7CmZ1bmN0aW9uICRwb2ludHNJbk9yZGVyKHBvaW50MSwgcG9pbnQyLCBlcXVhbFBvaW50c0luT3JkZXIpIHsKICAgIHZhciBiQ29sSXNBZnRlciA9IGVxdWFsUG9pbnRzSW5PcmRlciA/IHBvaW50MS5jb2x1bW4gPD0gcG9pbnQyLmNvbHVtbiA6IHBvaW50MS5jb2x1bW4gPCBwb2ludDIuY29sdW1uOwogICAgcmV0dXJuIChwb2ludDEucm93IDwgcG9pbnQyLnJvdykgfHwgKHBvaW50MS5yb3cgPT0gcG9pbnQyLnJvdyAmJiBiQ29sSXNBZnRlcik7Cn0KZnVuY3Rpb24gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHBvaW50LCBtb3ZlSWZFcXVhbCkgewogICAgdmFyIGRlbHRhSXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICB2YXIgZGVsdGFSb3dTaGlmdCA9IChkZWx0YUlzSW5zZXJ0ID8gMSA6IC0xKSAqIChkZWx0YS5lbmQucm93IC0gZGVsdGEuc3RhcnQucm93KTsKICAgIHZhciBkZWx0YUNvbFNoaWZ0ID0gKGRlbHRhSXNJbnNlcnQgPyAxIDogLTEpICogKGRlbHRhLmVuZC5jb2x1bW4gLSBkZWx0YS5zdGFydC5jb2x1bW4pOwogICAgdmFyIGRlbHRhU3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIHZhciBkZWx0YUVuZCA9IGRlbHRhSXNJbnNlcnQgPyBkZWx0YVN0YXJ0IDogZGVsdGEuZW5kOyAvLyBDb2xsYXBzZSBpbnNlcnQgcmFuZ2UuCiAgICBpZiAoJHBvaW50c0luT3JkZXIocG9pbnQsIGRlbHRhU3RhcnQsIG1vdmVJZkVxdWFsKSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdzogcG9pbnQucm93LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbgogICAgICAgIH07CiAgICB9CiAgICBpZiAoJHBvaW50c0luT3JkZXIoZGVsdGFFbmQsIHBvaW50LCAhbW92ZUlmRXF1YWwpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm93OiBwb2ludC5yb3cgKyBkZWx0YVJvd1NoaWZ0LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbiArIChwb2ludC5yb3cgPT0gZGVsdGFFbmQucm93ID8gZGVsdGFDb2xTaGlmdCA6IDApCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgcm93OiBkZWx0YVN0YXJ0LnJvdywKICAgICAgICBjb2x1bW46IGRlbHRhU3RhcnQuY29sdW1uCiAgICB9Owp9CmV4cG9ydHMuQW5jaG9yID0gQW5jaG9yOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpeyJ1c2Ugc3RyaWN0IjsKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgYXBwbHlEZWx0YSA9IHJlcXVpcmUoIi4vYXBwbHlfZGVsdGEiKS5hcHBseURlbHRhOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7CnZhciBEb2N1bWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIERvY3VtZW50KHRleHRPckxpbmVzKSB7CiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIGlmICh0ZXh0T3JMaW5lcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRleHRPckxpbmVzKSkgewogICAgICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiAwLCBjb2x1bW46IDAgfSwgdGV4dE9yTGluZXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0T3JMaW5lcyk7CiAgICAgICAgfQogICAgfQogICAgRG9jdW1lbnQucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICB2YXIgbGVuID0gdGhpcy5nZXRMZW5ndGgoKSAtIDE7CiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbikubGVuZ3RoKSk7CiAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0IHx8ICIiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiAiXG4iOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TmV3TGluZUNoYXJhY3RlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7CiAgICAgICAgICAgIGNhc2UgIndpbmRvd3MiOgogICAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgICAgY2FzZSAidW5peCI6CiAgICAgICAgICAgICAgICByZXR1cm4gIlxuIjsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZSB8fCAiXG4iOwogICAgICAgIH0KICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbiAobmV3TGluZU1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIik7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaXNOZXdMaW5lID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lID0gZnVuY3Rpb24gKHJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lcyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzRm9yUmFuZ2UocmFuZ2UpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lc0ZvclJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgdmFyIGxpbmVzOwogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsKICAgICAgICAgICAgbGluZXMgPSBbdGhpcy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdykuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbildOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7CiAgICAgICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICIiKS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSAxOwogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyA9PSBsKQogICAgICAgICAgICAgICAgbGluZXNbbF0gPSBsaW5lc1tsXS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lczsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbiAocm93LCBsaW5lcykgewogICAgICAgIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydEZ1bGxMaW5lcyhyb3csIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlTGluZXMgPSBmdW5jdGlvbiAoZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKTsKICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGdWxsTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbIiIsICIiXSk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIHRoaXMuJHNwbGl0KHRleHQpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0SW5MaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5wb3MocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICBlbmQ6IGVuZCwKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0IiwKICAgICAgICAgICAgbGluZXM6IFt0ZXh0XQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsaXBwZWRQb3MgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7CiAgICAgICAgICAgIHJvdyA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoIC0gMTsKICAgICAgICAgICAgY29sdW1uID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIGlmIChjb2x1bW4gPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBjb2x1bW4gPSBsaW5lLmxlbmd0aDsKICAgICAgICBjb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW4sIDApLCBsaW5lLmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsb25lUG9zID0gZnVuY3Rpb24gKHBvcykgewogICAgICAgIHJldHVybiB7IHJvdzogcG9zLnJvdywgY29sdW1uOiBwb3MuY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGggLSAxKS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBwb3NpdGlvbi5yb3cpOwogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbi5jb2x1bW4sIDApLCB0aGlzLmdldExpbmUocG9zaXRpb24ucm93KS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydEZ1bGxMaW5lcyA9IGZ1bmN0aW9uIChyb3csIGxpbmVzKSB7CiAgICAgICAgcm93ID0gTWF0aC5taW4oTWF0aC5tYXgocm93LCAwKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAgICAgICAgdmFyIGNvbHVtbiA9IDA7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgbGluZXMgPSBsaW5lcy5jb25jYXQoWyIiXSk7CiAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsaW5lcyA9IFsiIl0uY29uY2F0KGxpbmVzKTsKICAgICAgICAgICAgcm93LS07CiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuJGxpbmVzW3Jvd10ubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH0sIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TWVyZ2VkTGluZXMgPSBmdW5jdGlvbiAocG9zaXRpb24sIGxpbmVzKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3c6IHN0YXJ0LnJvdyArIGxpbmVzLmxlbmd0aCAtIDEsCiAgICAgICAgICAgIGNvbHVtbjogKGxpbmVzLmxlbmd0aCA9PSAxID8gc3RhcnQuY29sdW1uIDogMCkgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgZW5kOiBlbmQsCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydCIsCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24gKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyb3csIHN0YXJ0Q29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5jbGlwcGVkUG9zKHJvdywgZW5kQ29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlRnVsbExpbmVzID0gZnVuY3Rpb24gKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgZmlyc3RSb3cgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBmaXJzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICBsYXN0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgbGFzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICB2YXIgZGVsZXRlRmlyc3ROZXdMaW5lID0gbGFzdFJvdyA9PSB0aGlzLmdldExlbmd0aCgpIC0gMSAmJiBmaXJzdFJvdyA+IDA7CiAgICAgICAgdmFyIGRlbGV0ZUxhc3ROZXdMaW5lID0gbGFzdFJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxOwogICAgICAgIHZhciBzdGFydFJvdyA9IChkZWxldGVGaXJzdE5ld0xpbmUgPyBmaXJzdFJvdyAtIDEgOiBmaXJzdFJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sID0gKGRlbGV0ZUZpcnN0TmV3TGluZSA/IHRoaXMuZ2V0TGluZShzdGFydFJvdykubGVuZ3RoIDogMCk7CiAgICAgICAgdmFyIGVuZFJvdyA9IChkZWxldGVMYXN0TmV3TGluZSA/IGxhc3RSb3cgKyAxIDogbGFzdFJvdyk7CiAgICAgICAgdmFyIGVuZENvbCA9IChkZWxldGVMYXN0TmV3TGluZSA/IDAgOiB0aGlzLmdldExpbmUoZW5kUm93KS5sZW5ndGgpOwogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2wsIGVuZFJvdywgZW5kQ29sKTsKICAgICAgICB2YXIgZGVsZXRlZExpbmVzID0gdGhpcy4kbGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogcmFuZ2Uuc3RhcnQsCiAgICAgICAgICAgIGVuZDogcmFuZ2UuZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHJhbmdlKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkZWxldGVkTGluZXM7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZU5ld0xpbmUgPSBmdW5jdGlvbiAocm93KSB7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxICYmIHJvdyA+PSAwKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93LCB0aGlzLmdldExpbmUocm93KS5sZW5ndGgpLAogICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvcyhyb3cgKyAxLCAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICBsaW5lczogWyIiLCAiIl0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpCiAgICAgICAgICAgIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICB2YXIgZW5kOwogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5hcHBseURlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmFwcGx5RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gZGVsdGFzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgICAgICB2YXIgaXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICAgICAgaWYgKGlzSW5zZXJ0ID8gZGVsdGEubGluZXMubGVuZ3RoIDw9IDEgJiYgIWRlbHRhLmxpbmVzWzBdCiAgICAgICAgICAgIDogIVJhbmdlLmNvbXBhcmVQb2ludHMoZGVsdGEuc3RhcnQsIGRlbHRhLmVuZCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNJbnNlcnQgJiYgZGVsdGEubGluZXMubGVuZ3RoID4gMjAwMDApIHsKICAgICAgICAgICAgdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEoZGVsdGEsIDIwMDAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFwcGx5RGVsdGEodGhpcy4kbGluZXMsIGRlbHRhLCBkb05vdFZhbGlkYXRlKTsKICAgICAgICAgICAgdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLCBkZWx0YSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kc2FmZUFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB2YXIgZG9jTGVuZ3RoID0gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZSIgJiYgZGVsdGEuc3RhcnQucm93IDwgZG9jTGVuZ3RoICYmIGRlbHRhLmVuZC5yb3cgPCBkb2NMZW5ndGgKICAgICAgICAgICAgfHwgZGVsdGEuYWN0aW9uID09ICJpbnNlcnQiICYmIGRlbHRhLnN0YXJ0LnJvdyA8PSBkb2NMZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YSA9IGZ1bmN0aW9uIChkZWx0YSwgTUFYKSB7CiAgICAgICAgdmFyIGxpbmVzID0gZGVsdGEubGluZXM7CiAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSBNQVggKyAxOwogICAgICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IGRlbHRhLnN0YXJ0LmNvbHVtbjsKICAgICAgICBmb3IgKHZhciBmcm9tID0gMCwgdG8gPSAwOyBmcm9tIDwgbDsgZnJvbSA9IHRvKSB7CiAgICAgICAgICAgIHRvICs9IE1BWCAtIDE7CiAgICAgICAgICAgIHZhciBjaHVuayA9IGxpbmVzLnNsaWNlKGZyb20sIHRvKTsKICAgICAgICAgICAgY2h1bmsucHVzaCgiIik7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93ICsgZnJvbSwgY29sdW1uKSwKICAgICAgICAgICAgICAgIGVuZDogdGhpcy5wb3Mocm93ICsgdG8sIGNvbHVtbiA9IDApLAogICAgICAgICAgICAgICAgYWN0aW9uOiBkZWx0YS5hY3Rpb24sCiAgICAgICAgICAgICAgICBsaW5lczogY2h1bmsKICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGRlbHRhLmxpbmVzID0gbGluZXMuc2xpY2UoZnJvbSk7CiAgICAgICAgZGVsdGEuc3RhcnQucm93ID0gcm93ICsgZnJvbTsKICAgICAgICBkZWx0YS5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhLCB0cnVlKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmV2ZXJ0RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB0aGlzLiRzYWZlQXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNsb25lUG9zKGRlbHRhLnN0YXJ0KSwKICAgICAgICAgICAgZW5kOiB0aGlzLmNsb25lUG9zKGRlbHRhLmVuZCksCiAgICAgICAgICAgIGFjdGlvbjogKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0IiA/ICJyZW1vdmUiIDogImluc2VydCIpLAogICAgICAgICAgICBsaW5lczogZGVsdGEubGluZXMuc2xpY2UoKQogICAgICAgIH0pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbmRleFRvUG9zaXRpb24gPSBmdW5jdGlvbiAoaW5kZXgsIHN0YXJ0Um93KSB7CiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kbGluZXMgfHwgdGhpcy5nZXRBbGxMaW5lcygpOwogICAgICAgIHZhciBuZXdsaW5lTGVuZ3RoID0gdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGluZGV4IC09IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgICAgIGlmIChpbmRleCA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4geyByb3c6IGksIGNvbHVtbjogaW5kZXggKyBsaW5lc1tpXS5sZW5ndGggKyBuZXdsaW5lTGVuZ3RoIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJvdzogbCAtIDEsIGNvbHVtbjogaW5kZXggKyBsaW5lc1tsIC0gMV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aCB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5wb3NpdGlvblRvSW5kZXggPSBmdW5jdGlvbiAocG9zLCBzdGFydFJvdykgewogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJGxpbmVzIHx8IHRoaXMuZ2V0QWxsTGluZXMoKTsKICAgICAgICB2YXIgbmV3bGluZUxlbmd0aCA9IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHZhciByb3cgPSBNYXRoLm1pbihwb3Mucm93LCBsaW5lcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwOyBpIDwgcm93OyArK2kpCiAgICAgICAgICAgIGluZGV4ICs9IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgcmV0dXJuIGluZGV4ICsgcG9zLmNvbHVtbjsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuJHNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgfTsKICAgIHJldHVybiBEb2N1bWVudDsKfSgpKTsKRG9jdW1lbnQucHJvdG90eXBlLiRhdXRvTmV3TGluZSA9ICIiOwpEb2N1bWVudC5wcm90b3R5cGUuJG5ld0xpbmVNb2RlID0gImF1dG8iOwpvb3AuaW1wbGVtZW50KERvY3VtZW50LnByb3RvdHlwZSwgRXZlbnRFbWl0dGVyKTsKZXhwb3J0cy5Eb2N1bWVudCA9IERvY3VtZW50OwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvbGliL2RlZXBfY29weSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7ZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIGRlZXBDb3B5KG9iaikgewogICAgaWYgKHR5cGVvZiBvYmogIT09ICJvYmplY3QiIHx8ICFvYmopCiAgICAgICAgcmV0dXJuIG9iajsKICAgIHZhciBjb3B5OwogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgIGNvcHkgPSBbXTsKICAgICAgICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBvYmoubGVuZ3RoOyBrZXkrKykgewogICAgICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb3B5OwogICAgfQogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopICE9PSAiW29iamVjdCBPYmplY3RdIikKICAgICAgICByZXR1cm4gb2JqOwogICAgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikKICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICByZXR1cm4gY29weTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMubGFzdCA9IGZ1bmN0aW9uIChhKSB7CiAgICByZXR1cm4gYVthLmxlbmd0aCAtIDFdOwp9OwpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7Cn07CmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgIHZhciByZXN1bHQgPSAnJzsKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICBpZiAoY291bnQgJiAxKQogICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nOwogICAgICAgIGlmIChjb3VudCA+Pj0gMSkKICAgICAgICAgICAgc3RyaW5nICs9IHN0cmluZzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn07CnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsKdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOwp9OwpleHBvcnRzLmNvcHlPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7CiAgICB2YXIgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KGFycmF5W2ldKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwpleHBvcnRzLmRlZXBDb3B5ID0gcmVxdWlyZSgiLi9kZWVwX2NvcHkiKS5kZWVwQ29weTsKZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24gKGFycikgewogICAgdmFyIG1hcCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXBbYXJyW2ldXSA9IDE7CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmNyZWF0ZU1hcCA9IGZ1bmN0aW9uIChwcm9wcykgewogICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKHZhciBpIGluIHByb3BzKSB7CiAgICAgICAgbWFwW2ldID0gcHJvcHNbaV07CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24gKGFycmF5LCB2YWx1ZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7CiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgICAgICB9CiAgICB9Cn07CmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cn07CmV4cG9ydHMuZXNjYXBlSFRNTCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgIHJldHVybiAoIiIgKyBzdHIpLnJlcGxhY2UoLyYvZywgIiYjMzg7IikucmVwbGFjZSgvIi9nLCAiJiMzNDsiKS5yZXBsYWNlKC8nL2csICImIzM5OyIpLnJlcGxhY2UoLzwvZywgIiYjNjA7Iik7Cn07CmV4cG9ydHMuZ2V0TWF0Y2hPZmZzZXRzID0gZnVuY3Rpb24gKHN0cmluZywgcmVnRXhwKSB7CiAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgc3RyaW5nLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgbWF0Y2hlcy5wdXNoKHsKICAgICAgICAgICAgb2Zmc2V0OiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDJdLAogICAgICAgICAgICBsZW5ndGg6IHN0ci5sZW5ndGgKICAgICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIG1hdGNoZXM7Cn07CmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24gKGZjbikgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7CiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwogICAgZGVmZXJyZWQuaXNQZW5kaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aW1lcjsKICAgIH07CiAgICByZXR1cm4gZGVmZXJyZWQ7Cn07CmV4cG9ydHMuZGVsYXllZENhbGwgPSBmdW5jdGlvbiAoZmNuLCBkZWZhdWx0VGltZW91dCkgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIF9zZWxmID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IGRlZmF1bHRUaW1lb3V0KTsKICAgIH07CiAgICBfc2VsZi5kZWxheSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7CiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgZGVmYXVsdFRpbWVvdXQpOwogICAgfTsKICAgIF9zZWxmLnNjaGVkdWxlID0gX3NlbGY7CiAgICBfc2VsZi5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgX3NlbGYuY2FuY2VsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgfTsKICAgIF9zZWxmLmlzUGVuZGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGltZXI7CiAgICB9OwogICAgcmV0dXJuIF9zZWxmOwp9OwpleHBvcnRzLnN1cHBvcnRzTG9va2JlaGluZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRyeSB7CiAgICAgICAgbmV3IFJlZ0V4cCgnKD88PS4pJyk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9OwpleHBvcnRzLnN1cHBvcnRzVW5pY29kZUZsYWcgPSBmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIG5ldyBSZWdFeHAoJ14uJCcsICd1Jyk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3dvcmtlci9taXJyb3IiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOwogICAgCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWxheWVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOwogICAgCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgICAgICAgaWYgKGRhdGFbMF0uc3RhcnQpIHsKICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGFzKGRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgdmFyIGQsIGVycjsgCiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2krMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IHthY3Rpb246ICJpbnNlcnQiLCBzdGFydDogZGF0YVtpXSwgbGluZXM6IGRhdGFbaSsxXX07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGQgPSB7YWN0aW9uOiAicmVtb3ZlIiwgc3RhcnQ6IGRhdGFbaV0sIGVuZDogZGF0YVtpKzFdfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKChkLmFjdGlvbiA9PSAiaW5zZXJ0IiA/IGQuc3RhcnQgOiBkLmVuZCkucm93ID49IGRvYy4kbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCJJbnZhbGlkIGRlbHRhIik7CiAgICAgICAgICAgICAgICAgICAgZXJyLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF9zZWxmLiRwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0xlbmd0aDogZG9jLiRsaW5lcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkLnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGQuZW5kCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGEoZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKF9zZWxmLiR0aW1lb3V0KQogICAgICAgICAgICByZXR1cm4gZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUoX3NlbGYuJHRpbWVvdXQpOwogICAgICAgIF9zZWxmLm9uVXBkYXRlKCk7CiAgICB9KTsKfTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy4kdGltZW91dCA9IDUwMDsKICAgIAogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0OwogICAgfTsKICAgIAogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgewogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOwogICAgfTsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIAogICAgdGhpcy5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFVwZGF0ZS5pc1BlbmRpbmcoKTsKICAgIH07CiAgICAKfSkuY2FsbChNaXJyb3IucHJvdG90eXBlKTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL21vZGUvanNvbi9qc29uX3BhcnNlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCiAgICAgICAgY2gsICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIKICAgICAgICBlc2NhcGVlID0gewogICAgICAgICAgICAnIic6ICAnIicsCiAgICAgICAgICAgICdcXCc6ICdcXCcsCiAgICAgICAgICAgICcvJzogICcvJywKICAgICAgICAgICAgYjogICAgJ1xiJywKICAgICAgICAgICAgZjogICAgJ1xmJywKICAgICAgICAgICAgbjogICAgJ1xuJywKICAgICAgICAgICAgcjogICAgJ1xyJywKICAgICAgICAgICAgdDogICAgJ1x0JwogICAgICAgIH0sCiAgICAgICAgdGV4dCwKCiAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgewoKICAgICAgICAgICAgdGhyb3cgewogICAgICAgICAgICAgICAgbmFtZTogICAgJ1N5bnRheEVycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG0sCiAgICAgICAgICAgICAgICBhdDogICAgICBhdCwKICAgICAgICAgICAgICAgIHRleHQ6ICAgIHRleHQKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBuZXh0ID0gZnVuY3Rpb24gKGMpIHsKCiAgICAgICAgICAgIGlmIChjICYmIGMgIT09IGNoKSB7CiAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CiAgICAgICAgICAgIGF0ICs9IDE7CiAgICAgICAgICAgIHJldHVybiBjaDsKICAgICAgICB9LAoKICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB2YXIgbnVtYmVyLAogICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CgogICAgICAgICAgICBpZiAoY2ggPT09ICctJykgewogICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOwogICAgICAgICAgICAgICAgbmV4dCgnLScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnLicpIHsKICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnZScgfHwgY2ggPT09ICdFJykgewogICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtYmVyID0gK3N0cmluZzsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgbnVtYmVyIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIGhleCwKICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKICAgICAgICAgICAgICAgIHVmZmZmOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gcGFyc2VJbnQobmV4dCgpLCAxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJcbiIgfHwgY2ggPT0gIlxyIikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB3aGlsZSAoY2ggJiYgY2ggPD0gJyAnKSB7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICBuZXh0KCduJyk7CiAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKICAgICAgICB9LAoKICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgoKICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnWycpIHsKICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBhcnJheSIpOwogICAgICAgIH0sCgogICAgICAgIG9iamVjdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBrZXksCiAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKCiAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CiAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CiAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsgICAvLyBlbXB0eSBvYmplY3QKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IHN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CiAgICAgICAgfTsKCiAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgd2hpdGUoKTsKICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgY2FzZSAneyc6CiAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknID8gbnVtYmVyKCkgOiB3b3JkKCk7CiAgICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikgewogICAgICAgIHZhciByZXN1bHQ7CgogICAgICAgIHRleHQgPSBzb3VyY2U7CiAgICAgICAgYXQgPSAwOwogICAgICAgIGNoID0gJyAnOwogICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CiAgICAgICAgd2hpdGUoKTsKICAgICAgICBpZiAoY2gpIHsKICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gd2Fsayhob2xkZXIsIGtleSkgewogICAgICAgICAgICB2YXIgaywgdiwgdmFsdWUgPSBob2xkZXJba2V5XTsKICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHdhbGsodmFsdWUsIGspOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVba107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJldml2ZXIuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpOwogICAgICAgIH0oeycnOiByZXN1bHR9LCAnJykgOiByZXN1bHQ7CiAgICB9Owp9KTsKCmFjZS5kZWZpbmUoImFjZS9tb2RlL2pzb25fd29ya2VyIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOwp2YXIgcGFyc2UgPSByZXF1aXJlKCIuL2pzb24vanNvbl9wYXJzZSIpOwoKdmFyIEpzb25Xb3JrZXIgPSBleHBvcnRzLkpzb25Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsKICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7CiAgICB0aGlzLnNldFRpbWVvdXQoMjAwKTsKfTsKCm9vcC5pbmhlcml0cyhKc29uV29ya2VyLCBNaXJyb3IpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOwogICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICBwYXJzZSh2YWx1ZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB2YXIgcG9zID0gdGhpcy5kb2MuaW5kZXhUb1Bvc2l0aW9uKGUuYXQtMSk7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgIHJvdzogcG9zLnJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zLmNvbHVtbiwKICAgICAgICAgICAgICAgIHRleHQ6IGUubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImFubm90YXRlIiwgZXJyb3JzKTsKICAgIH07Cgp9KS5jYWxsKEpzb25Xb3JrZXIucHJvdG90eXBlKTsKCn0pOwo="; }, 7907: function(le, m, D) { D.d(m, { Iu: function() { return N; }, cC: function() { return P; }, m0: function() { return Y; } }), D(4987); var U = { en: { array: "Array", auto: "Auto", appendText: "Append", appendTitle: "Append a new field with type 'auto' after this field (Ctrl+Shift+Ins)", appendSubmenuTitle: "Select the type of the field to be appended", appendTitleAuto: "Append a new field with type 'auto' (Ctrl+Shift+Ins)", ascending: "Ascending", ascendingTitle: "Sort the childs of this ${type} in ascending order", actionsMenu: "Click to open the actions menu (Ctrl+M)", cannotParseFieldError: "Cannot parse field into JSON", cannotParseValueError: "Cannot parse value into JSON", collapseAll: "Collapse all fields", compactTitle: "Compact JSON data, remove all whitespaces (Ctrl+Shift+I)", descending: "Descending", descendingTitle: "Sort the childs of this ${type} in descending order", drag: "Drag to move this field (Alt+Shift+Arrows)", duplicateKey: "duplicate key", duplicateText: "Duplicate", duplicateTitle: "Duplicate selected fields (Ctrl+D)", duplicateField: "Duplicate this field (Ctrl+D)", duplicateFieldError: "Duplicate field name", empty: "empty", expandAll: "Expand all fields", expandTitle: `Click to expand/collapse this field (Ctrl+E). Ctrl+Click to expand/collapse including all childs.`, formatTitle: "Format JSON data, with proper indentation and line feeds (Ctrl+I)", insert: "Insert", insertTitle: "Insert a new field with type 'auto' before this field (Ctrl+Ins)", insertSub: "Select the type of the field to be inserted", object: "Object", ok: "Ok", redo: "Redo (Ctrl+Shift+Z)", removeText: "Remove", removeTitle: "Remove selected fields (Ctrl+Del)", removeField: "Remove this field (Ctrl+Del)", repairTitle: "Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.", searchTitle: "Search fields and values", searchNextResultTitle: "Next result (Enter)", searchPreviousResultTitle: "Previous result (Shift + Enter)", selectNode: "Select a node...", showAll: "show all", showMore: "show more", showMoreStatus: "displaying ${visibleChilds} of ${totalChilds} items.", sort: "Sort", sortTitle: "Sort the childs of this ${type}", sortTitleShort: "Sort contents", sortFieldLabel: "Field:", sortDirectionLabel: "Direction:", sortFieldTitle: "Select the nested field by which to sort the array or object", sortAscending: "Ascending", sortAscendingTitle: "Sort the selected field in ascending order", sortDescending: "Descending", sortDescendingTitle: "Sort the selected field in descending order", string: "String", transform: "Transform", transformTitle: "Filter, sort, or transform the childs of this ${type}", transformTitleShort: "Filter, sort, or transform contents", extract: "Extract", extractTitle: "Extract this ${type}", transformQueryTitle: "Enter a JMESPath query", transformWizardLabel: "Wizard", transformWizardFilter: "Filter", transformWizardSortBy: "Sort by", transformWizardSelectFields: "Select fields", transformQueryLabel: "Query", transformPreviewLabel: "Preview", type: "Type", typeTitle: "Change the type of this field", openUrl: "Ctrl+Click or Ctrl+Enter to open url in new window", undo: "Undo last action (Ctrl+Z)", validationCannotMove: "Cannot move a field into a child of itself", autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.', objectType: 'Field type "object". An object contains an unordered set of key/value pairs.', arrayType: 'Field type "array". An array contains an ordered collection of values.', stringType: 'Field type "string". Field type is not determined from the value, but always returned as string.', modeEditorTitle: "Switch Editor Mode", modeCodeText: "Code", modeCodeTitle: "Switch to code highlighter", modeFormText: "Form", modeFormTitle: "Switch to form editor", modeTextText: "Text", modeTextTitle: "Switch to plain text editor", modeTreeText: "Tree", modeTreeTitle: "Switch to tree editor", modeViewText: "View", modeViewTitle: "Switch to tree view", modePreviewText: "Preview", modePreviewTitle: "Switch to preview mode", examples: "Examples", default: "Default", containsInvalidProperties: "Contains invalid properties", containsInvalidItems: "Contains invalid items" }, es: { array: "Matriz", auto: "Auto", appendText: "Agregar", appendTitle: "Agregue un nuevo campo con el tipo 'auto' después de este campo (Ctrl + Shift + Ins)", appendSubmenuTitle: "Seleccione el tipo de campo que se agregará", appendTitleAuto: "Agregue un nuevo campo con el tipo 'auto' (Ctrl + Shift + Ins)", ascending: "Ascendente", ascendingTitle: "Ordene los elementos secundarios de este ${type} en orden ascendente", actionsMenu: "Haga clic para abrir el menú de acciones (Ctrl + M)", cannotParseFieldError: "No se puede parsear el campo en JSON", cannotParseValueError: "No se puede parsear el valor en JSON", collapseAll: "Contraer todos los campos", compactTitle: "Compactar datos JSON, eliminar todos los espacios en blanco (Ctrl + Shift + I)", descending: "Descendente", descendingTitle: "Ordene los hijos de este ${type} en orden descendente", drag: "Arrastre para mover este campo (Alt + Mayús + Flechas)", duplicateKey: "llave duplicada", duplicateText: "Duplicar", duplicateTitle: "Duplicar campos seleccionados (Ctrl + D)", duplicateField: "Duplicar este campo (Ctrl + D)", duplicateFieldError: "Nombre de campo duplicado", empty: "vacio", expandAll: "Expandir todos los campos", expandTitle: `Haga clic para expandir/contraer este campo (Ctrl + E). Ctrl+Clic para expandir/contraer incluyendo todos los niños.`, formatTitle: "Formatee los datos JSON, con la sangría y los avances de línea adecuados (Ctrl + I)", insert: "Insertar", insertTitle: "Inserte un nuevo campo con el tipo 'auto' antes de este campo (Ctrl + Ins)", insertSub: "Seleccione el tipo de campo a insertar", object: "Objeto", ok: "Ok", redo: "Rehacer (Ctrl+Mayús+Z)", removeText: "Eliminar", removeTitle: "Eliminar campos seleccionados (Ctrl+Supr)", removeField: "Eliminar este campo (Ctrl+Supr)", repairTitle: "Reparar JSON: corrija comillas y caracteres de escape, elimine comentarios y notación JSONP, convierta objetos JavaScript en JSON.", searchTitle: "Campos de búsqueda y valores", searchNextResultTitle: "Siguiente resultado (Entrar)", searchPreviousResultTitle: "Resultado anterior (Shift + Enter)", selectNode: "Seleccione un nodo...", showAll: "mostrar todo", showMore: "mostrar más", showMoreStatus: "mostrando ${visibleChilds} de ${totalChilds} elementos.", sort: "Ordenar", sortTitle: "Ordene los hijos de este ${type}", sortTitleShort: "Ordenar contenidos", sortFieldLabel: "Campo:", sortDirectionLabel: "Dirección:", sortFieldTitle: "Seleccione el campo anidado por el cual ordenar la matriz u objeto", sortAscending: "Ascendente", sortAscendingTitle: "Ordenar el campo seleccionado en orden ascendente", sortDescending: "Descendente", sortDescendingTitle: "Ordenar por el campo seleccionado, en orden descendente", string: "Texto", transform: "Transformar", transformTitle: "Filtrar, ordenar o transformar los hijos de este ${type}", transformTitleShort: "Filtrar, ordenar o transformar contenidos", extract: "Extraer", extractTitle: "Extrae este ${type}", transformQueryTitle: "Ingrese una consulta JMESPath", transformWizardLabel: "Wizard", transformWizardFilter: "Filtro", transformWizardSortBy: "Ordenar por", transformWizardSelectFields: "Seleccione un campo", transformQueryLabel: "Consulta", transformPreviewLabel: "Vista Previa", type: "Tipo", typeTitle: "Cambiar el tipo de campo", openUrl: "Ctrl+Click o Ctrl+Enter para abrir la URL en una nueva ventana", undo: "Deshacer la última acción (Ctrl+Z)", validationCannotMove: "No se puede mover un campo a un hijo de sí mismo.", autoType: 'Field type "auto". The field type is automatically determined from the value and can be a string, number, boolean, or null.', objectType: 'Tipo de campo "objeto". Un objeto contiene un conjunto desordenado de pares clave/valor.', arrayType: 'Tipo de campo "matriz". Una matriz contiene una colección ordenada de valores.', stringType: 'Tipo de campo "cadena". El tipo de campo no se determina a partir del valor, pero siempre se devuelve como una cadena.', modeEditorTitle: "Cambiar modo de editor", modeCodeText: "Codigo", modeCodeTitle: "Cambiar al resaltador de código", modeFormText: "Formulario", modeFormTitle: "Cambiar al editor de formularios", modeTextText: "Texto", modeTextTitle: "Cambiar al editor de texto sin formato", modeTreeText: "Arbol", modeTreeTitle: "Cambiar al editor de árbol", modeViewText: "Vista", modeViewTitle: "Cambiar a la vista de árbol", modePreviewText: "Vista Previa", modePreviewTitle: "Cambiar al modo de vista previa", examples: "Ejemplos", default: "Predeterminado", containsInvalidProperties: "Contiene propiedades no validas", containsInvalidItems: "Contiene items no validos" }, "zh-CN": { array: "数组", auto: "自动", appendText: "追加", appendTitle: "在此字段后追加一个类型为“auto”的新字段 (Ctrl+Shift+Ins)", appendSubmenuTitle: "选择要追加的字段类型", appendTitleAuto: "追加类型为“auto”的新字段 (Ctrl+Shift+Ins)", ascending: "升序", ascendingTitle: "升序排列${type}的子节点", actionsMenu: "点击打开动作菜单(Ctrl+M)", cannotParseFieldError: "无法将字段解析为JSON", cannotParseValueError: "无法将值解析为JSON", collapseAll: "缩进所有字段", compactTitle: "压缩JSON数据,删除所有空格 (Ctrl+Shift+I)", descending: "降序", descendingTitle: "降序排列${type}的子节点", drag: "拖拽移动该节点(Alt+Shift+Arrows)", duplicateKey: "重复键", duplicateText: "复制", duplicateTitle: "复制选中字段(Ctrl+D)", duplicateField: "复制该字段(Ctrl+D)", duplicateFieldError: "重复的字段名称", empty: "清空", expandAll: "展开所有字段", expandTitle: `点击 展开/收缩 该字段(Ctrl+E). Ctrl+Click 展开/收缩 包含所有子节点.`, formatTitle: "使用适当的缩进和换行符格式化JSON数据 (Ctrl+I)", insert: "插入", insertTitle: "在此字段前插入类型为“auto”的新字段 (Ctrl+Ins)", insertSub: "选择要插入的字段类型", object: "对象", ok: "Ok", redo: "重做 (Ctrl+Shift+Z)", removeText: "移除", removeTitle: "移除选中字段 (Ctrl+Del)", removeField: "移除该字段 (Ctrl+Del)", repairTitle: "修复JSON:修复引号和转义符,删除注释和JSONP表示法,将JavaScript对象转换为JSON。", selectNode: "选择一个节点...", showAll: "展示全部", showMore: "展示更多", showMoreStatus: "显示${totalChilds}的${visibleChilds}项目.", sort: "排序", sortTitle: "排序${type}的子节点", sortTitleShort: "内容排序", sortFieldLabel: "字段:", sortDirectionLabel: "方向:", sortFieldTitle: "选择用于对数组或对象排序的嵌套字段", sortAscending: "升序排序", sortAscendingTitle: "按照该字段升序排序", sortDescending: "降序排序", sortDescendingTitle: "按照该字段降序排序", string: "字符串", transform: "变换", transformTitle: "筛选,排序,或者转换${type}的子节点", transformTitleShort: "筛选,排序,或者转换内容", extract: "提取", extractTitle: "提取这个 ${type}", transformQueryTitle: "输入JMESPath查询", transformWizardLabel: "向导", transformWizardFilter: "筛选", transformWizardSortBy: "排序", transformWizardSelectFields: "选择字段", transformQueryLabel: "查询", transformPreviewLabel: "预览", type: "类型", typeTitle: "更改字段类型", openUrl: "Ctrl+Click 或者 Ctrl+Enter 在新窗口打开链接", undo: "撤销上次动作 (Ctrl+Z)", validationCannotMove: "无法将字段移入其子节点", autoType: '字段类型 "auto". 字段类型由值自动确定 可以为 string,number,boolean,或者 null.', objectType: '字段类型 "object". 对象包含一组无序的键/值对.', arrayType: '字段类型 "array". 数组包含值的有序集合.', stringType: '字段类型 "string". 字段类型由值自动确定,但始终作为字符串返回.', modeCodeText: "代码", modeCodeTitle: "切换至代码高亮", modeFormText: "表单", modeFormTitle: "切换至表单编辑", modeTextText: "文本", modeTextTitle: "切换至文本编辑", modeTreeText: "树", modeTreeTitle: "切换至树编辑", modeViewText: "视图", modeViewTitle: "切换至树视图", modePreviewText: "预览", modePreviewTitle: "切换至预览模式", examples: "例子", default: "缺省", containsInvalidProperties: "包含无效的属性", containsInvalidItems: "包含无效项目" }, "pt-BR": { array: "Lista", auto: "Automatico", appendText: "Adicionar", appendTitle: "Adicionar novo campo com tipo 'auto' depois deste campo (Ctrl+Shift+Ins)", appendSubmenuTitle: "Selecione o tipo do campo a ser adicionado", appendTitleAuto: "Adicionar novo campo com tipo 'auto' (Ctrl+Shift+Ins)", ascending: "Ascendente", ascendingTitle: "Organizar filhor do tipo ${type} em crescente", actionsMenu: "Clique para abrir o menu de ações (Ctrl+M)", cannotParseFieldError: "Não é possível analisar o campo no JSON", cannotParseValueError: "Não é possível analisar o valor em JSON", collapseAll: "Fechar todos campos", compactTitle: "Dados JSON compactos, remova todos os espaços em branco (Ctrl+Shift+I)", descending: "Descendente", descendingTitle: "Organizar o filhos do tipo ${type} em decrescente", duplicateKey: "chave duplicada", drag: "Arraste para mover este campo (Alt+Shift+Arrows)", duplicateText: "Duplicar", duplicateTitle: "Duplicar campos selecionados (Ctrl+D)", duplicateField: "Duplicar este campo (Ctrl+D)", duplicateFieldError: "Nome do campo duplicado", empty: "vazio", expandAll: "Expandir todos campos", expandTitle: `Clique para expandir/encolher este campo (Ctrl+E). Ctrl+Click para expandir/encolher incluindo todos os filhos.`, formatTitle: "Formate dados JSON, com recuo e feeds de linha adequados (Ctrl+I)", insert: "Inserir", insertTitle: "Inserir um novo campo do tipo 'auto' antes deste campo (Ctrl+Ins)", insertSub: "Selecionar o tipo de campo a ser inserido", object: "Objeto", ok: "Ok", redo: "Refazer (Ctrl+Shift+Z)", removeText: "Remover", removeTitle: "Remover campos selecionados (Ctrl+Del)", removeField: "Remover este campo (Ctrl+Del)", repairTitle: "Repare JSON: corrija aspas e caracteres de escape, remova comentários e notação JSONP, transforme objetos JavaScript em JSON.", selectNode: "Selecione um nódulo...", showAll: "mostrar todos", showMore: "mostrar mais", showMoreStatus: "exibindo ${visibleChilds} de ${totalChilds} itens.", sort: "Organizar", sortTitle: "Organizar os filhos deste ${type}", sortTitleShort: "Organizar os filhos", sortFieldLabel: "Campo:", sortDirectionLabel: "Direção:", sortFieldTitle: "Selecione um campo filho pelo qual ordenar o array ou objeto", sortAscending: "Ascendente", sortAscendingTitle: "Ordenar o campo selecionado por ordem ascendente", sortDescending: "Descendente", sortDescendingTitle: "Ordenar o campo selecionado por ordem descendente", string: "Texto", transform: "Transformar", transformTitle: "Filtrar, ordenar ou transformar os filhos deste ${type}", transformTitleShort: "Filtrar, ordenar ou transformar conteúdos", transformQueryTitle: "Insira uma expressão JMESPath", transformWizardLabel: "Assistente", transformWizardFilter: "Filtro", transformWizardSortBy: "Ordenar por", transformWizardSelectFields: "Selecionar campos", transformQueryLabel: "Expressão", transformPreviewLabel: "Visualizar", type: "Tipo", typeTitle: "Mudar o tipo deste campo", openUrl: "Ctrl+Click ou Ctrl+Enter para abrir link em nova janela", undo: "Desfazer último ação (Ctrl+Z)", validationCannotMove: "Não pode mover um campo como filho dele mesmo", autoType: 'Campo do tipo "auto". O tipo do campo é determinao automaticamente a partir do seu valor e pode ser texto, número, verdade/falso ou nulo.', objectType: 'Campo do tipo "objeto". Um objeto contém uma lista de pares com chave e valor.', arrayType: 'Campo do tipo "lista". Uma lista contem uma coleção de valores ordenados.', stringType: 'Campo do tipo "string". Campo do tipo nao é determinado através do seu valor, mas sempre retornara um texto.', examples: "Exemplos", default: "Revelia", containsInvalidProperties: "Contém propriedades inválidas", containsInvalidItems: "Contém itens inválidos" }, tr: { array: "Dizin", auto: "Otomatik", appendText: "Ekle", appendTitle: "Bu alanın altına 'otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)", appendSubmenuTitle: "Eklenecek alanın tipini seç", appendTitleAuto: "'Otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)", ascending: "Artan", ascendingTitle: "${type}'ın alt tiplerini artan düzende sırala", actionsMenu: "Aksiyon menüsünü açmak için tıklayın (Ctrl+M)", collapseAll: "Tüm alanları kapat", descending: "Azalan", descendingTitle: "${type}'ın alt tiplerini azalan düzende sırala", drag: "Bu alanı taşımak için sürükleyin (Alt+Shift+Arrows)", duplicateKey: "Var olan anahtar", duplicateText: "Aşağıya kopyala", duplicateTitle: "Seçili alanlardan bir daha oluştur (Ctrl+D)", duplicateField: "Bu alandan bir daha oluştur (Ctrl+D)", duplicateFieldError: "Duplicate field name", cannotParseFieldError: "Alan JSON'a ayrıştırılamıyor", cannotParseValueError: "JSON'a değer ayrıştırılamıyor", empty: "boş", expandAll: "Tüm alanları aç", expandTitle: `Bu alanı açmak/kapatmak için tıkla (Ctrl+E). Alt alanlarda dahil tüm alanları açmak için Ctrl+Click `, insert: "Ekle", insertTitle: "Bu alanın üstüne 'otomatik' tipinde yeni bir alan ekle (Ctrl+Ins)", insertSub: "Araya eklenecek alanın tipini seç", object: "Nesne", ok: "Tamam", redo: "Yeniden yap (Ctrl+Shift+Z)", removeText: "Kaldır", removeTitle: "Seçilen alanları kaldır (Ctrl+Del)", removeField: "Bu alanı kaldır (Ctrl+Del)", selectNode: "Bir nesne seç...", showAll: "tümünü göster", showMore: "daha fazla göster", showMoreStatus: "${totalChilds} alanın ${visibleChilds} alt alanları gösteriliyor", sort: "Sırala", sortTitle: "${type}'ın alt alanlarını sırala", sortTitleShort: "İçerikleri sırala", sortFieldLabel: "Alan:", sortDirectionLabel: "Yön:", sortFieldTitle: "Diziyi veya nesneyi sıralamak için iç içe geçmiş alanı seçin", sortAscending: "Artan", sortAscendingTitle: "Seçili alanı artan düzende sırala", sortDescending: "Azalan", sortDescendingTitle: "Seçili alanı azalan düzende sırala", string: "Karakter Dizisi", transform: "Dönüştür", transformTitle: "${type}'ın alt alanlarını filtrele, sırala veya dönüştür", transformTitleShort: "İçerikleri filterele, sırala veya dönüştür", transformQueryTitle: "JMESPath sorgusu gir", transformWizardLabel: "Sihirbaz", transformWizardFilter: "Filtre", transformWizardSortBy: "Sırala", transformWizardSelectFields: "Alanları seç", transformQueryLabel: "Sorgu", transformPreviewLabel: "Önizleme", type: "Tip", typeTitle: "Bu alanın tipini değiştir", openUrl: "URL'i yeni bir pencerede açmak için Ctrl+Click veya Ctrl+Enter", undo: "Son değişikliği geri al (Ctrl+Z)", validationCannotMove: "Alt alan olarak taşınamıyor", autoType: 'Alan tipi "otomatik". Alan türü otomatik olarak değerden belirlenirve bir dize, sayı, boolean veya null olabilir.', objectType: 'Alan tipi "nesne". Bir nesne, sıralanmamış bir anahtar / değer çifti kümesi içerir.', arrayType: 'Alan tipi "dizi". Bir dizi, düzenli değerler koleksiyonu içerir.', stringType: 'Alan tipi "karakter dizisi". Alan türü değerden belirlenmez,ancak her zaman karakter dizisi olarak döndürülür.', modeCodeText: "Kod", modeCodeTitle: "Kod vurgulayıcıya geç", modeFormText: "Form", modeFormTitle: "Form düzenleyiciye geç", modeTextText: "Metin", modeTextTitle: "Düz metin düzenleyiciye geç", modeTreeText: "Ağaç", modeTreeTitle: "Ağaç düzenleyiciye geç", modeViewText: "Görünüm", modeViewTitle: "Ağaç görünümüne geç", examples: "Örnekler", default: "Varsayılan", containsInvalidProperties: "Geçersiz özellikler içeriyor", containsInvalidItems: "Geçersiz öğeler içeriyor" }, ja: { array: "配列", auto: "オート", appendText: "追加", appendTitle: '次のフィールドに"オート"のフィールドを追加 (Ctrl+Shift+Ins)', appendSubmenuTitle: "追加するフィールドの型を選択してください", appendTitleAuto: '"オート"のフィールドを追加 (Ctrl+Shift+Ins)', ascending: "昇順", ascendingTitle: "${type}の子要素を昇順に並べ替え", actionsMenu: "クリックしてアクションメニューを開く (Ctrl+M)", collapseAll: "すべてを折りたたむ", descending: "降順", descendingTitle: "${type}の子要素を降順に並べ替え", drag: "ドラッグして選択中のフィールドを移動 (Alt+Shift+Arrows)", duplicateKey: "複製キー", duplicateText: "複製", duplicateTitle: "選択中のフィールドを複製 (Ctrl+D)", duplicateField: "選択中のフィールドを複製 (Ctrl+D)", duplicateFieldError: "フィールド名が重複しています", cannotParseFieldError: "JSONのフィールドを解析できません", cannotParseValueError: "JSONの値を解析できません", empty: "空", expandAll: "すべてを展開", expandTitle: `クリックしてフィールドを展開/折りたたむ (Ctrl+E). Ctrl+Click ですべての子要素を展開/折りたたむ`, insert: "挿入", insertTitle: "選択中のフィールドの前に新しいフィールドを挿入 (Ctrl+Ins)", insertSub: "挿入するフィールドの型を選択", object: "オブジェクト", ok: "実行", redo: "やり直す (Ctrl+Shift+Z)", removeText: "削除", removeTitle: "選択中のフィールドを削除 (Ctrl+Del)", removeField: "選択中のフィールドを削除 (Ctrl+Del)", selectNode: "ノードを選択...", showAll: "すべてを表示", showMore: "もっと見る", showMoreStatus: "${totalChilds}個のアイテムのうち ${visibleChilds}個を表示しています。", sort: "並べ替え", sortTitle: "${type}の子要素を並べ替え", sortTitleShort: "並べ替え", sortFieldLabel: "フィールド:", sortDirectionLabel: "順序:", sortFieldTitle: "配列またはオブジェクトを並び替えるためのフィールドを選択", sortAscending: "昇順", sortAscendingTitle: "選択中のフィールドを昇順に並び替え", sortDescending: "降順", sortDescendingTitle: "選択中のフィールドを降順に並び替え", string: "文字列", transform: "変換", transformTitle: "${type}の子要素をフィルター・並び替え・変換する", transformTitleShort: "内容をフィルター・並び替え・変換する", extract: "抽出", extractTitle: "${type}を抽出", transformQueryTitle: "JMESPathクエリを入力", transformWizardLabel: "ウィザード", transformWizardFilter: "フィルター", transformWizardSortBy: "並び替え", transformWizardSelectFields: "フィールドを選択", transformQueryLabel: "クエリ", transformPreviewLabel: "プレビュー", type: "型", typeTitle: "選択中のフィールドの型を変更", openUrl: "Ctrl+Click または Ctrl+Enter で 新規ウィンドウでURLを開く", undo: "元に戻す (Ctrl+Z)", validationCannotMove: "子要素に移動できません ", autoType: "オート: フィールドの型は値から自動的に決定されます。 (文字列・数値・ブール・null)", objectType: "オブジェクト: オブジェクトは順序が決まっていないキーと値のペア組み合わせです。", arrayType: "配列: 配列は順序が決まっている値の集合体です。", stringType: "文字列: フィールド型は値から決定されませんが、常に文字列として返されます。", modeCodeText: "コードモード", modeCodeTitle: "ハイライトモードに切り替え", modeFormText: "フォームモード", modeFormTitle: "フォームモードに切り替え", modeTextText: "テキストモード", modeTextTitle: "テキストモードに切り替え", modeTreeText: "ツリーモード", modeTreeTitle: "ツリーモードに切り替え", modeViewText: "ビューモード", modeViewTitle: "ビューモードに切り替え", modePreviewText: "プレビュー", modePreviewTitle: "プレビューに切り替え", examples: "例", default: "デフォルト", containsInvalidProperties: "無効なプロパティが含まれています", containsInvalidItems: "無効なアイテムが含まれています" }, "fr-FR": { array: "Liste", auto: "Auto", appendText: "Ajouter", appendTitle: "Ajouter un champ de type 'auto' après ce champ (Ctrl+Shift+Ins)", appendSubmenuTitle: "Sélectionner le type du champ à ajouter", appendTitleAuto: "Ajouter un champ de type 'auto' (Ctrl+Shift+Ins)", ascending: "Ascendant", ascendingTitle: "Trier les enfants de ce ${type} par ordre ascendant", actionsMenu: "Ouvrir le menu des actions (Ctrl+M)", collapseAll: "Regrouper", descending: "Descendant", descendingTitle: "Trier les enfants de ce ${type} par ordre descendant", drag: "Déplacer (Alt+Shift+Arrows)", duplicateKey: "Dupliquer la clé", duplicateText: "Dupliquer", duplicateTitle: "Dupliquer les champs sélectionnés (Ctrl+D)", duplicateField: "Dupliquer ce champ (Ctrl+D)", duplicateFieldError: "Dupliquer le nom de champ", cannotParseFieldError: "Champ impossible à parser en JSON", cannotParseValueError: "Valeur impossible à parser en JSON", empty: "vide", expandAll: "Étendre", expandTitle: `Étendre/regrouper ce champ (Ctrl+E). Ctrl+Click pour étendre/regrouper avec tous les champs.`, insert: "Insérer", insertTitle: "Insérer un champ de type 'auto' avant ce champ (Ctrl+Ins)", insertSub: "Sélectionner le type de champ à insérer", object: "Objet", ok: "Ok", redo: "Rejouer (Ctrl+Shift+Z)", removeText: "Supprimer", removeTitle: "Supprimer les champs sélectionnés (Ctrl+Del)", removeField: "Supprimer ce champ (Ctrl+Del)", searchTitle: "Rechercher champs et valeurs", searchNextResultTitle: "Résultat suivant (Enter)", searchPreviousResultTitle: "Résultat précédent (Shift + Enter)", selectNode: "Sélectionner un nœud...", showAll: "voir tout", showMore: "voir plus", showMoreStatus: "${visibleChilds} éléments affichés de ${totalChilds}.", sort: "Trier", sortTitle: "Trier les champs de ce ${type}", sortTitleShort: "Trier", sortFieldLabel: "Champ:", sortDirectionLabel: "Direction:", sortFieldTitle: "Sélectionner les champs permettant de trier les listes et objet", sortAscending: "Ascendant", sortAscendingTitle: "Trier les champs sélectionnés par ordre ascendant", sortDescending: "Descendant", sortDescendingTitle: "Trier les champs sélectionnés par ordre descendant", string: "Chaîne", transform: "Transformer", transformTitle: "Filtrer, trier, or transformer les enfants de ce ${type}", transformTitleShort: "Filtrer, trier ou transformer le contenu", extract: "Extraire", extractTitle: "Extraire ce ${type}", transformQueryTitle: "Saisir une requête JMESPath", transformWizardLabel: "Assistant", transformWizardFilter: "Filtrer", transformWizardSortBy: "Trier par", transformWizardSelectFields: "Sélectionner les champs", transformQueryLabel: "Requête", transformPreviewLabel: "Prévisualisation", type: "Type", typeTitle: "Changer le type de ce champ", openUrl: "Ctrl+Click ou Ctrl+Enter pour ouvrir l'url dans une autre fenêtre", undo: "Annuler la dernière action (Ctrl+Z)", validationCannotMove: "Cannot move a field into a child of itself", autoType: 'Champe de type "auto". Ce type de champ est automatiquement déterminé en fonction de la valeur et peut être de type "chaîne", "nombre", "booléen" ou null.', objectType: 'Champ de type "objet". Un objet contient un ensemble non ordonné de paires clé/valeur.', arrayType: 'Champ de type "liste". Une liste contient une collection ordonnée de valeurs.', stringType: `Champ de type "chaîne". Ce type de champ n'est pas déterminé en fonction de la valeur, mais retourne systématiquement une chaîne de caractères.`, modeEditorTitle: "Changer mode d'édition", modeCodeText: "Code", modeCodeTitle: "Activer surlignage code", modeFormText: "Formulaire", modeFormTitle: "Activer formulaire", modeTextText: "Texte", modeTextTitle: "Activer éditeur texte", modeTreeText: "Arbre", modeTreeTitle: "Activer éditeur arbre", modeViewText: "Lecture seule", modeViewTitle: "Activer vue arbre", modePreviewText: "Prévisualisation", modePreviewTitle: "Activer mode prévisualiser", examples: "Exemples", default: "Défaut", containsInvalidProperties: "Contient des propriétés non valides", containsInvalidItems: "Contient des éléments invalides" }, de: { array: "Auflistung", auto: "Auto", appendText: "anhängen", appendTitle: "Fügen Sie nach diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Umschalt+Ein)", appendSubmenuTitle: "Wählen Sie den Typ des neuen Feldes", appendTitleAuto: "Ein neues Feld vom Typ 'auto' hinzufügen (Strg+Umschalt+Ein)", ascending: "Aufsteigend", ascendingTitle: "Sortieren Sie die Elemente dieses ${type} in aufsteigender Reihenfolge", actionsMenu: "Klicken Sie zum Öffnen des Aktionsmenüs (Strg+M)", cannotParseFieldError: "Feld kann nicht in JSON geparst werden", cannotParseValueError: "Wert kann nicht in JSON geparst werden", collapseAll: "Alle Felder zuklappen", compactTitle: "JSON-Daten verdichten, alle Leerzeichen entfernen (Strg+Umschalt+\\)", descending: "Absteigend", descendingTitle: "Sortieren Sie die Elemente dieses ${type} in absteigender Reihenfolge", drag: "Ziehen, um dieses Feld zu verschieben (Alt+Umschalt+Pfeile)", duplicateKey: "Doppelter Schlüssel", duplicateText: "Duplikat", duplicateTitle: "Ausgewählte Felder duplizieren (Strg+D)", duplicateField: "Dieses Feld duplizieren (Strg+D)", duplicateFieldError: "Doppelter Feldname", empty: "leer", expandAll: "Alle Felder anzeigen", expandTitle: `Klicken Sie, um dieses Feld zu erweitern/zu kollabieren (Strg+E). Strg+Klicken Sie, um dieses Feld einschließlich aller Elemente zu erweitern/zu kollabieren.`, formatTitle: "JSON-Daten mit korrekter Einrückung und Zeilenvorschüben formatieren (Strg+\\)", insert: "einfügen", insertTitle: "Fügen Sie vor diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Einfg)", insertSub: "Wählen Sie den Typ des neuen Feldes", object: "Objekt", ok: "Ok", redo: "Wiederholen (Strg+Umschalt+Z)", removeText: "entfernen", removeTitle: "Ausgewählte Felder entfernen (Strg+Entf)", removeField: "Dieses Feld entfernen (Strg+Entf)", repairTitle: "JSON reparieren: Anführungszeichen und Escape-Zeichen korrigieren, Kommentare und JSONP-Notation entfernen, JavaScript-Objekte in JSON umwandeln.", searchTitle: "Suchfelder und Werte", searchNextResultTitle: "Nächstes Ergebnis (Enter)", searchPreviousResultTitle: "Vorheriges Ergebnis (Umschalt + Eingabe)", selectNode: "Wählen Sie einen Knoten aus...", showAll: "alle anzeigen", showMore: "mehr anzeigen", showMoreStatus: "Anzeige von ${visibleChilds} von ${totalChilds}-Elementen.", sort: "Sortieren", sortTitle: "Sortieren Sie die Elemente dieses ${type}", sortTitleShort: "Inhalt sortieren", sortFieldLabel: "Feld:", sortDirectionLabel: "Richtung:", sortFieldTitle: "Wählen Sie das verschachtelte Feld, nach dem das Array oder Objekt sortiert werden soll.", sortAscending: "Aufsteigend", sortAscendingTitle: "Sortieren Sie das ausgewählte Feld in aufsteigender Reihenfolge", sortDescending: "Absteigend", sortDescendingTitle: "Sortieren Sie das ausgewählte Feld in absteigender Reihenfolge", string: "Zeichenfolge", transform: "Verwandeln", transformTitle: "Die Elemente dieses ${type} filtern, sortieren oder transformieren", transformTitleShort: "Inhalte filtern, sortieren oder transformieren", extract: "Auszug", extractTitle: "Extrahieren Sie diesen ${type}", transformQueryTitle: "Eine JMESPath-Abfrage eingeben", transformWizardLabel: "Zauberer", transformWizardFilter: "Filter", transformWizardSortBy: "Sortieren nach", transformWizardSelectFields: "Felder auswählen", transformQueryLabel: "Anfrage", transformPreviewLabel: "Vorschau", type: "Geben Sie ein.", typeTitle: "Ändern Sie den Typ dieses Feldes", openUrl: "Strg+Klicken oder Strg+Eingabe, um die URL in einem neuen Fenster zu öffnen", undo: "Letzte Aktion rückgängig machen (Strg+Z)", validationCannotMove: "Kann ein Feld nicht in ein Kind seiner selbst verschieben", autoType: 'Feldtyp "auto". Der Feldtyp wird automatisch aus dem Wert bestimmt und kann ein String, eine Zahl, boolesch oder null sein.', objectType: 'Feldtyp "Objekt". Ein Objekt enthält eine ungeordnete Menge von Schlüssel/Wert-Paaren.', arrayType: 'Feldtyp "Array". Ein Array enthält eine geordnete Sammlung von Werten.', stringType: 'Feldtyp "Zeichenfolge". Der Feldtyp wird nicht aus dem Wert bestimmt, sondern immer als Zeichenfolge zurückgegeben.', modeEditorTitle: "Editor-Modus umschalten", modeCodeText: "Code", modeCodeTitle: "Umschalten auf Code-Highlighter", modeFormText: "Formular", modeFormTitle: "Zum Formular-Editor wechseln", modeTextText: "Text", modeTextTitle: "Zum Editor für einfachen Text wechseln", modeTreeText: "Baum", modeTreeTitle: "Zum Baum-Editor wechseln", modeViewText: "Siehe", modeViewTitle: "Zur Baumansicht wechseln", modePreviewText: "Vorschau", modePreviewTitle: "In den Vorschau-Modus wechseln", examples: "Beispiele", default: "Standardmäßig", containsInvalidProperties: "Enthält ungültige Eigenschaften", containsInvalidItems: "Enthält ungültige Elemente" }, ru: { array: "Массив", auto: "Авто", appendText: "Добавить", appendTitle: "Добавить новое поле с типом 'авто' после этого поля (Ctrl+Shift+Ins)", appendSubmenuTitle: "Выбрать тип поля для добавления", appendTitleAuto: "Добавить новое поле с типом 'авто' (Ctrl+Shift+Ins)", ascending: "По возрастанию", ascendingTitle: "Сортировать ${type} по возрастанию", actionsMenu: "Нажмите для открытия меню действий (Ctrl+M)", cannotParseFieldError: "Невозможно преобразовать поле в JSON", cannotParseValueError: "Невозможно преобразовать значение в JSON", collapseAll: "Свернуть все", compactTitle: "Минификация JSON (Ctrl+Shift+I)", descending: "По убыванию", descendingTitle: "Сортировать ${type} по убыванию", drag: "Потяните для перемещения этого поля (Alt+Shift+Arrows)", duplicateKey: "повторяющийся ключ", duplicateText: "Дублировать", duplicateTitle: "Дублирование полей (Ctrl+D)", duplicateField: "Дублировать поле (Ctrl+D)", duplicateFieldError: "Дублирование названия поля", empty: "пустой", expandAll: "Развернуть все", expandTitle: `Нажмите для раскрытия/скрытия поля (Ctrl+E) или Ctrl+Click для раскрытия/скрытия всех потомков.`, formatTitle: "Форматирование JSON (Ctrl+I)", insert: "Вставить", insertTitle: "Вставить новое поле с типом 'авто' перед этим полем (Ctrl+Ins)", insertSub: "Выбрать тип поля для вставки", object: "Объект", ok: "ОК", redo: "Повторить (Ctrl+Shift+Z)", removeText: "Удалить", removeTitle: "Удалить выбранные поля (Ctrl+Del)", removeField: "Удалить поле (Ctrl+Del)", repairTitle: "Восстановите JSON: исправьте кавычки и escape-символы, удалите комментарии и нотацию JSONP, модифицируйте объекты JavaScript в JSON.", searchTitle: "Поиск", searchNextResultTitle: "Следующий результат (Enter)", searchPreviousResultTitle: "Предыдущий результат (Shift + Enter)", selectNode: "Выбор узла...", showAll: "показать все", showMore: "больше", showMoreStatus: "${visibleChilds} из ${totalChilds}", sort: "Сортировка", sortTitle: "Сортировка потомков типа ${type}", sortTitleShort: "Сортировка содержимого", sortFieldLabel: "Поле:", sortDirectionLabel: "Направление:", sortFieldTitle: "Выберите поле для сортировки массива или объекта", sortAscending: "По возрастанию", sortAscendingTitle: "Сортировка выбранного поря по возрастанию", sortDescending: "По убыванию", sortDescendingTitle: "Сортировка выбранного поря по убыванию", string: "Строка", transform: "Модификация", transformTitle: "Фильтрация, сортировка или модификация данных типа ${type}", transformTitleShort: "Фильтрация, сортировка или модификация данных", extract: "Извлечение", extractTitle: "Извлечь тип ${type}", transformQueryTitle: "Введите JMESpath запрос", transformWizardLabel: "Мастер", transformWizardFilter: "Фильтр", transformWizardSortBy: "Сортировка", transformWizardSelectFields: "Поля", transformQueryLabel: "Запрос", transformPreviewLabel: "Просмотр", type: "Тип", typeTitle: "Изменить тип этого поля", openUrl: "Ctrl+Click или Ctrl+Enter для открытия url в новом окне", undo: "Отменить (Ctrl+Z)", validationCannotMove: "Поле не может быть перемещено в потомка", autoType: "Тип поля автоматически определяется по значению и может быть строкой, числом, логическим значением или null.", objectType: "Объект содержит неупорядоченный набор пар ключ/значение.", arrayType: "Массив содержит упорядоченный набор значений.", stringType: "Тип поля не определяется из значения, но всегда возвращается как строка.", modeEditorTitle: "Переключение режима редактора", modeCodeText: "Код", modeCodeTitle: "Переключить в режим редактора кода", modeFormText: "Форма", modeFormTitle: "Переключить в режим формы", modeTextText: "Текст", modeTextTitle: "Переключить в режим редактора текста", modeTreeText: "Дерево", modeTreeTitle: "Переключить в режим редактора дерева", modeViewText: "Просмотр дерева", modeViewTitle: "Переключить в режим просмотра дерева", modePreviewText: "Просмотр", modePreviewTitle: "Переключить в режим просмотра", examples: "Примеры", default: "По умолчанию", containsInvalidProperties: "Содержит недопустимые свойства", containsInvalidItems: "Содержит недопустимые элементы" }, ko: { array: "배열", auto: "자동", appendText: "추가", appendTitle: '선택한 요소 아래에 "자동" 요소를 추가합니다. (Ctrl + Shift + Ins)', appendSubmenuTitle: "추가할 요소의 유형을 선택해주세요.", appendTitleAuto: '"자동" 요소를 추가합니다. (Ctrl + Shift + Ins)', ascending: "오름차순", ascendingTitle: "선택한 ${type}의 하위 요소를 오름차순 정렬합니다.", actionsMenu: "메뉴 열기 (Ctrl + M)", cannotParseFieldError: "JSON의 요소를 해석할 수 없습니다.", cannotParseValueError: "JSON의 값을 해석할 수 없습니다.", collapseAll: "모두 접기", compactTitle: "모든 공백을 제거하여 JSON 데이터를 작게 만듭니다. (Ctrl + Shift + I)", descending: "내림차순", descendingTitle: "선택한 ${type}의 하위 요소를 내림차순으로 정렬", drag: "드래그하여 요소를 이동합니다. (Alt + Shift + Arrows)", duplicateKey: "복제키", duplicateText: "복제", duplicateTitle: "선택한 요소를 복제합니다. (Ctrl + D)", duplicateField: "선택한 요소를 복제합니다. (Ctrl + D)", duplicateFieldError: "요소 이름이 중복되었습니다.", empty: "비어있음", expandAll: "모두 열기", expandTitle: `클릭하여 요소를 열거나 닫습니다. (Ctrl + E) Ctrl + Click으로 모든 하위 요소를 열거나 닫습니다.`, formatTitle: "적절한 들여쓰기 및 줄바꿈으로 JSON 데이터를 정형화합니다. (Ctrl + I)", insert: "삽입", insertTitle: "선택한 요소 위에 새요소를 삽입합니다. (Ctrl + Ins)", insertSub: "삽입할 요소의 유형을 선택해주세요.", object: "객체", ok: "확인", redo: "다시 실행 (Ctrl + Shift + Z)", removeText: "삭제", removeTitle: "선택한 요소를 삭제합니다. (Ctrl + Del)", removeField: "선택한 요소를 삭제합니다. (Ctrl + Del)", repairTitle: "JSON 교정: JSON 내의 주석과 JSONP 표기법을 지우고 따옴표와 이스케이프 문자를 수정합니다.", searchTitle: "요소 또는 값 찾기", searchNextResultTitle: "다음으로 찾기 (Enter)", searchPreviousResultTitle: "이전으로 찾기 (Shift + Enter)", selectNode: "요소를 선택해주세요...", showAll: "모두보기", showMore: "더보기", showMoreStatus: "${totalChilds} 개의 항목 중 ${visibleChilds} 개를 표시합니다.", sort: "정렬", sortTitle: "선택한 ${type}의 하위 요소를 정렬합니다.", sortTitleShort: "정렬", sortFieldLabel: "요소:", sortDirectionLabel: "순서:", sortFieldTitle: "배열이나 객체를 정렬하는 요소를 선택해주세요.", sortAscending: "오름차순", sortAscendingTitle: "선택한 요소를 오름차순으로 정렬합니다.", sortDescending: "내림차순", sortDescendingTitle: "선택한 요소를 내림차순으로 정렬합니다.", string: "문자", transform: "변환", transformTitle: "선택한 ${type}의 하위 요소를 필터하거나 정렬 또는 변환합니다.", transformTitleShort: "내용을 필터하거나 정렬 또는 변환합니다.", extract: "추출", extractTitle: "선택한 ${type}의 값을 최상위에 위치시킵니다.", transformQueryTitle: "JMESPath 쿼리를 입력해주세요.", transformWizardLabel: "마법사", transformWizardFilter: "필터", transformWizardSortBy: "정렬", transformWizardSelectFields: "요소를 선택해주세요.", transformQueryLabel: "쿼리", transformPreviewLabel: "미리보기", type: "유형", typeTitle: "선택한 요소의 유형을 변경합니다.", openUrl: "Ctrl + Click 또는 Ctrl + Enter로 새 창에서 URL 열기", undo: "실행 취소 (Ctrl + Z)", validationCannotMove: "하위 요소로 이동할 수 없습니다.", autoType: "자동: 요소의 형식이 값의 유형으로 결정됩니다. 문자, 숫자, 부울, 또는 null만 허용됩니다.", objectType: "객체: 순서대로 나열되지 않은 이름/값 쌍으로 이루어진 집합입니다.", arrayType: "배열: 순서대로 나열된 값의 집합입니다.", stringType: "문자: 요소의 유형이 값에서 결정되지 않지만 항상 문자로 반환됩니다.", modeEditorTitle: "편집기 유형 변경", modeCodeText: "코드", modeCodeTitle: "형식 교정을 도와주는 기능이 포함된 문자 편집기", modeFormText: "입력 양식", modeFormTitle: "정해진 요소에 값을 입력하는 편집기", modeTextText: "문자", modeTextTitle: "단순 문자 편집기", modeTreeText: "트리", modeTreeTitle: "트리 구조로 표시되는 편집기", modeViewText: "보기", modeViewTitle: "읽기전용 트리 구조로 JSON을 표시", modePreviewText: "미리보기", modePreviewTitle: "읽기전용 문자로 JSON을 표시", examples: "예제", default: "기본값", containsInvalidProperties: "잘못된 속성이 포함되어 있습니다.", containsInvalidItems: "잘못된 항목이 포함되어 있습니다" } }, x = Object.keys(U), H = "en", z = typeof navigator < "u" ? navigator.language || navigator.userLanguage : void 0, j = x.find(function(A) { return A === z; }) || H; function Y(A) { var f; A && ((f = x.find(function(R) { return R === A; })) && (j = f)); } function P(A) { if (A) for (var f in A) (function(R) { x.find(function(y) { return y === R; }) || x.push(R), U[R] = Object.assign({}, U[H], U[R], A[R]); })(f); } function N(A, f, R) { var y = U[R = R || j][A] || U[H][A] || A; if (f) for (var C in f) y = y.replace("${" + C + "}", f[C]); return y; } }, 6056: function(le, U, D) { D.d(U, { J: function() { return j; }, r: function() { return z; } }); var U = D(5156), x = D.n(U), H = D(9791); function z(Y, R) { var N, A = R.sort, f = R.filter, R = R.projection, y = ""; return f ? (N = f.field !== "@" ? ["0"].concat((0, H.parsePath)("." + f.field)) : ["0"], N = typeof (0, H.get)(Y, N) == "string" ? f.value : (0, H.parseString)(f.value), y += "[? " + f.field + " " + f.relation + " `" + JSON.stringify(N) + "`]") : y += Array.isArray(Y) ? "[*]" : "@", A && (A.direction === "desc" ? y += " | reverse(sort_by(@, &" + A.field + "))" : y += " | sort_by(@, &" + A.field + ")"), R && (y[y.length - 1] !== "]" && (y += " | [*]"), R.fields.length === 1 ? y += "." + R.fields[0] : 1 < R.fields.length && (y += ".{" + R.fields.map(function(C) { var d = C.split("."); return d[d.length - 1] + ": " + C; }).join(", ") + "}")), y; } function j(Y, P) { return x().search(Y, P); } }, 4987: function() { function le(m) { m === void 0 || "remove" in m || Object.defineProperty(m, "remove", { configurable: true, enumerable: true, writable: true, value: function() { this.parentNode !== void 0 && this.parentNode.removeChild(this); } }); } typeof Element < "u" && (window.Element !== void 0 && le(window.Element.prototype), window.CharacterData !== void 0 && le(window.CharacterData.prototype), window.DocumentType !== void 0) && le(window.DocumentType.prototype), Array.prototype.findIndex || Object.defineProperty(Array.prototype, "findIndex", { value: function(m) { for (var D = 0; D < this.length; D++) { var U = this[D]; if (m.call(this, U, D, this)) return D; } return -1; }, configurable: true, writable: true }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", { value: function(m) { return m = this.findIndex(m), this[m]; }, configurable: true, writable: true }), String.prototype.trim || (String.prototype.trim = function() { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); }); }, 341: function(le, h, d) { d.r(h), d.d(h, { previewModeMixins: function() { return l; } }); var U = d(1262), x = d(4188), H = d(6436), z = d(2474); function j(n) { return (j = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(o) { return typeof o; } : function(o) { return o && typeof Symbol == "function" && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; })(n); } function Y(n, o) { for (var i = 0; i < o.length; i++) { var a = o[i]; a.enumerable = a.enumerable || false, a.configurable = true, "value" in a && (a.writable = true), Object.defineProperty(n, function(r) { return r = function(e2, t) { if (j(e2) !== "object" || e2 === null) return e2; var s = e2[Symbol.toPrimitive]; if (s === void 0) return (t === "string" ? String : Number)(e2); if (s = s.call(e2, t || "default"), j(s) !== "object") return s; throw new TypeError("@@toPrimitive must return a primitive value."); }(r, "string"), j(r) === "symbol" ? r : String(r); }(a.key), a); } } var P = function() { function n(a, r, e2) { if (!(this instanceof n)) throw new TypeError("Cannot call a class as a function"); this.onChange = a, this.calculateItemSize = r || function() { return 1; }, this.limit = e2, this.items = [], this.index = -1; } var o, i; return o = n, (i = [{ key: "add", value: function(a) { for (; this._calculateHistorySize() > this.limit && 1 < this.items.length; ) this.items.shift(), this.index--; this.items = this.items.slice(0, this.index + 1), this.items.push(a), this.index++, this.onChange(); } }, { key: "_calculateHistorySize", value: function() { var a = this.calculateItemSize, r = 0; return this.items.forEach(function(e2) { r += a(e2); }), r; } }, { key: "undo", value: function() { if (this.canUndo()) return this.index--, this.onChange(), this.items[this.index]; } }, { key: "redo", value: function() { if (this.canRedo()) return this.index++, this.onChange(), this.items[this.index]; } }, { key: "canUndo", value: function() { return 0 < this.index; } }, { key: "canRedo", value: function() { return this.index < this.items.length - 1; } }, { key: "clear", value: function() { this.items = [], this.index = -1, this.onChange(); } }]) && Y(o.prototype, i), Object.defineProperty(o, "prototype", { writable: false }), n; }(), N = d(7907), A = d(6056), f = d(6617), R = d(6210), y = d(2558), h = d(8458), C = d(9791), d = h.textModeMixins[0].mixin, h = { create: function(a) { var o = 1 < arguments.length && arguments[1] !== void 0 ? arguments[1] : {}, i = (o.statusBar === void 0 && (o.statusBar = true), o.mainMenuBar = o.mainMenuBar !== false, o.enableSort = o.enableSort !== false, o.enableTransform = o.enableTransform !== false, o.createQuery = o.createQuery || A.r, o.executeQuery = o.executeQuery || A.J, typeof (this.options = o).indentation == "number" ? this.indentation = Number(o.indentation) : this.indentation = 2, (0, N.cC)(this.options.languages), (0, N.m0)(this.options.language), this.mode = "preview", this), a = (this.container = a, this.dom = {}, this.json = void 0, this.text = "", this._debouncedValidate = (0, C.debounce)(this.validate.bind(this), this.DEBOUNCE_INTERVAL), this.width = a.clientWidth, this.height = a.clientHeight, this.frame = document.createElement("div"), this.frame.className = "jsoneditor jsoneditor-mode-preview", this.frame.onclick = function(r) { r.preventDefault(); }, { target: this.frame, onFocus: this.options.onFocus || null, onBlur: this.options.onBlur || null }), a = (this.frameFocusTracker = new z.R(a), this.content = document.createElement("div"), this.content.className = "jsoneditor-outer", this.dom.busy = document.createElement("div"), this.dom.busy.className = "jsoneditor-busy", this.dom.busyContent = document.createElement("span"), this.dom.busyContent.textContent = "busy...", this.dom.busy.appendChild(this.dom.busyContent), this.content.appendChild(this.dom.busy), this.dom.previewContent = document.createElement("pre"), this.dom.previewContent.className = "jsoneditor-preview", this.dom.previewText = document.createTextNode(""), this.dom.previewContent.appendChild(this.dom.previewText), this.content.appendChild(this.dom.previewContent), this.options.mainMenuBar && ((0, C.addClassName)(this.content, "has-main-menu-bar"), this.menu = document.createElement("div"), this.menu.className = "jsoneditor-menu", this.frame.appendChild(this.menu), (a = document.createElement("button")).type = "button", a.className = "jsoneditor-format", a.title = (0, N.Iu)("formatTitle"), this.menu.appendChild(a), a.onclick = function() { i.executeWithBusyMessage(function() { try { i.format(); } catch (r) { i._onError(r); } }, "formatting..."); }, (a = document.createElement("button")).type = "button", a.className = "jsoneditor-compact", a.title = (0, N.Iu)("compactTitle"), this.menu.appendChild(a), a.onclick = function() { i.executeWithBusyMessage(function() { try { i.compact(); } catch (r) { i._onError(r); } }, "compacting..."); }, this.options.enableSort && ((a = document.createElement("button")).type = "button", a.className = "jsoneditor-sort", a.title = (0, N.Iu)("sortTitleShort"), a.onclick = function() { i._showSortModal(); }, this.menu.appendChild(a)), this.options.enableTransform && ((a = document.createElement("button")).type = "button", a.title = (0, N.Iu)("transformTitleShort"), a.className = "jsoneditor-transform", a.onclick = function() { i._showTransformModal(); }, this.dom.transform = a, this.menu.appendChild(a)), (a = document.createElement("button")).type = "button", a.className = "jsoneditor-repair", a.title = (0, N.Iu)("repairTitle"), this.menu.appendChild(a), !(a.onclick = function() { i.json === void 0 && i.executeWithBusyMessage(function() { try { i.repair(); } catch (r) { i._onError(r); } }, "repairing..."); }) !== this.options.history && (this.history = new P(function() { i.dom.undo.disabled = !i.history.canUndo(), i.dom.redo.disabled = !i.history.canRedo(); }, function(r) { return 2 * r.text.length; }, x.oW), (a = document.createElement("button")).type = "button", a.className = "jsoneditor-undo jsoneditor-separator", a.title = (0, N.Iu)("undo"), a.onclick = function() { var r = i.history.undo(); r && i._applyHistory(r); }, this.menu.appendChild(a), this.dom.undo = a, (a = document.createElement("button")).type = "button", a.className = "jsoneditor-redo", a.title = (0, N.Iu)("redo"), a.onclick = function() { var r = i.history.redo(); r && i._applyHistory(r); }, this.menu.appendChild(a), this.dom.redo = a, this.history.onChange()), this.options) && this.options.modes && this.options.modes.length && (this.modeSwitcher = new f.x(this.menu, this.options.modes, this.options.mode, function(r) { try { i.setMode(r), i.modeSwitcher.focus(); } catch (e2) { i._onError(e2); } })), Array.isArray(this.options.showErrorTable) ? this.options.showErrorTable.includes(this.mode) : this.options.showErrorTable === true); this.errorTable = new H.Q({ errorTableVisible: a, onToggleVisibility: function() { i.validate(); }, onFocusLine: null, onChangeHeight: function(r) { r = r + (i.dom.statusBar ? i.dom.statusBar.clientHeight : 0) + 1, i.content.style.marginBottom = -r + "px", i.content.style.paddingBottom = r + "px"; } }), this.frame.appendChild(this.content), this.frame.appendChild(this.errorTable.getErrorTable()), this.container.appendChild(this.frame), o.statusBar && ((0, C.addClassName)(this.content, "has-status-bar"), a = document.createElement("div"), (this.dom.statusBar = a).className = "jsoneditor-statusbar", this.frame.appendChild(a), this.dom.fileSizeInfo = document.createElement("span"), this.dom.fileSizeInfo.className = "jsoneditor-size-info", this.dom.fileSizeInfo.innerText = "", a.appendChild(this.dom.fileSizeInfo), this.dom.arrayInfo = document.createElement("span"), this.dom.arrayInfo.className = "jsoneditor-size-info", this.dom.arrayInfo.innerText = "", a.appendChild(this.dom.arrayInfo), a.appendChild(this.errorTable.getErrorCounter()), a.appendChild(this.errorTable.getWarningIcon()), a.appendChild(this.errorTable.getErrorIcon())), this._renderPreview(), this.setSchema(this.options.schema, this.options.schemaRefs); }, _renderPreview: function() { var n = this.getText(); this.dom.previewText.nodeValue = (0, C.limitCharacters)(n, x.WF), this.dom.fileSizeInfo && (this.dom.fileSizeInfo.innerText = "Size: " + (0, C.formatSize)(n.length)), this.dom.arrayInfo && (Array.isArray(this.json) ? this.dom.arrayInfo.innerText = "Array: " + this.json.length + " items" : this.dom.arrayInfo.innerText = ""); }, _onChange: function() { if (this._debouncedValidate(), this.options.onChange) try { this.options.onChange(); } catch { } if (this.options.onChangeJSON) try { this.options.onChangeJSON(this.get()); } catch { } if (this.options.onChangeText) try { this.options.onChangeText(this.getText()); } catch { } } }, l = (h._showSortModal = function() { var n = this; this.executeWithBusyMessage(function() { var o = n.options.modalAnchor || x.qD, i = n.get(); n._renderPreview(), (0, R.showSortModal)(o, i, function(a) { n.executeWithBusyMessage(function() { var r, e2, t; r = i, e2 = a, Array.isArray(r) && (t = (0, C.sort)(r, e2.path, e2.direction), n.sortedBy = e2, n._setAndFireOnChange(t)), (0, C.isObject)(r) && (t = (0, C.sortObjectKeys)(r, e2.direction), n.sortedBy = e2, n._setAndFireOnChange(t)); }, "sorting..."); }, n.sortedBy); }, "parsing..."); }, h._showTransformModal = function() { var n = this; this.executeWithBusyMessage(function() { var r = n.options, o = r.createQuery, i = r.executeQuery, a = r.modalAnchor, r = r.queryDescription, e2 = n.get(); n._renderPreview(), (0, y.showTransformModal)({ container: a || x.qD, json: e2, queryDescription: r, createQuery: o, executeQuery: i, onTransform: function(t) { n.executeWithBusyMessage(function() { var s = i(e2, t); n._setAndFireOnChange(s); }, "transforming..."); } }); }, "parsing..."); }, h.destroy = function() { this.frame && this.container && this.frame.parentNode === this.container && this.container.removeChild(this.frame), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this._debouncedValidate = null, this.history && (this.history.clear(), this.history = null), this.frameFocusTracker.destroy(); }, h.compact = function() { var n = this.get(), o = JSON.stringify(n); this._setTextAndFireOnChange(o, n); }, h.format = function() { var n = this.get(), o = JSON.stringify(n, null, this.indentation); this._setTextAndFireOnChange(o, n); }, h.repair = function() { var n = this.getText(); try { var o = (0, U.K)(n); this._setTextAndFireOnChange(o); } catch { } }, h.focus = function() { this.dom.transform.focus(); }, h.set = function(n) { this.history && this.history.clear(), this._set(n); }, h.update = function(n) { this._set(n); }, h._set = function(n) { this.text = void 0, this.json = n, this._renderPreview(), this._pushHistory(), this._debouncedValidate(); }, h._setAndFireOnChange = function(n) { this._set(n), this._onChange(); }, h.get = function() { var n; return this.json === void 0 && (n = this.getText(), this.json = (0, C.parse)(n)), this.json; }, h.getText = function() { return this.text === void 0 && (this.text = JSON.stringify(this.json, null, this.indentation), this.options.escapeUnicode === true) && (this.text = (0, C.escapeUnicodeChars)(this.text)), this.text; }, h.setText = function(n) { this.history && this.history.clear(), this._setText(n); }, h.updateText = function(n) { this.getText() !== n && this._setText(n); }, h._setText = function(n, o) { var i; this.options.escapeUnicode === true ? this.text = (0, C.escapeUnicodeChars)(n) : this.text = n, this.json = o, this._renderPreview(), this.json === void 0 ? (i = this).executeWithBusyMessage(function() { try { i.json = i.get(), i._renderPreview(), i._pushHistory(); } catch { } }, "parsing...") : this._pushHistory(), this._debouncedValidate(); }, h._setTextAndFireOnChange = function(n, o) { this._setText(n, o), this._onChange(); }, h._applyHistory = function(n) { this.json = n.json, this.text = n.text, this._renderPreview(), this._debouncedValidate(); }, h._pushHistory = function() { var n; this.history && (n = { text: this.text, json: this.json }, this.history.add(n)); }, h.executeWithBusyMessage = function(n, o) { var i; this.getText().length > x.EX ? ((0, C.addClassName)((i = this).frame, "busy"), i.dom.busyContent.innerText = o, setTimeout(function() { n(), (0, C.removeClassName)(i.frame, "busy"), i.dom.busyContent.innerText = ""; }, 100)) : n(); }, h.validate = d.validate, h._renderErrors = d._renderErrors, [{ mode: "preview", mixin: h, data: "json" }]); }, 6210: function(le, U, D) { D.r(U), D.d(U, { showSortModal: function() { return j; } }); var U = D(483), x = D.n(U), H = D(7907), z = D(9791); function j(Y, C, N, A) { var f = Array.isArray(C) ? (0, z.getChildPaths)(C) : [""], R = A && A.path && (0, z.contains)(f, A.path) ? A.path : f[0], y = A && A.direction || "asc", C = '
    ' + (0, H.Iu)("sort") + "
    " + (0, H.Iu)("sortFieldLabel") + '
    ' + (0, H.Iu)("sortDirectionLabel") + '
    '; x()({ parent: Y, content: C, overlayClass: "jsoneditor-modal-overlay", overlayStyles: { backgroundColor: "rgb(1,1,1)", opacity: 0.3 }, modalClass: "jsoneditor-modal jsoneditor-modal-sort" }).afterCreate(function(d) { var h = d.modalElem().querySelector("form"), l = d.modalElem().querySelector("#ok"), n = d.modalElem().querySelector("#field"), o = d.modalElem().querySelector("#direction"); function i(a) { o.value = a, o.className = "jsoneditor-button-group jsoneditor-button-group-value-" + o.value; } f.forEach(function(a) { var r, e2 = document.createElement("option"); e2.text = (r = a) === "" ? "@" : r[0] === "." ? r.slice(1) : r, e2.value = a, n.appendChild(e2); }), n.value = R || f[0], i(y || "asc"), o.onclick = function(a) { i(a.target.getAttribute("data-value")); }, l.onclick = function(a) { a.preventDefault(), a.stopPropagation(), d.close(), N({ path: n.value, direction: o.value }); }, h && (h.onsubmit = l.onclick); }).afterClose(function(d) { d.destroy(); }).show(); } }, 2558: function(le, x, D) { D.r(x), D.d(x, { showTransformModal: function() { return R; } }); var x = D(483), U = D.n(x), x = D(3879), H = D.n(x), z = D(7907); function j(y) { return (j = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(C) { return typeof C; } : function(C) { return C && typeof Symbol == "function" && C.constructor === Symbol && C !== Symbol.prototype ? "symbol" : typeof C; })(y); } function Y(y, C, d, h) { if (typeof y == "boolean" || y instanceof Boolean || y === null || typeof y == "number" || y instanceof Number || typeof y == "string" || y instanceof String || y instanceof Date) return JSON.stringify(y); if (Array.isArray(y)) { for (var l = y, n = C, o = d, i = h, a = n ? o + n : void 0, r = n ? `[ ` : "[", e2 = 0; e2 < l.length; e2++) { var t = l[e2]; if (n && (r += a), r += t !== void 0 && typeof t != "function" ? Y(t, n, a, i) : "null", e2 < l.length - 1 && (r += n ? `, ` : ","), r.length > i) return r + "..."; } return r += n ? ` ` + o + "]" : "]"; } if (y && j(y) === "object") { var s, c = y, p = C, o = d, g = h, b = p ? o + p : void 0, w = true, E = p ? `{ ` : "{"; if (typeof c.toJSON == "function") return Y(c.toJSON(), p, o, g); for (s in c) if (function(Z, k) { return Object.prototype.hasOwnProperty.call(Z, k); }(c, s)) { var M = c[s]; if (w ? w = false : E += p ? `, ` : ",", (E = (E += p ? b + '"' + s + '": ' : '"' + s + '":') + Y(M, p, b, g)).length > g) return E + "..."; } return E += p ? ` ` + o + "}" : "}"; } } function P(y, C) { for (var d = ""; 0 < C--; ) d += y; return d; } var N = D(9791), A = D(4188), f = 'Enter a JMESPath query to filter, sort, or transform the JSON data.
    To learn JMESPath, go to the interactive tutorial.'; function R(a) { var C = a.container, d = a.json, h = a.queryDescription, h = h === void 0 ? f : h, l = a.createQuery, n = a.executeQuery, o = a.onTransform, i = d, a = '