/** * Sun editor min.js code from cdn if needed to update then paste the code in this section below the * latest code from suneditor cdn i.e suneditor.min.js */ !function (e) { var t = {}; function n(i) { if (t[i]) return t[i].exports; var l = t[i] = { i: i, l: !1, exports: {} }; return e[i].call(l.exports, l, l.exports, n), l.l = !0, l.exports } n.m = e, n.c = t, n.d = function (e, t, i) { n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: i }) }, n.r = function (e) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, n.t = function (e, t) { if (1 & t && (e = n(e)), 8 & t) return e; if (4 & t && "object" == typeof e && e && e.__esModule) return e; var i = Object.create(null); if (n.r(i), Object.defineProperty(i, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e) for (var l in e) n.d(i, l, function (t) { return e[t] }.bind(null, l)); return i }, n.n = function (e) { var t = e && e.__esModule ? function () { return e.default } : function () { return e }; return n.d(t, "a", t), t }, n.o = function (e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, n.p = "", n(n.s = "XJR1") }({ "1kvd": function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { name: "dialog", add: function (e) { const t = e.context; t.dialog = { kind: "", updateModal: !1, _closeSignal: !1 }; let n = e.util.createElement("DIV"); n.className = "se-dialog sun-editor-common"; let i = e.util.createElement("DIV"); i.className = "se-dialog-back", i.style.display = "none"; let l = e.util.createElement("DIV"); l.className = "se-dialog-inner", l.style.display = "none", n.appendChild(i), n.appendChild(l), t.dialog.modalArea = n, t.dialog.back = i, t.dialog.modal = l, t.dialog.modal.addEventListener("mousedown", this._onMouseDown_dialog.bind(e)), t.dialog.modal.addEventListener("click", this._onClick_dialog.bind(e)), t.element.relative.appendChild(n), n = null, i = null, l = null }, _onMouseDown_dialog: function (e) { /se-dialog-inner/.test(e.target.className) ? this.context.dialog._closeSignal = !0 : this.context.dialog._closeSignal = !1 }, _onClick_dialog: function (e) { (/close/.test(e.target.getAttribute("data-command")) || this.context.dialog._closeSignal) && this.plugins.dialog.close.call(this) }, open: function (e, t) { if (this.modalForm) return !1; this.plugins.dialog._bindClose && (this._d.removeEventListener("keydown", this.plugins.dialog._bindClose), this.plugins.dialog._bindClose = null), this.plugins.dialog._bindClose = function (e) { /27/.test(e.keyCode) && this.plugins.dialog.close.call(this) }.bind(this), this._d.addEventListener("keydown", this.plugins.dialog._bindClose), this.context.dialog.updateModal = t, "full" === this.options.popupDisplay ? this.context.dialog.modalArea.style.position = "fixed" : this.context.dialog.modalArea.style.position = "absolute", this.context.dialog.kind = e, this.modalForm = this.context[e].modal; const n = this.context[e].focusElement; "function" == typeof this.plugins[e].on && this.plugins[e].on.call(this, t), this.context.dialog.modalArea.style.display = "block", this.context.dialog.back.style.display = "block", this.context.dialog.modal.style.display = "block", this.modalForm.style.display = "block", n && n.focus() }, _bindClose: null, close: function () { this.plugins.dialog._bindClose && (this._d.removeEventListener("keydown", this.plugins.dialog._bindClose), this.plugins.dialog._bindClose = null); const e = this.context.dialog.kind; this.modalForm.style.display = "none", this.context.dialog.back.style.display = "none", this.context.dialog.modalArea.style.display = "none", this.context.dialog.updateModal = !1, "function" == typeof this.plugins[e].init && this.plugins[e].init.call(this), this.context.dialog.kind = "", this.modalForm = null, this.focus() } }; return void 0 === t && (e.SUNEDITOR_MODULES || Object.defineProperty(e, "SUNEDITOR_MODULES", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_MODULES, "dialog", { enumerable: !0, writable: !1, configurable: !1, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_MODULES a window with a document"); return l(e) } : l(i) }, "3FqI": function (e, t, n) { }, JhlZ: function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { name: "fileBrowser", _xmlHttp: null, _loading: null, add: function (e) { const t = e.context; t.fileBrowser = { _closeSignal: !1, area: null, header: null, tagArea: null, body: null, list: null, tagElements: null, items: [], selectedTags: [], selectorHandler: null, contextPlugin: "", columnSize: 4 }; let n = e.util.createElement("DIV"); n.className = "se-file-browser sun-editor-common"; let i = e.util.createElement("DIV"); i.className = "se-file-browser-back"; let l = e.util.createElement("DIV"); l.className = "se-file-browser-inner", l.innerHTML = this.set_browser(e), n.appendChild(i), n.appendChild(l), this._loading = n.querySelector(".se-loading-box"), t.fileBrowser.area = n, t.fileBrowser.header = l.querySelector(".se-file-browser-header"), t.fileBrowser.titleArea = l.querySelector(".se-file-browser-title"), t.fileBrowser.tagArea = l.querySelector(".se-file-browser-tags"), t.fileBrowser.body = l.querySelector(".se-file-browser-body"), t.fileBrowser.list = l.querySelector(".se-file-browser-list"), t.fileBrowser.tagArea.addEventListener("click", this.onClickTag.bind(e)), t.fileBrowser.list.addEventListener("click", this.onClickFile.bind(e)), l.addEventListener("mousedown", this._onMouseDown_browser.bind(e)), l.addEventListener("click", this._onClick_browser.bind(e)), t.element.relative.appendChild(n), n = null, i = null, l = null }, set_browser: function (e) { return '
' }, _onMouseDown_browser: function (e) { /se-file-browser-inner/.test(e.target.className) ? this.context.fileBrowser._closeSignal = !0 : this.context.fileBrowser._closeSignal = !1 }, _onClick_browser: function (e) { e.stopPropagation(), (/close/.test(e.target.getAttribute("data-command")) || this.context.fileBrowser._closeSignal) && this.plugins.fileBrowser.close.call(this) }, open: function (e, t) { this.plugins.fileBrowser._bindClose && (this._d.removeEventListener("keydown", this.plugins.fileBrowser._bindClose), this.plugins.fileBrowser._bindClose = null), this.plugins.fileBrowser._bindClose = function (e) { /27/.test(e.keyCode) && this.plugins.fileBrowser.close.call(this) }.bind(this), this._d.addEventListener("keydown", this.plugins.fileBrowser._bindClose); const n = this.context.fileBrowser; n.contextPlugin = e, n.selectorHandler = t; const i = this.context[e], l = i.listClass; this.util.hasClass(n.list, l) || (n.list.className = "se-file-browser-list " + l), "full" === this.options.popupDisplay ? n.area.style.position = "fixed" : n.area.style.position = "absolute", n.titleArea.textContent = i.title, n.area.style.display = "block", this.plugins.fileBrowser._drawFileList.call(this, this.context[e].url, this.context[e].header) }, _bindClose: null, close: function () { const e = this.plugins.fileBrowser; e._xmlHttp && e._xmlHttp.abort(), e._bindClose && (this._d.removeEventListener("keydown", e._bindClose), e._bindClose = null); const t = this.context.fileBrowser; t.area.style.display = "none", t.selectorHandler = null, t.selectedTags = [], t.items = [], t.list.innerHTML = t.tagArea.innerHTML = t.titleArea.textContent = "", "function" == typeof this.plugins[t.contextPlugin].init && this.plugins[t.contextPlugin].init.call(this), t.contextPlugin = "" }, showBrowserLoading: function () { this._loading.style.display = "block" }, closeBrowserLoading: function () { this._loading.style.display = "none" }, _drawFileList: function (e, t) { const n = this.plugins.fileBrowser, i = n._xmlHttp = this.util.getXMLHttpRequest(); if (i.onreadystatechange = n._callBackGet.bind(this, i), i.open("get", e, !0), null !== t && "object" == typeof t && this._w.Object.keys(t).length > 0) for (let e in t) i.setRequestHeader(e, t[e]); i.send(null), this.plugins.fileBrowser.showBrowserLoading() }, _callBackGet: function (e) { if (4 === e.readyState) if (this.plugins.fileBrowser._xmlHttp = null, 200 === e.status) try { this.plugins.fileBrowser._drawListItem.call(this, JSON.parse(e.responseText).result, !0) } catch (e) { throw Error('[SUNEDITOR.fileBrowser.drawList.fail] cause : "' + e.message + '"') } finally { this.plugins.fileBrowser.closeBrowserLoading(), this.context.fileBrowser.body.style.maxHeight = this._w.innerHeight - this.context.fileBrowser.header.offsetHeight - 50 + "px" } else if (this.plugins.fileBrowser.closeBrowserLoading(), 0 !== e.status) { const t = e.responseText ? JSON.parse(e.responseText) : e, n = "[SUNEDITOR.fileBrowser.get.serverException] status: " + e.status + ", response: " + (t.errorMessage || e.responseText); throw Error(n) } }, _drawListItem: function (e, t) { const n = this.context.fileBrowser, i = this.context[n.contextPlugin], l = [], o = e.length, s = i.columnSize || n.columnSize, a = s <= 1 ? 1 : Math.round(o / s) || 1, r = i.itemTemplateHandler; let c = "", d = '
', u = 1; for (let n, i, h = 0; h < o; h++)if (n = e[h], i = n.tag ? "string" == typeof n.tag ? n.tag.split(",") : n.tag : [], i = n.tag = i.map((function (e) { return e.trim() })), d += r(n), (h + 1) % a == 0 && u < s && h + 1 < o && (u++, d += '
'), t && i.length > 0) for (let e, t = 0, n = i.length; t < n; t++)e = i[t], e && -1 === l.indexOf(e) && (l.push(e), c += '' + e + ""); d += "
", n.list.innerHTML = d, t && (n.items = e, n.tagArea.innerHTML = c, n.tagElements = n.tagArea.querySelectorAll("A")) }, onClickTag: function (e) { const t = e.target; if (!this.util.isAnchor(t)) return; const n = t.textContent, i = this.plugins.fileBrowser, l = this.context.fileBrowser, o = l.tagArea.querySelector('a[title="' + n + '"]'), s = l.selectedTags, a = s.indexOf(n); a > -1 ? (s.splice(a, 1), this.util.removeClass(o, "on")) : (s.push(n), this.util.addClass(o, "on")), i._drawListItem.call(this, 0 === s.length ? l.items : l.items.filter((function (e) { return e.tag.some((function (e) { return s.indexOf(e) > -1 })) })), !1) }, onClickFile: function (e) { e.preventDefault(), e.stopPropagation(); const t = this.context.fileBrowser, n = t.list; let i = e.target, l = null; if (i === n) return; for (; n !== i.parentNode && (l = i.getAttribute("data-command"), !l);)i = i.parentNode; if (!l) return; const o = t.selectorHandler || this.context[t.contextPlugin].selectorHandler; this.plugins.fileBrowser.close.call(this), o(i) } }; return void 0 === t && (e.SUNEDITOR_MODULES || Object.defineProperty(e, "SUNEDITOR_MODULES", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_MODULES, "fileBrowser", { enumerable: !0, writable: !1, configurable: !1, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_MODULES a window with a document"); return l(e) } : l(i) }, P6u4: function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { code: "en", toolbar: { default: "Default", save: "Save", font: "Font", formats: "Formats", fontSize: "Size", bold: "Bold", underline: "Underline", italic: "Italic", strike: "Strike", subscript: "Subscript", superscript: "Superscript", removeFormat: "Remove Format", fontColor: "Font Color", hiliteColor: "Highlight Color", indent: "Indent", outdent: "Outdent", align: "Align", alignLeft: "Align left", alignRight: "Align right", alignCenter: "Align center", alignJustify: "Align justify", list: "List", orderList: "Ordered list", unorderList: "Unordered list", horizontalRule: "Horizontal line", hr_solid: "Solid", hr_dotted: "Dotted", hr_dashed: "Dashed", table: "Table", link: "Link", math: "Math", image: "Image", video: "Video", audio: "Audio", fullScreen: "Full screen", showBlocks: "Show blocks", codeView: "Code view", undo: "Undo", redo: "Redo", preview: "Preview", print: "print", tag_p: "Paragraph", tag_div: "Normal (DIV)", tag_h: "Header", tag_blockquote: "Quote", tag_pre: "Code", template: "Template", lineHeight: "Line height", paragraphStyle: "Paragraph style", textStyle: "Text style", imageGallery: "Image gallery", mention: "Mention" }, dialogBox: { linkBox: { title: "Insert Link", url: "URL to link", text: "Text to display", newWindowCheck: "Open in new window", downloadLinkCheck: "Download link", bookmark: "Bookmark" }, mathBox: { title: "Math", inputLabel: "Mathematical Notation", fontSizeLabel: "Font Size", previewLabel: "Preview" }, imageBox: { title: "Insert image", file: "Select from files", url: "Image URL", altText: "Alternative text" }, videoBox: { title: "Insert Video", file: "Select from files", url: "Media embed URL, YouTube/Vimeo" }, audioBox: { title: "Insert Audio", file: "Select from files", url: "Audio URL" }, browser: { tags: "Tags", search: "Search" }, caption: "Insert description", close: "Close", submitButton: "Submit", revertButton: "Revert", proportion: "Constrain proportions", basic: "Basic", left: "Left", right: "Right", center: "Center", width: "Width", height: "Height", size: "Size", ratio: "Ratio" }, controller: { edit: "Edit", unlink: "Unlink", remove: "Remove", insertRowAbove: "Insert row above", insertRowBelow: "Insert row below", deleteRow: "Delete row", insertColumnBefore: "Insert column before", insertColumnAfter: "Insert column after", deleteColumn: "Delete column", fixedColumnWidth: "Fixed column width", resize100: "Resize 100%", resize75: "Resize 75%", resize50: "Resize 50%", resize25: "Resize 25%", autoSize: "Auto size", mirrorHorizontal: "Mirror, Horizontal", mirrorVertical: "Mirror, Vertical", rotateLeft: "Rotate left", rotateRight: "Rotate right", maxSize: "Max size", minSize: "Min size", tableHeader: "Table header", mergeCells: "Merge cells", splitCells: "Split Cells", HorizontalSplit: "Horizontal split", VerticalSplit: "Vertical split" }, menu: { spaced: "Spaced", bordered: "Bordered", neon: "Neon", translucent: "Translucent", shadow: "Shadow", code: "Code" } }; return void 0 === t && (e.SUNEDITOR_LANG || Object.defineProperty(e, "SUNEDITOR_LANG", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_LANG, "en", { enumerable: !0, writable: !0, configurable: !0, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_LANG a window with a document"); return l(e) } : l(i) }, WUQj: function (e, t, n) { }, XJR1: function (e, t, n) { "use strict"; n.r(t); n("3FqI"), n("WUQj"); var i = { name: "colorPicker", add: function (e) { const t = e.context; t.colorPicker = { colorListHTML: "", _colorInput: "", _defaultColor: "#000", _styleProperty: "color", _currentColor: "", _colorList: [] }, t.colorPicker.colorListHTML = this.createColorList(e, this._makeColorList) }, createColorList: function (e, t) { const n = e.options, i = e.lang, l = n.colorList && 0 !== n.colorList.length ? n.colorList : ["#ff0000", "#ff5e00", "#ffe400", "#abf200", "#00d8ff", "#0055ff", "#6600ff", "#ff00dd", "#000000", "#ffd8d8", "#fae0d4", "#faf4c0", "#e4f7ba", "#d4f4fa", "#d9e5ff", "#e8d9ff", "#ffd9fa", "#f1f1f1", "#ffa7a7", "#ffc19e", "#faed7d", "#cef279", "#b2ebf4", "#b2ccff", "#d1b2ff", "#ffb2f5", "#bdbdbd", "#f15f5f", "#f29661", "#e5d85c", "#bce55c", "#5cd1e5", "#6699ff", "#a366ff", "#f261df", "#8c8c8c", "#980000", "#993800", "#998a00", "#6b9900", "#008299", "#003399", "#3d0099", "#990085", "#353535", "#670000", "#662500", "#665c00", "#476600", "#005766", "#002266", "#290066", "#660058", "#222222"]; let o = [], s = '
'; for (let e, n = 0, i = l.length; n < i; n++)e = l[n], e && ("string" == typeof e && (o.push(e), n < i - 1) || (o.length > 0 && (s += '
' + t(o) + "
", o = []), "object" == typeof e && (s += '
' + t(e) + "
"))); return s += '
", s }, _makeColorList: function (e) { let t = ""; t += '", t }, init: function (e, t) { const n = this.plugins.colorPicker; let i = t || (n.getColorInNode.call(this, e) || this.context.colorPicker._defaultColor); i = n.isHexColor(i) ? i : n.rgb2hex(i) || i; const l = this.context.colorPicker._colorList; if (l) for (let e = 0, t = l.length; e < t; e++)i.toLowerCase() === l[e].getAttribute("data-value").toLowerCase() ? this.util.addClass(l[e], "active") : this.util.removeClass(l[e], "active"); n.setInputText.call(this, n.colorName2hex.call(this, i)) }, setCurrentColor: function (e) { this.context.colorPicker._currentColor = e, this.context.colorPicker._colorInput.style.borderColor = e }, setInputText: function (e) { e = /^#/.test(e) ? e : "#" + e, this.context.colorPicker._colorInput.value = e, this.plugins.colorPicker.setCurrentColor.call(this, e) }, getColorInNode: function (e) { let t = ""; const n = this.context.colorPicker._styleProperty; for (; e && !this.util.isWysiwygDiv(e) && 0 === t.length;)1 === e.nodeType && e.style[n] && (t = e.style[n]), e = e.parentNode; return t }, isHexColor: function (e) { return /^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(e) }, rgb2hex: function (e) { const t = e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i); return t && 4 === t.length ? "#" + ("0" + parseInt(t[1], 10).toString(16)).slice(-2) + ("0" + parseInt(t[2], 10).toString(16)).slice(-2) + ("0" + parseInt(t[3], 10).toString(16)).slice(-2) : "" }, colorName2hex: function (e) { if (/^#/.test(e)) return e; var t = this.util.createElement("div"); t.style.display = "none", t.style.color = e; var n = this._w.getComputedStyle(this._d.body.appendChild(t)).color.match(/\d+/g).map((function (e) { return parseInt(e, 10) })); return this.util.removeItem(t), n.length >= 3 && "#" + ((1 << 24) + (n[0] << 16) + (n[1] << 8) + n[2]).toString(16).substr(1) } }, l = { name: "fontColor", display: "submenu", add: function (e, t) { e.addModule([i]); const n = e.context; n.fontColor = { previewEl: null, colorInput: null, colorList: null }; let l = this.setSubmenu(e); n.fontColor.colorInput = l.querySelector("._se_color_picker_input"), n.fontColor.colorInput.addEventListener("keyup", this.onChangeInput.bind(e)), l.querySelector("._se_color_picker_submit").addEventListener("click", this.submit.bind(e)), l.querySelector("._se_color_picker_remove").addEventListener("click", this.remove.bind(e)), l.addEventListener("click", this.pickup.bind(e)), n.fontColor.colorList = l.querySelectorAll("li button"), e.initMenuTarget(this.name, t, l), l = null }, setSubmenu: function (e) { const t = e.context.colorPicker.colorListHTML, n = e.util.createElement("DIV"); return n.className = "se-submenu se-list-layer", n.innerHTML = t, n }, on: function () { const e = this.context.colorPicker, t = this.context.fontColor; e._colorInput = t.colorInput; const n = this.wwComputedStyle.color; e._defaultColor = n ? this.plugins.colorPicker.isHexColor(n) ? n : this.plugins.colorPicker.rgb2hex(n) : "#333333", e._styleProperty = "color", e._colorList = t.colorList, this.plugins.colorPicker.init.call(this, this.getSelectionNode(), null) }, onChangeInput: function (e) { this.plugins.colorPicker.setCurrentColor.call(this, e.target.value) }, submit: function () { this.plugins.fontColor.applyColor.call(this, this.context.colorPicker._currentColor) }, pickup: function (e) { e.preventDefault(), e.stopPropagation(), this.plugins.fontColor.applyColor.call(this, e.target.getAttribute("data-value")) }, remove: function () { this.nodeChange(null, ["color"], ["span"], !0), this.submenuOff() }, applyColor: function (e) { if (!e) return; const t = this.util.createElement("SPAN"); t.style.color = e, this.nodeChange(t, ["color"], null, null), this.submenuOff() } }, o = { name: "hiliteColor", display: "submenu", add: function (e, t) { e.addModule([i]); const n = e.context; n.hiliteColor = { previewEl: null, colorInput: null, colorList: null }; let l = this.setSubmenu(e); n.hiliteColor.colorInput = l.querySelector("._se_color_picker_input"), n.hiliteColor.colorInput.addEventListener("keyup", this.onChangeInput.bind(e)), l.querySelector("._se_color_picker_submit").addEventListener("click", this.submit.bind(e)), l.querySelector("._se_color_picker_remove").addEventListener("click", this.remove.bind(e)), l.addEventListener("click", this.pickup.bind(e)), n.hiliteColor.colorList = l.querySelectorAll("li button"), e.initMenuTarget(this.name, t, l), l = null }, setSubmenu: function (e) { const t = e.context.colorPicker.colorListHTML, n = e.util.createElement("DIV"); return n.className = "se-submenu se-list-layer", n.innerHTML = t, n }, on: function () { const e = this.context.colorPicker, t = this.context.hiliteColor; e._colorInput = t.colorInput; const n = this.wwComputedStyle.backgroundColor; e._defaultColor = n ? this.plugins.colorPicker.isHexColor(n) ? n : this.plugins.colorPicker.rgb2hex(n) : "#ffffff", e._styleProperty = "backgroundColor", e._colorList = t.colorList, this.plugins.colorPicker.init.call(this, this.getSelectionNode(), null) }, onChangeInput: function (e) { this.plugins.colorPicker.setCurrentColor.call(this, e.target.value) }, submit: function () { this.plugins.hiliteColor.applyColor.call(this, this.context.colorPicker._currentColor) }, pickup: function (e) { e.preventDefault(), e.stopPropagation(), this.plugins.hiliteColor.applyColor.call(this, e.target.getAttribute("data-value")) }, remove: function () { this.nodeChange(null, ["background-color"], ["span"], !0), this.submenuOff() }, applyColor: function (e) { if (!e) return; const t = this.util.createElement("SPAN"); t.style.backgroundColor = e, this.nodeChange(t, ["background-color"], null, null), this.submenuOff() } }, s = { name: "template", display: "submenu", add: function (e, t) { e.context.template = {}; let n = this.setSubmenu(e); n.querySelector("ul").addEventListener("click", this.pickup.bind(e)), e.initMenuTarget(this.name, t, n), n = null }, setSubmenu: function (e) { const t = e.options.templates; if (!t || 0 === t.length) throw Error('[SUNEDITOR.plugins.template.fail] To use the "template" plugin, please define the "templates" option.'); const n = e.util.createElement("DIV"); n.className = "se-list-layer"; let i = '
", n.innerHTML = i, n }, pickup: function (e) { if (!/^BUTTON$/i.test(e.target.tagName)) return !1; e.preventDefault(), e.stopPropagation(); const t = this.options.templates[e.target.getAttribute("data-value")]; if (!t.html) throw this.submenuOff(), Error('[SUNEDITOR.template.fail] cause : "templates[i].html not found"'); this.setContents(t.html), this.submenuOff() } }, a = n("1kvd"), r = n.n(a), c = { name: "selectMenu", add: function (e) { e.context.selectMenu = { caller: {}, callerContext: null } }, setForm: function () { return '
' }, createList: function (e, t, n) { e.form.innerHTML = "", e.items = t, e.menus = e.form.querySelectorAll("li") }, initEvent: function (e, t) { const n = t.querySelector(".se-select-list"), i = this.context.selectMenu.caller[e] = { form: n, items: [], menus: [], index: -1, item: null, clickMethod: null, callerName: e }; n.addEventListener("mousedown", this.plugins.selectMenu.onMousedown_list), n.addEventListener("mousemove", this.plugins.selectMenu.onMouseMove_list.bind(this, i)), n.addEventListener("click", this.plugins.selectMenu.onClick_list.bind(this, i)) }, onMousedown_list: function (e) { e.preventDefault(), e.stopPropagation() }, onMouseMove_list: function (e, t) { this.util.addClass(e.form, "__se_select-menu-mouse-move"); const n = t.target.getAttribute("data-index"); n && (e.index = 1 * n) }, onClick_list: function (e, t) { const n = t.target.getAttribute("data-index"); n && e.clickMethod.call(this, e.items[n]) }, moveItem: function (e, t) { this.util.removeClass(e.form, "__se_select-menu-mouse-move"), t = e.index + t; const n = e.menus, i = n.length, l = e.index = t >= i ? 0 : t < 0 ? i - 1 : t; for (let e = 0; e < i; e++)e === l ? this.util.addClass(n[e], "active") : this.util.removeClass(n[e], "active"); e.item = e.items[l] }, getItem: function (e, t) { return t = !t || t < 0 ? e.index : t, e.items[t] }, on: function (e, t) { const n = this.context.selectMenu.caller[e]; this.context.selectMenu.callerContext = n, n.clickMethod = t, n.callerName = e }, open: function (e, t) { const n = e.form; n.style.visibility = "hidden", n.style.display = "block", t(n), n.style.visibility = "" }, close: function (e) { e.form.style.display = "none", e.items = [], e.menus = [], e.index = -1, e.item = null }, init: function (e) { e && (e.items = [], e.menus = [], e.index = -1, e.item = null, e.callerName = "", this.context.selectMenu.callerContext = null) } }, d = { name: "anchor", add: function (e) { e.addModule([c]), e.context.anchor = { caller: {}, forms: this.setDialogForm(e), host: (e._w.location.origin + e._w.location.pathname).replace(/\/$/, ""), callerContext: null } }, setDialogForm: function (e) { const t = e.lang, n = e.options.linkRel, i = (e.options.linkRelDefault.default || "").split(" "), l = e.icons, o = e.util.createElement("DIV"); let s = '
" + e.plugins.selectMenu.setForm() + '
' + l.bookmark + '' + l.download + '
", o.innerHTML = s, o }, initEvent: function (e, t) { const n = this.plugins.anchor, i = this.context.anchor.caller[e] = { modal: t, urlInput: null, linkDefaultRel: this.options.linkRelDefault, defaultRel: this.options.linkRelDefault.default || "", currentRel: [], linkAnchor: null, linkValue: "", _change: !1, callerName: e }; "string" == typeof i.linkDefaultRel.default && (i.linkDefaultRel.default = i.linkDefaultRel.default.trim()), "string" == typeof i.linkDefaultRel.check_new_window && (i.linkDefaultRel.check_new_window = i.linkDefaultRel.check_new_window.trim()), "string" == typeof i.linkDefaultRel.check_bookmark && (i.linkDefaultRel.check_bookmark = i.linkDefaultRel.check_bookmark.trim()), i.urlInput = t.querySelector(".se-input-url"), i.anchorText = t.querySelector("._se_anchor_text"), i.newWindowCheck = t.querySelector("._se_anchor_check"), i.downloadCheck = t.querySelector("._se_anchor_download"), i.download = t.querySelector("._se_anchor_download_icon"), i.preview = t.querySelector(".se-link-preview"), i.bookmark = t.querySelector("._se_anchor_bookmark_icon"), i.bookmarkButton = t.querySelector("._se_bookmark_button"), this.plugins.selectMenu.initEvent.call(this, e, t); const l = this.context.selectMenu.caller[e]; this.options.linkRel.length > 0 && (i.relButton = t.querySelector(".se-anchor-rel-btn"), i.relList = t.querySelector(".se-list-layer"), i.relPreview = t.querySelector(".se-anchor-rel-preview"), i.relButton.addEventListener("click", n.onClick_relButton.bind(this, i)), i.relList.addEventListener("click", n.onClick_relList.bind(this, i))), i.newWindowCheck.addEventListener("change", n.onChange_newWindowCheck.bind(this, i)), i.downloadCheck.addEventListener("change", n.onChange_downloadCheck.bind(this, i)), i.anchorText.addEventListener("input", n.onChangeAnchorText.bind(this, i)), i.urlInput.addEventListener("input", n.onChangeUrlInput.bind(this, i)), i.urlInput.addEventListener("keydown", n.onKeyDownUrlInput.bind(this, l)), i.urlInput.addEventListener("focus", n.onFocusUrlInput.bind(this, i, l)), i.urlInput.addEventListener("blur", n.onBlurUrlInput.bind(this, l)), i.bookmarkButton.addEventListener("click", n.onClick_bookmarkButton.bind(this, i)) }, on: function (e, t) { if (t) { if (e.linkAnchor) { this.context.dialog.updateModal = !0; const t = e.linkAnchor.href; e.linkValue = e.preview.textContent = e.urlInput.value = /\#.+$/.test(t) ? t.substr(t.lastIndexOf("#")) : t, e.anchorText.value = e.linkAnchor.textContent.trim() || e.linkAnchor.getAttribute("alt"), e.newWindowCheck.checked = !!/_blank/i.test(e.linkAnchor.target), e.downloadCheck.checked = e.linkAnchor.download } } else this.plugins.anchor.init.call(this, e), e.anchorText.value = this.getSelection().toString(); this.context.anchor.callerContext = e, this.plugins.anchor.setRel.call(this, e, t && e.linkAnchor ? e.linkAnchor.rel : e.defaultRel), this.plugins.anchor.setLinkPreview.call(this, e, e.linkValue), this.plugins.selectMenu.on.call(this, e.callerName, this.plugins.anchor.setHeaderBookmark) }, _closeRelMenu: null, toggleRelList: function (e, t) { if (t) { const t = e.relButton, n = e.relList; this.util.addClass(t, "active"), n.style.visibility = "hidden", n.style.display = "block", this.options.rtl ? n.style.left = t.offsetLeft - n.offsetWidth - 1 + "px" : n.style.left = t.offsetLeft + t.offsetWidth + 1 + "px", n.style.top = t.offsetTop + t.offsetHeight / 2 - n.offsetHeight / 2 + "px", n.style.visibility = "", this.plugins.anchor._closeRelMenu = function (e, t, n) { n && (e.relButton.contains(n.target) || e.relList.contains(n.target)) || (this.util.removeClass(t, "active"), e.relList.style.display = "none", this.modalForm.removeEventListener("click", this.plugins.anchor._closeRelMenu), this.plugins.anchor._closeRelMenu = null) }.bind(this, e, t), this.modalForm.addEventListener("click", this.plugins.anchor._closeRelMenu) } else this.plugins.anchor._closeRelMenu && this.plugins.anchor._closeRelMenu() }, onClick_relButton: function (e, t) { this.plugins.anchor.toggleRelList.call(this, e, !this.util.hasClass(t.target, "active")) }, onClick_relList: function (e, t) { const n = t.target, i = n.getAttribute("data-command"); if (!i) return; const l = e.currentRel, o = this.util.toggleClass(n, "se-checked"), s = l.indexOf(i); o ? -1 === s && l.push(i) : s > -1 && l.splice(s, 1), e.relPreview.title = e.relPreview.textContent = l.join(" ") }, setRel: function (e, t) { const n = e.relList, i = e.currentRel = t ? t.split(" ") : []; if (!n) return; const l = n.querySelectorAll("button"); for (let e, t = 0, n = l.length; t < n; t++)e = l[t].getAttribute("data-command"), i.indexOf(e) > -1 ? this.util.addClass(l[t], "se-checked") : this.util.removeClass(l[t], "se-checked"); e.relPreview.title = e.relPreview.textContent = i.join(" ") }, createHeaderList: function (e, t, n) { const i = this.util.getListChildren(this.context.element.wysiwyg, (function (e) { return /h[1-6]/i.test(e.nodeName) })); if (0 === i.length) return; const l = new this._w.RegExp("^" + n.replace(/^#/, ""), "i"), o = []; let s = ""; for (let e, t = 0, n = i.length; t < n; t++)e = i[t], l.test(e.textContent) && (o.push(e), s += '
  • ' + e.textContent + "
  • "); 0 === o.length ? this.plugins.selectMenu.close.call(this, t) : (this.plugins.selectMenu.createList(t, o, s), this.plugins.selectMenu.open.call(this, t, this.plugins.anchor._setMenuListPosition.bind(this, e))) }, _setMenuListPosition: function (e, t) { t.style.top = e.urlInput.offsetHeight + 1 + "px" }, onKeyDownUrlInput: function (e, t) { switch (t.keyCode) { case 38: t.preventDefault(), t.stopPropagation(), this.plugins.selectMenu.moveItem.call(this, e, -1); break; case 40: t.preventDefault(), t.stopPropagation(), this.plugins.selectMenu.moveItem.call(this, e, 1); break; case 13: e.index > -1 && (t.preventDefault(), t.stopPropagation(), this.plugins.anchor.setHeaderBookmark.call(this, this.plugins.selectMenu.getItem(e, null))) } }, setHeaderBookmark: function (e) { const t = this.context.anchor.callerContext, n = e.id || "h_" + this._w.Math.random().toString().replace(/.+\./, ""); e.id = n, t.urlInput.value = "#" + n, t.anchorText.value.trim() && t._change || (t.anchorText.value = e.textContent), this.plugins.anchor.setLinkPreview.call(this, t, t.urlInput.value), this.plugins.selectMenu.close.call(this, this.context.selectMenu.callerContext), this.context.anchor.callerContext.urlInput.focus() }, onChangeAnchorText: function (e, t) { e._change = !!t.target.value.trim() }, onChangeUrlInput: function (e, t) { const n = t.target.value.trim(); this.plugins.anchor.setLinkPreview.call(this, e, n), /^#/.test(n) ? this.plugins.anchor.createHeaderList.call(this, e, this.context.selectMenu.callerContext, n) : this.plugins.selectMenu.close.call(this, this.context.selectMenu.callerContext) }, onFocusUrlInput: function (e, t) { const n = e.urlInput.value; /^#/.test(n) && this.plugins.anchor.createHeaderList.call(this, e, t, n) }, onBlurUrlInput: function (e) { this.plugins.selectMenu.close.call(this, e) }, setLinkPreview: function (e, t) { const n = e.preview, i = this.options.linkProtocol, l = /^(mailto\:|tel\:|sms\:|https*\:\/\/|#)/.test(t), o = !!i && this._w.RegExp("^" + t.substr(0, i.length)).test(i); e.linkValue = n.textContent = t ? !i || l || o ? l ? t : /^www\./.test(t) ? "http://" + t : this.context.anchor.host + (/^\//.test(t) ? "" : "/") + t : i + t : "", 0 === t.indexOf("#") ? (e.bookmark.style.display = "block", this.util.addClass(e.bookmarkButton, "active")) : (e.bookmark.style.display = "none", this.util.removeClass(e.bookmarkButton, "active")), -1 === t.indexOf("#") && e.downloadCheck.checked ? e.download.style.display = "block" : e.download.style.display = "none" }, setCtx: function (e, t) { e && (t.linkAnchor = e, t.linkValue = e.href, t.currentRel = e.rel.split(" ")) }, updateAnchor: function (e, t, n, i, l) { !/^\#/.test(t) && i.downloadCheck.checked ? e.setAttribute("download", n || t) : e.removeAttribute("download"), i.newWindowCheck.checked ? e.target = "_blank" : e.removeAttribute("target"); const o = i.currentRel.join(" "); o ? e.rel = o : e.removeAttribute("rel"), e.href = t, e.setAttribute("alt", n), l ? 0 === e.children.length && (e.textContent = "") : e.textContent = n }, createAnchor: function (e, t) { if (0 === e.linkValue.length) return null; const n = e.linkValue, i = e.anchorText, l = 0 === i.value.length ? n : i.value, o = e.linkAnchor || this.util.createElement("A"); return this.plugins.anchor.updateAnchor(o, n, l, e, t), e.linkValue = e.preview.textContent = e.urlInput.value = e.anchorText.value = "", o }, onClick_bookmarkButton: function (e) { let t = e.urlInput.value; /^\#/.test(t) ? (t = t.substr(1), e.bookmark.style.display = "none", this.util.removeClass(e.bookmarkButton, "active"), this.plugins.selectMenu.close.call(this, this.context.selectMenu.callerContext)) : (t = "#" + t, e.bookmark.style.display = "block", this.util.addClass(e.bookmarkButton, "active"), e.downloadCheck.checked = !1, e.download.style.display = "none", this.plugins.anchor.createHeaderList.call(this, e, this.context.selectMenu.callerContext, t)), e.urlInput.value = t, this.plugins.anchor.setLinkPreview.call(this, e, t), e.urlInput.focus() }, onChange_newWindowCheck: function (e, t) { "string" == typeof e.linkDefaultRel.check_new_window && (t.target.checked ? this.plugins.anchor.setRel.call(this, e, this.plugins.anchor._relMerge.call(this, e, e.linkDefaultRel.check_new_window)) : this.plugins.anchor.setRel.call(this, e, this.plugins.anchor._relDelete.call(this, e, e.linkDefaultRel.check_new_window))) }, onChange_downloadCheck: function (e, t) { t.target.checked ? (e.download.style.display = "block", e.bookmark.style.display = "none", this.util.removeClass(e.bookmarkButton, "active"), e.linkValue = e.preview.textContent = e.urlInput.value = e.urlInput.value.replace(/^\#+/, ""), "string" == typeof e.linkDefaultRel.check_bookmark && this.plugins.anchor.setRel.call(this, e, this.plugins.anchor._relMerge.call(this, e, e.linkDefaultRel.check_bookmark))) : (e.download.style.display = "none", "string" == typeof e.linkDefaultRel.check_bookmark && this.plugins.anchor.setRel.call(this, e, this.plugins.anchor._relDelete.call(this, e, e.linkDefaultRel.check_bookmark))) }, _relMerge: function (e, t) { const n = e.currentRel; if (!t) return n.join(" "); if (/^only\:/.test(t)) return t = t.replace(/^only\:/, "").trim(), e.currentRel = t.split(" "), t; const i = t.split(" "); for (let e, t = 0, l = i.length; t < l; t++)e = n.indexOf(i[t]), -1 === e && n.push(i[t]); return n.join(" ") }, _relDelete: function (e, t) { if (!t) return e.currentRel.join(" "); /^only\:/.test(t) && (t = t.replace(/^only\:/, "").trim()); const n = e.currentRel.join(" ").replace(this._w.RegExp(t + "\\s*"), ""); return e.currentRel = n.split(" "), n }, init: function (e) { e.linkAnchor = null, e.linkValue = e.preview.textContent = e.urlInput.value = "", e.anchorText.value = "", e.newWindowCheck.checked = !1, e.downloadCheck.checked = !1, e._change = !1, this.plugins.anchor.setRel.call(this, e, e.defaultRel), e.relList && this.plugins.anchor.toggleRelList.call(this, e, !1), this.context.anchor.callerContext = null, this.plugins.selectMenu.init.call(this, this.context.selectMenu.callerContext) } }, u = { name: "link", display: "dialog", add: function (e) { e.addModule([r.a, d]); const t = e.context, n = t.link = { focusElement: null, _linkAnchor: null, anchorCtx: null }; let i = this.setDialog(e); n.modal = i; let l = this.setController_LinkButton(e); n.linkController = l, i.querySelector("form").addEventListener("submit", this.submit.bind(e)), l.addEventListener("click", this.onClick_linkController.bind(e)), t.dialog.modal.appendChild(i), t.element.relative.appendChild(l), e.plugins.anchor.initEvent.call(e, "link", i), n.focusElement = t.anchor.caller.link.urlInput, i = null, l = null }, setDialog: function (e) { const t = e.lang, n = e.util.createElement("DIV"), i = e.icons; n.className = "se-dialog-content", n.style.display = "none"; let l = '
    ' + t.dialogBox.linkBox.title + "
    " + e.context.anchor.forms.innerHTML + '
    "; return n.innerHTML = l, n }, setController_LinkButton: function (e) { const t = e.lang, n = e.icons, i = e.util.createElement("DIV"); return i.className = "se-controller se-controller-link", i.innerHTML = '
    ", i }, open: function () { this.plugins.dialog.open.call(this, "link", "link" === this.currentControllerName) }, submit: function (e) { this.showLoading(), e.preventDefault(), e.stopPropagation(); try { const e = this.plugins.anchor.createAnchor.call(this, this.context.anchor.caller.link, !1); if (this.context.dialog.updateModal) { const e = this.context.link._linkAnchor.childNodes[0]; this.setRange(e, 0, e, e.textContent.length) } else { const t = this.getSelectedElements(); if (t.length > 1) { const n = this.util.createElement(t[0].nodeName); if (n.appendChild(e), !this.insertNode(n, null, !0)) return } else if (!this.insertNode(e, null, !0)) return; this.setRange(e.childNodes[0], 0, e.childNodes[0], e.textContent.length) } } finally { this.plugins.dialog.close.call(this), this.closeLoading(), this.history.push(!1) } return !1 }, active: function (e) { if (e) { if (this.util.isAnchor(e) && null === e.getAttribute("data-image-link")) return this.controllerArray.indexOf(this.context.link.linkController) < 0 && this.plugins.link.call_controller.call(this, e), !0 } else this.controllerArray.indexOf(this.context.link.linkController) > -1 && this.controllersOff(); return !1 }, on: function (e) { this.plugins.anchor.on.call(this, this.context.anchor.caller.link, e) }, call_controller: function (e) { this.editLink = this.context.link._linkAnchor = this.context.anchor.caller.link.linkAnchor = e; const t = this.context.link.linkController, n = t.querySelector("a"); n.href = e.href, n.title = e.textContent, n.textContent = e.textContent, this.util.addClass(e, "on"), this.setControllerPosition(t, e, "bottom", { left: 0, top: 0 }), this.controllersOn(t, e, "link", this.util.removeClass.bind(this.util, this.context.link._linkAnchor, "on")) }, onClick_linkController: function (e) { e.stopPropagation(); const t = e.target.getAttribute("data-command") || e.target.parentNode.getAttribute("data-command"); if (t) { if (e.preventDefault(), /update/.test(t)) this.plugins.dialog.open.call(this, "link", !0); else if (/unlink/.test(t)) { const e = this.util.getChildElement(this.context.link._linkAnchor, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !1), t = this.util.getChildElement(this.context.link._linkAnchor, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !0); this.setRange(e, 0, t, t.textContent.length), this.nodeChange(null, null, ["A"], !1) } else this.util.removeItem(this.context.link._linkAnchor), this.context.anchor.caller.link.linkAnchor = null, this.focus(), this.history.push(!1); this.controllersOff() } }, init: function () { this.context.link.linkController.style.display = "none", this.plugins.anchor.init.call(this, this.context.anchor.caller.link) } }, h = n("ZED3"), p = n.n(h), g = n("ee5k"), m = n.n(g), f = n("gjS+"), _ = n.n(f), b = { name: "image", display: "dialog", add: function (e) { e.addModule([r.a, d, p.a, m.a, _.a]); const t = e.options, n = e.context, i = n.image = { _infoList: [], _infoIndex: 0, _uploadFileLength: 0, focusElement: null, sizeUnit: t._imageSizeUnit, _linkElement: "", _altText: "", _align: "none", _floatClassRegExp: "__se__float\\-[a-z]+", _v_src: { _linkValue: "" }, svgDefaultSize: "30%", base64RenderIndex: 0, _element: null, _cover: null, _container: null, inputX: null, inputY: null, _element_w: 1, _element_h: 1, _element_l: 0, _element_t: 0, _defaultSizeX: "auto", _defaultSizeY: "auto", _origin_w: "auto" === t.imageWidth ? "" : t.imageWidth, _origin_h: "auto" === t.imageHeight ? "" : t.imageHeight, _proportionChecked: !0, _resizing: t.imageResizing, _resizeDotHide: !t.imageHeightShow, _rotation: t.imageRotation, _onlyPercentage: t.imageSizeOnlyPercentage, _ratio: !1, _ratioX: 1, _ratioY: 1, _captionShow: !0, _captionChecked: !1, _caption: null, captionCheckEl: null }; let l = this.setDialog(e); i.modal = l, i.imgInputFile = l.querySelector("._se_image_file"), i.imgUrlFile = l.querySelector("._se_image_url"), i.focusElement = i.imgInputFile || i.imgUrlFile, i.altText = l.querySelector("._se_image_alt"), i.captionCheckEl = l.querySelector("._se_image_check_caption"), i.previewSrc = l.querySelector("._se_tab_content_image .se-link-preview"), l.querySelector(".se-dialog-tabs").addEventListener("click", this.openTab.bind(e)), l.querySelector("form").addEventListener("submit", this.submit.bind(e)), i.imgInputFile && l.querySelector(".se-file-remove").addEventListener("click", this._removeSelectedFiles.bind(i.imgInputFile, i.imgUrlFile, i.previewSrc)), i.imgUrlFile && i.imgUrlFile.addEventListener("input", this._onLinkPreview.bind(i.previewSrc, i._v_src, t.linkProtocol)), i.imgInputFile && i.imgUrlFile && i.imgInputFile.addEventListener("change", this._fileInputChange.bind(i)); const o = l.querySelector(".__se__gallery"); o && o.addEventListener("click", this._openGallery.bind(e)), i.proportion = {}, i.inputX = {}, i.inputY = {}, t.imageResizing && (i.proportion = l.querySelector("._se_image_check_proportion"), i.inputX = l.querySelector("._se_image_size_x"), i.inputY = l.querySelector("._se_image_size_y"), i.inputX.value = t.imageWidth, i.inputY.value = t.imageHeight, i.inputX.addEventListener("keyup", this.setInputSize.bind(e, "x")), i.inputY.addEventListener("keyup", this.setInputSize.bind(e, "y")), i.inputX.addEventListener("change", this.setRatio.bind(e)), i.inputY.addEventListener("change", this.setRatio.bind(e)), i.proportion.addEventListener("change", this.setRatio.bind(e)), l.querySelector(".se-dialog-btn-revert").addEventListener("click", this.sizeRevert.bind(e))), n.dialog.modal.appendChild(l), e.plugins.anchor.initEvent.call(e, "image", l.querySelector("._se_tab_content_url")), i.anchorCtx = e.context.anchor.caller.image, l = null }, setDialog: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); i.className = "se-dialog-content se-dialog-image", i.style.display = "none"; let l = '
    ' + n.dialogBox.imageBox.title + '
    '; if (t.imageFileInput && (l += '
    "), t.imageUrlInput && (l += '
    ' + (t.imageGalleryUrl && e.plugins.imageGallery ? '" : "") + '
    '), l += '
    ', t.imageResizing) { const i = t.imageSizeOnlyPercentage, o = i ? ' style="display: none !important;"' : "", s = t.imageHeightShow ? "" : ' style="display: none !important;"'; l += '
    ', i || !t.imageHeightShow ? l += '
    " : l += '
    ", l += ' ' + n.dialogBox.proportion + '
    " } return l += '
    ", i.innerHTML = l, i }, _fileInputChange: function () { this.imgInputFile.value ? (this.imgUrlFile.setAttribute("disabled", !0), this.previewSrc.style.textDecoration = "line-through") : (this.imgUrlFile.removeAttribute("disabled"), this.previewSrc.style.textDecoration = "") }, _removeSelectedFiles: function (e, t) { this.value = "", e && (e.removeAttribute("disabled"), t.style.textDecoration = "") }, _openGallery: function () { this.callPlugin("imageGallery", this.plugins.imageGallery.open.bind(this, this.plugins.image._setUrlInput.bind(this.context.image)), null) }, _setUrlInput: function (e) { this.altText.value = e.alt, this._v_src._linkValue = this.previewSrc.textContent = this.imgUrlFile.value = e.src, this.imgUrlFile.focus() }, _onLinkPreview: function (e, t, n) { const i = n.target.value.trim(); e._linkValue = this.textContent = i ? t && -1 === i.indexOf("://") && 0 !== i.indexOf("#") ? t + i : -1 === i.indexOf("://") ? "/" + i : i : "" }, fileTags: ["img"], select: function (e) { this.plugins.image.onModifyMode.call(this, e, this.plugins.resizing.call_controller_resize.call(this, e, "image")) }, destroy: function (e) { const t = e || this.context.image._element, n = this.util.getParentElement(t, this.util.isMediaComponent) || t, i = 1 * t.getAttribute("data-index"); let l = n.previousElementSibling || n.nextElementSibling; const o = n.parentNode; this.util.removeItem(n), this.plugins.image.init.call(this), this.controllersOff(), o !== this.context.element.wysiwyg && this.util.removeItemAllParents(o, (function (e) { return 0 === e.childNodes.length }), null), this.focusEdge(l), this.plugins.fileManager.deleteInfo.call(this, "image", i, this.functions.onImageUpload), this.history.push(!1) }, on: function (e) { const t = this.context.image; e ? t.imgInputFile && this.options.imageMultipleFile && t.imgInputFile.removeAttribute("multiple") : (t.inputX.value = t._origin_w = this.options.imageWidth === t._defaultSizeX ? "" : this.options.imageWidth, t.inputY.value = t._origin_h = this.options.imageHeight === t._defaultSizeY ? "" : this.options.imageHeight, t.imgInputFile && this.options.imageMultipleFile && t.imgInputFile.setAttribute("multiple", "multiple")), this.plugins.anchor.on.call(this, t.anchorCtx, e) }, open: function () { this.plugins.dialog.open.call(this, "image", "image" === this.currentControllerName) }, openTab: function (e) { const t = this.context.image.modal, n = "init" === e ? t.querySelector("._se_tab_link") : e.target; if (!/^BUTTON$/i.test(n.tagName)) return !1; const i = n.getAttribute("data-tab-link"); let l, o, s; for (o = t.getElementsByClassName("_se_tab_content"), l = 0; l < o.length; l++)o[l].style.display = "none"; for (s = t.getElementsByClassName("_se_tab_link"), l = 0; l < s.length; l++)this.util.removeClass(s[l], "active"); return t.querySelector("._se_tab_content_" + i).style.display = "block", this.util.addClass(n, "active"), "image" === i && this.context.image.focusElement ? this.context.image.focusElement.focus() : "url" === i && this.context.anchor.caller.image.urlInput.focus(), !1 }, submit: function (e) { const t = this.context.image, n = this.plugins.image; e.preventDefault(), e.stopPropagation(), t._altText = t.altText.value, t._align = t.modal.querySelector('input[name="suneditor_image_radio"]:checked').value, t._captionChecked = t.captionCheckEl.checked, t._resizing && (t._proportionChecked = t.proportion.checked); try { this.context.dialog.updateModal && n.update_image.call(this, !1, !0, !1), t.imgInputFile && t.imgInputFile.files.length > 0 ? (this.showLoading(), n.submitAction.call(this, this.context.image.imgInputFile.files)) : t.imgUrlFile && t._v_src._linkValue.length > 0 && (this.showLoading(), n.onRender_imgUrl.call(this)) } catch (e) { throw this.closeLoading(), Error('[SUNEDITOR.image.submit.fail] cause : "' + e.message + '"') } finally { this.plugins.dialog.close.call(this) } return !1 }, submitAction: function (e) { if (0 === e.length) return; let t = 0, n = []; for (let i = 0, l = e.length; i < l; i++)/image/i.test(e[i].type) && (n.push(e[i]), t += e[i].size); const i = this.options.imageUploadSizeLimit; if (i > 0) { let e = 0; const n = this.context.image._infoList; for (let t = 0, i = n.length; t < i; t++)e += 1 * n[t].size; if (t + e > i) { this.closeLoading(); const n = "[SUNEDITOR.imageUpload.fail] Size of uploadable total images: " + i / 1e3 + "KB"; return void (("function" != typeof this.functions.onImageUploadError || this.functions.onImageUploadError(n, { limitSize: i, currentSize: e, uploadSize: t }, this)) && this.functions.noticeOpen(n)) } } const l = this.context.image; l._uploadFileLength = n.length; const o = { anchor: this.plugins.anchor.createAnchor.call(this, l.anchorCtx, !0), inputWidth: l.inputX.value, inputHeight: l.inputY.value, align: l._align, isUpdate: this.context.dialog.updateModal, element: l._element }; if ("function" == typeof this.functions.onImageUploadBefore) { const e = this.functions.onImageUploadBefore(n, o, this, function (e) { e && this._w.Array.isArray(e.result) ? this.plugins.image.register.call(this, o, e) : this.plugins.image.upload.call(this, o, e) }.bind(this)); if (void 0 === e) return; if (!e) return void this.closeLoading(); this._w.Array.isArray(e) && e.length > 0 && (n = e) } this.plugins.image.upload.call(this, o, n) }, error: function (e, t) { if (this.closeLoading(), "function" != typeof this.functions.onImageUploadError || this.functions.onImageUploadError(e, t, this)) throw this.functions.noticeOpen(e), Error("[SUNEDITOR.plugin.image.error] response: " + e) }, upload: function (e, t) { if (!t) return void this.closeLoading(); if ("string" == typeof t) return void this.plugins.image.error.call(this, t, null); const n = this.options.imageUploadUrl, i = this.context.dialog.updateModal ? 1 : t.length; if ("string" == typeof n && n.length > 0) { const l = new FormData; for (let e = 0; e < i; e++)l.append("file-" + e, t[e]); this.plugins.fileManager.upload.call(this, n, this.options.imageUploadHeader, l, this.plugins.image.callBack_imgUpload.bind(this, e), this.functions.onImageUploadError) } else this.plugins.image.setup_reader.call(this, t, e.anchor, e.inputWidth, e.inputHeight, e.align, i, e.isUpdate) }, callBack_imgUpload: function (e, t) { if ("function" == typeof this.functions.imageUploadHandler) this.functions.imageUploadHandler(t, e, this); else { const n = JSON.parse(t.responseText); n.errorMessage ? this.plugins.image.error.call(this, n.errorMessage, n) : this.plugins.image.register.call(this, e, n) } }, register: function (e, t) { const n = t.result; for (let t, i = 0, l = n.length; i < l; i++) { if (t = { name: n[i].name, size: n[i].size }, e.isUpdate) { this.plugins.image.update_src.call(this, n[i].url, e.element, t); break } this.plugins.image.create_image.call(this, n[i].url, e.anchor, e.inputWidth, e.inputHeight, e.align, t) } this.closeLoading() }, setup_reader: function (e, t, n, i, l, o, s) { try { this.context.image.base64RenderIndex = o; const a = this._w.FileReader, r = [o]; this.context.image.inputX.value = n, this.context.image.inputY.value = i; for (let c, d, u = 0; u < o; u++)c = new a, d = e[u], c.onload = function (e, o, s, a, c) { r[c] = { result: e.result, file: a }, 0 == --this.context.image.base64RenderIndex && (this.plugins.image.onRender_imgBase64.call(this, o, r, s, t, n, i, l), this.closeLoading()) }.bind(this, c, s, this.context.image._element, d, u), c.readAsDataURL(d) } catch (e) { throw this.closeLoading(), Error('[SUNEDITOR.image.setup_reader.fail] cause : "' + e.message + '"') } }, onRender_imgBase64: function (e, t, n, i, l, o, s) { const a = this.plugins.image.update_src, r = this.plugins.image.create_image; for (let c = 0, d = t.length; c < d; c++)e ? (this.context.image._element.setAttribute("data-file-name", t[c].file.name), this.context.image._element.setAttribute("data-file-size", t[c].file.size), a.call(this, t[c].result, n, t[c].file)) : r.call(this, t[c].result, i, l, o, s, t[c].file) }, onRender_imgUrl: function () { const e = this.context.image; if (0 === e._v_src._linkValue.length) return !1; try { const t = { name: e._v_src._linkValue.split("/").pop(), size: 0 }; this.context.dialog.updateModal ? this.plugins.image.update_src.call(this, e._v_src._linkValue, e._element, t) : this.plugins.image.create_image.call(this, e._v_src._linkValue, this.plugins.anchor.createAnchor.call(this, e.anchorCtx, !0), e.inputX.value, e.inputY.value, e._align, t) } catch (e) { throw Error('[SUNEDITOR.image.URLRendering.fail] cause : "' + e.message + '"') } finally { this.closeLoading() } }, onRender_link: function (e, t) { return t ? (t.setAttribute("data-image-link", "image"), e.setAttribute("data-image-link", t.href), t.appendChild(e), t) : e }, setInputSize: function (e, t) { t && 32 === t.keyCode ? t.preventDefault() : this.plugins.resizing._module_setInputSize.call(this, this.context.image, e) }, setRatio: function () { this.plugins.resizing._module_setRatio.call(this, this.context.image) }, checkFileInfo: function () { const e = this.plugins.image, t = this.context.image, n = function (n) { e.onModifyMode.call(this, n, null), e.openModify.call(this, !0), t.inputX.value = t._origin_w, t.inputY.value = t._origin_h; const i = this.util.getFormatElement(n); i && (t._align = i.style.textAlign || i.style.float); this.util.getParentElement(n, this.util.isAnchor) && !t.anchorCtx.linkValue && (t.anchorCtx.linkValue = " "), e.update_image.call(this, !0, !1, !0) }.bind(this); this.plugins.fileManager.checkInfo.call(this, "image", ["img"], this.functions.onImageUpload, n, !0) }, resetFileInfo: function () { this.plugins.fileManager.resetInfo.call(this, "image", this.functions.onImageUpload) }, create_image: function (e, t, n, i, l, o) { const s = this.plugins.image, a = this.context.image; this.context.resizing._resize_plugin = "image"; let r = this.util.createElement("IMG"); r.src = e, r.alt = a._altText, r.setAttribute("data-rotate", "0"), t = s.onRender_link.call(this, r, t), a._resizing && r.setAttribute("data-proportion", a._proportionChecked); const c = this.plugins.component.set_cover.call(this, t), d = this.plugins.component.set_container.call(this, c, "se-image-container"); a._captionChecked && (a._caption = this.plugins.component.create_caption.call(this), a._caption.setAttribute("contenteditable", !1), c.appendChild(a._caption)), a._element = r, a._cover = c, a._container = d, s.applySize.call(this, n, i), s.setAlign.call(this, l, r, c, d), r.onload = s._image_create_onload.bind(this, r, a.svgDefaultSize, d), this.insertComponent(d, !0, !0, !0) && this.plugins.fileManager.setInfo.call(this, "image", r, this.functions.onImageUpload, o, !0), this.context.resizing._resize_plugin = "" }, _image_create_onload: function (e, t, n) { if (0 === e.offsetWidth && this.plugins.image.applySize.call(this, t, ""), this.options.mediaAutoSelect) this.selectComponent(e, "image"); else { const e = this.appendFormatTag(n, null); this.setRange(e, 0, e, 0) } }, update_image: function (e, t, n) { const i = this.context.image; let l, o = i._element, s = i._cover, a = i._container, r = !1; null === s && (r = !0, o = i._element.cloneNode(!0), s = this.plugins.component.set_cover.call(this, o)), null === a ? (s = s.cloneNode(!0), o = s.querySelector("img"), r = !0, a = this.plugins.component.set_container.call(this, s, "se-image-container")) : r && (a.innerHTML = "", a.appendChild(s), i._cover = s, i._element = o, r = !1); const c = this.util.isNumber(i.inputX.value) ? i.inputX.value + i.sizeUnit : i.inputX.value, d = this.util.isNumber(i.inputY.value) ? i.inputY.value + i.sizeUnit : i.inputY.value; l = /%$/.test(o.style.width) ? c !== a.style.width || d !== a.style.height : c !== o.style.width || d !== o.style.height, o.alt = i._altText; let u = !1; i._captionChecked ? i._caption || (i._caption = this.plugins.component.create_caption.call(this), s.appendChild(i._caption), u = !0) : i._caption && (this.util.removeItem(i._caption), i._caption = null, u = !0); const h = this.plugins.anchor.createAnchor.call(this, i.anchorCtx, !0); if (h) i._linkElement = i._linkElement === h ? h.cloneNode(!1) : h, s.insertBefore(this.plugins.image.onRender_link.call(this, o, i._linkElement), i._caption); else if (null !== i._linkElement) { const e = o; if (e.setAttribute("data-image-link", ""), s.contains(i._linkElement)) { const t = e.cloneNode(!0); s.removeChild(i._linkElement), s.insertBefore(t, i._caption), o = t } } if (r) { const e = this.util.isRangeFormatElement(i._element.parentNode) || this.util.isWysiwygDiv(i._element.parentNode) ? i._element : /^A$/i.test(i._element.parentNode.nodeName) ? i._element.parentNode : this.util.getFormatElement(i._element) || i._element; if (this.util.isFormatElement(e) && e.childNodes.length > 0) e.parentNode.insertBefore(a, e), this.util.removeItem(i._element), this.util.removeEmptyNode(e, null), 0 === e.children.length && (e.innerHTML = this.util.htmlRemoveWhiteSpace(e.innerHTML)); else if (this.util.isFormatElement(e.parentNode)) { const t = e.parentNode; t.parentNode.insertBefore(a, e.previousSibling ? t.nextElementSibling : t), this.util.removeItem(e) } else e.parentNode.replaceChild(a, e); o = a.querySelector("img"), i._element = o, i._cover = s, i._container = a } (u || !i._onlyPercentage && l) && !e && (/\d+/.test(o.style.height) || this.context.resizing._rotateVertical && i._captionChecked) && (/%$/.test(i.inputX.value) || /%$/.test(i.inputY.value) ? this.plugins.resizing.resetTransform.call(this, o) : this.plugins.resizing.setTransformSize.call(this, o, this.util.getNumber(i.inputX.value, 0), this.util.getNumber(i.inputY.value, 0))), i._resizing && (o.setAttribute("data-proportion", i._proportionChecked), l && this.plugins.image.applySize.call(this)), this.plugins.image.setAlign.call(this, null, o, null, null), e && this.plugins.fileManager.setInfo.call(this, "image", o, this.functions.onImageUpload, null, !0), t && this.selectComponent(o, "image"), n || this.history.push(!1) }, update_src: function (e, t, n) { t.src = e, this._w.setTimeout(this.plugins.fileManager.setInfo.bind(this, "image", t, this.functions.onImageUpload, n, !0)), this.selectComponent(t, "image") }, onModifyMode: function (e, t) { if (!e) return; const n = this.context.image; n._linkElement = n.anchorCtx.linkAnchor = /^A$/i.test(e.parentNode.nodeName) ? e.parentNode : null, n._element = e, n._cover = this.util.getParentElement(e, "FIGURE"), n._container = this.util.getParentElement(e, this.util.isMediaComponent), n._caption = this.util.getChildElement(n._cover, "FIGCAPTION"), n._align = e.style.float || e.getAttribute("data-align") || "none", e.style.float = "", this.plugins.anchor.setCtx(n._linkElement, n.anchorCtx), t && (n._element_w = t.w, n._element_h = t.h, n._element_t = t.t, n._element_l = t.l); let i, l, o = n._element.getAttribute("data-size") || n._element.getAttribute("data-origin"); o ? (o = o.split(","), i = o[0], l = o[1]) : t && (i = t.w, l = t.h), n._origin_w = i || e.style.width || e.width || "", n._origin_h = l || e.style.height || e.height || "" }, openModify: function (e) { const t = this.context.image; t.imgUrlFile && (t._v_src._linkValue = t.previewSrc.textContent = t.imgUrlFile.value = t._element.src), t._altText = t.altText.value = t._element.alt, t.modal.querySelector('input[name="suneditor_image_radio"][value="' + t._align + '"]').checked = !0, t._align = t.modal.querySelector('input[name="suneditor_image_radio"]:checked').value, t._captionChecked = t.captionCheckEl.checked = !!t._caption, t._resizing && this.plugins.resizing._module_setModifyInputSize.call(this, t, this.plugins.image), e || this.plugins.dialog.open.call(this, "image", !0) }, applySize: function (e, t) { const n = this.context.image; return e || (e = n.inputX.value || this.options.imageWidth), t || (t = n.inputY.value || this.options.imageHeight), n._onlyPercentage && e || /%$/.test(e) ? (this.plugins.image.setPercentSize.call(this, e, t), !0) : (e && "auto" !== e || t && "auto" !== t ? this.plugins.image.setSize.call(this, e, t, !1) : this.plugins.image.setAutoSize.call(this), !1) }, sizeRevert: function () { this.plugins.resizing._module_sizeRevert.call(this, this.context.image) }, setSize: function (e, t, n, i) { const l = this.context.image, o = /^(rw|lw)$/.test(i); /^(th|bh)$/.test(i) || (l._element.style.width = this.util.isNumber(e) ? e + l.sizeUnit : e, this.plugins.image.cancelPercentAttr.call(this)), o || (l._element.style.height = this.util.isNumber(t) ? t + l.sizeUnit : /%$/.test(t) ? "" : t), "center" === l._align && this.plugins.image.setAlign.call(this, null, null, null, null), n || l._element.removeAttribute("data-percentage"), this.plugins.resizing._module_saveCurrentSize.call(this, l) }, setAutoSize: function () { const e = this.context.image; this.plugins.resizing.resetTransform.call(this, e._element), this.plugins.image.cancelPercentAttr.call(this), e._element.style.maxWidth = "", e._element.style.width = "", e._element.style.height = "", e._cover.style.width = "", e._cover.style.height = "", this.plugins.image.setAlign.call(this, null, null, null, null), e._element.setAttribute("data-percentage", "auto,auto"), this.plugins.resizing._module_saveCurrentSize.call(this, e) }, setOriginSize: function () { const e = this.context.image; e._element.removeAttribute("data-percentage"), this.plugins.resizing.resetTransform.call(this, e._element), this.plugins.image.cancelPercentAttr.call(this); const t = (e._element.getAttribute("data-origin") || "").split(","), n = t[0], i = t[1]; t && (e._onlyPercentage || /%$/.test(n) && (/%$/.test(i) || !/\d/.test(i)) ? this.plugins.image.setPercentSize.call(this, n, i) : this.plugins.image.setSize.call(this, n, i), this.plugins.resizing._module_saveCurrentSize.call(this, e)) }, setPercentSize: function (e, t) { const n = this.context.image; t = !t || /%$/.test(t) || this.util.getNumber(t, 0) ? this.util.isNumber(t) ? t + n.sizeUnit : t || "" : this.util.isNumber(t) ? t + "%" : t; const i = /%$/.test(t); n._container.style.width = this.util.isNumber(e) ? e + "%" : e, n._container.style.height = "", n._cover.style.width = "100%", n._cover.style.height = i ? t : "", n._element.style.width = "100%", n._element.style.height = i ? "" : t, n._element.style.maxWidth = "", "center" === n._align && this.plugins.image.setAlign.call(this, null, null, null, null), n._element.setAttribute("data-percentage", e + "," + t), this.plugins.resizing.setCaptionPosition.call(this, n._element), this.plugins.resizing._module_saveCurrentSize.call(this, n) }, cancelPercentAttr: function () { const e = this.context.image; e._cover.style.width = "", e._cover.style.height = "", e._container.style.width = "", e._container.style.height = "", this.util.removeClass(e._container, this.context.image._floatClassRegExp), this.util.addClass(e._container, "__se__float-" + e._align), "center" === e._align && this.plugins.image.setAlign.call(this, null, null, null, null) }, setAlign: function (e, t, n, i) { const l = this.context.image; e || (e = l._align), t || (t = l._element), n || (n = l._cover), i || (i = l._container), n.style.margin = e && "none" !== e ? "auto" : "0", /%$/.test(t.style.width) && "center" === e ? (i.style.minWidth = "100%", n.style.width = i.style.width) : (i.style.minWidth = "", n.style.width = this.context.resizing._rotateVertical ? t.style.height || t.offsetHeight : t.style.width && "auto" !== t.style.width ? t.style.width || "100%" : ""), this.util.hasClass(i, "__se__float-" + e) || (this.util.removeClass(i, l._floatClassRegExp), this.util.addClass(i, "__se__float-" + e)), t.setAttribute("data-align", e) }, init: function () { const e = this.context.image; e.imgInputFile && (e.imgInputFile.value = ""), e.imgUrlFile && (e._v_src._linkValue = e.previewSrc.textContent = e.imgUrlFile.value = ""), e.imgInputFile && e.imgUrlFile && (e.imgUrlFile.removeAttribute("disabled"), e.previewSrc.style.textDecoration = ""), e.altText.value = "", e.modal.querySelector('input[name="suneditor_image_radio"][value="none"]').checked = !0, e.captionCheckEl.checked = !1, e._element = null, this.plugins.image.openTab.call(this, "init"), e._resizing && (e.inputX.value = this.options.imageWidth === e._defaultSizeX ? "" : this.options.imageWidth, e.inputY.value = this.options.imageHeight === e._defaultSizeY ? "" : this.options.imageHeight, e.proportion.checked = !0, e._ratio = !1, e._ratioX = 1, e._ratioY = 1), this.plugins.anchor.init.call(this, e.anchorCtx) } }, v = { name: "video", display: "dialog", add: function (e) { e.addModule([r.a, p.a, m.a, _.a]); const t = e.options, n = e.context, i = n.video = { _infoList: [], _infoIndex: 0, _uploadFileLength: 0, focusElement: null, sizeUnit: t._videoSizeUnit, _align: "none", _floatClassRegExp: "__se__float\\-[a-z]+", _youtubeQuery: t.youtubeQuery, _videoRatio: 100 * t.videoRatio + "%", _defaultRatio: 100 * t.videoRatio + "%", _linkValue: "", _element: null, _cover: null, _container: null, inputX: null, inputY: null, _element_w: 1, _element_h: 1, _element_l: 0, _element_t: 0, _defaultSizeX: "100%", _defaultSizeY: 100 * t.videoRatio + "%", _origin_w: "100%" === t.videoWidth ? "" : t.videoWidth, _origin_h: "56.25%" === t.videoHeight ? "" : t.videoHeight, _proportionChecked: !0, _resizing: t.videoResizing, _resizeDotHide: !t.videoHeightShow, _rotation: t.videoRotation, _onlyPercentage: t.videoSizeOnlyPercentage, _ratio: !1, _ratioX: 1, _ratioY: 1, _captionShow: !1 }; let l = this.setDialog(e); i.modal = l, i.videoInputFile = l.querySelector("._se_video_file"), i.videoUrlFile = l.querySelector(".se-input-url"), i.focusElement = i.videoUrlFile || i.videoInputFile, i.preview = l.querySelector(".se-link-preview"), l.querySelector("form").addEventListener("submit", this.submit.bind(e)), i.videoInputFile && l.querySelector(".se-dialog-files-edge-button").addEventListener("click", this._removeSelectedFiles.bind(i.videoInputFile, i.videoUrlFile, i.preview)), i.videoInputFile && i.videoUrlFile && i.videoInputFile.addEventListener("change", this._fileInputChange.bind(i)), i.videoUrlFile && i.videoUrlFile.addEventListener("input", this._onLinkPreview.bind(i.preview, i, t.linkProtocol)), i.proportion = {}, i.videoRatioOption = {}, i.inputX = {}, i.inputY = {}, t.videoResizing && (i.proportion = l.querySelector("._se_video_check_proportion"), i.videoRatioOption = l.querySelector(".se-video-ratio"), i.inputX = l.querySelector("._se_video_size_x"), i.inputY = l.querySelector("._se_video_size_y"), i.inputX.value = t.videoWidth, i.inputY.value = t.videoHeight, i.inputX.addEventListener("keyup", this.setInputSize.bind(e, "x")), i.inputY.addEventListener("keyup", this.setInputSize.bind(e, "y")), i.inputX.addEventListener("change", this.setRatio.bind(e)), i.inputY.addEventListener("change", this.setRatio.bind(e)), i.proportion.addEventListener("change", this.setRatio.bind(e)), i.videoRatioOption.addEventListener("change", this.setVideoRatio.bind(e)), l.querySelector(".se-dialog-btn-revert").addEventListener("click", this.sizeRevert.bind(e))), n.dialog.modal.appendChild(l), l = null }, setDialog: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); i.className = "se-dialog-content", i.style.display = "none"; let l = '
    ' + n.dialogBox.videoBox.title + '
    '; if (t.videoFileInput && (l += '
    "), t.videoUrlInput && (l += '
    '), t.videoResizing) { const i = t.videoRatioList || [{ name: "16:9", value: .5625 }, { name: "4:3", value: .75 }, { name: "21:9", value: .4285 }], o = t.videoRatio, s = t.videoSizeOnlyPercentage, a = s ? ' style="display: none !important;"' : "", r = t.videoHeightShow ? "" : ' style="display: none !important;"', c = t.videoRatioShow ? "" : ' style="display: none !important;"', d = s || t.videoHeightShow || t.videoRatioShow ? "" : ' style="display: none !important;"'; l += '
    " } return l += '
    ", i.innerHTML = l, i }, _fileInputChange: function () { this.videoInputFile.value ? (this.videoUrlFile.setAttribute("disabled", !0), this.preview.style.textDecoration = "line-through") : (this.videoUrlFile.removeAttribute("disabled"), this.preview.style.textDecoration = "") }, _removeSelectedFiles: function (e, t) { this.value = "", e && (e.removeAttribute("disabled"), t.style.textDecoration = "") }, _onLinkPreview: function (e, t, n) { const i = n.target.value.trim(); /^$/.test(i) ? (e._linkValue = i, this.textContent = '') : e._linkValue = this.textContent = i ? t && -1 === i.indexOf("://") && 0 !== i.indexOf("#") ? t + i : -1 === i.indexOf("://") ? "/" + i : i : "" }, _setTagAttrs: function (e) { e.setAttribute("controls", !0); const t = this.options.videoTagAttrs; if (t) for (let n in t) this.util.hasOwn(t, n) && e.setAttribute(n, t[n]) }, createVideoTag: function () { const e = this.util.createElement("VIDEO"); return this.plugins.video._setTagAttrs.call(this, e), e }, _setIframeAttrs: function (e) { e.frameBorder = "0", e.allowFullscreen = !0; const t = this.options.videoIframeAttrs; if (t) for (let n in t) this.util.hasOwn(t, n) && e.setAttribute(n, t[n]) }, createIframeTag: function () { const e = this.util.createElement("IFRAME"); return this.plugins.video._setIframeAttrs.call(this, e), e }, fileTags: ["iframe", "video"], select: function (e) { this.plugins.video.onModifyMode.call(this, e, this.plugins.resizing.call_controller_resize.call(this, e, "video")) }, destroy: function (e) { const t = e || this.context.video._element, n = this.context.video._container, i = 1 * t.getAttribute("data-index"); let l = n.previousElementSibling || n.nextElementSibling; const o = n.parentNode; this.util.removeItem(n), this.plugins.video.init.call(this), this.controllersOff(), o !== this.context.element.wysiwyg && this.util.removeItemAllParents(o, (function (e) { return 0 === e.childNodes.length }), null), this.focusEdge(l), this.plugins.fileManager.deleteInfo.call(this, "video", i, this.functions.onVideoUpload), this.history.push(!1) }, on: function (e) { const t = this.context.video; e ? t.videoInputFile && this.options.videoMultipleFile && t.videoInputFile.removeAttribute("multiple") : (t.inputX.value = t._origin_w = this.options.videoWidth === t._defaultSizeX ? "" : this.options.videoWidth, t.inputY.value = t._origin_h = this.options.videoHeight === t._defaultSizeY ? "" : this.options.videoHeight, t.proportion.disabled = !0, t.videoInputFile && this.options.videoMultipleFile && t.videoInputFile.setAttribute("multiple", "multiple")), t._resizing && this.plugins.video.setVideoRatioSelect.call(this, t._origin_h || t._defaultRatio) }, open: function () { this.plugins.dialog.open.call(this, "video", "video" === this.currentControllerName) }, setVideoRatio: function (e) { const t = this.context.video, n = e.target.options[e.target.selectedIndex].value; t._defaultSizeY = t._videoRatio = n ? 100 * n + "%" : t._defaultSizeY, t.inputY.placeholder = n ? 100 * n + "%" : "", t.inputY.value = "" }, setInputSize: function (e, t) { if (t && 32 === t.keyCode) return void t.preventDefault(); const n = this.context.video; this.plugins.resizing._module_setInputSize.call(this, n, e), "y" === e && this.plugins.video.setVideoRatioSelect.call(this, t.target.value || n._defaultRatio) }, setRatio: function () { this.plugins.resizing._module_setRatio.call(this, this.context.video) }, submit: function (e) { const t = this.context.video, n = this.plugins.video; e.preventDefault(), e.stopPropagation(), t._align = t.modal.querySelector('input[name="suneditor_video_radio"]:checked').value; try { t.videoInputFile && t.videoInputFile.files.length > 0 ? (this.showLoading(), n.submitAction.call(this, this.context.video.videoInputFile.files)) : t.videoUrlFile && t._linkValue.length > 0 && (this.showLoading(), n.setup_url.call(this)) } catch (e) { throw this.closeLoading(), Error('[SUNEDITOR.video.submit.fail] cause : "' + e.message + '"') } finally { this.plugins.dialog.close.call(this) } return !1 }, submitAction: function (e) { if (0 === e.length) return; let t = 0, n = []; for (let i = 0, l = e.length; i < l; i++)/video/i.test(e[i].type) && (n.push(e[i]), t += e[i].size); const i = this.options.videoUploadSizeLimit; if (i > 0) { let e = 0; const n = this.context.video._infoList; for (let t = 0, i = n.length; t < i; t++)e += 1 * n[t].size; if (t + e > i) { this.closeLoading(); const n = "[SUNEDITOR.videoUpload.fail] Size of uploadable total videos: " + i / 1e3 + "KB"; return void (("function" != typeof this.functions.onVideoUploadError || this.functions.onVideoUploadError(n, { limitSize: i, currentSize: e, uploadSize: t }, this)) && this.functions.noticeOpen(n)) } } const l = this.context.video; l._uploadFileLength = n.length; const o = { inputWidth: l.inputX.value, inputHeight: l.inputY.value, align: l._align, isUpdate: this.context.dialog.updateModal, element: l._element }; if ("function" == typeof this.functions.onVideoUploadBefore) { const e = this.functions.onVideoUploadBefore(n, o, this, function (e) { e && this._w.Array.isArray(e.result) ? this.plugins.video.register.call(this, o, e) : this.plugins.video.upload.call(this, o, e) }.bind(this)); if (void 0 === e) return; if (!e) return void this.closeLoading(); "object" == typeof e && e.length > 0 && (n = e) } this.plugins.video.upload.call(this, o, n) }, error: function (e, t) { if (this.closeLoading(), "function" != typeof this.functions.onVideoUploadError || this.functions.onVideoUploadError(e, t, this)) throw this.functions.noticeOpen(e), Error("[SUNEDITOR.plugin.video.error] response: " + e) }, upload: function (e, t) { if (!t) return void this.closeLoading(); if ("string" == typeof t) return void this.plugins.video.error.call(this, t, null); const n = this.options.videoUploadUrl, i = this.context.dialog.updateModal ? 1 : t.length; if (!("string" == typeof n && n.length > 0)) throw Error('[SUNEDITOR.videoUpload.fail] cause : There is no "videoUploadUrl" option.'); { const l = new FormData; for (let e = 0; e < i; e++)l.append("file-" + e, t[e]); this.plugins.fileManager.upload.call(this, n, this.options.videoUploadHeader, l, this.plugins.video.callBack_videoUpload.bind(this, e), this.functions.onVideoUploadError) } }, callBack_videoUpload: function (e, t) { if ("function" == typeof this.functions.videoUploadHandler) this.functions.videoUploadHandler(t, e, this); else { const n = JSON.parse(t.responseText); n.errorMessage ? this.plugins.video.error.call(this, n.errorMessage, n) : this.plugins.video.register.call(this, e, n) } }, register: function (e, t) { const n = t.result, i = this.plugins.video.createVideoTag.call(this); for (let t, l = 0, o = n.length; l < o; l++)t = { name: n[l].name, size: n[l].size }, this.plugins.video.create_video.call(this, e.isUpdate ? e.element : i.cloneNode(!1), n[l].url, e.inputWidth, e.inputHeight, e.align, t, e.isUpdate); this.closeLoading() }, setup_url: function () { try { const e = this.context.video; let t = e._linkValue; if (0 === t.length) return !1; if (/^$/.test(t)) { if (t = (new this._w.DOMParser).parseFromString(t, "text/html").querySelector("iframe").src, 0 === t.length) return !1 } if (/youtu\.?be/.test(t)) { if (/^http/.test(t) || (t = "https://" + t), t = t.replace("watch?v=", ""), /^\/\/.+\/embed\//.test(t) || (t = t.replace(t.match(/\/\/.+\//)[0], "//www.youtube.com/embed/").replace("&", "?&")), e._youtubeQuery.length > 0) if (/\?/.test(t)) { const n = t.split("?"); t = n[0] + "?" + e._youtubeQuery + "&" + n[1] } else t += "?" + e._youtubeQuery } else /vimeo\.com/.test(t) && (t.endsWith("/") && (t = t.slice(0, -1)), t = "https://player.vimeo.com/video/" + t.slice(t.lastIndexOf("/") + 1)); this.plugins.video.create_video.call(this, this.plugins.video.createIframeTag.call(this), t, e.inputX.value, e.inputY.value, e._align, null, this.context.dialog.updateModal) } catch (e) { throw Error('[SUNEDITOR.video.upload.fail] cause : "' + e.message + '"') } finally { this.closeLoading() } }, create_video: function (e, t, n, i, l, o, s) { this.context.resizing._resize_plugin = "video"; const a = this.context.video; let r = null, c = null, d = !1; if (s) { if ((e = a._element).src !== t) { d = !0; const n = /youtu\.?be/.test(t), i = /vimeo\.com/.test(t); if (!n && !i || /^iframe$/i.test(e.nodeName)) if (n || i || /^videoo$/i.test(e.nodeName)) e.src = t; else { const n = this.plugins.video.createVideoTag.call(this); n.src = t, e.parentNode.replaceChild(n, e), a._element = e = n } else { const n = this.plugins.video.createIframeTag.call(this); n.src = t, e.parentNode.replaceChild(n, e), a._element = e = n } } c = a._container, r = this.util.getParentElement(e, "FIGURE") } else d = !0, e.src = t, a._element = e, r = this.plugins.component.set_cover.call(this, e), c = this.plugins.component.set_container.call(this, r, "se-video-container"); a._cover = r, a._container = c; const u = this.plugins.resizing._module_getSizeX.call(this, a) !== (n || a._defaultSizeX) || this.plugins.resizing._module_getSizeY.call(this, a) !== (i || a._videoRatio), h = !s || u; a._resizing && (this.context.video._proportionChecked = a.proportion.checked, e.setAttribute("data-proportion", a._proportionChecked)); let p = !1; h && (p = this.plugins.video.applySize.call(this)), p && "center" === l || this.plugins.video.setAlign.call(this, null, e, r, c); let g = !0; if (s) a._resizing && this.context.resizing._rotateVertical && h && this.plugins.resizing.setTransformSize.call(this, e, null, null); else if (g = this.insertComponent(c, !1, !0, !this.options.mediaAutoSelect), !this.options.mediaAutoSelect) { const e = this.appendFormatTag(c, null); this.setRange(e, 0, e, 0) } g && (d && this.plugins.fileManager.setInfo.call(this, "video", e, this.functions.onVideoUpload, o, !0), s && (this.selectComponent(e, "video"), this.history.push(!1))), this.context.resizing._resize_plugin = "" }, _update_videoCover: function (e) { if (!e) return; const t = this.context.video; /^video$/i.test(e.nodeName) ? this.plugins.video._setTagAttrs.call(this, e) : this.plugins.video._setIframeAttrs.call(this, e); const n = this.util.getParentElement(e, this.util.isMediaComponent) || this.util.getParentElement(e, function (e) { return this.isWysiwygDiv(e.parentNode) }.bind(this.util)), i = e; t._element = e = e.cloneNode(!0); const l = t._cover = this.plugins.component.set_cover.call(this, e), o = t._container = this.plugins.component.set_container.call(this, l, "se-video-container"); try { const s = n.querySelector("figcaption"); let a = null; s && (a = this.util.createElement("DIV"), a.innerHTML = s.innerHTML, this.util.removeItem(s)); const r = (e.getAttribute("data-size") || e.getAttribute("data-origin") || "").split(","); this.plugins.video.applySize.call(this, r[0] || i.style.width || i.width || "", r[1] || i.style.height || i.height || ""); const c = this.util.getFormatElement(i); c && (t._align = c.style.textAlign || c.style.float), this.plugins.video.setAlign.call(this, null, e, l, o), this.util.isFormatElement(n) && n.childNodes.length > 0 ? (n.parentNode.insertBefore(o, n), this.util.removeItem(i), this.util.removeEmptyNode(n, null), 0 === n.children.length && (n.innerHTML = this.util.htmlRemoveWhiteSpace(n.innerHTML))) : n.parentNode.replaceChild(o, n), a && n.parentNode.insertBefore(a, o.nextElementSibling) } catch (e) { console.warn("[SUNEDITOR.video.error] Maybe the video tag is nested.", e) } this.plugins.fileManager.setInfo.call(this, "video", e, this.functions.onVideoUpload, null, !0) }, onModifyMode: function (e, t) { const n = this.context.video; n._element = e, n._cover = this.util.getParentElement(e, "FIGURE"), n._container = this.util.getParentElement(e, this.util.isMediaComponent), n._align = e.style.float || e.getAttribute("data-align") || "none", e.style.float = "", t && (n._element_w = t.w, n._element_h = t.h, n._element_t = t.t, n._element_l = t.l); let i, l, o = n._element.getAttribute("data-size") || n._element.getAttribute("data-origin"); o ? (o = o.split(","), i = o[0], l = o[1]) : t && (i = t.w, l = t.h), n._origin_w = i || e.style.width || e.width || "", n._origin_h = l || e.style.height || e.height || "" }, openModify: function (e) { const t = this.context.video; if (t.videoUrlFile && (t._linkValue = t.preview.textContent = t.videoUrlFile.value = t._element.src || (t._element.querySelector("source") || "").src || ""), t.modal.querySelector('input[name="suneditor_video_radio"][value="' + t._align + '"]').checked = !0, t._resizing) { this.plugins.resizing._module_setModifyInputSize.call(this, t, this.plugins.video); const e = t._videoRatio = this.plugins.resizing._module_getSizeY.call(this, t); this.plugins.video.setVideoRatioSelect.call(this, e) || (t.inputY.value = t._onlyPercentage ? this.util.getNumber(e, 2) : e) } e || this.plugins.dialog.open.call(this, "video", !0) }, setVideoRatioSelect: function (e) { let t = !1; const n = this.context.video, i = n.videoRatioOption.options; /%$/.test(e) || n._onlyPercentage ? e = this.util.getNumber(e, 2) / 100 + "" : (!this.util.isNumber(e) || 1 * e >= 1) && (e = ""), n.inputY.placeholder = ""; for (let l = 0, o = i.length; l < o; l++)i[l].value === e ? (t = i[l].selected = !0, n.inputY.placeholder = e ? 100 * e + "%" : "") : i[l].selected = !1; return t }, checkFileInfo: function () { this.plugins.fileManager.checkInfo.call(this, "video", ["iframe", "video"], this.functions.onVideoUpload, this.plugins.video._update_videoCover.bind(this), !0) }, resetFileInfo: function () { this.plugins.fileManager.resetInfo.call(this, "video", this.functions.onVideoUpload) }, applySize: function (e, t) { const n = this.context.video; return e || (e = n.inputX.value || this.options.videoWidth), t || (t = n.inputY.value || this.options.videoHeight), n._onlyPercentage || /%$/.test(e) || !e ? (this.plugins.video.setPercentSize.call(this, e || "100%", t || (/%$/.test(n._videoRatio) ? n._videoRatio : n._defaultRatio)), !0) : (e && "auto" !== e || t && "auto" !== t ? this.plugins.video.setSize.call(this, e, t || n._videoRatio || n._defaultRatio, !1) : this.plugins.video.setAutoSize.call(this), !1) }, sizeRevert: function () { this.plugins.resizing._module_sizeRevert.call(this, this.context.video) }, setSize: function (e, t, n, i) { const l = this.context.video, o = /^(rw|lw)$/.test(i), s = /^(th|bh)$/.test(i); s || (e = this.util.getNumber(e, 0)), o || (t = this.util.isNumber(t) ? t + l.sizeUnit : t || ""), s || (l._element.style.width = e ? e + l.sizeUnit : ""), o || (l._cover.style.paddingBottom = l._cover.style.height = t), s || /%$/.test(e) || (l._cover.style.width = "", l._container.style.width = ""), o || /%$/.test(t) ? l._element.style.height = "" : l._element.style.height = t, n || l._element.removeAttribute("data-percentage"), this.plugins.resizing._module_saveCurrentSize.call(this, l) }, setAutoSize: function () { this.plugins.video.setPercentSize.call(this, 100, this.context.video._defaultRatio) }, setOriginSize: function (e) { const t = this.context.video; t._element.removeAttribute("data-percentage"), this.plugins.resizing.resetTransform.call(this, t._element), this.plugins.video.cancelPercentAttr.call(this); const n = ((e ? t._element.getAttribute("data-size") : "") || t._element.getAttribute("data-origin") || "").split(","); if (n) { const e = n[0], i = n[1]; t._onlyPercentage || /%$/.test(e) && (/%$/.test(i) || !/\d/.test(i)) ? this.plugins.video.setPercentSize.call(this, e, i) : this.plugins.video.setSize.call(this, e, i), this.plugins.resizing._module_saveCurrentSize.call(this, t) } }, setPercentSize: function (e, t) { const n = this.context.video; t = !t || /%$/.test(t) || this.util.getNumber(t, 0) ? this.util.isNumber(t) ? t + n.sizeUnit : t || n._defaultRatio : this.util.isNumber(t) ? t + "%" : t, n._container.style.width = this.util.isNumber(e) ? e + "%" : e, n._container.style.height = "", n._cover.style.width = "100%", n._cover.style.height = t, n._cover.style.paddingBottom = t, n._element.style.width = "100%", n._element.style.height = "100%", n._element.style.maxWidth = "", "center" === n._align && this.plugins.video.setAlign.call(this, null, null, null, null), n._element.setAttribute("data-percentage", e + "," + t), this.plugins.resizing._module_saveCurrentSize.call(this, n) }, cancelPercentAttr: function () { const e = this.context.video; e._cover.style.width = "", e._cover.style.height = "", e._cover.style.paddingBottom = "", e._container.style.width = "", e._container.style.height = "", this.util.removeClass(e._container, this.context.video._floatClassRegExp), this.util.addClass(e._container, "__se__float-" + e._align), "center" === e._align && this.plugins.video.setAlign.call(this, null, null, null, null) }, setAlign: function (e, t, n, i) { const l = this.context.video; e || (e = l._align), t || (t = l._element), n || (n = l._cover), i || (i = l._container), n.style.margin = e && "none" !== e ? "auto" : "0", /%$/.test(t.style.width) && "center" === e ? (i.style.minWidth = "100%", n.style.width = i.style.width, n.style.height = n.style.height, n.style.paddingBottom = /%$/.test(n.style.height) ? this.util.getNumber(this.util.getNumber(n.style.height, 2) / 100 * this.util.getNumber(n.style.width, 2), 2) + "%" : n.style.height) : (i.style.minWidth = "", n.style.width = this.context.resizing._rotateVertical ? t.style.height || t.offsetHeight : t.style.width || "100%", n.style.paddingBottom = n.style.height), this.util.hasClass(i, "__se__float-" + e) || (this.util.removeClass(i, l._floatClassRegExp), this.util.addClass(i, "__se__float-" + e)), t.setAttribute("data-align", e) }, init: function () { const e = this.context.video; e.videoInputFile && (e.videoInputFile.value = ""), e.videoUrlFile && (e._linkValue = e.preview.textContent = e.videoUrlFile.value = ""), e.videoInputFile && e.videoUrlFile && (e.videoUrlFile.removeAttribute("disabled"), e.preview.style.textDecoration = ""), e._origin_w = this.options.videoWidth, e._origin_h = this.options.videoHeight, e.modal.querySelector('input[name="suneditor_video_radio"][value="none"]').checked = !0, e._resizing && (e.inputX.value = this.options.videoWidth === e._defaultSizeX ? "" : this.options.videoWidth, e.inputY.value = this.options.videoHeight === e._defaultSizeY ? "" : this.options.videoHeight, e.proportion.checked = !0, e.proportion.disabled = !0, this.plugins.video.setVideoRatioSelect.call(this, e._defaultRatio)) } }, y = { name: "audio", display: "dialog", add: function (e) { e.addModule([r.a, p.a, _.a]); const t = e.context, n = t.audio = { _infoList: [], _infoIndex: 0, _uploadFileLength: 0, focusElement: null, targetSelect: null, _origin_w: e.options.audioWidth, _origin_h: e.options.audioHeight, _linkValue: "", _element: null, _cover: null, _container: null }; let i = this.setDialog(e); n.modal = i, n.audioInputFile = i.querySelector("._se_audio_files"), n.audioUrlFile = i.querySelector(".se-input-url"), n.focusElement = n.audioInputFile || n.audioUrlFile, n.preview = i.querySelector(".se-link-preview"); let l = this.setController(e); n.controller = l, i.querySelector("form").addEventListener("submit", this.submit.bind(e)), n.audioInputFile && i.querySelector(".se-dialog-files-edge-button").addEventListener("click", this._removeSelectedFiles.bind(n.audioInputFile, n.audioUrlFile, n.preview)), n.audioInputFile && n.audioUrlFile && n.audioInputFile.addEventListener("change", this._fileInputChange.bind(n)), l.addEventListener("click", this.onClick_controller.bind(e)), n.audioUrlFile && n.audioUrlFile.addEventListener("input", this._onLinkPreview.bind(n.preview, n, e.options.linkProtocol)), t.dialog.modal.appendChild(i), t.element.relative.appendChild(l), i = null, l = null }, setDialog: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); i.className = "se-dialog-content", i.style.display = "none"; let l = '
    ' + n.dialogBox.audioBox.title + '
    '; return t.audioFileInput && (l += '
    "), t.audioUrlInput && (l += '
    '), l += '
    ", i.innerHTML = l, i }, setController: function (e) { const t = e.lang, n = e.icons, i = e.util.createElement("DIV"); return i.className = "se-controller se-controller-link", i.innerHTML = '
    ", i }, _fileInputChange: function () { this.audioInputFile.value ? (this.audioUrlFile.setAttribute("disabled", !0), this.preview.style.textDecoration = "line-through") : (this.audioUrlFile.removeAttribute("disabled"), this.preview.style.textDecoration = "") }, _removeSelectedFiles: function (e, t) { this.value = "", e && (e.removeAttribute("disabled"), t.style.textDecoration = "") }, _createAudioTag: function () { const e = this.util.createElement("AUDIO"); this.plugins.audio._setTagAttrs.call(this, e); const t = this.context.audio._origin_w, n = this.context.audio._origin_h; return e.setAttribute("origin-size", t + "," + n), e.style.cssText = (t ? "width:" + t + "; " : "") + (n ? "height:" + n + ";" : ""), e }, _setTagAttrs: function (e) { e.setAttribute("controls", !0); const t = this.options.audioTagAttrs; if (t) for (let n in t) this.util.hasOwn(t, n) && e.setAttribute(n, t[n]) }, _onLinkPreview: function (e, t, n) { const i = n.target.value.trim(); e._linkValue = this.textContent = i ? t && -1 === i.indexOf("://") && 0 !== i.indexOf("#") ? t + i : -1 === i.indexOf("://") ? "/" + i : i : "" }, fileTags: ["audio"], select: function (e) { this.plugins.audio.onModifyMode.call(this, e) }, destroy: function (e) { e = e || this.context.audio._element; const t = this.util.getParentElement(e, this.util.isComponent) || e, n = 1 * e.getAttribute("data-index"), i = t.previousElementSibling || t.nextElementSibling, l = t.parentNode; this.util.removeItem(t), this.plugins.audio.init.call(this), this.controllersOff(), l !== this.context.element.wysiwyg && this.util.removeItemAllParents(l, (function (e) { return 0 === e.childNodes.length }), null), this.focusEdge(i), this.plugins.fileManager.deleteInfo.call(this, "audio", n, this.functions.onAudioUpload), this.history.push(!1) }, checkFileInfo: function () { this.plugins.fileManager.checkInfo.call(this, "audio", ["audio"], this.functions.onAudioUpload, this.plugins.audio.updateCover.bind(this), !1) }, resetFileInfo: function () { this.plugins.fileManager.resetInfo.call(this, "audio", this.functions.onAudioUpload) }, on: function (e) { const t = this.context.audio; e ? t._element ? (this.context.dialog.updateModal = !0, t._linkValue = t.preview.textContent = t.audioUrlFile.value = t._element.src, t.audioInputFile && this.options.audioMultipleFile && t.audioInputFile.removeAttribute("multiple")) : t.audioInputFile && this.options.audioMultipleFile && t.audioInputFile.removeAttribute("multiple") : (this.plugins.audio.init.call(this), t.audioInputFile && this.options.audioMultipleFile && t.audioInputFile.setAttribute("multiple", "multiple")) }, open: function () { this.plugins.dialog.open.call(this, "audio", "audio" === this.currentControllerName) }, submit: function (e) { const t = this.context.audio; e.preventDefault(), e.stopPropagation(); try { t.audioInputFile && t.audioInputFile.files.length > 0 ? (this.showLoading(), this.plugins.audio.submitAction.call(this, t.audioInputFile.files)) : t.audioUrlFile && t._linkValue.length > 0 && (this.showLoading(), this.plugins.audio.setupUrl.call(this, t._linkValue)) } catch (e) { throw this.closeLoading(), Error('[SUNEDITOR.audio.submit.fail] cause : "' + e.message + '"') } finally { this.plugins.dialog.close.call(this) } return !1 }, submitAction: function (e) { if (0 === e.length) return; let t = 0, n = []; for (let i = 0, l = e.length; i < l; i++)/audio/i.test(e[i].type) && (n.push(e[i]), t += e[i].size); const i = this.options.audioUploadSizeLimit; if (i > 0) { let e = 0; const n = this.context.audio._infoList; for (let t = 0, i = n.length; t < i; t++)e += 1 * n[t].size; if (t + e > i) { this.closeLoading(); const n = "[SUNEDITOR.audioUpload.fail] Size of uploadable total audios: " + i / 1e3 + "KB"; return void (("function" != typeof this.functions.onAudioUploadError || this.functions.onAudioUploadError(n, { limitSize: i, currentSize: e, uploadSize: t }, this)) && this.functions.noticeOpen(n)) } } const l = this.context.audio; l._uploadFileLength = n.length; const o = { isUpdate: this.context.dialog.updateModal, element: l._element }; if ("function" == typeof this.functions.onAudioUploadBefore) { const e = this.functions.onAudioUploadBefore(n, o, this, function (e) { e && this._w.Array.isArray(e.result) ? this.plugins.audio.register.call(this, o, e) : this.plugins.audio.upload.call(this, o, e) }.bind(this)); if (void 0 === e) return; if (!e) return void this.closeLoading(); "object" == typeof e && e.length > 0 && (n = e) } this.plugins.audio.upload.call(this, o, n) }, error: function (e, t) { if (this.closeLoading(), "function" != typeof this.functions.onAudioUploadError || this.functions.onAudioUploadError(e, t, this)) throw this.functions.noticeOpen(e), Error("[SUNEDITOR.plugin.audio.exception] response: " + e) }, upload: function (e, t) { if (!t) return void this.closeLoading(); if ("string" == typeof t) return void this.plugins.audio.error.call(this, t, null); const n = this.options.audioUploadUrl, i = this.context.dialog.updateModal ? 1 : t.length, l = new FormData; for (let e = 0; e < i; e++)l.append("file-" + e, t[e]); this.plugins.fileManager.upload.call(this, n, this.options.audioUploadHeader, l, this.plugins.audio.callBack_upload.bind(this, e), this.functions.onAudioUploadError) }, callBack_upload: function (e, t) { if ("function" == typeof this.functions.audioUploadHandler) this.functions.audioUploadHandler(t, e, this); else { const n = JSON.parse(t.responseText); n.errorMessage ? this.plugins.audio.error.call(this, n.errorMessage, n) : this.plugins.audio.register.call(this, e, n) } }, register: function (e, t) { const n = t.result; for (let t, i, l = 0, o = n.length; l < o; l++)i = e.isUpdate ? e.element : this.plugins.audio._createAudioTag.call(this), t = { name: n[l].name, size: n[l].size }, this.plugins.audio.create_audio.call(this, i, n[l].url, t, e.isUpdate); this.closeLoading() }, setupUrl: function (e) { try { if (0 === e.length) return !1; this.plugins.audio.create_audio.call(this, this.plugins.audio._createAudioTag.call(this), e, null, this.context.dialog.updateModal) } catch (e) { throw Error('[SUNEDITOR.audio.audio.fail] cause : "' + e.message + '"') } finally { this.closeLoading() } }, create_audio: function (e, t, n, i) { const l = this.context.audio; if (i) { if (l._element && (e = l._element), !e || e.src === t) return void this.selectComponent(e, "audio"); e.src = t, this.selectComponent(e, "audio") } else { e.src = t; const n = this.plugins.component.set_cover.call(this, e), i = this.plugins.component.set_container.call(this, n, ""); if (!this.insertComponent(i, !1, !0, !this.options.mediaAutoSelect)) return void this.focus(); if (!this.options.mediaAutoSelect) { const e = this.appendFormatTag(i, null); this.setRange(e, 0, e, 0) } } this.plugins.fileManager.setInfo.call(this, "audio", e, this.functions.onAudioUpload, n, !1), i && this.history.push(!1) }, updateCover: function (e) { const t = this.context.audio; this.plugins.audio._setTagAttrs.call(this, e); const n = this.util.getParentElement(e, this.util.isMediaComponent) || this.util.getParentElement(e, function (e) { return this.isWysiwygDiv(e.parentNode) }.bind(this.util)), i = e; t._element = e = e.cloneNode(!1); const l = this.plugins.component.set_cover.call(this, e), o = this.plugins.component.set_container.call(this, l, "se-audio-container"); try { this.util.isFormatElement(n) && n.childNodes.length > 0 ? (n.parentNode.insertBefore(o, n), this.util.removeItem(i), this.util.removeEmptyNode(n, null), 0 === n.children.length && (n.innerHTML = this.util.htmlRemoveWhiteSpace(n.innerHTML))) : n.parentNode.replaceChild(o, n) } catch (e) { console.warn("[SUNEDITOR.audio.error] Maybe the audio tag is nested.", e) } this.plugins.fileManager.setInfo.call(this, "audio", e, this.functions.onAudioUpload, null, !1) }, onModifyMode: function (e) { const t = this.context.audio; this.setControllerPosition(t.controller, e, "bottom", { left: 0, top: 0 }), this.controllersOn(t.controller, e, this.plugins.audio.onControllerOff.bind(this, e), "audio"), this.util.addClass(e, "active"), t._element = e, t._cover = this.util.getParentElement(e, "FIGURE"), t._container = this.util.getParentElement(e, this.util.isComponent) }, openModify: function (e) { if (this.context.audio.audioUrlFile) { const e = this.context.audio; e._linkValue = e.preview.textContent = e.audioUrlFile.value = e._element.src } e || this.plugins.dialog.open.call(this, "audio", !0) }, onClick_controller: function (e) { e.stopPropagation(); const t = e.target.getAttribute("data-command"); t && (e.preventDefault(), /update/.test(t) ? this.plugins.audio.openModify.call(this, !1) : this.plugins.audio.destroy.call(this, this.context.audio._element), this.controllersOff()) }, onControllerOff: function (e) { this.util.removeClass(e, "active"), this.context.audio.controller.style.display = "none" }, init: function () { if (this.context.dialog.updateModal) return; const e = this.context.audio; e.audioInputFile && (e.audioInputFile.value = ""), e.audioUrlFile && (e._linkValue = e.preview.textContent = e.audioUrlFile.value = ""), e.audioInputFile && e.audioUrlFile && (e.audioUrlFile.removeAttribute("disabled"), e.preview.style.textDecoration = ""), e._element = null } }, C = { name: "math", display: "dialog", add: function (e) { e.addModule([r.a]); const t = e.context; t.math = { focusElement: null, previewElement: null, fontSizeElement: null, defaultFontSize: "", _mathExp: null }; let n = this.setDialog(e); t.math.modal = n, t.math.focusElement = n.querySelector(".se-math-exp"), t.math.previewElement = n.querySelector(".se-math-preview"), t.math.fontSizeElement = n.querySelector(".se-math-size"), t.math.focusElement.addEventListener("keyup", this._renderMathExp.bind(e, t.math), !1), t.math.focusElement.addEventListener("change", this._renderMathExp.bind(e, t.math), !1), t.math.fontSizeElement.addEventListener("change", function (e) { this.fontSize = e.target.value }.bind(t.math.previewElement.style), !1); let i = this.setController_MathButton(e); t.math.mathController = i, t.math._mathExp = null, n.querySelector("form").addEventListener("submit", this.submit.bind(e), !1), i.addEventListener("click", this.onClick_mathController.bind(e)), t.math.previewElement.style.fontSize = t.math.defaultFontSize, t.dialog.modal.appendChild(n), t.element.relative.appendChild(i), n = null, i = null }, setDialog: function (e) { const t = e.lang, n = e.util.createElement("DIV"), i = e.options.mathFontSize; let l = i[0].value; n.className = "se-dialog-content", n.style.display = "none"; let o = '
    ' + t.dialogBox.mathBox.title + '

    ", e.context.math.defaultFontSize = l, n.innerHTML = o, n }, setController_MathButton: function (e) { const t = e.lang, n = e.util.createElement("DIV"); return n.className = "se-controller se-controller-link", n.innerHTML = '
    ", n }, open: function () { this.plugins.dialog.open.call(this, "math", "math" === this.currentControllerName) }, managedTags: function () { return { className: "katex", method: function (e) { if (!e.getAttribute("data-exp") || !this.options.katex) return; const t = this._d.createRange().createContextualFragment(this.plugins.math._renderer.call(this, this.util.HTMLDecoder(e.getAttribute("data-exp")))); e.innerHTML = t.querySelector(".katex").innerHTML } } }, _renderer: function (e) { const t = this.options.katex; return t.src.renderToString(e, t.options) }, _renderMathExp: function (e, t) { e.previewElement.innerHTML = this.plugins.math._renderer.call(this, t.target.value) }, submit: function (e) { this.showLoading(), e.preventDefault(), e.stopPropagation(); const t = function () { if (0 === this.context.math.focusElement.value.trim().length) return !1; const e = this.context.math, t = e.focusElement.value, n = e.previewElement.querySelector(".katex"); if (!n) return !1; if (n.className = "__se__katex " + n.className, n.setAttribute("contenteditable", !1), n.setAttribute("data-exp", this.util.HTMLEncoder(t)), n.setAttribute("data-font-size", e.fontSizeElement.value), n.style.fontSize = e.fontSizeElement.value, this.context.dialog.updateModal) { const t = this.util.getParentElement(e._mathExp, ".katex"); t.parentNode.replaceChild(n, t), this.setRange(n, 0, n, 1) } else { const e = this.getSelectedElements(); if (e.length > 1) { const t = this.util.createElement(e[0].nodeName); if (t.appendChild(n), !this.insertNode(t, null, !0)) return !1 } else if (!this.insertNode(n, null, !0)) return !1; const t = this.util.createTextNode(this.util.zeroWidthSpace); n.parentNode.insertBefore(t, n.nextSibling), this.setRange(n, 0, n, 1) } return e.focusElement.value = "", e.fontSizeElement.value = "1em", e.previewElement.style.fontSize = "1em", e.previewElement.innerHTML = "", !0 }.bind(this); try { t() && (this.plugins.dialog.close.call(this), this.history.push(!1)) } catch (e) { this.plugins.dialog.close.call(this) } finally { this.closeLoading() } return !1 }, active: function (e) { if (e) { if (e.getAttribute("data-exp")) return this.controllerArray.indexOf(this.context.math.mathController) < 0 && (this.setRange(e, 0, e, 1), this.plugins.math.call_controller.call(this, e)), !0 } else this.controllerArray.indexOf(this.context.math.mathController) > -1 && this.controllersOff(); return !1 }, on: function (e) { if (e) { const e = this.context.math; if (e._mathExp) { const t = this.util.HTMLDecoder(e._mathExp.getAttribute("data-exp")), n = e._mathExp.getAttribute("data-font-size") || "1em"; this.context.dialog.updateModal = !0, e.focusElement.value = t, e.fontSizeElement.value = n, e.previewElement.innerHTML = this.plugins.math._renderer.call(this, t), e.previewElement.style.fontSize = n } } else this.plugins.math.init.call(this) }, call_controller: function (e) { this.context.math._mathExp = e; const t = this.context.math.mathController; this.setControllerPosition(t, e, "bottom", { left: 0, top: 0 }), this.controllersOn(t, e, "math") }, onClick_mathController: function (e) { e.stopPropagation(); const t = e.target.getAttribute("data-command") || e.target.parentNode.getAttribute("data-command"); t && (e.preventDefault(), /update/.test(t) ? (this.context.math.focusElement.value = this.util.HTMLDecoder(this.context.math._mathExp.getAttribute("data-exp")), this.plugins.dialog.open.call(this, "math", !0)) : (this.util.removeItem(this.context.math._mathExp), this.context.math._mathExp = null, this.focus(), this.history.push(!1)), this.controllersOff()) }, init: function () { const e = this.context.math; e.mathController.style.display = "none", e._mathExp = null, e.focusElement.value = "", e.previewElement.innerHTML = "" } }, w = n("JhlZ"), x = n.n(w), E = { blockquote: { name: "blockquote", display: "command", add: function (e, t) { e.context.blockquote = { targetButton: t, tag: e.util.createElement("BLOCKQUOTE") } }, active: function (e) { if (e) { if (/blockquote/i.test(e.nodeName)) return this.util.addClass(this.context.blockquote.targetButton, "active"), !0 } else this.util.removeClass(this.context.blockquote.targetButton, "active"); return !1 }, action: function () { const e = this.util.getParentElement(this.getSelectionNode(), "blockquote"); e ? this.detachRangeFormatElement(e, null, null, !1, !1) : this.applyRangeFormatElement(this.context.blockquote.tag.cloneNode(!1)) } }, align: { name: "align", display: "submenu", add: function (e, t) { const n = e.icons, i = e.context; i.align = { targetButton: t, _alignList: null, currentAlign: "", defaultDir: e.options.rtl ? "right" : "left", icons: { justify: n.align_justify, left: n.align_left, right: n.align_right, center: n.align_center } }; let l = this.setSubmenu(e), o = l.querySelector("ul"); o.addEventListener("click", this.pickup.bind(e)), i.align._alignList = o.querySelectorAll("li button"), e.initMenuTarget(this.name, t, l), l = null, o = null }, setSubmenu: function (e) { const t = e.lang, n = e.icons, i = e.util.createElement("DIV"), l = "left" === e.context.align.defaultDir, o = '
  • ", s = '
  • "; return i.className = "se-submenu se-list-layer se-list-align", i.innerHTML = '
      ' + (l ? o : s) + '
    • " + (l ? s : o) + '
    ", i }, active: function (e) { const t = this.context.align, n = t.targetButton, i = n.firstElementChild; if (e) { if (this.util.isFormatElement(e)) { const l = e.style.textAlign; if (l) return this.util.changeElement(i, t.icons[l] || t.icons[t.defaultDir]), n.setAttribute("data-focus", l), !0 } } else this.util.changeElement(i, t.icons[t.defaultDir]), n.removeAttribute("data-focus"); return !1 }, on: function () { const e = this.context.align, t = e._alignList, n = e.targetButton.getAttribute("data-focus") || e.defaultDir; if (n !== e.currentAlign) { for (let e = 0, i = t.length; e < i; e++)n === t[e].getAttribute("data-value") ? this.util.addClass(t[e], "active") : this.util.removeClass(t[e], "active"); e.currentAlign = n } }, pickup: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = null; for (; !n && !/UL/i.test(t.tagName);)n = t.getAttribute("data-value"), t = t.parentNode; if (!n) return; const i = this.context.align.defaultDir, l = this.getSelectedElements(); for (let e = 0, t = l.length; e < t; e++)this.util.setStyle(l[e], "textAlign", n === i ? "" : n); this.effectNode = null, this.submenuOff(), this.focus(), this.history.push(!1) } }, font: { name: "font", display: "submenu", add: function (e, t) { const n = e.context; n.font = { targetText: t.querySelector(".txt"), targetTooltip: t.parentNode.querySelector(".se-tooltip-text"), _fontList: null, currentFont: "" }; let i = this.setSubmenu(e); i.querySelector(".se-list-inner").addEventListener("click", this.pickup.bind(e)), n.font._fontList = i.querySelectorAll("ul li button"), e.initMenuTarget(this.name, t, i), i = null }, setSubmenu: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); let l, o, s, a; i.className = "se-submenu se-list-layer se-list-font-family"; let r = t.font ? t.font : ["Arial", "Comic Sans MS", "Courier New", "Impact", "Georgia", "tahoma", "Trebuchet MS", "Verdana"], c = '
    • "; for (s = 0, a = r.length; s < a; s++)l = r[s], o = l.split(",")[0], c += '
    • "; return c += "
    ", i.innerHTML = c, i }, active: function (e) { const t = this.context.font.targetText, n = this.context.font.targetTooltip; if (e) { if (e.style && e.style.fontFamily.length > 0) { const i = e.style.fontFamily.replace(/["']/g, ""); return this.util.changeTxt(t, i), this.util.changeTxt(n, this.lang.toolbar.font + " (" + i + ")"), !0 } } else { const e = this.hasFocus ? this.wwComputedStyle.fontFamily : this.lang.toolbar.font; this.util.changeTxt(t, e), this.util.changeTxt(n, this.hasFocus ? this.lang.toolbar.font + " (" + e + ")" : e) } return !1 }, on: function () { const e = this.context.font, t = e._fontList, n = e.targetText.textContent; if (n !== e.currentFont) { for (let e = 0, i = t.length; e < i; e++)n === t[e].getAttribute("data-value") ? this.util.addClass(t[e], "active") : this.util.removeClass(t[e], "active"); e.currentFont = n } }, pickup: function (e) { if (!/^BUTTON$/i.test(e.target.tagName)) return !1; e.preventDefault(), e.stopPropagation(); const t = e.target.getAttribute("data-value"); if (t) { const e = this.util.createElement("SPAN"); e.style.fontFamily = t, this.nodeChange(e, ["font-family"], null, null) } else this.nodeChange(null, ["font-family"], ["span"], !0); this.submenuOff() } }, fontSize: { name: "fontSize", display: "submenu", add: function (e, t) { const n = e.context; n.fontSize = { targetText: t.querySelector(".txt"), _sizeList: null, currentSize: "" }; let i = this.setSubmenu(e), l = i.querySelector("ul"); l.addEventListener("click", this.pickup.bind(e)), n.fontSize._sizeList = l.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null, l = null }, setSubmenu: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); i.className = "se-submenu se-list-layer se-list-font-size"; const l = t.fontSize ? t.fontSize : [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72]; let o = '
    • "; for (let e, n = 0, i = t.fontSizeUnit, s = l.length; n < s; n++)e = l[n], o += '
    • "; return o += "
    ", i.innerHTML = o, i }, active: function (e) { if (e) { if (e.style && e.style.fontSize.length > 0) return this.util.changeTxt(this.context.fontSize.targetText, e.style.fontSize), !0 } else this.util.changeTxt(this.context.fontSize.targetText, this.hasFocus ? this.wwComputedStyle.fontSize : this.lang.toolbar.fontSize); return !1 }, on: function () { const e = this.context.fontSize, t = e._sizeList, n = e.targetText.textContent; if (n !== e.currentSize) { for (let e = 0, i = t.length; e < i; e++)n === t[e].getAttribute("data-value") ? this.util.addClass(t[e], "active") : this.util.removeClass(t[e], "active"); e.currentSize = n } }, pickup: function (e) { if (!/^BUTTON$/i.test(e.target.tagName)) return !1; e.preventDefault(), e.stopPropagation(); const t = e.target.getAttribute("data-value"); if (t) { const e = this.util.createElement("SPAN"); e.style.fontSize = t, this.nodeChange(e, ["font-size"], null, null) } else this.nodeChange(null, ["font-size"], ["span"], !0); this.submenuOff() } }, fontColor: l, hiliteColor: o, horizontalRule: { name: "horizontalRule", display: "submenu", add: function (e, t) { e.context.horizontalRule = { currentHR: null }; let n = this.setSubmenu(e); n.querySelector("ul").addEventListener("click", this.horizontalRulePick.bind(e)), e.initMenuTarget(this.name, t, n), n = null }, setSubmenu: function (e) { const t = e.lang, n = e.util.createElement("DIV"); return n.className = "se-submenu se-list-layer se-list-line", n.innerHTML = '
    ', n }, active: function (e) { if (e) { if (/HR/i.test(e.nodeName)) return this.context.horizontalRule.currentHR = e, this.util.hasClass(e, "on") || (this.util.addClass(e, "on"), this.controllersOn("hr", this.util.removeClass.bind(this.util, e, "on"))), !0 } else this.util.hasClass(this.context.horizontalRule.currentHR, "on") && this.controllersOff(); return !1 }, appendHr: function (e) { const t = this.util.createElement("HR"); return t.className = e, this.focus(), this.insertComponent(t, !1, !0, !1) }, horizontalRulePick: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = null; for (; !n && !/UL/i.test(t.tagName);)n = t.getAttribute("data-value"), t = t.parentNode; if (!n) return; const i = this.plugins.horizontalRule.appendHr.call(this, "__se__" + n); i && (this.setRange(i, 0, i, 0), this.submenuOff()) } }, list: { name: "list", display: "submenu", add: function (e, t) { const n = e.context; n.list = { targetButton: t, _list: null, currentList: "", icons: { bullets: e.icons.list_bullets, number: e.icons.list_number } }; let i = this.setSubmenu(e), l = i.querySelector("ul"); l.addEventListener("click", this.pickup.bind(e)), n.list._list = l.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null, l = null }, setSubmenu: function (e) { const t = e.lang, n = e.util.createElement("DIV"); return n.className = "se-submenu se-list-layer", n.innerHTML = '
    ", n }, active: function (e) { const t = this.context.list.targetButton, n = t.firstElementChild, i = this.util; if (e) { if (i.isList(e)) { const l = e.nodeName; return t.setAttribute("data-focus", l), i.addClass(t, "active"), /UL/i.test(l) ? i.changeElement(n, this.context.list.icons.bullets) : i.changeElement(n, this.context.list.icons.number), !0 } } else t.removeAttribute("data-focus"), i.changeElement(n, this.context.list.icons.number), i.removeClass(t, "active"); return !1 }, on: function () { const e = this.context.list, t = e._list, n = e.targetButton.getAttribute("data-focus") || ""; if (n !== e.currentList) { for (let e = 0, i = t.length; e < i; e++)n === t[e].getAttribute("data-command") ? this.util.addClass(t[e], "active") : this.util.removeClass(t[e], "active"); e.currentList = n } }, editList: function (e, t, n) { let i = this.getRange(), l = t || this.getSelectedElementsAndComponents(!1); if (0 === l.length) { if (t) return; if (i = this.getRange_addLine(i, null), l = this.getSelectedElementsAndComponents(!1), 0 === l.length) return } const o = this.util; o.sortByDepth(l, !0); let s = l[0], a = l[l.length - 1], r = !o.isListCell(s) && !o.isComponent(s) || s.previousElementSibling ? s.previousElementSibling : s.parentNode.previousElementSibling, c = !o.isListCell(a) && !o.isComponent(a) || a.nextElementSibling ? a.nextElementSibling : a.parentNode.nextElementSibling; const d = { sc: i.startContainer, so: i.startOffset, ec: i.endContainer, eo: i.endOffset }; let u = !0; for (let e = 0, t = l.length; e < t; e++)if (!o.isList(o.getRangeFormatElement(l[e], function (t) { return this.getRangeFormatElement(t) && t !== l[e] }.bind(o)))) { u = !1; break } if (!u || r && s.tagName === r.tagName && e === r.tagName.toUpperCase() || c && a.tagName === c.tagName && e === c.tagName.toUpperCase()) { const t = r ? r.parentNode : r, n = c ? c.parentNode : c; r = t && !o.isWysiwygDiv(t) && t.nodeName === e ? t : r, c = n && !o.isWysiwygDiv(n) && n.nodeName === e ? n : c; const i = r && r.tagName === e, s = c && c.tagName === e; let a = i ? r : o.createElement(e), d = null, u = null, h = null, p = null; const g = function (e) { return !this.isComponent(e) && !this.isList(e) }.bind(o); for (let t, n, s, r, c, p, m, f, _, b = 0, v = l.length; b < v; b++)if (n = l[b], 0 !== n.childNodes.length || o._isIgnoreNodeChange(n)) { if (r = l[b + 1], c = n.parentNode, p = r ? r.parentNode : null, s = o.isListCell(n), _ = o.isRangeFormatElement(c) ? c : null, m = s && !o.isWysiwygDiv(c) ? c.parentNode : c, f = s && !o.isWysiwygDiv(c) ? !r || o.isListCell(m) ? c : c.nextSibling : n.nextSibling, t = o.createElement("LI"), o.copyFormatAttributes(t, n), o.isComponent(n)) { const e = /^HR$/i.test(n.nodeName); e || (t.innerHTML = "
    "), t.innerHTML += n.outerHTML, e && (t.innerHTML += "
    ") } else { const e = n.childNodes; for (; e[0];)t.appendChild(e[0]) } a.appendChild(t), r || (u = a), r && m === p && !o.isRangeFormatElement(f) || (d || (d = a), i && r && m === p || r && o.isList(p) && p === c || a.parentNode !== m && m.insertBefore(a, f)), o.removeItem(n), i && null === h && (h = a.children.length - 1), r && (o.getRangeFormatElement(p, g) !== o.getRangeFormatElement(c, g) || o.isList(p) && o.isList(c) && o.getElementDepth(p) !== o.getElementDepth(c)) && (a = o.createElement(e)), _ && 0 === _.children.length && o.removeItem(_) } else o.removeItem(n); h && (d = d.children[h]), s && (p = a.children.length - 1, a.innerHTML += c.innerHTML, u = a.children[p], o.removeItem(c)) } else { if (n) for (let e = 0, t = l.length; e < t; e++)for (let n = e - 1; n >= 0; n--)if (l[n].contains(l[e])) { l.splice(e, 1), e--, t--; break } const t = o.getRangeFormatElement(s), i = t && t.tagName === e; let a, r; const c = function (e) { return !this.isComponent(e) }.bind(o); i || (r = o.createElement(e)); for (let t, s, d = 0, u = l.length; d < u; d++)s = o.getRangeFormatElement(l[d], c), s && o.isList(s) && (t ? t !== s ? (n && o.isListCell(s.parentNode) ? this.plugins.list._detachNested.call(this, a.f) : this.detachRangeFormatElement(a.f[0].parentNode, a.f, r, !1, !0), s = l[d].parentNode, i || (r = o.createElement(e)), t = s, a = { r: t, f: [o.getParentElement(l[d], "LI")] }) : a.f.push(o.getParentElement(l[d], "LI")) : (t = s, a = { r: t, f: [o.getParentElement(l[d], "LI")] }), d === u - 1 && (n && o.isListCell(s.parentNode) ? this.plugins.list._detachNested.call(this, a.f) : this.detachRangeFormatElement(a.f[0].parentNode, a.f, r, !1, !0))) } return this.effectNode = null, d }, _detachNested: function (e) { const t = e[0], n = e[e.length - 1], i = n.nextElementSibling, l = t.parentNode, o = l.parentNode.nextElementSibling, s = l.parentNode.parentNode; for (let t = 0, n = e.length; t < n; t++)s.insertBefore(e[t], o); if (i && l.children.length > 0) { const e = l.cloneNode(!1), t = l.childNodes, o = this.util.getPositionIndex(i); for (; t[o];)e.appendChild(t[o]); n.appendChild(e) } 0 === l.children.length && this.util.removeItem(l), this.util.mergeSameTags(s); const a = this.util.getEdgeChildNodes(t, n); return { cc: t.parentNode, sc: a.sc, ec: a.ec } }, editInsideList: function (e, t) { const n = (t = t || this.getSelectedElements().filter(function (e) { return this.isListCell(e) }.bind(this.util))).length; if (0 === n || !e && !this.util.isListCell(t[0].previousElementSibling) && !this.util.isListCell(t[n - 1].nextElementSibling)) return { sc: t[0], so: 0, ec: t[n - 1], eo: 1 }; let i = t[0].parentNode, l = t[n - 1], o = null; if (e) { if (i !== l.parentNode && this.util.isList(l.parentNode.parentNode) && l.nextElementSibling) for (l = l.nextElementSibling; l;)t.push(l), l = l.nextElementSibling; o = this.plugins.list.editList.call(this, i.nodeName.toUpperCase(), t, !0) } else { let e = this.util.createElement(i.nodeName), s = t[0].previousElementSibling, a = l.nextElementSibling; const r = { s: null, e: null, sl: i, el: i }; for (let l, o = 0, c = n; o < c; o++)l = t[o], l.parentNode !== i && (this.plugins.list._insiedList.call(this, i, e, s, a, r), i = l.parentNode, e = this.util.createElement(i.nodeName)), s = l.previousElementSibling, a = l.nextElementSibling, e.appendChild(l); this.plugins.list._insiedList.call(this, i, e, s, a, r); const c = this.util.getNodeFromPath(r.s, r.sl), d = this.util.getNodeFromPath(r.e, r.el); o = { sc: c, so: 0, ec: d, eo: d.textContent.length } } return o }, _insiedList: function (e, t, n, i, l) { let o = !1; if (n && t.tagName === n.tagName) { const e = t.children; for (; e[0];)n.appendChild(e[0]); t = n, o = !0 } if (i && t.tagName === i.tagName) { const e = i.children; for (; e[0];)t.appendChild(e[0]); const n = i.nextElementSibling; i.parentNode.removeChild(i), i = n } if (!o) { this.util.isListCell(n) && (e = n, i = null), e.insertBefore(t, i), l.s || (l.s = this.util.getNodePath(t.firstElementChild.firstChild, e, null), l.sl = e); const o = e.contains(l.sl) ? this.util.getNodePath(l.sl, e) : null; l.e = this.util.getNodePath(t.lastElementChild.firstChild, e, null), l.el = e, this.util.mergeSameTags(e, [l.s, l.e, o], !1), this.util.mergeNestedTags(e), o && (l.sl = this.util.getNodeFromPath(o, e)) } return t }, pickup: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = ""; for (; !n && !/^UL$/i.test(t.tagName);)n = t.getAttribute("data-command"), t = t.parentNode; if (!n) return; const i = this.plugins.list.editList.call(this, n, null, !1); i && this.setRange(i.sc, i.so, i.ec, i.eo), this.submenuOff(), this.history.push(!1) } }, table: { name: "table", display: "submenu", add: function (e, t) { const n = e.context; let i = n.table = { _element: null, _tdElement: null, _trElement: null, _trElements: null, _tableXY: [], _maxWidth: !0, _fixedColumn: !1, _rtl: e.options.rtl, cellControllerTop: "top" === e.options.tableCellControllerPosition, resizeText: null, headerButton: null, mergeButton: null, splitButton: null, splitMenu: null, maxText: e.lang.controller.maxSize, minText: e.lang.controller.minSize, _physical_cellCnt: 0, _logical_cellCnt: 0, _rowCnt: 0, _rowIndex: 0, _physical_cellIndex: 0, _logical_cellIndex: 0, _current_colSpan: 0, _current_rowSpan: 0, icons: { expansion: e.icons.expansion, reduction: e.icons.reduction } }, l = this.setSubmenu(e), o = l.querySelector(".se-controller-table-picker"); i.tableHighlight = l.querySelector(".se-table-size-highlighted"), i.tableUnHighlight = l.querySelector(".se-table-size-unhighlighted"), i.tableDisplay = l.querySelector(".se-table-size-display"), e.options.rtl && (i.tableHighlight.style.left = "167px"); let s = this.setController_table(e); i.tableController = s, i.resizeButton = s.querySelector("._se_table_resize"), i.resizeText = s.querySelector("._se_table_resize > span > span"), i.columnFixedButton = s.querySelector("._se_table_fixed_column"), i.headerButton = s.querySelector("._se_table_header"); let a = this.setController_tableEditor(e, i.cellControllerTop); i.resizeDiv = a, i.splitMenu = a.querySelector(".se-btn-group-sub"), i.mergeButton = a.querySelector("._se_table_merge_button"), i.splitButton = a.querySelector("._se_table_split_button"), i.insertRowAboveButton = a.querySelector("._se_table_insert_row_a"), i.insertRowBelowButton = a.querySelector("._se_table_insert_row_b"), o.addEventListener("mousemove", this.onMouseMove_tablePicker.bind(e, i)), o.addEventListener("click", this.appendTable.bind(e)), a.addEventListener("click", this.onClick_tableController.bind(e)), s.addEventListener("click", this.onClick_tableController.bind(e)), e.initMenuTarget(this.name, t, l), n.element.relative.appendChild(a), n.element.relative.appendChild(s), l = null, o = null, a = null, s = null, i = null }, setSubmenu: function (e) { const t = e.util.createElement("DIV"); return t.className = "se-submenu se-selector-table", t.innerHTML = '
    1 x 1
    ', t }, setController_table: function (e) { const t = e.lang, n = e.icons, i = e.util.createElement("DIV"); return i.className = "se-controller se-controller-table", i.innerHTML = '
    ", i }, setController_tableEditor: function (e, t) { const n = e.lang, i = e.icons, l = e.util.createElement("DIV"); return l.className = "se-controller se-controller-table-cell", l.innerHTML = (t ? "" : '
    ') + '
    • ' + n.controller.VerticalSplit + '
    • ' + n.controller.HorizontalSplit + "
    ", l }, appendTable: function () { const e = this.util.createElement("TABLE"), t = this.plugins.table.createCells, n = this.context.table._tableXY[0]; let i = this.context.table._tableXY[1], l = ""; for (; i > 0;)l += "" + t.call(this, "td", n) + "", --i; l += "", e.innerHTML = l; if (this.insertComponent(e, !1, !0, !1)) { const t = e.querySelector("td div"); this.setRange(t, 0, t, 0), this.plugins.table.reset_table_picker.call(this) } }, createCells: function (e, t, n) { if (e = e.toLowerCase(), n) { const t = this.util.createElement(e); return t.innerHTML = "

    ", t } { let n = ""; for (; t > 0;)n += "<" + e + ">

    ", t--; return n } }, onMouseMove_tablePicker: function (e, t) { t.stopPropagation(); let n = this._w.Math.ceil(t.offsetX / 18), i = this._w.Math.ceil(t.offsetY / 18); n = n < 1 ? 1 : n, i = i < 1 ? 1 : i, e._rtl && (e.tableHighlight.style.left = 18 * n - 13 + "px", n = 11 - n), e.tableHighlight.style.width = n + "em", e.tableHighlight.style.height = i + "em", this.util.changeTxt(e.tableDisplay, n + " x " + i), e._tableXY = [n, i] }, reset_table_picker: function () { if (!this.context.table.tableHighlight) return; const e = this.context.table.tableHighlight.style, t = this.context.table.tableUnHighlight.style; e.width = "1em", e.height = "1em", t.width = "10em", t.height = "10em", this.util.changeTxt(this.context.table.tableDisplay, "1 x 1"), this.submenuOff() }, init: function () { const e = this.context.table, t = this.plugins.table; if (t._removeEvents.call(this), t._selectedTable) { const e = t._selectedTable.querySelectorAll(".se-table-selected-cell"); for (let t = 0, n = e.length; t < n; t++)this.util.removeClass(e[t], "se-table-selected-cell") } t._toggleEditor.call(this, !0), e._element = null, e._tdElement = null, e._trElement = null, e._trElements = null, e._tableXY = [], e._maxWidth = !0, e._fixedColumn = !1, e._physical_cellCnt = 0, e._logical_cellCnt = 0, e._rowCnt = 0, e._rowIndex = 0, e._physical_cellIndex = 0, e._logical_cellIndex = 0, e._current_colSpan = 0, e._current_rowSpan = 0, t._shift = !1, t._selectedCells = null, t._selectedTable = null, t._ref = null, t._fixedCell = null, t._selectedCell = null, t._fixedCellName = null }, call_controller_tableEdit: function (e) { const t = this.plugins.table, n = this.context.table; if (!this.getSelection().isCollapsed && !t._selectedCell) return this.controllersOff(), void this.util.removeClass(e, "se-table-selected-cell"); const i = n._element || this.plugins.table._selectedTable || this.util.getParentElement(e, "TABLE"); n._maxWidth = this.util.hasClass(i, "se-table-size-100") || "100%" === i.style.width || !i.style.width && !this.util.hasClass(i, "se-table-size-auto"), n._fixedColumn = this.util.hasClass(i, "se-table-layout-fixed") || "fixed" === i.style.tableLayout, t.setTableStyle.call(this, n._maxWidth ? "width|column" : "width"), t.setPositionControllerTop.call(this, i), t.setPositionControllerDiv.call(this, e, t._shift), t._shift || this.controllersOn(n.resizeDiv, n.tableController, t.init.bind(this), e, "table") }, setPositionControllerTop: function (e) { this.setControllerPosition(this.context.table.tableController, e, "top", { left: 0, top: 0 }) }, setPositionControllerDiv: function (e, t) { const n = this.context.table, i = n.resizeDiv; this.plugins.table.setCellInfo.call(this, e, t), n.cellControllerTop ? this.setControllerPosition(i, n._element, "top", { left: n.tableController.offsetWidth, top: 0 }) : this.setControllerPosition(i, e, "bottom", { left: 0, top: 0 }) }, setCellInfo: function (e, t) { const n = this.context.table, i = n._element = this.plugins.table._selectedTable || this.util.getParentElement(e, "TABLE"); if (/THEAD/i.test(i.firstElementChild.nodeName) ? this.util.addClass(n.headerButton, "active") : this.util.removeClass(n.headerButton, "active"), t || 0 === n._physical_cellCnt) { n._tdElement !== e && (n._tdElement = e, n._trElement = e.parentNode); const t = n._trElements = i.rows, l = e.cellIndex; let o = 0; for (let e = 0, n = t[0].cells, i = t[0].cells.length; e < i; e++)o += n[e].colSpan; const s = n._rowIndex = n._trElement.rowIndex; n._rowCnt = t.length, n._physical_cellCnt = n._trElement.cells.length, n._logical_cellCnt = o, n._physical_cellIndex = l, n._current_colSpan = n._tdElement.colSpan - 1, n._current_rowSpan, n._trElement.cells[l].rowSpan; let a = [], r = []; for (let e, i, o = 0; o <= s; o++) { e = t[o].cells, i = 0; for (let t, c, d, u, h = 0, p = e.length; h < p; h++) { if (t = e[h], c = t.colSpan - 1, d = t.rowSpan - 1, u = h + i, r.length > 0) for (let e, t = 0; t < r.length; t++)e = r[t], e.row > o || (u >= e.index ? (i += e.cs, u += e.cs, e.rs -= 1, e.row = o + 1, e.rs < 1 && (r.splice(t, 1), t--)) : h === p - 1 && (e.rs -= 1, e.row = o + 1, e.rs < 1 && (r.splice(t, 1), t--))); if (o === s && h === l) { n._logical_cellIndex = u; break } d > 0 && a.push({ index: u, cs: c + 1, rs: d, row: -1 }), i += c } r = r.concat(a).sort((function (e, t) { return e.index - t.index })), a = [] } a = null, r = null } }, editTable: function (e, t) { const n = this.plugins.table, i = this.context.table, l = i._element, o = "row" === e; if (o) { const e = i._trElement.parentNode; if (/^THEAD$/i.test(e.nodeName)) { if ("up" === t) return; if (!e.nextElementSibling || !/^TBODY$/i.test(e.nextElementSibling.nodeName)) return void (l.innerHTML += "" + n.createCells.call(this, "td", i._logical_cellCnt, !1) + "") } } if (n._ref) { const e = i._tdElement, l = n._selectedCells; if (o) if (t) n.setCellInfo.call(this, "up" === t ? l[0] : l[l.length - 1], !0), n.editRow.call(this, t, e); else { let e = l[0].parentNode; const i = [l[0]]; for (let t, n = 1, o = l.length; n < o; n++)t = l[n], e !== t.parentNode && (i.push(t), e = t.parentNode); for (let e = 0, l = i.length; e < l; e++)n.setCellInfo.call(this, i[e], !0), n.editRow.call(this, t) } else { const i = l[0].parentNode; if (t) { let o = null; for (let e = 0, t = l.length - 1; e < t; e++)if (i !== l[e + 1].parentNode) { o = l[e]; break } n.setCellInfo.call(this, "left" === t ? l[0] : o || l[0], !0), n.editCell.call(this, t, e) } else { const e = [l[0]]; for (let t, n = 1, o = l.length; n < o && (t = l[n], i === t.parentNode); n++)e.push(t); for (let i = 0, l = e.length; i < l; i++)n.setCellInfo.call(this, e[i], !0), n.editCell.call(this, t) } } t || n.init.call(this) } else n[o ? "editRow" : "editCell"].call(this, t); if (!t) { const e = l.children; for (let t = 0; t < e.length; t++)0 === e[t].children.length && (this.util.removeItem(e[t]), t--); 0 === l.children.length && this.util.removeItem(l) } }, editRow: function (e, t) { const n = this.context.table, i = !e, l = "up" === e, o = n._rowIndex, s = i || l ? o : o + n._current_rowSpan + 1, a = i ? -1 : 1, r = n._trElements; let c = n._logical_cellCnt; for (let e, t = 0, n = o + (i ? -1 : 0); t <= n; t++) { if (e = r[t].cells, 0 === e.length) return; for (let n, i, l = 0, o = e.length; l < o; l++)n = e[l].rowSpan, i = e[l].colSpan, n < 2 && i < 2 || n + t > s && s > t && (e[l].rowSpan = n + a, c -= i) } if (i) { const e = r[o + 1]; if (e) { const t = []; let n = r[o].cells, i = 0; for (let e, l, o = 0, s = n.length; o < s; o++)e = n[o], l = o + i, i += e.colSpan - 1, e.rowSpan > 1 && (e.rowSpan -= 1, t.push({ cell: e.cloneNode(!1), index: l })); if (t.length > 0) { let l = t.shift(); n = e.cells, i = 0; for (let o, s, a = 0, r = n.length; a < r && (o = n[a], s = a + i, i += o.colSpan - 1, !(s >= l.index) || (a--, i--, i += l.cell.colSpan - 1, e.insertBefore(l.cell, o), l = t.shift(), l)); a++); if (l) { e.appendChild(l.cell); for (let n = 0, i = t.length; n < i; n++)e.appendChild(t[n].cell) } } } n._element.deleteRow(s) } else { n._element.insertRow(s).innerHTML = this.plugins.table.createCells.call(this, "td", c, !1) } i ? this.controllersOff() : this.plugins.table.setPositionControllerDiv.call(this, t || n._tdElement, !0) }, editCell: function (e, t) { const n = this.context.table, i = this.util, l = !e, o = "left" === e, s = n._current_colSpan, a = l || o ? n._logical_cellIndex : n._logical_cellIndex + s + 1, r = n._trElements; let c = [], d = [], u = 0; const h = [], p = []; for (let e, t, o, g, m, f, _ = 0, b = n._rowCnt; _ < b; _++) { e = r[_], t = a, m = !1, o = e.cells, f = 0; for (let e, n, r, g, b = 0, v = o.length; b < v && (e = o[b], e); b++)if (n = e.rowSpan - 1, r = e.colSpan - 1, l) { if (g = b + f, d.length > 0) { const e = !o[b + 1]; for (let t, n = 0; n < d.length; n++)t = d[n], t.row > _ || (g >= t.index ? (f += t.cs, g = b + f, t.rs -= 1, t.row = _ + 1, t.rs < 1 && (d.splice(n, 1), n--)) : e && (t.rs -= 1, t.row = _ + 1, t.rs < 1 && (d.splice(n, 1), n--))) } n > 0 && c.push({ rs: n, cs: r + 1, index: g, row: -1 }), g >= t && g + r <= t + s ? h.push(e) : g <= t + s && g + r >= t ? e.colSpan -= i.getOverlapRangeAtIndex(a, a + s, g, g + r) : n > 0 && (g < t || g + r > t + s) && p.push({ cell: e, i: _, rs: _ + n }), f += r } else { if (b >= t) break; if (r > 0) { if (u < 1 && r + b >= t) { e.colSpan += 1, t = null, u = n + 1; break } t -= r } if (!m) { for (let e, n = 0; n < d.length; n++)e = d[n], t -= e.cs, e.rs -= 1, e.rs < 1 && (d.splice(n, 1), n--); m = !0 } } if (d = d.concat(c).sort((function (e, t) { return e.index - t.index })), c = [], !l) { if (u > 0) { u -= 1; continue } null !== t && o.length > 0 && (g = this.plugins.table.createCells.call(this, o[0].nodeName, 0, !0), g = e.insertBefore(g, o[t])) } } if (l) { let e, t; for (let n, l = 0, o = h.length; l < o; l++)n = h[l].parentNode, i.removeItem(h[l]), 0 === n.cells.length && (e || (e = i.getArrayIndex(r, n)), t = i.getArrayIndex(r, n), i.removeItem(n)); for (let n, l = 0, o = p.length; l < o; l++)n = p[l], n.cell.rowSpan = i.getOverlapRangeAtIndex(e, t, n.i, n.rs); this.controllersOff() } else this.plugins.table.setPositionControllerDiv.call(this, t || n._tdElement, !0) }, _closeSplitMenu: null, openSplitMenu: function () { this.util.addClass(this.context.table.splitButton, "on"), this.context.table.splitMenu.style.display = "inline-table", this.plugins.table._closeSplitMenu = function () { this.util.removeClass(this.context.table.splitButton, "on"), this.context.table.splitMenu.style.display = "none", this.removeDocEvent("click", this.plugins.table._closeSplitMenu), this.plugins.table._closeSplitMenu = null }.bind(this), this.addDocEvent("click", this.plugins.table._closeSplitMenu) }, splitCells: function (e) { const t = this.util, n = "vertical" === e, i = this.context.table, l = i._tdElement, o = i._trElements, s = i._trElement, a = i._logical_cellIndex, r = i._rowIndex, c = this.plugins.table.createCells.call(this, l.nodeName, 0, !0); if (n) { const e = l.colSpan; if (c.rowSpan = l.rowSpan, e > 1) c.colSpan = this._w.Math.floor(e / 2), l.colSpan = e - c.colSpan, s.insertBefore(c, l.nextElementSibling); else { let t = [], n = []; for (let s, r, c = 0, d = i._rowCnt; c < d; c++) { s = o[c].cells, r = 0; for (let i, o, d, u, h = 0, p = s.length; h < p; h++) { if (i = s[h], o = i.colSpan - 1, d = i.rowSpan - 1, u = h + r, n.length > 0) for (let e, t = 0; t < n.length; t++)e = n[t], e.row > c || (u >= e.index ? (r += e.cs, u += e.cs, e.rs -= 1, e.row = c + 1, e.rs < 1 && (n.splice(t, 1), t--)) : h === p - 1 && (e.rs -= 1, e.row = c + 1, e.rs < 1 && (n.splice(t, 1), t--))); if (u <= a && d > 0 && t.push({ index: u, cs: o + 1, rs: d, row: -1 }), i !== l && u <= a && u + o >= a + e - 1) { i.colSpan += 1; break } if (u > a) break; r += o } n = n.concat(t).sort((function (e, t) { return e.index - t.index })), t = [] } s.insertBefore(c, l.nextElementSibling) } } else { const e = l.rowSpan; if (c.colSpan = l.colSpan, e > 1) { c.rowSpan = this._w.Math.floor(e / 2); const n = e - c.rowSpan, i = [], r = t.getArrayIndex(o, s) + n; for (let e, t, n = 0; n < r; n++) { e = o[n].cells, t = 0; for (let l, o, s, c = 0, d = e.length; c < d && (s = c + t, !(s >= a)); c++)l = e[c], o = l.rowSpan - 1, o > 0 && o + n >= r && s < a && i.push({ index: s, cs: l.colSpan }), t += l.colSpan - 1 } const d = o[r], u = d.cells; let h = i.shift(); for (let e, t, n, l, o = 0, s = u.length, r = 0; o < s; o++) { if (n = o + r, e = u[o], t = e.colSpan - 1, l = n + t + 1, h && l >= h.index && (r += h.cs, l += h.cs, h = i.shift()), l >= a || o === s - 1) { d.insertBefore(c, e.nextElementSibling); break } r += t } l.rowSpan = n } else { c.rowSpan = l.rowSpan; const e = t.createElement("TR"); e.appendChild(c); for (let e, t = 0; t < r; t++) { if (e = o[t].cells, 0 === e.length) return; for (let n = 0, i = e.length; n < i; n++)t + e[n].rowSpan - 1 >= r && (e[n].rowSpan += 1) } const n = i._physical_cellIndex, a = s.cells; for (let e = 0, t = a.length; e < t; e++)e !== n && (a[e].rowSpan += 1); s.parentNode.insertBefore(e, s.nextElementSibling) } } this.focusEdge(l), this.plugins.table.setPositionControllerDiv.call(this, l, !0) }, mergeCells: function () { const e = this.plugins.table, t = this.context.table, n = this.util, i = e._ref, l = e._selectedCells, o = l[0]; let s = null, a = null, r = i.ce - i.cs + 1, c = i.re - i.rs + 1, d = "", u = null; for (let e, t, i = 1, o = l.length; i < o; i++) { e = l[i], u !== e.parentNode && (u = e.parentNode), t = e.children; for (let e = 0, i = t.length; e < i; e++)n.isFormatElement(t[e]) && n.onlyZeroWidthSpace(t[e].textContent) && n.removeItem(t[e]); d += e.innerHTML, n.removeItem(e), 0 === u.cells.length && (s ? a = u : s = u, c -= 1) } if (s) { const e = t._trElements, i = n.getArrayIndex(e, s), l = n.getArrayIndex(e, a || s), o = []; for (let t, s = 0; s <= l; s++)if (t = e[s].cells, 0 !== t.length) for (let e, o, a = 0, r = t.length; a < r; a++)e = t[a], o = e.rowSpan - 1, o > 0 && s + o >= i && (e.rowSpan -= n.getOverlapRangeAtIndex(i, l, s, s + o)); else o.push(e[s]); for (let e = 0, t = o.length; e < t; e++)n.removeItem(o[e]) } o.innerHTML += d, o.colSpan = r, o.rowSpan = c, this.controllersOff(), e.setActiveButton.call(this, !0, !1), e.call_controller_tableEdit.call(this, o), n.addClass(o, "se-table-selected-cell"), this.focusEdge(o) }, toggleHeader: function () { const e = this.util, t = this.context.table.headerButton, n = e.hasClass(t, "active"), i = this.context.table._element; if (n) e.removeItem(i.querySelector("thead")); else { const t = e.createElement("THEAD"); t.innerHTML = "" + this.plugins.table.createCells.call(this, "th", this.context.table._logical_cellCnt, !1) + "", i.insertBefore(t, i.firstElementChild) } e.toggleClass(t, "active"), /TH/i.test(this.context.table._tdElement.nodeName) ? this.controllersOff() : this.plugins.table.setPositionControllerDiv.call(this, this.context.table._tdElement, !1) }, setTableStyle: function (e) { const t = this.context.table, n = t._element; let i, l, o, s; e.indexOf("width") > -1 && (i = t.resizeButton.firstElementChild, l = t.resizeText, t._maxWidth ? (o = t.icons.reduction, s = t.minText, t.columnFixedButton.style.display = "block", this.util.removeClass(n, "se-table-size-auto"), this.util.addClass(n, "se-table-size-100")) : (o = t.icons.expansion, s = t.maxText, t.columnFixedButton.style.display = "none", this.util.removeClass(n, "se-table-size-100"), this.util.addClass(n, "se-table-size-auto")), this.util.changeElement(i, o), this.util.changeTxt(l, s)), e.indexOf("column") > -1 && (t._fixedColumn ? (this.util.removeClass(n, "se-table-layout-auto"), this.util.addClass(n, "se-table-layout-fixed"), this.util.addClass(t.columnFixedButton, "active")) : (this.util.removeClass(n, "se-table-layout-fixed"), this.util.addClass(n, "se-table-layout-auto"), this.util.removeClass(t.columnFixedButton, "active"))) }, setActiveButton: function (e, t) { const n = this.context.table; /^TH$/i.test(e.nodeName) ? (n.insertRowAboveButton.setAttribute("disabled", !0), n.insertRowBelowButton.setAttribute("disabled", !0)) : (n.insertRowAboveButton.removeAttribute("disabled"), n.insertRowBelowButton.removeAttribute("disabled")), t && e !== t ? (n.splitButton.setAttribute("disabled", !0), n.mergeButton.removeAttribute("disabled")) : (n.splitButton.removeAttribute("disabled"), n.mergeButton.setAttribute("disabled", !0)) }, _bindOnSelect: null, _bindOffSelect: null, _bindOffShift: null, _selectedCells: null, _shift: !1, _fixedCell: null, _fixedCellName: null, _selectedCell: null, _selectedTable: null, _ref: null, _toggleEditor: function (e) { this.context.element.wysiwyg.setAttribute("contenteditable", e), e ? this.util.removeClass(this.context.element.wysiwyg, "se-disabled") : this.util.addClass(this.context.element.wysiwyg, "se-disabled") }, _offCellMultiSelect: function (e) { e.stopPropagation(); const t = this.plugins.table; t._shift ? t._initBind && (this._wd.removeEventListener("touchmove", t._initBind), t._initBind = null) : (t._removeEvents.call(this), t._toggleEditor.call(this, !0)), t._fixedCell && t._selectedTable && (t.setActiveButton.call(this, t._fixedCell, t._selectedCell), t.call_controller_tableEdit.call(this, t._selectedCell || t._fixedCell), t._selectedCells = t._selectedTable.querySelectorAll(".se-table-selected-cell"), t._selectedCell && t._fixedCell && this.focusEdge(t._selectedCell), t._shift || (t._fixedCell = null, t._selectedCell = null, t._fixedCellName = null)) }, _onCellMultiSelect: function (e) { this._antiBlur = !0; const t = this.plugins.table, n = this.util.getParentElement(e.target, this.util.isCell); if (t._shift) n === t._fixedCell ? t._toggleEditor.call(this, !0) : t._toggleEditor.call(this, !1); else if (!t._ref) { if (n === t._fixedCell) return; t._toggleEditor.call(this, !1) } n && n !== t._selectedCell && t._fixedCellName === n.nodeName && t._selectedTable === this.util.getParentElement(n, "TABLE") && (t._selectedCell = n, t._setMultiCells.call(this, t._fixedCell, n)) }, _setMultiCells: function (e, t) { const n = this.plugins.table, i = n._selectedTable.rows, l = this.util, o = n._selectedTable.querySelectorAll(".se-table-selected-cell"); for (let e = 0, t = o.length; e < t; e++)l.removeClass(o[e], "se-table-selected-cell"); if (e === t && (l.addClass(e, "se-table-selected-cell"), !n._shift)) return; let s = !0, a = [], r = []; const c = n._ref = { _i: 0, cs: null, ce: null, rs: null, re: null }; for (let n, o, d = 0, u = i.length; d < u; d++) { n = i[d].cells, o = 0; for (let i, u, h, p, g = 0, m = n.length; g < m; g++) { if (i = n[g], h = i.colSpan - 1, p = i.rowSpan - 1, u = g + o, a.length > 0) for (let e, t = 0; t < a.length; t++)e = a[t], e.row > d || (u >= e.index ? (o += e.cs, u += e.cs, e.rs -= 1, e.row = d + 1, e.rs < 1 && (a.splice(t, 1), t--)) : g === m - 1 && (e.rs -= 1, e.row = d + 1, e.rs < 1 && (a.splice(t, 1), t--))); if (s) { if (i !== e && i !== t || (c.cs = null !== c.cs && c.cs < u ? c.cs : u, c.ce = null !== c.ce && c.ce > u + h ? c.ce : u + h, c.rs = null !== c.rs && c.rs < d ? c.rs : d, c.re = null !== c.re && c.re > d + p ? c.re : d + p, c._i += 1), 2 === c._i) { s = !1, a = [], r = [], d = -1; break } } else if (l.getOverlapRangeAtIndex(c.cs, c.ce, u, u + h) && l.getOverlapRangeAtIndex(c.rs, c.re, d, d + p)) { const e = c.cs < u ? c.cs : u, t = c.ce > u + h ? c.ce : u + h, n = c.rs < d ? c.rs : d, o = c.re > d + p ? c.re : d + p; if (c.cs !== e || c.ce !== t || c.rs !== n || c.re !== o) { c.cs = e, c.ce = t, c.rs = n, c.re = o, d = -1, a = [], r = []; break } l.addClass(i, "se-table-selected-cell") } p > 0 && r.push({ index: u, cs: h + 1, rs: p, row: -1 }), o += i.colSpan - 1 } a = a.concat(r).sort((function (e, t) { return e.index - t.index })), r = [] } }, _removeEvents: function () { const e = this.plugins.table; e._initBind && (this._wd.removeEventListener("touchmove", e._initBind), e._initBind = null), e._bindOnSelect && (this._wd.removeEventListener("mousedown", e._bindOnSelect), this._wd.removeEventListener("mousemove", e._bindOnSelect), e._bindOnSelect = null), e._bindOffSelect && (this._wd.removeEventListener("mouseup", e._bindOffSelect), e._bindOffSelect = null), e._bindOffShift && (this._wd.removeEventListener("keyup", e._bindOffShift), e._bindOffShift = null) }, _initBind: null, onTableCellMultiSelect: function (e, t) { const n = this.plugins.table; n._removeEvents.call(this), this.controllersOff(), n._shift = t, n._fixedCell = e, n._fixedCellName = e.nodeName, n._selectedTable = this.util.getParentElement(e, "TABLE"); const i = n._selectedTable.querySelectorAll(".se-table-selected-cell"); for (let e = 0, t = i.length; e < t; e++)this.util.removeClass(i[e], "se-table-selected-cell"); this.util.addClass(e, "se-table-selected-cell"), n._bindOnSelect = n._onCellMultiSelect.bind(this), n._bindOffSelect = n._offCellMultiSelect.bind(this), t ? (n._bindOffShift = function () { this.controllersOn(this.context.table.resizeDiv, this.context.table.tableController, this.plugins.table.init.bind(this), e, "table"), n._ref || this.controllersOff() }.bind(this), this._wd.addEventListener("keyup", n._bindOffShift, !1), this._wd.addEventListener("mousedown", n._bindOnSelect, !1)) : this._wd.addEventListener("mousemove", n._bindOnSelect, !1), this._wd.addEventListener("mouseup", n._bindOffSelect, !1), n._initBind = n.init.bind(this), this._wd.addEventListener("touchmove", n._initBind, !1) }, onClick_tableController: function (e) { e.stopPropagation(); const t = e.target.getAttribute("data-command") ? e.target : e.target.parentNode; if (t.getAttribute("disabled")) return; const n = t.getAttribute("data-command"), i = t.getAttribute("data-value"), l = t.getAttribute("data-option"), o = this.plugins.table; if ("function" == typeof o._closeSplitMenu && (o._closeSplitMenu(), "onsplit" === n)) return; if (!n) return; e.preventDefault(); const s = this.context.table; switch (n) { case "insert": case "delete": o.editTable.call(this, i, l); break; case "header": o.toggleHeader.call(this); break; case "onsplit": o.openSplitMenu.call(this); break; case "split": o.splitCells.call(this, i); break; case "merge": o.mergeCells.call(this); break; case "resize": s._maxWidth = !s._maxWidth, o.setTableStyle.call(this, "width"), o.setPositionControllerTop.call(this, s._element), o.setPositionControllerDiv.call(this, s._tdElement, o._shift); break; case "layout": s._fixedColumn = !s._fixedColumn, o.setTableStyle.call(this, "column"), o.setPositionControllerTop.call(this, s._element), o.setPositionControllerDiv.call(this, s._tdElement, o._shift); break; case "remove": const e = s._element.parentNode; this.util.removeItem(s._element), this.controllersOff(), e !== this.context.element.wysiwyg && this.util.removeItemAllParents(e, (function (e) { return 0 === e.childNodes.length }), null), this.focus() }this.history.push(!1) } }, formatBlock: { name: "formatBlock", display: "submenu", add: function (e, t) { const n = e.context; n.formatBlock = { targetText: t.querySelector(".txt"), targetTooltip: t.parentNode.querySelector(".se-tooltip-text"), _formatList: null, currentFormat: "" }; let i = this.setSubmenu(e); i.querySelector("ul").addEventListener("click", this.pickUp.bind(e)), n.formatBlock._formatList = i.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null }, setSubmenu: function (e) { const t = e.options, n = e.lang.toolbar, i = e.util.createElement("DIV"); i.className = "se-submenu se-list-layer se-list-format"; const l = ["p", "div", "blockquote", "pre", "h1", "h2", "h3", "h4", "h5", "h6"], o = t.formats && 0 !== t.formats.length ? t.formats : l; let s = '
      '; for (let e, t, i, a, r, c, d, u = 0, h = o.length; u < h; u++)e = o[u], "string" == typeof e && l.indexOf(e) > -1 ? (t = e.toLowerCase(), i = "blockquote" === t ? "range" : "pre" === t ? "free" : "replace", r = /^h/.test(t) ? t.match(/\d+/)[0] : "", a = n["tag_" + (r ? "h" : t)] + r, d = "", c = "") : (t = e.tag.toLowerCase(), i = e.command, a = e.name || t, d = e.class, c = d ? ' class="' + d + '"' : ""), s += '
    • "; return s += "
    ", i.innerHTML = s, i }, active: function (e) { let t = this.lang.toolbar.formats; const n = this.context.formatBlock.targetText; if (e) { if (this.util.isFormatElement(e)) { const i = this.context.formatBlock._formatList, l = e.nodeName.toLowerCase(), o = (e.className.match(/(\s|^)__se__format__[^\s]+/) || [""])[0].trim(); for (let e, n = 0, s = i.length; n < s; n++)if (e = i[n], l === e.getAttribute("data-value") && o === e.getAttribute("data-class")) { t = e.title; break } return this.util.changeTxt(n, t), n.setAttribute("data-value", l), n.setAttribute("data-class", o), !0 } } else this.util.changeTxt(n, t); return !1 }, on: function () { const e = this.context.formatBlock, t = e._formatList, n = e.targetText, i = (n.getAttribute("data-value") || "") + (n.getAttribute("data-class") || ""); if (i !== e.currentFormat) { for (let e, n = 0, l = t.length; n < l; n++)e = t[n], i === e.getAttribute("data-value") + e.getAttribute("data-class") ? this.util.addClass(e, "active") : this.util.removeClass(e, "active"); e.currentFormat = i } }, pickUp: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = null, i = null, l = null, o = ""; for (; !n && !/UL/i.test(t.tagName);) { if (n = t.getAttribute("data-command"), i = t.getAttribute("data-value"), o = t.getAttribute("data-class"), n) { l = t.firstChild; break } t = t.parentNode } if (n) { if ("range" === n) { const e = l.cloneNode(!1); this.applyRangeFormatElement(e) } else { let e = this.getRange(), t = this.getSelectedElementsAndComponents(!1); if (0 === t.length && (e = this.getRange_addLine(e, null), t = this.getSelectedElementsAndComponents(!1), 0 === t.length)) return; const s = e.startOffset, a = e.endOffset, r = this.util; let c = t[0], d = t[t.length - 1]; const u = r.getNodePath(e.startContainer, c, null, null), h = r.getNodePath(e.endContainer, d, null, null), p = this.detachList(t, !1); p.sc && (c = p.sc), p.ec && (d = p.ec), this.setRange(r.getNodeFromPath(u, c), s, r.getNodeFromPath(h, d), a); const g = this.getSelectedElementsAndComponents(!1); if ("free" === n) { const e = g.length - 1; let t = g[e].parentNode, n = l.cloneNode(!1); const i = n; for (let i, o, s, a, c, d, u = e, h = !0; u >= 0; u--)if (i = g[u], i !== (g[u + 1] ? g[u + 1].parentNode : null)) { if (d = r.isComponent(i), o = d ? "" : i.innerHTML.replace(/(?!>)\s+(?=<)|\n/g, " "), s = r.getParentElement(i, (function (e) { return e.parentNode === t })), (t !== i.parentNode || d) && (r.isFormatElement(t) ? (t.parentNode.insertBefore(n, t.nextSibling), t = t.parentNode) : (t.insertBefore(n, s ? s.nextSibling : null), t = i.parentNode), a = n.nextSibling, a && n.nodeName === a.nodeName && r.isSameAttributes(n, a) && (n.innerHTML += "
    " + a.innerHTML, r.removeItem(a)), n = l.cloneNode(!1), h = !0), c = n.innerHTML, n.innerHTML = (h || !o || !c || /
    $/i.test(o) ? o : o + "
    ") + c, 0 === u) { t.insertBefore(n, i), a = i.nextSibling, a && n.nodeName === a.nodeName && r.isSameAttributes(n, a) && (n.innerHTML += "
    " + a.innerHTML, r.removeItem(a)); const e = n.previousSibling; e && n.nodeName === e.nodeName && r.isSameAttributes(n, e) && (e.innerHTML += "
    " + n.innerHTML, r.removeItem(n)) } d || r.removeItem(i), o && (h = !1) } this.setRange(i, 0, i, 0) } else { for (let e, t, n = 0, s = g.length; n < s; n++)e = g[n], e.nodeName.toLowerCase() === i.toLowerCase() && (e.className.match(/(\s|^)__se__format__[^\s]+/) || [""])[0].trim() === o || r.isComponent(e) || (t = l.cloneNode(!1), r.copyFormatAttributes(t, e), t.innerHTML = e.innerHTML, e.parentNode.replaceChild(t, e)), 0 === n && (c = t || e), n === s - 1 && (d = t || e), t = null; this.setRange(r.getNodeFromPath(u, c), s, r.getNodeFromPath(h, d), a) } this.history.push(!1) } this.submenuOff() } } }, lineHeight: { name: "lineHeight", display: "submenu", add: function (e, t) { const n = e.context; n.lineHeight = { _sizeList: null, currentSize: -1 }; let i = this.setSubmenu(e), l = i.querySelector("ul"); l.addEventListener("click", this.pickup.bind(e)), n.lineHeight._sizeList = l.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null, l = null }, setSubmenu: function (e) { const t = e.options, n = e.lang, i = e.util.createElement("DIV"); i.className = "se-submenu se-list-layer"; const l = t.lineHeights ? t.lineHeights : [{ text: "1", value: 1 }, { text: "1.15", value: 1.15 }, { text: "1.5", value: 1.5 }, { text: "2", value: 2 }]; let o = '
    • "; for (let e, t = 0, n = l.length; t < n; t++)e = l[t], o += '
    • "; return o += "
    ", i.innerHTML = o, i }, on: function () { const e = this.context.lineHeight, t = e._sizeList, n = this.util.getFormatElement(this.getSelectionNode()), i = n ? n.style.lineHeight + "" : ""; if (i !== e.currentSize) { for (let e = 0, n = t.length; e < n; e++)i === t[e].getAttribute("data-value") ? this.util.addClass(t[e], "active") : this.util.removeClass(t[e], "active"); e.currentSize = i } }, pickup: function (e) { if (!/^BUTTON$/i.test(e.target.tagName)) return !1; e.preventDefault(), e.stopPropagation(); const t = e.target.getAttribute("data-value") || "", n = this.getSelectedElements(); for (let e = 0, i = n.length; e < i; e++)n[e].style.lineHeight = t; this.submenuOff(), this.history.push(!1) } }, template: s, paragraphStyle: { name: "paragraphStyle", display: "submenu", add: function (e, t) { const n = e.context; n.paragraphStyle = { _classList: null }; let i = this.setSubmenu(e); i.querySelector("ul").addEventListener("click", this.pickUp.bind(e)), n.paragraphStyle._classList = i.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null }, setSubmenu: function (e) { const t = e.options, n = e.util.createElement("DIV"); n.className = "se-submenu se-list-layer se-list-format"; const i = e.lang.menu, l = { spaced: { name: i.spaced, class: "__se__p-spaced", _class: "" }, bordered: { name: i.bordered, class: "__se__p-bordered", _class: "" }, neon: { name: i.neon, class: "__se__p-neon", _class: "" } }, o = t.paragraphStyles && 0 !== t.paragraphStyles.length ? t.paragraphStyles : ["spaced", "bordered", "neon"]; let s = '
      '; for (let e, t, n, i, a = 0, r = o.length; a < r; a++) { if (e = o[a], "string" == typeof e) { const t = l[e.toLowerCase()]; if (!t) continue; e = t } t = e.name, n = e.class ? ' class="' + e.class + '"' : "", i = e._class, s += '
    " } return s += "", n.innerHTML = s, n }, on: function () { const e = this.context.paragraphStyle._classList, t = this.util.getFormatElement(this.getSelectionNode()); for (let n = 0, i = e.length; n < i; n++)this.util.hasClass(t, e[n].getAttribute("data-value")) ? this.util.addClass(e[n], "active") : this.util.removeClass(e[n], "active") }, pickUp: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = null; for (; !/^UL$/i.test(t.tagName) && (n = t.getAttribute("data-value"), !n);)t = t.parentNode; if (!n) return; let i = this.getSelectedElements(); if (0 === i.length && (this.getRange_addLine(this.getRange(), null), i = this.getSelectedElements(), 0 === i.length)) return; const l = this.util.hasClass(t, "active") ? this.util.removeClass.bind(this.util) : this.util.addClass.bind(this.util); for (let e = 0, t = i.length; e < t; e++)l(i[e], n); this.submenuOff(), this.history.push(!1) } }, textStyle: { name: "textStyle", display: "submenu", add: function (e, t) { const n = e.context; n.textStyle = { _styleList: null }; let i = this.setSubmenu(e), l = i.querySelector("ul"); l.addEventListener("click", this.pickup.bind(e)), n.textStyle._styleList = i.querySelectorAll("li button"), e.initMenuTarget(this.name, t, i), i = null, l = null }, setSubmenu: function (e) { const t = e.options, n = e.util.createElement("DIV"); n.className = "se-submenu se-list-layer se-list-format"; const i = { code: { name: e.lang.menu.code, class: "__se__t-code", tag: "code" }, translucent: { name: e.lang.menu.translucent, style: "opacity: 0.5;", tag: "span" }, shadow: { name: e.lang.menu.shadow, class: "__se__t-shadow", tag: "span" } }, l = t.textStyles ? t.textStyles : e._w.Object.keys(i); let o = '
      '; for (let e, t, n, s, a, r, c, d = 0, u = l.length; d < u; d++) { if (e = l[d], s = "", r = "", a = [], "string" == typeof e) { const t = i[e.toLowerCase()]; if (!t) continue; e = t } n = e.name, t = e.tag || "span", c = e._class, e.style && (s += ' style="' + e.style + '"', r += e.style.replace(/:[^;]+(;|$)\s*/g, ","), a.push("style")), e.class && (s += ' class="' + e.class + '"', r += "." + e.class.trim().replace(/\s+/g, ",."), a.push("class")), r = r.replace(/,$/, ""), o += '
    • " } return o += "
    ", n.innerHTML = o, n }, on: function () { const e = this.util, t = this.context.textStyle._styleList, n = this.getSelectionNode(); for (let i, l, o, s = 0, a = t.length; s < a; s++) { i = t[s], l = i.getAttribute("data-value").split(","); for (let t, s, a = 0; a < l.length; a++) { for (t = n, o = !1; t && !e.isFormatElement(t) && !e.isComponent(t);) { if (t.nodeName.toLowerCase() === i.getAttribute("data-command").toLowerCase() && (s = l[a], /^\./.test(s) ? e.hasClass(t, s.replace(/^\./, "")) : t.style[s])) { o = !0; break } t = t.parentNode } if (!o) break } o ? e.addClass(i, "active") : e.removeClass(i, "active") } }, pickup: function (e) { e.preventDefault(), e.stopPropagation(); let t = e.target, n = null, i = null; for (; !n && !/UL/i.test(t.tagName);) { if (n = t.getAttribute("data-command"), n) { i = t.firstChild; break } t = t.parentNode } if (!n) return; const l = i.style.cssText.replace(/:.+(;|$)/g, ",").split(","); l.pop(); const o = i.classList; for (let e = 0, t = o.length; e < t; e++)l.push("." + o[e]); const s = this.util.hasClass(t, "active") ? null : i.cloneNode(!1), a = s ? null : [i.nodeName]; this.nodeChange(s, l, a, !0), this.submenuOff() } }, link: u, image: b, video: v, audio: y, math: C, imageGallery: { name: "imageGallery", add: function (e) { e.addModule([x.a]); e.context.imageGallery = { title: e.lang.toolbar.imageGallery, url: e.options.imageGalleryUrl, header: e.options.imageGalleryHeader, listClass: "se-image-list", itemTemplateHandler: this.drawItems, selectorHandler: this.setImage.bind(e), columnSize: 4 } }, open: function (e) { this.plugins.fileBrowser.open.call(this, "imageGallery", e) }, drawItems: function (e) { const t = e.src.split("/").pop(); return '
    ' + (e.alt || t) + '
    ' + (e.name || t) + "
    " }, setImage: function (e) { this.callPlugin("image", function () { const t = { name: e.parentNode.querySelector(".__se__img_name").textContent, size: 0 }; this.context.image._altText = e.alt, this.plugins.image.create_image.call(this, e.src, null, this.context.image._origin_w, this.context.image._origin_h, "none", t) }.bind(this), null) } } }, S = { rtl: { italic: '', indent: '', outdent: '', list_bullets: '', list_number: '', link: '', unlink: '' }, redo: '', undo: '', bold: '', underline: '', italic: '', strike: '', subscript: '', superscript: '', erase: '', indent: '', outdent: '', expansion: '', reduction: '', code_view: '', preview: '', print: '', template: '', line_height: '', paragraph_style: '', text_style: '', save: '', blockquote: '', arrow_down: '', align_justify: '', align_left: '', align_right: '', align_center: '', font_color: '', highlight_color: '', list_bullets: '', list_number: '', table: '', horizontal_rule: '', show_blocks: '', cancel: '', image: '', video: '', link: '', math: '', unlink: '', table_header: '', merge_cell: '', split_cell: '', caption: '', edit: '', delete: '', modify: '', revert: '', auto_size: '', insert_row_below: '', insert_row_above: '', insert_column_left: '', insert_column_right: '', delete_row: '', delete_column: '', fixed_column_width: '', rotate_left: '', rotate_right: '', mirror_horizontal: '', mirror_vertical: '', checked: '', line_break: '', audio: '', image_gallery: '', bookmark: '', download: '', more_text: '', more_paragraph: '', more_plus: '', more_horizontal: '', more_vertical: '', attachment: '', map: '', magic_stick: '', empty_file: '' }, N = n("P6u4"), T = n.n(N); const k = { _d: null, _w: null, isIE: null, isIE_Edge: null, isOSX_IOS: null, _propertiesInit: function () { this._d || (this._d = document, this._w = window, this.isIE = navigator.userAgent.indexOf("Trident") > -1, this.isIE_Edge = navigator.userAgent.indexOf("Trident") > -1 || navigator.appVersion.indexOf("Edge") > -1, this.isOSX_IOS = /(Mac|iPhone|iPod|iPad)/.test(navigator.platform)) }, _allowedEmptyNodeList: ".se-component, pre, blockquote, hr, li, table, img, iframe, video, audio, canvas", _HTMLConvertor: function (e) { const t = { "&": "&", " ": " ", "'": "'", '"': """, "<": "<", ">": ">" }; return e.replace(/&|\u00A0|'|"|<|>/g, (function (e) { return "string" == typeof t[e] ? t[e] : e })) }, zeroWidthSpace: String.fromCharCode(8203), zeroWidthRegExp: new RegExp(String.fromCharCode(8203), "g"), onlyZeroWidthRegExp: new RegExp("^" + String.fromCharCode(8203) + "+$"), onlyZeroWidthSpace: function (e) { return "string" != typeof e && (e = e.textContent), "" === e || this.onlyZeroWidthRegExp.test(e) }, getXMLHttpRequest: function () { if (!this._w.ActiveXObject) return this._w.XMLHttpRequest ? new XMLHttpRequest : null; try { return new ActiveXObject("Msxml2.XMLHTTP") } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP") } catch (e) { return null } } }, createElement: function (e) { return this._d.createElement(e) }, createTextNode: function (e) { return this._d.createTextNode(e || "") }, HTMLEncoder: function (e) { const t = { "<": "$lt;", ">": "$gt;" }; return e.replace(/<|>/g, (function (e) { return "string" == typeof t[e] ? t[e] : e })) }, HTMLDecoder: function (e) { const t = { "$lt;": "<", "$gt;": ">" }; return e.replace(/\$lt;|\$gt;/g, (function (e) { return "string" == typeof t[e] ? t[e] : e })) }, hasOwn: function (e, t) { return this._hasOwn.call(e, t) }, _hasOwn: Object.prototype.hasOwnProperty, getIncludePath: function (e, t) { let n = ""; const i = [], l = "js" === t ? "script" : "link", o = "js" === t ? "src" : "href"; let s = "(?:"; for (let t = 0, n = e.length; t < n; t++)s += e[t] + (t < n - 1 ? "|" : ")"); const a = new this._w.RegExp("(^|.*[\\/])" + s + "(\\.[^\\/]+)?." + t + "(?:\\?.*|;.*)?$", "i"), r = new this._w.RegExp(".+\\." + t + "(?:\\?.*|;.*)?$", "i"); for (let e = this._d.getElementsByTagName(l), t = 0; t < e.length; t++)r.test(e[t][o]) && i.push(e[t]); for (let e = 0; e < i.length; e++) { let t = i[e][o].match(a); if (t) { n = t[0]; break } } if ("" === n && (n = i.length > 0 ? i[0][o] : ""), -1 === n.indexOf(":/") && "//" !== n.slice(0, 2) && (n = 0 === n.indexOf("/") ? location.href.match(/^.*?:\/\/[^\/]*/)[0] + n : location.href.match(/^[^\?]*\/(?:)/)[0] + n), !n) throw "[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +" + name + ", extension: " + t + ")"; return n }, getPageStyle: function (e) { let t = ""; const n = (e || this._d).styleSheets; for (let e, i = 0, l = n.length; i < l; i++) { try { e = n[i].cssRules } catch (e) { continue } if (e) for (let n = 0, i = e.length; n < i; n++)t += e[n].cssText } return t }, getIframeDocument: function (e) { let t = e.contentWindow || e.contentDocument; return t.document && (t = t.document), t }, getAttributesToString: function (e, t) { if (!e.attributes) return ""; const n = e.attributes; let i = ""; for (let e = 0, l = n.length; e < l; e++)t && t.indexOf(n[e].name) > -1 || (i += n[e].name + '="' + n[e].value + '" '); return i }, getByteLength: function (e) { if (!e || !e.toString) return 0; e = e.toString(); const t = this._w.encodeURIComponent; let n, i; return this.isIE_Edge ? (i = this._w.unescape(t(e)).length, n = 0, null !== t(e).match(/(%0A|%0D)/gi) && (n = t(e).match(/(%0A|%0D)/gi).length), i + n) : (i = new this._w.TextEncoder("utf-8").encode(e).length, n = 0, null !== t(e).match(/(%0A|%0D)/gi) && (n = t(e).match(/(%0A|%0D)/gi).length), i + n) }, isWysiwygDiv: function (e) { return e && 1 === e.nodeType && (this.hasClass(e, "se-wrapper-wysiwyg") || /^BODY$/i.test(e.nodeName)) }, isNonEditable: function (e) { return e && 1 === e.nodeType && "false" === e.getAttribute("contenteditable") }, isTextStyleElement: function (e) { return e && 3 !== e.nodeType && /^(strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)$/i.test(e.nodeName) }, isFormatElement: function (e) { return e && 1 === e.nodeType && (/^(P|DIV|H[1-6]|PRE|LI|TH|TD)$/i.test(e.nodeName) || this.hasClass(e, "(\\s|^)__se__format__replace_.+(\\s|$)|(\\s|^)__se__format__free_.+(\\s|$)")) && !this.isComponent(e) && !this.isWysiwygDiv(e) }, isRangeFormatElement: function (e) { return e && 1 === e.nodeType && (/^(BLOCKQUOTE|OL|UL|FIGCAPTION|TABLE|THEAD|TBODY|TR|TH|TD)$/i.test(e.nodeName) || this.hasClass(e, "(\\s|^)__se__format__range_.+(\\s|$)")) }, isClosureRangeFormatElement: function (e) { return e && 1 === e.nodeType && (/^(TH|TD)$/i.test(e.nodeName) || this.hasClass(e, "(\\s|^)__se__format__range__closure_.+(\\s|$)")) }, isFreeFormatElement: function (e) { return e && 1 === e.nodeType && (/^PRE$/i.test(e.nodeName) || this.hasClass(e, "(\\s|^)__se__format__free_.+(\\s|$)")) && !this.isComponent(e) && !this.isWysiwygDiv(e) }, isClosureFreeFormatElement: function (e) { return e && 1 === e.nodeType && this.hasClass(e, "(\\s|^)__se__format__free__closure_.+(\\s|$)") }, isComponent: function (e) { return e && (/se-component/.test(e.className) || /^(TABLE|HR)$/.test(e.nodeName)) }, isUneditableComponent: function (e) { return e && this.hasClass(e, "__se__uneditable") }, isMediaComponent: function (e) { return e && /se-component/.test(e.className) }, isNotCheckingNode: function (e) { return e && /katex|__se__tag/.test(e.className) }, getFormatElement: function (e, t) { if (!e) return null; for (t || (t = function () { return !0 }); e;) { if (this.isWysiwygDiv(e)) return null; if (this.isRangeFormatElement(e) && e.firstElementChild, this.isFormatElement(e) && t(e)) return e; e = e.parentNode } return null }, getRangeFormatElement: function (e, t) { if (!e) return null; for (t || (t = function () { return !0 }); e;) { if (this.isWysiwygDiv(e)) return null; if (this.isRangeFormatElement(e) && !/^(THEAD|TBODY|TR)$/i.test(e.nodeName) && t(e)) return e; e = e.parentNode } return null }, getFreeFormatElement: function (e, t) { if (!e) return null; for (t || (t = function () { return !0 }); e;) { if (this.isWysiwygDiv(e)) return null; if (this.isFreeFormatElement(e) && t(e)) return e; e = e.parentNode } return null }, getClosureFreeFormatElement: function (e, t) { if (!e) return null; for (t || (t = function () { return !0 }); e;) { if (this.isWysiwygDiv(e)) return null; if (this.isClosureFreeFormatElement(e) && t(e)) return e; e = e.parentNode } return null }, copyTagAttributes: function (e, t) { t.style.cssText && (e.style.cssText += t.style.cssText); const n = t.classList; for (let t = 0, i = n.length; t < i; t++)this.addClass(e, n[t]); e.style.cssText || e.removeAttribute("style"), e.className.trim() || e.removeAttribute("class") }, copyFormatAttributes: function (e, t) { (t = t.cloneNode(!1)).className = t.className.replace(/(\s|^)__se__format__[^\s]+/g, ""), this.copyTagAttributes(e, t) }, getArrayItem: function (e, t, n) { if (!e || 0 === e.length) return null; t = t || function () { return !0 }; const i = []; for (let l, o = 0, s = e.length; o < s; o++)if (l = e[o], t(l)) { if (!n) return l; i.push(l) } return n ? i : null }, getArrayIndex: function (e, t) { let n = -1; for (let i = 0, l = e.length; i < l; i++)if (e[i] === t) { n = i; break } return n }, nextIdx: function (e, t) { let n = this.getArrayIndex(e, t); return -1 === n ? -1 : n + 1 }, prevIdx: function (e, t) { let n = this.getArrayIndex(e, t); return -1 === n ? -1 : n - 1 }, getPositionIndex: function (e) { let t = 0; for (; e = e.previousSibling;)t += 1; return t }, getNodePath: function (e, t, n) { const i = []; let l = !0; return this.getParentElement(e, function (e) { if (e === t && (l = !1), l && !this.isWysiwygDiv(e)) { if (n && 3 === e.nodeType) { let t = null, i = null; n.s = n.e = 0; let l = e.previousSibling; for (; l && 3 === l.nodeType;)i = l.textContent.replace(this.zeroWidthRegExp, ""), n.s += i.length, e.textContent = i + e.textContent, t = l, l = l.previousSibling, this.removeItem(t); let o = e.nextSibling; for (; o && 3 === o.nodeType;)i = o.textContent.replace(this.zeroWidthRegExp, ""), n.e += i.length, e.textContent += i, t = o, o = o.nextSibling, this.removeItem(t) } i.push(e) } return !1 }.bind(this)), i.map(this.getPositionIndex).reverse() }, getNodeFromPath: function (e, t) { let n, i = t; for (let t = 0, l = e.length; t < l && (n = i.childNodes, 0 !== n.length); t++)i = n.length <= e[t] ? n[n.length - 1] : n[e[t]]; return i }, isSameAttributes: function (e, t) { if (3 === e.nodeType && 3 === t.nodeType) return !0; if (3 === e.nodeType || 3 === t.nodeType) return !1; const n = e.style, i = t.style; let l = 0; for (let e = 0, t = n.length; e < t; e++)n[n[e]] === i[n[e]] && l++; const o = e.classList, s = t.classList, a = this._w.RegExp; let r = 0; for (let e = 0, t = o.length; e < t; e++)a("(s|^)" + o[e] + "(s|$)").test(s.value) && r++; return l === i.length && l === n.length && r === s.length && r === o.length }, isEmptyLine: function (e) { return !e || !e.parentNode || !e.querySelector("IMG, IFRAME, AUDIO, VIDEO, CANVAS, TABLE") && this.onlyZeroWidthSpace(e.textContent) }, isList: function (e) { return e && /^(OL|UL)$/i.test("string" == typeof e ? e : e.nodeName) }, isListCell: function (e) { return e && /^LI$/i.test("string" == typeof e ? e : e.nodeName) }, isTable: function (e) { return e && /^(TABLE|THEAD|TBODY|TR|TH|TD)$/i.test("string" == typeof e ? e : e.nodeName) }, isCell: function (e) { return e && /^(TD|TH)$/i.test("string" == typeof e ? e : e.nodeName) }, isBreak: function (e) { return e && /^BR$/i.test("string" == typeof e ? e : e.nodeName) }, isAnchor: function (e) { return e && /^A$/i.test("string" == typeof e ? e : e.nodeName) }, isMedia: function (e) { return e && /^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test("string" == typeof e ? e : e.nodeName) }, isNumber: function (e) { return !!e && /^-?\d+(\.\d+)?$/.test(e + "") }, getNumber: function (e, t) { if (!e) return 0; let n = (e + "").match(/-?\d+(\.\d+)?/); return n && n[0] ? (n = n[0], t < 0 ? 1 * n : 0 === t ? this._w.Math.round(1 * n) : 1 * (1 * n).toFixed(t)) : 0 }, getListChildren: function (e, t) { const n = []; return e && e.children && 0 !== e.children.length ? (t = t || function () { return !0 }, function i(l) { if (e !== l && t(l) && n.push(l), l.children) for (let e = 0, t = l.children.length; e < t; e++)i(l.children[e]) }(e), n) : n }, getListChildNodes: function (e, t) { const n = []; return e && 0 !== e.childNodes.length ? (t = t || function () { return !0 }, function i(l) { e !== l && t(l) && n.push(l); for (let e = 0, t = l.childNodes.length; e < t; e++)i(l.childNodes[e]) }(e), n) : n }, getElementDepth: function (e) { if (!e || this.isWysiwygDiv(e)) return -1; let t = 0; for (e = e.parentNode; e && !this.isWysiwygDiv(e);)t += 1, e = e.parentNode; return t }, compareElements: function (e, t) { let n = e, i = t; for (; n && i && n.parentNode !== i.parentNode;)n = n.parentNode, i = i.parentNode; if (!n || !i) return { ancestor: null, a: e, b: t, result: 0 }; const l = n.parentNode.childNodes, o = this.getArrayIndex(l, n), s = this.getArrayIndex(l, i); return { ancestor: n.parentNode, a: n, b: i, result: o > s ? 1 : o < s ? -1 : 0 } }, getParentElement: function (e, t) { let n; if ("function" == typeof t) n = t; else { let e; /^\./.test(t) ? (e = "className", t = t.split(".")[1]) : /^#/.test(t) ? (e = "id", t = "^" + t.split("#")[1] + "$") : /^:/.test(t) ? (e = "name", t = "^" + t.split(":")[1] + "$") : (e = "nodeName", t = "^" + t + "$"); const i = new this._w.RegExp(t, "i"); n = function (t) { return i.test(t[e]) } } for (; e && !n(e);) { if (this.isWysiwygDiv(e)) return null; e = e.parentNode } return e }, getChildElement: function (e, t, n) { let i; if ("function" == typeof t) i = t; else { let e; /^\./.test(t) ? (e = "className", t = t.split(".")[1]) : /^#/.test(t) ? (e = "id", t = "^" + t.split("#")[1] + "$") : /^:/.test(t) ? (e = "name", t = "^" + t.split(":")[1] + "$") : (e = "nodeName", t = "^" + ("text" === t ? "#" + t : t) + "$"); const n = new this._w.RegExp(t, "i"); i = function (t) { return n.test(t[e]) } } const l = this.getListChildNodes(e, (function (e) { return i(e) })); return l[n ? l.length - 1 : 0] }, getEdgeChildNodes: function (e, t) { if (e) { for (t || (t = e); e && 1 === e.nodeType && e.childNodes.length > 0 && !this.isBreak(e);)e = e.firstChild; for (; t && 1 === t.nodeType && t.childNodes.length > 0 && !this.isBreak(t);)t = t.lastChild; return { sc: e, ec: t || e } } }, getOffset: function (e, t) { let n = 0, i = 0, l = 3 === e.nodeType ? e.parentElement : e; const o = this.getParentElement(e, this.isWysiwygDiv.bind(this)); for (; l && !this.hasClass(l, "se-container") && l !== o;)n += l.offsetLeft, i += l.offsetTop, l = l.offsetParent; const s = t && /iframe/i.test(t.nodeName); return { left: n + (s ? t.parentElement.offsetLeft : 0), top: i - (o ? o.scrollTop : 0) + (s ? t.parentElement.offsetTop : 0) } }, getOverlapRangeAtIndex: function (e, t, n, i) { if (e <= i ? t < n : t > n) return 0; const l = (e > n ? e : n) - (t < i ? t : i); return (l < 0 ? -1 * l : l) + 1 }, changeTxt: function (e, t) { e && t && (e.textContent = t) }, changeElement: function (e, t) { if ("string" == typeof t) if (e.outerHTML) e.outerHTML = t; else { const n = this.createElement("DIV"); n.innerHTML = t, t = n.firstChild, e.parentNode.replaceChild(t, e) } else 1 === t.nodeType && e.parentNode.replaceChild(t, e) }, setStyle: function (e, t, n) { e.style[t] = n, n || e.style.cssText || e.removeAttribute("style") }, hasClass: function (e, t) { if (e) return new this._w.RegExp(t).test(e.className) }, addClass: function (e, t) { if (!e) return; new this._w.RegExp("(\\s|^)" + t + "(\\s|$)").test(e.className) || (e.className += (e.className.length > 0 ? " " : "") + t) }, removeClass: function (e, t) { if (!e) return; const n = new this._w.RegExp("(\\s|^)" + t + "(\\s|$)"); e.className = e.className.replace(n, " ").trim(), e.className.trim() || e.removeAttribute("class") }, toggleClass: function (e, t) { if (!e) return; let n = !1; const i = new this._w.RegExp("(\\s|^)" + t + "(\\s|$)"); return i.test(e.className) ? e.className = e.className.replace(i, " ").trim() : (e.className += " " + t, n = !0), e.className.trim() || e.removeAttribute("class"), n }, setDisabledButtons: function (e, t) { for (let n = 0, i = t.length; n < i; n++)t[n].disabled = e }, removeItem: function (e) { e && ("function" == typeof e.remove ? e.remove() : e.parentNode && e.parentNode.removeChild(e)) }, removeItemAllParents: function (e, t, n) { if (!e) return null; let i = null; return t || (t = function (e) { if (e === n || this.isComponent(e)) return !1; const t = e.textContent.trim(); return 0 === t.length || /^(\n|\u200B)+$/.test(t) }.bind(this)), function e(n) { if (!k.isWysiwygDiv(n)) { const l = n.parentNode; l && t(n) && (i = { sc: n.previousElementSibling, ec: n.nextElementSibling }, k.removeItem(n), e(l)) } }(e), i }, detachNestedList: function (e, t) { const n = this._deleteNestedList(e); let i, l, o; if (n) { i = n.cloneNode(!1), l = n.childNodes; const t = this.getPositionIndex(e); for (; l[t];)i.appendChild(l[t]) } else i = e; if (t) o = this.getListChildren(i, function (e) { return this.isListCell(e) && !e.previousElementSibling }.bind(this)); else { const t = this.getElementDepth(e) + 2; o = this.getListChildren(e, function (e) { return this.isListCell(e) && !e.previousElementSibling && this.getElementDepth(e) === t }.bind(this)) } for (let e = 0, t = o.length; e < t; e++)this._deleteNestedList(o[e]); return n && (n.parentNode.insertBefore(i, n.nextSibling), l && 0 === l.length && this.removeItem(n)), i === e ? i.parentNode : i }, _deleteNestedList: function (e) { const t = e.parentNode; let n, i, l, o, s, a = t, r = a.parentNode; for (; this.isListCell(r);) { for (o = this.getPositionIndex(e), n = r.nextElementSibling, i = r.parentNode, l = a; l;) { if (a = a.nextSibling, this.isList(l)) { for (s = l.childNodes; s[o];)i.insertBefore(s[o], n); 0 === s.length && this.removeItem(l) } else i.appendChild(l); l = a } a = i, r = i.parentNode } return 0 === t.children.length && this.removeItem(t), i }, splitElement: function (e, t, n) { const i = e.parentNode; let l, o, s, a = 0, r = !0; if ((!n || n < 0) && (n = 0), 3 === e.nodeType) { if (a = this.getPositionIndex(e), t >= 0) { e.splitText(t); const n = this.getNodeFromPath([a + 1], i); this.onlyZeroWidthSpace(n) && (n.data = this.zeroWidthSpace) } } else 1 === e.nodeType && (e.previousSibling ? e = e.previousSibling : this.getElementDepth(e) === n && (r = !1)); let c = e; for (; this.getElementDepth(c) > n;)for (a = this.getPositionIndex(c) + 1, c = c.parentNode, s = l, l = c.cloneNode(!1), o = c.childNodes, s && (this.isListCell(l) && this.isList(s) && s.firstElementChild ? (l.innerHTML = s.firstElementChild.innerHTML, k.removeItem(s.firstElementChild), s.children.length > 0 && l.appendChild(s)) : l.appendChild(s)); o[a];)l.appendChild(o[a]); c.childNodes.length <= 1 && (!c.firstChild || 0 === c.firstChild.textContent.length) && (c.innerHTML = "
    "); const d = c.parentNode; return r && (c = c.nextSibling), l ? (this.mergeSameTags(l, null, !1), this.mergeNestedTags(l, function (e) { return this.isList(e) }.bind(this)), l.childNodes.length > 0 ? d.insertBefore(l, c) : l = c, 0 === i.childNodes.length && this.removeItem(i), l) : c }, mergeSameTags: function (e, t, n) { const i = this, l = t ? t.length : 0; let o = null; return l && (o = this._w.Array.apply(null, new this._w.Array(l)).map(this._w.Number.prototype.valueOf, 0)), function e(s, a, r) { const c = s.childNodes; for (let d, u, h = 0, p = c.length; h < p && (d = c[h], u = c[h + 1], d); h++)if (n && i._isIgnoreNodeChange(d) || !n && (i.isTable(d) || i.isListCell(d) || i.isFormatElement(d) && !i.isFreeFormatElement(d))) (i.isTable(d) || i.isListCell(d)) && e(d, a + 1, h); else { if (1 === p && s.nodeName === d.nodeName && s.parentNode) { if (l) { let e, n, o, r, c; for (let u = 0; u < l; u++)if (e = t[u], e && e[a] === h) { for (n = d, o = s, r = a, c = !0; r >= 0;) { if (i.getArrayIndex(o.childNodes, n) !== e[r]) { c = !1; break } n = d.parentNode, o = n.parentNode, r-- } c && (e.splice(a, 1), e[a] = h) } } i.copyTagAttributes(d, s), s.parentNode.insertBefore(d, s), i.removeItem(s) } if (!u) { 1 === d.nodeType && e(d, a + 1, h); break } if (d.nodeName === u.nodeName && i.isSameAttributes(d, u) && d.href === u.href) { const e = d.childNodes; let n = 0; for (let t = 0, i = e.length; t < i; t++)e[t].textContent.length > 0 && n++; const s = d.lastChild, c = u.firstChild; let p = 0; if (s && c) { const e = 3 === s.nodeType && 3 === c.nodeType; p = s.textContent.length; let i = s.previousSibling; for (; i && 3 === i.nodeType;)p += i.textContent.length, i = i.previousSibling; if (n > 0 && 3 === s.nodeType && 3 === c.nodeType && (s.textContent.length > 0 || c.textContent.length > 0) && n--, l) { let i = null; for (let d = 0; d < l; d++)if (i = t[d], i && i[a] > h) { if (a > 0 && i[a - 1] !== r) continue; i[a] -= 1, i[a + 1] >= 0 && i[a] === h && (i[a + 1] += n, e && s && 3 === s.nodeType && c && 3 === c.nodeType && (o[d] += p)) } } } if (3 === d.nodeType) { if (p = d.textContent.length, d.textContent += u.textContent, l) { let e = null; for (let i = 0; i < l; i++)if (e = t[i], e && e[a] > h) { if (a > 0 && e[a - 1] !== r) continue; e[a] -= 1, e[a + 1] >= 0 && e[a] === h && (e[a + 1] += n, o[i] += p) } } } else d.innerHTML += u.innerHTML; i.removeItem(u), h-- } else 1 === d.nodeType && e(d, a + 1, h) } }(e, 0, 0), o }, mergeNestedTags: function (e, t) { "string" == typeof t ? t = function (e) { return this.test(e.tagName) }.bind(new this._w.RegExp("^(" + (t || ".+") + ")$", "i")) : "function" != typeof t && (t = function () { return !0 }), function e(n) { let i = n.children; if (1 === i.length && i[0].nodeName === n.nodeName && t(n)) { const e = i[0]; for (i = e.children; i[0];)n.appendChild(i[0]); n.removeChild(e) } for (let t = 0, i = n.children.length; t < i; t++)e(n.children[t]) }(e) }, removeEmptyNode: function (e, t) { const n = this; t && (t = n.getParentElement(t, (function (t) { return e === t.parentElement }))), function i(l) { if (n._notTextNode(l) || l === t || n.isNonEditable(l)) return 0; if (l === e || !n.onlyZeroWidthSpace(l.textContent) || l.firstChild && n.isBreak(l.firstChild) || l.querySelector(n._allowedEmptyNodeList)) { const e = l.children; for (let t = 0, l = e.length, o = 0; t < l; t++)e[t + o] && !n.isComponent(e[t + o]) && (o += i(e[t + o])) } else if (l.parentNode) return l.parentNode.removeChild(l), -1; return 0 }(e), 0 === e.childNodes.length && (e.innerHTML = "
    ") }, htmlRemoveWhiteSpace: function (e) { return e ? e.trim().replace(/<\/?(?!strong|span|font|b|var|i|em|u|ins|s|strike|del|sub|sup|mark|a|label|code)[^>^<]+>\s+(?=<)/gi, (function (e) { return e.trim() })) : "" }, sortByDepth: function (e, t) { const n = t ? 1 : -1, i = -1 * n; e.sort(function (e, t) { return this.isListCell(e) && this.isListCell(t) ? (e = this.getElementDepth(e)) > (t = this.getElementDepth(t)) ? n : e < t ? i : 0 : 0 }.bind(this)) }, _isIgnoreNodeChange: function (e) { return e && 3 !== e.nodeType && (this.isNonEditable(e) || !this.isTextStyleElement(e)) }, _isMaintainedNode: function (e) { return e && 3 !== e.nodeType && /^(a|label|code)$/i.test("string" == typeof e ? e : e.nodeName) }, _isSizeNode: function (e) { return e && 3 !== e.nodeType && this.isTextStyleElement(e) && !!e.style.fontSize }, _notTextNode: function (e) { return e && 3 !== e.nodeType && (this.isComponent(e) || /^(br|input|select|canvas|img|iframe|audio|video)$/i.test("string" == typeof e ? e : e.nodeName)) }, _disallowedTags: function (e) { return /^(meta|script|link|style|[a-z]+\:[a-z]+)$/i.test(e.nodeName) }, createTagsWhitelist: function (e) { return new RegExp("<\\/?\\b(?!\\b" + e.replace(/\|/g, "\\b|\\b") + "\\b)[^>]*>", "gi") }, _consistencyCheckOfHTML: function (e, t) { const n = [], i = [], l = [], o = [], s = this.getListChildNodes(e, function (s) { if (1 !== s.nodeType) return !1; if (!t.test(s.nodeName) && 0 === s.childNodes.length && this.isNotCheckingNode(s)) return n.push(s), !1; const a = !this.getParentElement(s, this.isNotCheckingNode); if (!this.isTable(s) && !this.isListCell(s) && (this.isFormatElement(s) || this.isRangeFormatElement(s) || this.isTextStyleElement(s)) && 0 === s.childNodes.length && a) return i.push(s), !1; if (this.isList(s.parentNode) && !this.isList(s) && !this.isListCell(s)) return l.push(s), !1; if (this.isCell(s)) { const e = s.firstElementChild; if (!this.isFormatElement(e) && !this.isRangeFormatElement(e) && !this.isComponent(e)) return o.push(s), !1 } return s.parentNode !== e && (this.isFormatElement(s) || this.isComponent(s) || this.isList(s)) && !this.isRangeFormatElement(s.parentNode) && !this.isListCell(s.parentNode) && !this.getParentElement(s, this.isComponent) && a }.bind(this)); for (let e = 0, t = n.length; e < t; e++)this.removeItem(n[e]); const a = []; for (let e, t, n = 0, i = s.length; n < i; n++)e = s[n], t = e.parentNode, t && t.parentNode && (t.parentNode.insertBefore(e, t), a.push(t)); for (let e, t = 0, n = a.length; t < n; t++)e = a[t], this.onlyZeroWidthSpace(e.textContent.trim()) && this.removeItem(e); for (let e = 0, t = i.length; e < t; e++)this.removeItem(i[e]); for (let e, t, n, i, o = 0, s = l.length; o < s; o++) { for (e = l[o], t = this.createElement("LI"), n = e.childNodes; n[0];)t.appendChild(n[0]); i = e.parentNode, i && (i.insertBefore(t, e), this.removeItem(e)) } for (let e, t, n = 0, i = o.length; n < i; n++)e = o[n], t = this.createElement("DIV"), t.innerHTML = 0 === e.textContent.trim().length && 0 === e.children.length ? "
    " : e.innerHTML, e.innerHTML = t.outerHTML }, _setDefaultOptionStyle: function (e, t) { let n = ""; e.height && (n += "height:" + e.height + ";"), e.minHeight && (n += "min-height:" + e.minHeight + ";"), e.maxHeight && (n += "max-height:" + e.maxHeight + ";"), e.position && (n += "position:" + e.position + ";"), e.width && (n += "width:" + e.width + ";"), e.minWidth && (n += "min-width:" + e.minWidth + ";"), e.maxWidth && (n += "max-width:" + e.maxWidth + ";"); let i = "", l = "", o = ""; const s = (t = n + t).split(";"); for (let t, n = 0, a = s.length; n < a; n++)t = s[n].trim(), t && (/^(min-|max-)?width\s*:/.test(t) || /^(z-index|position)\s*:/.test(t) ? i += t + ";" : /^(min-|max-)?height\s*:/.test(t) ? (/^height/.test(t) && "auto" === t.split(":")[1].trim() && (e.height = "auto"), l += t + ";") : o += t + ";"); return { top: i, frame: l, editor: o } }, _setIframeDocument: function (e, t) { e.setAttribute("scrolling", "auto"), e.contentDocument.head.innerHTML = '' + this._setIframeCssTags(t), e.contentDocument.body.className = t._editableClass, e.contentDocument.body.setAttribute("contenteditable", !0) }, _setIframeCssTags: function (e) { const t = e.iframeCSSFileName, n = this._w.RegExp; let i = ""; for (let e, l = 0, o = t.length; l < o; l++) { if (e = [], /(^https?:\/\/)|(^data:text\/css,)/.test(t[l])) e.push(t[l]); else { const i = new n("(^|.*[\\/])" + t[l] + "(\\..+)?\\.css(?:\\?.*|;.*)?$", "i"); for (let t, n = document.getElementsByTagName("link"), l = 0, o = n.length; l < o; l++)t = n[l].href.match(i), t && e.push(t[0]) } if (!e || 0 === e.length) throw '[SUNEDITOR.constructor.iframe.fail] The suneditor CSS files installation path could not be automatically detected. Please set the option property "iframeCSSFileName" before creating editor instances.'; for (let t = 0, n = e.length; t < n; t++)i += '' } return i + ("auto" === e.height ? "" : "") } }; var L = k, B = { init: function (e, t) { "object" != typeof t && (t = {}); const n = document; this._initOptions(e, t); const i = n.createElement("DIV"); i.className = "sun-editor" + (t.rtl ? " se-rtl" : ""), e.id && (i.id = "suneditor_" + e.id); const l = n.createElement("DIV"); l.className = "se-container"; const o = this._createToolBar(n, t.buttonList, t.plugins, t); o.element.style.visibility = "hidden", o.pluginCallButtons.math && this._checkKatexMath(t.katex); const s = n.createElement("DIV"); s.className = "se-arrow"; const a = n.createElement("DIV"); a.className = "se-toolbar-sticky-dummy"; const r = n.createElement("DIV"); r.className = "se-wrapper"; const c = this._initElements(t, i, o.element, s), d = c.bottomBar, u = c.wysiwygFrame, h = c.placeholder; let p = c.codeView; const g = d.resizingBar, m = d.navigation, f = d.charWrapper, _ = d.charCounter, b = n.createElement("DIV"); b.className = "se-loading-box sun-editor-common", b.innerHTML = '
    '; const v = n.createElement("DIV"); v.className = "se-line-breaker", v.innerHTML = '"; const y = n.createElement("DIV"); y.className += "se-line-breaker-component"; const C = y.cloneNode(!0); y.innerHTML = C.innerHTML = t.icons.line_break; const w = n.createElement("DIV"); w.className = "se-resizing-back"; const x = t.toolbarContainer; return x && x.appendChild(o.element), r.appendChild(p), h && r.appendChild(h), x || l.appendChild(o.element), l.appendChild(a), l.appendChild(r), l.appendChild(w), l.appendChild(b), l.appendChild(v), l.appendChild(y), l.appendChild(C), g && l.appendChild(g), i.appendChild(l), p = this._checkCodeMirror(t, p), { constructed: { _top: i, _relative: l, _toolBar: o.element, _menuTray: o._menuTray, _editorArea: r, _wysiwygArea: u, _codeArea: p, _placeholder: h, _resizingBar: g, _navigation: m, _charWrapper: f, _charCounter: _, _loading: b, _lineBreaker: v, _lineBreaker_t: y, _lineBreaker_b: C, _resizeBack: w, _stickyDummy: a, _arrow: s }, options: t, plugins: o.plugins, pluginCallButtons: o.pluginCallButtons, _responsiveButtons: o.responsiveButtons } }, _checkCodeMirror: function (e, t) { if (e.codeMirror) { const n = [{ mode: "htmlmixed", htmlMode: !0, lineNumbers: !0, lineWrapping: !0 }, e.codeMirror.options || {}].reduce((function (e, t) { for (let n in t) L.hasOwn(t, n) && (e[n] = t[n]); return e }), {}); "auto" === e.height && (n.viewportMargin = 1 / 0, n.height = "auto"); const i = e.codeMirror.src.fromTextArea(t, n); i.display.wrapper.style.cssText = t.style.cssText, e.codeMirrorEditor = i, (t = i.display.wrapper).className += " se-wrapper-code-mirror" } return t }, _checkKatexMath: function (e) { if (!e) throw Error('[SUNEDITOR.create.fail] To use the math button you need to add a "katex" object to the options.'); const t = [{ throwOnError: !1 }, e.options || {}].reduce((function (e, t) { for (let n in t) L.hasOwn(t, n) && (e[n] = t[n]); return e }), {}); e.options = t }, _setOptions: function (e, t, n) { this._initOptions(t.element.originElement, e); const i = t.element, l = i.relative, o = i.editorArea, s = e.toolbarContainer && e.toolbarContainer !== n.toolbarContainer, a = e.lang !== n.lang || e.buttonList !== n.buttonList || e.mode !== n.mode || s, r = this._createToolBar(document, a ? e.buttonList : n.buttonList, e.plugins, e); r.pluginCallButtons.math && this._checkKatexMath(e.katex); const c = document.createElement("DIV"); c.className = "se-arrow", a && (r.element.style.visibility = "hidden", s ? (e.toolbarContainer.appendChild(r.element), i.toolbar.parentElement.removeChild(i.toolbar)) : i.toolbar.parentElement.replaceChild(r.element, i.toolbar), i.toolbar = r.element, i._menuTray = r._menuTray, i._arrow = c); const d = this._initElements(e, i.topArea, a ? r.element : i.toolbar, c), u = d.bottomBar, h = d.wysiwygFrame, p = d.placeholder; let g = d.codeView; return i.resizingBar && l.removeChild(i.resizingBar), u.resizingBar && l.appendChild(u.resizingBar), o.innerHTML = "", o.appendChild(g), p && o.appendChild(p), g = this._checkCodeMirror(e, g), i.resizingBar = u.resizingBar, i.navigation = u.navigation, i.charWrapper = u.charWrapper, i.charCounter = u.charCounter, i.wysiwygFrame = h, i.code = g, i.placeholder = p, e.rtl ? L.addClass(i.topArea, "se-rtl") : L.removeClass(i.topArea, "se-rtl"), { callButtons: r.pluginCallButtons, plugins: r.plugins, toolbar: r } }, _initElements: function (e, t, n, i) { t.style.cssText = e._editorStyles.top, /inline/i.test(e.mode) ? (n.className += " se-toolbar-inline", n.style.width = e.toolbarWidth) : /balloon/i.test(e.mode) && (n.className += " se-toolbar-balloon", n.style.width = e.toolbarWidth, n.appendChild(i)); const l = document.createElement(e.iframe ? "IFRAME" : "DIV"); l.className = "se-wrapper-inner se-wrapper-wysiwyg", e.iframe ? (l.allowFullscreen = !0, l.frameBorder = 0, l.style.cssText = e._editorStyles.frame) : (l.setAttribute("contenteditable", !0), l.setAttribute("scrolling", "auto"), l.className += " " + e._editableClass, l.style.cssText = e._editorStyles.frame + e._editorStyles.editor); const o = document.createElement("TEXTAREA"); o.className = "se-wrapper-inner se-wrapper-code", o.style.cssText = e._editorStyles.frame, o.style.display = "none", "auto" === e.height && (o.style.overflow = "hidden"); let s = null, a = null, r = null, c = null; if (e.resizingBar && (s = document.createElement("DIV"), s.className = "se-resizing-bar sun-editor-common", a = document.createElement("DIV"), a.className = "se-navigation sun-editor-common", s.appendChild(a), e.charCounter)) { if (r = document.createElement("DIV"), r.className = "se-char-counter-wrapper", e.charCounterLabel) { const t = document.createElement("SPAN"); t.className = "se-char-label", t.textContent = e.charCounterLabel, r.appendChild(t) } if (c = document.createElement("SPAN"), c.className = "se-char-counter", c.textContent = "0", r.appendChild(c), e.maxCharCount > 0) { const t = document.createElement("SPAN"); t.textContent = " / " + e.maxCharCount, r.appendChild(t) } s.appendChild(r) } let d = null; return e.placeholder && (d = document.createElement("SPAN"), d.className = "se-placeholder", d.innerText = e.placeholder), { bottomBar: { resizingBar: s, navigation: a, charWrapper: r, charCounter: c }, wysiwygFrame: l, codeView: o, placeholder: d } }, _initOptions: function (e, t) { t.lang = t.lang || T.a, t.defaultTag = "string" == typeof t.defaultTag ? t.defaultTag : "p"; const n = t.textTags = [{ bold: "STRONG", underline: "U", italic: "EM", strike: "DEL", sub: "SUB", sup: "SUP" }, t.textTags || {}].reduce((function (e, t) { for (let n in t) e[n] = t[n]; return e }), {}); t._textTagsMap = { strong: n.bold, b: n.bold, u: n.underline, ins: n.underline, em: n.italic, i: n.italic, del: n.strike, strike: n.strike, s: n.strike, sub: n.sub, sup: n.sup }, t.value = "string" == typeof t.value ? t.value : null, t.historyStackDelayTime = "number" == typeof t.historyStackDelayTime ? t.historyStackDelayTime : 400; t._defaultTagsWhitelist = "string" == typeof t._defaultTagsWhitelist ? t._defaultTagsWhitelist : "br|p|div|pre|blockquote|h1|h2|h3|h4|h5|h6|ol|ul|li|hr|figure|figcaption|img|iframe|audio|video|source|table|thead|tbody|tr|th|td|a|b|strong|var|i|em|u|ins|s|span|strike|del|sub|sup|code|svg|path", t._editorTagsWhitelist = this._setWhitelist(t._defaultTagsWhitelist + ("string" == typeof t.addTagsWhitelist && t.addTagsWhitelist.length > 0 ? "|" + t.addTagsWhitelist : ""), t.tagsBlacklist), t.pasteTagsWhitelist = this._setWhitelist("string" == typeof t.pasteTagsWhitelist ? t.pasteTagsWhitelist : t._editorTagsWhitelist, t.pasteTagsBlacklist), t.attributesWhitelist = t.attributesWhitelist && "object" == typeof t.attributesWhitelist ? t.attributesWhitelist : null, t.mode = t.mode || "classic", t.rtl = !!t.rtl, t._editableClass = "sun-editor-editable" + (t.rtl ? " se-rtl" : ""), t._printClass = "string" == typeof t._printClass ? t._printClass : null, t.toolbarWidth = t.toolbarWidth ? L.isNumber(t.toolbarWidth) ? t.toolbarWidth + "px" : t.toolbarWidth : "auto", t.toolbarContainer = "string" == typeof t.toolbarContainer ? document.querySelector(t.toolbarContainer) : t.toolbarContainer, t.stickyToolbar = /balloon/i.test(t.mode) || t.toolbarContainer ? -1 : void 0 === t.stickyToolbar ? 0 : /^\d+/.test(t.stickyToolbar) ? L.getNumber(t.stickyToolbar, 0) : -1, t.fullScreenOffset = void 0 === t.fullScreenOffset ? 0 : /^\d+/.test(t.fullScreenOffset) ? L.getNumber(t.fullScreenOffset, 0) : 0, t.iframe = t.fullPage || t.iframe, t.fullPage = !!t.fullPage, t.iframeCSSFileName = t.iframe ? "string" == typeof t.iframeCSSFileName ? [t.iframeCSSFileName] : t.iframeCSSFileName || ["suneditor"] : null, t.previewTemplate = "string" == typeof t.previewTemplate ? t.previewTemplate : null, t.printTemplate = "string" == typeof t.printTemplate ? t.printTemplate : null, t.codeMirror = t.codeMirror ? t.codeMirror.src ? t.codeMirror : { src: t.codeMirror } : null, t.katex = t.katex ? t.katex.src ? t.katex : { src: t.katex } : null, t.mathFontSize = t.mathFontSize ? t.mathFontSize : [{ text: "1", value: "1em" }, { text: "1.5", value: "1.5em" }, { text: "2", value: "2em" }, { text: "2.5", value: "2.5em" }], t.position = "string" == typeof t.position ? t.position : null, t.display = t.display || ("none" !== e.style.display && e.style.display ? e.style.display : "block"), t.popupDisplay = t.popupDisplay || "full", t.resizingBar = void 0 === t.resizingBar ? !/inline|balloon/i.test(t.mode) : t.resizingBar, t.showPathLabel = !!t.resizingBar && ("boolean" != typeof t.showPathLabel || t.showPathLabel), t.charCounter = t.maxCharCount > 0 || "boolean" == typeof t.charCounter && t.charCounter, t.charCounterType = "string" == typeof t.charCounterType ? t.charCounterType : "char", t.charCounterLabel = "string" == typeof t.charCounterLabel ? t.charCounterLabel.trim() : null, t.maxCharCount = L.isNumber(t.maxCharCount) && t.maxCharCount > -1 ? 1 * t.maxCharCount : null, t.width = t.width ? L.isNumber(t.width) ? t.width + "px" : t.width : e.clientWidth ? e.clientWidth + "px" : "100%", t.minWidth = (L.isNumber(t.minWidth) ? t.minWidth + "px" : t.minWidth) || "", t.maxWidth = (L.isNumber(t.maxWidth) ? t.maxWidth + "px" : t.maxWidth) || "", t.height = t.height ? L.isNumber(t.height) ? t.height + "px" : t.height : e.clientHeight ? e.clientHeight + "px" : "auto", t.minHeight = (L.isNumber(t.minHeight) ? t.minHeight + "px" : t.minHeight) || "", t.maxHeight = (L.isNumber(t.maxHeight) ? t.maxHeight + "px" : t.maxHeight) || "", t.defaultStyle = "string" == typeof t.defaultStyle ? t.defaultStyle : "", t.font = t.font ? t.font : null, t.fontSize = t.fontSize ? t.fontSize : null, t.formats = t.formats ? t.formats : null, t.colorList = t.colorList ? t.colorList : null, t.lineHeights = t.lineHeights ? t.lineHeights : null, t.paragraphStyles = t.paragraphStyles ? t.paragraphStyles : null, t.textStyles = t.textStyles ? t.textStyles : null, t.fontSizeUnit = "string" == typeof t.fontSizeUnit && t.fontSizeUnit.trim() || "px", t.imageResizing = void 0 === t.imageResizing || t.imageResizing, t.imageHeightShow = void 0 === t.imageHeightShow || !!t.imageHeightShow, t.imageWidth = t.imageWidth ? L.isNumber(t.imageWidth) ? t.imageWidth + "px" : t.imageWidth : "auto", t.imageHeight = t.imageHeight ? L.isNumber(t.imageHeight) ? t.imageHeight + "px" : t.imageHeight : "auto", t.imageSizeOnlyPercentage = !!t.imageSizeOnlyPercentage, t._imageSizeUnit = t.imageSizeOnlyPercentage ? "%" : "px", t.imageRotation = void 0 !== t.imageRotation ? t.imageRotation : !(t.imageSizeOnlyPercentage || !t.imageHeightShow), t.imageFileInput = void 0 === t.imageFileInput || t.imageFileInput, t.imageUrlInput = void 0 === t.imageUrlInput || !t.imageFileInput || t.imageUrlInput, t.imageUploadHeader = t.imageUploadHeader || null, t.imageUploadUrl = "string" == typeof t.imageUploadUrl ? t.imageUploadUrl : null, t.imageUploadSizeLimit = /\d+/.test(t.imageUploadSizeLimit) ? L.getNumber(t.imageUploadSizeLimit, 0) : null, t.imageMultipleFile = !!t.imageMultipleFile, t.imageAccept = "string" != typeof t.imageAccept || "*" === t.imageAccept.trim() ? "image/*" : t.imageAccept.trim() || "image/*", t.imageGalleryUrl = "string" == typeof t.imageGalleryUrl ? t.imageGalleryUrl : null, t.imageGalleryHeader = t.imageGalleryHeader || null, t.videoResizing = void 0 === t.videoResizing || t.videoResizing, t.videoHeightShow = void 0 === t.videoHeightShow || !!t.videoHeightShow, t.videoRatioShow = void 0 === t.videoRatioShow || !!t.videoRatioShow, t.videoWidth = t.videoWidth && L.getNumber(t.videoWidth, 0) ? L.isNumber(t.videoWidth) ? t.videoWidth + "px" : t.videoWidth : "", t.videoHeight = t.videoHeight && L.getNumber(t.videoHeight, 0) ? L.isNumber(t.videoHeight) ? t.videoHeight + "px" : t.videoHeight : "", t.videoSizeOnlyPercentage = !!t.videoSizeOnlyPercentage, t._videoSizeUnit = t.videoSizeOnlyPercentage ? "%" : "px", t.videoRotation = void 0 !== t.videoRotation ? t.videoRotation : !(t.videoSizeOnlyPercentage || !t.videoHeightShow), t.videoRatio = L.getNumber(t.videoRatio, 4) || .5625, t.videoRatioList = t.videoRatioList ? t.videoRatioList : null, t.youtubeQuery = (t.youtubeQuery || "").replace("?", ""), t.videoFileInput = !!t.videoFileInput, t.videoUrlInput = void 0 === t.videoUrlInput || !t.videoFileInput || t.videoUrlInput, t.videoUploadHeader = t.videoUploadHeader || null, t.videoUploadUrl = "string" == typeof t.videoUploadUrl ? t.videoUploadUrl : null, t.videoUploadSizeLimit = /\d+/.test(t.videoUploadSizeLimit) ? L.getNumber(t.videoUploadSizeLimit, 0) : null, t.videoMultipleFile = !!t.videoMultipleFile, t.videoTagAttrs = t.videoTagAttrs || null, t.videoIframeAttrs = t.videoIframeAttrs || null, t.videoAccept = "string" != typeof t.videoAccept || "*" === t.videoAccept.trim() ? "video/*" : t.videoAccept.trim() || "video/*", t.audioWidth = t.audioWidth ? L.isNumber(t.audioWidth) ? t.audioWidth + "px" : t.audioWidth : "", t.audioHeight = t.audioHeight ? L.isNumber(t.audioHeight) ? t.audioHeight + "px" : t.audioHeight : "", t.audioFileInput = !!t.audioFileInput, t.audioUrlInput = void 0 === t.audioUrlInput || !t.audioFileInput || t.audioUrlInput, t.audioUploadHeader = t.audioUploadHeader || null, t.audioUploadUrl = "string" == typeof t.audioUploadUrl ? t.audioUploadUrl : null, t.audioUploadSizeLimit = /\d+/.test(t.audioUploadSizeLimit) ? L.getNumber(t.audioUploadSizeLimit, 0) : null, t.audioMultipleFile = !!t.audioMultipleFile, t.audioTagAttrs = t.audioTagAttrs || null, t.audioAccept = "string" != typeof t.audioAccept || "*" === t.audioAccept.trim() ? "audio/*" : t.audioAccept.trim() || "audio/*", t.tableCellControllerPosition = "string" == typeof t.tableCellControllerPosition ? t.tableCellControllerPosition.toLowerCase() : "cell", t.linkProtocol = "string" == typeof t.linkProtocol ? t.linkProtocol : null, t.linkRel = Array.isArray(t.linkRel) ? t.linkRel : [], t.linkRelDefault = t.linkRelDefault || {}, t.tabDisable = !!t.tabDisable, t.shortcutsDisable = Array.isArray(t.shortcutsDisable) ? t.shortcutsDisable : [], t.shortcutsHint = void 0 === t.shortcutsHint || !!t.shortcutsHint, t.callBackSave = t.callBackSave ? t.callBackSave : null, t.templates = t.templates ? t.templates : null, t.placeholder = "string" == typeof t.placeholder ? t.placeholder : null, t.mediaAutoSelect = void 0 === t.mediaAutoSelect || !!t.mediaAutoSelect, t.buttonList = t.buttonList ? t.buttonList : [["undo", "redo"], ["bold", "underline", "italic", "strike", "subscript", "superscript"], ["removeFormat"], ["outdent", "indent"], ["fullScreen", "showBlocks", "codeView"], ["preview", "print"]], t.rtl && (t.buttonList = t.buttonList.reverse()), t.icons = t.icons && "object" == typeof t.icons ? [S, t.icons].reduce((function (e, t) { for (let n in t) L.hasOwn(t, n) && (e[n] = t[n]); return e }), {}) : S, t.icons = t.rtl ? [t.icons, t.icons.rtl].reduce((function (e, t) { for (let n in t) L.hasOwn(t, n) && (e[n] = t[n]); return e }), {}) : t.icons, t._editorStyles = L._setDefaultOptionStyle(t, t.defaultStyle) }, _setWhitelist: function (e, t) { if ("string" != typeof t) return e; t = t.split("|"), e = e.split("|"); for (let n, i = 0, l = t.length; i < l; i++)n = e.indexOf(t[i]), n > -1 && e.splice(n, 1); return e.join("|") }, _defaultButtons: function (e) { const t = e.icons, n = e.lang, i = L.isOSX_IOS ? "⌘" : "CTRL", l = L.isOSX_IOS ? "⇧" : "+SHIFT", o = e.shortcutsHint ? e.shortcutsDisable : ["bold", "strike", "underline", "italic", "undo", "indent", "save"], s = e.rtl ? ["[", "]"] : ["]", "["]; return { bold: ["_se_command_bold", n.toolbar.bold + '' + (o.indexOf("bold") > -1 ? "" : i + '+B') + "", "bold", "", t.bold], underline: ["_se_command_underline", n.toolbar.underline + '' + (o.indexOf("underline") > -1 ? "" : i + '+U') + "", "underline", "", t.underline], italic: ["_se_command_italic", n.toolbar.italic + '' + (o.indexOf("italic") > -1 ? "" : i + '+I') + "", "italic", "", t.italic], strike: ["_se_command_strike", n.toolbar.strike + '' + (o.indexOf("strike") > -1 ? "" : i + l + '+S') + "", "strike", "", t.strike], subscript: ["_se_command_subscript", n.toolbar.subscript, "SUB", "", t.subscript], superscript: ["_se_command_superscript", n.toolbar.superscript, "SUP", "", t.superscript], removeFormat: ["", n.toolbar.removeFormat, "removeFormat", "", t.erase], indent: ["_se_command_indent", n.toolbar.indent + '' + (o.indexOf("indent") > -1 ? "" : i + '+' + s[0] + "") + "", "indent", "", t.outdent], outdent: ["_se_command_outdent", n.toolbar.outdent + '' + (o.indexOf("indent") > -1 ? "" : i + '+' + s[1] + "") + "", "outdent", "", t.indent], fullScreen: ["se-code-view-enabled se-resizing-enabled _se_command_fullScreen", n.toolbar.fullScreen, "fullScreen", "", t.expansion], showBlocks: ["_se_command_showBlocks", n.toolbar.showBlocks, "showBlocks", "", t.show_blocks], codeView: ["se-code-view-enabled se-resizing-enabled _se_command_codeView", n.toolbar.codeView, "codeView", "", t.code_view], undo: ["_se_command_undo se-resizing-enabled", n.toolbar.undo + '' + (o.indexOf("undo") > -1 ? "" : i + '+Z') + "", "undo", "", t.undo], redo: ["_se_command_redo se-resizing-enabled", n.toolbar.redo + '' + (o.indexOf("undo") > -1 ? "" : i + '+Y / ' + i + l + '+Z') + "", "redo", "", t.redo], preview: ["se-resizing-enabled", n.toolbar.preview, "preview", "", t.preview], print: ["se-resizing-enabled", n.toolbar.print, "print", "", t.print], save: ["_se_command_save se-resizing-enabled", n.toolbar.save + '' + (o.indexOf("save") > -1 ? "" : i + '+S') + "", "save", "", t.save], blockquote: ["", n.toolbar.tag_blockquote, "blockquote", "command", t.blockquote], font: ["se-btn-select se-btn-tool-font", n.toolbar.font, "font", "submenu", '' + n.toolbar.font + "" + t.arrow_down], formatBlock: ["se-btn-select se-btn-tool-format", n.toolbar.formats, "formatBlock", "submenu", '' + n.toolbar.formats + "" + t.arrow_down], fontSize: ["se-btn-select se-btn-tool-size", n.toolbar.fontSize, "fontSize", "submenu", '' + n.toolbar.fontSize + "" + t.arrow_down], fontColor: ["", n.toolbar.fontColor, "fontColor", "submenu", t.font_color], hiliteColor: ["", n.toolbar.hiliteColor, "hiliteColor", "submenu", t.highlight_color], align: ["se-btn-align", n.toolbar.align, "align", "submenu", e.rtl ? t.align_right : t.align_left], list: ["", n.toolbar.list, "list", "submenu", t.list_number], horizontalRule: ["btn_line", n.toolbar.horizontalRule, "horizontalRule", "submenu", t.horizontal_rule], table: ["", n.toolbar.table, "table", "submenu", t.table], lineHeight: ["", n.toolbar.lineHeight, "lineHeight", "submenu", t.line_height], template: ["", n.toolbar.template, "template", "submenu", t.template], paragraphStyle: ["", n.toolbar.paragraphStyle, "paragraphStyle", "submenu", t.paragraph_style], textStyle: ["", n.toolbar.textStyle, "textStyle", "submenu", t.text_style], link: ["", n.toolbar.link, "link", "dialog", t.link], image: ["", n.toolbar.image, "image", "dialog", t.image], video: ["", n.toolbar.video, "video", "dialog", t.video], audio: ["", n.toolbar.audio, "audio", "dialog", t.audio], math: ["", n.toolbar.math, "math", "dialog", t.math], imageGallery: ["", n.toolbar.imageGallery, "imageGallery", "fileBrowser", t.image_gallery] } }, _createModuleGroup: function () { const e = L.createElement("DIV"); e.className = "se-btn-module se-btn-module-border"; const t = L.createElement("UL"); return t.className = "se-menu-list", e.appendChild(t), { div: e, ul: t } }, _createButton: function (e, t, n, i, l, o, s) { const a = L.createElement("LI"), r = L.createElement("BUTTON"); return r.setAttribute("type", "button"), r.setAttribute("class", "se-btn" + (e ? " " + e : "") + " se-tooltip"), r.setAttribute("data-command", n), r.setAttribute("data-display", i), r.setAttribute("tabindex", "-1"), l || (l = '!'), /^default\./i.test(l) && (l = s[l.replace(/^default\./i, "")]), /^text\./i.test(l) && (l = l.replace(/^text\./i, ""), r.className += " se-btn-more-text"), l += '' + (t || n) + "", o && r.setAttribute("disabled", !0), r.innerHTML = l, a.appendChild(r), { li: a, button: r } }, _createToolBar: function (e, t, n, i) { const l = e.createElement("DIV"); l.className = "se-toolbar-separator-vertical"; const o = e.createElement("DIV"); o.className = "se-toolbar sun-editor-common"; const s = e.createElement("DIV"); s.className = "se-btn-tray", o.appendChild(s), t = JSON.parse(JSON.stringify(t)); const a = i.icons, r = this._defaultButtons(i), c = {}, d = [], u = {}; if (n) { const e = n.length ? n : Object.keys(n).map((function (e) { return n[e] })); for (let t, n = 0, i = e.length; n < i; n++)t = e[n].default || e[n], u[t.name] = t } let h = null, p = null, g = null, m = null, f = "", _ = !1; const b = L.createElement("DIV"); b.className = "se-toolbar-more-layer"; e: for (let n, i, o, v, y, C = 0; C < t.length; C++)if (n = !1, y = "", v = t[C], g = this._createModuleGroup(), "object" == typeof v) { for (let e, l = 0; l < v.length; l++) { if (p = v[l], e = !1, /^\%\d+/.test(p) && 0 === l) { v[0] = p.replace(/[^\d]/g, ""), d.push(v), t.splice(C--, 1); continue e } if ("object" == typeof p) "function" == typeof p.add ? (f = p.name, h = r[f], u[f] = p) : (f = p.name, h = [p.buttonClass, p.title, p.name, p.dataDisplay, p.innerHTML, p._disabled]); else { if (/^\-/.test(p)) { y = p.substr(1), g.div.style.float = y; continue } if (/^\:/.test(p)) { e = !0; const t = p.match(/^\:([^\-]+)\-([^\-]+)\-([^\-]+)/); o = "__se__" + t[1].trim(); h = ["se-btn-more", t[2].trim(), o, "MORE", t[3].trim()] } else h = r[p]; if (f = p, !h) { const e = u[f]; if (!e) throw Error("[SUNEDITOR.create.toolbar.fail] The button name of a plugin that does not exist. [" + f + "]"); h = [e.buttonClass, e.title, e.name, e.display, e.innerHTML, e._disabled] } } m = this._createButton(h[0], h[1], h[2], h[3], h[4], h[5], a), (n ? i : g.ul).appendChild(m.li), u[f] && (c[f] = m.button), e && (n = !0, i = L.createElement("DIV"), i.className = "se-more-layer " + o, i.innerHTML = '
      ", b.appendChild(i), i = i.firstElementChild.firstElementChild) } if (_) { const e = l.cloneNode(!1); s.appendChild(e) } s.appendChild(g.div), _ = !0 } else if (/^\/$/.test(v)) { const t = e.createElement("DIV"); t.className = "se-btn-module-enter", s.appendChild(t), _ = !1 } switch (s.children.length) { case 0: s.style.display = "none"; break; case 1: L.removeClass(s.firstElementChild, "se-btn-module-border"); break; default: if (i.rtl) { const e = l.cloneNode(!1); e.style.float = s.lastElementChild.style.float, s.appendChild(e) } }d.length > 0 && d.unshift(t), b.children.length > 0 && s.appendChild(b); const v = e.createElement("DIV"); v.className = "se-menu-tray", o.appendChild(v); const y = e.createElement("DIV"); return y.className = "se-toolbar-cover", o.appendChild(y), { element: o, plugins: u, pluginCallButtons: c, responsiveButtons: d, _menuTray: v, _buttonTray: s } } }; var A = function (e, t, n) { return { element: { originElement: e, topArea: t._top, relative: t._relative, toolbar: t._toolBar, _buttonTray: t._toolBar.querySelector(".se-btn-tray"), _menuTray: t._menuTray, resizingBar: t._resizingBar, navigation: t._navigation, charWrapper: t._charWrapper, charCounter: t._charCounter, editorArea: t._editorArea, wysiwygFrame: t._wysiwygArea, wysiwyg: t._wysiwygArea, code: t._codeArea, placeholder: t._placeholder, loading: t._loading, lineBreaker: t._lineBreaker, lineBreaker_t: t._lineBreaker_t, lineBreaker_b: t._lineBreaker_b, resizeBackground: t._resizeBack, _stickyDummy: t._stickyDummy, _arrow: t._arrow }, tool: { cover: t._toolBar.querySelector(".se-toolbar-cover"), bold: t._toolBar.querySelector("._se_command_bold"), underline: t._toolBar.querySelector("._se_command_underline"), italic: t._toolBar.querySelector("._se_command_italic"), strike: t._toolBar.querySelector("._se_command_strike"), subscript: t._toolBar.querySelector("._se_command_subscript"), superscript: t._toolBar.querySelector("._se_command_superscript"), undo: t._toolBar.querySelector("._se_command_undo"), redo: t._toolBar.querySelector("._se_command_redo"), save: t._toolBar.querySelector("._se_command_save"), outdent: t._toolBar.querySelector("._se_command_outdent"), indent: t._toolBar.querySelector("._se_command_indent"), fullScreen: t._toolBar.querySelector("._se_command_fullScreen"), showBlocks: t._toolBar.querySelector("._se_command_showBlocks"), codeView: t._toolBar.querySelector("._se_command_codeView") }, options: n, option: n } }, M = { name: "notice", add: function (e) { const t = e.context; t.notice = {}; let n = e.util.createElement("DIV"), i = e.util.createElement("SPAN"), l = e.util.createElement("BUTTON"); n.className = "se-notice", l.className = "close", l.setAttribute("aria-label", "Close"), l.setAttribute("title", e.lang.dialogBox.close), l.innerHTML = e.icons.cancel, n.appendChild(i), n.appendChild(l), t.notice.modal = n, t.notice.message = i, l.addEventListener("click", this.onClick_cancel.bind(e)), t.element.editorArea.appendChild(n), n = null }, onClick_cancel: function (e) { e.preventDefault(), e.stopPropagation(), this.plugins.notice.close.call(this) }, open: function (e) { this.context.notice.message.textContent = e, this.context.notice.modal.style.display = "block" }, close: function () { this.context.notice.modal.style.display = "none" } }, z = { init: function (e) { return { create: function (t, n) { return this.create(t, n, e) }.bind(this) } }, create: function (e, t, n) { L._propertiesInit(), "object" != typeof t && (t = {}), n && (t = [n, t].reduce((function (e, t) { for (let n in t) if (L.hasOwn(t, n)) if ("plugins" === n && t[n] && e[n]) { let i = e[n], l = t[n]; i = i.length ? i : Object.keys(i).map((function (e) { return i[e] })), l = l.length ? l : Object.keys(l).map((function (e) { return l[e] })), e[n] = l.filter((function (e) { return -1 === i.indexOf(e) })).concat(i) } else e[n] = t[n]; return e }), {})); const i = "string" == typeof e ? document.getElementById(e) : e; if (!i) { if ("string" == typeof e) throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:"' + e + '")'); throw Error("[SUNEDITOR.create.fail] suneditor requires textarea's element or id value") } const l = B.init(i, t); if (l.constructed._top.id && document.getElementById(l.constructed._top.id)) throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:"' + l.constructed._top.id + '")'); return function (e, t, n, i, l, o) { const s = e.element.originElement.ownerDocument || document, a = s.defaultView || window, r = L, c = l.icons, d = { _d: s, _w: a, _parser: new a.DOMParser, _wd: null, _ww: null, _shadowRoot: null, _shadowRootControllerEventTarget: null, util: r, functions: null, options: null, wwComputedStyle: a.getComputedStyle(e.element.wysiwyg), notice: M, icons: c, history: null, context: e, pluginCallButtons: t, plugins: n || {}, initPlugins: {}, _targetPlugins: {}, _menuTray: {}, lang: i, effectNode: null, submenu: null, container: null, _submenuName: "", _bindedSubmenuOff: null, _bindedContainerOff: null, submenuActiveButton: null, containerActiveButton: null, controllerArray: [], currentControllerName: "", currentControllerTarget: null, currentFileComponentInfo: null, codeViewDisabledButtons: null, resizingDisabledButtons: null, _moreLayerActiveButton: null, _htmlCheckWhitelistRegExp: null, _disallowedTextTagsRegExp: null, editorTagsWhitelistRegExp: null, pasteTagsWhitelistRegExp: null, hasFocus: !1, isDisabled: !1, _attributesWhitelistRegExp: null, _attributesTagsWhitelist: null, _bindControllersOff: null, _isInline: null, _isBalloon: null, _isBalloonAlways: null, _inlineToolbarAttr: { top: "", width: "", isShow: !1 }, _notHideToolbar: !1, _sticky: !1, _antiBlur: !1, _lineBreaker: null, _lineBreakerButton: null, _componentsInfoInit: !0, _componentsInfoReset: !1, activePlugins: null, managedTagsInfo: null, _charTypeHTML: !1, _fileInfoPluginsCheck: null, _fileInfoPluginsReset: null, _fileManager: { tags: null, regExp: null, queryString: null, pluginRegExp: null, pluginMap: null }, commandMap: null, _styleCommandMap: null, _defaultCommand: { bold: l.textTags.bold, underline: l.textTags.underline, italic: l.textTags.italic, strike: l.textTags.strike, subscript: l.textTags.sub, superscript: l.textTags.sup }, _variable: { isChanged: !1, isCodeView: !1, isFullScreen: !1, innerHeight_fullScreen: 0, resizeClientY: 0, tabSize: 4, codeIndent: 4, minResizingSize: r.getNumber(e.element.wysiwygFrame.style.minHeight || "65", 0), currentNodes: [], currentNodesMap: [], _range: null, _selectionNode: null, _originCssText: e.element.topArea.style.cssText, _bodyOverflow: "", _editorAreaOriginCssText: "", _wysiwygOriginCssText: "", _codeOriginCssText: "", _fullScreenAttrs: { sticky: !1, balloon: !1, inline: !1 }, _lineBreakComp: null, _lineBreakDir: "" }, callPlugin: function (e, n, i) { if (i = i || t[e], !this.plugins[e]) throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:"' + e + '")'); this.initPlugins[e] ? "object" == typeof this._targetPlugins[e] && i && this.initMenuTarget(e, i, this._targetPlugins[e]) : (this.plugins[e].add(this, i), this.initPlugins[e] = !0), this.plugins[e].active && !this.commandMap[e] && i && (this.commandMap[e] = i, this.activePlugins.push(e)), "function" == typeof n && n() }, addModule: function (e) { for (let t, n = 0, i = e.length; n < i; n++)t = e[n].name, this.plugins[t] || (this.plugins[t] = e[n]), this.initPlugins[t] || (this.initPlugins[t] = !0, "function" == typeof this.plugins[t].add && this.plugins[t].add(this)) }, getGlobalScrollOffset: function () { let t = 0, n = 0, i = e.element.topArea; for (; i;)t += i.scrollTop, n += i.scrollLeft, i = i.parentElement; for (i = this._shadowRoot ? this._shadowRoot.host : null; i;)t += i.scrollTop, n += i.scrollLeft, i = i.parentElement; return { top: t, left: n } }, initMenuTarget: function (t, n, i) { n ? (e.element._menuTray.appendChild(i), this._targetPlugins[t] = !0, this._menuTray[n.getAttribute("data-command")] = i) : this._targetPlugins[t] = i }, submenuOn: function (e) { this._bindedSubmenuOff && this._bindedSubmenuOff(), this._bindControllersOff && this.controllersOff(); const t = this._submenuName = e.getAttribute("data-command"), n = this.submenu = this._menuTray[t]; this.submenuActiveButton = e, this._setMenuPosition(e, n), this._bindedSubmenuOff = this.submenuOff.bind(this), this.addDocEvent("mousedown", this._bindedSubmenuOff, !1), this.plugins[t].on && this.plugins[t].on.call(this), this._antiBlur = !0 }, submenuOff: function () { this.removeDocEvent("mousedown", this._bindedSubmenuOff), this._bindedSubmenuOff = null, this.submenu && (this._submenuName = "", this.submenu.style.display = "none", this.submenu = null, r.removeClass(this.submenuActiveButton, "on"), this.submenuActiveButton = null, this._notHideToolbar = !1), this._antiBlur = !1 }, containerOn: function (e) { this._bindedContainerOff && this._bindedContainerOff(); const t = this._containerName = e.getAttribute("data-command"), n = this.container = this._menuTray[t]; this.containerActiveButton = e, this._setMenuPosition(e, n), this._bindedContainerOff = this.containerOff.bind(this), this.addDocEvent("mousedown", this._bindedContainerOff, !1), this.plugins[t].on && this.plugins[t].on.call(this), this._antiBlur = !0 }, containerOff: function () { this.removeDocEvent("mousedown", this._bindedContainerOff), this._bindedContainerOff = null, this.container && (this._containerName = "", this.container.style.display = "none", this.container = null, r.removeClass(this.containerActiveButton, "on"), this.containerActiveButton = null, this._notHideToolbar = !1), this._antiBlur = !1 }, _setMenuPosition: function (t, n) { n.style.visibility = "hidden", n.style.display = "block", n.style.height = "", r.addClass(t, "on"); const i = this.context.element.toolbar, o = i.offsetWidth, s = u._getEditorOffsets(e.element.toolbar), c = n.offsetWidth, d = t.parentElement.offsetLeft + 3; if (l.rtl) { const e = t.offsetWidth, i = c > e ? c - e : 0, l = i > 0 ? 0 : e - c; n.style.left = d - i + l + "px", s.left > u._getEditorOffsets(n).left && (n.style.left = "0px") } else { const e = o <= c ? 0 : o - (d + c); n.style.left = e < 0 ? d + e + "px" : d + "px" } let h = 0, p = t; for (; p && p !== i;)h += p.offsetTop, p = p.offsetParent; const g = h; this._isBalloon ? h += i.offsetTop + t.offsetHeight : h -= t.offsetHeight; const m = s.top, f = n.offsetHeight, _ = this.getGlobalScrollOffset().top, b = a.innerHeight - (m - _ + g + t.parentElement.offsetHeight); if (b < f) { let e = -1 * (f - g + 3); const i = m - _ + e, l = f + (i < 0 ? i : 0); l > b ? (n.style.height = l + "px", e = -1 * (l - g + 3)) : (n.style.height = b + "px", e = g + t.parentElement.offsetHeight), n.style.top = e + "px" } else n.style.top = g + t.parentElement.offsetHeight + "px"; n.style.visibility = "" }, controllersOn: function () { this._bindControllersOff && this._bindControllersOff(), this.controllerArray = []; for (let e, t = 0; t < arguments.length; t++)e = arguments[t], e && ("string" != typeof e ? "function" != typeof e ? r.hasClass(e, "se-controller") ? (e.style && (e.style.display = "block", this._shadowRoot && -1 === this._shadowRootControllerEventTarget.indexOf(e) && (e.addEventListener("mousedown", (function (e) { e.preventDefault(), e.stopPropagation() })), this._shadowRootControllerEventTarget.push(e))), this.controllerArray.push(e)) : (this.currentControllerTarget = e, this.currentFileComponentInfo = this.getFileComponent(e)) : this.controllerArray.push(e) : this.currentControllerName = e); this._bindControllersOff = this.controllersOff.bind(this), this.addDocEvent("mousedown", this._bindControllersOff, !1), this.addDocEvent("keydown", this._bindControllersOff, !1), this._antiBlur = !0, "function" == typeof h.showController && h.showController(this.currentControllerName, this.controllerArray, this) }, controllersOff: function (t) { this._lineBreaker.style.display = "none"; const n = this.controllerArray.length; if (t && t.target && n > 0) for (let e = 0; e < n; e++)if ("function" == typeof this.controllerArray[e].contains && this.controllerArray[e].contains(t.target)) return; if ((!this._fileManager.pluginRegExp.test(this.currentControllerName) || !t || "keydown" !== t.type || 27 === t.keyCode) && (e.element.lineBreaker_t.style.display = e.element.lineBreaker_b.style.display = "none", this._variable._lineBreakComp = null, this.currentControllerName = "", this.currentControllerTarget = null, this.currentFileComponentInfo = null, this.effectNode = null, this._bindControllersOff)) { if (this.removeDocEvent("mousedown", this._bindControllersOff), this.removeDocEvent("keydown", this._bindControllersOff), this._bindControllersOff = null, n > 0) { for (let e = 0; e < n; e++)"function" == typeof this.controllerArray[e] ? this.controllerArray[e]() : this.controllerArray[e].style.display = "none"; this.controllerArray = [] } this._antiBlur = !1 } }, setControllerPosition: function (t, n, i, o) { l.rtl && (o.left *= -1); const s = r.getOffset(n, e.element.wysiwygFrame); t.style.visibility = "hidden", t.style.display = "block"; const a = "top" === i ? -(t.offsetHeight + 2) : n.offsetHeight + 12; t.style.top = s.top + a + o.top + "px"; const c = s.left - e.element.wysiwygFrame.scrollLeft + o.left, d = t.offsetWidth, u = n.offsetWidth, h = r.hasClass(t.firstElementChild, "se-arrow") ? t.firstElementChild : null; if (l.rtl) { const n = d > u ? d - u : 0, i = n > 0 ? 0 : u - d; t.style.left = c - n + i + "px", n > 0 && h && (h.style.left = (d - 14 < 10 + n ? d - 14 : 10 + n) + "px"); const l = e.element.wysiwygFrame.offsetLeft - t.offsetLeft; l > 0 && (t.style.left = "0px", h && (h.style.left = l + "px")) } else { t.style.left = c + "px"; const n = e.element.wysiwygFrame.offsetWidth - (t.offsetLeft + d); n < 0 ? (t.style.left = t.offsetLeft + n + "px", h && (h.style.left = 20 - n + "px")) : h && (h.style.left = "20px") } t.style.visibility = "" }, execCommand: function (e, t, n) { this._wd.execCommand(e, t, "formatBlock" === e ? "<" + n + ">" : n), this.history.push(!0) }, nativeFocus: function () { const t = r.getParentElement(this.getSelectionNode(), "figcaption"); t ? t.focus() : e.element.wysiwyg.focus(), this._editorRange() }, focus: function () { if ("none" !== e.element.wysiwygFrame.style.display) { if (l.iframe) this.nativeFocus(); else try { const t = this.getRange(); if (t.startContainer === t.endContainer && r.isWysiwygDiv(t.startContainer)) { const n = t.commonAncestorContainer.children[t.startOffset]; if (!r.isFormatElement(n) && !r.isComponent(n)) { const t = r.createElement(l.defaultTag), i = r.createElement("BR"); return t.appendChild(i), e.element.wysiwyg.insertBefore(t, n), void this.setRange(i, 0, i, 0) } } this.setRange(t.startContainer, t.startOffset, t.endContainer, t.endOffset) } catch (e) { this.nativeFocus() } u._applyTagEffects(), this._isBalloon && u._toggleToolbarBalloon() } }, focusEdge: function (t) { t || (t = e.element.wysiwyg.lastElementChild); const n = this.getFileComponent(t); n ? this.selectComponent(n.target, n.pluginName) : t ? (t = r.getChildElement(t, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !0)) ? this.setRange(t, t.textContent.length, t, t.textContent.length) : this.nativeFocus() : this.focus() }, blur: function () { l.iframe ? e.element.wysiwygFrame.blur() : e.element.wysiwyg.blur() }, setRange: function (e, t, n, i) { if (!e || !n) return; t > e.textContent.length && (t = e.textContent.length), i > n.textContent.length && (i = n.textContent.length), r.isFormatElement(e) && (e = e.childNodes[t] || e, t = 0), r.isFormatElement(n) && (n = n.childNodes[i] || n, i = t > 1 ? t : 0); const o = this._wd.createRange(); try { o.setStart(e, t), o.setEnd(n, i) } catch (e) { return console.warn("[SUNEDITOR.core.focus.error] " + e), void this.nativeFocus() } const s = this.getSelection(); return s.removeAllRanges && s.removeAllRanges(), s.addRange(o), this._editorRange(), l.iframe && this.nativeFocus(), o }, removeRange: function () { this._variable._range = null, this._variable._selectionNode = null, this.hasFocus && this.getSelection().removeAllRanges(); const e = this.commandMap, t = this.activePlugins; for (let i in e) r.hasOwn(e, i) && (t.indexOf(i) > -1 ? n[i].active.call(this, null) : e.OUTDENT && /^OUTDENT$/i.test(i) ? e.OUTDENT.setAttribute("disabled", !0) : e.INDENT && /^INDENT$/i.test(i) ? e.INDENT.removeAttribute("disabled") : r.removeClass(e[i], "active")) }, getRange: function () { const t = this._variable._range || this._createDefaultRange(), n = this.getSelection(); if (t.collapsed === n.isCollapsed || !e.element.wysiwyg.contains(n.focusNode)) return t; if (n.rangeCount > 0) return this._variable._range = n.getRangeAt(0), this._variable._range; { const e = n.anchorNode, t = n.focusNode, i = n.anchorOffset, l = n.focusOffset, o = r.compareElements(e, t), s = o.ancestor && (0 === o.result ? i <= l : o.result > 1); return this.setRange(s ? e : t, s ? i : l, s ? t : e, s ? l : i) } }, getRange_addLine: function (t, n) { if (this._selectionVoid(t)) { const i = e.element.wysiwyg, o = r.createElement(l.defaultTag); o.innerHTML = "
      ", i.insertBefore(o, n && n !== i ? n.nextElementSibling : i.firstElementChild), this.setRange(o.firstElementChild, 0, o.firstElementChild, 1), t = this._variable._range } return t }, getSelection: function () { return this._shadowRoot && this._shadowRoot.getSelection ? this._shadowRoot.getSelection() : this._ww.getSelection() }, getSelectionNode: function () { if (e.element.wysiwyg.contains(this._variable._selectionNode) || this._editorRange(), !this._variable._selectionNode) { const t = r.getChildElement(e.element.wysiwyg.firstChild, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !1); if (t) return this._variable._selectionNode = t, t; this._editorRange() } return this._variable._selectionNode }, _editorRange: function () { const e = this.getSelection(); if (!e) return null; let t = null, n = null; t = e.rangeCount > 0 ? e.getRangeAt(0) : this._createDefaultRange(), this._variable._range = t, n = t.collapsed ? r.isWysiwygDiv(t.commonAncestorContainer) && t.commonAncestorContainer.children[t.startOffset] || t.commonAncestorContainer : e.extentNode || e.anchorNode, this._variable._selectionNode = n }, _createDefaultRange: function () { const t = e.element.wysiwyg; t.focus(); const n = this._wd.createRange(); let i = t.firstElementChild; return i || (i = r.createElement(l.defaultTag), i.innerHTML = "
      ", t.appendChild(i)), n.setStart(i, 0), n.setEnd(i, 0), n }, _selectionVoid: function (e) { const t = e.commonAncestorContainer; return r.isWysiwygDiv(e.startContainer) && r.isWysiwygDiv(e.endContainer) || /FIGURE/i.test(t.nodeName) || this._fileManager.regExp.test(t.nodeName) || r.isMediaComponent(t) }, _resetRangeToTextNode: function () { const t = this.getRange(); if (this._selectionVoid(t)) return !1; let n, i, o, s = t.startContainer, a = t.startOffset, c = t.endContainer, d = t.endOffset; if (r.isFormatElement(s) && (s = s.childNodes[a] || s.lastChild, a = s.textContent.length), r.isFormatElement(c) && (c = c.childNodes[d] || c.lastChild, d = c.textContent.length), n = r.isWysiwygDiv(s) ? e.element.wysiwyg.firstChild : s, i = a, r.isBreak(n) || 1 === n.nodeType && n.childNodes.length > 0) { const e = r.isBreak(n); if (!e) { for (; n && !r.isBreak(n) && 1 === n.nodeType;)n = n.childNodes[i] || n.nextElementSibling || n.nextSibling, i = 0; let e = r.getFormatElement(n, null); e === r.getRangeFormatElement(e, null) && (e = r.createElement(r.getParentElement(n, r.isCell) ? "DIV" : l.defaultTag), n.parentNode.insertBefore(e, n), e.appendChild(n)) } if (r.isBreak(n)) { const t = r.createTextNode(r.zeroWidthSpace); n.parentNode.insertBefore(t, n), n = t, e && s === c && (c = n, d = 1) } } if (s = n, a = i, n = r.isWysiwygDiv(c) ? e.element.wysiwyg.lastChild : c, i = d, r.isBreak(n) || 1 === n.nodeType && n.childNodes.length > 0) { const e = r.isBreak(n); if (!e) { for (; n && !r.isBreak(n) && 1 === n.nodeType && (o = n.childNodes, 0 !== o.length);)n = o[i > 0 ? i - 1 : i] || !/FIGURE/i.test(o[0].nodeName) ? o[0] : n.previousElementSibling || n.previousSibling || s, i = i > 0 ? n.textContent.length : i; let e = r.getFormatElement(n, null); e === r.getRangeFormatElement(e, null) && (e = r.createElement(r.isCell(e) ? "DIV" : l.defaultTag), n.parentNode.insertBefore(e, n), e.appendChild(n)) } if (r.isBreak(n)) { const t = r.createTextNode(r.zeroWidthSpace); n.parentNode.insertBefore(t, n), n = t, i = 1, e && !n.previousSibling && r.removeItem(c) } } return c = n, d = i, this.setRange(s, a, c, d), !0 }, getSelectedElements: function (t) { if (!this._resetRangeToTextNode()) return []; let n = this.getRange(); if (r.isWysiwygDiv(n.startContainer)) { const t = e.element.wysiwyg.children; if (0 === t.length) return []; this.setRange(t[0], 0, t[t.length - 1], t[t.length - 1].textContent.trim().length), n = this.getRange() } const i = n.startContainer, l = n.endContainer, o = n.commonAncestorContainer, s = r.getListChildren(o, (function (e) { return t ? t(e) : r.isFormatElement(e) })); if (r.isWysiwygDiv(o) || r.isRangeFormatElement(o) || s.unshift(r.getFormatElement(o, null)), i === l || 1 === s.length) return s; let a = r.getFormatElement(i, null), c = r.getFormatElement(l, null), d = null, u = null; const h = function (e) { return !r.isTable(e) || /^TABLE$/i.test(e.nodeName) }; let p = r.getRangeFormatElement(a, h), g = r.getRangeFormatElement(c, h); r.isTable(p) && r.isListCell(p.parentNode) && (p = p.parentNode), r.isTable(g) && r.isListCell(g.parentNode) && (g = g.parentNode); const m = p === g; for (let e, t = 0, n = s.length; t < n; t++)if (e = s[t], a === e || !m && e === p) d = t; else if (c === e || !m && e === g) { u = t; break } return null === d && (d = 0), null === u && (u = s.length - 1), s.slice(d, u + 1) }, getSelectedElementsAndComponents: function (e) { const t = this.getRange().commonAncestorContainer, n = r.getParentElement(t, r.isComponent), i = r.isTable(t) ? this.getSelectedElements(null) : this.getSelectedElements(function (e) { const t = this.getParentElement(e, this.isComponent); return this.isFormatElement(e) && (!t || t === n) || this.isComponent(e) && !this.getFormatElement(e) }.bind(r)); if (e) for (let e = 0, t = i.length; e < t; e++)for (let n = e - 1; n >= 0; n--)if (i[n].contains(i[e])) { i.splice(e, 1), e--, t--; break } return i }, isEdgePoint: function (e, t, n) { return "end" !== n && 0 === t || (!n || "front" !== n) && !e.nodeValue && 1 === t || (!n || "end" === n) && !!e.nodeValue && t === e.nodeValue.length }, _isEdgeFormat: function (e, t, n) { if (!this.isEdgePoint(e, t, n)) return !1; const i = []; for (n = "front" === n ? "previousSibling" : "nextSibling"; e && !r.isFormatElement(e) && !r.isWysiwygDiv(e);) { if (e[n] && (!r.isBreak(e[n]) || e[n][n])) return null; 1 === e.nodeType && i.push(e.cloneNode(!1)), e = e.parentNode } return i }, showLoading: function () { e.element.loading.style.display = "block" }, closeLoading: function () { e.element.loading.style.display = "none" }, appendFormatTag: function (e, t) { const n = r.getFormatElement(this.getSelectionNode(), null), i = t ? "string" == typeof t ? t : t.nodeName : r.isFormatElement(n) && !r.isFreeFormatElement(n) ? n.nodeName : l.defaultTag, o = r.createElement(i); return o.innerHTML = "
      ", (t && "string" != typeof t || !t && r.isFormatElement(n)) && r.copyTagAttributes(o, t || n), r.isCell(e) ? e.insertBefore(o, e.nextElementSibling) : e.parentNode.insertBefore(o, e.nextElementSibling), o }, insertComponent: function (e, t, n, i) { if (n && !this.checkCharCount(e, null)) return null; const l = this.removeNode(); this.getRange_addLine(this.getRange(), l.container); let o = null, s = this.getSelectionNode(), a = r.getFormatElement(s, null); if (r.isListCell(a)) this.insertNode(e, s === a ? null : l.container.nextSibling, !1), e.nextSibling || e.parentNode.appendChild(r.createElement("BR")); else { if (this.getRange().collapsed && (3 === l.container.nodeType || r.isBreak(l.container))) { const e = r.getParentElement(l.container, function (e) { return this.isRangeFormatElement(e) }.bind(r)); o = r.splitElement(l.container, l.offset, e ? r.getElementDepth(e) + 1 : 0), o && (a = o.previousSibling) } this.insertNode(e, a, !1), a && r.onlyZeroWidthSpace(a) && r.removeItem(a) } if (this.setRange(e, 0, e, 0), !i) { const t = this.getFileComponent(e); t ? this.selectComponent(t.target, t.pluginName) : o && (o = r.getEdgeChildNodes(o, null).sc || o, this.setRange(o, 0, o, 0)) } return t || this.history.push(1), o || e }, getFileComponent: function (e) { if (!this._fileManager.queryString || !e) return null; let t, n; return (/^FIGURE$/i.test(e.nodeName) || /se-component/.test(e.className)) && (t = e.querySelector(this._fileManager.queryString)), !t && e.nodeName && this._fileManager.regExp.test(e.nodeName) && (t = e), t && (n = this._fileManager.pluginMap[t.nodeName.toLowerCase()], n) ? { target: t, component: r.getParentElement(t, r.isComponent), pluginName: n } : null }, selectComponent: function (e, t) { if (r.isUneditableComponent(r.getParentElement(e, r.isComponent)) || r.isUneditableComponent(e)) return !1; this.hasFocus || this.focus(); const n = this.plugins[t]; n && a.setTimeout(function () { "function" == typeof n.select && this.callPlugin(t, n.select.bind(this, e), null), this._setComponentLineBreaker(e) }.bind(this)) }, _setComponentLineBreaker: function (t) { this._lineBreaker.style.display = "none"; const n = r.getParentElement(t, r.isComponent), i = e.element.lineBreaker_t.style, l = e.element.lineBreaker_b.style, o = "block" === this.context.resizing.resizeContainer.style.display ? this.context.resizing.resizeContainer : t, s = r.isListCell(n.parentNode); let a, c, d; (s ? n.previousSibling : r.isFormatElement(n.previousElementSibling)) ? i.display = "none" : (this._variable._lineBreakComp = n, c = e.element.wysiwyg.scrollTop, a = r.getOffset(t, e.element.wysiwygFrame).top + c, d = o.offsetWidth / 2 / 2, i.top = a - c - 12 + "px", i.left = r.getOffset(o).left + d + "px", i.display = "block"), (s ? n.nextSibling : r.isFormatElement(n.nextElementSibling)) ? l.display = "none" : (a || (this._variable._lineBreakComp = n, c = e.element.wysiwyg.scrollTop, a = r.getOffset(t, e.element.wysiwygFrame).top + c, d = o.offsetWidth / 2 / 2), l.top = a + o.offsetHeight - c - 12 + "px", l.left = r.getOffset(o).left + o.offsetWidth - d - 24 + "px", l.display = "block") }, insertNode: function (t, n, i) { if (i && !this.checkCharCount(t, null)) return null; const o = r.getFreeFormatElement(this.getSelectionNode(), null), s = !o && (r.isFormatElement(t) || r.isRangeFormatElement(t)) || r.isComponent(t); if (!n && (s || r.isComponent(t) || r.isMedia(t))) { const e = this.removeNode(); if (3 === e.container.nodeType || r.isBreak(e.container)) { const t = r.getParentElement(e.container, function (e) { return this.isRangeFormatElement(e) || this.isListCell(e) }.bind(r)); (n = r.splitElement(e.container, e.offset, t ? r.getElementDepth(t) + 1 : 0)) && (n = n.previousSibling) } } const a = n || s ? this.getRange() : this.getRange_addLine(this.getRange(), null), c = a.commonAncestorContainer, d = a.startOffset, u = a.endOffset, h = a.startContainer === c && r.isFormatElement(c), p = h ? c.childNodes[d] || c.childNodes[0] : a.startContainer, g = h ? c.childNodes[u] || c.childNodes[c.childNodes.length - 1] : a.endContainer; let m, f = null; if (n) m = n.parentNode, n = n.nextSibling, f = !0; else if (m = p, 3 === p.nodeType && (m = p.parentNode), a.collapsed) if (3 === c.nodeType) n = c.textContent.length > u ? c.splitText(u) : c.nextSibling; else if (r.isBreak(m)) n = m, m = m.parentNode; else { let e = m.childNodes[d]; const i = e && 3 === e.nodeType && r.onlyZeroWidthSpace(e) && r.isBreak(e.nextSibling) ? e.nextSibling : e; i ? i.nextSibling ? n = r.isBreak(i) && !r.isBreak(t) ? i : i.nextSibling : (m.removeChild(i), n = null) : n = null } else { if (p === g) { n = this.isEdgePoint(g, u) ? g.nextSibling : g.splitText(u); let e = p; this.isEdgePoint(p, d) || (e = p.splitText(d)), m.removeChild(e), 0 === m.childNodes.length && s && (m.innerHTML = "
      ") } else { const e = this.removeNode(), t = e.container, i = e.prevContainer; if (t && 0 === t.childNodes.length && s && (r.isFormatElement(t) ? t.innerHTML = "
      " : r.isRangeFormatElement(t) && (t.innerHTML = "<" + l.defaultTag + ">
      ")), !s && i) if (m = 3 === i.nodeType ? i.parentNode : i, m.contains(t)) { let e = !0; for (n = t; n.parentNode !== m;)n = n.parentNode, e = !1; e && t === i && (n = n.nextSibling) } else n = null; else m = (n = s ? g : t === i ? t.nextSibling : t) && n.parentNode ? n.parentNode : c; for (; n && !r.isFormatElement(n) && n.parentNode !== c;)n = n.parentNode } } try { if ((r.isWysiwygDiv(n) || m === e.element.wysiwyg.parentNode) && (m = e.element.wysiwyg, n = null), r.isFormatElement(t) || r.isRangeFormatElement(t) || !r.isListCell(m) && r.isComponent(t)) { const e = m; if (r.isList(n)) m = n, n = null; else if (r.isListCell(n)) m = n.previousElementSibling || n; else if (!f && !n) { const e = this.removeNode(), t = 3 === e.container.nodeType ? r.isListCell(r.getFormatElement(e.container, null)) ? e.container : r.getFormatElement(e.container, null) || e.container.parentNode : e.container, i = r.isWysiwygDiv(t) || r.isRangeFormatElement(t); m = i ? t : t.parentNode, n = i ? null : t.nextSibling } 0 === e.childNodes.length && m !== e && r.removeItem(e) } if (!s || o || r.isRangeFormatElement(m) || r.isListCell(m) || r.isWysiwygDiv(m) || (n = m.nextElementSibling, m = m.parentNode), r.isWysiwygDiv(m) && (3 === t.nodeType || r.isBreak(t))) { const e = r.createElement(l.defaultTag); e.appendChild(t), t = e } m.insertBefore(t, m === n ? m.lastChild : n) } catch (e) { m.appendChild(t) } finally { if ((r.isFormatElement(t) || r.isComponent(t)) && p === g) { const e = r.getFormatElement(c, null); e && 1 === e.nodeType && r.isEmptyLine(e) && r.removeItem(e) } if (o && (r.isFormatElement(t) || r.isRangeFormatElement(t)) && (t = this._setIntoFreeFormat(t)), !r.isComponent(t)) { let e = 1; if (3 === t.nodeType) { const e = t.previousSibling, n = t.nextSibling, i = !e || 1 === e.nodeType || r.onlyZeroWidthSpace(e) ? "" : e.textContent, l = !n || 1 === n.nodeType || r.onlyZeroWidthSpace(n) ? "" : n.textContent; e && i.length > 0 && (t.textContent = i + t.textContent, r.removeItem(e)), n && n.length > 0 && (t.textContent += l, r.removeItem(n)); const o = { container: t, startOffset: i.length, endOffset: t.textContent.length - l.length }; return this.setRange(t, o.startOffset, t, o.endOffset), o } if (!r.isBreak(t) && r.isFormatElement(m)) { let n = null; t.previousSibling && !r.isBreak(t.previousSibling) || (n = r.createTextNode(r.zeroWidthSpace), t.parentNode.insertBefore(n, t)), t.nextSibling && !r.isBreak(t.nextSibling) || (n = r.createTextNode(r.zeroWidthSpace), t.parentNode.insertBefore(n, t.nextSibling)), r._isIgnoreNodeChange(t) && (t = t.nextSibling, e = 0) } this.setRange(t, e, t, e) } return this.history.push(!0), t } }, _setIntoFreeFormat: function (e) { const t = e.parentNode; let n, i; for (; r.isFormatElement(e) || r.isRangeFormatElement(e);) { for (n = e.childNodes, i = null; n[0];)if (i = n[0], r.isFormatElement(i) || r.isRangeFormatElement(i)) { if (this._setIntoFreeFormat(i), !e.parentNode) break; n = e.childNodes } else t.insertBefore(i, e); 0 === e.childNodes.length && r.removeItem(e), e = r.createElement("BR"), t.insertBefore(e, i.nextSibling) } return e }, removeNode: function () { this._resetRangeToTextNode(); const t = this.getRange(); let n, i = 0, l = t.startContainer, o = t.endContainer, s = t.startOffset, a = t.endOffset; const c = 3 === t.commonAncestorContainer.nodeType && t.commonAncestorContainer.parentNode === l.parentNode ? l.parentNode : t.commonAncestorContainer; c === l && c === o && (l = c.children[s], o = c.children[a], s = a = 0); let d = null, u = null; const h = r.getListChildNodes(c, null); let p = r.getArrayIndex(h, l), g = r.getArrayIndex(h, o); if (h.length > 0 && p > -1 && g > -1) { for (let e = p + 1, t = l; e >= 0; e--)h[e] === t.parentNode && h[e].firstChild === t && 0 === s && (p = e, t = t.parentNode); for (let e = g - 1, t = o; e > p; e--)h[e] === t.parentNode && 1 === h[e].nodeType && (h.splice(e, 1), t = t.parentNode, --g) } else { if (0 === h.length) { if (r.isFormatElement(c) || r.isRangeFormatElement(c) || r.isWysiwygDiv(c) || r.isBreak(c) || r.isMedia(c)) return { container: c, offset: 0 }; if (3 === c.nodeType) return { container: c, offset: a }; h.push(c), l = o = c } else if (l = o = h[0], r.isBreak(l) || r.onlyZeroWidthSpace(l)) return { container: r.isMedia(c) ? c : l, offset: 0 }; p = g = 0 } function m(e) { const t = r.getFormatElement(e, null); if (r.removeItem(e), r.isListCell(t)) { const e = r.getArrayItem(t.children, r.isList, !1); if (e) { const n = e.firstElementChild, i = n.childNodes; for (; i[0];)t.insertBefore(i[0], e); r.removeItemAllParents(n, null, null) } } } for (let e = p; e <= g; e++) { const t = h[e]; if (0 === t.length || 3 === t.nodeType && void 0 === t.data) m(t); else if (t !== l) if (t !== o) m(t); else { if (1 === o.nodeType) { if (r.isComponent(o)) continue; u = r.createTextNode(o.textContent) } else u = r.createTextNode(o.substringData(a, o.length - a)); u.length > 0 ? o.data = u.data : m(o) } else { if (1 === l.nodeType) { if (r.isComponent(l)) continue; d = r.createTextNode(l.textContent) } else t === o ? (d = r.createTextNode(l.substringData(0, s) + o.substringData(a, o.length - a)), i = s) : d = r.createTextNode(l.substringData(0, s)); if (d.length > 0 ? l.data = d.data : m(l), t === o) break } } if (n = o && o.parentNode ? o : l && l.parentNode ? l : t.endContainer || t.startContainer, !r.isWysiwygDiv(n) && 0 === n.childNodes.length) { const t = r.removeItemAllParents(n, function (e) { if (this.isComponent(e)) return !1; const t = e.textContent; return 0 === t.length || /^(\n|\u200B)+$/.test(t) }.bind(r), null); t && (n = t.sc || t.ec || e.element.wysiwyg) } return this.setRange(n, i, n, i), this.history.push(!0), { container: n, offset: i, prevContainer: l && l.parentNode ? l : null } }, applyRangeFormatElement: function (e) { this.getRange_addLine(this.getRange(), null); const t = this.getSelectedElementsAndComponents(!1); if (!t || 0 === t.length) return; e: for (let e, n, i, l, o, s, a = 0, c = t.length; a < c; a++)if (e = t[a], r.isListCell(e)) if (n = e.lastElementChild, n && r.isListCell(e.nextElementSibling) && t.indexOf(e.nextElementSibling) > -1 && (l = n.lastElementChild, t.indexOf(l) > -1)) { let e = null; for (; e = l.lastElementChild;)if (r.isList(e)) { if (!(t.indexOf(e.lastElementChild) > -1)) continue e; l = e.lastElementChild } i = n.firstElementChild, o = t.indexOf(i), s = t.indexOf(l), t.splice(o, s - o + 1), c = t.length } else; let n, i, l, o = t[t.length - 1]; n = r.isRangeFormatElement(o) || r.isFormatElement(o) ? o : r.getRangeFormatElement(o, null) || r.getFormatElement(o, null), r.isCell(n) ? (i = null, l = n) : (i = n.nextSibling, l = n.parentNode); let s = r.getElementDepth(n), a = null; const c = [], d = function (e, t, n) { let i = null; if (e !== t && !r.isTable(t)) { if (t && r.getElementDepth(e) === r.getElementDepth(t)) return n; i = r.removeItemAllParents(t, null, e) } return i ? i.ec : n }; for (let n, o, u, h, p, g, m, f = 0, _ = t.length; f < _; f++)if (n = t[f], o = n.parentNode, o && !e.contains(o)) if (u = r.getElementDepth(n), r.isList(o)) { if (null === a && (g ? (a = g, m = !0, g = null) : a = o.cloneNode(!1)), c.push(n), p = t[f + 1], f === _ - 1 || p && p.parentNode !== o) { p && n.contains(p.parentNode) && (g = p.parentNode.cloneNode(!1)); let t, f = o.parentNode; for (; r.isList(f);)t = r.createElement(f.nodeName), t.appendChild(a), a = t, f = f.parentNode; const _ = this.detachRangeFormatElement(o, c, null, !0, !0); s >= u ? (s = u, l = _.cc, i = d(l, o, _.ec), i && (l = i.parentNode)) : l === _.cc && (i = _.ec), l !== _.cc && (h = d(l, _.cc, h), i = void 0 !== h ? h : _.cc); for (let e = 0, t = _.removeArray.length; e < t; e++)a.appendChild(_.removeArray[e]); m || e.appendChild(a), g && _.removeArray[_.removeArray.length - 1].appendChild(g), a = null, m = !1 } } else s >= u && (s = u, l = o, i = n.nextSibling), e.appendChild(n), l !== o && (h = d(l, o), void 0 !== h && (i = h)); if (this.effectNode = null, r.mergeSameTags(e, null, !1), r.mergeNestedTags(e, function (e) { return this.isList(e) }.bind(r)), i && r.getElementDepth(i) > 0 && (r.isList(i.parentNode) || r.isList(i.parentNode.parentNode))) { const t = r.getParentElement(i, function (e) { return this.isRangeFormatElement(e) && !this.isList(e) }.bind(r)), n = r.splitElement(i, null, t ? r.getElementDepth(t) + 1 : 0); n.parentNode.insertBefore(e, n) } else l.insertBefore(e, i), d(e, i); const u = r.getEdgeChildNodes(e.firstElementChild, e.lastElementChild); t.length > 1 ? this.setRange(u.sc, 0, u.ec, u.ec.textContent.length) : this.setRange(u.ec, u.ec.textContent.length, u.ec, u.ec.textContent.length), this.history.push(!1) }, detachRangeFormatElement: function (e, t, n, i, o) { const s = this.getRange(), a = s.startOffset, c = s.endOffset; let d = r.getListChildNodes(e, (function (t) { return t.parentNode === e })), u = e.parentNode, h = null, p = null, g = e.cloneNode(!1); const m = [], f = r.isList(n); let _ = !1, b = !1, v = !1; function y(t, n, i, l) { if (r.onlyZeroWidthSpace(n) && (n.innerHTML = r.zeroWidthSpace), 3 === n.nodeType) return t.insertBefore(n, i), n; const o = (v ? n : l).childNodes; let s = n.cloneNode(!1), a = null, c = null; for (; o[0];)c = o[0], !r._notTextNode(c) || r.isBreak(c) || r.isListCell(s) ? s.appendChild(c) : (s.childNodes.length > 0 && (a || (a = s), t.insertBefore(s, i), s = n.cloneNode(!1)), t.insertBefore(c, i), a || (a = c)); if (s.childNodes.length > 0) { if (r.isListCell(t) && r.isListCell(s) && r.isList(i)) if (f) { for (a = i; i;)s.appendChild(i), i = i.nextSibling; t.parentNode.insertBefore(s, t.nextElementSibling) } else { const t = l.nextElementSibling, n = r.detachNestedList(l, !1); if (e !== n || t !== l.nextElementSibling) { const t = s.childNodes; for (; t[0];)l.appendChild(t[0]); e = n, b = !0 } } else t.insertBefore(s, i); a || (a = s) } return a } for (let o, s, a, c = 0, C = d.length; c < C; c++)if (o = d[c], 3 !== o.nodeType || !r.isList(g)) if (v = !1, i && 0 === c && (h = t && t.length !== C && t[0] !== o ? g : e.previousSibling), t && (s = t.indexOf(o)), t && -1 === s) g || (g = e.cloneNode(!1)), g.appendChild(o); else { if (t && (a = t[s + 1]), g && g.children.length > 0 && (u.insertBefore(g, e), g = null), !f && r.isListCell(o)) if (a && r.getElementDepth(o) !== r.getElementDepth(a) && (r.isListCell(u) || r.getArrayItem(o.children, r.isList, !1))) { const t = o.nextElementSibling, n = r.detachNestedList(o, !1); e === n && t === o.nextElementSibling || (e = n, b = !0) } else { const t = o; o = r.createElement(i ? t.nodeName : r.isList(e.parentNode) || r.isListCell(e.parentNode) ? "LI" : r.isCell(e.parentNode) ? "DIV" : l.defaultTag); const n = r.isListCell(o), s = t.childNodes; for (; s[0] && (!r.isList(s[0]) || n);)o.appendChild(s[0]); r.copyFormatAttributes(o, t), v = !0 } else o = o.cloneNode(!1); if (!b && (i ? (m.push(o), r.removeItem(d[c])) : (n ? (_ || (u.insertBefore(n, e), _ = !0), o = y(n, o, null, d[c])) : o = y(u, o, e, d[c]), b || (t ? (p = o, h || (h = o)) : h || (h = p = o))), b)) { b = v = !1, d = r.getListChildNodes(e, (function (t) { return t.parentNode === e })), g = e.cloneNode(!1), u = e.parentNode, c = -1, C = d.length; continue } } const C = e.parentNode; let w = e.nextSibling; g && g.children.length > 0 && C.insertBefore(g, w), n ? h = n.previousSibling : h || (h = e.previousSibling), w = e.nextSibling, 0 === e.children.length || 0 === e.textContent.length ? r.removeItem(e) : r.removeEmptyNode(e, null); let x = null; if (i) x = { cc: C, sc: h, ec: w, removeArray: m }; else { h || (h = p), p || (p = h); const e = r.getEdgeChildNodes(h, p.parentNode ? h : p); x = { cc: (e.sc || e.ec).parentNode, sc: e.sc, ec: e.ec } } if (this.effectNode = null, o) return x; !i && x && (t ? this.setRange(x.sc, a, x.ec, c) : this.setRange(x.sc, 0, x.sc, 0)), this.history.push(!1) }, detachList: function (e, t) { let n = {}, i = !1, l = !1, o = null, s = null; const a = function (e) { return !this.isComponent(e) }.bind(r); for (let c, d, u, h, p = 0, g = e.length; p < g; p++) { if (u = p === g - 1, d = r.getRangeFormatElement(e[p], a), h = r.isList(d), !c && h) c = d, n = { r: c, f: [r.getParentElement(e[p], "LI")] }, 0 === p && (i = !0); else if (c && h) if (c !== d) { const a = this.detachRangeFormatElement(n.f[0].parentNode, n.f, null, t, !0); d = e[p].parentNode, i && (o = a.sc, i = !1), u && (s = a.ec), h ? (c = d, n = { r: c, f: [r.getParentElement(e[p], "LI")] }, u && (l = !0)) : c = null } else n.f.push(r.getParentElement(e[p], "LI")), u && (l = !0); if (u && r.isList(c)) { const e = this.detachRangeFormatElement(n.f[0].parentNode, n.f, null, t, !0); (l || 1 === g) && (s = e.ec), i && (o = e.sc || s) } } return { sc: o, ec: s } }, nodeChange: function (e, t, n, i) { this._resetRangeToTextNode(); let l = this.getRange_addLine(this.getRange(), null); t = !!(t && t.length > 0) && t, n = !!(n && n.length > 0) && n; const o = !e, s = o && !n && !t; let c = l.startContainer, d = l.startOffset, u = l.endContainer, h = l.endOffset; if (s && l.collapsed && r.isFormatElement(c.parentNode) && r.isFormatElement(u.parentNode) || c === u && 1 === c.nodeType && r.isNonEditable(c)) return; if (l.collapsed && !s && 1 === c.nodeType && !r.isBreak(c) && !r.isComponent(c)) { let e = null; const t = c.childNodes[d]; t && (e = t.nextSibling ? r.isBreak(t) ? t : t.nextSibling : null); const n = r.createTextNode(r.zeroWidthSpace); c.insertBefore(n, e), this.setRange(n, 1, n, 1), l = this.getRange(), c = l.startContainer, d = l.startOffset, u = l.endContainer, h = l.endOffset } r.isFormatElement(c) && (c = c.childNodes[d] || c.firstChild, d = 0), r.isFormatElement(u) && (u = u.childNodes[h] || u.lastChild, h = u.textContent.length), o && (e = r.createElement("DIV")); const p = a.RegExp, g = e.nodeName; if (!s && c === u && !n && e) { let t = c, n = 0; const i = [], l = e.style; for (let e = 0, t = l.length; e < t; e++)i.push(l[e]); const s = e.classList; for (let e = 0, t = s.length; e < t; e++)i.push("." + s[e]); if (i.length > 0) { for (; !r.isFormatElement(t) && !r.isWysiwygDiv(t);) { for (let l = 0; l < i.length; l++)if (1 === t.nodeType) { const s = i[l], a = !!/^\./.test(s) && new p("\\s*" + s.replace(/^\./, "") + "(\\s+|$)", "ig"), r = o ? !!t.style[s] : !!t.style[s] && !!e.style[s] && t.style[s] === e.style[s], c = !1 !== a && (o ? !!t.className.match(a) : !!t.className.match(a) && !!e.className.match(a)); (r || c) && n++ } t = t.parentNode } if (n >= i.length) return } } let m, f = {}, _ = {}, b = "", v = "", y = ""; if (t) { for (let e, n = 0, i = t.length; n < i; n++)e = t[n], /^\./.test(e) ? v += (v ? "|" : "\\s*(?:") + e.replace(/^\./, "") : b += (b ? "|" : "(?:;|^|\\s)(?:") + e; b && (b += ")\\s*:[^;]*\\s*(?:;|$)", b = new p(b, "ig")), v && (v += ")(?=\\s+|$)", v = new p(v, "ig")) } if (n) { y = "^(?:" + n[0]; for (let e = 1; e < n.length; e++)y += "|" + n[e]; y += ")$", y = new p(y, "i") } const C = a.Boolean, w = { v: !1 }, x = function (e) { const t = e.cloneNode(!1); if (3 === t.nodeType || r.isBreak(t)) return t; if (s) return null; const n = !y && o || y && y.test(t.nodeName); if (n && !i) return w.v = !0, null; const l = t.style.cssText; let a = ""; b && l.length > 0 && (a = l.replace(b, "").trim(), a !== l && (w.v = !0)); const c = t.className; let d = ""; return v && c.length > 0 && (d = c.replace(v, "").trim(), d !== c && (w.v = !0)), (!o || !v && c || !b && l || a || d || !n) && (a || d || t.nodeName !== g || C(b) !== C(l) || C(v) !== C(c)) ? (b && l.length > 0 && (t.style.cssText = a), t.style.cssText || t.removeAttribute("style"), v && c.length > 0 && (t.className = d.trim()), t.className.trim() || t.removeAttribute("class"), t.style.cssText || t.className || t.nodeName !== g && !n ? t : (w.v = !0, null)) : (w.v = !0, null) }, E = this.getSelectedElements(null); l = this.getRange(), c = l.startContainer, d = l.startOffset, u = l.endContainer, h = l.endOffset, r.getFormatElement(c, null) || (c = r.getChildElement(E[0], (function (e) { return 3 === e.nodeType }), !1), d = 0), r.getFormatElement(u, null) || (u = r.getChildElement(E[E.length - 1], (function (e) { return 3 === e.nodeType }), !1), h = u.textContent.length); const S = r.getFormatElement(c, null) === r.getFormatElement(u, null), N = E.length - (S ? 0 : 1); m = e.cloneNode(!1); const T = s || o && function (e) { for (let t = 0, n = e.length; t < n; t++)if (r._isMaintainedNode(e[t]) || r._isSizeNode(e[t])) return !0; return !1 }(n), k = o || r._isSizeNode(m), L = this._util_getMaintainedNode.bind(r, T, k), B = this._util_isMaintainedNode.bind(r, T, k); if (S) { const e = this._nodeChange_oneLine(E[0], m, x, c, d, u, h, s, o, l.collapsed, w, L, B); f.container = e.startContainer, f.offset = e.startOffset, _.container = e.endContainer, _.offset = e.endOffset, f.container === _.container && r.onlyZeroWidthSpace(f.container) && (f.offset = _.offset = 1), this._setCommonListStyle(e.ancestor, null) } else { N > 0 && (m = e.cloneNode(!1), _ = this._nodeChange_endLine(E[N], m, x, u, h, s, o, w, L, B)); for (let t, n = N - 1; n > 0; n--)m = e.cloneNode(!1), t = this._nodeChange_middleLine(E[n], m, x, s, o, w, _.container), t.endContainer && (_.ancestor = null, _.container = t.endContainer), this._setCommonListStyle(t.ancestor, null); m = e.cloneNode(!1), f = this._nodeChange_startLine(E[0], m, x, c, d, s, o, w, L, B, _.container), f.endContainer && (_.ancestor = null, _.container = f.endContainer), N <= 0 ? _ = f : _.container || (_.ancestor = null, _.container = f.container, _.offset = f.container.textContent.length), this._setCommonListStyle(f.ancestor, null), this._setCommonListStyle(_.ancestor || r.getFormatElement(_.container), null) } this.controllersOff(), this.setRange(f.container, f.offset, _.container, _.offset), this.history.push(!1) }, _setCommonListStyle: function (e, t) { if (!r.isListCell(e)) return; t || e.removeAttribute("style"); const n = r.getArrayItem((t || e).childNodes, (function (e) { return !r.isBreak(e) && !r.onlyZeroWidthSpace(e.textContent.trim()) }), !0); if (n[0] && 1 === n.length) { if (!(t = n[0]) || 1 !== t.nodeType) return; const i = t.style, l = e.style; /STRONG/i.test(t.nodeName) ? l.fontWeight = "bold" : i.fontWeight && (l.fontWeight = i.fontWeight), i.color && (l.color = i.color), i.fontSize && (l.fontSize = i.fontSize), this._setCommonListStyle(e, t) } }, _stripRemoveNode: function (e) { const t = e.parentNode; if (!e || 3 === e.nodeType || !t) return; const n = e.childNodes; for (; n[0];)t.insertBefore(n[0], e); t.removeChild(e) }, _util_getMaintainedNode: function (e, t, n) { return !n || e ? null : this.getParentElement(n, this._isMaintainedNode.bind(this)) || (t ? null : this.getParentElement(n, this._isSizeNode.bind(this))) }, _util_isMaintainedNode: function (e, t, n) { if (!n || e || 1 !== n.nodeType) return !1; const i = this._isMaintainedNode(n); return this.getParentElement(n, this._isMaintainedNode.bind(this)) ? i : i || !t && this._isSizeNode(n) }, _nodeChange_oneLine: function (e, t, n, i, l, o, s, c, d, u, h, p, g) { let m = i.parentNode; for (; !(m.nextSibling || m.previousSibling || r.isFormatElement(m.parentNode) || r.isWysiwygDiv(m.parentNode)) && m.nodeName !== t.nodeName;)m = m.parentNode; if (!d && m === o.parentNode && m.nodeName === t.nodeName && r.onlyZeroWidthSpace(i.textContent.slice(0, l)) && r.onlyZeroWidthSpace(o.textContent.slice(s))) { const e = m.childNodes; let n = !0; for (let t, l, s, a, c = 0, d = e.length; c < d; c++)if (t = e[c], a = !r.onlyZeroWidthSpace(t), t !== i) if (t !== o) { if (!l && a || l && s && a) { n = !1; break } } else s = !0; else l = !0; if (n) return r.copyTagAttributes(m, t), { startContainer: i, startOffset: l, endContainer: o, endOffset: s } } h.v = !1; const f = e, _ = [t], b = e.cloneNode(!1), v = i === o; let y, C, w, x, E, S = i, N = l, T = o, k = s, L = !1, B = !1; const A = a.RegExp; function M(e) { const t = new A("(?:;|^|\\s)(?:" + x + "null)\\s*:[^;]*\\s*(?:;|$)", "ig"); let n = ""; return t && e.style.cssText.length > 0 && (n = t.test(e.style.cssText)), !n } if (function e(i, l) { const o = i.childNodes; for (let i, s = 0, a = o.length; s < a; s++) { let a = o[s]; if (!a) continue; let d, h = l; if (!L && a === S) { let e = b; E = p(a); const o = r.createTextNode(1 === S.nodeType ? "" : S.substringData(0, N)), s = r.createTextNode(1 === S.nodeType ? "" : S.substringData(N, v && k >= N ? k - N : S.data.length - N)); if (E) { const t = p(l); if (t && t.parentNode !== e) { let n = t, i = null; for (; n.parentNode !== e;) { for (l = i = n.parentNode.cloneNode(!1); n.childNodes[0];)i.appendChild(n.childNodes[0]); n.appendChild(i), n = n.parentNode } n.parentNode.appendChild(t) } E = E.cloneNode(!1) } r.onlyZeroWidthSpace(o) || l.appendChild(o); const c = p(l); for (c && (E = c), E && (e = E), C = a, y = [], x = ""; C !== e && C !== f && null !== C;)i = g(C) ? null : n(C), i && 1 === C.nodeType && M(C) && (y.push(i), x += C.style.cssText.substr(0, C.style.cssText.indexOf(":")) + "|"), C = C.parentNode; const d = y.pop() || s; for (w = C = d; y.length > 0;)C = y.pop(), w.appendChild(C), w = C; if (t.appendChild(d), e.appendChild(t), E && !p(T) && (t = t.cloneNode(!1), b.appendChild(t), _.push(t)), S = s, N = 0, L = !0, C !== s && C.appendChild(S), !v) continue } if (B || a !== T) { if (L) { if (1 === a.nodeType && !r.isBreak(a)) { r._isIgnoreNodeChange(a) ? (b.appendChild(a.cloneNode(!0)), u || (t = t.cloneNode(!1), b.appendChild(t), _.push(t))) : e(a, a); continue } C = a, y = [], x = ""; const o = []; for (; null !== C.parentNode && C !== f && C !== t;)i = B ? C.cloneNode(!1) : n(C), 1 === C.nodeType && !r.isBreak(a) && i && M(C) && (g(C) ? E || o.push(i) : y.push(i), x += C.style.cssText.substr(0, C.style.cssText.indexOf(":")) + "|"), C = C.parentNode; y = y.concat(o); const s = y.pop() || a; for (w = C = s; y.length > 0;)C = y.pop(), w.appendChild(C), w = C; if (!g(t.parentNode) || g(s) || r.onlyZeroWidthSpace(t) || (t = t.cloneNode(!1), b.appendChild(t), _.push(t)), B || E || !g(s)) s === a ? l = B ? b : t : B ? (b.appendChild(s), l = C) : (t.appendChild(s), l = C); else { t = t.cloneNode(!1); const e = s.childNodes; for (let n = 0, i = e.length; n < i; n++)t.appendChild(e[n]); s.appendChild(t), b.appendChild(s), _.push(t), l = t.children.length > 0 ? C : t } if (E && 3 === a.nodeType) if (p(a)) { const e = r.getParentElement(l, function (e) { return this._isMaintainedNode(e.parentNode) || e.parentNode === b }.bind(r)); E.appendChild(e), t = e.cloneNode(!1), _.push(t), b.appendChild(t) } else E = null } d = a.cloneNode(!1), l.appendChild(d), 1 !== a.nodeType || r.isBreak(a) || (h = d), e(a, h) } else { E = p(a); const e = r.createTextNode(1 === T.nodeType ? "" : T.substringData(k, T.length - k)), l = r.createTextNode(v || 1 === T.nodeType ? "" : T.substringData(0, k)); if (E ? E = E.cloneNode(!1) : g(t.parentNode) && !E && (t = t.cloneNode(!1), b.appendChild(t), _.push(t)), !r.onlyZeroWidthSpace(e)) { C = a, x = "", y = []; const t = []; for (; C !== b && C !== f && null !== C;)1 === C.nodeType && M(C) && (g(C) ? t.push(C.cloneNode(!1)) : y.push(C.cloneNode(!1)), x += C.style.cssText.substr(0, C.style.cssText.indexOf(":")) + "|"), C = C.parentNode; for (y = y.concat(t), d = w = C = y.pop() || e; y.length > 0;)C = y.pop(), w.appendChild(C), w = C; b.appendChild(d), C.textContent = e.data } if (E && d) { const e = p(d); e && (E = e) } for (C = a, y = [], x = ""; C !== b && C !== f && null !== C;)i = g(C) ? null : n(C), i && 1 === C.nodeType && M(C) && (y.push(i), x += C.style.cssText.substr(0, C.style.cssText.indexOf(":")) + "|"), C = C.parentNode; const o = y.pop() || l; for (w = C = o; y.length > 0;)C = y.pop(), w.appendChild(C), w = C; E ? ((t = t.cloneNode(!1)).appendChild(o), E.insertBefore(t, E.firstChild), b.appendChild(E), _.push(t), E = null) : t.appendChild(o), T = l, k = l.data.length, B = !0, !c && u && (t = l, l.textContent = r.zeroWidthSpace), C !== l && C.appendChild(T) } } }(e, b), d && !c && !h.v) return { ancestor: e, startContainer: i, startOffset: l, endContainer: o, endOffset: s }; if (c = c && d) for (let e = 0; e < _.length; e++) { let t, n, i, l = _[e]; if (u) t = r.createTextNode(r.zeroWidthSpace), b.replaceChild(t, l); else { const e = l.childNodes; for (n = e[0]; e[0];)i = e[0], b.insertBefore(i, l); r.removeItem(l) } 0 === e && (u ? S = T = t : (S = n, T = i)) } else { if (d) for (let e = 0; e < _.length; e++)this._stripRemoveNode(_[e]); u && (S = T = t) } r.removeEmptyNode(b, t), u && (N = S.textContent.length, k = T.textContent.length); const z = c || 0 === T.textContent.length; r.isBreak(T) || 0 !== T.textContent.length || (r.removeItem(T), T = S), k = z ? T.textContent.length : k; const H = { s: 0, e: 0 }, I = r.getNodePath(S, b, H), R = !T.parentNode; R && (T = S); const D = { s: 0, e: 0 }, O = r.getNodePath(T, b, R || z ? null : D); N += H.s, k = u ? N : R ? S.textContent.length : z ? k + H.s : k + D.s; const F = r.mergeSameTags(b, [I, O], !0); return e.parentNode.replaceChild(b, e), S = r.getNodeFromPath(I, b), T = r.getNodeFromPath(O, b), { ancestor: b, startContainer: S, startOffset: N + F[0], endContainer: T, endOffset: k + F[1] } }, _nodeChange_startLine: function (e, t, n, i, l, o, s, a, c, d, u) { let h = i.parentNode; for (; !(h.nextSibling || h.previousSibling || r.isFormatElement(h.parentNode) || r.isWysiwygDiv(h.parentNode)) && h.nodeName !== t.nodeName;)h = h.parentNode; if (!s && h.nodeName === t.nodeName && !r.isFormatElement(h) && !h.nextSibling && r.onlyZeroWidthSpace(i.textContent.slice(0, l))) { let n = !0, o = i.previousSibling; for (; o;) { if (!r.onlyZeroWidthSpace(o)) { n = !1; break } o = o.previousSibling } if (n) return r.copyTagAttributes(h, t), { ancestor: e, container: i, offset: l } } a.v = !1; const p = e, g = [t], m = e.cloneNode(!1); let f, _, b, v, y = i, C = l, w = !1; if (function e(i, l) { const o = i.childNodes; for (let i, s, a = 0, h = o.length; a < h; a++) { const h = o[a]; if (!h) continue; let x = l; if (w && !r.isBreak(h)) { if (1 === h.nodeType) { if (r._isIgnoreNodeChange(h)) { if (t = t.cloneNode(!1), s = h.cloneNode(!0), m.appendChild(s), m.appendChild(t), g.push(t), u && h.contains(u)) { const e = r.getNodePath(u, h); u = r.getNodeFromPath(e, s) } } else e(h, h); continue } _ = h, f = []; const o = []; for (; null !== _.parentNode && _ !== p && _ !== t;)i = n(_), 1 === _.nodeType && i && (d(_) ? v || o.push(i) : f.push(i)), _ = _.parentNode; f = f.concat(o); const a = f.length > 0, y = f.pop() || h; for (b = _ = y; f.length > 0;)_ = f.pop(), b.appendChild(_), b = _; if (d(t.parentNode) && !d(y) && (t = t.cloneNode(!1), m.appendChild(t), g.push(t)), !v && d(y)) { t = t.cloneNode(!1); const e = y.childNodes; for (let n = 0, i = e.length; n < i; n++)t.appendChild(e[n]); y.appendChild(t), m.appendChild(y), l = d(_) ? t : _, g.push(t) } else a ? (t.appendChild(y), l = _) : l = t; if (v && 3 === h.nodeType) if (c(h)) { const e = r.getParentElement(l, function (e) { return this._isMaintainedNode(e.parentNode) || e.parentNode === m }.bind(r)); v.appendChild(e), t = e.cloneNode(!1), g.push(t), m.appendChild(t) } else v = null } if (w || h !== y) i = w ? n(h) : h.cloneNode(!1), i && (l.appendChild(i), 1 !== h.nodeType || r.isBreak(h) || (x = i)), e(h, x); else { let e = m; v = c(h); const o = r.createTextNode(1 === y.nodeType ? "" : y.substringData(0, C)), s = r.createTextNode(1 === y.nodeType ? "" : y.substringData(C, y.length - C)); if (v) { const t = c(l); if (t && t.parentNode !== e) { let n = t, i = null; for (; n.parentNode !== e;) { for (l = i = n.parentNode.cloneNode(!1); n.childNodes[0];)i.appendChild(n.childNodes[0]); n.appendChild(i), n = n.parentNode } n.parentNode.appendChild(t) } v = v.cloneNode(!1) } r.onlyZeroWidthSpace(o) || l.appendChild(o); const a = c(l); for (a && (v = a), v && (e = v), _ = l, f = []; _ !== e && null !== _;)i = n(_), 1 === _.nodeType && i && f.push(i), _ = _.parentNode; const d = f.pop() || l; for (b = _ = d; f.length > 0;)_ = f.pop(), b.appendChild(_), b = _; d !== l ? (t.appendChild(d), l = _) : l = t, r.isBreak(h) && t.appendChild(h.cloneNode(!1)), e.appendChild(t), y = s, C = 0, w = !0, l.appendChild(y) } } }(e, m), s && !o && !a.v) return { ancestor: e, container: i, offset: l, endContainer: u }; if (o = o && s) for (let e = 0; e < g.length; e++) { let t = g[e]; const n = t.childNodes, i = n[0]; for (; n[0];)m.insertBefore(n[0], t); r.removeItem(t), 0 === e && (y = i) } else if (s) { t = t.firstChild; for (let e = 0; e < g.length; e++)this._stripRemoveNode(g[e]) } if (o || 0 !== m.childNodes.length) { r.removeEmptyNode(m, t), r.onlyZeroWidthSpace(m.textContent) && (y = m.firstChild, C = 0); const n = { s: 0, e: 0 }, i = r.getNodePath(y, m, n); C += n.s; const l = r.mergeSameTags(m, [i], !0); e.parentNode.replaceChild(m, e), y = r.getNodeFromPath(i, m), C += l[0] } else e.childNodes ? y = e.childNodes[0] : (y = r.createTextNode(r.zeroWidthSpace), e.appendChild(y)); return { ancestor: m, container: y, offset: C, endContainer: u } }, _nodeChange_middleLine: function (e, t, n, i, l, o, s) { if (!l) { let n = null; s && e.contains(s) && (n = r.getNodePath(s, e)); const i = e.cloneNode(!0), l = t.nodeName, o = t.style.cssText, a = t.className; let c, d = i.childNodes, u = 0, h = d.length; for (; u < h && (c = d[u], 3 !== c.nodeType); u++) { if (c.nodeName !== l) { if (!r.isBreak(c) && r._isIgnoreNodeChange(c)) continue; if (1 === h) { d = c.childNodes, h = d.length, u = -1; continue } break } c.style.cssText += o, r.addClass(c, a) } if (h > 0 && u === h) return e.innerHTML = i.innerHTML, { ancestor: e, endContainer: n ? r.getNodeFromPath(n, e) : null } } o.v = !1; const a = e.cloneNode(!1), c = [t]; let d = !0; if (function e(i, l) { const o = i.childNodes; for (let i, u, h = 0, p = o.length; h < p; h++) { let p = o[h]; if (!p) continue; let g = l; if (r.isBreak(p) || !r._isIgnoreNodeChange(p)) i = n(p), i && (d = !1, l.appendChild(i), 1 === p.nodeType && (g = i)), r.isBreak(p) || e(p, g); else if (t.childNodes.length > 0 && (a.appendChild(t), t = t.cloneNode(!1)), u = p.cloneNode(!0), a.appendChild(u), a.appendChild(t), c.push(t), l = t, s && p.contains(s)) { const e = r.getNodePath(s, p); s = r.getNodeFromPath(e, u) } } }(e, t), d || l && !i && !o.v) return { ancestor: e, endContainer: s }; if (a.appendChild(t), i && l) for (let e = 0; e < c.length; e++) { let t = c[e]; const n = t.childNodes; for (; n[0];)a.insertBefore(n[0], t); r.removeItem(t) } else if (l) { t = t.firstChild; for (let e = 0; e < c.length; e++)this._stripRemoveNode(c[e]) } return r.removeEmptyNode(a, t), r.mergeSameTags(a, null, !0), e.parentNode.replaceChild(a, e), { ancestor: a, endContainer: s } }, _nodeChange_endLine: function (e, t, n, i, l, o, s, a, c, d) { let u = i.parentNode; for (; !(u.nextSibling || u.previousSibling || r.isFormatElement(u.parentNode) || r.isWysiwygDiv(u.parentNode)) && u.nodeName !== t.nodeName;)u = u.parentNode; if (!s && u.nodeName === t.nodeName && !r.isFormatElement(u) && !u.previousSibling && r.onlyZeroWidthSpace(i.textContent.slice(l))) { let n = !0, o = i.nextSibling; for (; o;) { if (!r.onlyZeroWidthSpace(o)) { n = !1; break } o = o.nextSibling } if (n) return r.copyTagAttributes(u, t), { ancestor: e, container: i, offset: l } } a.v = !1; const h = e, p = [t], g = e.cloneNode(!1); let m, f, _, b, v = i, y = l, C = !1; if (function e(i, l) { const o = i.childNodes; for (let i, s = o.length - 1; 0 <= s; s--) { const a = o[s]; if (!a) continue; let u = l; if (C && !r.isBreak(a)) { if (1 === a.nodeType) { if (r._isIgnoreNodeChange(a)) { t = t.cloneNode(!1); const e = a.cloneNode(!0); g.insertBefore(e, l), g.insertBefore(t, e), p.push(t) } else e(a, a); continue } f = a, m = []; const o = []; for (; null !== f.parentNode && f !== h && f !== t;)i = n(f), i && 1 === f.nodeType && (d(f) ? b || o.push(i) : m.push(i)), f = f.parentNode; m = m.concat(o); const s = m.length > 0, u = m.pop() || a; for (_ = f = u; m.length > 0;)f = m.pop(), _.appendChild(f), _ = f; if (d(t.parentNode) && !d(u) && (t = t.cloneNode(!1), g.insertBefore(t, g.firstChild), p.push(t)), !b && d(u)) { t = t.cloneNode(!1); const e = u.childNodes; for (let n = 0, i = e.length; n < i; n++)t.appendChild(e[n]); u.appendChild(t), g.insertBefore(u, g.firstChild), p.push(t), l = t.children.length > 0 ? f : t } else s ? (t.insertBefore(u, t.firstChild), l = f) : l = t; if (b && 3 === a.nodeType) if (c(a)) { const e = r.getParentElement(l, function (e) { return this._isMaintainedNode(e.parentNode) || e.parentNode === g }.bind(r)); b.appendChild(e), t = e.cloneNode(!1), p.push(t), g.insertBefore(t, g.firstChild) } else b = null } if (C || a !== v) i = C ? n(a) : a.cloneNode(!1), i && (l.insertBefore(i, l.firstChild), 1 !== a.nodeType || r.isBreak(a) || (u = i)), e(a, u); else { b = c(a); const e = r.createTextNode(1 === v.nodeType ? "" : v.substringData(y, v.length - y)), o = r.createTextNode(1 === v.nodeType ? "" : v.substringData(0, y)); if (b) { b = b.cloneNode(!1); const e = c(l); if (e && e.parentNode !== g) { let t = e, n = null; for (; t.parentNode !== g;) { for (l = n = t.parentNode.cloneNode(!1); t.childNodes[0];)n.appendChild(t.childNodes[0]); t.appendChild(n), t = t.parentNode } t.parentNode.insertBefore(e, t.parentNode.firstChild) } b = b.cloneNode(!1) } else d(t.parentNode) && !b && (t = t.cloneNode(!1), g.appendChild(t), p.push(t)); for (r.onlyZeroWidthSpace(e) || l.insertBefore(e, l.firstChild), f = l, m = []; f !== g && null !== f;)i = d(f) ? null : n(f), i && 1 === f.nodeType && m.push(i), f = f.parentNode; const s = m.pop() || l; for (_ = f = s; m.length > 0;)f = m.pop(), _.appendChild(f), _ = f; s !== l ? (t.insertBefore(s, t.firstChild), l = f) : l = t, r.isBreak(a) && t.appendChild(a.cloneNode(!1)), b ? (b.insertBefore(t, b.firstChild), g.insertBefore(b, g.firstChild), b = null) : g.insertBefore(t, g.firstChild), v = o, y = o.data.length, C = !0, l.insertBefore(v, l.firstChild) } } }(e, g), s && !o && !a.v) return { ancestor: e, container: i, offset: l }; if (o = o && s) for (let e = 0; e < p.length; e++) { let t = p[e]; const n = t.childNodes; let i = null; for (; n[0];)i = n[0], g.insertBefore(i, t); r.removeItem(t), e === p.length - 1 && (v = i, y = i.textContent.length) } else if (s) { t = t.firstChild; for (let e = 0; e < p.length; e++)this._stripRemoveNode(p[e]) } if (o || 0 !== g.childNodes.length) { if (!s && 0 === t.textContent.length) return r.removeEmptyNode(g, null), { ancestor: null, container: null, offset: 0 }; r.removeEmptyNode(g, t), r.onlyZeroWidthSpace(g.textContent) ? (v = g.firstChild, y = v.textContent.length) : r.onlyZeroWidthSpace(v) && (v = t, y = 1); const n = { s: 0, e: 0 }, i = r.getNodePath(v, g, n); y += n.s; const l = r.mergeSameTags(g, [i], !0); e.parentNode.replaceChild(g, e), v = r.getNodeFromPath(i, g), y += l[0] } else e.childNodes ? v = e.childNodes[0] : (v = r.createTextNode(r.zeroWidthSpace), e.appendChild(v)); return { ancestor: g, container: v, offset: y } }, actionCall: function (t, n, i) { if (n) { if (/more/i.test(n) && i !== this._moreLayerActiveButton) { const n = e.element.toolbar.querySelector("." + t); return void (n && (this._moreLayerActiveButton && (e.element.toolbar.querySelector("." + this._moreLayerActiveButton.getAttribute("data-command")).style.display = "none", r.removeClass(this._moreLayerActiveButton, "on")), r.addClass(i, "on"), this._moreLayerActiveButton = i, n.style.display = "block", u._showToolbarBalloon(), u._showToolbarInline())) } if (/submenu/.test(n) && (null === this._menuTray[t] || i !== this.submenuActiveButton)) return void this.callPlugin(t, this.submenuOn.bind(this, i), i); if (/dialog/.test(n)) return void this.callPlugin(t, this.plugins[t].open.bind(this), i); if (/command/.test(n)) this.callPlugin(t, this.plugins[t].action.bind(this), i); else { if (/container/.test(n) && (null === this._menuTray[t] || i !== this.containerActiveButton)) return void this.callPlugin(t, this.containerOn.bind(this, i), i); /fileBrowser/.test(n) && this.callPlugin(t, this.plugins[t].open.bind(this, null), i) } } else t && this.commandHandler(i, t); if (/more/i.test(n)) { const t = e.element.toolbar.querySelector("." + this._moreLayerActiveButton.getAttribute("data-command")); t && (r.removeClass(this._moreLayerActiveButton, "on"), this._moreLayerActiveButton = null, t.style.display = "none", u._showToolbarBalloon(), u._showToolbarInline()) } else /submenu/.test(n) ? this.submenuOff() : /command/.test(n) || (this.submenuOff(), this.containerOff()) }, commandHandler: function (t, n) { switch (n) { case "copy": case "cut": this.execCommand(n); break; case "paste": break; case "selectAll": const i = e.element.wysiwyg; let o = r.getChildElement(i.firstChild, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !1) || i.firstChild, s = r.getChildElement(i.lastChild, (function (e) { return 0 === e.childNodes.length || 3 === e.nodeType }), !0) || i.lastChild; if (!o || !s) return; if (r.isMedia(o)) { const e = this.getFileComponent(o), t = r.createElement("BR"), n = r.createElement(l.defaultTag); n.appendChild(t), o = e ? e.component : o, o.parentNode.insertBefore(n, o), o = t } if (r.isMedia(s)) { const e = r.createElement("BR"), t = r.createElement(l.defaultTag); t.appendChild(e), i.appendChild(t), s = e } this.setRange(o, 0, s, s.textContent.length); break; case "codeView": this.toggleCodeView(); break; case "fullScreen": this.toggleFullScreen(t); break; case "indent": case "outdent": this.indent(n); break; case "undo": this.history.undo(); break; case "redo": this.history.redo(); break; case "removeFormat": this.removeFormat(), this.focus(); break; case "print": this.print(); break; case "preview": this.preview(); break; case "showBlocks": this.toggleDisplayBlocks(); break; case "save": if ("function" == typeof l.callBackSave) l.callBackSave(this.getContents(!1), this._variable.isChanged); else { if (!this._variable.isChanged || "function" != typeof h.save) throw Error("[SUNEDITOR.core.commandHandler.fail] Please register call back function in creation option. (callBackSave : Function)"); h.save() } this._variable.isChanged = !1, e.tool.save && e.tool.save.setAttribute("disabled", !0); break; default: n = this._defaultCommand[n.toLowerCase()] || n, this.commandMap[n] || (this.commandMap[n] = t); const a = this._variable.currentNodesMap, c = a.indexOf(n) > -1 ? null : r.createElement(n); let d = n; /^SUB$/i.test(n) && a.indexOf("SUP") > -1 ? d = "SUP" : /^SUP$/i.test(n) && a.indexOf("SUB") > -1 && (d = "SUB"), this.nodeChange(c, null, [d], !1), this.focus() } }, removeFormat: function () { this.nodeChange(null, null, null, null) }, indent: function (e) { const t = this.getRange(), n = this.getSelectedElements(null), i = [], o = "indent" !== e, s = l.rtl ? "marginRight" : "marginLeft"; let a = t.startContainer, c = t.endContainer, d = t.startOffset, u = t.endOffset; for (let e, t, l = 0, a = n.length; l < a; l++)e = n[l], r.isListCell(e) && this.plugins.list ? (o || e.previousElementSibling) && i.push(e) : (t = /\d+/.test(e.style[s]) ? r.getNumber(e.style[s], 0) : 0, o ? t -= 25 : t += 25, r.setStyle(e, s, t <= 0 ? "" : t + "px")); i.length > 0 && this.plugins.list.editInsideList.call(this, o, i), this.effectNode = null, this.setRange(a, d, c, u), this.history.push(!1) }, toggleDisplayBlocks: function () { const t = e.element.wysiwyg; r.toggleClass(t, "se-show-block"), r.hasClass(t, "se-show-block") ? r.addClass(this._styleCommandMap.showBlocks, "active") : r.removeClass(this._styleCommandMap.showBlocks, "active"), this._resourcesStateChange() }, toggleCodeView: function () { const t = this._variable.isCodeView; this.controllersOff(), r.setDisabledButtons(!t, this.codeViewDisabledButtons), t ? (this._setCodeDataToEditor(), e.element.wysiwygFrame.scrollTop = 0, e.element.code.style.display = "none", e.element.wysiwygFrame.style.display = "block", this._variable._codeOriginCssText = this._variable._codeOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/, "display: none"), this._variable._wysiwygOriginCssText = this._variable._wysiwygOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/, "display: block"), "auto" !== l.height || l.codeMirrorEditor || (e.element.code.style.height = "0px"), this._variable.isCodeView = !1, this._variable.isFullScreen || (this._notHideToolbar = !1, /balloon|balloon-always/i.test(l.mode) && (e.element._arrow.style.display = "", this._isInline = !1, this._isBalloon = !0, u._hideToolbar())), this.nativeFocus(), r.removeClass(this._styleCommandMap.codeView, "active"), this.history.push(!1)) : (this._setEditorDataToCodeView(), this._variable._codeOriginCssText = this._variable._codeOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/, "display: block"), this._variable._wysiwygOriginCssText = this._variable._wysiwygOriginCssText.replace(/(\s?display(\s+)?:(\s+)?)[a-zA-Z]+(?=;)/, "display: none"), "auto" !== l.height || l.codeMirrorEditor || (e.element.code.style.height = e.element.code.scrollHeight > 0 ? e.element.code.scrollHeight + "px" : "auto"), l.codeMirrorEditor && l.codeMirrorEditor.refresh(), this._variable.isCodeView = !0, this._variable.isFullScreen || (this._notHideToolbar = !0, this._isBalloon && (e.element._arrow.style.display = "none", e.element.toolbar.style.left = "", this._isInline = !0, this._isBalloon = !1, u._showToolbarInline())), this._variable._range = null, e.element.code.focus(), r.addClass(this._styleCommandMap.codeView, "active")), this._checkPlaceholder(), "function" == typeof h.toggleCodeView && h.toggleCodeView(this._variable.isCodeView, this) }, _setCodeDataToEditor: function () { const t = this._getCodeView(); if (l.fullPage) { const e = this._parser.parseFromString(t, "text/html"), n = e.head.children; for (let t = 0, i = n.length; t < i; t++)/^script$/i.test(n[t].tagName) && (e.head.removeChild(n[t]), t--, i--); this._wd.head.innerHTML = e.head.innerHTML, this._wd.body.innerHTML = this.convertContentsForEditor(e.body.innerHTML); const i = e.body.attributes; for (let e = 0, t = i.length; e < t; e++)"contenteditable" !== i[e].name && this._wd.body.setAttribute(i[e].name, i[e].value); if (!r.hasClass(this._wd.body, "sun-editor-editable")) { const e = l._editableClass.split(" "); for (let t = 0; t < e.length; t++)r.addClass(this._wd.body, l._editableClass[t]) } } else e.element.wysiwyg.innerHTML = t.length > 0 ? this.convertContentsForEditor(t) : "<" + l.defaultTag + ">
      " }, _setEditorDataToCodeView: function () { const t = this.convertHTMLForCodeView(e.element.wysiwyg); let n = ""; if (l.fullPage) { const e = r.getAttributesToString(this._wd.body, null); n = "\n\n" + this._wd.head.outerHTML.replace(/>(?!\n)/g, ">\n") + "\n" + t + "\n" } else n = t; e.element.code.style.display = "block", e.element.wysiwygFrame.style.display = "none", this._setCodeView(n) }, toggleFullScreen: function (t) { const n = e.element.topArea, i = e.element.toolbar, o = e.element.editorArea, d = e.element.wysiwygFrame, p = e.element.code, g = this._variable; this.controllersOff(), g.isFullScreen ? (g.isFullScreen = !1, d.style.cssText = g._wysiwygOriginCssText, p.style.cssText = g._codeOriginCssText, i.style.cssText = "", o.style.cssText = g._editorAreaOriginCssText, n.style.cssText = g._originCssText, s.body.style.overflow = g._bodyOverflow, l.toolbarContainer && l.toolbarContainer.appendChild(i), l.stickyToolbar > -1 && r.removeClass(i, "se-toolbar-sticky"), g._fullScreenAttrs.sticky && !l.toolbarContainer && (g._fullScreenAttrs.sticky = !1, e.element._stickyDummy.style.display = "block", r.addClass(i, "se-toolbar-sticky")), this._isInline = g._fullScreenAttrs.inline, this._isBalloon = g._fullScreenAttrs.balloon, this._isInline && u._showToolbarInline(), l.toolbarContainer && r.removeClass(i, "se-toolbar-balloon"), u.onScroll_window(), r.changeElement(t.firstElementChild, c.expansion), e.element.topArea.style.marginTop = "", r.removeClass(this._styleCommandMap.fullScreen, "active")) : (g.isFullScreen = !0, g._fullScreenAttrs.inline = this._isInline, g._fullScreenAttrs.balloon = this._isBalloon, (this._isInline || this._isBalloon) && (this._isInline = !1, this._isBalloon = !1), l.toolbarContainer && e.element.relative.insertBefore(i, o), n.style.position = "fixed", n.style.top = "0", n.style.left = "0", n.style.width = "100%", n.style.maxWidth = "100%", n.style.height = "100%", n.style.zIndex = "2147483647", "" !== e.element._stickyDummy.style.display && (g._fullScreenAttrs.sticky = !0, e.element._stickyDummy.style.display = "none", r.removeClass(i, "se-toolbar-sticky")), g._bodyOverflow = s.body.style.overflow, s.body.style.overflow = "hidden", g._editorAreaOriginCssText = o.style.cssText, g._wysiwygOriginCssText = d.style.cssText, g._codeOriginCssText = p.style.cssText, o.style.cssText = i.style.cssText = "", d.style.cssText = (d.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/) || [""])[0], p.style.cssText = (p.style.cssText.match(/\s?display(\s+)?:(\s+)?[a-zA-Z]+;/) || [""])[0], i.style.width = d.style.height = p.style.height = "100%", i.style.position = "relative", i.style.display = "block", g.innerHeight_fullScreen = a.innerHeight - i.offsetHeight, o.style.height = g.innerHeight_fullScreen - l.fullScreenOffset + "px", r.changeElement(t.firstElementChild, c.reduction), l.iframe && "auto" === l.height && (o.style.overflow = "auto", this._iframeAutoHeight()), e.element.topArea.style.marginTop = l.fullScreenOffset + "px", r.addClass(this._styleCommandMap.fullScreen, "active")), "function" == typeof h.toggleFullScreen && h.toggleFullScreen(this._variable.isFullScreen, this) }, print: function () { const e = r.createElement("IFRAME"); e.style.display = "none", s.body.appendChild(e); const t = l.printTemplate ? l.printTemplate.replace(/\{\{\s*contents\s*\}\}/i, this.getContents(!0)) : this.getContents(!0), n = r.getIframeDocument(e), i = this._wd; if (l.iframe) { const e = null !== l._printClass ? 'class="' + l._printClass + '"' : l.fullPage ? r.getAttributesToString(i.body, ["contenteditable"]) : 'class="' + l._editableClass + '"'; n.write("" + i.head.innerHTML + "" + t + "") } else { const e = s.head.getElementsByTagName("link"), i = s.head.getElementsByTagName("style"); let o = ""; for (let t = 0, n = e.length; t < n; t++)o += e[t].outerHTML; for (let e = 0, t = i.length; e < t; e++)o += i[e].outerHTML; n.write("" + o + '' + t + "") } this.showLoading(), a.setTimeout((function () { try { if (e.focus(), r.isIE_Edge || s.documentMode || a.StyleMedia) try { e.contentWindow.document.execCommand("print", !1, null) } catch (t) { e.contentWindow.print() } else e.contentWindow.print() } catch (e) { throw Error("[SUNEDITOR.core.print.fail] error: " + e) } finally { d.closeLoading(), r.removeItem(e) } }), 1e3) }, preview: function () { d.submenuOff(), d.containerOff(), d.controllersOff(); const e = l.previewTemplate ? l.previewTemplate.replace(/\{\{\s*contents\s*\}\}/i, this.getContents(!0)) : this.getContents(!0), t = a.open("", "_blank"); t.mimeType = "text/html"; const n = this._wd; if (l.iframe) { const i = null !== l._printClass ? 'class="' + l._printClass + '"' : l.fullPage ? r.getAttributesToString(n.body, ["contenteditable"]) : 'class="' + l._editableClass + '"'; t.document.write("" + n.head.innerHTML + "" + e + "") } else { const n = s.head.getElementsByTagName("link"), o = s.head.getElementsByTagName("style"); let a = ""; for (let e = 0, t = n.length; e < t; e++)a += n[e].outerHTML; for (let e = 0, t = o.length; e < t; e++)a += o[e].outerHTML; t.document.write('' + i.toolbar.preview + "" + a + '' + e + "") } }, setContents: function (t) { this.removeRange(); const n = null == t ? "" : this.convertContentsForEditor(t); if (this._resetComponents(), this._variable.isCodeView) { const e = this.convertHTMLForCodeView(n); this._setCodeView(e) } else e.element.wysiwyg.innerHTML = n, this.history.push(!1) }, setIframeContents: function (e) { if (!l.iframe) return !1; e.head && (this._wd.head.innerHTML = e.head.replace(/[\s\S]*<\/script>/gi, "")), e.body && (this._wd.body.innerHTML = this.convertContentsForEditor(e.body)) }, getContents: function (t) { const n = e.element.wysiwyg.innerHTML, i = r.createElement("DIV"); i.innerHTML = n; const o = r.getListChildren(i, (function (e) { return /FIGCAPTION/i.test(e.nodeName) })); for (let e = 0, t = o.length; e < t; e++)o[e].removeAttribute("contenteditable"); if (l.fullPage && !t) { const e = r.getAttributesToString(this._wd.body, ["contenteditable"]); return "" + this._wd.head.outerHTML + "" + i.innerHTML + "" } return i.innerHTML }, _makeLine: function (e, t) { const n = l.defaultTag; if (1 === e.nodeType) return r._disallowedTags(e) ? "" : !t || r.isFormatElement(e) || r.isRangeFormatElement(e) || r.isComponent(e) || r.isMedia(e) || r.isAnchor(e) && r.isMedia(e.firstElementChild) ? e.outerHTML : "<" + n + ">" + e.outerHTML + ""; if (3 === e.nodeType) { if (!t) return r._HTMLConvertor(e.textContent); const i = e.textContent.split(/\n/g); let l = ""; for (let e, t = 0, o = i.length; t < o; t++)e = i[t].trim(), e.length > 0 && (l += "<" + n + ">" + r._HTMLConvertor(e) + ""); return l } return 8 === e.nodeType && this._allowHTMLComments ? "\x3c!--" + e.textContent.trim() + "--\x3e" : "" }, _tagConvertor: function (e) { if (!this._disallowedTextTagsRegExp) return e; const t = l._textTagsMap; return e.replace(this._disallowedTextTagsRegExp, (function (e, n, i) { return n + ("string" == typeof t[i] ? t[i] : i) })) }, _deleteDisallowedTags: function (e) { return e.replace(/\n/g, "").replace(/<(script|style)[\s\S]*>[\s\S]*<\/(script|style)>/gi, "").replace(/<[a-z0-9]+\:[a-z0-9]+[^>^\/]*>[^>]*<\/[a-z0-9]+\:[a-z0-9]+>/gi, "").replace(this.editorTagsWhitelistRegExp, "") }, _cleanTags: function (e, t, n) { if (/^<[a-z0-9]+\:[a-z0-9]+/i.test(t)) return t; let i = null; const l = this._attributesTagsWhitelist[n.match(/(?!<)[a-zA-Z0-9\-]+/)[0].toLowerCase()]; if (i = l ? t.match(l) : t.match(this._attributesWhitelistRegExp), (e || /]*(?=>)/g, this._cleanTags.bind(this, !1)); const n = s.createRange().createContextualFragment(e); try { r._consistencyCheckOfHTML(n, this._htmlCheckWhitelistRegExp) } catch (e) { console.warn("[SUNEDITOR.cleanHTML.consistencyCheck.fail] " + e) } if (this.managedTagsInfo && this.managedTagsInfo.query) { const e = n.querySelectorAll(this.managedTagsInfo.query); for (let t, n, i = 0, l = e.length; i < l; i++) { n = [].slice.call(e[i].classList); for (let l = 0, o = n.length; l < o; l++)if (t = this.managedTagsInfo.map[n[l]], t) { t(e[i]); break } } } const i = n.childNodes; let l = "", o = !1; for (let e, t = 0, n = i.length; t < n; t++)if (e = i[t], 1 === e.nodeType && !r.isTextStyleElement(e) && !r.isBreak(e) && !r._disallowedTags(e)) { o = !0; break } for (let e = 0, t = i.length; e < t; e++)l += this._makeLine(i[e], o); return l = r.htmlRemoveWhiteSpace(l), this._tagConvertor(l ? t ? l.replace("string" == typeof t ? r.createTagsWhitelist(t) : t, "") : l : e) }, convertContentsForEditor: function (e) { e = this._deleteDisallowedTags(e).replace(/(<[a-zA-Z0-9\-]+)[^>]*(?=>)/g, this._cleanTags.bind(this, !0)); const t = s.createRange().createContextualFragment(this._deleteDisallowedTags(e)); try { r._consistencyCheckOfHTML(t, this._htmlCheckWhitelistRegExp) } catch (e) { console.warn("[SUNEDITOR.convertContentsForEditor.consistencyCheck.fail] " + e) } if (this.managedTagsInfo && this.managedTagsInfo.query) { const e = t.querySelectorAll(this.managedTagsInfo.query); for (let t, n, i = 0, l = e.length; i < l; i++) { n = [].slice.call(e[i].classList); for (let l = 0, o = n.length; l < o; l++)if (t = this.managedTagsInfo.map[n[l]], t) { t(e[i]); break } } } const n = t.childNodes; let i = ""; for (let e = 0, t = n.length; e < t; e++)i += this._makeLine(n[e], !0); return 0 === i.length ? "<" + l.defaultTag + ">
      " : (i = r.htmlRemoveWhiteSpace(i), this._tagConvertor(i)) }, convertHTMLForCodeView: function (e) { let t = ""; const n = a.RegExp, i = new n("^(BLOCKQUOTE|PRE|TABLE|THEAD|TBODY|TR|TH|TD|OL|UL|IMG|IFRAME|VIDEO|AUDIO|FIGURE|FIGCAPTION|HR|BR|CANVAS|SELECT)$", "i"), l = r.isFormatElement.bind(r), o = "string" == typeof e ? s.createRange().createContextualFragment(e) : e; let c = 1 * this._variable.codeIndent; return c = c > 0 ? new a.Array(c + 1).join(" ") : "", function e(o, s, a) { const d = o.childNodes, u = i.test(o.nodeName), h = u ? s : ""; for (let p, g, m, f = 0, _ = d.length; f < _; f++) { if (p = d[f], m = i.test(p.nodeName), g = m ? "\n" : "", a = !l(p) || u || /^(TH|TD)$/i.test(o.nodeName) ? "" : "\n", 8 === p.nodeType) { t += "\n\x3c!-- " + p.textContent.trim() + " --\x3e" + g; continue } if (3 === p.nodeType) { t += r._HTMLConvertor(/^\n+$/.test(p.data) ? "" : p.data); continue } if (0 === p.childNodes.length) { t += (/^HR$/i.test(p.nodeName) ? "\n" : "") + h + p.outerHTML + g; continue } p.innerHTML = p.innerHTML; const _ = p.nodeName.toLowerCase(); t += (a || (u ? "" : g)) + (h || m ? s : "") + p.outerHTML.match(n("<" + _ + "[^>]*>", "i"))[0] + g, e(p, s + c, ""), t += (m ? s : "") + "" + (a || g || u || /^(TH|TD)$/i.test(p.nodeName) ? "\n" : "") } }(o, "", "\n"), t.trim() + "\n" }, addDocEvent: function (e, t, n) { s.addEventListener(e, t, n), l.iframe && this._wd.addEventListener(e, t) }, removeDocEvent: function (e, t) { s.removeEventListener(e, t), l.iframe && this._wd.removeEventListener(e, t) }, _charCount: function (e) { const t = l.maxCharCount, n = l.charCounterType; let i = 0; if (e && (i = this.getCharLength(e, n)), this._setCharCount(), t > 0) { let e = !1; const l = h.getCharCount(n); if (l > t) { if (e = !0, i > 0) { this._editorRange(); const e = this.getRange(), n = e.endOffset - 1, i = this.getSelectionNode().textContent, o = e.endOffset - (l - t); this.getSelectionNode().textContent = i.slice(0, o < 0 ? 0 : o) + i.slice(e.endOffset, i.length), this.setRange(e.endContainer, n, e.endContainer, n) } } else l + i > t && (e = !0); if (e && (this._callCounterBlink(), i > 0)) return !1 } return !0 }, checkCharCount: function (e, t) { if (l.maxCharCount) { const n = t || l.charCounterType, i = this.getCharLength("string" == typeof e ? e : this._charTypeHTML && 1 === e.nodeType ? e.outerHTML : e.textContent, n); if (i > 0 && i + h.getCharCount(n) > l.maxCharCount) return this._callCounterBlink(), !1 } return !0 }, getCharLength: function (e, t) { return /byte/.test(t) ? r.getByteLength(e) : e.length }, _setCharCount: function () { e.element.charCounter && a.setTimeout((function () { e.element.charCounter.textContent = h.getCharCount(l.charCounterType) })) }, _callCounterBlink: function () { const t = e.element.charWrapper; t && !r.hasClass(t, "se-blink") && (r.addClass(t, "se-blink"), a.setTimeout((function () { r.removeClass(t, "se-blink") }), 600)) }, _checkComponents: function () { for (let e = 0, t = this._fileInfoPluginsCheck.length; e < t; e++)this._fileInfoPluginsCheck[e]() }, _resetComponents: function () { for (let e = 0, t = this._fileInfoPluginsReset.length; e < t; e++)this._fileInfoPluginsReset[e]() }, _setCodeView: function (t) { l.codeMirrorEditor ? l.codeMirrorEditor.getDoc().setValue(t) : e.element.code.value = t }, _getCodeView: function () { return l.codeMirrorEditor ? l.codeMirrorEditor.getDoc().getValue() : e.element.code.value }, _init: function (i, o) { const c = a.RegExp; if (this._ww = l.iframe ? e.element.wysiwygFrame.contentWindow : a, this._wd = s, this._charTypeHTML = "byte-html" === l.charCounterType, !l.iframe && "function" == typeof a.ShadowRoot) { let t = e.element.wysiwygFrame; for (; t;) { if (t.shadowRoot) { this._shadowRoot = t.shadowRoot; break } if (t instanceof a.ShadowRoot) { this._shadowRoot = t; break } t = t.parentNode } this._shadowRoot && (this._shadowRootControllerEventTarget = []) } const d = a.Object.keys(l._textTagsMap), u = l.addTagsWhitelist ? l.addTagsWhitelist.split("|").filter((function (e) { return /b|i|ins|s|strike/i.test(e) })) : []; for (let e = 0; e < u.length; e++)d.splice(d.indexOf(u[e].toLowerCase()), 1); this._disallowedTextTagsRegExp = 0 === d.length ? null : new c("(<\\/?)(" + d.join("|") + ")\\b\\s*(?:[^>^<]+)?\\s*(?=>)", "gi"); const h = "contenteditable|id|colspan|rowspan|target|href|download|rel|src|alt|class|type|controls|data-format|data-size|data-file-size|data-file-name|data-origin|data-align|data-image-link|data-rotate|data-proportion|data-percentage|origin-size|data-exp|data-font-size"; this._allowHTMLComments = l._editorTagsWhitelist.indexOf("//") > -1, this._htmlCheckWhitelistRegExp = new c("^(" + l._editorTagsWhitelist.replace("|//", "") + ")$", "i"), this.editorTagsWhitelistRegExp = r.createTagsWhitelist(l._editorTagsWhitelist.replace("|//", "|\x3c!--|--\x3e")), this.pasteTagsWhitelistRegExp = r.createTagsWhitelist(l.pasteTagsWhitelist); const p = l.attributesWhitelist, g = {}; let m = ""; if (p) for (let e in p) r.hasOwn(p, e) && ("all" === e ? m = p[e] + "|" : g[e] = new c("((?:" + p[e] + "|" + h + ")\\s*=.*\\S)", "ig")); this._attributesWhitelistRegExp = new c("((?:" + m + h + ")\\s*=.*\\S)", "ig"), this._attributesTagsWhitelist = g, this._isInline = /inline/i.test(l.mode), this._isBalloon = /balloon|balloon-always/i.test(l.mode), this._isBalloonAlways = /balloon-always/i.test(l.mode), this._cachingButtons(), this._fileInfoPluginsCheck = [], this._fileInfoPluginsReset = [], this.managedTagsInfo = { query: "", map: {} }; const f = []; this.activePlugins = [], this._fileManager.tags = [], this._fileManager.pluginMap = {}; let _, b, v = []; for (let e in n) if (r.hasOwn(n, e)) { if (_ = n[e], b = t[e], _.active && b && this.callPlugin(e, null, b), "function" == typeof _.checkFileInfo && "function" == typeof _.resetFileInfo && (this.callPlugin(e, null, b), this._fileInfoPluginsCheck.push(_.checkFileInfo.bind(this)), this._fileInfoPluginsReset.push(_.resetFileInfo.bind(this))), a.Array.isArray(_.fileTags)) { const t = _.fileTags; this.callPlugin(e, null, b), this._fileManager.tags = this._fileManager.tags.concat(t), v.push(e); for (let n = 0, i = t.length; n < i; n++)this._fileManager.pluginMap[t[n].toLowerCase()] = e } if (_.managedTags) { const e = _.managedTags(); f.push("." + e.className), this.managedTagsInfo.map[e.className] = e.method.bind(this) } } this.managedTagsInfo.query = f.toString(), this._fileManager.queryString = this._fileManager.tags.join(","), this._fileManager.regExp = new c("^(" + this._fileManager.tags.join("|") + ")$", "i"), this._fileManager.pluginRegExp = new c("^(" + (0 === v.length ? "undefined" : v.join("|")) + ")$", "i"), this._variable._originCssText = e.element.topArea.style.cssText, this._placeholder = e.element.placeholder, this._lineBreaker = e.element.lineBreaker, this._lineBreakerButton = this._lineBreaker.querySelector("button"), this.history = function (e, t) { const n = e._w, i = e.util, l = e.options.historyStackDelayTime; let o = e.context.element, s = e.context.tool.undo, a = e.context.tool.redo, r = null, c = 0, d = []; function u() { const n = d[c]; o.wysiwyg.innerHTML = n.contents, e.setRange(i.getNodeFromPath(n.s.path, o.wysiwyg), n.s.offset, i.getNodeFromPath(n.e.path, o.wysiwyg), n.e.offset), e.focus(), 0 === c ? (s && s.setAttribute("disabled", !0), a && a.removeAttribute("disabled")) : c === d.length - 1 ? (s && s.removeAttribute("disabled"), a && a.setAttribute("disabled", !0)) : (s && s.removeAttribute("disabled"), a && a.removeAttribute("disabled")), e.controllersOff(), e._checkComponents(), e._setCharCount(), e._resourcesStateChange(), t() } function h() { e._checkComponents(); const n = e.getContents(!0); if (!n || d[c] && n === d[c].contents) return; c++; const l = e._variable._range; d.length > c && (d = d.slice(0, c), a && a.setAttribute("disabled", !0)), d[c] = l ? { contents: n, s: { path: i.getNodePath(l.startContainer, null, null), offset: l.startOffset }, e: { path: i.getNodePath(l.endContainer, null, null), offset: l.endOffset } } : { contents: n, s: { path: [0, 0], offset: [0, 0] }, e: { path: 0, offset: 0 } }, 1 === c && s && s.removeAttribute("disabled"), e._setCharCount(), t() } return { stack: d, push: function (t) { n.setTimeout(e._resourcesStateChange.bind(e)); const i = "number" == typeof t ? t > 0 ? t : 0 : t ? l : 0; i && !r || (n.clearTimeout(r), i) ? r = n.setTimeout((function () { n.clearTimeout(r), r = null, h() }), i) : h() }, undo: function () { c > 0 && (c--, u()) }, redo: function () { d.length - 1 > c && (c++, u()) }, go: function (e) { c = e < 0 ? d.length - 1 : e, u() }, reset: function (n) { s && s.setAttribute("disabled", !0), a && a.setAttribute("disabled", !0), e._variable.isChanged = !1, e.context.tool.save && e.context.tool.save.setAttribute("disabled", !0), d.splice(0), c = 0, d[c] = { contents: e.getContents(!0), s: { path: [0, 0], offset: 0 }, e: { path: [0, 0], offset: 0 } }, n || t() }, _resetCachingButton: function () { o = e.context.element, s = e.context.tool.undo, a = e.context.tool.redo, 0 === c ? (s && s.setAttribute("disabled", !0), a && c === d.length - 1 && a.setAttribute("disabled", !0), e._variable.isChanged = !1, e.context.tool.save && e.context.tool.save.setAttribute("disabled", !0)) : c === d.length - 1 && a && a.setAttribute("disabled", !0) }, _destroy: function () { r && n.clearTimeout(r), d = null } } }(this, this._onChange_historyStack.bind(this)), this.addModule([M]), l.iframe && (this._wd = e.element.wysiwygFrame.contentDocument, e.element.wysiwyg = this._wd.body, l._editorStyles.editor && (e.element.wysiwyg.style.cssText = l._editorStyles.editor), "auto" === l.height && (this._iframeAuto = this._wd.body)), this._initWysiwygArea(i, o) }, _cachingButtons: function () { this.codeViewDisabledButtons = e.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-code-view-enabled"])'), this.resizingDisabledButtons = e.element.toolbar.querySelectorAll('.se-toolbar button:not([class~="se-resizing-enabled"])'); const t = e.tool; this.commandMap = { SUB: t.subscript, SUP: t.superscript, OUTDENT: t.outdent, INDENT: t.indent }, this.commandMap[l.textTags.bold.toUpperCase()] = t.bold, this.commandMap[l.textTags.underline.toUpperCase()] = t.underline, this.commandMap[l.textTags.italic.toUpperCase()] = t.italic, this.commandMap[l.textTags.strike.toUpperCase()] = t.strike, this._styleCommandMap = { fullScreen: t.fullScreen, showBlocks: t.showBlocks, codeView: t.codeView } }, _initWysiwygArea: function (t, n) { e.element.wysiwyg.innerHTML = t ? n : this.convertContentsForEditor("string" == typeof n ? n : e.element.originElement.value) }, _resourcesStateChange: function () { this._iframeAutoHeight(), this._checkPlaceholder() }, _onChange_historyStack: function () { this.hasFocus && u._applyTagEffects(), this._variable.isChanged = !0, e.tool.save && e.tool.save.removeAttribute("disabled"), h.onChange && h.onChange(this.getContents(!0), this), "block" === e.element.toolbar.style.display && u._showToolbarBalloon() }, _iframeAutoHeight: function () { this._iframeAuto && a.setTimeout((function () { e.element.wysiwygFrame.style.height = d._iframeAuto.offsetHeight + "px" })) }, _checkPlaceholder: function () { if (this._placeholder) { if (this._variable.isCodeView) return void (this._placeholder.style.display = "none"); const t = e.element.wysiwyg; !r.onlyZeroWidthSpace(t.textContent) || t.querySelector(r._allowedEmptyNodeList) || (t.innerText.match(/\n/g) || "").length > 1 ? this._placeholder.style.display = "none" : this._placeholder.style.display = "block" } }, _setDefaultFormat: function (e) { if (this._fileManager.pluginRegExp.test(this.currentControllerName)) return; const t = this.getRange(), n = t.commonAncestorContainer, i = t.startContainer, o = r.getRangeFormatElement(n, null); let s, a, c; const d = r.getParentElement(n, r.isComponent); if ((!d || r.isTable(d)) && (!r.isRangeFormatElement(i) && !r.isWysiwygDiv(i) || !r.isComponent(i.children[t.startOffset]) && !r.isComponent(i.children[t.startOffset - 1]))) { if (o) return c = r.createElement(e || l.defaultTag), c.innerHTML = o.innerHTML, 0 === c.childNodes.length && (c.innerHTML = r.zeroWidthSpace), o.innerHTML = c.outerHTML, c = o.firstChild, s = r.getEdgeChildNodes(c, null).sc, s || (s = r.createTextNode(r.zeroWidthSpace), c.insertBefore(s, c.firstChild)), a = s.textContent.length, void this.setRange(s, a, s, a); if (r.isRangeFormatElement(n) && n.childNodes.length <= 1) { let e = null; return 1 === n.childNodes.length && r.isBreak(n.firstChild) ? e = n.firstChild : (e = r.createTextNode(r.zeroWidthSpace), n.appendChild(e)), void this.setRange(e, 1, e, 1) } if (this.execCommand("formatBlock", !1, e || l.defaultTag), s = r.getEdgeChildNodes(n, n), s = s ? s.ec : n, c = r.getFormatElement(s, null), !c) return this.removeRange(), void this._editorRange(); if (r.isBreak(c.nextSibling) && r.removeItem(c.nextSibling), r.isBreak(c.previousSibling) && r.removeItem(c.previousSibling), r.isBreak(s)) { const e = r.createTextNode(r.zeroWidthSpace); s.parentNode.insertBefore(e, s), s = e } this.effectNode = null, this.nativeFocus() } }, _setOptionsInit: function (t, n) { this.context = e = A(t.originElement, this._getConstructed(t), l), this._componentsInfoReset = !0, this._editorInit(!0, n) }, _editorInit: function (t, n) { this._init(t, n), u._addEvent(), this._setCharCount(), u._offStickyToolbar(), u.onResize_window(), e.element.toolbar.style.visibility = "", this._checkComponents(), this._componentsInfoInit = !1, this._componentsInfoReset = !1, this.history.reset(!0), this._resourcesStateChange(), a.setTimeout((function () { "function" == typeof h.onload && h.onload(d, t) })) }, _getConstructed: function (e) { return { _top: e.topArea, _relative: e.relative, _toolBar: e.toolbar, _menuTray: e._menuTray, _editorArea: e.editorArea, _wysiwygArea: e.wysiwygFrame, _codeArea: e.code, _placeholder: e.placeholder, _resizingBar: e.resizingBar, _navigation: e.navigation, _charCounter: e.charCounter, _charWrapper: e.charWrapper, _loading: e.loading, _lineBreaker: e.lineBreaker, _lineBreaker_t: e.lineBreaker_t, _lineBreaker_b: e.lineBreaker_b, _resizeBack: e.resizeBackground, _stickyDummy: e._stickyDummy, _arrow: e._arrow } } }, u = { _IEisComposing: !1, _lineBreakerBind: null, _responsiveCurrentSize: "default", _responsiveButtonSize: null, _responsiveButtons: null, _directionKeyCode: new a.RegExp("^(8|13|3[2-9]|40|46)$"), _nonTextKeyCode: new a.RegExp("^(8|13|1[6-9]|20|27|3[3-9]|40|45|46|11[2-9]|12[0-3]|144|145)$"), _historyIgnoreKeyCode: new a.RegExp("^(1[6-9]|20|27|3[3-9]|40|45|11[2-9]|12[0-3]|144|145)$"), _onButtonsCheck: new a.RegExp("^(" + a.Object.keys(l._textTagsMap).join("|") + ")$", "i"), _frontZeroWidthReg: new a.RegExp(r.zeroWidthSpace + "+", ""), _keyCodeShortcut: { 65: "A", 66: "B", 83: "S", 85: "U", 73: "I", 89: "Y", 90: "Z", 219: "[", 221: "]" }, _shortcutCommand: function (e, t) { let n = null; switch (u._keyCodeShortcut[e]) { case "A": n = "selectAll"; break; case "B": -1 === l.shortcutsDisable.indexOf("bold") && (n = "bold"); break; case "S": t && -1 === l.shortcutsDisable.indexOf("strike") ? n = "strike" : t || -1 !== l.shortcutsDisable.indexOf("save") || (n = "save"); break; case "U": -1 === l.shortcutsDisable.indexOf("underline") && (n = "underline"); break; case "I": -1 === l.shortcutsDisable.indexOf("italic") && (n = "italic"); break; case "Z": -1 === l.shortcutsDisable.indexOf("undo") && (n = t ? "redo" : "undo"); break; case "Y": -1 === l.shortcutsDisable.indexOf("undo") && (n = "redo"); break; case "[": -1 === l.shortcutsDisable.indexOf("indent") && (n = l.rtl ? "indent" : "outdent"); break; case "]": -1 === l.shortcutsDisable.indexOf("indent") && (n = l.rtl ? "outdent" : "indent") }return !!n && (d.commandHandler(d.commandMap[n], n), !0) }, _applyTagEffects: function () { let t = d.getSelectionNode(); if (t === d.effectNode) return; d.effectNode = t; const i = l.rtl ? "marginRight" : "marginLeft", o = d.commandMap, s = this._onButtonsCheck, a = [], c = [], u = d.activePlugins, h = u.length; let p = ""; for (; t.firstChild;)t = t.firstChild; for (let e = t; !r.isWysiwygDiv(e) && e; e = e.parentNode)if (1 === e.nodeType && !r.isBreak(e)) { p = e.nodeName.toUpperCase(), c.push(p); for (let t, i = 0; i < h; i++)t = u[i], -1 === a.indexOf(t) && n[t].active.call(d, e) && a.push(t); r.isFormatElement(e) ? (-1 === a.indexOf("OUTDENT") && o.OUTDENT && (r.isListCell(e) || e.style[i] && r.getNumber(e.style[i], 0) > 0) && (a.push("OUTDENT"), o.OUTDENT.removeAttribute("disabled")), -1 === a.indexOf("INDENT") && o.INDENT && (a.push("INDENT"), r.isListCell(e) && !e.previousElementSibling ? o.INDENT.setAttribute("disabled", !0) : o.INDENT.removeAttribute("disabled"))) : s.test(p) && (a.push(p), r.addClass(o[p], "active")) } for (let e in o) a.indexOf(e) > -1 || !r.hasOwn(o, e) || (u.indexOf(e) > -1 ? n[e].active.call(d, null) : o.OUTDENT && /^OUTDENT$/i.test(e) ? o.OUTDENT.setAttribute("disabled", !0) : o.INDENT && /^INDENT$/i.test(e) ? o.INDENT.removeAttribute("disabled") : r.removeClass(o[e], "active")); d._variable.currentNodes = c.reverse(), d._variable.currentNodesMap = a, l.showPathLabel && (e.element.navigation.textContent = d._variable.currentNodes.join(" > ")) }, _cancelCaptionEdit: function () { this.setAttribute("contenteditable", !1), this.removeEventListener("blur", u._cancelCaptionEdit) }, _buttonsEventHandler: function (e) { let t = e.target; if (d._bindControllersOff && e.stopPropagation(), /^(input|textarea|select|option)$/i.test(t.nodeName) ? d._antiBlur = !1 : e.preventDefault(), r.getParentElement(t, ".se-submenu")) e.stopPropagation(), d._notHideToolbar = !0; else { let n = t.getAttribute("data-command"), i = t.className; for (; !n && !/se-menu-list/.test(i) && !/sun-editor-common/.test(i);)t = t.parentNode, n = t.getAttribute("data-command"), i = t.className; n !== d._submenuName && n !== d._containerName || e.stopPropagation() } }, onClick_toolbar: function (e) { let t = e.target, n = t.getAttribute("data-display"), i = t.getAttribute("data-command"), l = t.className; for (d.controllersOff(); t.parentNode && !i && !/se-menu-list/.test(l) && !/se-toolbar/.test(l);)t = t.parentNode, i = t.getAttribute("data-command"), n = t.getAttribute("data-display"), l = t.className; (i || n) && (t.disabled || (d.hasFocus || d.nativeFocus(), d._variable.isCodeView || d._editorRange(), d.actionCall(i, n, t))) }, onMouseDown_wysiwyg: function (t) { if (r.isNonEditable(e.element.wysiwyg)) return; if ("function" == typeof h.onMouseDown && !1 === h.onMouseDown(t, d)) return; const n = r.getParentElement(t.target, r.isCell); if (n) { const e = d.plugins.table; e && n !== e._fixedCell && !e._shift && d.callPlugin("table", (function () { e.onTableCellMultiSelect.call(d, n, !1) }), null) } d._isBalloon && u._hideToolbar(), /FIGURE/i.test(t.target.nodeName) && t.preventDefault() }, onClick_wysiwyg: function (t) { const n = t.target; if (r.isNonEditable(e.element.wysiwyg)) return; if ("function" == typeof h.onClick && !1 === h.onClick(t, d)) return; const i = d.getFileComponent(n); if (i) return t.preventDefault(), void d.selectComponent(i.target, i.pluginName); const o = r.getParentElement(n, "FIGCAPTION"); if (r.isNonEditable(o) && (t.preventDefault(), o.setAttribute("contenteditable", !0), o.focus(), d._isInline && !d._inlineToolbarAttr.isShow)) { u._showToolbarInline(); const e = function () { u._hideToolbar(), o.removeEventListener("blur", e) }; o.addEventListener("blur", e) } a.setTimeout(d._editorRange.bind(d)), d._editorRange(); const s = d.getSelectionNode(), c = r.getFormatElement(s, null), p = r.getRangeFormatElement(s, null); if (c && c !== p || r.isNonEditable(n) || r.isList(p)) u._applyTagEffects(); else { const e = d.getRange(); if (r.getFormatElement(e.startContainer) === r.getFormatElement(e.endContainer)) if (r.isList(p)) { t.preventDefault(); const e = r.createElement("LI"), n = s.nextElementSibling; e.appendChild(s), p.insertBefore(e, n), d.focus() } else r.isWysiwygDiv(s) || r.isComponent(s) || r.isTable(s) && !r.isCell(s) ? u._applyTagEffects() : (t.preventDefault(), d._setDefaultFormat(r.isRangeFormatElement(p) ? "DIV" : l.defaultTag), d.focus()) } d._isBalloon && a.setTimeout(u._toggleToolbarBalloon) }, _balloonDelay: null, _showToolbarBalloonDelay: function () { u._balloonDelay && a.clearTimeout(u._balloonDelay), u._balloonDelay = a.setTimeout(function () { a.clearTimeout(this._balloonDelay), this._balloonDelay = null, this._showToolbarBalloon() }.bind(u), 350) }, _toggleToolbarBalloon: function () { d._editorRange(); const e = d.getRange(); d._bindControllersOff || !d._isBalloonAlways && e.collapsed ? u._hideToolbar() : u._showToolbarBalloon(e) }, _showToolbarBalloon: function (t) { if (!d._isBalloon) return; const n = t || d.getRange(), i = e.element.toolbar, o = e.element.topArea, s = d.getSelection(); let c; if (d._isBalloonAlways && n.collapsed) c = !0; else if (s.focusNode === s.anchorNode) c = s.focusOffset < s.anchorOffset; else { const e = r.getListChildNodes(n.commonAncestorContainer, null); c = r.getArrayIndex(e, s.focusNode) < r.getArrayIndex(e, s.anchorNode) } let h = n.getClientRects(); h = h[c ? 0 : h.length - 1]; const p = d.getGlobalScrollOffset(); let g = p.left, m = p.top; const f = o.offsetWidth, _ = u._getEditorOffsets(null), b = _.top, v = _.left; if (i.style.top = "-10000px", i.style.visibility = "hidden", i.style.display = "block", !h) { const t = d.getSelectionNode(); if (r.isFormatElement(t)) { const e = r.createTextNode(r.zeroWidthSpace); d.insertNode(e, null, !1), d.setRange(e, 1, e, 1), d._editorRange(), h = d.getRange().getClientRects(), h = h[c ? 0 : h.length - 1] } if (!h) { const n = r.getOffset(t, e.element.wysiwygFrame); h = { left: n.left, top: n.top, right: n.left, bottom: n.top + t.offsetHeight, noText: !0 }, g = 0, m = 0 } c = !0 } const y = a.Math.round(e.element._arrow.offsetWidth / 2), C = i.offsetWidth, w = i.offsetHeight, x = /iframe/i.test(e.element.wysiwygFrame.nodeName) ? e.element.wysiwygFrame.getClientRects()[0] : null; if (x && (h = { left: h.left + x.left, top: h.top + x.top, right: h.right + x.right - x.width, bottom: h.bottom + x.bottom - x.height }), u._setToolbarOffset(c, h, i, v, f, g, m, b, y), C === i.offsetWidth && w === i.offsetHeight || u._setToolbarOffset(c, h, i, v, f, g, m, b, y), l.toolbarContainer) { const e = o.parentElement; let t = l.toolbarContainer, n = t.offsetLeft, s = t.offsetTop; for (; !t.parentElement.contains(e) || !/^(BODY|HTML)$/i.test(t.parentElement.nodeName);)t = t.offsetParent, n += t.offsetLeft, s += t.offsetTop; i.style.left = i.offsetLeft - n + o.offsetLeft + "px", i.style.top = i.offsetTop - s + o.offsetTop + "px" } i.style.visibility = "" }, _setToolbarOffset: function (t, n, i, l, o, c, d, h, p) { const g = i.offsetWidth, m = n.noText && !t ? 0 : i.offsetHeight, f = (t ? n.left : n.right) - l - g / 2 + c, _ = f + g - o; let b = (t ? n.top - m - p : n.bottom + p) - (n.noText ? 0 : h) + d, v = f < 0 ? 1 : _ < 0 ? f : f - _ - 1 - 1, y = !1; const C = b + (t ? u._getEditorOffsets(null).top : i.offsetHeight - e.element.wysiwyg.offsetHeight); !t && C > 0 && u._getPageBottomSpace() < C ? (t = !0, y = !0) : t && s.documentElement.offsetTop > C && (t = !1, y = !0), y && (b = (t ? n.top - m - p : n.bottom + p) - (n.noText ? 0 : h) + d), i.style.left = a.Math.floor(v) + "px", i.style.top = a.Math.floor(b) + "px", t ? (r.removeClass(e.element._arrow, "se-arrow-up"), r.addClass(e.element._arrow, "se-arrow-down"), e.element._arrow.style.top = m + "px") : (r.removeClass(e.element._arrow, "se-arrow-down"), r.addClass(e.element._arrow, "se-arrow-up"), e.element._arrow.style.top = -p + "px"); const w = a.Math.floor(g / 2 + (f - v)); e.element._arrow.style.left = (w + p > i.offsetWidth ? i.offsetWidth - p : w < p ? p : w) + "px" }, _showToolbarInline: function () { if (!d._isInline) return; const t = e.element.toolbar; l.toolbarContainer ? t.style.position = "relative" : t.style.position = "absolute", t.style.visibility = "hidden", t.style.display = "block", d._inlineToolbarAttr.width = t.style.width = l.toolbarWidth, d._inlineToolbarAttr.top = t.style.top = (l.toolbarContainer ? 0 : -1 - t.offsetHeight) + "px", "function" == typeof h.showInline && h.showInline(t, e, d), u.onScroll_window(), d._inlineToolbarAttr.isShow = !0, t.style.visibility = "" }, _hideToolbar: function () { d._notHideToolbar || d._variable.isFullScreen || (e.element.toolbar.style.display = "none", d._inlineToolbarAttr.isShow = !1) }, onInput_wysiwyg: function (e) { if (d._editorRange(), "function" == typeof h.onInput && !1 === h.onInput(e, d)) return; const t = (null === e.data ? "" : void 0 === e.data ? " " : e.data) || ""; d._charCount(t) || (e.preventDefault(), e.stopPropagation()), d.history.push(!0) }, _isUneditableNode: function (e, t) { const n = t ? e.startContainer : e.endContainer, i = t ? e.startOffset : e.endOffset, l = t ? "previousSibling" : "nextSibling"; let o; return 1 === n.nodeType ? (o = u._isUneditableNode_getSibling(n.childNodes[i], l, n), o && 1 === o.nodeType && "false" === o.getAttribute("contenteditable")) : (o = u._isUneditableNode_getSibling(n, l, n), d.isEdgePoint(n, i, t ? "front" : "end") && o && 1 === o.nodeType && "false" === o.getAttribute("contenteditable")) }, _isUneditableNode_getSibling: function (e, t, n) { if (!e) return null; let i = e[t]; if (!i) { if (i = r.getFormatElement(n), i = i ? i[t] : null, !i || r.isComponent(i)) return null; i = "previousSibling" === t ? i.firstElementChild : i.lastElementChild } return i }, _onShortcutKey: !1, onKeyDown_wysiwyg: function (t) { const n = t.keyCode, i = t.shiftKey, o = t.ctrlKey || t.metaKey || 91 === n || 92 === n || 224 === n, s = t.altKey; if (u._IEisComposing = 229 === n, d.submenuOff(), d._isBalloon && u._hideToolbar(), "function" == typeof h.onKeyDown && !1 === h.onKeyDown(t, d)) return; if (o && u._shortcutCommand(n, i)) return u._onShortcutKey = !0, t.preventDefault(), t.stopPropagation(), !1; u._onShortcutKey && (u._onShortcutKey = !1); let c = d.getSelectionNode(); const p = d.getRange(), g = !p.collapsed || p.startContainer !== p.endContainer, m = d._fileManager.pluginRegExp.test(d.currentControllerName) ? d.currentControllerName : ""; let f = r.getFormatElement(c, null) || c, _ = r.getRangeFormatElement(f, null); switch (n) { case 8: if (!g && m) { t.preventDefault(), t.stopPropagation(), d.plugins[m].destroy.call(d); break } if (g && u._hardDelete()) { t.preventDefault(), t.stopPropagation(); break } if (!r.isFormatElement(f) && !e.element.wysiwyg.firstElementChild && !r.isComponent(c)) return t.preventDefault(), t.stopPropagation(), d._setDefaultFormat(l.defaultTag), !1; if (!g && !f.previousElementSibling && 0 === p.startOffset && !c.previousSibling && !r.isListCell(f) && r.isFormatElement(f) && (!r.isFreeFormatElement(f) || r.isClosureFreeFormatElement(f))) { if (r.isClosureRangeFormatElement(f.parentNode)) return t.preventDefault(), t.stopPropagation(), !1; if (r.isWysiwygDiv(f.parentNode) && f.childNodes.length <= 1 && (!f.firstChild || r.onlyZeroWidthSpace(f.textContent))) { if (t.preventDefault(), t.stopPropagation(), f.nodeName.toUpperCase() === l.defaultTag.toUpperCase()) { f.innerHTML = "
      "; const e = f.attributes; for (; e[0];)f.removeAttribute(e[0].name) } else { const e = r.createElement(l.defaultTag); e.innerHTML = "
      ", f.parentElement.replaceChild(e, f) } return d.nativeFocus(), !1 } } if (f && p.startContainer === p.endContainer && 3 === c.nodeType && !r.isFormatElement(c.parentNode) && (p.collapsed ? 1 === c.textContent.length : p.endOffset - p.startOffset === c.textContent.length)) { t.preventDefault(); let e = null, n = c.parentNode.previousSibling; const i = c.parentNode.nextSibling; n || (i ? (n = i, e = 0) : (n = r.createElement("BR"), f.appendChild(n))), c.textContent = "", r.removeItemAllParents(c, null, f), e = "number" == typeof e ? e : 3 === n.nodeType ? n.textContent.length : 1, d.setRange(n, e, n, e); break } if (u._isUneditableNode(p, !0)) { t.preventDefault(), t.stopPropagation(); break } const n = p.commonAncestorContainer; if (f = r.getFormatElement(p.startContainer, null), _ = r.getRangeFormatElement(f, null), _ && f && !r.isCell(_) && !/^FIGCAPTION$/i.test(_.nodeName)) { if (r.isListCell(f) && r.isList(_) && (r.isListCell(_.parentNode) || f.previousElementSibling) && (c === f || 3 === c.nodeType && (!c.previousSibling || r.isList(c.previousSibling))) && (r.getFormatElement(p.startContainer, null) !== r.getFormatElement(p.endContainer, null) ? _.contains(p.startContainer) : 0 === p.startOffset && p.collapsed)) { if (p.startContainer !== p.endContainer) t.preventDefault(), d.removeNode(), 3 === p.startContainer.nodeType && d.setRange(p.startContainer, p.startContainer.textContent.length, p.startContainer, p.startContainer.textContent.length), d.history.push(!0); else { let e = f.previousElementSibling || _.parentNode; if (r.isListCell(e)) { t.preventDefault(); let n = e; if (!e.contains(f) && r.isListCell(n) && r.isList(n.lastElementChild)) { for (n = n.lastElementChild.lastElementChild; r.isListCell(n) && r.isList(n.lastElementChild);)n = n.lastElementChild && n.lastElementChild.lastElementChild; e = n } let i = e === _.parentNode ? _.previousSibling : e.lastChild; i || (i = r.createTextNode(r.zeroWidthSpace), _.parentNode.insertBefore(i, _.parentNode.firstChild)); const l = 3 === i.nodeType ? i.textContent.length : 1, o = f.childNodes; let s = i, a = o[0]; for (; a = o[0];)e.insertBefore(a, s.nextSibling), s = a; r.removeItem(f), 0 === _.children.length && r.removeItem(_), d.setRange(i, l, i, l), d.history.push(!0) } } break } if (!g && 0 === p.startOffset) { let e = !0, i = n; for (; i && i !== _ && !r.isWysiwygDiv(i);) { if (i.previousSibling && (1 === i.previousSibling.nodeType || !r.onlyZeroWidthSpace(i.previousSibling.textContent.trim()))) { e = !1; break } i = i.parentNode } if (e && _.parentNode) { t.preventDefault(), d.detachRangeFormatElement(_, r.isListCell(f) ? [f] : null, null, !1, !1), d.history.push(!0); break } } } if (!g && f && (0 === p.startOffset || c === f && f.childNodes[p.startOffset])) { const e = c === f ? f.childNodes[p.startOffset] : c, i = f.previousSibling, l = (3 === n.nodeType || r.isBreak(n)) && !n.previousSibling && 0 === p.startOffset; if (!e.previousSibling && (r.isComponent(n.previousSibling) || l && r.isComponent(i))) { const e = d.getFileComponent(i); e ? (t.preventDefault(), t.stopPropagation(), 0 === f.textContent.length && r.removeItem(f), !1 === d.selectComponent(e.target, e.pluginName) && d.blur()) : r.isComponent(i) && (t.preventDefault(), t.stopPropagation(), r.removeItem(i)); break } if (r.isNonEditable(e.previousSibling)) { t.preventDefault(), t.stopPropagation(), r.removeItem(e.previousSibling); break } } break; case 46: if (m) { t.preventDefault(), t.stopPropagation(), d.plugins[m].destroy.call(d); break } if (g && u._hardDelete()) { t.preventDefault(), t.stopPropagation(); break } if (u._isUneditableNode(p, !1)) { t.preventDefault(), t.stopPropagation(); break } if ((r.isFormatElement(c) || null === c.nextSibling || r.onlyZeroWidthSpace(c.nextSibling) && null === c.nextSibling.nextSibling) && p.startOffset === c.textContent.length) { let e = f.nextElementSibling; if (!e) { t.preventDefault(); break } if (r.isComponent(e)) { if (t.preventDefault(), r.onlyZeroWidthSpace(f) && (r.removeItem(f), r.isTable(e))) { let t = r.getChildElement(e, r.isCell, !1); t = t.firstElementChild || t, d.setRange(t, 0, t, 0); break } const n = d.getFileComponent(e); n ? (t.stopPropagation(), !1 === d.selectComponent(n.target, n.pluginName) && d.blur()) : r.isComponent(e) && (t.stopPropagation(), r.removeItem(e)); break } } if (!g && (d.isEdgePoint(p.endContainer, p.endOffset) || c === f && f.childNodes[p.startOffset])) { const e = c === f ? f.childNodes[p.startOffset] : c; if (r.isNonEditable(e.nextSibling)) { t.preventDefault(), t.stopPropagation(), r.removeItem(e.nextSibling); break } } if (f = r.getFormatElement(p.startContainer, null), _ = r.getRangeFormatElement(f, null), r.isListCell(f) && r.isList(_) && (c === f || 3 === c.nodeType && (!c.nextSibling || r.isList(c.nextSibling)) && (r.getFormatElement(p.startContainer, null) !== r.getFormatElement(p.endContainer, null) ? _.contains(p.endContainer) : p.endOffset === c.textContent.length && p.collapsed))) { p.startContainer !== p.endContainer && d.removeNode(); let e = r.getArrayItem(f.children, r.isList, !1); if (e = e || f.nextElementSibling || _.parentNode.nextElementSibling, e && (r.isList(e) || r.getArrayItem(e.children, r.isList, !1))) { let n, i; if (t.preventDefault(), r.isList(e)) { const t = e.firstElementChild; for (i = t.childNodes, n = i[0]; i[0];)f.insertBefore(i[0], e); r.removeItem(t) } else { for (n = e.firstChild, i = e.childNodes; i[0];)f.appendChild(i[0]); r.removeItem(e) } d.setRange(n, 0, n, 0), d.history.push(!0) } break } break; case 9: if (m || l.tabDisable) break; if (t.preventDefault(), o || s || r.isWysiwygDiv(c)) break; const b = !p.collapsed || d.isEdgePoint(p.startContainer, p.startOffset), v = d.getSelectedElements(null); c = d.getSelectionNode(); const y = []; let C = [], w = r.isListCell(v[0]), x = r.isListCell(v[v.length - 1]), E = { sc: p.startContainer, so: p.startOffset, ec: p.endContainer, eo: p.endOffset }; for (let e, t = 0, n = v.length; t < n; t++)if (e = v[t], r.isListCell(e)) { if (!e.previousElementSibling && !i) continue; y.push(e) } else C.push(e); if (y.length > 0 && b && d.plugins.list) E = d.plugins.list.editInsideList.call(d, i, y); else { const e = r.getParentElement(c, r.isCell); if (e && b) { const t = r.getParentElement(e, "table"), n = r.getListChildren(t, r.isCell); let l = i ? r.prevIdx(n, e) : r.nextIdx(n, e); l !== n.length || i || (l = 0), -1 === l && i && (l = n.length - 1); let o = n[l]; if (!o) break; o = o.firstElementChild || o, d.setRange(o, 0, o, 0); break } C = C.concat(y), w = x = null } if (C.length > 0) if (i) { const e = C.length - 1; for (let t, n = 0; n <= e; n++) { t = C[n].childNodes; for (let e, n = 0, i = t.length; n < i && (e = t[n], e); n++)if (!r.onlyZeroWidthSpace(e)) { /^\s{1,4}$/.test(e.textContent) ? r.removeItem(e) : /^\s{1,4}/.test(e.textContent) && (e.textContent = e.textContent.replace(/^\s{1,4}/, "")); break } } const t = r.getChildElement(C[0], "text", !1), n = r.getChildElement(C[e], "text", !0); !w && t && (E.sc = t, E.so = 0), !x && n && (E.ec = n, E.eo = n.textContent.length) } else { const e = r.createTextNode(new a.Array(d._variable.tabSize + 1).join(" ")); if (1 === C.length) { const t = d.insertNode(e, null, !0); if (!t) return !1; w || (E.sc = e, E.so = t.endOffset), x || (E.ec = e, E.eo = t.endOffset) } else { const t = C.length - 1; for (let n, i = 0; i <= t; i++)n = C[i].firstChild, n && (r.isBreak(n) ? C[i].insertBefore(e.cloneNode(!1), n) : n.textContent = e.textContent + n.textContent); const n = r.getChildElement(C[0], "text", !1), i = r.getChildElement(C[t], "text", !0); !w && n && (E.sc = n, E.so = 0), !x && i && (E.ec = i, E.eo = i.textContent.length) } } d.setRange(E.sc, E.so, E.ec, E.eo), d.history.push(!1); break; case 13: const S = r.getFreeFormatElement(c, null); if (d._charTypeHTML) { let e = ""; if (e = !i && S || i ? "
      " : "<" + f.nodeName + ">
      ", !d.checkCharCount(e, "byte-html")) return t.preventDefault(), !1 } if (!i) { const e = d._isEdgeFormat(p.endContainer, p.endOffset, "end"); if (e && /^H[1-6]$/i.test(f.nodeName) || /^HR$/i.test(f.nodeName)) { t.preventDefault(); let n = null; const i = d.appendFormatTag(f, l.defaultTag); if (e && e.length > 0) { n = e.pop(); const t = n; for (; e.length > 0;)n = n.appendChild(e.pop()); i.appendChild(t) } n = n ? n.appendChild(i.firstChild) : i.firstChild, d.setRange(n, 0, n, 0); break } if (S) { t.preventDefault(); const e = c === S, n = d.getSelection(), i = c.childNodes, l = n.focusOffset, o = c.previousElementSibling, s = c.nextSibling; if (!r.isClosureFreeFormatElement(S) && i && (e && p.collapsed && i.length - 1 <= l + 1 && r.isBreak(i[l]) && (!i[l + 1] || (!i[l + 2] || r.onlyZeroWidthSpace(i[l + 2].textContent)) && 3 === i[l + 1].nodeType && r.onlyZeroWidthSpace(i[l + 1].textContent)) && l > 0 && r.isBreak(i[l - 1]) || !e && r.onlyZeroWidthSpace(c.textContent) && r.isBreak(o) && (r.isBreak(o.previousSibling) || !r.onlyZeroWidthSpace(o.previousSibling.textContent)) && (!s || !r.isBreak(s) && r.onlyZeroWidthSpace(s.textContent)))) { e ? r.removeItem(i[l - 1]) : r.removeItem(c); const t = d.appendFormatTag(S, r.isFormatElement(S.nextElementSibling) ? S.nextElementSibling : null); r.copyFormatAttributes(t, S), d.setRange(t, 1, t, 1); break } if (e) { h.insertHTML(p.collapsed && r.isBreak(p.startContainer.childNodes[p.startOffset - 1]) ? "
      " : "

      ", !0, !1); let e = n.focusNode; const t = n.focusOffset; S === e && (e = e.childNodes[t - l > 1 ? t - 1 : t]), d.setRange(e, 1, e, 1) } else { const e = n.focusNode.nextSibling, t = r.createElement("BR"); d.insertNode(t, null, !1); const i = t.previousSibling, l = t.nextSibling; r.isBreak(e) || r.isBreak(i) || l && !r.onlyZeroWidthSpace(l) ? d.setRange(l, 0, l, 0) : (t.parentNode.insertBefore(t.cloneNode(!1), t), d.setRange(t, 1, t, 1)) } u._onShortcutKey = !0; break } } if (g) break; if (_ && f && !r.isCell(_) && !/^FIGCAPTION$/i.test(_.nodeName)) { const e = d.getRange(); if (d.isEdgePoint(e.endContainer, e.endOffset) && r.isList(c.nextSibling)) { t.preventDefault(); const e = r.createElement("LI"), n = r.createElement("BR"); e.appendChild(n), f.parentNode.insertBefore(e, f.nextElementSibling), e.appendChild(c.nextSibling), d.setRange(n, 1, n, 1); break } if ((3 !== e.commonAncestorContainer.nodeType || !e.commonAncestorContainer.nextElementSibling) && r.onlyZeroWidthSpace(f.innerText.trim())) { t.preventDefault(); let e = null; if (r.isListCell(_.parentNode)) { if (_ = f.parentNode.parentNode.parentNode, e = r.splitElement(f, null, r.getElementDepth(f) - 2), !e) { const t = r.createElement("LI"); t.innerHTML = "
      ", _.insertBefore(t, e), e = t } } else { const t = r.isCell(_.parentNode) ? "DIV" : r.isList(_.parentNode) ? "LI" : r.isFormatElement(_.nextElementSibling) ? _.nextElementSibling.nodeName : r.isFormatElement(_.previousElementSibling) ? _.previousElementSibling.nodeName : l.defaultTag; e = r.createElement(t); const n = d.detachRangeFormatElement(_, [f], null, !0, !0); n.cc.insertBefore(e, n.ec) } e.innerHTML = "
      ", r.copyFormatAttributes(e, f), r.removeItemAllParents(f, null, null), d.setRange(e, 1, e, 1); break } } if (_ && r.getParentElement(_, "FIGCAPTION") && r.getParentElement(_, r.isList) && (t.preventDefault(), f = d.appendFormatTag(f, null), d.setRange(f, 0, f, 0)), m) { t.preventDefault(), t.stopPropagation(); const n = e[m], i = n._container, o = i.previousElementSibling || i.nextElementSibling; let s = null; r.isListCell(i.parentNode) ? s = r.createElement("BR") : (s = r.createElement(r.isFormatElement(o) ? o.nodeName : l.defaultTag), s.innerHTML = "
      "), i.parentNode.insertBefore(s, i), d.callPlugin(m, (function () { !1 === d.selectComponent(n._element, m) && d.blur() }), null) } break; case 27: if (m) return t.preventDefault(), t.stopPropagation(), d.controllersOff(), !1 }if (i && 16 === n) { t.preventDefault(), t.stopPropagation(); const e = d.plugins.table; if (e && !e._shift && !e._ref) { const t = r.getParentElement(f, r.isCell); if (t) return void e.onTableCellMultiSelect.call(d, t, !0) } } else if (i && (r.isOSX_IOS ? s : o) && 32 === n) { t.preventDefault(), t.stopPropagation(); const e = d.insertNode(r.createTextNode(" ")); if (e && e.container) return void d.setRange(e.container, e.endOffset, e.container, e.endOffset) } if (!(o || s || g || u._nonTextKeyCode.test(n)) && p.collapsed && p.startContainer === p.endContainer && r.isBreak(p.commonAncestorContainer)) { const e = r.createTextNode(r.zeroWidthSpace); d.insertNode(e, null, !1), d.setRange(e, 1, e, 1) } }, onKeyUp_wysiwyg: function (e) { if (u._onShortcutKey) return; d._editorRange(); const t = d.getRange(), n = e.keyCode, i = e.ctrlKey || e.metaKey || 91 === n || 92 === n || 224 === n, o = e.altKey; let s = d.getSelectionNode(); if (d._isBalloon && (d._isBalloonAlways && 27 !== n || !t.collapsed)) { if (!d._isBalloonAlways) return void u._showToolbarBalloon(); 27 !== n && u._showToolbarBalloonDelay() } if ("function" == typeof h.onKeyUp && !1 === h.onKeyUp(e, d)) return; if (8 === n && r.isWysiwygDiv(s) && "" === s.textContent && 0 === s.children.length) { e.preventDefault(), e.stopPropagation(), s.innerHTML = ""; const t = r.createElement(r.isFormatElement(d._variable.currentNodes[0]) ? d._variable.currentNodes[0] : l.defaultTag); return t.innerHTML = "
      ", s.appendChild(t), d.setRange(t, 0, t, 0), u._applyTagEffects(), void d.history.push(!1) } const a = r.getFormatElement(s, null), c = r.getRangeFormatElement(s, null); (a || !t.collapsed) && a !== c || r.isComponent(s) || r.isList(s) || (d._setDefaultFormat(r.isRangeFormatElement(c) ? "DIV" : l.defaultTag), s = d.getSelectionNode()), u._directionKeyCode.test(n) && u._applyTagEffects(); if (!i && !o && !u._nonTextKeyCode.test(n) && 3 === s.nodeType && r.zeroWidthRegExp.test(s.textContent) && !(void 0 !== e.isComposing ? e.isComposing : u._IEisComposing)) { let e = t.startOffset, n = t.endOffset; const i = (s.textContent.substring(0, n).match(u._frontZeroWidthReg) || "").length; e = t.startOffset - i, n = t.endOffset - i, s.textContent = s.textContent.replace(r.zeroWidthRegExp, ""), d.setRange(s, e < 0 ? 0 : e, s, n < 0 ? 0 : n) } d._charCount(""), d.history.push(!0) }, onScroll_wysiwyg: function (e) { d.controllersOff(), d._isBalloon && u._hideToolbar(), "function" == typeof h.onScroll && h.onScroll(e, d) }, onFocus_wysiwyg: function (e) { d._antiBlur || (d.hasFocus = !0, u._applyTagEffects(), d._isInline && u._showToolbarInline(), "function" == typeof h.onFocus && h.onFocus(e, d)) }, onBlur_wysiwyg: function (t) { if (d._antiBlur || d._variable.isCodeView) return; d.hasFocus = !1, d.controllersOff(), (d._isInline || d._isBalloon) && u._hideToolbar(), "function" == typeof h.onBlur && h.onBlur(t, d); const i = d.commandMap, o = d.activePlugins; for (let e in i) r.hasOwn(i, e) && (o.indexOf(e) > -1 ? n[e].active.call(d, null) : i.OUTDENT && /^OUTDENT$/i.test(e) ? i.OUTDENT.setAttribute("disabled", !0) : i.INDENT && /^INDENT$/i.test(e) ? i.INDENT.removeAttribute("disabled") : r.removeClass(i[e], "active")); d._variable.currentNodes = [], d._variable.currentNodesMap = [], l.showPathLabel && (e.element.navigation.textContent = "") }, onMouseDown_resizingBar: function (t) { t.stopPropagation(), d.submenuOff(), d.controllersOff(), d._variable.resizeClientY = t.clientY, e.element.resizeBackground.style.display = "block", s.addEventListener("mousemove", u._resize_editor), s.addEventListener("mouseup", (function t() { e.element.resizeBackground.style.display = "none", s.removeEventListener("mousemove", u._resize_editor), s.removeEventListener("mouseup", t) })) }, _resize_editor: function (t) { const n = e.element.editorArea.offsetHeight + (t.clientY - d._variable.resizeClientY); e.element.wysiwygFrame.style.height = e.element.code.style.height = (n < d._variable.minResizingSize ? d._variable.minResizingSize : n) + "px", d._variable.resizeClientY = t.clientY }, onResize_window: function () { d.controllersOff(); const t = u._responsiveButtonSize; if (t) { let n = 0; n = (d._isBalloon || d._isInline) && "auto" === l.toolbarWidth ? e.element.topArea.offsetWidth : e.element.toolbar.offsetWidth; let i = "default"; for (let e = 1, l = t.length; e < l; e++)if (n < t[e]) { i = t[e] + ""; break } u._responsiveCurrentSize !== i && (u._responsiveCurrentSize = i, h.setToolbarButtons(u._responsiveButtons[i])) } if (0 !== e.element.toolbar.offsetWidth) { if (e.fileBrowser && "block" === e.fileBrowser.area.style.display && (e.fileBrowser.body.style.maxHeight = a.innerHeight - e.fileBrowser.header.offsetHeight - 50 + "px"), d.submenuActiveButton && d.submenu && d._setMenuPosition(d.submenuActiveButton, d.submenu), d._variable.isFullScreen) return d._variable.innerHeight_fullScreen += a.innerHeight - e.element.toolbar.offsetHeight - d._variable.innerHeight_fullScreen, void (e.element.editorArea.style.height = d._variable.innerHeight_fullScreen + "px"); d._variable.isCodeView && d._isInline ? u._showToolbarInline() : (d._iframeAutoHeight(), d._sticky && (e.element.toolbar.style.width = e.element.topArea.offsetWidth - 2 + "px", u.onScroll_window())) } }, onScroll_window: function () { if (d._variable.isFullScreen || 0 === e.element.toolbar.offsetWidth || l.stickyToolbar < 0) return; const t = e.element, n = t.editorArea.offsetHeight, i = (this.scrollY || s.documentElement.scrollTop) + l.stickyToolbar, o = u._getEditorOffsets(l.toolbarContainer).top - (d._isInline ? t.toolbar.offsetHeight : 0); i < o ? u._offStickyToolbar() : i + d._variable.minResizingSize >= n + o ? (d._sticky || u._onStickyToolbar(), t.toolbar.style.top = n + o + l.stickyToolbar - i - d._variable.minResizingSize + "px") : i >= o && u._onStickyToolbar() }, _getEditorOffsets: function (t) { let n = t || e.element.topArea, i = 0, l = 0, o = 0; for (; n;)i += n.offsetTop, l += n.offsetLeft, o += n.scrollTop, n = n.offsetParent; return { top: i, left: l, scroll: o } }, _getPageBottomSpace: function () { return s.documentElement.scrollHeight - (u._getEditorOffsets(null).top + e.element.topArea.offsetHeight) }, _onStickyToolbar: function () { const t = e.element; d._isInline || l.toolbarContainer || (t._stickyDummy.style.height = t.toolbar.offsetHeight + "px", t._stickyDummy.style.display = "block"), t.toolbar.style.top = l.stickyToolbar + "px", t.toolbar.style.width = d._isInline ? d._inlineToolbarAttr.width : t.toolbar.offsetWidth + "px", r.addClass(t.toolbar, "se-toolbar-sticky"), d._sticky = !0 }, _offStickyToolbar: function () { const t = e.element; t._stickyDummy.style.display = "none", t.toolbar.style.top = d._isInline ? d._inlineToolbarAttr.top : "", t.toolbar.style.width = d._isInline ? d._inlineToolbarAttr.width : "", t.editorArea.style.marginTop = "", r.removeClass(t.toolbar, "se-toolbar-sticky"), d._sticky = !1 }, _codeViewAutoHeight: function () { e.element.code.style.height = e.element.code.scrollHeight + "px" }, _hardDelete: function () { const e = d.getRange(), t = e.startContainer, n = e.endContainer, i = r.getRangeFormatElement(t), l = r.getRangeFormatElement(n), o = r.isCell(i), s = r.isCell(l); if ((o && !i.previousElementSibling && !i.parentElement.previousElementSibling || s && !l.nextElementSibling && !l.parentElement.nextElementSibling) && i !== l) if (o) { if (s) return r.removeItem(r.getParentElement(i, r.isComponent)), d.nativeFocus(), !0; r.removeItem(r.getParentElement(i, r.isComponent)) } else r.removeItem(r.getParentElement(l, r.isComponent)); const a = 1 === t.nodeType ? r.getParentElement(t, ".se-component") : null, c = 1 === n.nodeType ? r.getParentElement(n, ".se-component") : null; return a && r.removeItem(a), c && r.removeItem(c), !1 }, onPaste_wysiwyg: function (e) { const t = r.isIE ? a.clipboardData : e.clipboardData; return !t || u._dataTransferAction("paste", e, t) }, _setClipboardComponent: function (e, t, n) { e.preventDefault(), e.stopPropagation(), n.setData("text/html", t.component.outerHTML) }, onCopy_wysiwyg: function (e) { const t = r.isIE ? a.clipboardData : e.clipboardData; if ("function" == typeof h.onCopy && !h.onCopy(e, t, d)) return e.preventDefault(), e.stopPropagation(), !1; const n = d.currentFileComponentInfo; n && !r.isIE && (u._setClipboardComponent(e, n, t), r.addClass(n.component, "se-component-copy"), a.setTimeout((function () { r.removeClass(n.component, "se-component-copy") }), 150)) }, onCut_wysiwyg: function (e) { const t = r.isIE ? a.clipboardData : e.clipboardData; if ("function" == typeof h.onCut && !h.onCut(e, t, d)) return e.preventDefault(), e.stopPropagation(), !1; const n = d.currentFileComponentInfo; n && !r.isIE && (u._setClipboardComponent(e, n, t), r.removeItem(n.component), d.controllersOff()), a.setTimeout((function () { d.history.push(!1) })) }, onDrop_wysiwyg: function (e) { const t = e.dataTransfer; return !t || (r.isIE ? (e.preventDefault(), e.stopPropagation(), !1) : (d.removeNode(), u._setDropLocationSelection(e), u._dataTransferAction("drop", e, t))) }, _setDropLocationSelection: function (e) { if (e.rangeParent) d.setRange(e.rangeParent, e.rangeOffset, e.rangeParent, e.rangeOffset); else if (d._wd.caretRangeFromPoint) { const t = d._wd.caretRangeFromPoint(e.clientX, e.clientY); d.setRange(t.startContainer, t.startOffset, t.endContainer, t.endOffset) } else { const e = d.getRange(); d.setRange(e.startContainer, e.startOffset, e.endContainer, e.endOffset) } }, _dataTransferAction: function (t, n, i) { let l, o; if (r.isIE) { l = i.getData("Text"); const s = d.getRange(), c = r.createElement("DIV"), h = { sc: s.startContainer, so: s.startOffset, ec: s.endContainer, eo: s.endOffset }; return c.setAttribute("contenteditable", !0), c.style.cssText = "position:absolute; top:0; left:0; width:1px; height:1px; overflow:hidden;", e.element.relative.appendChild(c), c.focus(), a.setTimeout((function () { o = c.innerHTML, r.removeItem(c), d.setRange(h.sc, h.so, h.ec, h.eo), u._setClipboardData(t, n, l, o, i) })), !0 } if (l = i.getData("text/plain"), o = i.getData("text/html"), !1 === u._setClipboardData(t, n, l, o, i)) return n.preventDefault(), n.stopPropagation(), !1 }, _setClipboardData: function (e, t, n, i, l) { const o = /class=["']*Mso(Normal|List)/i.test(i) || /content=["']*Word.Document/i.test(i) || /content=["']*OneNote.File/i.test(i) || /content=["']*Excel.Sheet/i.test(i), s = !i; s ? i = n.replace(/\n/g, "
      ") : (o ? (i = i.replace(/\n/g, " "), n = n.replace(/\n/g, " ")) : i = (n === i ? n : i).replace(/\n/g, "
      "), i = d.cleanHTML(i, d.pasteTagsWhitelistRegExp)); const a = d._charCount(d._charTypeHTML ? i : n); if ("paste" === e && "function" == typeof h.onPaste) { const e = h.onPaste(t, i, a, d); if (!e) return !1; "string" == typeof e && (i = e) } if ("drop" === e && "function" == typeof h.onDrop) { const e = h.onDrop(t, i, a, d); if (!e) return !1; "string" == typeof e && (i = e) } s && (i = r._HTMLConvertor(i)); const c = l.files; return c.length > 0 && !o ? (/^image/.test(c[0].type) && d.plugins.image && h.insertImage(c), !1) : !!a && (i ? (h.insertHTML(i, !0, !1), !1) : void 0) }, onMouseMove_wysiwyg: function (t) { if (d.isDisabled) return; const n = r.getParentElement(t.target, r.isComponent), i = d._lineBreaker.style; if (n && !d.currentControllerName) { const o = e.element; let s = 0, a = o.wysiwyg; do { s += a.scrollTop, a = a.parentElement } while (a && !/^(BODY|HTML)$/i.test(a.nodeName)); const c = o.wysiwyg.scrollTop, h = u._getEditorOffsets(null), p = r.getOffset(n, o.wysiwygFrame).top + c, g = t.pageY + s + (l.iframe && !l.toolbarContainer ? o.toolbar.offsetHeight : 0), m = p + (l.iframe ? s : h.top), f = r.isListCell(n.parentNode); let _ = "", b = ""; if ((f ? !n.previousSibling : !r.isFormatElement(n.previousElementSibling)) && g < m + 20) b = p, _ = "t"; else { if ((f ? n.nextSibling : r.isFormatElement(n.nextElementSibling)) || !(g > m + n.offsetHeight - 20)) return void (i.display = "none"); b = p + n.offsetHeight, _ = "b" } d._variable._lineBreakComp = n, d._variable._lineBreakDir = _, i.top = b - c + "px", d._lineBreakerButton.style.left = r.getOffset(n).left + n.offsetWidth / 2 - 15 + "px", i.display = "block" } else "none" !== i.display && (i.display = "none") }, _onMouseDown_lineBreak: function (e) { e.preventDefault() }, _onLineBreak: function (e) { e.preventDefault(); const t = d._variable._lineBreakComp, n = this ? this : d._variable._lineBreakDir, i = r.isListCell(t.parentNode), o = r.createElement(i ? "BR" : r.isCell(t.parentNode) ? "DIV" : l.defaultTag); if (i || (o.innerHTML = "
      "), d._charTypeHTML && !d.checkCharCount(o.outerHTML, "byte-html")) return; t.parentNode.insertBefore(o, "t" === n ? t : t.nextSibling), d._lineBreaker.style.display = "none", d._variable._lineBreakComp = null; const s = i ? o : o.firstChild; d.setRange(s, 1, s, 1), d.history.push(!1) }, _addEvent: function () { const t = l.iframe ? d._ww : e.element.wysiwyg; e.element.toolbar.addEventListener("mousedown", u._buttonsEventHandler, !1), e.element._menuTray.addEventListener("mousedown", u._buttonsEventHandler, !1), e.element.toolbar.addEventListener("click", u.onClick_toolbar, !1), t.addEventListener("mousedown", u.onMouseDown_wysiwyg, !1), t.addEventListener("click", u.onClick_wysiwyg, !1), t.addEventListener(r.isIE ? "textinput" : "input", u.onInput_wysiwyg, !1), t.addEventListener("keydown", u.onKeyDown_wysiwyg, !1), t.addEventListener("keyup", u.onKeyUp_wysiwyg, !1), t.addEventListener("paste", u.onPaste_wysiwyg, !1), t.addEventListener("copy", u.onCopy_wysiwyg, !1), t.addEventListener("cut", u.onCut_wysiwyg, !1), t.addEventListener("drop", u.onDrop_wysiwyg, !1), t.addEventListener("scroll", u.onScroll_wysiwyg, !1), t.addEventListener("focus", u.onFocus_wysiwyg, !1), t.addEventListener("blur", u.onBlur_wysiwyg, !1), u._lineBreakerBind = { a: u._onLineBreak.bind(""), t: u._onLineBreak.bind("t"), b: u._onLineBreak.bind("b") }, t.addEventListener("mousemove", u.onMouseMove_wysiwyg, !1), d._lineBreakerButton.addEventListener("mousedown", u._onMouseDown_lineBreak, !1), d._lineBreakerButton.addEventListener("click", u._lineBreakerBind.a, !1), e.element.lineBreaker_t.addEventListener("mousedown", u._lineBreakerBind.t, !1), e.element.lineBreaker_b.addEventListener("mousedown", u._lineBreakerBind.b, !1), d.plugins.table && t.addEventListener("touchstart", u.onMouseDown_wysiwyg, { passive: !0, useCapture: !1 }), "auto" !== l.height || l.codeMirrorEditor || (e.element.code.addEventListener("keydown", u._codeViewAutoHeight, !1), e.element.code.addEventListener("keyup", u._codeViewAutoHeight, !1), e.element.code.addEventListener("paste", u._codeViewAutoHeight, !1)), e.element.resizingBar && (/\d+/.test(l.height) ? e.element.resizingBar.addEventListener("mousedown", u.onMouseDown_resizingBar, !1) : r.addClass(e.element.resizingBar, "se-resizing-none")), u._setResponsiveToolbar(), a.removeEventListener("resize", u.onResize_window), a.removeEventListener("scroll", u.onScroll_window), a.addEventListener("resize", u.onResize_window, !1), l.stickyToolbar > -1 && a.addEventListener("scroll", u.onScroll_window, !1) }, _removeEvent: function () { const t = l.iframe ? d._ww : e.element.wysiwyg; e.element.toolbar.removeEventListener("mousedown", u._buttonsEventHandler), e.element._menuTray.removeEventListener("mousedown", u._buttonsEventHandler), e.element.toolbar.removeEventListener("click", u.onClick_toolbar), t.removeEventListener("mousedown", u.onMouseDown_wysiwyg), t.removeEventListener("click", u.onClick_wysiwyg), t.removeEventListener(r.isIE ? "textinput" : "input", u.onInput_wysiwyg), t.removeEventListener("keydown", u.onKeyDown_wysiwyg), t.removeEventListener("keyup", u.onKeyUp_wysiwyg), t.removeEventListener("paste", u.onPaste_wysiwyg), t.removeEventListener("copy", u.onCopy_wysiwyg), t.removeEventListener("cut", u.onCut_wysiwyg), t.removeEventListener("drop", u.onDrop_wysiwyg), t.removeEventListener("scroll", u.onScroll_wysiwyg), t.removeEventListener("mousemove", u.onMouseMove_wysiwyg), d._lineBreakerButton.removeEventListener("mousedown", u._onMouseDown_lineBreak), d._lineBreakerButton.removeEventListener("click", u._lineBreakerBind.a), e.element.lineBreaker_t.removeEventListener("mousedown", u._lineBreakerBind.t), e.element.lineBreaker_b.removeEventListener("mousedown", u._lineBreakerBind.b), u._lineBreakerBind = null, t.removeEventListener("touchstart", u.onMouseDown_wysiwyg, { passive: !0, useCapture: !1 }), t.removeEventListener("focus", u.onFocus_wysiwyg), t.removeEventListener("blur", u.onBlur_wysiwyg), e.element.code.removeEventListener("keydown", u._codeViewAutoHeight), e.element.code.removeEventListener("keyup", u._codeViewAutoHeight), e.element.code.removeEventListener("paste", u._codeViewAutoHeight), e.element.resizingBar && e.element.resizingBar.removeEventListener("mousedown", u.onMouseDown_resizingBar), a.removeEventListener("resize", u.onResize_window), a.removeEventListener("scroll", u.onScroll_window) }, _setResponsiveToolbar: function () { if (0 === o.length) return void (o = null); u._responsiveCurrentSize = "default"; const e = u._responsiveButtonSize = [], t = u._responsiveButtons = { default: o[0] }; for (let n, i, l = 1, s = o.length; l < s; l++)i = o[l], n = 1 * i[0], e.push(n), t[n] = i[1]; e.sort((function (e, t) { return e - t })).unshift("default") } }, h = { core: d, util: r, onload: null, onScroll: null, onMouseDown: null, onClick: null, onInput: null, onKeyDown: null, onKeyUp: null, onCopy: null, onCut: null, onFocus: null, onBlur: null, onChange: null, onDrop: null, onPaste: null, showInline: null, showController: null, toggleCodeView: null, toggleFullScreen: null, imageUploadHandler: null, videoUploadHandler: null, audioUploadHandler: null, onImageUploadBefore: null, onVideoUploadBefore: null, onAudioUploadBefore: null, onImageUpload: null, onVideoUpload: null, onAudioUpload: null, onImageUploadError: null, onVideoUploadError: null, onAudioUploadError: null, setToolbarButtons: function (i) { d.submenuOff(), d.containerOff(); const a = B._createToolBar(s, i, d.plugins, l); o = a.responsiveButtons, d._moreLayerActiveButton = null, u._setResponsiveToolbar(), e.element.toolbar.replaceChild(a._buttonTray, e.element._buttonTray); const c = A(e.element.originElement, d._getConstructed(e.element), l); e.element = c.element, e.tool = c.tool, l.iframe && (e.element.wysiwyg = d._wd.body), d._cachingButtons(), d.history._resetCachingButton(), d.activePlugins = []; const h = t; let p, g, m; t = a.pluginCallButtons; for (let e in t) r.hasOwn(t, e) && (p = n[e], g = t[e], p.active && g && (m = h[e], d.callPlugin(e, null, m || g), m && (g.parentElement.replaceChild(m, g), t[e] = m))); d.hasFocus && u._applyTagEffects(), d._variable.isCodeView && r.addClass(d._styleCommandMap.codeView, "active"), d._variable.isFullScreen && r.addClass(d._styleCommandMap.fullScreen, "active"), r.hasClass(e.element.wysiwyg, "se-show-block") && r.addClass(d._styleCommandMap.showBlocks, "active") }, setOptions: function (s) { u._removeEvent(), d._resetComponents(), r.removeClass(d._styleCommandMap.showBlocks, "active"), r.removeClass(d._styleCommandMap.codeView, "active"), d._variable.isCodeView = !1, d._iframeAuto = null, d.plugins = s.plugins || d.plugins; const c = [l, s].reduce((function (e, t) { for (let n in t) if (r.hasOwn(t, n)) if ("plugins" === n && t[n] && e[n]) { let i = e[n], l = t[n]; i = i.length ? i : a.Object.keys(i).map((function (e) { return i[e] })), l = l.length ? l : a.Object.keys(l).map((function (e) { return l[e] })), e[n] = l.filter((function (e) { return -1 === i.indexOf(e) })).concat(i) } else e[n] = t[n]; return e }), {}), h = e.element, p = h.wysiwyg.innerHTML, g = B._setOptions(c, e, l); g.callButtons && (t = g.callButtons, d.initPlugins = {}), g.plugins && (d.plugins = n = g.plugins), 0 === h._menuTray.children.length && (this._menuTray = {}), o = g.toolbar.responsiveButtons, d.options = l = c, d.lang = i = l.lang, l.iframe && h.wysiwygFrame.addEventListener("load", (function () { r._setIframeDocument(this, l), d._setOptionsInit(h, p) })), h.editorArea.appendChild(h.wysiwygFrame), l.iframe || d._setOptionsInit(h, p) }, setDefaultStyle: function (t) { const n = l._editorStyles = r._setDefaultOptionStyle(l, t), i = e.element; i.topArea.style.cssText = n.top, i.code.style.cssText = l._editorStyles.frame, i.code.style.display = "none", "auto" === l.height ? i.code.style.overflow = "hidden" : i.code.style.overflow = "", l.iframe ? (i.wysiwygFrame.style.cssText = n.frame, i.wysiwyg.style.cssText = n.editor) : i.wysiwygFrame.style.cssText = n.frame + n.editor }, noticeOpen: function (e) { d.notice.open.call(d, e) }, noticeClose: function () { d.notice.close.call(d) }, save: function () { e.element.originElement.value = d.getContents(!1) }, getContext: function () { return e }, getContents: function (e) { return d.getContents(e) }, getText: function () { return e.element.wysiwyg.textContent }, getCharCount: function (t) { return t = "string" == typeof t ? t : l.charCounterType, d.getCharLength(d._charTypeHTML ? e.element.wysiwyg.innerHTML : e.element.wysiwyg.textContent, t) }, getImagesInfo: function () { return e.image ? e.image._infoList : [] }, getFilesInfo: function (t) { return e[t] ? e[t]._infoList : [] }, insertImage: function (e) { d.plugins.image && e && (d.initPlugins.image ? d.plugins.image.submitAction.call(d, e) : d.callPlugin("image", d.plugins.image.submitAction.bind(d, e), null), d.focus()) }, insertHTML: function (e, t, n, i) { if ("string" == typeof e) { t || (e = d.cleanHTML(e, null)); try { const t = s.createRange().createContextualFragment(e).childNodes; if (n) { const e = d._charTypeHTML ? "outerHTML" : "textContent"; let n = ""; for (let i = 0, l = t.length; i < l; i++)n += t[i][e]; if (!d.checkCharCount(n, null)) return } let l, o, a, c, u; for (; l = t[0];)c && 3 === c.nodeType && o && 1 === o.nodeType && r.isBreak(l) ? (c = l, r.removeItem(l)) : (a = d.insertNode(l, o, !1), o = a.container || a, u || (u = a), c = l); 3 === c.nodeType && 1 === o.nodeType && (o = c); const h = 3 === o.nodeType ? a.endOffset || o.textContent.length : o.childNodes.length; i ? d.setRange(u.container || u, u.startOffset || 0, o, h) : d.setRange(o, h, o, h) } catch (t) { console.warn("[SUNEDITOR.insertHTML.fail] " + t), d.execCommand("insertHTML", !1, e) } } else if (r.isComponent(e)) d.insertComponent(e, !1, n, !1); else { let t = null; (r.isFormatElement(e) || r.isMedia(e)) && (t = r.getFormatElement(d.getSelectionNode(), null)), d.insertNode(e, t, n) } d.effectNode = null, d.focus(), d.history.push(!1) }, setContents: function (e) { d.setContents(e) }, appendContents: function (t) { const n = d.convertContentsForEditor(t); if (d._variable.isCodeView) d._setCodeView(d._getCodeView() + "\n" + d.convertHTMLForCodeView(n)); else { const t = r.createElement("DIV"); t.innerHTML = n; const i = e.element.wysiwyg, l = t.children; for (let e = 0, t = l.length; e < t; e++)i.appendChild(l[e]) } d.history.push(!1) }, disabled: function () { e.tool.cover.style.display = "block", e.element.wysiwyg.setAttribute("contenteditable", !1), d.isDisabled = !0, l.codeMirrorEditor ? l.codeMirrorEditor.setOption("readOnly", !0) : e.element.code.setAttribute("disabled", "disabled") }, enabled: function () { e.tool.cover.style.display = "none", e.element.wysiwyg.setAttribute("contenteditable", !0), d.isDisabled = !1, l.codeMirrorEditor ? l.codeMirrorEditor.setOption("readOnly", !1) : e.element.code.removeAttribute("disabled") }, show: function () { const t = e.element.topArea.style; "none" === t.display && (t.display = l.display) }, hide: function () { e.element.topArea.style.display = "none" }, destroy: function () { d.submenuOff(), d.containerOff(), d.controllersOff(), d.notice && d.notice.close.call(d), d.modalForm && d.plugins.dialog.close.call(d), d.history._destroy(), u._removeEvent(), r.removeItem(e.element.toolbar), r.removeItem(e.element.topArea); for (let e in d) r.hasOwn(d, e) && delete d[e]; for (let e in u) r.hasOwn(u, e) && delete u[e]; for (let t in e) r.hasOwn(e, t) && delete e[t]; for (let e in t) r.hasOwn(t, e) && delete t[e]; for (let e in this) r.hasOwn(this, e) && delete this[e] }, toolbar: { disabled: function () { e.tool.cover.style.display = "block" }, enabled: function () { e.tool.cover.style.display = "none" }, show: function () { d._isInline ? u._showToolbarInline() : (e.element.toolbar.style.display = "", e.element._stickyDummy.style.display = "") }, hide: function () { d._isInline ? u._hideToolbar() : (e.element.toolbar.style.display = "none", e.element._stickyDummy.style.display = "none") } } }; d.functions = h, d.options = l; let p = e.element, g = p.originElement, m = p.topArea; return g.style.display = "none", m.style.display = "block", l.iframe && p.wysiwygFrame.addEventListener("load", (function () { r._setIframeDocument(this, l), d._editorInit(!1, l.value), l.value = null })), "object" == typeof g.nextElementSibling ? g.parentNode.insertBefore(m, g.nextElementSibling) : g.parentNode.appendChild(m), p.editorArea.appendChild(p.wysiwygFrame), p = g = m = null, l.iframe || (d._editorInit(!1, l.value), l.value = null), h }(A(i, l.constructed, l.options), l.pluginCallButtons, l.plugins, l.options.lang, t, l._responsiveButtons) } }; window.SUNEDITOR || Object.defineProperty(window, "SUNEDITOR", { enumerable: !0, writable: !1, configurable: !1, value: z.init({ plugins: E }) }) }, ZED3: function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { name: "component", set_container: function (e, t) { const n = this.util.createElement("DIV"); return n.className = "se-component " + t, n.setAttribute("contenteditable", !1), n.appendChild(e), n }, set_cover: function (e) { const t = this.util.createElement("FIGURE"); return t.appendChild(e), t }, create_caption: function () { const e = this.util.createElement("FIGCAPTION"); return e.setAttribute("contenteditable", !0), e.innerHTML = "
      " + this.lang.dialogBox.caption + "
      ", e } }; return void 0 === t && (e.SUNEDITOR_MODULES || Object.defineProperty(e, "SUNEDITOR_MODULES", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_MODULES, "component", { enumerable: !0, writable: !1, configurable: !1, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_MODULES a window with a document"); return l(e) } : l(i) }, ee5k: function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { name: "resizing", add: function (e) { const t = e.icons, n = e.context; n.resizing = { _resizeClientX: 0, _resizeClientY: 0, _resize_plugin: "", _resize_w: 0, _resize_h: 0, _origin_w: 0, _origin_h: 0, _rotateVertical: !1, _resize_direction: "", _move_path: null, _isChange: !1, alignIcons: { basic: t.align_justify, left: t.align_left, right: t.align_right, center: t.align_center } }; let i = this.setController_resize(e); n.resizing.resizeContainer = i, n.resizing.resizeDiv = i.querySelector(".se-modal-resize"), n.resizing.resizeDot = i.querySelector(".se-resize-dot"), n.resizing.resizeDisplay = i.querySelector(".se-resize-display"); let l = this.setController_button(e); n.resizing.resizeButton = l; let o = n.resizing.resizeHandles = n.resizing.resizeDot.querySelectorAll("span"); n.resizing.resizeButtonGroup = l.querySelector("._se_resizing_btn_group"), n.resizing.rotationButtons = l.querySelectorAll("._se_resizing_btn_group ._se_rotation"), n.resizing.percentageButtons = l.querySelectorAll("._se_resizing_btn_group ._se_percentage"), n.resizing.alignMenu = l.querySelector(".se-resizing-align-list"), n.resizing.alignMenuList = n.resizing.alignMenu.querySelectorAll("button"), n.resizing.alignButton = l.querySelector("._se_resizing_align_button"), n.resizing.autoSizeButton = l.querySelector("._se_resizing_btn_group ._se_auto_size"), n.resizing.captionButton = l.querySelector("._se_resizing_caption_button"), i.addEventListener("mousedown", (function (e) { e.preventDefault() })), o[0].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[1].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[2].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[3].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[4].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[5].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[6].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), o[7].addEventListener("mousedown", this.onMouseDown_resize_handle.bind(e)), l.addEventListener("click", this.onClick_resizeButton.bind(e)), n.element.relative.appendChild(i), n.element.relative.appendChild(l), i = null, l = null, o = null }, setController_resize: function (e) { const t = e.util.createElement("DIV"); return t.className = "se-controller se-resizing-container", t.style.display = "none", t.innerHTML = '
      ', t }, setController_button: function (e) { const t = e.lang, n = e.icons, i = e.util.createElement("DIV"); return i.className = "se-controller se-controller-resizing", i.innerHTML = '
      ", i }, _module_getSizeX: function (e, t, n, i) { return t || (t = e._element), n || (n = e._cover), i || (i = e._container), t ? /%$/.test(t.style.width) ? (i && this.util.getNumber(i.style.width, 2) || 100) + "%" : t.style.width : "" }, _module_getSizeY: function (e, t, n, i) { return t || (t = e._element), n || (n = e._cover), i || (i = e._container), i && n ? this.util.getNumber(n.style.paddingBottom, 0) > 0 && !this.context.resizing._rotateVertical ? n.style.height : /%$/.test(t.style.height) && /%$/.test(t.style.width) ? (i && this.util.getNumber(i.style.height, 2) || 100) + "%" : t.style.height : t && t.style.height || "" }, _module_setModifyInputSize: function (e, t) { const n = e._onlyPercentage && this.context.resizing._rotateVertical; e.proportion.checked = e._proportionChecked = "false" !== e._element.getAttribute("data-proportion"); let i = n ? "" : this.plugins.resizing._module_getSizeX.call(this, e); if (i === e._defaultSizeX && (i = ""), e._onlyPercentage && (i = this.util.getNumber(i, 2)), e.inputX.value = i, t.setInputSize.call(this, "x"), !e._onlyPercentage) { let t = n ? "" : this.plugins.resizing._module_getSizeY.call(this, e); t === e._defaultSizeY && (t = ""), e._onlyPercentage && (t = this.util.getNumber(t, 2)), e.inputY.value = t } e.inputX.disabled = !!n, e.inputY.disabled = !!n, e.proportion.disabled = !!n, t.setRatio.call(this) }, _module_setInputSize: function (e, t) { if (e._onlyPercentage) "x" === t && e.inputX.value > 100 && (e.inputX.value = 100); else if (e.proportion.checked && e._ratio && /\d/.test(e.inputX.value) && /\d/.test(e.inputY.value)) { const n = e.inputX.value.replace(/\d+|\./g, "") || e.sizeUnit, i = e.inputY.value.replace(/\d+|\./g, "") || e.sizeUnit; if (n !== i) return; const l = "%" === n ? 2 : 0; "x" === t ? e.inputY.value = this.util.getNumber(e._ratioY * this.util.getNumber(e.inputX.value, l), l) + i : e.inputX.value = this.util.getNumber(e._ratioX * this.util.getNumber(e.inputY.value, l), l) + n } }, _module_setRatio: function (e) { const t = e.inputX.value, n = e.inputY.value; if (e.proportion.checked && /\d+/.test(t) && /\d+/.test(n)) { if ((t.replace(/\d+|\./g, "") || e.sizeUnit) !== (n.replace(/\d+|\./g, "") || e.sizeUnit)) e._ratio = !1; else if (!e._ratio) { const i = this.util.getNumber(t, 0), l = this.util.getNumber(n, 0); e._ratio = !0, e._ratioX = i / l, e._ratioY = l / i } } else e._ratio = !1 }, _module_sizeRevert: function (e) { e._onlyPercentage ? e.inputX.value = e._origin_w > 100 ? 100 : e._origin_w : (e.inputX.value = e._origin_w, e.inputY.value = e._origin_h) }, _module_saveCurrentSize: function (e) { const t = this.plugins.resizing._module_getSizeX.call(this, e), n = this.plugins.resizing._module_getSizeY.call(this, e); e._element.setAttribute("data-size", t + "," + n), e._videoRatio && (e._videoRatio = n) }, call_controller_resize: function (e, t) { const n = this.context.resizing, i = this.context[t]; n._resize_plugin = t; const l = n.resizeContainer, o = n.resizeDiv, s = this.util.getOffset(e, this.context.element.wysiwygFrame), a = n._rotateVertical = /^(90|270)$/.test(Math.abs(e.getAttribute("data-rotate")).toString()), r = a ? e.offsetHeight : e.offsetWidth, c = a ? e.offsetWidth : e.offsetHeight, d = s.top, u = s.left - this.context.element.wysiwygFrame.scrollLeft; l.style.top = d + "px", l.style.left = u + "px", l.style.width = r + "px", l.style.height = c + "px", o.style.top = "0px", o.style.left = "0px", o.style.width = r + "px", o.style.height = c + "px"; let h = e.getAttribute("data-align") || "basic"; h = "none" === h ? "basic" : h; const p = this.util.getParentElement(e, this.util.isComponent), g = this.util.getParentElement(e, "FIGURE"), m = this.plugins.resizing._module_getSizeX.call(this, i, e, g, p) || "auto", f = i._onlyPercentage && "image" === t ? "" : ", " + (this.plugins.resizing._module_getSizeY.call(this, i, e, g, p) || "auto"); this.util.changeTxt(n.resizeDisplay, this.lang.dialogBox[h] + " (" + m + f + ")"), n.resizeButtonGroup.style.display = i._resizing ? "" : "none"; const _ = !i._resizing || i._resizeDotHide || i._onlyPercentage ? "none" : "flex", b = n.resizeHandles; for (let e = 0, t = b.length; e < t; e++)b[e].style.display = _; if (i._resizing) { const e = n.rotationButtons; e[0].style.display = e[1].style.display = i._rotation ? "" : "none" } const v = n.alignMenuList; this.util.changeElement(n.alignButton.firstElementChild, n.alignIcons[h]); for (let e = 0, t = v.length; e < t; e++)v[e].getAttribute("data-value") === h ? this.util.addClass(v[e], "on") : this.util.removeClass(v[e], "on"); const y = n.percentageButtons, C = /%$/.test(e.style.width) && /%$/.test(p.style.width) ? this.util.getNumber(p.style.width, 0) / 100 + "" : ""; for (let e = 0, t = y.length; e < t; e++)y[e].getAttribute("data-value") === C ? this.util.addClass(y[e], "active") : this.util.removeClass(y[e], "active"); i._captionShow ? (n.captionButton.style.display = "", this.util.getChildElement(e.parentNode, "figcaption") ? (this.util.addClass(n.captionButton, "active"), i._captionChecked = !0) : (this.util.removeClass(n.captionButton, "active"), i._captionChecked = !1)) : n.captionButton.style.display = "none", l.style.display = "block"; const w = { left: 0, top: 50 }; this.options.iframe && (w.left -= this.context.element.wysiwygFrame.parentElement.offsetLeft, w.top -= this.context.element.wysiwygFrame.parentElement.offsetTop), this.setControllerPosition(n.resizeButton, l, "bottom", w), this.controllersOn(l, n.resizeButton, this.util.setDisabledButtons.bind(this, !1, this.resizingDisabledButtons), e, t), this.util.setDisabledButtons(!0, this.resizingDisabledButtons), n._resize_w = r, n._resize_h = c; const x = (e.getAttribute("origin-size") || "").split(","); return n._origin_w = x[0] || e.naturalWidth, n._origin_h = x[1] || e.naturalHeight, { w: r, h: c, t: d, l: u } }, _closeAlignMenu: null, openAlignMenu: function () { const e = this.context.resizing.alignButton; this.util.addClass(e, "on"), this.context.resizing.alignMenu.style.top = e.offsetTop + e.offsetHeight + "px", this.context.resizing.alignMenu.style.left = e.offsetLeft - e.offsetWidth / 2 + "px", this.context.resizing.alignMenu.style.display = "block", this.plugins.resizing._closeAlignMenu = function () { this.util.removeClass(this.context.resizing.alignButton, "on"), this.context.resizing.alignMenu.style.display = "none", this.removeDocEvent("click", this.plugins.resizing._closeAlignMenu), this.plugins.resizing._closeAlignMenu = null }.bind(this), this.addDocEvent("click", this.plugins.resizing._closeAlignMenu) }, onClick_resizeButton: function (e) { e.stopPropagation(); const t = e.target, n = t.getAttribute("data-command") || t.parentNode.getAttribute("data-command"); if (!n) return; const i = t.getAttribute("data-value") || t.parentNode.getAttribute("data-value"), l = this.context.resizing._resize_plugin, o = this.context[l], s = o._element, a = this.plugins[l]; if (e.preventDefault(), "function" != typeof this.plugins.resizing._closeAlignMenu || (this.plugins.resizing._closeAlignMenu(), "onalign" !== n)) { switch (n) { case "auto": this.plugins.resizing.resetTransform.call(this, s), a.setAutoSize.call(this), this.selectComponent(s, l); break; case "percent": let e = this.plugins.resizing._module_getSizeY.call(this, o); if (this.context.resizing._rotateVertical) { const t = s.getAttribute("data-percentage"); t && (e = t.split(",")[1]) } this.plugins.resizing.resetTransform.call(this, s), a.setPercentSize.call(this, 100 * i, null !== this.util.getNumber(e, 0) && /%$/.test(e) ? e : ""), this.selectComponent(s, l); break; case "mirror": const t = s.getAttribute("data-rotate") || "0"; let n = s.getAttribute("data-rotateX") || "", r = s.getAttribute("data-rotateY") || ""; "h" === i && !this.context.resizing._rotateVertical || "v" === i && this.context.resizing._rotateVertical ? r = r ? "" : "180" : n = n ? "" : "180", s.setAttribute("data-rotateX", n), s.setAttribute("data-rotateY", r), this.plugins.resizing._setTransForm(s, t, n, r); break; case "rotate": const c = this.context.resizing, d = 1 * s.getAttribute("data-rotate") + 1 * i, u = this._w.Math.abs(d) >= 360 ? 0 : d; s.setAttribute("data-rotate", u), c._rotateVertical = /^(90|270)$/.test(this._w.Math.abs(u).toString()), this.plugins.resizing.setTransformSize.call(this, s, null, null), this.selectComponent(s, l); break; case "onalign": return void this.plugins.resizing.openAlignMenu.call(this); case "align": const h = "basic" === i ? "none" : i; a.setAlign.call(this, h, null, null, null), this.selectComponent(s, l); break; case "caption": const p = !o._captionChecked; if (a.openModify.call(this, !0), o._captionChecked = o.captionCheckEl.checked = p, a.update_image.call(this, !1, !1, !1), p) { const e = this.util.getChildElement(o._caption, (function (e) { return 3 === e.nodeType })); e ? this.setRange(e, 0, e, e.textContent.length) : o._caption.focus(), this.controllersOff() } else this.selectComponent(s, l), a.openModify.call(this, !0); break; case "revert": a.setOriginSize.call(this), this.selectComponent(s, l); break; case "update": a.openModify.call(this), this.controllersOff(); break; case "delete": a.destroy.call(this) }this.history.push(!1) } }, resetTransform: function (e) { const t = (e.getAttribute("data-size") || e.getAttribute("data-origin") || "").split(","); this.context.resizing._rotateVertical = !1, e.style.maxWidth = "", e.style.transform = "", e.style.transformOrigin = "", e.setAttribute("data-rotate", ""), e.setAttribute("data-rotateX", ""), e.setAttribute("data-rotateY", ""), this.plugins[this.context.resizing._resize_plugin].setSize.call(this, t[0] ? t[0] : "auto", t[1] ? t[1] : "", !0) }, setTransformSize: function (e, t, n) { let i = e.getAttribute("data-percentage"); const l = this.context.resizing._rotateVertical, o = 1 * e.getAttribute("data-rotate"); let s = ""; if (i && !l) i = i.split(","), "auto" === i[0] && "auto" === i[1] ? this.plugins[this.context.resizing._resize_plugin].setAutoSize.call(this) : this.plugins[this.context.resizing._resize_plugin].setPercentSize.call(this, i[0], i[1]); else { const i = this.util.getParentElement(e, "FIGURE"), a = t || e.offsetWidth, r = n || e.offsetHeight, c = (l ? r : a) + "px", d = (l ? a : r) + "px"; if (this.plugins[this.context.resizing._resize_plugin].cancelPercentAttr.call(this), this.plugins[this.context.resizing._resize_plugin].setSize.call(this, a + "px", r + "px", !0), i.style.width = c, i.style.height = this.context[this.context.resizing._resize_plugin]._caption ? "" : d, l) { let e = a / 2 + "px " + a / 2 + "px 0", t = r / 2 + "px " + r / 2 + "px 0"; s = 90 === o || -270 === o ? t : e } } e.style.transformOrigin = s, this.plugins.resizing._setTransForm(e, o.toString(), e.getAttribute("data-rotateX") || "", e.getAttribute("data-rotateY") || ""), e.style.maxWidth = l ? "none" : "", this.plugins.resizing.setCaptionPosition.call(this, e) }, _setTransForm: function (e, t, n, i) { let l = (e.offsetWidth - e.offsetHeight) * (/-/.test(t) ? 1 : -1), o = ""; if (/[1-9]/.test(t) && (n || i)) switch (o = n ? "Y" : "X", t) { case "90": o = n && i ? "X" : i ? o : ""; break; case "270": l *= -1, o = n && i ? "Y" : n ? o : ""; break; case "-90": o = n && i ? "Y" : n ? o : ""; break; case "-270": l *= -1, o = n && i ? "X" : i ? o : ""; break; default: o = "" }t % 180 == 0 && (e.style.maxWidth = ""), e.style.transform = "rotate(" + t + "deg)" + (n ? " rotateX(" + n + "deg)" : "") + (i ? " rotateY(" + i + "deg)" : "") + (o ? " translate" + o + "(" + l + "px)" : "") }, setCaptionPosition: function (e) { const t = this.util.getChildElement(this.util.getParentElement(e, "FIGURE"), "FIGCAPTION"); t && (t.style.marginTop = (this.context.resizing._rotateVertical ? e.offsetWidth - e.offsetHeight : 0) + "px") }, onMouseDown_resize_handle: function (e) { e.stopPropagation(), e.preventDefault(); const t = this.context.resizing, n = t._resize_direction = e.target.classList[0]; t._resizeClientX = e.clientX, t._resizeClientY = e.clientY, this.context.element.resizeBackground.style.display = "block", t.resizeButton.style.display = "none", t.resizeDiv.style.float = /l/.test(n) ? "right" : /r/.test(n) ? "left" : "none"; const i = function (e) { if ("keydown" === e.type && 27 !== e.keyCode) return; const o = t._isChange; t._isChange = !1, this.removeDocEvent("mousemove", l), this.removeDocEvent("mouseup", i), this.removeDocEvent("keydown", i), "keydown" === e.type ? (this.controllersOff(), this.context.element.resizeBackground.style.display = "none", this.plugins[this.context.resizing._resize_plugin].init.call(this)) : (this.plugins.resizing.cancel_controller_resize.call(this, n), o && this.history.push(!1)) }.bind(this), l = this.plugins.resizing.resizing_element.bind(this, t, n, this.context[t._resize_plugin]); this.addDocEvent("mousemove", l), this.addDocEvent("mouseup", i), this.addDocEvent("keydown", i) }, resizing_element: function (e, t, n, i) { const l = i.clientX, o = i.clientY; let s = n._element_w, a = n._element_h; const r = n._element_w + (/r/.test(t) ? l - e._resizeClientX : e._resizeClientX - l), c = n._element_h + (/b/.test(t) ? o - e._resizeClientY : e._resizeClientY - o), d = n._element_h / n._element_w * r; /t/.test(t) && (e.resizeDiv.style.top = n._element_h - (/h/.test(t) ? c : d) + "px"), /l/.test(t) && (e.resizeDiv.style.left = n._element_w - r + "px"), /r|l/.test(t) && (e.resizeDiv.style.width = r + "px", s = r), /^(t|b)[^h]$/.test(t) ? (e.resizeDiv.style.height = d + "px", a = d) : /^(t|b)h$/.test(t) && (e.resizeDiv.style.height = c + "px", a = c), e._resize_w = s, e._resize_h = a, this.util.changeTxt(e.resizeDisplay, this._w.Math.round(s) + " x " + this._w.Math.round(a)), e._isChange = !0 }, cancel_controller_resize: function (e) { const t = this.context.resizing._rotateVertical; this.controllersOff(), this.context.element.resizeBackground.style.display = "none"; let n = this._w.Math.round(t ? this.context.resizing._resize_h : this.context.resizing._resize_w), i = this._w.Math.round(t ? this.context.resizing._resize_w : this.context.resizing._resize_h); if (!t && !/%$/.test(n)) { const e = 16, t = this.context.element.wysiwygFrame.clientWidth - 2 * e - 2; this.util.getNumber(n, 0) > t && (i = this._w.Math.round(i / n * t), n = t) } const l = this.context.resizing._resize_plugin; this.plugins[l].setSize.call(this, n, i, !1, e), t && this.plugins.resizing.setTransformSize.call(this, this.context[this.context.resizing._resize_plugin]._element, n, i), this.selectComponent(this.context[l]._element, l) } }; return void 0 === t && (e.SUNEDITOR_MODULES || Object.defineProperty(e, "SUNEDITOR_MODULES", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_MODULES, "resizing", { enumerable: !0, writable: !1, configurable: !1, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_MODULES a window with a document"); return l(e) } : l(i) }, "gjS+": function (e, t, n) { "use strict"; var i, l; i = "undefined" != typeof window ? window : this, l = function (e, t) { const n = { name: "fileManager", _xmlHttp: null, _checkMediaComponent: function (e) { return /IMG/i.test(e) ? !/FIGURE/i.test(e.parentElement.nodeName) || !/FIGURE/i.test(e.parentElement.parentElement.nodeName) : !/VIDEO/i.test(e) || !/FIGURE/i.test(e.parentElement.nodeName) }, upload: function (e, t, n, i, l) { this.showLoading(); const o = this.plugins.fileManager, s = o._xmlHttp = this.util.getXMLHttpRequest(); if (s.onreadystatechange = o._callBackUpload.bind(this, s, i, l), s.open("post", e, !0), null !== t && "object" == typeof t && this._w.Object.keys(t).length > 0) for (let e in t) s.setRequestHeader(e, t[e]); s.send(n) }, _callBackUpload: function (e, t, n) { if (4 === e.readyState) if (200 === e.status) try { t(e) } catch (e) { throw Error('[SUNEDITOR.fileManager.upload.callBack.fail] cause : "' + e.message + '"') } finally { this.closeLoading() } else { this.closeLoading(); const t = e.responseText ? JSON.parse(e.responseText) : e; if ("function" != typeof n || n("", t, this)) { const n = "[SUNEDITOR.fileManager.upload.serverException] status: " + e.status + ", response: " + (t.errorMessage || e.responseText); throw this.functions.noticeOpen(n), Error(n) } } }, checkInfo: function (e, t, n, i, l) { let o = []; for (let e = 0, n = t.length; e < n; e++)o = o.concat([].slice.call(this.context.element.wysiwyg.getElementsByTagName(t[e]))); const s = this.plugins.fileManager, a = this.context[e], r = a._infoList, c = s.setInfo.bind(this); if (o.length === r.length) { if (this._componentsInfoReset) { for (let t = 0, i = o.length; t < i; t++)c(e, o[t], n, null, l); return } { let e = !1; for (let t, n = 0, i = r.length; n < i; n++)if (t = r[n], 0 === o.filter((function (e) { return t.src === e.src && t.index.toString() === e.getAttribute("data-index") })).length) { e = !0; break } if (!e) return } } const d = l ? this.context.resizing._resize_plugin : ""; l && (this.context.resizing._resize_plugin = e); const u = [], h = []; for (let e = 0, t = r.length; e < t; e++)h[e] = r[e].index; for (let t, r = 0, d = o.length; r < d; r++)t = o[r], this.util.getParentElement(t, this.util.isMediaComponent) && s._checkMediaComponent(t) ? !t.getAttribute("data-index") || h.indexOf(1 * t.getAttribute("data-index")) < 0 ? (u.push(a._infoIndex), t.removeAttribute("data-index"), c(e, t, n, null, l)) : u.push(1 * t.getAttribute("data-index")) : (u.push(a._infoIndex), i(t)); for (let e, t = 0; t < r.length; t++)e = r[t].index, u.indexOf(e) > -1 || (r.splice(t, 1), "function" == typeof n && n(null, e, "delete", null, 0, this), t--); l && (this.context.resizing._resize_plugin = d) }, setInfo: function (e, t, n, i, l) { const o = l ? this.context.resizing._resize_plugin : ""; l && (this.context.resizing._resize_plugin = e); const s = this.plugins[e], a = this.context[e], r = a._infoList; let c = t.getAttribute("data-index"), d = null, u = ""; if (i || (i = { name: t.getAttribute("data-file-name") || ("string" == typeof t.src ? t.src.split("/").pop() : ""), size: t.getAttribute("data-file-size") || 0 }), !c || this._componentsInfoInit) u = "create", c = a._infoIndex++, t.setAttribute("data-index", c), t.setAttribute("data-file-name", i.name), t.setAttribute("data-file-size", i.size), d = { src: t.src, index: 1 * c, name: i.name, size: i.size }, r.push(d); else { u = "update", c *= 1; for (let e = 0, t = r.length; e < t; e++)if (c === r[e].index) { d = r[e]; break } d || (c = a._infoIndex++, d = { index: c }, r.push(d)), d.src = t.src, d.name = t.getAttribute("data-file-name"), d.size = 1 * t.getAttribute("data-file-size") } if (d.element = t, d.delete = s.destroy.bind(this, t), d.select = function (e) { e.scrollIntoView(!0), this._w.setTimeout(s.select.bind(this, e)) }.bind(this, t), l) { if (!t.getAttribute("origin-size") && t.naturalWidth && t.setAttribute("origin-size", t.naturalWidth + "," + t.naturalHeight), !t.getAttribute("data-origin")) { const e = this.util.getParentElement(t, this.util.isMediaComponent), n = this.util.getParentElement(t, "FIGURE"), i = this.plugins.resizing._module_getSizeX.call(this, a, t, n, e), l = this.plugins.resizing._module_getSizeY.call(this, a, t, n, e); t.setAttribute("data-origin", i + "," + l), t.setAttribute("data-size", i + "," + l) } if (!t.style.width) { const e = (t.getAttribute("data-size") || t.getAttribute("data-origin") || "").split(","); s.onModifyMode.call(this, t, null), s.applySize.call(this, e[0], e[1]) } this.context.resizing._resize_plugin = o } "function" == typeof n && n(t, c, u, d, --a._uploadFileLength < 0 ? 0 : a._uploadFileLength, this) }, deleteInfo: function (e, t, n) { if (t >= 0) { const i = this.context[e]._infoList; for (let e = 0, l = i.length; e < l; e++)if (t === i[e].index) return i.splice(e, 1), void ("function" == typeof n && n(null, t, "delete", null, 0, this)) } }, resetInfo: function (e, t) { const n = this.context[e]; if ("function" == typeof t) { const e = n._infoList; for (let n = 0, i = e.length; n < i; n++)t(null, e[n].index, "delete", null, 0, this) } n._infoList = [], n._infoIndex = 0 } }; return void 0 === t && (e.SUNEDITOR_MODULES || Object.defineProperty(e, "SUNEDITOR_MODULES", { enumerable: !0, writable: !1, configurable: !1, value: {} }), Object.defineProperty(e.SUNEDITOR_MODULES, "fileManager", { enumerable: !0, writable: !1, configurable: !1, value: n })), n }, "object" == typeof e.exports ? e.exports = i.document ? l(i, !0) : function (e) { if (!e.document) throw new Error("SUNEDITOR_MODULES a window with a document"); return l(e) } : l(i) } }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9kaWFsb2cuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9maWxlQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGFuZy9lbi5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9tb2R1bGVzL19jb2xvclBpY2tlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2ZvbnRDb2xvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2hpbGl0ZUNvbG9yLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9fc2VsZWN0TWVudS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9tb2R1bGVzL19hbmNob3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL2xpbmsuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL2ltYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL2RpYWxvZy92aWRlby5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9kaWFsb2cvYXVkaW8uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZGlhbG9nL21hdGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvY29tbWFuZC9ibG9ja3F1b3RlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvYWxpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS9mb250LmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvZm9udFNpemUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS9ob3Jpem9udGFsUnVsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2xpc3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvc3VibWVudS90YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L2Zvcm1hdEJsb2NrLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvbGluZUhlaWdodC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9zdWJtZW51L3BhcmFncmFwaFN0eWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL3N1Ym1lbnUvdGV4dFN0eWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL2ZpbGVCcm93c2VyL2ltYWdlR2FsbGVyeS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2RlZmF1bHRJY29ucy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpYi9jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9fbm90aWNlLmpzIiwid2VicGFjazovLy8uL3NyYy9zdW5lZGl0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpYi9jb3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9saWIvaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VuZWRpdG9yX2J1aWxkLmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvcmVzaXppbmcuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvbW9kdWxlcy9maWxlTWFuYWdlci5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImdsb2JhbCIsImZhY3RvcnkiLCJ3aW5kb3ciLCJ0aGlzIiwibm9HbG9iYWwiLCJkaWFsb2ciLCJhZGQiLCJjb3JlIiwiY29udGV4dCIsImtpbmQiLCJ1cGRhdGVNb2RhbCIsIl9jbG9zZVNpZ25hbCIsImRpYWxvZ19kaXYiLCJ1dGlsIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImRpYWxvZ19iYWNrIiwic3R5bGUiLCJkaXNwbGF5IiwiZGlhbG9nX2FyZWEiLCJhcHBlbmRDaGlsZCIsIm1vZGFsQXJlYSIsImJhY2siLCJtb2RhbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJfb25Nb3VzZURvd25fZGlhbG9nIiwiX29uQ2xpY2tfZGlhbG9nIiwiZWxlbWVudCIsInJlbGF0aXZlIiwiZSIsInRlc3QiLCJ0YXJnZXQiLCJnZXRBdHRyaWJ1dGUiLCJwbHVnaW5zIiwiY2xvc2UiLCJvcGVuIiwidXBkYXRlIiwibW9kYWxGb3JtIiwiX2JpbmRDbG9zZSIsIl9kIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImtleUNvZGUiLCJvcHRpb25zIiwicG9wdXBEaXNwbGF5IiwicG9zaXRpb24iLCJmb2N1c0VsZW1lbnQiLCJvbiIsImZvY3VzIiwiaW5pdCIsIlNVTkVESVRPUl9NT0RVTEVTIiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJkb2N1bWVudCIsInciLCJFcnJvciIsImZpbGVCcm93c2VyIiwiX3htbEh0dHAiLCJfbG9hZGluZyIsImFyZWEiLCJoZWFkZXIiLCJ0YWdBcmVhIiwiYm9keSIsImxpc3QiLCJ0YWdFbGVtZW50cyIsIml0ZW1zIiwic2VsZWN0ZWRUYWdzIiwic2VsZWN0b3JIYW5kbGVyIiwiY29udGV4dFBsdWdpbiIsImNvbHVtblNpemUiLCJicm93c2VyX2RpdiIsImNvbnRlbnQiLCJpbm5lckhUTUwiLCJzZXRfYnJvd3NlciIsInF1ZXJ5U2VsZWN0b3IiLCJ0aXRsZUFyZWEiLCJvbkNsaWNrVGFnIiwib25DbGlja0ZpbGUiLCJfb25Nb3VzZURvd25fYnJvd3NlciIsIl9vbkNsaWNrX2Jyb3dzZXIiLCJsYW5nIiwiZGlhbG9nQm94IiwiaWNvbnMiLCJjYW5jZWwiLCJzdG9wUHJvcGFnYXRpb24iLCJwbHVnaW5OYW1lIiwiZmlsZUJyb3dzZXJDb250ZXh0IiwicGx1Z2luQ29udGV4dCIsImxpc3RDbGFzc05hbWUiLCJsaXN0Q2xhc3MiLCJoYXNDbGFzcyIsInRleHRDb250ZW50IiwidGl0bGUiLCJfZHJhd0ZpbGVMaXN0IiwidXJsIiwiZmlsZUJyb3dzZXJQbHVnaW4iLCJhYm9ydCIsInNob3dCcm93c2VyTG9hZGluZyIsImNsb3NlQnJvd3NlckxvYWRpbmciLCJicm93c2VySGVhZGVyIiwieG1sSHR0cCIsImdldFhNTEh0dHBSZXF1ZXN0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwiX2NhbGxCYWNrR2V0IiwiX3ciLCJrZXlzIiwibGVuZ3RoIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJyZWFkeVN0YXRlIiwic3RhdHVzIiwiX2RyYXdMaXN0SXRlbSIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInJlc3VsdCIsIm1lc3NhZ2UiLCJtYXhIZWlnaHQiLCJpbm5lckhlaWdodCIsIm9mZnNldEhlaWdodCIsInJlcyIsImVyciIsImVycm9yTWVzc2FnZSIsIl90YWdzIiwibGVuIiwic3BsaXRTaXplIiwiTWF0aCIsInJvdW5kIiwiZHJhd0l0ZW1IYW5kbGVyIiwiaXRlbVRlbXBsYXRlSGFuZGxlciIsInRhZ3NIVE1MIiwibGlzdEhUTUwiLCJjb2x1bW5zIiwiaXRlbSIsInRhZ3MiLCJ0YWciLCJzcGxpdCIsIm1hcCIsInYiLCJ0cmltIiwidExlbiIsImluZGV4T2YiLCJwdXNoIiwicXVlcnlTZWxlY3RvckFsbCIsImlzQW5jaG9yIiwidGFnTmFtZSIsInNlbGVjdFRhZyIsInNUYWdJbmRleCIsInNwbGljZSIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJmaWx0ZXIiLCJzb21lIiwicHJldmVudERlZmF1bHQiLCJsaXN0RWwiLCJjb21tYW5kIiwicGFyZW50Tm9kZSIsImhhbmRsZXIiLCJjb2RlIiwidG9vbGJhciIsImRlZmF1bHQiLCJzYXZlIiwiZm9udCIsImZvcm1hdHMiLCJmb250U2l6ZSIsImJvbGQiLCJ1bmRlcmxpbmUiLCJpdGFsaWMiLCJzdHJpa2UiLCJzdWJzY3JpcHQiLCJzdXBlcnNjcmlwdCIsInJlbW92ZUZvcm1hdCIsImZvbnRDb2xvciIsImhpbGl0ZUNvbG9yIiwiaW5kZW50Iiwib3V0ZGVudCIsImFsaWduIiwiYWxpZ25MZWZ0IiwiYWxpZ25SaWdodCIsImFsaWduQ2VudGVyIiwiYWxpZ25KdXN0aWZ5Iiwib3JkZXJMaXN0IiwidW5vcmRlckxpc3QiLCJob3Jpem9udGFsUnVsZSIsImhyX3NvbGlkIiwiaHJfZG90dGVkIiwiaHJfZGFzaGVkIiwidGFibGUiLCJsaW5rIiwibWF0aCIsImltYWdlIiwidmlkZW8iLCJhdWRpbyIsImZ1bGxTY3JlZW4iLCJzaG93QmxvY2tzIiwiY29kZVZpZXciLCJ1bmRvIiwicmVkbyIsInByZXZpZXciLCJwcmludCIsInRhZ19wIiwidGFnX2RpdiIsInRhZ19oIiwidGFnX2Jsb2NrcXVvdGUiLCJ0YWdfcHJlIiwidGVtcGxhdGUiLCJsaW5lSGVpZ2h0IiwicGFyYWdyYXBoU3R5bGUiLCJ0ZXh0U3R5bGUiLCJpbWFnZUdhbGxlcnkiLCJtZW50aW9uIiwibGlua0JveCIsInRleHQiLCJuZXdXaW5kb3dDaGVjayIsImRvd25sb2FkTGlua0NoZWNrIiwiYm9va21hcmsiLCJtYXRoQm94IiwiaW5wdXRMYWJlbCIsImZvbnRTaXplTGFiZWwiLCJwcmV2aWV3TGFiZWwiLCJpbWFnZUJveCIsImZpbGUiLCJhbHRUZXh0IiwidmlkZW9Cb3giLCJhdWRpb0JveCIsImJyb3dzZXIiLCJzZWFyY2giLCJjYXB0aW9uIiwic3VibWl0QnV0dG9uIiwicmV2ZXJ0QnV0dG9uIiwicHJvcG9ydGlvbiIsImJhc2ljIiwibGVmdCIsInJpZ2h0IiwiY2VudGVyIiwid2lkdGgiLCJoZWlnaHQiLCJzaXplIiwicmF0aW8iLCJjb250cm9sbGVyIiwiZWRpdCIsInVubGluayIsInJlbW92ZSIsImluc2VydFJvd0Fib3ZlIiwiaW5zZXJ0Um93QmVsb3ciLCJkZWxldGVSb3ciLCJpbnNlcnRDb2x1bW5CZWZvcmUiLCJpbnNlcnRDb2x1bW5BZnRlciIsImRlbGV0ZUNvbHVtbiIsImZpeGVkQ29sdW1uV2lkdGgiLCJyZXNpemUxMDAiLCJyZXNpemU3NSIsInJlc2l6ZTUwIiwicmVzaXplMjUiLCJhdXRvU2l6ZSIsIm1pcnJvckhvcml6b250YWwiLCJtaXJyb3JWZXJ0aWNhbCIsInJvdGF0ZUxlZnQiLCJyb3RhdGVSaWdodCIsIm1heFNpemUiLCJtaW5TaXplIiwidGFibGVIZWFkZXIiLCJtZXJnZUNlbGxzIiwic3BsaXRDZWxscyIsIkhvcml6b250YWxTcGxpdCIsIlZlcnRpY2FsU3BsaXQiLCJtZW51Iiwic3BhY2VkIiwiYm9yZGVyZWQiLCJuZW9uIiwidHJhbnNsdWNlbnQiLCJzaGFkb3ciLCJTVU5FRElUT1JfTEFORyIsImNvbG9yUGlja2VyIiwiY29sb3JMaXN0SFRNTCIsIl9jb2xvcklucHV0IiwiX2RlZmF1bHRDb2xvciIsIl9zdHlsZVByb3BlcnR5IiwiX2N1cnJlbnRDb2xvciIsIl9jb2xvckxpc3QiLCJjcmVhdGVDb2xvckxpc3QiLCJfbWFrZUNvbG9yTGlzdCIsIm1ha2VDb2xvciIsIm9wdGlvbiIsImNvbG9yTGlzdCIsImNvbG9yQXJyIiwiY29sb3IiLCJjaGVja2VkIiwiZXJhc2UiLCJub2RlIiwiZmlsbENvbG9yIiwiZ2V0Q29sb3JJbk5vZGUiLCJpc0hleENvbG9yIiwicmdiMmhleCIsInRvTG93ZXJDYXNlIiwic2V0SW5wdXRUZXh0IiwiY29sb3JOYW1lMmhleCIsInNldEN1cnJlbnRDb2xvciIsImhleENvbG9yU3RyIiwiYm9yZGVyQ29sb3IiLCJmaW5kQ29sb3IiLCJzdHlsZVByb3BlcnR5IiwiaXNXeXNpd3lnRGl2Iiwibm9kZVR5cGUiLCJzdHIiLCJyZ2IiLCJyZ2JNYXRjaCIsIm1hdGNoIiwicGFyc2VJbnQiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29sb3JOYW1lIiwidGVtcCIsImNvbG9ycyIsImdldENvbXB1dGVkU3R5bGUiLCJhIiwicmVtb3ZlSXRlbSIsInN1YnN0ciIsInRhcmdldEVsZW1lbnQiLCJhZGRNb2R1bGUiLCJwcmV2aWV3RWwiLCJjb2xvcklucHV0IiwibGlzdERpdiIsInNldFN1Ym1lbnUiLCJvbkNoYW5nZUlucHV0Iiwic3VibWl0IiwicGlja3VwIiwiaW5pdE1lbnVUYXJnZXQiLCJjb2xvckFyZWEiLCJjb250ZXh0UGlja2VyIiwiY29udGV4dEZvbnRDb2xvciIsInd3Q29tcHV0ZWRTdHlsZSIsImdldFNlbGVjdGlvbk5vZGUiLCJhcHBseUNvbG9yIiwibm9kZUNoYW5nZSIsInN1Ym1lbnVPZmYiLCJuZXdOb2RlIiwiY29udGV4dEhpbGl0ZUNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwidGVtcGxhdGVEaXYiLCJ0ZW1wbGF0ZUxpc3QiLCJ0ZW1wbGF0ZXMiLCJodG1sIiwic2V0Q29udGVudHMiLCJzZWxlY3RNZW51IiwiY2FsbGVyIiwiY2FsbGVyQ29udGV4dCIsInNldEZvcm0iLCJjcmVhdGVMaXN0IiwibGlzdENvbnRleHQiLCJmb3JtIiwibWVudXMiLCJpbml0RXZlbnQiLCJmb3JtcyIsImluZGV4IiwiY2xpY2tNZXRob2QiLCJjYWxsZXJOYW1lIiwib25Nb3VzZWRvd25fbGlzdCIsIm9uTW91c2VNb3ZlX2xpc3QiLCJvbkNsaWNrX2xpc3QiLCJtb3ZlSXRlbSIsIm51bSIsInNlbGVjdEluZGV4IiwiZ2V0SXRlbSIsInBvc2l0aW9uSGFuZGxlciIsInZpc2liaWxpdHkiLCJhbmNob3IiLCJzZXREaWFsb2dGb3JtIiwiaG9zdCIsImxvY2F0aW9uIiwib3JpZ2luIiwicGF0aG5hbWUiLCJyZXBsYWNlIiwicmVsTGlzdCIsImxpbmtSZWwiLCJkZWZhdWx0UmVsIiwibGlua1JlbERlZmF1bHQiLCJwcm90b2NvbCIsImRvd25sb2FkIiwicmVsIiwiYW5jaG9yUGx1Z2luIiwidXJsSW5wdXQiLCJsaW5rRGVmYXVsdFJlbCIsImN1cnJlbnRSZWwiLCJsaW5rQW5jaG9yIiwibGlua1ZhbHVlIiwiX2NoYW5nZSIsImNoZWNrX25ld193aW5kb3ciLCJjaGVja19ib29rbWFyayIsImFuY2hvclRleHQiLCJkb3dubG9hZENoZWNrIiwiYm9va21hcmtCdXR0b24iLCJyZWxCdXR0b24iLCJyZWxQcmV2aWV3Iiwib25DbGlja19yZWxCdXR0b24iLCJvbkNsaWNrX3JlbExpc3QiLCJvbkNoYW5nZV9uZXdXaW5kb3dDaGVjayIsIm9uQ2hhbmdlX2Rvd25sb2FkQ2hlY2siLCJvbkNoYW5nZUFuY2hvclRleHQiLCJvbkNoYW5nZVVybElucHV0Iiwib25LZXlEb3duVXJsSW5wdXQiLCJvbkZvY3VzVXJsSW5wdXQiLCJvbkJsdXJVcmxJbnB1dCIsIm9uQ2xpY2tfYm9va21hcmtCdXR0b24iLCJjb250ZXh0QW5jaG9yIiwiaHJlZiIsImxhc3RJbmRleE9mIiwiZ2V0U2VsZWN0aW9uIiwic2V0UmVsIiwic2V0TGlua1ByZXZpZXciLCJzZXRIZWFkZXJCb29rbWFyayIsIl9jbG9zZVJlbE1lbnUiLCJ0b2dnbGVSZWxMaXN0Iiwic2hvdyIsInJ0bCIsIm9mZnNldExlZnQiLCJvZmZzZXRXaWR0aCIsInRvcCIsIm9mZnNldFRvcCIsImNvbnRhaW5zIiwiY21kIiwiY3VycmVudCIsInRvZ2dsZUNsYXNzIiwiam9pbiIsInJlbEF0dHIiLCJyZWxMaXN0RWwiLCJyZWxzIiwiY2hlY2tlZFJlbCIsImNyZWF0ZUhlYWRlckxpc3QiLCJjb250ZXh0TGlzdCIsInVybFZhbHVlIiwiaGVhZGVycyIsImdldExpc3RDaGlsZHJlbiIsInd5c2l3eWciLCJub2RlTmFtZSIsInZhbHVlUmVnRXhwIiwiUmVnRXhwIiwiaCIsIl9zZXRNZW51TGlzdFBvc2l0aW9uIiwiaWQiLCJyYW5kb20iLCJjb250ZXh0TGluayIsImxpbmtQcm90b2NvbCIsInJlc2VydmVkUHJvdG9jb2wiLCJzYW1lUHJvdG9jb2wiLCJzZXRDdHgiLCJ1cGRhdGVBbmNob3IiLCJhbHQiLCJub3RUZXh0Iiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiY2hpbGRyZW4iLCJjcmVhdGVBbmNob3IiLCJvQSIsIl9yZWxNZXJnZSIsIl9yZWxEZWxldGUiLCJfbGlua0FuY2hvciIsImFuY2hvckN0eCIsImxpbmtfZGlhbG9nIiwic2V0RGlhbG9nIiwibGlua19jb250cm9sbGVyIiwic2V0Q29udHJvbGxlcl9MaW5rQnV0dG9uIiwibGlua0NvbnRyb2xsZXIiLCJvbkNsaWNrX2xpbmtDb250cm9sbGVyIiwibGlua19idG4iLCJkZWxldGUiLCJjdXJyZW50Q29udHJvbGxlck5hbWUiLCJzaG93TG9hZGluZyIsInRleHROb2RlIiwiY2hpbGROb2RlcyIsInNldFJhbmdlIiwic2VsZWN0ZWRGb3JtYXRzIiwiZ2V0U2VsZWN0ZWRFbGVtZW50cyIsIm9Gb3JtYXQiLCJpbnNlcnROb2RlIiwiY2xvc2VMb2FkaW5nIiwiaGlzdG9yeSIsImFjdGl2ZSIsImNvbnRyb2xsZXJBcnJheSIsImNhbGxfY29udHJvbGxlciIsImNvbnRyb2xsZXJzT2ZmIiwic2VsZWN0aW9uQVRhZyIsImVkaXRMaW5rIiwibGlua0J0biIsInNldENvbnRyb2xsZXJQb3NpdGlvbiIsImNvbnRyb2xsZXJzT24iLCJzYyIsImdldENoaWxkRWxlbWVudCIsImVjIiwiY29tcG9uZW50IiwicmVzaXppbmciLCJmaWxlTWFuYWdlciIsImNvbnRleHRJbWFnZSIsIl9pbmZvTGlzdCIsIl9pbmZvSW5kZXgiLCJfdXBsb2FkRmlsZUxlbmd0aCIsInNpemVVbml0IiwiX2ltYWdlU2l6ZVVuaXQiLCJfbGlua0VsZW1lbnQiLCJfYWx0VGV4dCIsIl9hbGlnbiIsIl9mbG9hdENsYXNzUmVnRXhwIiwiX3Zfc3JjIiwiX2xpbmtWYWx1ZSIsInN2Z0RlZmF1bHRTaXplIiwiYmFzZTY0UmVuZGVySW5kZXgiLCJfZWxlbWVudCIsIl9jb3ZlciIsIl9jb250YWluZXIiLCJpbnB1dFgiLCJpbnB1dFkiLCJfZWxlbWVudF93IiwiX2VsZW1lbnRfaCIsIl9lbGVtZW50X2wiLCJfZWxlbWVudF90IiwiX2RlZmF1bHRTaXplWCIsIl9kZWZhdWx0U2l6ZVkiLCJfb3JpZ2luX3ciLCJpbWFnZVdpZHRoIiwiX29yaWdpbl9oIiwiaW1hZ2VIZWlnaHQiLCJfcHJvcG9ydGlvbkNoZWNrZWQiLCJfcmVzaXppbmciLCJpbWFnZVJlc2l6aW5nIiwiX3Jlc2l6ZURvdEhpZGUiLCJpbWFnZUhlaWdodFNob3ciLCJfcm90YXRpb24iLCJpbWFnZVJvdGF0aW9uIiwiX29ubHlQZXJjZW50YWdlIiwiaW1hZ2VTaXplT25seVBlcmNlbnRhZ2UiLCJfcmF0aW8iLCJfcmF0aW9YIiwiX3JhdGlvWSIsIl9jYXB0aW9uU2hvdyIsIl9jYXB0aW9uQ2hlY2tlZCIsIl9jYXB0aW9uIiwiY2FwdGlvbkNoZWNrRWwiLCJpbWFnZV9kaWFsb2ciLCJpbWdJbnB1dEZpbGUiLCJpbWdVcmxGaWxlIiwicHJldmlld1NyYyIsIm9wZW5UYWIiLCJfcmVtb3ZlU2VsZWN0ZWRGaWxlcyIsIl9vbkxpbmtQcmV2aWV3IiwiX2ZpbGVJbnB1dENoYW5nZSIsImltYWdlR2FsbGVyeUJ1dHRvbiIsIl9vcGVuR2FsbGVyeSIsInNldElucHV0U2l6ZSIsInNldFJhdGlvIiwic2l6ZVJldmVydCIsImltYWdlRmlsZUlucHV0IiwiaW1hZ2VBY2NlcHQiLCJpbWFnZU11bHRpcGxlRmlsZSIsImltYWdlVXJsSW5wdXQiLCJpbWFnZUdhbGxlcnlVcmwiLCJpbWFnZV9nYWxsZXJ5Iiwib25seVBlcmNlbnRhZ2UiLCJvbmx5UGVyY2VudERpc3BsYXkiLCJoZWlnaHREaXNwbGF5IiwicmV2ZXJ0IiwidGV4dERlY29yYXRpb24iLCJjYWxsUGx1Z2luIiwiX3NldFVybElucHV0Iiwic3JjIiwiZmlsZVRhZ3MiLCJzZWxlY3QiLCJvbk1vZGlmeU1vZGUiLCJjYWxsX2NvbnRyb2xsZXJfcmVzaXplIiwiZGVzdHJveSIsImltYWdlRWwiLCJpbWFnZUNvbnRhaW5lciIsImdldFBhcmVudEVsZW1lbnQiLCJpc01lZGlhQ29tcG9uZW50IiwiZGF0YUluZGV4IiwiZm9jdXNFbCIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJlbXB0eURpdiIsInJlbW92ZUl0ZW1BbGxQYXJlbnRzIiwiZm9jdXNFZGdlIiwiZGVsZXRlSW5mbyIsImZ1bmN0aW9ucyIsIm9uSW1hZ2VVcGxvYWQiLCJ0YWJOYW1lIiwidGFiQ29udGVudCIsInRhYkxpbmtzIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImltYWdlUGx1Z2luIiwidXBkYXRlX2ltYWdlIiwiZmlsZXMiLCJzdWJtaXRBY3Rpb24iLCJvblJlbmRlcl9pbWdVcmwiLCJlcnJvciIsImZpbGVMaXN0IiwiZmlsZVNpemUiLCJ0eXBlIiwibGltaXRTaXplIiwiaW1hZ2VVcGxvYWRTaXplTGltaXQiLCJpbmZvU2l6ZSIsImltYWdlc0luZm8iLCJvbkltYWdlVXBsb2FkRXJyb3IiLCJub3RpY2VPcGVuIiwiaW5mbyIsImlucHV0V2lkdGgiLCJpbnB1dEhlaWdodCIsImlzVXBkYXRlIiwib25JbWFnZVVwbG9hZEJlZm9yZSIsImRhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJyZWdpc3RlciIsInVwbG9hZCIsInJlc3BvbnNlIiwiaW1hZ2VVcGxvYWRVcmwiLCJmaWxlc0xlbiIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJpbWFnZVVwbG9hZEhlYWRlciIsImNhbGxCYWNrX2ltZ1VwbG9hZCIsInNldHVwX3JlYWRlciIsImltYWdlVXBsb2FkSGFuZGxlciIsInVwZGF0ZV9zcmMiLCJjcmVhdGVfaW1hZ2UiLCJ3RmlsZVJlYWRlciIsIkZpbGVSZWFkZXIiLCJmaWxlc1N0YWNrIiwicmVhZGVyIiwib25sb2FkIiwidXBkYXRlRWxlbWVudCIsIm9uUmVuZGVyX2ltZ0Jhc2U2NCIsInJlYWRBc0RhdGFVUkwiLCJ1cGRhdGVNZXRob2QiLCJjcmVhdGVNZXRob2QiLCJwb3AiLCJvblJlbmRlcl9saW5rIiwiaW1nVGFnIiwieHkiLCJfbW9kdWxlX3NldElucHV0U2l6ZSIsIl9tb2R1bGVfc2V0UmF0aW8iLCJjaGVja0ZpbGVJbmZvIiwibW9kaWZ5SGFuZGxlciIsIm9wZW5Nb2RpZnkiLCJmb3JtYXQiLCJnZXRGb3JtYXRFbGVtZW50IiwidGV4dEFsaWduIiwiZmxvYXQiLCJjaGVja0luZm8iLCJyZXNldEZpbGVJbmZvIiwicmVzZXRJbmZvIiwiX3Jlc2l6ZV9wbHVnaW4iLCJvSW1nIiwiY292ZXIiLCJzZXRfY292ZXIiLCJjb250YWluZXIiLCJzZXRfY29udGFpbmVyIiwiY3JlYXRlX2NhcHRpb24iLCJhcHBseVNpemUiLCJzZXRBbGlnbiIsIl9pbWFnZV9jcmVhdGVfb25sb2FkIiwiaW5zZXJ0Q29tcG9uZW50Iiwic2V0SW5mbyIsIm1lZGlhQXV0b1NlbGVjdCIsInNlbGVjdENvbXBvbmVudCIsImxpbmUiLCJhcHBlbmRGb3JtYXRUYWciLCJvcGVuQ29udHJvbGxlciIsIm5vdEhpc3RvcnlQdXNoIiwiY2hhbmdlU2l6ZSIsImlzTmV3Q29udGFpbmVyIiwiY2xvbmVOb2RlIiwieCIsImlzTnVtYmVyIiwieSIsIm1vZGlmaWVkQ2FwdGlvbiIsImluc2VydEJlZm9yZSIsImltYWdlRWxlbWVudCIsIm5ld0VsIiwicmVtb3ZlQ2hpbGQiLCJleGlzdEVsZW1lbnQiLCJpc1JhbmdlRm9ybWF0RWxlbWVudCIsImlzRm9ybWF0RWxlbWVudCIsInJlbW92ZUVtcHR5Tm9kZSIsImh0bWxSZW1vdmVXaGl0ZVNwYWNlIiwicHJldmlvdXNTaWJsaW5nIiwicmVwbGFjZUNoaWxkIiwiX3JvdGF0ZVZlcnRpY2FsIiwicmVzZXRUcmFuc2Zvcm0iLCJzZXRUcmFuc2Zvcm1TaXplIiwiZ2V0TnVtYmVyIiwic2V0VGltZW91dCIsInVzZXJTaXplIiwibm90T3BlbiIsIl9tb2R1bGVfc2V0TW9kaWZ5SW5wdXRTaXplIiwic2V0UGVyY2VudFNpemUiLCJzZXRTaXplIiwic2V0QXV0b1NpemUiLCJfbW9kdWxlX3NpemVSZXZlcnQiLCJub3RSZXNldFBlcmNlbnRhZ2UiLCJkaXJlY3Rpb24iLCJvbmx5VyIsImNhbmNlbFBlcmNlbnRBdHRyIiwiX21vZHVsZV9zYXZlQ3VycmVudFNpemUiLCJtYXhXaWR0aCIsInNldE9yaWdpblNpemUiLCJvcmlnaW5TaXplIiwiaGVpZ2h0UGVyY2VudGFnZSIsInNldENhcHRpb25Qb3NpdGlvbiIsIm1hcmdpbiIsIm1pbldpZHRoIiwiY29udGV4dFZpZGVvIiwiX3ZpZGVvU2l6ZVVuaXQiLCJfeW91dHViZVF1ZXJ5IiwieW91dHViZVF1ZXJ5IiwiX3ZpZGVvUmF0aW8iLCJ2aWRlb1JhdGlvIiwiX2RlZmF1bHRSYXRpbyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsInZpZGVvUmVzaXppbmciLCJ2aWRlb0hlaWdodFNob3ciLCJ2aWRlb1JvdGF0aW9uIiwidmlkZW9TaXplT25seVBlcmNlbnRhZ2UiLCJ2aWRlb19kaWFsb2ciLCJ2aWRlb0lucHV0RmlsZSIsInZpZGVvVXJsRmlsZSIsInZpZGVvUmF0aW9PcHRpb24iLCJzZXRWaWRlb1JhdGlvIiwidmlkZW9GaWxlSW5wdXQiLCJ2aWRlb0FjY2VwdCIsInZpZGVvTXVsdGlwbGVGaWxlIiwidmlkZW9VcmxJbnB1dCIsInJhdGlvTGlzdCIsInZpZGVvUmF0aW9MaXN0IiwicmF0aW9EaXNwbGF5IiwidmlkZW9SYXRpb1Nob3ciLCJvbmx5V2lkdGhEaXNwbGF5IiwiX3NldFRhZ0F0dHJzIiwiYXR0cnMiLCJ2aWRlb1RhZ0F0dHJzIiwiaGFzT3duIiwiY3JlYXRlVmlkZW9UYWciLCJ2aWRlb1RhZyIsIl9zZXRJZnJhbWVBdHRycyIsImZyYW1lQm9yZGVyIiwiYWxsb3dGdWxsc2NyZWVuIiwidmlkZW9JZnJhbWVBdHRycyIsImNyZWF0ZUlmcmFtZVRhZyIsImlmcmFtZVRhZyIsImZyYW1lIiwib25WaWRlb1VwbG9hZCIsImRpc2FibGVkIiwic2V0VmlkZW9SYXRpb1NlbGVjdCIsInNlbGVjdGVkSW5kZXgiLCJwbGFjZWhvbGRlciIsInZpZGVvUGx1Z2luIiwic2V0dXBfdXJsIiwidmlkZW9VcGxvYWRTaXplTGltaXQiLCJ2aWRlb3NJbmZvIiwib25WaWRlb1VwbG9hZEVycm9yIiwib25WaWRlb1VwbG9hZEJlZm9yZSIsInZpZGVvVXBsb2FkVXJsIiwidmlkZW9VcGxvYWRIZWFkZXIiLCJjYWxsQmFja192aWRlb1VwbG9hZCIsInZpZGVvVXBsb2FkSGFuZGxlciIsImNyZWF0ZV92aWRlbyIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsInNwbGl0VXJsIiwiZW5kc1dpdGgiLCJvRnJhbWUiLCJpc1lvdXR1YmUiLCJpc1ZpbWVvIiwibmV3VGFnIiwiaW5wdXRVcGRhdGUiLCJfbW9kdWxlX2dldFNpemVYIiwiX21vZHVsZV9nZXRTaXplWSIsImlzUGVyY2VudCIsImNoYW5nZWQiLCJfdXBkYXRlX3ZpZGVvQ292ZXIiLCJwcmV2RnJhbWUiLCJmaWdjYXB0aW9uIiwiY29uc29sZSIsIndhcm4iLCJyYXRpb1NlbGVjdGVkIiwicmF0aW9PcHRpb25zIiwic2VsZWN0ZWQiLCJvbmx5SCIsInBhZGRpbmdCb3R0b20iLCJkYXRhU2l6ZSIsImNvbnRleHRBdWRpbyIsInRhcmdldFNlbGVjdCIsImF1ZGlvV2lkdGgiLCJhdWRpb0hlaWdodCIsImF1ZGlvX2RpYWxvZyIsImF1ZGlvSW5wdXRGaWxlIiwiYXVkaW9VcmxGaWxlIiwiYXVkaW9fY29udHJvbGxlciIsInNldENvbnRyb2xsZXIiLCJvbkNsaWNrX2NvbnRyb2xsZXIiLCJhdWRpb0ZpbGVJbnB1dCIsImF1ZGlvQWNjZXB0IiwiYXVkaW9NdWx0aXBsZUZpbGUiLCJhdWRpb1VybElucHV0IiwiX2NyZWF0ZUF1ZGlvVGFnIiwib0F1ZGlvIiwiY3NzVGV4dCIsImF1ZGlvVGFnQXR0cnMiLCJpc0NvbXBvbmVudCIsIm9uQXVkaW9VcGxvYWQiLCJ1cGRhdGVDb3ZlciIsInNldHVwVXJsIiwiYXVkaW9VcGxvYWRTaXplTGltaXQiLCJhdWRpb3NJbmZvIiwib25BdWRpb1VwbG9hZEVycm9yIiwib25BdWRpb1VwbG9hZEJlZm9yZSIsImF1ZGlvVXBsb2FkVXJsIiwiYXVkaW9VcGxvYWRIZWFkZXIiLCJjYWxsQmFja191cGxvYWQiLCJhdWRpb1VwbG9hZEhhbmRsZXIiLCJjcmVhdGVfYXVkaW8iLCJwcmV2RWxlbWVudCIsInNlbGVjdGlvblRhZyIsIm9uQ29udHJvbGxlck9mZiIsInByZXZpZXdFbGVtZW50IiwiZm9udFNpemVFbGVtZW50IiwiZGVmYXVsdEZvbnRTaXplIiwiX21hdGhFeHAiLCJtYXRoX2RpYWxvZyIsIl9yZW5kZXJNYXRoRXhwIiwibWF0aF9jb250cm9sbGVyIiwic2V0Q29udHJvbGxlcl9NYXRoQnV0dG9uIiwibWF0aENvbnRyb2xsZXIiLCJvbkNsaWNrX21hdGhDb250cm9sbGVyIiwibWF0aEZvbnRTaXplIiwiZiIsIm1hdGhfYnRuIiwibWFuYWdlZFRhZ3MiLCJtZXRob2QiLCJrYXRleCIsImRvbSIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwiX3JlbmRlcmVyIiwiSFRNTERlY29kZXIiLCJleHAiLCJyZW5kZXJUb1N0cmluZyIsImNvbnRleHRNYXRoIiwibWF0aEV4cCIsImthdGV4RWwiLCJIVE1MRW5jb2RlciIsImNvbnRhaW5lckVsIiwiZW1wdHkiLCJjcmVhdGVUZXh0Tm9kZSIsInplcm9XaWR0aFNwYWNlIiwibmV4dFNpYmxpbmciLCJtYXRoVGFnIiwibWF0aEJ0biIsImJsb2NrcXVvdGUiLCJ0YXJnZXRCdXR0b24iLCJhY3Rpb24iLCJjdXJyZW50QmxvY2txdW90ZSIsImRldGFjaFJhbmdlRm9ybWF0RWxlbWVudCIsImFwcGx5UmFuZ2VGb3JtYXRFbGVtZW50IiwiX2FsaWduTGlzdCIsImN1cnJlbnRBbGlnbiIsImRlZmF1bHREaXIiLCJqdXN0aWZ5IiwiYWxpZ25fanVzdGlmeSIsImFsaWduX2xlZnQiLCJhbGlnbl9yaWdodCIsImFsaWduX2NlbnRlciIsImxpc3RVbCIsImxlZnREaXIiLCJsZWZ0TWVudSIsInJpZ2h0TWVudSIsImFsaWduQ29udGV4dCIsImZpcnN0RWxlbWVudENoaWxkIiwiY2hhbmdlRWxlbWVudCIsImFsaWduTGlzdCIsInNlbGVjdGVkRm9ybXN0cyIsInNldFN0eWxlIiwiZWZmZWN0Tm9kZSIsInRhcmdldFRleHQiLCJ0YXJnZXRUb29sdGlwIiwiX2ZvbnRMaXN0IiwiY3VycmVudEZvbnQiLCJmb250TGlzdCIsInRvb2x0aXAiLCJmb250RmFtaWx5Iiwic2VsZWN0Rm9udCIsImNoYW5nZVR4dCIsImhhc0ZvY3VzIiwiZm9udENvbnRleHQiLCJfc2l6ZUxpc3QiLCJjdXJyZW50U2l6ZSIsInNpemVMaXN0IiwidW5pdCIsImZvbnRTaXplVW5pdCIsImZvbnRTaXplQ29udGV4dCIsImN1cnJlbnRIUiIsImhvcml6b250YWxSdWxlUGljayIsImFwcGVuZEhyIiwib0hyIiwib05vZGUiLCJfbGlzdCIsImN1cnJlbnRMaXN0IiwiYnVsbGV0cyIsImxpc3RfYnVsbGV0cyIsIm51bWJlciIsImxpc3RfbnVtYmVyIiwiYnV0dG9uIiwiaWNvbiIsImlzTGlzdCIsImVkaXRMaXN0Iiwic2VsZWN0ZWRDZWxscyIsImRldGFjaCIsInJhbmdlIiwiZ2V0UmFuZ2UiLCJnZXRTZWxlY3RlZEVsZW1lbnRzQW5kQ29tcG9uZW50cyIsImdldFJhbmdlX2FkZExpbmUiLCJzb3J0QnlEZXB0aCIsImZpcnN0U2VsIiwibGFzdFNlbCIsInRvcEVsIiwiaXNMaXN0Q2VsbCIsImJvdHRvbUVsIiwib3JpZ2luUmFuZ2UiLCJzdGFydENvbnRhaW5lciIsInNvIiwic3RhcnRPZmZzZXQiLCJlbmRDb250YWluZXIiLCJlbyIsImVuZE9mZnNldCIsImlzUmVtb3ZlIiwiZ2V0UmFuZ2VGb3JtYXRFbGVtZW50IiwidG9VcHBlckNhc2UiLCJ0b3BFbFBhcmVudCIsImJvdHRvbUVsUGFyZW50IiwibWVyZ2VUb3AiLCJtZXJnZUJvdHRvbSIsImZpcnN0TGlzdCIsImxhc3RMaXN0IiwidG9wTnVtYmVyIiwiYm90dG9tTnVtYmVyIiwicGFzc0NvbXBvbmVudCIsIm5ld0NlbGwiLCJmVGFnIiwiaXNDZWxsIiwibmV4dCIsIm9yaWdpblBhcmVudCIsIm5leHRQYXJlbnQiLCJwYXJlbnRUYWciLCJzaWJsaW5nVGFnIiwicmFuZ2VUYWciLCJfaXNJZ25vcmVOb2RlQ2hhbmdlIiwiY29weUZvcm1hdEF0dHJpYnV0ZXMiLCJpc0hSIiwib3V0ZXJIVE1MIiwiZkNoaWxkcmVuIiwiZ2V0RWxlbWVudERlcHRoIiwiaiIsImN1cnJlbnRGb3JtYXQiLCJyYW5nZUFyciIsInRlbXBMaXN0IiwiX2RldGFjaE5lc3RlZCIsImNlbGxzIiwiZmlyc3QiLCJsYXN0Iiwib3JpZ2luTGlzdCIsInNpYmxpbmciLCJjTGVuIiwibmV3TGlzdCIsImdldFBvc2l0aW9uSW5kZXgiLCJtZXJnZVNhbWVUYWdzIiwiZWRnZSIsImdldEVkZ2VDaGlsZE5vZGVzIiwiY2MiLCJlZGl0SW5zaWRlTGlzdCIsImNlbGxzTGVuIiwiZWwiLCJsYXN0Q2VsbCIsImlubmVyTGlzdCIsInByZXYiLCJub2RlUGF0aCIsInNsIiwiX2luc2llZExpc3QiLCJnZXROb2RlRnJvbVBhdGgiLCJpbnNlcnRQcmV2IiwiZ2V0Tm9kZVBhdGgiLCJmaXJzdENoaWxkIiwic2xQYXRoIiwibGFzdEVsZW1lbnRDaGlsZCIsIm1lcmdlTmVzdGVkVGFncyIsImNvbnRleHRUYWJsZSIsIl90ZEVsZW1lbnQiLCJfdHJFbGVtZW50IiwiX3RyRWxlbWVudHMiLCJfdGFibGVYWSIsIl9tYXhXaWR0aCIsIl9maXhlZENvbHVtbiIsIl9ydGwiLCJjZWxsQ29udHJvbGxlclRvcCIsInRhYmxlQ2VsbENvbnRyb2xsZXJQb3NpdGlvbiIsInJlc2l6ZVRleHQiLCJoZWFkZXJCdXR0b24iLCJtZXJnZUJ1dHRvbiIsInNwbGl0QnV0dG9uIiwic3BsaXRNZW51IiwibWF4VGV4dCIsIm1pblRleHQiLCJfcGh5c2ljYWxfY2VsbENudCIsIl9sb2dpY2FsX2NlbGxDbnQiLCJfcm93Q250IiwiX3Jvd0luZGV4IiwiX3BoeXNpY2FsX2NlbGxJbmRleCIsIl9sb2dpY2FsX2NlbGxJbmRleCIsIl9jdXJyZW50X2NvbFNwYW4iLCJfY3VycmVudF9yb3dTcGFuIiwiZXhwYW5zaW9uIiwicmVkdWN0aW9uIiwidGFibGVQaWNrZXIiLCJ0YWJsZUhpZ2hsaWdodCIsInRhYmxlVW5IaWdobGlnaHQiLCJ0YWJsZURpc3BsYXkiLCJ0YWJsZUNvbnRyb2xsZXIiLCJzZXRDb250cm9sbGVyX3RhYmxlIiwicmVzaXplQnV0dG9uIiwiY29sdW1uRml4ZWRCdXR0b24iLCJyZXNpemVEaXYiLCJzZXRDb250cm9sbGVyX3RhYmxlRWRpdG9yIiwiaW5zZXJ0Um93QWJvdmVCdXR0b24iLCJpbnNlcnRSb3dCZWxvd0J1dHRvbiIsIm9uTW91c2VNb3ZlX3RhYmxlUGlja2VyIiwiYXBwZW5kVGFibGUiLCJvbkNsaWNrX3RhYmxlQ29udHJvbGxlciIsInRhYmxlUmVzaXplIiwiZml4ZWRfY29sdW1uX3dpZHRoIiwidGFibGVfaGVhZGVyIiwiaW5zZXJ0X3Jvd19hYm92ZSIsImluc2VydF9yb3dfYmVsb3ciLCJkZWxldGVfcm93IiwibWVyZ2VfY2VsbCIsImluc2VydF9jb2x1bW5fbGVmdCIsImluc2VydF9jb2x1bW5fcmlnaHQiLCJkZWxldGVfY29sdW1uIiwic3BsaXRfY2VsbCIsIm9UYWJsZSIsImNyZWF0ZUNlbGxzIiwidGFibGVIVE1MIiwiZmlyc3RUZCIsInJlc2V0X3RhYmxlX3BpY2tlciIsImNudCIsInJldHVybkVsZW1lbnQiLCJjZWxsIiwiY2VsbHNIVE1MIiwiY2VpbCIsIm9mZnNldFgiLCJvZmZzZXRZIiwiaGlnaGxpZ2h0IiwidW5IaWdobGlnaHQiLCJ0YWJsZVBsdWdpbiIsIl9yZW1vdmVFdmVudHMiLCJfc2VsZWN0ZWRUYWJsZSIsIl90b2dnbGVFZGl0b3IiLCJfc2hpZnQiLCJfc2VsZWN0ZWRDZWxscyIsIl9yZWYiLCJfZml4ZWRDZWxsIiwiX3NlbGVjdGVkQ2VsbCIsIl9maXhlZENlbGxOYW1lIiwiY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdCIsInRkRWxlbWVudCIsImlzQ29sbGFwc2VkIiwidGFibGVFbGVtZW50IiwidGFibGVMYXlvdXQiLCJzZXRUYWJsZVN0eWxlIiwic2V0UG9zaXRpb25Db250cm9sbGVyVG9wIiwic2V0UG9zaXRpb25Db250cm9sbGVyRGl2IiwicmVzZXQiLCJzZXRDZWxsSW5mbyIsInJvd3MiLCJjZWxsSW5kZXgiLCJjZWxsQ250IiwiY29sU3BhbiIsInJvd0luZGV4Iiwicm93U3BhbiIsInJvd1NwYW5BcnIiLCJzcGFuSW5kZXgiLCJjcyIsInJzIiwibG9nY2FsSW5kZXgiLCJhcnIiLCJyb3ciLCJjb25jYXQiLCJzb3J0IiwiYiIsImVkaXRUYWJsZSIsImlzUm93IiwidGFibGVBdHRyIiwicG9zaXRpb25DZWxsIiwiZWRpdFJvdyIsInJlbW92ZUNlbGxzIiwiZmlyc3RSb3ciLCJyaWdodENlbGwiLCJlZGl0Q2VsbCIsInBvc2l0aW9uUmVzZXRFbGVtZW50IiwidXAiLCJvcmlnaW5Sb3dJbmRleCIsInNpZ24iLCJzcGFuQ2VsbHMiLCJzcGFuQ2VsbCIsInNoaWZ0IiwiaW5zZXJ0Um93IiwicGFzc0NlbGwiLCJyZW1vdmVDZWxsIiwicmVtb3ZlU3BhbkFyciIsImluc2VydEluZGV4IiwiYXBwbHlTcGFuIiwiY2VsbENvbFNwYW4iLCJyZW1vdmVJbmRleCIsImdldE92ZXJsYXBSYW5nZUF0SW5kZXgiLCJyZW1vdmVGaXJzdCIsInJlbW92ZUVuZCIsInJMZW4iLCJnZXRBcnJheUluZGV4Iiwicm93U3BhbkNlbGwiLCJfY2xvc2VTcGxpdE1lbnUiLCJvcGVuU3BsaXRNZW51IiwicmVtb3ZlRG9jRXZlbnQiLCJhZGREb2NFdmVudCIsInZlcnRpY2FsIiwiY3VycmVudENlbGwiLCJjdXJyZW50Um93IiwiY3VycmVudENvbFNwYW4iLCJmbG9vciIsImN1cnJlbnRSb3dTcGFuIiwibmV3Um93U3BhbiIsIm5leHRSb3dJbmRleCIsIm5leHRSb3ciLCJuZXh0Q2VsbHMiLCJuZXdSb3ciLCJwaHlzaWNhbEluZGV4IiwicmVmIiwibWVyZ2VDZWxsIiwiZW1wdHlSb3dGaXJzdCIsImVtcHR5Um93TGFzdCIsImNlIiwicmUiLCJtZXJnZUhUTUwiLCJjaCIsIm9ubHlaZXJvV2lkdGhTcGFjZSIsInJvd0luZGV4Rmlyc3QiLCJyb3dJbmRleExhc3QiLCJyZW1vdmVSb3dzIiwic2V0QWN0aXZlQnV0dG9uIiwidG9nZ2xlSGVhZGVyIiwic3R5bGVzIiwic3BhbiIsInNpemVJY29uIiwiZml4ZWRDZWxsIiwic2VsZWN0ZWRDZWxsIiwiX2JpbmRPblNlbGVjdCIsIl9iaW5kT2ZmU2VsZWN0IiwiX2JpbmRPZmZTaGlmdCIsImVuYWJsZWQiLCJfb2ZmQ2VsbE11bHRpU2VsZWN0IiwiX2luaXRCaW5kIiwiX3dkIiwiX29uQ2VsbE11bHRpU2VsZWN0IiwiX2FudGlCbHVyIiwiX3NldE11bHRpQ2VsbHMiLCJzdGFydENlbGwiLCJlbmRDZWxsIiwiZmluZFNlbGVjdGVkQ2VsbCIsIl9pIiwibmV3Q3MiLCJuZXdDZSIsIm5ld1JzIiwibmV3UmUiLCJvblRhYmxlQ2VsbE11bHRpU2VsZWN0IiwiZm9ybWF0QmxvY2siLCJfZm9ybWF0TGlzdCIsInBpY2tVcCIsImxhbmdfdG9vbGJhciIsImRlZmF1bHRGb3JtYXRzIiwiZm9ybWF0TGlzdCIsImNsYXNzIiwiZm9ybWF0VGl0bGUiLCJmb3JtYXRDb250ZXh0IiwicmFuZ2VFbGVtZW50IiwiZmlyc3RQYXRoIiwibGFzdFBhdGgiLCJybGlzdCIsImRldGFjaExpc3QiLCJtb2RpZmllZEZvcm1zdHMiLCJmcmVlRWxlbWVudCIsImJlZm9yZSIsImlubmVyIiwiaXNDb21wIiwiaXNTYW1lQXR0cmlidXRlcyIsIm5ld0Zvcm1hdCIsImxpbmVIZWlnaHRzIiwibGluZUhlaWdodENvbnRleHQiLCJfY2xhc3NMaXN0IiwibWVudUxhbmciLCJkZWZhdWx0TGlzdCIsIl9jbGFzcyIsInBhcmFncmFwaFN0eWxlcyIsImRlZmF1bHRTdHlsZSIsInBhcmFncmFwaExpc3QiLCJfc3R5bGVMaXN0Iiwic3R5bGVMaXN0IiwidGV4dFN0eWxlcyIsInN0eWxlQnV0dG9uTGlzdCIsInNlbGVjdGlvbk5vZGUiLCJidG4iLCJjaGVja1N0eWxlcyIsImNsYXNzZXMiLCJjbGFzc0xpc3QiLCJyZW1vdmVOb2RlcyIsImltYWdlR2FsbGVyeUhlYWRlciIsImRyYXdJdGVtcyIsInNldEltYWdlIiwic3JjTmFtZSIsImNvZGVfdmlldyIsImxpbmVfaGVpZ2h0IiwicGFyYWdyYXBoX3N0eWxlIiwidGV4dF9zdHlsZSIsImFycm93X2Rvd24iLCJmb250X2NvbG9yIiwiaGlnaGxpZ2h0X2NvbG9yIiwiaG9yaXpvbnRhbF9ydWxlIiwic2hvd19ibG9ja3MiLCJtb2RpZnkiLCJhdXRvX3NpemUiLCJyb3RhdGVfbGVmdCIsInJvdGF0ZV9yaWdodCIsIm1pcnJvcl9ob3Jpem9udGFsIiwibWlycm9yX3ZlcnRpY2FsIiwibGluZV9icmVhayIsIm1vcmVfdGV4dCIsIm1vcmVfcGFyYWdyYXBoIiwibW9yZV9wbHVzIiwibW9yZV9ob3Jpem9udGFsIiwibW9yZV92ZXJ0aWNhbCIsImF0dGFjaG1lbnQiLCJtYWdpY19zdGljayIsImVtcHR5X2ZpbGUiLCJpc0lFIiwiaXNJRV9FZGdlIiwiaXNPU1hfSU9TIiwiX3Byb3BlcnRpZXNJbml0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiYXBwVmVyc2lvbiIsInBsYXRmb3JtIiwiX2FsbG93ZWRFbXB0eU5vZGVMaXN0IiwiX0hUTUxDb252ZXJ0b3IiLCJjb250ZW50cyIsIiciLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJ6ZXJvV2lkdGhSZWdFeHAiLCJvbmx5WmVyb1dpZHRoUmVnRXhwIiwiQWN0aXZlWE9iamVjdCIsIlhNTEh0dHBSZXF1ZXN0IiwiZTEiLCJlbGVtZW50TmFtZSIsIm9iaiIsIl9oYXNPd24iLCJnZXRJbmNsdWRlUGF0aCIsIm5hbWVBcnJheSIsImV4dGVuc2lvbiIsInBhdGgiLCJwYXRoTGlzdCIsImZpbGVOYW1lIiwicmVnRXhwIiwiZXh0UmVnRXhwIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJlZGl0b3JUYWciLCJnZXRQYWdlU3R5bGUiLCJkb2MiLCJzaGVldHMiLCJzdHlsZVNoZWV0cyIsInJ1bGVzIiwiY3NzUnVsZXMiLCJnZXRJZnJhbWVEb2N1bWVudCIsImlmcmFtZSIsIndEb2N1bWVudCIsImNvbnRlbnRXaW5kb3ciLCJjb250ZW50RG9jdW1lbnQiLCJnZXRBdHRyaWJ1dGVzVG9TdHJpbmciLCJleGNlcHRBdHRycyIsImF0dHJpYnV0ZXMiLCJhdHRyU3RyaW5nIiwiZ2V0Qnl0ZUxlbmd0aCIsImVuY29kZXIiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjciIsImNsIiwidW5lc2NhcGUiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsImlzTm9uRWRpdGFibGUiLCJpc1RleHRTdHlsZUVsZW1lbnQiLCJpc0Nsb3N1cmVSYW5nZUZvcm1hdEVsZW1lbnQiLCJpc0ZyZWVGb3JtYXRFbGVtZW50IiwiaXNDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQiLCJpc1VuZWRpdGFibGVDb21wb25lbnQiLCJpc05vdENoZWNraW5nTm9kZSIsInZhbGlkYXRpb24iLCJnZXRGcmVlRm9ybWF0RWxlbWVudCIsImdldENsb3N1cmVGcmVlRm9ybWF0RWxlbWVudCIsImNvcHlUYWdBdHRyaWJ1dGVzIiwib3JpZ2luRWwiLCJjb3B5RWwiLCJnZXRBcnJheUl0ZW0iLCJhcnJheSIsIm11bHRpIiwiaWR4IiwibmV4dElkeCIsInByZXZJZHgiLCJfbmV3T2Zmc2V0cyIsImZpbmRzIiwidGVtcFRleHQiLCJwcmV2aW91cyIsInJldmVyc2UiLCJvZmZzZXRzIiwibm9kZXMiLCJzdHlsZV9hIiwic3R5bGVfYiIsImNvbXBTdHlsZSIsImNsYXNzX2EiLCJjbGFzc19iIiwicmVnIiwiY29tcENsYXNzIiwiaXNFbXB0eUxpbmUiLCJpc1RhYmxlIiwiaXNCcmVhayIsImlzTWVkaWEiLCJtYXhEZWMiLCJ0b0ZpeGVkIiwicmVjdXJzaW9uRnVuYyIsImdldExpc3RDaGlsZE5vZGVzIiwiZGVwdGgiLCJjb21wYXJlRWxlbWVudHMiLCJhTm9kZSIsImJOb2RlIiwiYW5jZXN0b3IiLCJhSW5kZXgiLCJiSW5kZXgiLCJxdWVyeSIsImNoZWNrIiwiYXR0ciIsImNoaWxkTGlzdCIsImxhc3RDaGlsZCIsImdldE9mZnNldCIsInd5c2l3eWdGcmFtZSIsIm9mZnNldEVsZW1lbnQiLCJwYXJlbnRFbGVtZW50Iiwib2Zmc2V0UGFyZW50Iiwic2Nyb2xsVG9wIiwiYVN0YXJ0IiwiYUVuZCIsImJTdGFydCIsImJFbmQiLCJvdmVybGFwIiwidHh0IiwibmV3RWxlbWVudCIsInN0eWxlTmFtZSIsInNldERpc2FibGVkQnV0dG9ucyIsImJ1dHRvbkxpc3QiLCJzdG9wUGFyZW50IiwicGFyZW50IiwiZGV0YWNoTmVzdGVkTGlzdCIsImJhc2VOb2RlIiwiYWxsIiwick5vZGUiLCJfZGVsZXRlTmVzdGVkTGlzdCIsImNOb2RlcyIsInJDaGlsZHJlbiIsImJhc2VQYXJlbnQiLCJsaVNpYmxpbmciLCJsaVBhcmVudCIsImNoaWxkIiwic3BsaXRFbGVtZW50Iiwib2Zmc2V0IiwiYnAiLCJzcGxpdFRleHQiLCJhZnRlciIsImRlcHRoRWwiLCJwRWxlbWVudCIsIm5vZGVQYXRoQXJyYXkiLCJvbmx5VGV4dCIsImluc3QiLCJub2RlUGF0aExlbiIsImFwcGx5IiwiTnVtYmVyIiwidmFsdWVPZiIsImRlcHRoSW5kZXgiLCJjRGVwdGgiLCJzcGxpY2VEZXB0aCIsImNoaWxkcyIsImNoaWxkTGVuZ3RoIiwibkxlbiIsImFkZE9mZnNldCIsInRleHRPZmZzZXQiLCJ0ZW1wTCIsIm5vdFJlbW92ZU5vZGUiLCJfbm90VGV4dE5vZGUiLCJkZXMiLCJfaXNNYWludGFpbmVkTm9kZSIsIl9pc1NpemVOb2RlIiwiX2Rpc2FsbG93ZWRUYWdzIiwiY3JlYXRlVGFnc1doaXRlbGlzdCIsIl9jb25zaXN0ZW5jeUNoZWNrT2ZIVE1MIiwiZG9jdW1lbnRGcmFnbWVudCIsImh0bWxDaGVja1doaXRlbGlzdFJlZ0V4cCIsInJlbW92ZVRhZ3MiLCJlbXB0eVRhZ3MiLCJ3cm9uZ0xpc3QiLCJ3aXRob3V0Rm9ybWF0Q2VsbHMiLCJ3cm9uZ1RhZ3MiLCJucnRhZyIsImZlbCIsImNoZWNrVGFncyIsInRwIiwiX3NldERlZmF1bHRPcHRpb25TdHlsZSIsIm9wdGlvblN0eWxlIiwibWluSGVpZ2h0IiwiZWRpdG9yIiwic3R5bGVBcnIiLCJfc2V0SWZyYW1lRG9jdW1lbnQiLCJoZWFkIiwiX3NldElmcmFtZUNzc1RhZ3MiLCJfZWRpdGFibGVDbGFzcyIsImxpbmtOYW1lcyIsImlmcmFtZUNTU0ZpbGVOYW1lIiwid1JlZ0V4cCIsInRhZ1N0cmluZyIsIkNTU0ZpbGVOYW1lIiwic3R5bGVUYWciLCJfaW5pdE9wdGlvbnMiLCJ0b3BfZGl2IiwidG9vbF9iYXIiLCJfY3JlYXRlVG9vbEJhciIsInBsdWdpbkNhbGxCdXR0b25zIiwiX2NoZWNrS2F0ZXhNYXRoIiwiYXJyb3ciLCJzdGlja3lfZHVtbXkiLCJlZGl0b3JfZGl2IiwiaW5pdEVsZW1lbnRzIiwiX2luaXRFbGVtZW50cyIsImJvdHRvbUJhciIsInd5c2l3eWdfZGl2IiwicGxhY2Vob2xkZXJfc3BhbiIsInRleHRhcmVhIiwicmVzaXppbmdfYmFyIiwicmVzaXppbmdCYXIiLCJuYXZpZ2F0aW9uIiwiY2hhcl93cmFwcGVyIiwiY2hhcldyYXBwZXIiLCJjaGFyX2NvdW50ZXIiLCJjaGFyQ291bnRlciIsImxvYWRpbmdfYm94IiwibGluZV9icmVha2VyIiwibGluZV9icmVha2VyX3QiLCJsaW5lX2JyZWFrZXJfYiIsInJlc2l6ZV9iYWNrIiwidG9vbGJhckNvbnRhaW5lciIsIl9jaGVja0NvZGVNaXJyb3IiLCJjb25zdHJ1Y3RlZCIsIl90b3AiLCJfcmVsYXRpdmUiLCJfdG9vbEJhciIsIl9tZW51VHJheSIsIl9lZGl0b3JBcmVhIiwiX3d5c2l3eWdBcmVhIiwiX2NvZGVBcmVhIiwiX3BsYWNlaG9sZGVyIiwiX3Jlc2l6aW5nQmFyIiwiX25hdmlnYXRpb24iLCJfY2hhcldyYXBwZXIiLCJfY2hhckNvdW50ZXIiLCJfbGluZUJyZWFrZXIiLCJfbGluZUJyZWFrZXJfdCIsIl9saW5lQnJlYWtlcl9iIiwiX3Jlc2l6ZUJhY2siLCJfc3RpY2t5RHVtbXkiLCJfYXJyb3ciLCJfcmVzcG9uc2l2ZUJ1dHRvbnMiLCJyZXNwb25zaXZlQnV0dG9ucyIsImNvZGVNaXJyb3IiLCJjbU9wdGlvbnMiLCJodG1sTW9kZSIsImxpbmVOdW1iZXJzIiwibGluZVdyYXBwaW5nIiwicmVkdWNlIiwidmlld3BvcnRNYXJnaW4iLCJJbmZpbml0eSIsImNtIiwiZnJvbVRleHRBcmVhIiwid3JhcHBlciIsImNvZGVNaXJyb3JFZGl0b3IiLCJrYXRleE9wdGlvbnMiLCJ0aHJvd09uRXJyb3IiLCJfc2V0T3B0aW9ucyIsIm1lcmdlT3B0aW9ucyIsIm9yaWdpbk9wdGlvbnMiLCJvcmlnaW5FbGVtZW50IiwiZWRpdG9yQXJlYSIsImlzTmV3VG9vbGJhckNvbnRhaW5lciIsImlzTmV3VG9vbGJhciIsInRvcEFyZWEiLCJjYWxsQnV0dG9ucyIsInRvcERpdiIsInRvb2xCYXIiLCJ0b29sQmFyQXJyb3ciLCJfZWRpdG9yU3R5bGVzIiwidG9vbGJhcldpZHRoIiwid3lzaXd5Z0RpdiIsIm92ZXJmbG93IiwiY2hhckNvdW50ZXJMYWJlbCIsImNoYXJMYWJlbCIsIm1heENoYXJDb3VudCIsImNoYXJfbWF4IiwiaW5uZXJUZXh0IiwiX2RlZmF1bHRMYW5nIiwiZGVmYXVsdFRhZyIsInRleHRUYWdzIiwic3ViIiwic3VwIiwiX2RlZmF1bHQiLCJfbmV3IiwiX3RleHRUYWdzTWFwIiwiaGlzdG9yeVN0YWNrRGVsYXlUaW1lIiwiX2RlZmF1bHRUYWdzV2hpdGVsaXN0IiwiX2VkaXRvclRhZ3NXaGl0ZWxpc3QiLCJfc2V0V2hpdGVsaXN0IiwiYWRkVGFnc1doaXRlbGlzdCIsInRhZ3NCbGFja2xpc3QiLCJwYXN0ZVRhZ3NXaGl0ZWxpc3QiLCJwYXN0ZVRhZ3NCbGFja2xpc3QiLCJhdHRyaWJ1dGVzV2hpdGVsaXN0IiwiX3ByaW50Q2xhc3MiLCJzdGlja3lUb29sYmFyIiwidW5kZWZpbmVkIiwiZnVsbFNjcmVlbk9mZnNldCIsImZ1bGxQYWdlIiwicHJldmlld1RlbXBsYXRlIiwicHJpbnRUZW1wbGF0ZSIsInNob3dQYXRoTGFiZWwiLCJjaGFyQ291bnRlclR5cGUiLCJjbGllbnRXaWR0aCIsImNsaWVudEhlaWdodCIsInRhYkRpc2FibGUiLCJzaG9ydGN1dHNEaXNhYmxlIiwic2hvcnRjdXRzSGludCIsImNhbGxCYWNrU2F2ZSIsIl9pY29ucyIsIndoaXRlbGlzdCIsImJsYWNrbGlzdCIsIl9kZWZhdWx0QnV0dG9ucyIsImFkZFNoaWZ0IiwiaW5kZW50S2V5IiwiX2NyZWF0ZU1vZHVsZUdyb3VwIiwib0RpdiIsIm9VbCIsIl9jcmVhdGVCdXR0b24iLCJidXR0b25DbGFzcyIsImRhdGFDb21tYW5kIiwiZGF0YURpc3BsYXkiLCJfZGlzYWJsZWQiLCJvTGkiLCJvQnV0dG9uIiwiX3BsdWdpbnMiLCJzZXBhcmF0b3JfdmVydGljYWwiLCJfYnV0dG9uVHJheSIsInN0cmluZ2lmeSIsImRlZmF1bHRCdXR0b25MaXN0IiwicGx1Z2luc1ZhbHVlcyIsIm1vZHVsZUVsZW1lbnQiLCJidXR0b25FbGVtZW50IiwibW9yZUxheWVyIiwiYnV0dG9uR3JvdXBMb29wIiwibW9yZSIsIm1vcmVDb250YWluZXIiLCJtb3JlQ29tbWFuZCIsImJ1dHRvbkdyb3VwIiwibW9yZUJ1dHRvbiIsImRpdiIsIm1hdGNoZWQiLCJjdXN0b20iLCJ1bCIsImxpIiwic3YiLCJlbnRlckRpdiIsInVuc2hpZnQiLCJ0b29sX2NvdmVyIiwiX0NvbnRleHQiLCJjb25zIiwibG9hZGluZyIsImxpbmVCcmVha2VyIiwibGluZUJyZWFrZXJfdCIsImxpbmVCcmVha2VyX2IiLCJyZXNpemVCYWNrZ3JvdW5kIiwidG9vbCIsIm5vdGljZSIsIm5vdGljZV9kaXYiLCJub3RpY2Vfc3BhbiIsIm5vdGljZV9idXR0b24iLCJvbkNsaWNrX2NhbmNlbCIsImluaXRfb3B0aW9ucyIsImlkT3JFbGVtZW50IiwiX2luaXRfb3B0aW9ucyIsInZhbCIsImdldEVsZW1lbnRCeUlkIiwiX0NvbnN0cnVjdG9yIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiX3V0aWwiLCJfcGFyc2VyIiwiX3d3IiwiX3NoYWRvd1Jvb3QiLCJfc2hhZG93Um9vdENvbnRyb2xsZXJFdmVudFRhcmdldCIsIl9ub3RpY2UiLCJpbml0UGx1Z2lucyIsIl90YXJnZXRQbHVnaW5zIiwic3VibWVudSIsIl9zdWJtZW51TmFtZSIsIl9iaW5kZWRTdWJtZW51T2ZmIiwiX2JpbmRlZENvbnRhaW5lck9mZiIsInN1Ym1lbnVBY3RpdmVCdXR0b24iLCJjb250YWluZXJBY3RpdmVCdXR0b24iLCJjdXJyZW50Q29udHJvbGxlclRhcmdldCIsImN1cnJlbnRGaWxlQ29tcG9uZW50SW5mbyIsImNvZGVWaWV3RGlzYWJsZWRCdXR0b25zIiwicmVzaXppbmdEaXNhYmxlZEJ1dHRvbnMiLCJfbW9yZUxheWVyQWN0aXZlQnV0dG9uIiwiX2h0bWxDaGVja1doaXRlbGlzdFJlZ0V4cCIsIl9kaXNhbGxvd2VkVGV4dFRhZ3NSZWdFeHAiLCJlZGl0b3JUYWdzV2hpdGVsaXN0UmVnRXhwIiwicGFzdGVUYWdzV2hpdGVsaXN0UmVnRXhwIiwiaXNEaXNhYmxlZCIsIl9hdHRyaWJ1dGVzV2hpdGVsaXN0UmVnRXhwIiwiX2F0dHJpYnV0ZXNUYWdzV2hpdGVsaXN0IiwiX2JpbmRDb250cm9sbGVyc09mZiIsIl9pc0lubGluZSIsIl9pc0JhbGxvb24iLCJfaXNCYWxsb29uQWx3YXlzIiwiX2lubGluZVRvb2xiYXJBdHRyIiwiaXNTaG93IiwiX25vdEhpZGVUb29sYmFyIiwiX3N0aWNreSIsIl9saW5lQnJlYWtlckJ1dHRvbiIsIl9jb21wb25lbnRzSW5mb0luaXQiLCJfY29tcG9uZW50c0luZm9SZXNldCIsImFjdGl2ZVBsdWdpbnMiLCJtYW5hZ2VkVGFnc0luZm8iLCJfY2hhclR5cGVIVE1MIiwiX2ZpbGVJbmZvUGx1Z2luc0NoZWNrIiwiX2ZpbGVJbmZvUGx1Z2luc1Jlc2V0IiwiX2ZpbGVNYW5hZ2VyIiwicXVlcnlTdHJpbmciLCJwbHVnaW5SZWdFeHAiLCJwbHVnaW5NYXAiLCJjb21tYW5kTWFwIiwiX3N0eWxlQ29tbWFuZE1hcCIsIl9kZWZhdWx0Q29tbWFuZCIsIl92YXJpYWJsZSIsImlzQ2hhbmdlZCIsImlzQ29kZVZpZXciLCJpc0Z1bGxTY3JlZW4iLCJpbm5lckhlaWdodF9mdWxsU2NyZWVuIiwicmVzaXplQ2xpZW50WSIsInRhYlNpemUiLCJjb2RlSW5kZW50IiwibWluUmVzaXppbmdTaXplIiwiY3VycmVudE5vZGVzIiwiY3VycmVudE5vZGVzTWFwIiwiX3JhbmdlIiwiX3NlbGVjdGlvbk5vZGUiLCJfb3JpZ2luQ3NzVGV4dCIsIl9ib2R5T3ZlcmZsb3ciLCJfZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQiLCJfd3lzaXd5Z09yaWdpbkNzc1RleHQiLCJfY29kZU9yaWdpbkNzc1RleHQiLCJfZnVsbFNjcmVlbkF0dHJzIiwic3RpY2t5IiwiYmFsbG9vbiIsImlubGluZSIsIl9saW5lQnJlYWtDb21wIiwiX2xpbmVCcmVha0RpciIsImNhbGxCYWNrRnVuY3Rpb24iLCJfdGFyZ2V0IiwibW9kdWxlQXJyYXkiLCJtb2R1bGVOYW1lIiwiZ2V0R2xvYmFsU2Nyb2xsT2Zmc2V0Iiwic2Nyb2xsTGVmdCIsInN1Ym1lbnVPbiIsInN1Ym1lbnVOYW1lIiwiX3NldE1lbnVQb3NpdGlvbiIsImNvbnRhaW5lck9uIiwiY29udGFpbmVyTmFtZSIsIl9jb250YWluZXJOYW1lIiwiY29udGFpbmVyT2ZmIiwidG9vbGJhclciLCJ0b29sYmFyT2Zmc2V0IiwiZXZlbnQiLCJfZ2V0RWRpdG9yT2Zmc2V0cyIsIm1lbnVXIiwiZWxlbWVudFciLCJydGxXIiwicnRsTCIsIm92ZXJMZWZ0Iiwib2Zmc2V0RWwiLCJidCIsInRvb2xiYXJUb3AiLCJtZW51SGVpZ2h0IiwibWVudUhlaWdodF9ib3R0b20iLCJtZW51VG9wIiwiaW5zVG9wIiwibWVudUhlaWdodF90b3AiLCJhcmciLCJhcmd1bWVudHMiLCJnZXRGaWxlQ29tcG9uZW50Iiwic2hvd0NvbnRyb2xsZXIiLCJyZWZlckVsIiwidG9wTWFyZ2luIiwiY29udHJvbGxlclciLCJyZWZlckVsVyIsImFsbG93Iiwib3ZlclNpemUiLCJleGVjQ29tbWFuZCIsInNob3dEZWZhdWx0VUkiLCJuYXRpdmVGb2N1cyIsIl9lZGl0b3JSYW5nZSIsImN1cnJlbnROb2RlIiwiY29tbW9uQW5jZXN0b3JDb250YWluZXIiLCJiciIsIl9hcHBseVRhZ0VmZmVjdHMiLCJfdG9nZ2xlVG9vbGJhckJhbGxvb24iLCJmaWxlQ29tcG9uZW50SW5mbyIsImJsdXIiLCJzdGFydENvbiIsInN0YXJ0T2ZmIiwiZW5kQ29uIiwiZW5kT2ZmIiwic2V0U3RhcnQiLCJzZXRFbmQiLCJzZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInJlbW92ZVJhbmdlIiwiT1VUREVOVCIsIklOREVOVCIsIl9jcmVhdGVEZWZhdWx0UmFuZ2UiLCJjb2xsYXBzZWQiLCJmb2N1c05vZGUiLCJyYW5nZUNvdW50IiwiZ2V0UmFuZ2VBdCIsImFuY2hvck5vZGUiLCJhbmNob3JPZmZzZXQiLCJmb2N1c09mZnNldCIsImNvbXBhcmVWYWx1ZSIsInJpZ2h0RGlyIiwiX3NlbGVjdGlvblZvaWQiLCJvcCIsImV4dGVudE5vZGUiLCJjb21tIiwiX3Jlc2V0UmFuZ2VUb1RleHROb2RlIiwidGVtcENvbiIsInRlbXBPZmZzZXQiLCJ0ZW1wQ2hpbGQiLCJvbmx5QnJlYWsiLCJlbXB0eVRleHQiLCJjb21tb25Db24iLCJsaW5lTm9kZXMiLCJzdGFydExpbmUiLCJlbmRMaW5lIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJvbmx5VGFibGUiLCJzdGFydFJhbmdlRWwiLCJlbmRSYW5nZUVsIiwic2FtZVJhbmdlIiwicmVtb3ZlRHVwbGljYXRlIiwibXlDb21wb25lbnQiLCJzZWxlY3RlZExpbmVzIiwiaXNFZGdlUG9pbnQiLCJkaXIiLCJub2RlVmFsdWUiLCJfaXNFZGdlRm9ybWF0IiwiZm9ybWF0Tm9kZSIsImN1cnJlbnRGb3JtYXRFbCIsIm9Gb3JtYXROYW1lIiwiY2hlY2tDaGFyQ291bnQiLCJub3RTZWxlY3QiLCJyZW1vdmVOb2RlIiwiZm9ybWF0RWwiLCJkZXB0aEZvcm1hdCIsInBsdWdpbiIsIl9zZXRDb21wb25lbnRMaW5lQnJlYWtlciIsInRfc3R5bGUiLCJiX3N0eWxlIiwicmVzaXplQ29udGFpbmVyIiwiY29tcG9uZW50VG9wIiwid1Njcm9sbCIsImFmdGVyTm9kZSIsImZyZWVGb3JtYXQiLCJpc0Zvcm1hdHMiLCJmb3JtYXRSYW5nZSIsIm9yaWdpbkFmdGVyIiwicmVtb3ZlZFRhZyIsInByZXZDb250YWluZXIiLCJzYW1lUGFyZW50Iiwib2xkUGFyZW50IiwicmFuZ2VDb24iLCJmTm9kZSIsImNJdGVtIiwiX3NldEludG9GcmVlRm9ybWF0IiwicHJldmlvdXNUZXh0IiwibmV4dFRleHQiLCJuZXdSYW5nZSIsInplcm9XaWR0aCIsIm9Ob2RlQ2hpbGRyZW4iLCJsYXN0T05vZGUiLCJiZWZvcmVOb2RlIiwic3RhcnRJbmRleCIsImVuZEluZGV4Iiwic3RhcnROb2RlIiwiZW5kTm9kZSIsInN1YnN0cmluZ0RhdGEiLCJyYyIsInJhbmdlTGluZXMiLCJsaW5lc0xvb3AiLCJuZXN0ZWQiLCJmRWwiLCJsRWwiLCJzdGFuZFRhZyIsImJlZm9yZVRhZyIsInBhcmVudERlcHRoIiwibGlzdFBhcmVudCIsImxpbmVBcnIiLCJyZW1vdmVJdGVtcyIsIm5leHRMaW5lIiwibmV4dExpc3QiLCJyZW1vdmVBcnJheSIsInNwbGl0UmFuZ2UiLCJuZXdSYW5nZUVsZW1lbnQiLCJmaXJzdE5vZGUiLCJsYXN0Tm9kZSIsInJhbmdlRWwiLCJpbnNlcnRlZE5ldyIsIm1vdmVDb21wbGV0ZSIsImFwcGVuZE5vZGUiLCJpbnNOb2RlIiwib3JpZ2luTm9kZSIsImluc0NoaWxkcmVuIiwib3JpZ2luTmV4dCIsImRldGFjaFJhbmdlIiwibGluZUluZGV4IiwiaW5zTmV4dCIsImlubmVyQ2hpbGRyZW4iLCJyYW5nZVBhcmVudCIsInJhbmdlUmlnaHQiLCJjaGlsZEVkZ2UiLCJsaXN0Rmlyc3QiLCJsaXN0TGFzdCIsImxhc3RJbmRleCIsInN0eWxlQXJyYXkiLCJyZW1vdmVOb2RlQXJyYXkiLCJzdHJpY3RSZW1vdmUiLCJpc1JlbW92ZU5vZGUiLCJpc1JlbW92ZUZvcm1hdCIsIm5ld05vZGVOYW1lIiwic05vZGUiLCJjaGVja0NudCIsImNoZWNrQXR0cnMiLCJja2Vja0NsYXNzZXMiLCJjbGFzc1JlZyIsInN0eWxlQ2hlY2siLCJjbGFzc0NoZWNrIiwic3RhcnQiLCJlbmQiLCJzdHlsZVJlZ0V4cCIsImNsYXNzUmVnRXhwIiwicmVtb3ZlTm9kZVJlZ0V4cCIsIndCb29sZWFuIiwiQm9vbGVhbiIsIl9yZW1vdmVDaGVjayIsImNoZWNrTm9kZSIsInZOb2RlIiwidGFnUmVtb3ZlIiwib3JpZ2luU3R5bGUiLCJvcmlnaW5DbGFzc2VzIiwib25lTGluZSIsImVuZExlbmd0aCIsImlzUmVtb3ZlQW5jaG9yIiwiaXNTaXplTm9kZSIsIl9nZXRNYWludGFpbmVkTm9kZSIsIl91dGlsX2dldE1haW50YWluZWROb2RlIiwiX3V0aWxfaXNNYWludGFpbmVkTm9kZSIsIl9ub2RlQ2hhbmdlX29uZUxpbmUiLCJfc2V0Q29tbW9uTGlzdFN0eWxlIiwiX25vZGVDaGFuZ2VfZW5kTGluZSIsIl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUiLCJfbm9kZUNoYW5nZV9zdGFydExpbmUiLCJjaGlsZFN0eWxlIiwiZWxTdHlsZSIsImZvbnRXZWlnaHQiLCJfc3RyaXBSZW1vdmVOb2RlIiwiX2lzUmVtb3ZlIiwibmV3SW5uZXJOb2RlIiwicGFyZW50Q29uIiwic2FtZVRhZyIsInoiLCJuTm9kZUFycmF5IiwicE5vZGUiLCJpc1NhbWVOb2RlIiwicEN1cnJlbnQiLCJzdGFydFBhc3MiLCJlbmRQYXNzIiwiY2hlY2tDc3MiLCJjb3Zlck5vZGUiLCJwcmV2Tm9kZSIsInByZXZBbmNob3JOb2RlIiwiY2hpbGROb2RlIiwiYW5jaG9ycyIsImFDaGlsZHJlbiIsImFMZW4iLCJhbmNlc3RvckFuY2hvck5vZGUiLCJhZnRlckFuY2hvck5vZGUiLCJ0ZXh0Tm9kZV9zIiwidGV4dE5vZGVfZSIsImVuZENvblJlc2V0IiwibmV3U3RhcnRPZmZzZXQiLCJzdGFydFBhdGgiLCJtZXJnZUVuZENvbiIsIm5ld0VuZE9mZnNldCIsImVuZFBhdGgiLCJuZXdPZmZzZXRzIiwiX2VuZENvbnRhaW5lciIsInBhc3NOb2RlIiwiY2xvbmVDaGlsZCIsImlzVG9wTm9kZSIsInRlbXBOb2RlIiwibmV3Q3NzVGV4dCIsIm5ld0NsYXNzIiwibm9uZUNoYW5nZSIsImFjdGlvbkNhbGwiLCJsYXllciIsIl9zaG93VG9vbGJhckJhbGxvb24iLCJfc2hvd1Rvb2xiYXJJbmxpbmUiLCJjb21tYW5kSGFuZGxlciIsInRvZ2dsZUNvZGVWaWV3IiwidG9nZ2xlRnVsbFNjcmVlbiIsInRvZ2dsZURpc3BsYXlCbG9ja3MiLCJnZXRDb250ZW50cyIsIm5vZGVzTWFwIiwibWFyZ2luRGlyIiwiX3Jlc291cmNlc1N0YXRlQ2hhbmdlIiwiX3NldENvZGVEYXRhVG9FZGl0b3IiLCJfaGlkZVRvb2xiYXIiLCJfc2V0RWRpdG9yRGF0YVRvQ29kZVZpZXciLCJzY3JvbGxIZWlnaHQiLCJyZWZyZXNoIiwiX2NoZWNrUGxhY2Vob2xkZXIiLCJjb2RlX2h0bWwiLCJfZ2V0Q29kZVZpZXciLCJwYXJzZURvY3VtZW50IiwiaGVhZENoaWxkcmVuIiwiY29udmVydENvbnRlbnRzRm9yRWRpdG9yIiwiZWRpdGFibGVDbGFzc2VzIiwiY29kZUNvbnRlbnRzIiwiY29udmVydEhUTUxGb3JDb2RlVmlldyIsImNvZGVWYWx1ZSIsIl9zZXRDb2RlVmlldyIsIl92YXIiLCJvblNjcm9sbF93aW5kb3ciLCJtYXJnaW5Ub3AiLCJ6SW5kZXgiLCJfaWZyYW1lQXV0b0hlaWdodCIsImNvbnRlbnRzSFRNTCIsInByaW50RG9jdW1lbnQiLCJ3RG9jIiwiYXJydHMiLCJ3cml0ZSIsImxpbmtzIiwibGlua0hUTUwiLCJkb2N1bWVudE1vZGUiLCJTdHlsZU1lZGlhIiwid2luZG93T2JqZWN0IiwibWltZVR5cGUiLCJjb252ZXJ0VmFsdWUiLCJfcmVzZXRDb21wb25lbnRzIiwic2V0SWZyYW1lQ29udGVudHMiLCJjdHgiLCJvbmx5Q29udGVudHMiLCJyZW5kZXJIVE1MIiwiZmlnY2FwdGlvbnMiLCJfbWFrZUxpbmUiLCJyZXF1aXJlRm9ybWF0IiwidGV4dEFycmF5IiwiX2FsbG93SFRNTENvbW1lbnRzIiwiX3RhZ0NvbnZlcnRvciIsIl9kZWxldGVEaXNhbGxvd2VkVGFncyIsIl9jbGVhblRhZ3MiLCJyb3dMZXZlbENoZWNrIiwidEF0dHIiLCJjbGVhbkhUTUwiLCJ0ZXh0Q29tcExpc3QiLCJpbml0TWV0aG9kIiwiZG9tVHJlZSIsInJldHVybkhUTUwiLCJiclJlZyIsImluZGVudFNpemUiLCJsaW5lQlIiLCJlbGVtZW50UmVnVGVzdCIsImVsZW1lbnRJbmRlbnQiLCJub2RlUmVnVGVzdCIsImxpc3RlbmVyIiwidXNlQ2FwdHVyZSIsIl9jaGFyQ291bnQiLCJpbnB1dFRleHQiLCJjb3VudFR5cGUiLCJuZXh0Q2hhckNvdW50IiwiZ2V0Q2hhckxlbmd0aCIsIl9zZXRDaGFyQ291bnQiLCJvdmVyIiwiY291bnQiLCJnZXRDaGFyQ291bnQiLCJzbGljZVBvc2l0aW9uIiwiX2NhbGxDb3VudGVyQmxpbmsiLCJfY2hlY2tDb21wb25lbnRzIiwiZ2V0RG9jIiwic2V0VmFsdWUiLCJnZXRWYWx1ZSIsIl9pbml0IiwicmVsb2FkIiwiX2luaXRIVE1MIiwiU2hhZG93Um9vdCIsInNoYWRvd1Jvb3QiLCJkaXNhbGxvd1RleHRUYWdzIiwiYWxsb3dUZXh0VGFncyIsImRlZmF1bHRBdHRyIiwiX2F0dHIiLCJ0YWdzQXR0ciIsImFsbEF0dHIiLCJrIiwiX2NhY2hpbmdCdXR0b25zIiwibWFuYWdlZENsYXNzIiwiZmlsZVBsdWdpblJlZ0V4cCIsImNoYW5nZSIsImRlbGF5VGltZSIsInB1c2hEZWxheSIsInN0YWNrSW5kZXgiLCJzdGFjayIsInNldENvbnRlbnRzRnJvbVN0YWNrIiwicHVzaFN0YWNrIiwiZGVsYXkiLCJ0aW1lIiwiY2xlYXJUaW1lb3V0IiwiZ28iLCJpZ25vcmVDaGFuZ2VFdmVudCIsIl9yZXNldENhY2hpbmdCdXR0b24iLCJfZGVzdHJveSIsIl9oaXN0b3J5IiwiX29uQ2hhbmdlX2hpc3RvcnlTdGFjayIsIl9pZnJhbWVBdXRvIiwiX2luaXRXeXNpd3lnQXJlYSIsIlNVQiIsIlNVUCIsIm9uQ2hhbmdlIiwiX3NldERlZmF1bHRGb3JtYXQiLCJmb3JtYXROYW1lIiwiZmlsZUNvbXBvbmVudCIsIl9zZXRPcHRpb25zSW5pdCIsIl9nZXRDb25zdHJ1Y3RlZCIsIl9lZGl0b3JJbml0IiwiX2FkZEV2ZW50IiwiX29mZlN0aWNreVRvb2xiYXIiLCJvblJlc2l6ZV93aW5kb3ciLCJjb250ZXh0RWwiLCJfSUVpc0NvbXBvc2luZyIsIl9saW5lQnJlYWtlckJpbmQiLCJfcmVzcG9uc2l2ZUN1cnJlbnRTaXplIiwiX3Jlc3BvbnNpdmVCdXR0b25TaXplIiwiX2RpcmVjdGlvbktleUNvZGUiLCJfbm9uVGV4dEtleUNvZGUiLCJfaGlzdG9yeUlnbm9yZUtleUNvZGUiLCJfb25CdXR0b25zQ2hlY2siLCJfZnJvbnRaZXJvV2lkdGhSZWciLCJfa2V5Q29kZVNob3J0Y3V0IiwiNjUiLCI2NiIsIjgzIiwiODUiLCI3MyIsIjg5IiwiOTAiLCIyMTkiLCIyMjEiLCJfc2hvcnRjdXRDb21tYW5kIiwiY2xhc3NPbkNoZWNrIiwiY29tbWFuZE1hcE5vZGVzIiwiX2NhbmNlbENhcHRpb25FZGl0IiwiX2J1dHRvbnNFdmVudEhhbmRsZXIiLCJvbkNsaWNrX3Rvb2xiYXIiLCJvbk1vdXNlRG93bl93eXNpd3lnIiwib25Nb3VzZURvd24iLCJ0YWJsZUNlbGwiLCJvbkNsaWNrX3d5c2l3eWciLCJvbkNsaWNrIiwiaGlkZVRvb2xiYXIiLCJwcmV2TGkiLCJfYmFsbG9vbkRlbGF5IiwiX3Nob3dUb29sYmFyQmFsbG9vbkRlbGF5IiwicmFuZ2VPYmoiLCJpc0RpclRvcCIsInJlY3RzIiwiZ2V0Q2xpZW50UmVjdHMiLCJnbG9iYWxTY3JvbGwiLCJlZGl0b3JXaWR0aCIsInN0aWNreVRvcCIsImVkaXRvckxlZnQiLCJub2RlT2Zmc2V0IiwiYm90dG9tIiwibm9UZXh0IiwiYXJyb3dNYXJnaW4iLCJ0b29sYmFySGVpZ2h0IiwiaWZyYW1lUmVjdHMiLCJfc2V0VG9vbGJhck9mZnNldCIsImVkaXRvclBhcmVudCIsImFic29sdXRlTGVmdCIsIm92ZXJSaWdodCIsInJlc2V0VG9wIiwic3BhY2UiLCJfZ2V0UGFnZUJvdHRvbVNwYWNlIiwiZG9jdW1lbnRFbGVtZW50IiwiYXJyb3dfbGVmdCIsInNob3dJbmxpbmUiLCJvbklucHV0X3d5c2l3eWciLCJvbklucHV0IiwiX2lzVW5lZGl0YWJsZU5vZGUiLCJpc0Zyb250Iiwic2libGluZ0tleSIsInNpYmxpbmdOb2RlIiwiX2lzVW5lZGl0YWJsZU5vZGVfZ2V0U2libGluZyIsInNlbGVjdE5vZGUiLCJfb25TaG9ydGN1dEtleSIsIm9uS2V5RG93bl93eXNpd3lnIiwic2hpZnRLZXkiLCJjdHJsIiwiY3RybEtleSIsIm1ldGFLZXkiLCJhbHRLZXkiLCJvbktleURvd24iLCJzZWxlY3RSYW5nZSIsImZpbGVDb21wb25lbnROYW1lIiwiX2hhcmREZWxldGUiLCJkZWZhdWx0Rm9ybWF0IiwicHJldkxhc3QiLCJjb24iLCJzZWwiLCJpZ25vcmVaV1MiLCJuZXh0RWwiLCJpc0VkZ2UiLCJsaW5lcyIsImZjIiwibGMiLCJtb3ZlQ2VsbCIsImVuZENoaWxkIiwidGFiVGV4dCIsInRleHRSYW5nZSIsImZyZWVGb3JtYXRFbCIsImVudGVySFRNTCIsImZvcm1hdElubmVycyIsImlubmVyTm9kZSIsInNlbGVjdGlvbkZvcm1hdCIsIndTZWxlY3Rpb24iLCJpbnNlcnRIVE1MIiwid09mZnNldCIsImZvY3VzTmV4dCIsImJyUHJldiIsImJyTmV4dCIsIm5ld0xpc3RDZWxsIiwiY29tcENvbnRleHQiLCJuYnNwIiwib25LZXlVcF93eXNpd3lnIiwib25LZXlVcCIsIm9Gb3JtYXRUYWciLCJpc0NvbXBvc2luZyIsImZyb250WmVyb1dpZHRoQ250Iiwic3Vic3RyaW5nIiwib25TY3JvbGxfd3lzaXd5ZyIsIm9uU2Nyb2xsIiwib25Gb2N1c193eXNpd3lnIiwib25Gb2N1cyIsIm9uQmx1cl93eXNpd3lnIiwib25CbHVyIiwib25Nb3VzZURvd25fcmVzaXppbmdCYXIiLCJjbGllbnRZIiwiX3Jlc2l6ZV9lZGl0b3IiLCJjbG9zdXJlRnVuYyIsInJlc2l6ZUludGVydmFsIiwicmVzcG9uc2l2ZVNpemUiLCJyZXNwb25zaXZlV2lkdGgiLCJzZXRUb29sYmFyQnV0dG9ucyIsImVkaXRvckhlaWdodCIsInNjcm9sbFkiLCJlZGl0b3JUb3AiLCJfb25TdGlja3lUb29sYmFyIiwic2Nyb2xsIiwiX2NvZGVWaWV3QXV0b0hlaWdodCIsInNDZWxsIiwiZUNlbGwiLCJzSXNDZWxsIiwiZUlzQ2VsbCIsInNDb21wIiwiZUNvbXAiLCJvblBhc3RlX3d5c2l3eWciLCJjbGlwYm9hcmREYXRhIiwiX2RhdGFUcmFuc2ZlckFjdGlvbiIsIl9zZXRDbGlwYm9hcmRDb21wb25lbnQiLCJzZXREYXRhIiwib25Db3B5X3d5c2l3eWciLCJvbkNvcHkiLCJvbkN1dF93eXNpd3lnIiwib25DdXQiLCJvbkRyb3Bfd3lzaXd5ZyIsImRhdGFUcmFuc2ZlciIsIl9zZXREcm9wTG9jYXRpb25TZWxlY3Rpb24iLCJyYW5nZU9mZnNldCIsImNhcmV0UmFuZ2VGcm9tUG9pbnQiLCJjbGllbnRYIiwicGxhaW5UZXh0IiwiY2xlYW5EYXRhIiwiZ2V0RGF0YSIsInRlbXBEaXYiLCJ0ZW1wUmFuZ2UiLCJfc2V0Q2xpcGJvYXJkRGF0YSIsIk1TRGF0YSIsIm9uUGFzdGUiLCJvbkRyb3AiLCJpbnNlcnRJbWFnZSIsIm9uTW91c2VNb3ZlX3d5c2l3eWciLCJsaW5lQnJlYWtlclN0eWxlIiwiY3R4RWwiLCJwYWdlWSIsIl9vbk1vdXNlRG93bl9saW5lQnJlYWsiLCJfb25MaW5lQnJlYWsiLCJldmVudFd5c2l3eWciLCJwYXNzaXZlIiwiX3NldFJlc3BvbnNpdmVUb29sYmFyIiwiX3JlbW92ZUV2ZW50Iiwic2l6ZUFycmF5IiwiYnV0dG9uc09iaiIsIm5ld1Rvb2xiYXIiLCJuZXdDb250ZXh0Iiwib2xkQ2FsbEJ1dHRvbnMiLCJvbGRCdXR0b24iLCJzZXRPcHRpb25zIiwiX29wdGlvbnMiLCJzZXREZWZhdWx0U3R5bGUiLCJuZXdTdHlsZXMiLCJub3RpY2VDbG9zZSIsImdldENvbnRleHQiLCJnZXRUZXh0IiwiZ2V0SW1hZ2VzSW5mbyIsImdldEZpbGVzSW5mbyIsIm5vdENsZWFuaW5nRGF0YSIsInJhbmdlU2VsZWN0aW9uIiwiY2hlY2tIVE1MIiwiZmlyc3RDb24iLCJhcHBlbmRDb250ZW50cyIsInNldE9wdGlvbiIsInRvcEFyZWFTdHlsZSIsImhpZGUiLCJTVU5FRElUT1IiLCJzdW5lZGl0b3IiLCJfcmVzaXplQ2xpZW50WCIsIl9yZXNpemVDbGllbnRZIiwiX3Jlc2l6ZV93IiwiX3Jlc2l6ZV9oIiwiX3Jlc2l6ZV9kaXJlY3Rpb24iLCJfbW92ZV9wYXRoIiwiX2lzQ2hhbmdlIiwiYWxpZ25JY29ucyIsInJlc2l6ZV9kaXZfY29udGFpbmVyIiwic2V0Q29udHJvbGxlcl9yZXNpemUiLCJyZXNpemVEb3QiLCJyZXNpemVEaXNwbGF5IiwicmVzaXplX2J1dHRvbiIsInNldENvbnRyb2xsZXJfYnV0dG9uIiwicmVzaXplX2hhbmRsZXMiLCJyZXNpemVIYW5kbGVzIiwicmVzaXplQnV0dG9uR3JvdXAiLCJyb3RhdGlvbkJ1dHRvbnMiLCJwZXJjZW50YWdlQnV0dG9ucyIsImFsaWduTWVudSIsImFsaWduTWVudUxpc3QiLCJhbGlnbkJ1dHRvbiIsImF1dG9TaXplQnV0dG9uIiwiY2FwdGlvbkJ1dHRvbiIsIm9uTW91c2VEb3duX3Jlc2l6ZV9oYW5kbGUiLCJvbkNsaWNrX3Jlc2l6ZUJ1dHRvbiIsInJlc2l6ZV9jb250YWluZXIiLCJwbHVnaW5PYmoiLCJwZXJjZW50YWdlUm90YXRpb24iLCJ4VW5pdCIsInlVbml0IiwiZGVjIiwieFZhbHVlIiwieVZhbHVlIiwiY29udGV4dFJlc2l6aW5nIiwiaXNWZXJ0aWNhbCIsImFicyIsImRpc3BsYXlYIiwiZGlzcGxheVkiLCJyZXNpemVEb3RTaG93Iiwicm90YXRpb25zIiwicEJ1dHRvbnMiLCJuYXR1cmFsV2lkdGgiLCJuYXR1cmFsSGVpZ2h0IiwiX2Nsb3NlQWxpZ25NZW51Iiwib3BlbkFsaWduTWVudSIsImN1cnJlbnRDb250ZXh0IiwiY3VycmVudE1vZHVsZSIsInBlcmNlbnRZIiwicGVyY2VudGFnZSIsIl9zZXRUcmFuc0Zvcm0iLCJzbG9wZSIsImRlZyIsImFsaWduVmFsdWUiLCJjYXB0aW9uVGV4dCIsInRyYW5zZm9ybSIsInRyYW5zZm9ybU9yaWdpbiIsInRyYW5zT3JpZ2luIiwib2Zmc2V0VyIsIm9mZnNldEgiLCJ0cmFuc1ciLCJ0cmFuc0giLCJ0cmFuc2xhdGUiLCJjbG9zdXJlRnVuY19iaW5kIiwicmVzaXppbmdfZWxlbWVudF9iaW5kIiwiY2FuY2VsX2NvbnRyb2xsZXJfcmVzaXplIiwicmVzaXppbmdfZWxlbWVudCIsInJlc3VsdFciLCJyZXN1bHRIIiwid2giLCJwYWRkaW5nIiwibGltaXQiLCJfY2hlY2tNZWRpYUNvbXBvbmVudCIsInVwbG9hZFVybCIsInVwbG9hZEhlYWRlciIsImNhbGxCYWNrIiwiZXJyb3JDYWxsQmFjayIsImZpbGVQbHVnaW4iLCJfY2FsbEJhY2tVcGxvYWQiLCJ0YWdOYW1lcyIsInVwbG9hZEV2ZW50SGFuZGxlciIsImZpbGVNYW5hZ2VyUGx1Z2luIiwiaW5mb0xpc3QiLCJzZXRGaWxlSW5mbyIsImluZm9VcGRhdGUiLCJjdXJyZW50VGFncyIsImluZm9JbmRleCIsInBsZ3VpbiIsInN0YXRlIiwic2Nyb2xsSW50b1ZpZXciXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIsR0FBVyxFQUFQRSxHQUE4QixpQkFBVkYsR0FBc0JBLEdBQVNBLEVBQU1HLFdBQVksT0FBT0gsRUFDaEYsSUFBSUksRUFBS1gsT0FBT1ksT0FBTyxNQUd2QixHQUZBMUIsRUFBb0JrQixFQUFFTyxHQUN0QlgsT0FBT0MsZUFBZVUsRUFBSSxVQUFXLENBQUVULFlBQVksRUFBTUssTUFBT0EsSUFDdEQs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LE9BQU9DLGVBQWV1QixFQUFRLG9CQUFxQixDQUMvQ3RCLFlBQVksRUFDWnNFLFVBQVUsRUFDVkMsY0FBYyxFQUNkbEUsTUFBTyxLQUlmUCxPQUFPQyxlQUFldUIsRUFBTytDLGtCQUFtQixjQUFlLENBQzNEckUsWUFBWSxFQUNac0UsVUFBVSxFQUNWQyxjQUFjLEVBQ2RsRSxNQUFPeWYsS0FJUkEsR0EzVHFELGlCQUFuQjNnQixFQUFPRCxRQUM1Q0MsRUFBT0QsUUFBVWtDLEVBQU9vRCxTQUNwQm5ELEVBQVFELEdBQVEsR0FDaEIsU0FBVXFELEdBQ04sSUFBS0EsRUFBRUQsU0FDSCxNQUFNLElBQUlFLE1BQU0sOENBRXBCLE9BQU9yRCxFQUFRb0QsSUFHdkJwRCxFQUFRRCIsImZpbGUiOiJzdW5lZGl0b3IubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiWEpSMVwiKTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cbiAgICAgICAgICAgIGZhY3RvcnkoZ2xvYmFsLCB0cnVlKSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmICghdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NVTkVESVRPUl9NT0RVTEVTIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeSh3KTtcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFjdG9yeShnbG9iYWwpO1xuICAgIH1cbn0odHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiAod2luZG93LCBub0dsb2JhbCkge1xuICAgIGNvbnN0IGRpYWxvZyA9IHtcbiAgICAgICAgbmFtZTogJ2RpYWxvZycsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICAgICAgY29udGV4dC5kaWFsb2cgPSB7XG4gICAgICAgICAgICAgICAga2luZDogJycsXG4gICAgICAgICAgICAgICAgdXBkYXRlTW9kYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIF9jbG9zZVNpZ25hbDogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8qKiBkaWFsb2cgKi9cbiAgICAgICAgICAgIGxldCBkaWFsb2dfZGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgZGlhbG9nX2Rpdi5jbGFzc05hbWUgPSAnc2UtZGlhbG9nIHN1bi1lZGl0b3ItY29tbW9uJztcblxuICAgICAgICAgICAgbGV0IGRpYWxvZ19iYWNrID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgZGlhbG9nX2JhY2suY2xhc3NOYW1lID0gJ3NlLWRpYWxvZy1iYWNrJztcbiAgICAgICAgICAgIGRpYWxvZ19iYWNrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBkaWFsb2dfYXJlYSA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIGRpYWxvZ19hcmVhLmNsYXNzTmFtZSA9ICdzZS1kaWFsb2ctaW5uZXInO1xuICAgICAgICAgICAgZGlhbG9nX2FyZWEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgZGlhbG9nX2Rpdi5hcHBlbmRDaGlsZChkaWFsb2dfYmFjayk7XG4gICAgICAgICAgICBkaWFsb2dfZGl2LmFwcGVuZENoaWxkKGRpYWxvZ19hcmVhKTtcblxuICAgICAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWxBcmVhID0gZGlhbG9nX2RpdjtcbiAgICAgICAgICAgIGNvbnRleHQuZGlhbG9nLmJhY2sgPSBkaWFsb2dfYmFjaztcbiAgICAgICAgICAgIGNvbnRleHQuZGlhbG9nLm1vZGFsID0gZGlhbG9nX2FyZWE7XG5cbiAgICAgICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93bl9kaWFsb2cuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2tfZGlhbG9nLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZWxhdGl2ZS5hcHBlbmRDaGlsZChkaWFsb2dfZGl2KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICAgICAgZGlhbG9nX2RpdiA9IG51bGwsIGRpYWxvZ19iYWNrID0gbnVsbCwgZGlhbG9nX2FyZWEgPSBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgY2xvc2luZyB0aGUgZGlhbG9nXG4gICAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9vbk1vdXNlRG93bl9kaWFsb2c6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoL3NlLWRpYWxvZy1pbm5lci8udGVzdChlLnRhcmdldC5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5fY2xvc2VTaWduYWwgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLl9jbG9zZVNpZ25hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgdG8gY2xvc2UgdGhlIHdpbmRvdyB3aGVuIHRoZSBvdXRzaWRlIGFyZWEgb2YgdGhlIGRpYWxvZyBvciBjbG9zZSBidXR0b24gaXMgY2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlIEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX29uQ2xpY2tfZGlhbG9nOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKC9jbG9zZS8udGVzdChlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpKSB8fCB0aGlzLmNvbnRleHQuZGlhbG9nLl9jbG9zZVNpZ25hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBEaWFsb2cgcGx1Z2luXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBraW5kIERpYWxvZyBwbHVnaW4gbmFtZVxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHVwZGF0ZSBXaGV0aGVyIGl0IHdpbGwgb3BlbiBmb3IgdXBkYXRlICgnaW1hZ2UnID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSlcbiAgICAgICAgICovXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uIChraW5kLCB1cGRhdGUpICB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RhbEZvcm0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnBsdWdpbnMuZGlhbG9nLl9iaW5kQ2xvc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvMjcvLnRlc3QoZS5rZXlDb2RlKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPSB1cGRhdGU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9wdXBEaXNwbGF5ID09PSAnZnVsbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLm1vZGFsQXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWxBcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5raW5kID0ga2luZDtcbiAgICAgICAgICAgIHRoaXMubW9kYWxGb3JtID0gdGhpcy5jb250ZXh0W2tpbmRdLm1vZGFsO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNFbGVtZW50ID0gdGhpcy5jb250ZXh0W2tpbmRdLmZvY3VzRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBsdWdpbnNba2luZF0ub24gPT09ICdmdW5jdGlvbicpIHRoaXMucGx1Z2luc1traW5kXS5vbi5jYWxsKHRoaXMsIHVwZGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWxBcmVhLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5iYWNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5tb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIHRoaXMubW9kYWxGb3JtLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgICBpZiAoZm9jdXNFbGVtZW50KSBmb2N1c0VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfYmluZENsb3NlOiBudWxsLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDbG9zZSBhIERpYWxvZyBwbHVnaW5cbiAgICAgICAgICogVGhlIHBsdWdpbidzIFwiaW5pdFwiIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGx1Z2lucy5kaWFsb2cuX2JpbmRDbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5fYmluZENsb3NlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qga2luZCA9IHRoaXMuY29udGV4dC5kaWFsb2cua2luZDtcbiAgICAgICAgICAgIHRoaXMubW9kYWxGb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLmJhY2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cubW9kYWxBcmVhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucGx1Z2luc1traW5kXS5pbml0ID09PSAnZnVuY3Rpb24nKSB0aGlzLnBsdWdpbnNba2luZF0uaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy5raW5kID0gJyc7XG4gICAgICAgICAgICB0aGlzLm1vZGFsRm9ybSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBub0dsb2JhbCA9PT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIXdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUykge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1NVTkVESVRPUl9NT0RVTEVTJywge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuU1VORURJVE9SX01PRFVMRVMsICdkaWFsb2cnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBkaWFsb2dcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpYWxvZztcbn0pKTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG4gICAgICAgICAgICBmYWN0b3J5KGdsb2JhbCwgdHJ1ZSkgOlxuICAgICAgICAgICAgZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXcuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTVU5FRElUT1JfTU9EVUxFUyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkodyk7XG4gICAgICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZhY3RvcnkoZ2xvYmFsKTtcbiAgICB9XG59KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24gKHdpbmRvdywgbm9HbG9iYWwpIHtcbiAgICBjb25zdCBmaWxlQnJvd3NlciA9IHtcbiAgICAgICAgbmFtZTogJ2ZpbGVCcm93c2VyJyxcbiAgICAgICAgX3htbEh0dHA6IG51bGwsXG4gICAgICAgIF9sb2FkaW5nOiBudWxsLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICAgICAqL1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICAgICAgY29udGV4dC5maWxlQnJvd3NlciA9IHtcbiAgICAgICAgICAgICAgICBfY2xvc2VTaWduYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFyZWE6IG51bGwsXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBudWxsLFxuICAgICAgICAgICAgICAgIHRhZ0FyZWE6IG51bGwsXG4gICAgICAgICAgICAgICAgYm9keTogbnVsbCxcbiAgICAgICAgICAgICAgICBsaXN0OiBudWxsLFxuICAgICAgICAgICAgICAgIHRhZ0VsZW1lbnRzOiBudWxsLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9ySGFuZGxlcjogbnVsbCxcbiAgICAgICAgICAgICAgICBjb250ZXh0UGx1Z2luOiAnJyxcbiAgICAgICAgICAgICAgICBjb2x1bW5TaXplOiA0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvKiogZmlsZUJyb3dzZXIgKi9cbiAgICAgICAgICAgIGxldCBicm93c2VyX2RpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIGJyb3dzZXJfZGl2LmNsYXNzTmFtZSA9ICdzZS1maWxlLWJyb3dzZXIgc3VuLWVkaXRvci1jb21tb24nO1xuXG4gICAgICAgICAgICBsZXQgYmFjayA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgICAgIGJhY2suY2xhc3NOYW1lID0gJ3NlLWZpbGUtYnJvd3Nlci1iYWNrJztcblxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgICAgICBjb250ZW50LmNsYXNzTmFtZSA9ICdzZS1maWxlLWJyb3dzZXItaW5uZXInO1xuICAgICAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSB0aGlzLnNldF9icm93c2VyKGNvcmUpO1xuXG4gICAgICAgICAgICBicm93c2VyX2Rpdi5hcHBlbmRDaGlsZChiYWNrKTtcbiAgICAgICAgICAgIGJyb3dzZXJfZGl2LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZyA9IGJyb3dzZXJfZGl2LnF1ZXJ5U2VsZWN0b3IoJy5zZS1sb2FkaW5nLWJveCcpO1xuXG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLmFyZWEgPSBicm93c2VyX2RpdjtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIuaGVhZGVyID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcuc2UtZmlsZS1icm93c2VyLWhlYWRlcicpO1xuICAgICAgICAgICAgY29udGV4dC5maWxlQnJvd3Nlci50aXRsZUFyZWEgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZS1maWxlLWJyb3dzZXItdGl0bGUnKTtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIudGFnQXJlYSA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcignLnNlLWZpbGUtYnJvd3Nlci10YWdzJyk7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGVCcm93c2VyLmJvZHkgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZS1maWxlLWJyb3dzZXItYm9keScpO1xuICAgICAgICAgICAgY29udGV4dC5maWxlQnJvd3Nlci5saXN0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcuc2UtZmlsZS1icm93c2VyLWxpc3QnKTtcblxuICAgICAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIudGFnQXJlYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja1RhZy5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsZUJyb3dzZXIubGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja0ZpbGUuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duX2Jyb3dzZXIuYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja19icm93c2VyLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZWxhdGl2ZS5hcHBlbmRDaGlsZChicm93c2VyX2Rpdik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGJyb3dzZXJfZGl2ID0gbnVsbCwgYmFjayA9IG51bGwsIGNvbnRlbnQgPSBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldF9icm93c2VyOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcblxuICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1icm93c2VyLWNvbnRlbnRcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWJyb3dzZXItaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiY2xvc2VcIiBjbGFzcz1cInNlLWJ0biBzZS1maWxlLWJyb3dzZXItY2xvc2VcIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guY2xvc2UgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JlLmljb25zLmNhbmNlbCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1maWxlLWJyb3dzZXItdGl0bGVcIj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWZpbGUtYnJvd3Nlci10YWdzXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWJyb3dzZXItYm9keVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1sb2FkaW5nLWJveCBzdW4tZWRpdG9yLWNvbW1vblwiPjxkaXYgY2xhc3M9XCJzZS1sb2FkaW5nLWVmZmVjdFwiPjwvZGl2PjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWJyb3dzZXItbGlzdFwiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFdmVudCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBjbG9zaW5nIHRoZSBicm93c2VyXG4gICAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIF9vbk1vdXNlRG93bl9icm93c2VyOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKC9zZS1maWxlLWJyb3dzZXItaW5uZXIvLnRlc3QoZS50YXJnZXQuY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWxlQnJvd3Nlci5fY2xvc2VTaWduYWwgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXIuX2Nsb3NlU2lnbmFsID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFdmVudCB0byBjbG9zZSB0aGUgd2luZG93IHdoZW4gdGhlIG91dHNpZGUgYXJlYSBvZiB0aGUgYnJvd3NlciBvciBjbG9zZSBidXR0b24gaXMgY2xpY2tcbiAgICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlIEV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgX29uQ2xpY2tfYnJvd3NlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmICgvY2xvc2UvLnRlc3QoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKSkgfHwgdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyLl9jbG9zZVNpZ25hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiBhIGZpbGUgYnJvd3NlciBwbHVnaW5cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHBsdWdpbk5hbWUgUGx1Z2luIG5hbWUgdXNpbmcgdGhlIGZpbGUgYnJvd3NlclxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHNlbGVjdG9ySGFuZGxlciBXaGVuIHRoZSBmdW5jdGlvbiBjb21lcyBhcyBhbiBhcmd1bWVudCB2YWx1ZSwgaXQgc3Vic3RpdHV0ZXMgXCJjb250ZXh0LnNlbGVjdG9ySGFuZGxlclwiLlxuICAgICAgICAgKi9cbiAgICAgICAgb3BlbjogZnVuY3Rpb24gKHBsdWdpbk5hbWUsIHNlbGVjdG9ySGFuZGxlcikgIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuX2JpbmRDbG9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5fYmluZENsb3NlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuX2JpbmRDbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5fYmluZENsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIS8yNy8udGVzdChlLmtleUNvZGUpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9kLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuX2JpbmRDbG9zZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyQ29udGV4dCA9IHRoaXMuY29udGV4dC5maWxlQnJvd3NlcjtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5zZWxlY3RvckhhbmRsZXIgPSBzZWxlY3RvckhhbmRsZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbkNvbnRleHQgPSB0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV07XG4gICAgICAgICAgICBjb25zdCBsaXN0Q2xhc3NOYW1lID0gcGx1Z2luQ29udGV4dC5saXN0Q2xhc3M7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXRpbC5oYXNDbGFzcyhmaWxlQnJvd3NlckNvbnRleHQubGlzdCwgbGlzdENsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQubGlzdC5jbGFzc05hbWUgPSAnc2UtZmlsZS1icm93c2VyLWxpc3QgJyArIGxpc3RDbGFzc05hbWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucG9wdXBEaXNwbGF5ID09PSAnZnVsbCcpIHtcbiAgICAgICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuYXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5hcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LnRpdGxlQXJlYS50ZXh0Q29udGVudCA9IHBsdWdpbkNvbnRleHQudGl0bGU7XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQuYXJlYS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLl9kcmF3RmlsZUxpc3QuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV0udXJsLCB0aGlzLmNvbnRleHRbcGx1Z2luTmFtZV0uaGVhZGVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfYmluZENsb3NlOiBudWxsLFxuICAgICAgICBcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDbG9zZSBhIGZpbGVCcm93c2VyIHBsdWdpblxuICAgICAgICAgKiBUaGUgcGx1Z2luJ3MgXCJpbml0XCIgbWV0aG9kIGlzIGNhbGxlZC5cbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQnJvd3NlclBsdWdpbiA9IHRoaXMucGx1Z2lucy5maWxlQnJvd3NlcjtcblxuICAgICAgICAgICAgaWYgKGZpbGVCcm93c2VyUGx1Z2luLl94bWxIdHRwKSB7XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJQbHVnaW4uX3htbEh0dHAuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpbGVCcm93c2VyUGx1Z2luLl9iaW5kQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmaWxlQnJvd3NlclBsdWdpbi5fYmluZENsb3NlKTtcbiAgICAgICAgICAgICAgICBmaWxlQnJvd3NlclBsdWdpbi5fYmluZENsb3NlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZUJyb3dzZXJDb250ZXh0ID0gdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyO1xuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LmFyZWEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5zZWxlY3RvckhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0LnNlbGVjdGVkVGFncyA9IFtdO1xuICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lml0ZW1zID0gW107XG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQubGlzdC5pbm5lckhUTUwgPSBmaWxlQnJvd3NlckNvbnRleHQudGFnQXJlYS5pbm5lckhUTUwgPSBmaWxlQnJvd3NlckNvbnRleHQudGl0bGVBcmVhLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wbHVnaW5zW2ZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luXS5pbml0ID09PSAnZnVuY3Rpb24nKSB0aGlzLnBsdWdpbnNbZmlsZUJyb3dzZXJDb250ZXh0LmNvbnRleHRQbHVnaW5dLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luID0gJyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGZpbGUgYnJvd3NlciBsb2FkaW5nIGJveFxuICAgICAgICAgKi9cbiAgICAgICAgc2hvd0Jyb3dzZXJMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2xvc2UgZmlsZSBicm93c2VyIGxvYWRpbmcgYm94XG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZUJyb3dzZXJMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2RyYXdGaWxlTGlzdDogZnVuY3Rpb24gKHVybCwgYnJvd3NlckhlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgZmlsZUJyb3dzZXJQbHVnaW4gPSB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IHhtbEh0dHAgPSBmaWxlQnJvd3NlclBsdWdpbi5feG1sSHR0cCA9IHRoaXMudXRpbC5nZXRYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeG1sSHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmaWxlQnJvd3NlclBsdWdpbi5fY2FsbEJhY2tHZXQuYmluZCh0aGlzLCB4bWxIdHRwKTtcbiAgICAgICAgICAgIHhtbEh0dHAub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgICAgIGlmKGJyb3dzZXJIZWFkZXIgIT09IG51bGwgJiYgdHlwZW9mIGJyb3dzZXJIZWFkZXIgPT09ICdvYmplY3QnICYmIHRoaXMuX3cuT2JqZWN0LmtleXMoYnJvd3NlckhlYWRlcikubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgZm9yKGxldCBrZXkgaW4gYnJvd3NlckhlYWRlcil7XG4gICAgICAgICAgICAgICAgICAgIHhtbEh0dHAuc2V0UmVxdWVzdEhlYWRlcihrZXksIGJyb3dzZXJIZWFkZXJba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeG1sSHR0cC5zZW5kKG51bGwpO1xuXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuc2hvd0Jyb3dzZXJMb2FkaW5nKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2NhbGxCYWNrR2V0OiBmdW5jdGlvbiAoeG1sSHR0cCkge1xuICAgICAgICAgICAgaWYgKHhtbEh0dHAucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5feG1sSHR0cCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHhtbEh0dHAuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5fZHJhd0xpc3RJdGVtLmNhbGwodGhpcywgSlNPTi5wYXJzZSh4bWxIdHRwLnJlc3BvbnNlVGV4dCkucmVzdWx0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuZmlsZUJyb3dzZXIuZHJhd0xpc3QuZmFpbF0gY2F1c2UgOiBcIicgKyBlLm1lc3NhZ2UgKyAnXCInKTtcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5jbG9zZUJyb3dzZXJMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXIuYm9keS5zdHlsZS5tYXhIZWlnaHQgPSAodGhpcy5fdy5pbm5lckhlaWdodCAtIHRoaXMuY29udGV4dC5maWxlQnJvd3Nlci5oZWFkZXIub2Zmc2V0SGVpZ2h0IC0gNTApICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGV4Y2VwdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZUJyb3dzZXIuY2xvc2VCcm93c2VyTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeG1sSHR0cC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9ICF4bWxIdHRwLnJlc3BvbnNlVGV4dCA/IHhtbEh0dHAgOiBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9ICdbU1VORURJVE9SLmZpbGVCcm93c2VyLmdldC5zZXJ2ZXJFeGNlcHRpb25dIHN0YXR1czogJyArIHhtbEh0dHAuc3RhdHVzICsgJywgcmVzcG9uc2U6ICcgKyAocmVzLmVycm9yTWVzc2FnZSB8fCB4bWxIdHRwLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9kcmF3TGlzdEl0ZW06IGZ1bmN0aW9uIChpdGVtcywgdXBkYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQnJvd3NlckNvbnRleHQgPSB0aGlzLmNvbnRleHQuZmlsZUJyb3dzZXI7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5Db250ZXh0ID0gdGhpcy5jb250ZXh0W2ZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luXTtcblxuICAgICAgICAgICAgY29uc3QgX3RhZ3MgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtblNpemUgPSBwbHVnaW5Db250ZXh0LmNvbHVtblNpemUgfHwgZmlsZUJyb3dzZXJDb250ZXh0LmNvbHVtblNpemU7XG4gICAgICAgICAgICBjb25zdCBzcGxpdFNpemUgPSBjb2x1bW5TaXplIDw9IDEgPyAxIDogKE1hdGgucm91bmQobGVuL2NvbHVtblNpemUpIHx8IDEpO1xuICAgICAgICAgICAgY29uc3QgZHJhd0l0ZW1IYW5kbGVyID0gcGx1Z2luQ29udGV4dC5pdGVtVGVtcGxhdGVIYW5kbGVyO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdGFnc0hUTUwgPSAnJztcbiAgICAgICAgICAgIGxldCBsaXN0SFRNTCA9ICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1pdGVtLWNvbHVtblwiPic7XG4gICAgICAgICAgICBsZXQgY29sdW1ucyA9IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaXRlbSwgdGFnczsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgICAgIHRhZ3MgPSAhaXRlbS50YWcgPyBbXSA6IHR5cGVvZiBpdGVtLnRhZyA9PT0gJ3N0cmluZycgPyBpdGVtLnRhZy5zcGxpdCgnLCcpIDogaXRlbS50YWc7XG4gICAgICAgICAgICAgICAgdGFncyA9IGl0ZW0udGFnID0gdGFncy5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYudHJpbSgpOyB9KTtcbiAgICAgICAgICAgICAgICBsaXN0SFRNTCArPSBkcmF3SXRlbUhhbmRsZXIoaXRlbSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSAlIHNwbGl0U2l6ZSA9PT0gMCAmJiBjb2x1bW5zIDwgY29sdW1uU2l6ZSAmJiAoaSArIDEpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMrKztcbiAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwgKz0gJzwvZGl2PjxkaXYgY2xhc3M9XCJzZS1maWxlLWl0ZW0tY29sdW1uXCI+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZSAmJiB0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDAsIHRMZW4gPSB0YWdzLmxlbmd0aCwgdGFnOyB0IDwgdExlbjsgdCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSB0YWdzW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyAmJiBfdGFncy5pbmRleE9mKHRhZykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NIVE1MICs9ICc8YSB0aXRsZT1cIicgKyB0YWcgKyAnXCI+JyArIHRhZyArICc8L2E+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3RIVE1MICs9ICc8L2Rpdj4nO1xuXG4gICAgICAgICAgICBmaWxlQnJvd3NlckNvbnRleHQubGlzdC5pbm5lckhUTUwgPSBsaXN0SFRNTDtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC50YWdBcmVhLmlubmVySFRNTCA9IHRhZ3NIVE1MO1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC50YWdFbGVtZW50cyA9IGZpbGVCcm93c2VyQ29udGV4dC50YWdBcmVhLnF1ZXJ5U2VsZWN0b3JBbGwoJ0EnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkNsaWNrVGFnOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXRpbC5pc0FuY2hvcih0YXJnZXQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSB0YXJnZXQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBmaWxlQnJvd3NlclBsdWdpbiA9IHRoaXMucGx1Z2lucy5maWxlQnJvd3NlcjtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVCcm93c2VyQ29udGV4dCA9IHRoaXMuY29udGV4dC5maWxlQnJvd3NlcjtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0VGFnID0gZmlsZUJyb3dzZXJDb250ZXh0LnRhZ0FyZWEucXVlcnlTZWxlY3RvcignYVt0aXRsZT1cIicgKyB0YWdOYW1lICsgJ1wiXScpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdzID0gZmlsZUJyb3dzZXJDb250ZXh0LnNlbGVjdGVkVGFncztcbiAgICAgICAgICAgIGNvbnN0IHNUYWdJbmRleCA9IHNlbGVjdGVkVGFncy5pbmRleE9mKHRhZ05hbWUpO1xuXG4gICAgICAgICAgICBpZiAoc1RhZ0luZGV4ID4gLTEpe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFncy5zcGxpY2Uoc1RhZ0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlQ2xhc3Moc2VsZWN0VGFnLCAnb24nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzLnB1c2godGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHNlbGVjdFRhZywgJ29uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbGVCcm93c2VyUGx1Z2luLl9kcmF3TGlzdEl0ZW0uY2FsbCh0aGlzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGFncy5sZW5ndGggPT09IDAgP1xuICAgICAgICAgICAgICAgIGZpbGVCcm93c2VyQ29udGV4dC5pdGVtcyA6XG4gICAgICAgICAgICAgICAgZmlsZUJyb3dzZXJDb250ZXh0Lml0ZW1zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50YWcuc29tZShmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRUYWdzLmluZGV4T2YodGFnKSA+IC0xO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9uQ2xpY2tGaWxlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgY29uc3QgZmlsZUJyb3dzZXJDb250ZXh0ID0gdGhpcy5jb250ZXh0LmZpbGVCcm93c2VyO1xuICAgICAgICAgICAgY29uc3QgbGlzdEVsID0gZmlsZUJyb3dzZXJDb250ZXh0Lmxpc3Q7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgY29tbWFuZCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGxpc3RFbCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB3aGlsZSAobGlzdEVsICE9PSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGZpbGVCcm93c2VyQ29udGV4dC5zZWxlY3RvckhhbmRsZXIgfHwgdGhpcy5jb250ZXh0W2ZpbGVCcm93c2VyQ29udGV4dC5jb250ZXh0UGx1Z2luXS5zZWxlY3RvckhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVCcm93c2VyLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBoYW5kbGVyKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBub0dsb2JhbCA9PT0gdHlwZW9mIHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIXdpbmRvdy5TVU5FRElUT1JfTU9EVUxFUykge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1NVTkVESVRPUl9NT0RVTEVTJywge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuU1VORURJVE9SX01PRFVMRVMsICdmaWxlQnJvd3NlcicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGZpbGVCcm93c2VyXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWxlQnJvd3Nlcjtcbn0pKTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG4gICAgICAgICAgICBmYWN0b3J5KGdsb2JhbCwgdHJ1ZSkgOlxuICAgICAgICAgICAgZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXcuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTVU5FRElUT1JfTEFORyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkodyk7XG4gICAgICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZhY3RvcnkoZ2xvYmFsKTtcbiAgICB9XG59KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24gKHdpbmRvdywgbm9HbG9iYWwpIHtcbiAgICBjb25zdCBsYW5nID0ge1xuICAgICAgICBjb2RlOiAnZW4nLFxuICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiAnRGVmYXVsdCcsXG4gICAgICAgICAgICBzYXZlOiAnU2F2ZScsXG4gICAgICAgICAgICBmb250OiAnRm9udCcsXG4gICAgICAgICAgICBmb3JtYXRzOiAnRm9ybWF0cycsXG4gICAgICAgICAgICBmb250U2l6ZTogJ1NpemUnLFxuICAgICAgICAgICAgYm9sZDogJ0JvbGQnLFxuICAgICAgICAgICAgdW5kZXJsaW5lOiAnVW5kZXJsaW5lJyxcbiAgICAgICAgICAgIGl0YWxpYzogJ0l0YWxpYycsXG4gICAgICAgICAgICBzdHJpa2U6ICdTdHJpa2UnLFxuICAgICAgICAgICAgc3Vic2NyaXB0OiAnU3Vic2NyaXB0JyxcbiAgICAgICAgICAgIHN1cGVyc2NyaXB0OiAnU3VwZXJzY3JpcHQnLFxuICAgICAgICAgICAgcmVtb3ZlRm9ybWF0OiAnUmVtb3ZlIEZvcm1hdCcsXG4gICAgICAgICAgICBmb250Q29sb3I6ICdGb250IENvbG9yJyxcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yOiAnSGlnaGxpZ2h0IENvbG9yJyxcbiAgICAgICAgICAgIGluZGVudDogJ0luZGVudCcsXG4gICAgICAgICAgICBvdXRkZW50OiAnT3V0ZGVudCcsXG4gICAgICAgICAgICBhbGlnbjogJ0FsaWduJyxcbiAgICAgICAgICAgIGFsaWduTGVmdDogJ0FsaWduIGxlZnQnLFxuICAgICAgICAgICAgYWxpZ25SaWdodDogJ0FsaWduIHJpZ2h0JyxcbiAgICAgICAgICAgIGFsaWduQ2VudGVyOiAnQWxpZ24gY2VudGVyJyxcbiAgICAgICAgICAgIGFsaWduSnVzdGlmeTogJ0FsaWduIGp1c3RpZnknLFxuICAgICAgICAgICAgbGlzdDogJ0xpc3QnLFxuICAgICAgICAgICAgb3JkZXJMaXN0OiAnT3JkZXJlZCBsaXN0JyxcbiAgICAgICAgICAgIHVub3JkZXJMaXN0OiAnVW5vcmRlcmVkIGxpc3QnLFxuICAgICAgICAgICAgaG9yaXpvbnRhbFJ1bGU6ICdIb3Jpem9udGFsIGxpbmUnLFxuICAgICAgICAgICAgaHJfc29saWQ6ICdTb2xpZCcsXG4gICAgICAgICAgICBocl9kb3R0ZWQ6ICdEb3R0ZWQnLFxuICAgICAgICAgICAgaHJfZGFzaGVkOiAnRGFzaGVkJyxcbiAgICAgICAgICAgIHRhYmxlOiAnVGFibGUnLFxuICAgICAgICAgICAgbGluazogJ0xpbmsnLFxuICAgICAgICAgICAgbWF0aDogJ01hdGgnLFxuICAgICAgICAgICAgaW1hZ2U6ICdJbWFnZScsXG4gICAgICAgICAgICB2aWRlbzogJ1ZpZGVvJyxcbiAgICAgICAgICAgIGF1ZGlvOiAnQXVkaW8nLFxuICAgICAgICAgICAgZnVsbFNjcmVlbjogJ0Z1bGwgc2NyZWVuJyxcbiAgICAgICAgICAgIHNob3dCbG9ja3M6ICdTaG93IGJsb2NrcycsXG4gICAgICAgICAgICBjb2RlVmlldzogJ0NvZGUgdmlldycsXG4gICAgICAgICAgICB1bmRvOiAnVW5kbycsXG4gICAgICAgICAgICByZWRvOiAnUmVkbycsXG4gICAgICAgICAgICBwcmV2aWV3OiAnUHJldmlldycsXG4gICAgICAgICAgICBwcmludDogJ3ByaW50JyxcbiAgICAgICAgICAgIHRhZ19wOiAnUGFyYWdyYXBoJyxcbiAgICAgICAgICAgIHRhZ19kaXY6ICdOb3JtYWwgKERJViknLFxuICAgICAgICAgICAgdGFnX2g6ICdIZWFkZXInLFxuICAgICAgICAgICAgdGFnX2Jsb2NrcXVvdGU6ICdRdW90ZScsXG4gICAgICAgICAgICB0YWdfcHJlOiAnQ29kZScsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ1RlbXBsYXRlJyxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6ICdMaW5lIGhlaWdodCcsXG4gICAgICAgICAgICBwYXJhZ3JhcGhTdHlsZTogJ1BhcmFncmFwaCBzdHlsZScsXG4gICAgICAgICAgICB0ZXh0U3R5bGU6ICdUZXh0IHN0eWxlJyxcbiAgICAgICAgICAgIGltYWdlR2FsbGVyeTogJ0ltYWdlIGdhbGxlcnknLFxuICAgICAgICAgICAgbWVudGlvbjogJ01lbnRpb24nXG4gICAgICAgIH0sXG4gICAgICAgIGRpYWxvZ0JveDoge1xuICAgICAgICAgICAgbGlua0JveDoge1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnSW5zZXJ0IExpbmsnLFxuICAgICAgICAgICAgICAgIHVybDogJ1VSTCB0byBsaW5rJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVGV4dCB0byBkaXNwbGF5JyxcbiAgICAgICAgICAgICAgICBuZXdXaW5kb3dDaGVjazogJ09wZW4gaW4gbmV3IHdpbmRvdycsXG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rQ2hlY2s6ICdEb3dubG9hZCBsaW5rJyxcbiAgICAgICAgICAgICAgICBib29rbWFyazogJ0Jvb2ttYXJrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hdGhCb3g6IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ01hdGgnLFxuICAgICAgICAgICAgICAgIGlucHV0TGFiZWw6ICdNYXRoZW1hdGljYWwgTm90YXRpb24nLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplTGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgICAgICAgIHByZXZpZXdMYWJlbDogJ1ByZXZpZXcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1hZ2VCb3g6IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luc2VydCBpbWFnZScsXG4gICAgICAgICAgICAgICAgZmlsZTogJ1NlbGVjdCBmcm9tIGZpbGVzJyxcbiAgICAgICAgICAgICAgICB1cmw6ICdJbWFnZSBVUkwnLFxuICAgICAgICAgICAgICAgIGFsdFRleHQ6ICdBbHRlcm5hdGl2ZSB0ZXh0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvQm94OiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgVmlkZW8nLFxuICAgICAgICAgICAgICAgIGZpbGU6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG4gICAgICAgICAgICAgICAgdXJsOiAnTWVkaWEgZW1iZWQgVVJMLCBZb3VUdWJlL1ZpbWVvJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1ZGlvQm94OiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbnNlcnQgQXVkaW8nLFxuICAgICAgICAgICAgICAgIGZpbGU6ICdTZWxlY3QgZnJvbSBmaWxlcycsXG4gICAgICAgICAgICAgICAgdXJsOiAnQXVkaW8gVVJMJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJyb3dzZXI6IHtcbiAgICAgICAgICAgICAgICB0YWdzOiAnVGFncycsXG4gICAgICAgICAgICAgICAgc2VhcmNoOiAnU2VhcmNoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYXB0aW9uOiAnSW5zZXJ0IGRlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgIGNsb3NlOiAnQ2xvc2UnLFxuICAgICAgICAgICAgc3VibWl0QnV0dG9uOiAnU3VibWl0JyxcbiAgICAgICAgICAgIHJldmVydEJ1dHRvbjogJ1JldmVydCcsXG4gICAgICAgICAgICBwcm9wb3J0aW9uOiAnQ29uc3RyYWluIHByb3BvcnRpb25zJyxcbiAgICAgICAgICAgIGJhc2ljOiAnQmFzaWMnLFxuICAgICAgICAgICAgbGVmdDogJ0xlZnQnLFxuICAgICAgICAgICAgcmlnaHQ6ICdSaWdodCcsXG4gICAgICAgICAgICBjZW50ZXI6ICdDZW50ZXInLFxuICAgICAgICAgICAgd2lkdGg6ICdXaWR0aCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdIZWlnaHQnLFxuICAgICAgICAgICAgc2l6ZTogJ1NpemUnLFxuICAgICAgICAgICAgcmF0aW86ICdSYXRpbydcbiAgICAgICAgfSxcbiAgICAgICAgY29udHJvbGxlcjoge1xuICAgICAgICAgICAgZWRpdDogJ0VkaXQnLFxuICAgICAgICAgICAgdW5saW5rOiAnVW5saW5rJyxcbiAgICAgICAgICAgIHJlbW92ZTogJ1JlbW92ZScsXG4gICAgICAgICAgICBpbnNlcnRSb3dBYm92ZTogJ0luc2VydCByb3cgYWJvdmUnLFxuICAgICAgICAgICAgaW5zZXJ0Um93QmVsb3c6ICdJbnNlcnQgcm93IGJlbG93JyxcbiAgICAgICAgICAgIGRlbGV0ZVJvdzogJ0RlbGV0ZSByb3cnLFxuICAgICAgICAgICAgaW5zZXJ0Q29sdW1uQmVmb3JlOiAnSW5zZXJ0IGNvbHVtbiBiZWZvcmUnLFxuICAgICAgICAgICAgaW5zZXJ0Q29sdW1uQWZ0ZXI6ICdJbnNlcnQgY29sdW1uIGFmdGVyJyxcbiAgICAgICAgICAgIGRlbGV0ZUNvbHVtbjogJ0RlbGV0ZSBjb2x1bW4nLFxuICAgICAgICAgICAgZml4ZWRDb2x1bW5XaWR0aDogJ0ZpeGVkIGNvbHVtbiB3aWR0aCcsXG4gICAgICAgICAgICByZXNpemUxMDA6ICdSZXNpemUgMTAwJScsXG4gICAgICAgICAgICByZXNpemU3NTogJ1Jlc2l6ZSA3NSUnLFxuICAgICAgICAgICAgcmVzaXplNTA6ICdSZXNpemUgNTAlJyxcbiAgICAgICAgICAgIHJlc2l6ZTI1OiAnUmVzaXplIDI1JScsXG4gICAgICAgICAgICBhdXRvU2l6ZTogJ0F1dG8gc2l6ZScsXG4gICAgICAgICAgICBtaXJyb3JIb3Jpem9udGFsOiAnTWlycm9yLCBIb3Jpem9udGFsJyxcbiAgICAgICAgICAgIG1pcnJvclZlcnRpY2FsOiAnTWlycm9yLCBWZXJ0aWNhbCcsXG4gICAgICAgICAgICByb3RhdGVMZWZ0OiAnUm90YXRlIGxlZnQnLFxuICAgICAgICAgICAgcm90YXRlUmlnaHQ6ICdSb3RhdGUgcmlnaHQnLFxuICAgICAgICAgICAgbWF4U2l6ZTogJ01heCBzaXplJyxcbiAgICAgICAgICAgIG1pblNpemU6ICdNaW4gc2l6ZScsXG4gICAgICAgICAgICB0YWJsZUhlYWRlcjogJ1RhYmxlIGhlYWRlcicsXG4gICAgICAgICAgICBtZXJnZUNlbGxzOiAnTWVyZ2UgY2VsbHMnLFxuICAgICAgICAgICAgc3BsaXRDZWxsczogJ1NwbGl0IENlbGxzJyxcbiAgICAgICAgICAgIEhvcml6b250YWxTcGxpdDogJ0hvcml6b250YWwgc3BsaXQnLFxuICAgICAgICAgICAgVmVydGljYWxTcGxpdDogJ1ZlcnRpY2FsIHNwbGl0J1xuICAgICAgICB9LFxuICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICBzcGFjZWQ6ICdTcGFjZWQnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6ICdCb3JkZXJlZCcsXG4gICAgICAgICAgICBuZW9uOiAnTmVvbicsXG4gICAgICAgICAgICB0cmFuc2x1Y2VudDogJ1RyYW5zbHVjZW50JyxcbiAgICAgICAgICAgIHNoYWRvdzogJ1NoYWRvdycsXG4gICAgICAgICAgICBjb2RlOiAnQ29kZSdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIG5vR2xvYmFsID09PSB0eXBlb2YgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghd2luZG93LlNVTkVESVRPUl9MQU5HKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnU1VORURJVE9SX0xBTkcnLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TVU5FRElUT1JfTEFORywgJ2VuJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGxhbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmc7XG59KSk7IiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxOCBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdjb2xvclBpY2tlcicsXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXHJcbiAgICAgKi9cclxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xyXG4gICAgICAgIGNvbnRleHQuY29sb3JQaWNrZXIgPSB7XHJcbiAgICAgICAgICAgIGNvbG9yTGlzdEhUTUw6ICcnLFxyXG4gICAgICAgICAgICBfY29sb3JJbnB1dDogJycsXHJcbiAgICAgICAgICAgIF9kZWZhdWx0Q29sb3I6ICcjMDAwJyxcclxuICAgICAgICAgICAgX3N0eWxlUHJvcGVydHk6ICdjb2xvcicsXHJcbiAgICAgICAgICAgIF9jdXJyZW50Q29sb3I6ICcnLFxyXG4gICAgICAgICAgICBfY29sb3JMaXN0OiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xyXG4gICAgICAgIGNvbnRleHQuY29sb3JQaWNrZXIuY29sb3JMaXN0SFRNTCA9IHRoaXMuY3JlYXRlQ29sb3JMaXN0KGNvcmUsIHRoaXMuX21ha2VDb2xvckxpc3QpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgY29sb3IgbGlzdFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYWtlQ29sb3IgdGhpcy5fbWFrZUNvbG9yTGlzdFxyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSFRNTCBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ29sb3JMaXN0OiBmdW5jdGlvbiAoY29yZSwgbWFrZUNvbG9yKSB7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgY29sb3JMaXN0ID0gIW9wdGlvbi5jb2xvckxpc3QgfHwgb3B0aW9uLmNvbG9yTGlzdC5sZW5ndGggPT09IDAgP1xyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAnI2ZmMDAwMCcsICcjZmY1ZTAwJywgJyNmZmU0MDAnLCAnI2FiZjIwMCcsICcjMDBkOGZmJywgJyMwMDU1ZmYnLCAnIzY2MDBmZicsICcjZmYwMGRkJywgJyMwMDAwMDAnLFxyXG4gICAgICAgICAgICAgICAgJyNmZmQ4ZDgnLCAnI2ZhZTBkNCcsICcjZmFmNGMwJywgJyNlNGY3YmEnLCAnI2Q0ZjRmYScsICcjZDllNWZmJywgJyNlOGQ5ZmYnLCAnI2ZmZDlmYScsICcjZjFmMWYxJyxcclxuICAgICAgICAgICAgICAgICcjZmZhN2E3JywgJyNmZmMxOWUnLCAnI2ZhZWQ3ZCcsICcjY2VmMjc5JywgJyNiMmViZjQnLCAnI2IyY2NmZicsICcjZDFiMmZmJywgJyNmZmIyZjUnLCAnI2JkYmRiZCcsXHJcbiAgICAgICAgICAgICAgICAnI2YxNWY1ZicsICcjZjI5NjYxJywgJyNlNWQ4NWMnLCAnI2JjZTU1YycsICcjNWNkMWU1JywgJyM2Njk5ZmYnLCAnI2EzNjZmZicsICcjZjI2MWRmJywgJyM4YzhjOGMnLFxyXG4gICAgICAgICAgICAgICAgJyM5ODAwMDAnLCAnIzk5MzgwMCcsICcjOTk4YTAwJywgJyM2Yjk5MDAnLCAnIzAwODI5OScsICcjMDAzMzk5JywgJyMzZDAwOTknLCAnIzk5MDA4NScsICcjMzUzNTM1JyxcclxuICAgICAgICAgICAgICAgICcjNjcwMDAwJywgJyM2NjI1MDAnLCAnIzY2NWMwMCcsICcjNDc2NjAwJywgJyMwMDU3NjYnLCAnIzAwMjI2NicsICcjMjkwMDY2JywgJyM2NjAwNTgnLCAnIzIyMjIyMidcclxuICAgICAgICAgICAgXSA6IG9wdGlvbi5jb2xvckxpc3Q7XHJcblxyXG4gICAgICAgIGxldCBjb2xvckFyciA9IFtdO1xyXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbG9yTGlzdC5sZW5ndGgsIGNvbG9yOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JMaXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2xvcikgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3JBcnIucHVzaChjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb2xvckFyci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdCArPSAnPGRpdiBjbGFzcz1cInNlLXNlbGVjdG9yLWNvbG9yXCI+JyArIG1ha2VDb2xvcihjb2xvckFycikgKyAnPC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICBjb2xvckFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0ICs9ICc8ZGl2IGNsYXNzPVwic2Utc2VsZWN0b3ItY29sb3JcIj4nICsgbWFrZUNvbG9yKGNvbG9yKSArICc8L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpc3QgKz0gJycgK1xyXG4gICAgICAgICAgICAnPGZvcm0gY2xhc3M9XCJzZS1mb3JtLWdyb3VwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiOVwiIGNsYXNzPVwiX3NlX2NvbG9yX3BpY2tlcl9pbnB1dCBzZS1jb2xvci1pbnB1dFwiLz4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNlLWJ0bi1wcmltYXJ5IF9zZV9jb2xvcl9waWNrZXJfc3VibWl0XCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2hlY2tlZCArXHJcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gX3NlX2NvbG9yX3BpY2tlcl9yZW1vdmVcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIucmVtb3ZlRm9ybWF0ICsgJ1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuZXJhc2UgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAnPC9mb3JtPicgK1xyXG4gICAgICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhpcy5jcmVhdGVDb2xvckxpc3RcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGNvbG9yTGlzdCBDb2xvciBsaXN0XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfbWFrZUNvbG9yTGlzdDogZnVuY3Rpb24gKGNvbG9yTGlzdCkge1xyXG4gICAgICAgIGxldCBsaXN0ID0gJyc7XHJcblxyXG4gICAgICAgIGxpc3QgKz0gJzx1bCBjbGFzcz1cInNlLWNvbG9yLXBhbGxldFwiPic7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbG9yTGlzdC5sZW5ndGgsIGNvbG9yOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29sb3IgPSBjb2xvckxpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBsaXN0ICs9ICc8bGk+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS12YWx1ZT1cIicgKyBjb2xvciArICdcIiB0aXRsZT1cIicgKyBjb2xvciArICdcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGNvbG9yICsgJztcIj48L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzwvbGk+JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsaXN0ICs9ICc8L3VsPic7XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0O1xyXG4gICAgfSxcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGlzcGxheXMgb3IgcmVzZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29sb3IgYXQgY29sb3IgbGlzdC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBDdXJyZW50IFNlbGVjdGVkIG5vZGVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfG51bGx9IGNvbG9yIENvbG9yIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIGluaXQ6IGZ1bmN0aW9uIChub2RlLCBjb2xvcikge1xyXG4gICAgICAgIGNvbnN0IGNvbG9yUGlja2VyID0gdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyO1xyXG4gICAgICAgIGxldCBmaWxsQ29sb3IgPSBjb2xvciA/IGNvbG9yIDogY29sb3JQaWNrZXIuZ2V0Q29sb3JJbk5vZGUuY2FsbCh0aGlzLCBub2RlKSB8fCB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2RlZmF1bHRDb2xvcjtcclxuICAgICAgICBmaWxsQ29sb3IgPSBjb2xvclBpY2tlci5pc0hleENvbG9yKGZpbGxDb2xvcikgPyBmaWxsQ29sb3IgOiBjb2xvclBpY2tlci5yZ2IyaGV4KGZpbGxDb2xvcikgfHwgZmlsbENvbG9yO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckxpc3QgPSB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2NvbG9yTGlzdDtcclxuICAgICAgICBpZiAoY29sb3JMaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjb2xvckxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWxsQ29sb3IudG9Mb3dlckNhc2UoKSA9PT0gY29sb3JMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29sb3JMaXN0W2ldLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb2xvckxpc3RbaV0sICdhY3RpdmUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29sb3JQaWNrZXIuc2V0SW5wdXRUZXh0LmNhbGwodGhpcywgY29sb3JQaWNrZXIuY29sb3JOYW1lMmhleC5jYWxsKHRoaXMsIGZpbGxDb2xvcikpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9yZSBjb2xvciB2YWx1ZXNcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBoZXhDb2xvclN0ciBIYXggY29sb3IgdmFsdWVcclxuICAgICAqL1xyXG4gICAgc2V0Q3VycmVudENvbG9yOiBmdW5jdGlvbiAoaGV4Q29sb3JTdHIpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuY29sb3JQaWNrZXIuX2N1cnJlbnRDb2xvciA9IGhleENvbG9yU3RyO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5jb2xvclBpY2tlci5fY29sb3JJbnB1dC5zdHlsZS5ib3JkZXJDb2xvciA9IGhleENvbG9yU3RyO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY29sb3IgYXQgaW5wdXQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhleENvbG9yU3RyIEhheCBjb2xvciB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBzZXRJbnB1dFRleHQ6IGZ1bmN0aW9uIChoZXhDb2xvclN0cikge1xyXG4gICAgICAgIGhleENvbG9yU3RyID0gL14jLy50ZXN0KGhleENvbG9yU3RyKSA/IGhleENvbG9yU3RyIDogJyMnICsgaGV4Q29sb3JTdHI7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9jb2xvcklucHV0LnZhbHVlID0gaGV4Q29sb3JTdHI7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyLnNldEN1cnJlbnRDb2xvci5jYWxsKHRoaXMsIGhleENvbG9yU3RyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyBjb2xvciB2YWx1ZSBhdCBjb2xvciBwcm9wZXJ0eSBvZiBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgU2VsZWN0ZWQgbm9kZSBcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldENvbG9ySW5Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIGxldCBmaW5kQ29sb3IgPSAnJztcclxuICAgICAgICBjb25zdCBzdHlsZVByb3BlcnR5ID0gdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9zdHlsZVByb3BlcnR5O1xyXG5cclxuICAgICAgICB3aGlsZSAobm9kZSAmJiAhdGhpcy51dGlsLmlzV3lzaXd5Z0Rpdihub2RlKSAmJiBmaW5kQ29sb3IubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUuc3R5bGVbc3R5bGVQcm9wZXJ0eV0pIGZpbmRDb2xvciA9IG5vZGUuc3R5bGVbc3R5bGVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmluZENvbG9yO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjaGVjayBoZXggZm9ybWF0IGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIENvbG9yIHZhbHVlXHJcbiAgICAgKi9cclxuICAgIGlzSGV4Q29sb3I6IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgICAgICByZXR1cm4gL14jWzAtOWEtZl17M30oPzpbMC05YS1mXXszfSk/JC9pLnRlc3Qoc3RyKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gY29udmVydCBoZXggZm9ybWF0IHRvIGEgcmdiIGNvbG9yXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmdiIFJHQiBjb2xvciBmb3JtYXRcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIHJnYjJoZXg6IGZ1bmN0aW9uIChyZ2IpIHtcclxuICAgICAgICBjb25zdCByZ2JNYXRjaCA9IHJnYi5tYXRjaCgvXnJnYmE/W1xccytdP1xcKFtcXHMrXT8oXFxkKylbXFxzK10/LFtcXHMrXT8oXFxkKylbXFxzK10/LFtcXHMrXT8oXFxkKylbXFxzK10/L2kpO1xyXG5cclxuICAgICAgICByZXR1cm4gKHJnYk1hdGNoICYmIHJnYk1hdGNoLmxlbmd0aCA9PT0gNCkgPyBcIiNcIiArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzFdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzJdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSArXHJcbiAgICAgICAgICAgIChcIjBcIiArIHBhcnNlSW50KHJnYk1hdGNoWzNdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSA6ICcnO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBjb2xvciB2YWx1ZXMgb2Ygb3RoZXIgZm9ybWF0cyB0byBoZXggY29sb3IgdmFsdWVzIGFuZCByZXR1cm5zLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbG9yTmFtZSBDb2xvciB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgY29sb3JOYW1lMmhleDogZnVuY3Rpb24gKGNvbG9yTmFtZSkge1xyXG4gICAgICAgIGlmICgvXiMvLnRlc3QoY29sb3JOYW1lKSkgcmV0dXJuIGNvbG9yTmFtZTtcclxuICAgICAgICB2YXIgdGVtcCA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0ZW1wLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgdGVtcC5zdHlsZS5jb2xvciA9IGNvbG9yTmFtZTtcclxuICAgICAgICB2YXIgY29sb3JzID0gdGhpcy5fdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2QuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKSkuY29sb3IubWF0Y2goL1xcZCsvZykubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBwYXJzZUludChhLDEwKTsgfSk7XHJcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGVtcCk7XHJcbiAgICAgICAgcmV0dXJuIChjb2xvcnMubGVuZ3RoID49IDMpID8gJyMnICsgKCgoMSA8PCAyNCkgKyAoY29sb3JzWzBdIDw8IDE2KSArIChjb2xvcnNbMV0gPDwgOCkgKyBjb2xvcnNbMl0pLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpIDogZmFsc2U7XHJcbiAgICB9XHJcbn07IiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCBjb2xvclBpY2tlciBmcm9tICcuLi9tb2R1bGVzL19jb2xvclBpY2tlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBuYW1lOiAnZm9udENvbG9yJyxcclxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcclxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICBjb3JlLmFkZE1vZHVsZShbY29sb3JQaWNrZXJdKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcclxuICAgICAgICBjb250ZXh0LmZvbnRDb2xvciA9IHtcclxuICAgICAgICAgICAgcHJldmlld0VsOiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvcklucHV0OiBudWxsLFxyXG4gICAgICAgICAgICBjb2xvckxpc3Q6IG51bGxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cclxuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcclxuICAgICAgICBjb250ZXh0LmZvbnRDb2xvci5jb2xvcklucHV0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbG9yX3BpY2tlcl9pbnB1dCcpO1xyXG5cclxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xyXG4gICAgICAgIGNvbnRleHQuZm9udENvbG9yLmNvbG9ySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uQ2hhbmdlSW5wdXQuYmluZChjb3JlKSk7XHJcbiAgICAgICAgbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbG9yX3BpY2tlcl9zdWJtaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xyXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcignLl9zZV9jb2xvcl9waWNrZXJfcmVtb3ZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlbW92ZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICBsaXN0RGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XHJcbiAgICAgICAgY29udGV4dC5mb250Q29sb3IuY29sb3JMaXN0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcclxuXHJcbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cclxuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XHJcblxyXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cclxuICAgICAgICBsaXN0RGl2ID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcclxuICAgICAgICBjb25zdCBjb2xvckFyZWEgPSBjb3JlLmNvbnRleHQuY29sb3JQaWNrZXIuY29sb3JMaXN0SFRNTDtcclxuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXInO1xyXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gY29sb3JBcmVhO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlzdERpdjtcclxuICAgIH0sXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcclxuICAgICAqL1xyXG4gICAgb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0UGlja2VyID0gdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRGb250Q29sb3IgPSB0aGlzLmNvbnRleHQuZm9udENvbG9yO1xyXG5cclxuICAgICAgICBjb250ZXh0UGlja2VyLl9jb2xvcklucHV0ID0gY29udGV4dEZvbnRDb2xvci5jb2xvcklucHV0O1xyXG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy53d0NvbXB1dGVkU3R5bGUuY29sb3I7XHJcbiAgICAgICAgY29udGV4dFBpY2tlci5fZGVmYXVsdENvbG9yID0gY29sb3IgPyB0aGlzLnBsdWdpbnMuY29sb3JQaWNrZXIuaXNIZXhDb2xvcihjb2xvcikgPyBjb2xvciA6IHRoaXMucGx1Z2lucy5jb2xvclBpY2tlci5yZ2IyaGV4KGNvbG9yKSA6IFwiIzMzMzMzM1wiO1xyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX3N0eWxlUHJvcGVydHkgPSAnY29sb3InO1xyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX2NvbG9yTGlzdCA9IGNvbnRleHRGb250Q29sb3IuY29sb3JMaXN0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucGx1Z2lucy5jb2xvclBpY2tlci5pbml0LmNhbGwodGhpcywgdGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCksIG51bGwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBAT3ZlcnJpZGUgX2NvbG9yUGlja2VyXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhbmdlSW5wdXQ6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyLnNldEN1cnJlbnRDb2xvci5jYWxsKHRoaXMsIGUudGFyZ2V0LnZhbHVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgc3VibWl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZvbnRDb2xvci5hcHBseUNvbG9yLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9jdXJyZW50Q29sb3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMucGx1Z2lucy5mb250Q29sb3IuYXBwbHlDb2xvci5jYWxsKHRoaXMsIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKG51bGwsIFsnY29sb3InXSwgWydzcGFuJ10sIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xyXG4gICAgfSxcclxuXHJcbiAgICBhcHBseUNvbG9yOiBmdW5jdGlvbiAoY29sb3IpIHtcclxuICAgICAgICBpZiAoIWNvbG9yKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xyXG4gICAgICAgIG5ld05vZGUuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobmV3Tm9kZSwgWydjb2xvciddLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XHJcbiAgICB9XHJcbn07XHJcbiIsIi8qXHJcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxyXG4gKlxyXG4gKiBzdW5lZGl0b3IuanNcclxuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cclxuICogTUlUIGxpY2Vuc2UuXHJcbiAqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgY29sb3JQaWNrZXIgZnJvbSAnLi4vbW9kdWxlcy9fY29sb3JQaWNrZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgbmFtZTogJ2hpbGl0ZUNvbG9yJyxcclxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcclxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICBjb3JlLmFkZE1vZHVsZShbY29sb3JQaWNrZXJdKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcclxuICAgICAgICBjb250ZXh0LmhpbGl0ZUNvbG9yID0ge1xyXG4gICAgICAgICAgICBwcmV2aWV3RWw6IG51bGwsXHJcbiAgICAgICAgICAgIGNvbG9ySW5wdXQ6IG51bGwsXHJcbiAgICAgICAgICAgIGNvbG9yTGlzdDogbnVsbFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xyXG4gICAgICAgIGxldCBsaXN0RGl2ID0gdGhpcy5zZXRTdWJtZW51KGNvcmUpO1xyXG4gICAgICAgIGNvbnRleHQuaGlsaXRlQ29sb3IuY29sb3JJbnB1dCA9IGxpc3REaXYucXVlcnlTZWxlY3RvcignLl9zZV9jb2xvcl9waWNrZXJfaW5wdXQnKTtcclxuXHJcbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgICAgICBjb250ZXh0LmhpbGl0ZUNvbG9yLmNvbG9ySW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uQ2hhbmdlSW5wdXQuYmluZChjb3JlKSk7XHJcbiAgICAgICAgbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX2NvbG9yX3BpY2tlcl9zdWJtaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xyXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcignLl9zZV9jb2xvcl9waWNrZXJfcmVtb3ZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlbW92ZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICBsaXN0RGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XHJcblxyXG4gICAgICAgIGNvbnRleHQuaGlsaXRlQ29sb3IuY29sb3JMaXN0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcclxuXHJcbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cclxuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XHJcblxyXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cclxuICAgICAgICBsaXN0RGl2ID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcclxuICAgICAgICBjb25zdCBjb2xvckFyZWEgPSBjb3JlLmNvbnRleHQuY29sb3JQaWNrZXIuY29sb3JMaXN0SFRNTDtcclxuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXInO1xyXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gY29sb3JBcmVhO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlzdERpdjtcclxuICAgIH0sXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcclxuICAgICAqL1xyXG4gICAgb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0UGlja2VyID0gdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRIaWxpdGVDb2xvciA9IHRoaXMuY29udGV4dC5oaWxpdGVDb2xvcjtcclxuXHJcbiAgICAgICAgY29udGV4dFBpY2tlci5fY29sb3JJbnB1dCA9IGNvbnRleHRIaWxpdGVDb2xvci5jb2xvcklucHV0O1xyXG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy53d0NvbXB1dGVkU3R5bGUuYmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgIGNvbnRleHRQaWNrZXIuX2RlZmF1bHRDb2xvciA9IGNvbG9yID8gdGhpcy5wbHVnaW5zLmNvbG9yUGlja2VyLmlzSGV4Q29sb3IoY29sb3IpID8gY29sb3IgOiB0aGlzLnBsdWdpbnMuY29sb3JQaWNrZXIucmdiMmhleChjb2xvcikgOiBcIiNmZmZmZmZcIjtcclxuICAgICAgICBjb250ZXh0UGlja2VyLl9zdHlsZVByb3BlcnR5ID0gJ2JhY2tncm91bmRDb2xvcic7XHJcbiAgICAgICAgY29udGV4dFBpY2tlci5fY29sb3JMaXN0ID0gY29udGV4dEhpbGl0ZUNvbG9yLmNvbG9yTGlzdDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnBsdWdpbnMuY29sb3JQaWNrZXIuaW5pdC5jYWxsKHRoaXMsIHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCBudWxsKTtcclxuICAgIH0sXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQE92ZXJyaWRlIF9jb2xvclBpY2tlclxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZUlucHV0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy5jb2xvclBpY2tlci5zZXRDdXJyZW50Q29sb3IuY2FsbCh0aGlzLCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy5oaWxpdGVDb2xvci5hcHBseUNvbG9yLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmNvbG9yUGlja2VyLl9jdXJyZW50Q29sb3IpO1xyXG4gICAgfSxcclxuXHJcbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMucGx1Z2lucy5oaWxpdGVDb2xvci5hcHBseUNvbG9yLmNhbGwodGhpcywgZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobnVsbCwgWydiYWNrZ3JvdW5kLWNvbG9yJ10sIFsnc3BhbiddLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcclxuICAgIH0sXHJcblxyXG4gICAgYXBwbHlDb2xvcjogZnVuY3Rpb24gKGNvbG9yKSB7XHJcbiAgICAgICAgaWYgKCFjb2xvcikgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xyXG4gICAgICAgIG5ld05vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XHJcbiAgICAgICAgdGhpcy5ub2RlQ2hhbmdlKG5ld05vZGUsIFsnYmFja2dyb3VuZC1jb2xvciddLCBudWxsLCBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcclxuICAgIH1cclxufTtcclxuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAndGVtcGxhdGUnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQudGVtcGxhdGUgPSB7fTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IHRlbXBsYXRlRGl2ID0gdGhpcy5zZXRTdWJtZW51KGNvcmUpO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIHRlbXBsYXRlRGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2t1cC5iaW5kKGNvcmUpKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgdGVtcGxhdGVEaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgdGVtcGxhdGVEaXYgPSBudWxsO1xuICAgIH0sXG5cbiAgICBzZXRTdWJtZW51OiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUxpc3QgPSBjb3JlLm9wdGlvbnMudGVtcGxhdGVzO1xuICAgICAgICBpZiAoIXRlbXBsYXRlTGlzdCB8fCB0ZW1wbGF0ZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5wbHVnaW5zLnRlbXBsYXRlLmZhaWxdIFRvIHVzZSB0aGUgXCJ0ZW1wbGF0ZVwiIHBsdWdpbiwgcGxlYXNlIGRlZmluZSB0aGUgXCJ0ZW1wbGF0ZXNcIiBvcHRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1saXN0LWxheWVyJztcblxuICAgICAgICBsZXQgbGlzdCA9ICc8ZGl2IGNsYXNzPVwic2Utc3VibWVudSBzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGVtcGxhdGVMaXN0Lmxlbmd0aCwgdDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0ID0gdGVtcGxhdGVMaXN0W2ldO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIGkgKyAnXCIgdGl0bGU9XCInICsgdC5uYW1lICsgJ1wiPicgKyB0Lm5hbWUgKyAnPC9idXR0b24+PC9saT4nO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QgKz0gJzwvdWw+PC9kaXY+JztcblxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9IGxpc3Q7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgIHBpY2t1cDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCEvXkJVVFRPTiQvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLm9wdGlvbnMudGVtcGxhdGVzW2UudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpXTtcblxuICAgICAgICBpZiAodGVtcC5odG1sKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRzKHRlbXAuaHRtbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLnRlbXBsYXRlLmZhaWxdIGNhdXNlIDogXCJ0ZW1wbGF0ZXNbaV0uaHRtbCBub3QgZm91bmRcIicpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcbiAgICB9XG59OyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE4IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ3NlbGVjdE1lbnUnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29yZS5jb250ZXh0LnNlbGVjdE1lbnUgPSB7XG4gICAgICAgICAgICBjYWxsZXI6IHt9LFxuICAgICAgICAgICAgY2FsbGVyQ29udGV4dDogbnVsbFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBzZXRGb3JtOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz1cInNlLXNlbGVjdC1saXN0XCI+PC9kaXY+JztcbiAgICB9LFxuXG4gICAgY3JlYXRlTGlzdDogZnVuY3Rpb24gKGxpc3RDb250ZXh0LCBpdGVtcywgaHRtbCkge1xuICAgICAgICBsaXN0Q29udGV4dC5mb3JtLmlubmVySFRNTCA9ICc8dWw+JyArIGh0bWwgKyAnPC91bD4nO1xuICAgICAgICBsaXN0Q29udGV4dC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICBsaXN0Q29udGV4dC5tZW51cyA9IGxpc3RDb250ZXh0LmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnbGknKTtcbiAgICB9LFxuXG4gICAgaW5pdEV2ZW50OiBmdW5jdGlvbiAocGx1Z2luTmFtZSwgZm9ybXMpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IGZvcm1zLnF1ZXJ5U2VsZWN0b3IoJy5zZS1zZWxlY3QtbGlzdCcpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyW3BsdWdpbk5hbWVdID0ge1xuICAgICAgICAgICAgZm9ybTogZm9ybSxcbiAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgIG1lbnVzOiBbXSxcbiAgICAgICAgICAgIGluZGV4OiAtMSxcbiAgICAgICAgICAgIGl0ZW06IG51bGwsXG4gICAgICAgICAgICBjbGlja01ldGhvZDogbnVsbCxcbiAgICAgICAgICAgIGNhbGxlck5hbWU6IHBsdWdpbk5hbWVcbiAgICAgICAgfTtcblxuICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51Lm9uTW91c2Vkb3duX2xpc3QpO1xuICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51Lm9uTW91c2VNb3ZlX2xpc3QuYmluZCh0aGlzLCBjb250ZXh0KSk7XG4gICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5vbkNsaWNrX2xpc3QuYmluZCh0aGlzLCBjb250ZXh0KSk7XG4gICAgfSxcblxuICAgIG9uTW91c2Vkb3duX2xpc3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LFxuXG4gICAgb25Nb3VzZU1vdmVfbGlzdDogZnVuY3Rpb24gKGNvbnRleHQsIGUpIHtcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNvbnRleHQuZm9ybSwgJ19fc2Vfc2VsZWN0LW1lbnUtbW91c2UtbW92ZScpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpO1xuICAgICAgICBpZiAoIWluZGV4KSByZXR1cm47XG4gICAgICAgIGNvbnRleHQuaW5kZXggPSBpbmRleCAqIDE7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfbGlzdDogZnVuY3Rpb24gKGNvbnRleHQsIGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKTtcbiAgICAgICAgaWYgKCFpbmRleCkgcmV0dXJuO1xuICAgICAgICBjb250ZXh0LmNsaWNrTWV0aG9kLmNhbGwodGhpcywgY29udGV4dC5pdGVtc1tpbmRleF0pO1xuICAgIH0sXG5cbiAgICBtb3ZlSXRlbTogZnVuY3Rpb24gKGxpc3RDb250ZXh0LCBudW0pIHtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGxpc3RDb250ZXh0LmZvcm0sICdfX3NlX3NlbGVjdC1tZW51LW1vdXNlLW1vdmUnKTtcbiAgICAgICAgbnVtID0gbGlzdENvbnRleHQuaW5kZXggKyBudW07XG4gICAgICAgIGNvbnN0IG1lbnVzID0gbGlzdENvbnRleHQubWVudXM7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1lbnVzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc2VsZWN0SW5kZXggPSBsaXN0Q29udGV4dC5pbmRleCA9IG51bSA+PSBsZW4gPyAwIDogbnVtIDwgMCA/IGxlbiAtIDEgOiBudW07XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gc2VsZWN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MobWVudXNbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKG1lbnVzW2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0Q29udGV4dC5pdGVtID0gbGlzdENvbnRleHQuaXRlbXNbc2VsZWN0SW5kZXhdO1xuICAgIH0sXG5cbiAgICBnZXRJdGVtOiBmdW5jdGlvbiAobGlzdENvbnRleHQsIGluZGV4KSB7XG4gICAgICAgIGluZGV4ID0gKCFpbmRleCB8fCBpbmRleCA8IDApID8gbGlzdENvbnRleHQuaW5kZXggOiBpbmRleDtcbiAgICAgICAgcmV0dXJuIGxpc3RDb250ZXh0Lml0ZW1zW2luZGV4XTtcbiAgICB9LFxuXG4gICAgb246IGZ1bmN0aW9uIChjYWxsZXJOYW1lLCBjbGlja01ldGhvZCkge1xuICAgICAgICBjb25zdCBsaXN0Q29udGV4dCA9IHRoaXMuY29udGV4dC5zZWxlY3RNZW51LmNhbGxlcltjYWxsZXJOYW1lXTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyQ29udGV4dCA9IGxpc3RDb250ZXh0O1xuICAgICAgICBsaXN0Q29udGV4dC5jbGlja01ldGhvZCA9IGNsaWNrTWV0aG9kO1xuICAgICAgICBsaXN0Q29udGV4dC5jYWxsZXJOYW1lID0gY2FsbGVyTmFtZTtcbiAgICB9LFxuXG4gICAgb3BlbjogZnVuY3Rpb24gKGxpc3RDb250ZXh0LCBwb3NpdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgZm9ybSA9IGxpc3RDb250ZXh0LmZvcm07XG4gICAgICAgIGZvcm0uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBwb3NpdGlvbkhhbmRsZXIoZm9ybSk7XG4gICAgICAgIGZvcm0uc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgIH0sXG5cbiAgICBjbG9zZTogZnVuY3Rpb24gKGxpc3RDb250ZXh0KSB7XG4gICAgICAgIGxpc3RDb250ZXh0LmZvcm0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGlzdENvbnRleHQuaXRlbXMgPSBbXTtcbiAgICAgICAgbGlzdENvbnRleHQubWVudXMgPSBbXTtcbiAgICAgICAgbGlzdENvbnRleHQuaW5kZXggPSAtMTtcbiAgICAgICAgbGlzdENvbnRleHQuaXRlbSA9IG51bGw7XG4gICAgfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uIChsaXN0Q29udGV4dCkge1xuICAgICAgICBpZiAoIWxpc3RDb250ZXh0KSByZXR1cm47XG4gICAgICAgIGxpc3RDb250ZXh0Lml0ZW1zID0gW107XG4gICAgICAgIGxpc3RDb250ZXh0Lm1lbnVzID0gW107XG4gICAgICAgIGxpc3RDb250ZXh0LmluZGV4ID0gLTE7XG4gICAgICAgIGxpc3RDb250ZXh0Lml0ZW0gPSBudWxsO1xuICAgICAgICBsaXN0Q29udGV4dC5jYWxsZXJOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuY29udGV4dC5zZWxlY3RNZW51LmNhbGxlckNvbnRleHQgPSBudWxsO1xuICAgIH1cbn07IiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCBzZWxlY3RNZW51IGZyb20gJy4vX3NlbGVjdE1lbnUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2FuY2hvcicsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbc2VsZWN0TWVudV0pO1xuICAgICAgICBcbiAgICAgICAgY29yZS5jb250ZXh0LmFuY2hvciA9IHtcbiAgICAgICAgICAgIGNhbGxlcjoge30sXG4gICAgICAgICAgICBmb3JtczogdGhpcy5zZXREaWFsb2dGb3JtKGNvcmUpLFxuICAgICAgICAgICAgaG9zdDogKGNvcmUuX3cubG9jYXRpb24ub3JpZ2luICsgY29yZS5fdy5sb2NhdGlvbi5wYXRobmFtZSkucmVwbGFjZSgvXFwvJC8sICcnKSxcbiAgICAgICAgICAgIGNhbGxlckNvbnRleHQ6IG51bGxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLyoqIGRpYWxvZyAqL1xuICAgIHNldERpYWxvZ0Zvcm06IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IHJlbExpc3QgPSBjb3JlLm9wdGlvbnMubGlua1JlbDtcbiAgICAgICAgY29uc3QgZGVmYXVsdFJlbCA9IChjb3JlLm9wdGlvbnMubGlua1JlbERlZmF1bHQuZGVmYXVsdCB8fCAnJykuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBmb3JtcyA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWJvZHlcIj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5saW5rQm94LnVybCArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0tZmlsZXNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gc2UtaW5wdXQtdXJsXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIicgKyAoY29yZS5vcHRpb25zLnByb3RvY29sIHx8ICcnKSArICdcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWZpbGVzLWVkZ2UtYnV0dG9uIF9zZV9ib29rbWFya19idXR0b25cIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5saW5rQm94LmJvb2ttYXJrICsgJ1wiPicgKyBpY29ucy5ib29rbWFyayArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgY29yZS5wbHVnaW5zLnNlbGVjdE1lbnUuc2V0Rm9ybSgpICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1hbmNob3ItcHJldmlldy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXN2ZyBzZS1hbmNob3ItcHJldmlldy1pY29uIF9zZV9hbmNob3JfYm9va21hcmtfaWNvblwiPicgKyBpY29ucy5ib29rbWFyayArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXN2ZyBzZS1hbmNob3ItcHJldmlldy1pY29uIF9zZV9hbmNob3JfZG93bmxvYWRfaWNvblwiPicgKyBpY29ucy5kb3dubG9hZCArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8cHJlIGNsYXNzPVwic2UtbGluay1wcmV2aWV3XCI+PC9wcmU+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gudGV4dCArICc8L2xhYmVsPjxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gX3NlX2FuY2hvcl90ZXh0XCIgdHlwZT1cInRleHRcIiAvPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybS1mb290ZXJcIj4nICtcbiAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tY2hlY2sgX3NlX2FuY2hvcl9jaGVja1wiIC8+Jm5ic3A7JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3gubmV3V2luZG93Q2hlY2sgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tY2hlY2sgX3NlX2FuY2hvcl9kb3dubG9hZFwiIC8+Jm5ic3A7JyArIGxhbmcuZGlhbG9nQm94LmxpbmtCb3guZG93bmxvYWRMaW5rQ2hlY2sgKyAnPC9sYWJlbD4nO1xuICAgICAgICAgICAgaWYgKHJlbExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzZS1hbmNob3ItcmVsXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4gc2UtYnRuLXNlbGVjdCBzZS1hbmNob3ItcmVsLWJ0blwiPiZsdDtyZWwmZ3Q7PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYW5jaG9yLXJlbC13cmFwcGVyXCI+PHByZSBjbGFzcz1cInNlLWxpbmstcHJldmlldyBzZS1hbmNob3ItcmVsLXByZXZpZXdcIj48L3ByZT48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWxheWVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWxpc3QtaW5uZXJcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHVsIGNsYXNzPVwic2UtbGlzdC1iYXNpYyBzZS1saXN0LWNoZWNrZWRcIj4nO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZWxMaXN0Lmxlbmd0aCwgcmVsOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsID0gcmVsTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3QnICsgKGRlZmF1bHRSZWwuaW5kZXhPZihyZWwpID4gLTEgPyAnIHNlLWNoZWNrZWQnIDogJycpICsgJ1wiIGRhdGEtY29tbWFuZD1cIicgKyByZWwgKyAnXCIgdGl0bGU9XCInICsgcmVsICsgJ1wiPjxzcGFuIGNsYXNzPVwic2Utc3ZnXCI+JyArIGljb25zLmNoZWNrZWQgKyAnPC9zcGFuPicgKyByZWwgKyAnPC9idXR0b24+PC9saT4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBodG1sICs9ICc8L3VsPjwvZGl2PjwvZGl2PjwvZGl2Pic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JztcblxuICAgICAgICBmb3Jtcy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICByZXR1cm4gZm9ybXM7XG4gICAgfSxcblxuICAgIGluaXRFdmVudDogZnVuY3Rpb24gKHBsdWdpbk5hbWUsIGZvcm1zKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclBsdWdpbiA9IHRoaXMucGx1Z2lucy5hbmNob3I7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQuYW5jaG9yLmNhbGxlcltwbHVnaW5OYW1lXSA9IHtcbiAgICAgICAgICAgIG1vZGFsOiBmb3JtcyxcbiAgICAgICAgICAgIHVybElucHV0OiBudWxsLFxuICAgICAgICAgICAgbGlua0RlZmF1bHRSZWw6IHRoaXMub3B0aW9ucy5saW5rUmVsRGVmYXVsdCxcbiAgICAgICAgICAgIGRlZmF1bHRSZWw6IHRoaXMub3B0aW9ucy5saW5rUmVsRGVmYXVsdC5kZWZhdWx0IHx8ICcnLFxuICAgICAgICAgICAgY3VycmVudFJlbDogW10sXG4gICAgICAgICAgICBsaW5rQW5jaG9yOiBudWxsLFxuICAgICAgICAgICAgbGlua1ZhbHVlOiAnJyxcbiAgICAgICAgICAgIF9jaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgY2FsbGVyTmFtZTogcGx1Z2luTmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGV4dC5saW5rRGVmYXVsdFJlbC5kZWZhdWx0ID09PSAnc3RyaW5nJykgY29udGV4dC5saW5rRGVmYXVsdFJlbC5kZWZhdWx0ID0gY29udGV4dC5saW5rRGVmYXVsdFJlbC5kZWZhdWx0LnRyaW0oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZXh0LmxpbmtEZWZhdWx0UmVsLmNoZWNrX25ld193aW5kb3cgPT09ICdzdHJpbmcnKSBjb250ZXh0LmxpbmtEZWZhdWx0UmVsLmNoZWNrX25ld193aW5kb3cgPSBjb250ZXh0LmxpbmtEZWZhdWx0UmVsLmNoZWNrX25ld193aW5kb3cudHJpbSgpO1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQubGlua0RlZmF1bHRSZWwuY2hlY2tfYm9va21hcmsgPT09ICdzdHJpbmcnKSBjb250ZXh0LmxpbmtEZWZhdWx0UmVsLmNoZWNrX2Jvb2ttYXJrID0gY29udGV4dC5saW5rRGVmYXVsdFJlbC5jaGVja19ib29rbWFyay50cmltKCk7XG5cbiAgICAgICAgY29udGV4dC51cmxJbnB1dCA9IGZvcm1zLnF1ZXJ5U2VsZWN0b3IoJy5zZS1pbnB1dC11cmwnKTtcbiAgICAgICAgY29udGV4dC5hbmNob3JUZXh0ID0gZm9ybXMucXVlcnlTZWxlY3RvcignLl9zZV9hbmNob3JfdGV4dCcpO1xuICAgICAgICBjb250ZXh0Lm5ld1dpbmRvd0NoZWNrID0gZm9ybXMucXVlcnlTZWxlY3RvcignLl9zZV9hbmNob3JfY2hlY2snKTtcbiAgICAgICAgY29udGV4dC5kb3dubG9hZENoZWNrID0gZm9ybXMucXVlcnlTZWxlY3RvcignLl9zZV9hbmNob3JfZG93bmxvYWQnKTtcbiAgICAgICAgY29udGV4dC5kb3dubG9hZCA9IGZvcm1zLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfYW5jaG9yX2Rvd25sb2FkX2ljb24nKTtcbiAgICAgICAgY29udGV4dC5wcmV2aWV3ID0gZm9ybXMucXVlcnlTZWxlY3RvcignLnNlLWxpbmstcHJldmlldycpO1xuICAgICAgICBjb250ZXh0LmJvb2ttYXJrID0gZm9ybXMucXVlcnlTZWxlY3RvcignLl9zZV9hbmNob3JfYm9va21hcmtfaWNvbicpO1xuICAgICAgICBjb250ZXh0LmJvb2ttYXJrQnV0dG9uID0gZm9ybXMucXVlcnlTZWxlY3RvcignLl9zZV9ib29rbWFya19idXR0b24nKTtcblxuICAgICAgICB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5pbml0RXZlbnQuY2FsbCh0aGlzLCBwbHVnaW5OYW1lLCBmb3Jtcyk7XG4gICAgICAgIGNvbnN0IGxpc3RDb250ZXh0ID0gdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyW3BsdWdpbk5hbWVdO1xuICAgICAgICBcbiAgICAgICAgLyoqIHJlbCAqL1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbmtSZWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29udGV4dC5yZWxCdXR0b24gPSBmb3Jtcy5xdWVyeVNlbGVjdG9yKCcuc2UtYW5jaG9yLXJlbC1idG4nKTtcbiAgICAgICAgICAgIGNvbnRleHQucmVsTGlzdCA9IGZvcm1zLnF1ZXJ5U2VsZWN0b3IoJy5zZS1saXN0LWxheWVyJyk7XG4gICAgICAgICAgICBjb250ZXh0LnJlbFByZXZpZXcgPSBmb3Jtcy5xdWVyeVNlbGVjdG9yKCcuc2UtYW5jaG9yLXJlbC1wcmV2aWV3Jyk7XG4gICAgICAgICAgICBjb250ZXh0LnJlbEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFuY2hvclBsdWdpbi5vbkNsaWNrX3JlbEJ1dHRvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgICAgIGNvbnRleHQucmVsTGlzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFuY2hvclBsdWdpbi5vbkNsaWNrX3JlbExpc3QuYmluZCh0aGlzLCBjb250ZXh0KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm5ld1dpbmRvd0NoZWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFuY2hvclBsdWdpbi5vbkNoYW5nZV9uZXdXaW5kb3dDaGVjay5iaW5kKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgICAgY29udGV4dC5kb3dubG9hZENoZWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFuY2hvclBsdWdpbi5vbkNoYW5nZV9kb3dubG9hZENoZWNrLmJpbmQodGhpcywgY29udGV4dCkpO1xuICAgICAgICBjb250ZXh0LmFuY2hvclRleHQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBhbmNob3JQbHVnaW4ub25DaGFuZ2VBbmNob3JUZXh0LmJpbmQodGhpcywgY29udGV4dCkpO1xuICAgICAgICBjb250ZXh0LnVybElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYW5jaG9yUGx1Z2luLm9uQ2hhbmdlVXJsSW5wdXQuYmluZCh0aGlzLCBjb250ZXh0KSk7XG4gICAgICAgIGNvbnRleHQudXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFuY2hvclBsdWdpbi5vbktleURvd25VcmxJbnB1dC5iaW5kKHRoaXMsIGxpc3RDb250ZXh0KSk7XG4gICAgICAgIGNvbnRleHQudXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBhbmNob3JQbHVnaW4ub25Gb2N1c1VybElucHV0LmJpbmQodGhpcywgY29udGV4dCwgbGlzdENvbnRleHQpKTtcbiAgICAgICAgY29udGV4dC51cmxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgYW5jaG9yUGx1Z2luLm9uQmx1clVybElucHV0LmJpbmQodGhpcywgbGlzdENvbnRleHQpKTtcbiAgICAgICAgY29udGV4dC5ib29rbWFya0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFuY2hvclBsdWdpbi5vbkNsaWNrX2Jvb2ttYXJrQnV0dG9uLmJpbmQodGhpcywgY29udGV4dCkpO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIHVwZGF0ZSkge1xuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5pbml0LmNhbGwodGhpcywgY29udGV4dEFuY2hvcik7XG4gICAgICAgICAgICBjb250ZXh0QW5jaG9yLmFuY2hvclRleHQudmFsdWUgPSB0aGlzLmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dEFuY2hvci5saW5rQW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBjb250ZXh0QW5jaG9yLmxpbmtBbmNob3IuaHJlZjtcbiAgICAgICAgICAgIGNvbnRleHRBbmNob3IubGlua1ZhbHVlID0gY29udGV4dEFuY2hvci5wcmV2aWV3LnRleHRDb250ZW50ID0gY29udGV4dEFuY2hvci51cmxJbnB1dC52YWx1ZSA9IC9cXCMuKyQvLnRlc3QoaHJlZikgPyBocmVmLnN1YnN0cihocmVmLmxhc3RJbmRleE9mKCcjJykpIDogaHJlZjtcbiAgICAgICAgICAgIGNvbnRleHRBbmNob3IuYW5jaG9yVGV4dC52YWx1ZSA9IGNvbnRleHRBbmNob3IubGlua0FuY2hvci50ZXh0Q29udGVudC50cmltKCkgfHwgY29udGV4dEFuY2hvci5saW5rQW5jaG9yLmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICAgICAgICBjb250ZXh0QW5jaG9yLm5ld1dpbmRvd0NoZWNrLmNoZWNrZWQgPSAoL19ibGFuay9pLnRlc3QoY29udGV4dEFuY2hvci5saW5rQW5jaG9yLnRhcmdldCkgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5kb3dubG9hZENoZWNrLmNoZWNrZWQgPSBjb250ZXh0QW5jaG9yLmxpbmtBbmNob3IuZG93bmxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRleHQuYW5jaG9yLmNhbGxlckNvbnRleHQgPSBjb250ZXh0QW5jaG9yO1xuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLnNldFJlbC5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IsICh1cGRhdGUgJiYgY29udGV4dEFuY2hvci5saW5rQW5jaG9yKSA/IGNvbnRleHRBbmNob3IubGlua0FuY2hvci5yZWwgOiBjb250ZXh0QW5jaG9yLmRlZmF1bHRSZWwpO1xuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLnNldExpbmtQcmV2aWV3LmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci5saW5rVmFsdWUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5vbi5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IuY2FsbGVyTmFtZSwgdGhpcy5wbHVnaW5zLmFuY2hvci5zZXRIZWFkZXJCb29rbWFyayk7XG4gICAgfSxcblxuICAgIF9jbG9zZVJlbE1lbnU6IG51bGwsXG4gICAgdG9nZ2xlUmVsTGlzdDogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIHNob3cpIHtcbiAgICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmFuY2hvci5fY2xvc2VSZWxNZW51KSB0aGlzLnBsdWdpbnMuYW5jaG9yLl9jbG9zZVJlbE1lbnUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGNvbnRleHRBbmNob3IucmVsQnV0dG9uO1xuICAgICAgICAgICAgY29uc3QgcmVsTGlzdCA9IGNvbnRleHRBbmNob3IucmVsTGlzdDtcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0YXJnZXQsICdhY3RpdmUnKTtcbiAgICAgICAgICAgIHJlbExpc3Quc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgcmVsTGlzdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJ0bCkgcmVsTGlzdC5zdHlsZS5sZWZ0ID0gKHRhcmdldC5vZmZzZXRMZWZ0ICsgdGFyZ2V0Lm9mZnNldFdpZHRoICsgMSkgKyAncHgnO1xuICAgICAgICAgICAgZWxzZSByZWxMaXN0LnN0eWxlLmxlZnQgPSAodGFyZ2V0Lm9mZnNldExlZnQgLSByZWxMaXN0Lm9mZnNldFdpZHRoIC0gMSkgKyAncHgnO1xuICAgICAgICAgICAgcmVsTGlzdC5zdHlsZS50b3AgPSAodGFyZ2V0Lm9mZnNldFRvcCArICh0YXJnZXQub2Zmc2V0SGVpZ2h0IC8gMikgLSAocmVsTGlzdC5vZmZzZXRIZWlnaHQgLyAyKSkgKyAncHgnO1xuICAgICAgICAgICAgcmVsTGlzdC5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG5cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3IuX2Nsb3NlUmVsTWVudSA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXQsIGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiAoY29udGV4dC5yZWxCdXR0b24uY29udGFpbnMoZS50YXJnZXQpIHx8IGNvbnRleHQucmVsTGlzdC5jb250YWlucyhlLnRhcmdldCkpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhcmdldCwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQucmVsTGlzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxGb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5wbHVnaW5zLmFuY2hvci5fY2xvc2VSZWxNZW51KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLl9jbG9zZVJlbE1lbnUgPSBudWxsO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGNvbnRleHRBbmNob3IsIHRhcmdldCk7XG4gICAgXG4gICAgICAgICAgICB0aGlzLm1vZGFsRm9ybS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGx1Z2lucy5hbmNob3IuX2Nsb3NlUmVsTWVudSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DbGlja19yZWxCdXR0b246IGZ1bmN0aW9uIChjb250ZXh0QW5jaG9yLCBlKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3IudG9nZ2xlUmVsTGlzdC5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IsICF0aGlzLnV0aWwuaGFzQ2xhc3MoZS50YXJnZXQsICdhY3RpdmUnKSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfcmVsTGlzdDogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIGUpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGNtZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xuICAgICAgICBpZiAoIWNtZCkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGNvbnRleHRBbmNob3IuY3VycmVudFJlbDtcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdzZS1jaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudC5pbmRleE9mKGNtZCk7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSBjdXJyZW50LnB1c2goY21kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBjdXJyZW50LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0QW5jaG9yLnJlbFByZXZpZXcudGl0bGUgPSBjb250ZXh0QW5jaG9yLnJlbFByZXZpZXcudGV4dENvbnRlbnQgPSBjdXJyZW50LmpvaW4oJyAnKTtcbiAgICB9LFxuXG4gICAgc2V0UmVsOiBmdW5jdGlvbiAoY29udGV4dEFuY2hvciwgcmVsQXR0cikge1xuICAgICAgICBjb25zdCByZWxMaXN0RWwgPSBjb250ZXh0QW5jaG9yLnJlbExpc3Q7XG4gICAgICAgIGNvbnN0IHJlbHMgPSBjb250ZXh0QW5jaG9yLmN1cnJlbnRSZWwgPSAhcmVsQXR0ciA/IFtdIDogcmVsQXR0ci5zcGxpdCgnICcpO1xuICAgICAgICBpZiAoIXJlbExpc3RFbCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrZWRSZWwgPSByZWxMaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGVja2VkUmVsLmxlbmd0aCwgY21kOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNtZCA9IGNoZWNrZWRSZWxbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgIGlmIChyZWxzLmluZGV4T2YoY21kKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNoZWNrZWRSZWxbaV0sICdzZS1jaGVja2VkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjaGVja2VkUmVsW2ldLCAnc2UtY2hlY2tlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dEFuY2hvci5yZWxQcmV2aWV3LnRpdGxlID0gY29udGV4dEFuY2hvci5yZWxQcmV2aWV3LnRleHRDb250ZW50ID0gcmVscy5qb2luKCcgJyk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUhlYWRlckxpc3Q6IGZ1bmN0aW9uIChjb250ZXh0QW5jaG9yLCBjb250ZXh0TGlzdCwgdXJsVmFsdWUpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMudXRpbC5nZXRMaXN0Q2hpbGRyZW4odGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5ZywgZnVuY3Rpb24oY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIC9oWzEtNl0vaS50ZXN0KGN1cnJlbnQubm9kZU5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdmFsdWVSZWdFeHAgPSBuZXcgdGhpcy5fdy5SZWdFeHAoJ14nICsgdXJsVmFsdWUucmVwbGFjZSgvXiMvLCAnJyksICdpJyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgICAgZm9yKGxldCBpID0gMCwgbGVuID0gaGVhZGVycy5sZW5ndGgsIGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaCA9IGhlYWRlcnNbaV07XG4gICAgICAgICAgICBpZiAoIXZhbHVlUmVnRXhwLnRlc3QoaC50ZXh0Q29udGVudCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGlzdC5wdXNoKGgpO1xuICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPVwic2Utc2VsZWN0LWl0ZW1cIiBkYXRhLWluZGV4PVwiJyArIGkgKyAnXCI+JyArIGgudGV4dENvbnRlbnQgKyAnPC9saT4nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5jbG9zZS5jYWxsKHRoaXMsIGNvbnRleHRMaXN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51LmNyZWF0ZUxpc3QoY29udGV4dExpc3QsIGxpc3QsIGh0bWwpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnNlbGVjdE1lbnUub3Blbi5jYWxsKHRoaXMsIGNvbnRleHRMaXN0LCB0aGlzLnBsdWdpbnMuYW5jaG9yLl9zZXRNZW51TGlzdFBvc2l0aW9uLmJpbmQodGhpcywgY29udGV4dEFuY2hvcikpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9zZXRNZW51TGlzdFBvc2l0aW9uOiBmdW5jdGlvbiAoY29udGV4dEFuY2hvciwgbGlzdCkge1xuICAgICAgICBsaXN0LnN0eWxlLnRvcCA9IChjb250ZXh0QW5jaG9yLnVybElucHV0Lm9mZnNldEhlaWdodCArIDEpICsgJ3B4JztcbiAgICB9LFxuXG4gICAgb25LZXlEb3duVXJsSW5wdXQ6IGZ1bmN0aW9uIChjb250ZXh0TGlzdCwgZSkge1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZS5rZXlDb2RlO1xuICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnNlbGVjdE1lbnUubW92ZUl0ZW0uY2FsbCh0aGlzLCBjb250ZXh0TGlzdCwgLTEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51Lm1vdmVJdGVtLmNhbGwodGhpcywgY29udGV4dExpc3QsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMzogLy8gZW50ZXJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dExpc3QuaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0SGVhZGVyQm9va21hcmsuY2FsbCh0aGlzLCB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5nZXRJdGVtKGNvbnRleHRMaXN0LCBudWxsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldEhlYWRlckJvb2ttYXJrOiBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRBbmNob3IgPSB0aGlzLmNvbnRleHQuYW5jaG9yLmNhbGxlckNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGlkID0gaGVhZGVyLmlkIHx8ICdoXycgKyB0aGlzLl93Lk1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5yZXBsYWNlKC8uK1xcLi8sICcnKTtcbiAgICAgICAgaGVhZGVyLmlkID0gaWQ7XG4gICAgICAgIGNvbnRleHRBbmNob3IudXJsSW5wdXQudmFsdWUgPSAnIycgKyBpZDtcblxuICAgICAgICBpZiAoIWNvbnRleHRBbmNob3IuYW5jaG9yVGV4dC52YWx1ZS50cmltKCkgfHwgIWNvbnRleHRBbmNob3IuX2NoYW5nZSkge1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5hbmNob3JUZXh0LnZhbHVlID0gaGVhZGVyLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLnNldExpbmtQcmV2aWV3LmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci51cmxJbnB1dC52YWx1ZSk7XG4gICAgICAgIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51LmNsb3NlLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyQ29udGV4dCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hbmNob3IuY2FsbGVyQ29udGV4dC51cmxJbnB1dC5mb2N1cygpO1xuICAgIH0sXG5cbiAgICBvbkNoYW5nZUFuY2hvclRleHQ6IGZ1bmN0aW9uIChjb250ZXh0QW5jaG9yLCBlKSB7XG4gICAgICAgIGNvbnRleHRBbmNob3IuX2NoYW5nZSA9ICEhZS50YXJnZXQudmFsdWUudHJpbSgpO1xuICAgIH0sXG5cbiAgICBvbkNoYW5nZVVybElucHV0OiBmdW5jdGlvbiAoY29udGV4dEFuY2hvciwgZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5zZXRMaW5rUHJldmlldy5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IsIHZhbHVlKTtcblxuICAgICAgICBpZiAoL14jLy50ZXN0KHZhbHVlKSkgdGhpcy5wbHVnaW5zLmFuY2hvci5jcmVhdGVIZWFkZXJMaXN0LmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyQ29udGV4dCwgdmFsdWUpO1xuICAgICAgICBlbHNlIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51LmNsb3NlLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyQ29udGV4dCk7XG4gICAgfSxcblxuICAgIG9uRm9jdXNVcmxJbnB1dDogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIGNvbnRleHRMaW5rKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udGV4dEFuY2hvci51cmxJbnB1dC52YWx1ZTtcbiAgICAgICAgaWYgKC9eIy8udGVzdCh2YWx1ZSkpIHRoaXMucGx1Z2lucy5hbmNob3IuY3JlYXRlSGVhZGVyTGlzdC5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IsIGNvbnRleHRMaW5rLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIG9uQmx1clVybElucHV0OiBmdW5jdGlvbiAoY29udGV4dExpc3QpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNlbGVjdE1lbnUuY2xvc2UuY2FsbCh0aGlzLCBjb250ZXh0TGlzdCk7XG4gICAgfSxcblxuICAgIHNldExpbmtQcmV2aWV3OiBmdW5jdGlvbiAoY29udGV4dCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcHJldmlldyA9IGNvbnRleHQucHJldmlldztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMubGlua1Byb3RvY29sO1xuICAgICAgICBjb25zdCByZXNlcnZlZFByb3RvY29sICA9IC9eKG1haWx0b1xcOnx0ZWxcXDp8c21zXFw6fGh0dHBzKlxcOlxcL1xcL3wjKS8udGVzdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNhbWVQcm90b2NvbCA9ICFwcm90b2NvbCA/IGZhbHNlIDogdGhpcy5fdy5SZWdFeHAoJ14nICsgdmFsdWUuc3Vic3RyKDAsIHByb3RvY29sLmxlbmd0aCkpLnRlc3QocHJvdG9jb2wpO1xuICAgICAgICBjb250ZXh0LmxpbmtWYWx1ZSA9IHByZXZpZXcudGV4dENvbnRlbnQgPSAhdmFsdWUgPyAnJyA6IChwcm90b2NvbCAmJiAhcmVzZXJ2ZWRQcm90b2NvbCAmJiAhc2FtZVByb3RvY29sKSA/IHByb3RvY29sICsgdmFsdWUgOiByZXNlcnZlZFByb3RvY29sID8gdmFsdWUgOiAvXnd3d1xcLi8udGVzdCh2YWx1ZSkgPyAnaHR0cDovLycgKyB2YWx1ZSA6IHRoaXMuY29udGV4dC5hbmNob3IuaG9zdCArICgvXlxcLy8udGVzdCh2YWx1ZSkgPyAnJyA6ICcvJykgKyB2YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJvb2ttYXJrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNvbnRleHQuYm9va21hcmtCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuYm9va21hcmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LmJvb2ttYXJrQnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignIycpID09PSAtMSAmJiBjb250ZXh0LmRvd25sb2FkQ2hlY2suY2hlY2tlZCkge1xuICAgICAgICAgICAgY29udGV4dC5kb3dubG9hZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuZG93bmxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRDdHg6IGZ1bmN0aW9uIChhbmNob3IsIGNvbnRleHRBbmNob3IpIHtcbiAgICAgICAgaWYgKCFhbmNob3IpIHJldHVybjtcbiAgICAgICAgY29udGV4dEFuY2hvci5saW5rQW5jaG9yID0gYW5jaG9yO1xuICAgICAgICBjb250ZXh0QW5jaG9yLmxpbmtWYWx1ZSA9IGFuY2hvci5ocmVmO1xuICAgICAgICBjb250ZXh0QW5jaG9yLmN1cnJlbnRSZWwgPSBhbmNob3IucmVsLnNwbGl0KFwiIFwiKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlQW5jaG9yOiBmdW5jdGlvbiAoYW5jaG9yLCB1cmwsIGFsdCwgY29udGV4dEFuY2hvciwgbm90VGV4dCkge1xuICAgICAgICAvLyBkb3dubG9hZFxuICAgICAgICBpZiAoIS9eXFwjLy50ZXN0KHVybCkgJiYgY29udGV4dEFuY2hvci5kb3dubG9hZENoZWNrLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgYWx0IHx8IHVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IucmVtb3ZlQXR0cmlidXRlKCdkb3dubG9hZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbmV3IHdpbmRvd1xuICAgICAgICBpZiAoY29udGV4dEFuY2hvci5uZXdXaW5kb3dDaGVjay5jaGVja2VkKSBhbmNob3IudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGVsc2UgYW5jaG9yLnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyByZWxcbiAgICAgICAgY29uc3QgcmVsID0gY29udGV4dEFuY2hvci5jdXJyZW50UmVsLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKCFyZWwpIGFuY2hvci5yZW1vdmVBdHRyaWJ1dGUoJ3JlbCcpO1xuICAgICAgICBlbHNlIGFuY2hvci5yZWwgPSByZWw7XG5cbiAgICAgICAgLy8gZXN0IHVybCwgYWx0XG4gICAgICAgIGFuY2hvci5ocmVmID0gdXJsO1xuICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCdhbHQnLCBhbHQpO1xuICAgICAgICBpZiAobm90VGV4dCkge1xuICAgICAgICAgICAgaWYgKGFuY2hvci5jaGlsZHJlbi5sZW5ndGggPT09IDApIGFuY2hvci50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yLnRleHRDb250ZW50ID0gYWx0O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUFuY2hvcjogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIG5vdFRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHRBbmNob3IubGlua1ZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB1cmwgPSBjb250ZXh0QW5jaG9yLmxpbmtWYWx1ZTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gY29udGV4dEFuY2hvci5hbmNob3JUZXh0O1xuICAgICAgICBjb25zdCBhbmNob3JUZXh0ID0gYW5jaG9yLnZhbHVlLmxlbmd0aCA9PT0gMCA/IHVybCA6IGFuY2hvci52YWx1ZTtcblxuICAgICAgICBjb25zdCBvQSA9IGNvbnRleHRBbmNob3IubGlua0FuY2hvciB8fCB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnQScpO1xuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLnVwZGF0ZUFuY2hvcihvQSwgdXJsLCBhbmNob3JUZXh0LCBjb250ZXh0QW5jaG9yLCBub3RUZXh0KTtcblxuICAgICAgICBjb250ZXh0QW5jaG9yLmxpbmtWYWx1ZSA9IGNvbnRleHRBbmNob3IucHJldmlldy50ZXh0Q29udGVudCA9IGNvbnRleHRBbmNob3IudXJsSW5wdXQudmFsdWUgPSBjb250ZXh0QW5jaG9yLmFuY2hvclRleHQudmFsdWUgPSAnJztcblxuICAgICAgICByZXR1cm4gb0E7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfYm9va21hcmtCdXR0b246IGZ1bmN0aW9uIChjb250ZXh0QW5jaG9yKSB7XG4gICAgICAgIGxldCB1cmwgPSBjb250ZXh0QW5jaG9yLnVybElucHV0LnZhbHVlO1xuICAgICAgICBpZiAoL15cXCMvLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigxKTtcbiAgICAgICAgICAgIGNvbnRleHRBbmNob3IuYm9va21hcmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0QW5jaG9yLmJvb2ttYXJrQnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuc2VsZWN0TWVudS5jbG9zZS5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC5zZWxlY3RNZW51LmNhbGxlckNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsID0gJyMnICsgdXJsO1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5ib29rbWFyay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0QW5jaG9yLmJvb2ttYXJrQnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICBjb250ZXh0QW5jaG9yLmRvd25sb2FkQ2hlY2suY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5kb3dubG9hZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5jcmVhdGVIZWFkZXJMaXN0LmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgdGhpcy5jb250ZXh0LnNlbGVjdE1lbnUuY2FsbGVyQ29udGV4dCwgdXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRBbmNob3IudXJsSW5wdXQudmFsdWUgPSB1cmw7XG4gICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0TGlua1ByZXZpZXcuY2FsbCh0aGlzLCBjb250ZXh0QW5jaG9yLCB1cmwpO1xuICAgICAgICBjb250ZXh0QW5jaG9yLnVybElucHV0LmZvY3VzKCk7XG4gICAgfSxcblxuICAgIG9uQ2hhbmdlX25ld1dpbmRvd0NoZWNrOiBmdW5jdGlvbiAoY29udGV4dEFuY2hvciwgZSkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRleHRBbmNob3IubGlua0RlZmF1bHRSZWwuY2hlY2tfbmV3X3dpbmRvdyAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0UmVsLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgdGhpcy5wbHVnaW5zLmFuY2hvci5fcmVsTWVyZ2UuY2FsbCh0aGlzLCBjb250ZXh0QW5jaG9yLCBjb250ZXh0QW5jaG9yLmxpbmtEZWZhdWx0UmVsLmNoZWNrX25ld193aW5kb3cpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0UmVsLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgdGhpcy5wbHVnaW5zLmFuY2hvci5fcmVsRGVsZXRlLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci5saW5rRGVmYXVsdFJlbC5jaGVja19uZXdfd2luZG93KSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25DaGFuZ2VfZG93bmxvYWRDaGVjazogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIGUpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHRBbmNob3IuZG93bmxvYWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICBjb250ZXh0QW5jaG9yLmJvb2ttYXJrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dEFuY2hvci5ib29rbWFya0J1dHRvbiwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5saW5rVmFsdWUgPSBjb250ZXh0QW5jaG9yLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0QW5jaG9yLnVybElucHV0LnZhbHVlID0gY29udGV4dEFuY2hvci51cmxJbnB1dC52YWx1ZS5yZXBsYWNlKC9eXFwjKy8sICcnKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dEFuY2hvci5saW5rRGVmYXVsdFJlbC5jaGVja19ib29rbWFyayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLnNldFJlbC5jYWxsKHRoaXMsIGNvbnRleHRBbmNob3IsIHRoaXMucGx1Z2lucy5hbmNob3IuX3JlbE1lcmdlLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci5saW5rRGVmYXVsdFJlbC5jaGVja19ib29rbWFyaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dEFuY2hvci5kb3dubG9hZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZXh0QW5jaG9yLmxpbmtEZWZhdWx0UmVsLmNoZWNrX2Jvb2ttYXJrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0UmVsLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgdGhpcy5wbHVnaW5zLmFuY2hvci5fcmVsRGVsZXRlLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci5saW5rRGVmYXVsdFJlbC5jaGVja19ib29rbWFyaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZWxNZXJnZTogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IsIHJlbEF0dHIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGNvbnRleHRBbmNob3IuY3VycmVudFJlbDtcbiAgICAgICAgaWYgKCFyZWxBdHRyKSByZXR1cm4gY3VycmVudC5qb2luKCcgJyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoL15vbmx5XFw6Ly50ZXN0KHJlbEF0dHIpKSB7XG4gICAgICAgICAgICByZWxBdHRyID0gcmVsQXR0ci5yZXBsYWNlKC9eb25seVxcOi8sICcnKS50cmltKCk7XG4gICAgICAgICAgICBjb250ZXh0QW5jaG9yLmN1cnJlbnRSZWwgPSByZWxBdHRyLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVsQXR0cjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbHMgPSByZWxBdHRyLnNwbGl0KCcgJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZWxzLmxlbmd0aCwgaW5kZXg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaW5kZXggPSBjdXJyZW50LmluZGV4T2YocmVsc1tpXSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSBjdXJyZW50LnB1c2gocmVsc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudC5qb2luKCcgJyk7XG4gICAgfSxcblxuICAgIF9yZWxEZWxldGU6IGZ1bmN0aW9uIChjb250ZXh0QW5jaG9yLCByZWxBdHRyKSB7XG4gICAgICAgIGlmICghcmVsQXR0cikgcmV0dXJuIGNvbnRleHRBbmNob3IuY3VycmVudFJlbC5qb2luKCcgJyk7XG4gICAgICAgIGlmICgvXm9ubHlcXDovLnRlc3QocmVsQXR0cikpIHJlbEF0dHIgPSByZWxBdHRyLnJlcGxhY2UoL15vbmx5XFw6LywgJycpLnRyaW0oKTtcblxuICAgICAgICBjb25zdCByZWxzID0gY29udGV4dEFuY2hvci5jdXJyZW50UmVsLmpvaW4oJyAnKS5yZXBsYWNlKHRoaXMuX3cuUmVnRXhwKHJlbEF0dHIgKyAnXFxcXHMqJyksICcnKTtcbiAgICAgICAgY29udGV4dEFuY2hvci5jdXJyZW50UmVsID0gcmVscy5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4gcmVscztcbiAgICB9LFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKGNvbnRleHRBbmNob3IpIHtcbiAgICAgICAgY29udGV4dEFuY2hvci5saW5rQW5jaG9yID0gbnVsbDtcbiAgICAgICAgY29udGV4dEFuY2hvci5saW5rVmFsdWUgPSBjb250ZXh0QW5jaG9yLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0QW5jaG9yLnVybElucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIGNvbnRleHRBbmNob3IuYW5jaG9yVGV4dC52YWx1ZSA9ICcnO1xuICAgICAgICBjb250ZXh0QW5jaG9yLm5ld1dpbmRvd0NoZWNrLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgY29udGV4dEFuY2hvci5kb3dubG9hZENoZWNrLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgY29udGV4dEFuY2hvci5fY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGx1Z2lucy5hbmNob3Iuc2V0UmVsLmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgY29udGV4dEFuY2hvci5kZWZhdWx0UmVsKTtcbiAgICAgICAgaWYgKGNvbnRleHRBbmNob3IucmVsTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci50b2dnbGVSZWxMaXN0LmNhbGwodGhpcywgY29udGV4dEFuY2hvciwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5hbmNob3IuY2FsbGVyQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMucGx1Z2lucy5zZWxlY3RNZW51LmluaXQuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuc2VsZWN0TWVudS5jYWxsZXJDb250ZXh0KTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCBkaWFsb2cgZnJvbSAnLi4vbW9kdWxlcy9kaWFsb2cnO1xuaW1wb3J0IGFuY2hvciBmcm9tICcuLi9tb2R1bGVzL19hbmNob3InO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2xpbmsnLFxuICAgIGRpc3BsYXk6ICdkaWFsb2cnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29yZS5hZGRNb2R1bGUoW2RpYWxvZywgYW5jaG9yXSk7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29uc3QgY29udGV4dExpbmsgPSBjb250ZXh0LmxpbmsgPSB7XG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQ6IG51bGwsIC8vIEBPdmVycmlkZSBkaWFsb2cgLy8gVGhpcyBlbGVtZW50IGhhcyBmb2N1cyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLlxuICAgICAgICAgICAgX2xpbmtBbmNob3I6IG51bGwsXG4gICAgICAgICAgICBhbmNob3JDdHg6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogbGluayBkaWFsb2cgKi9cbiAgICAgICAgbGV0IGxpbmtfZGlhbG9nID0gdGhpcy5zZXREaWFsb2coY29yZSk7XG4gICAgICAgIGNvbnRleHRMaW5rLm1vZGFsID0gbGlua19kaWFsb2c7XG4gICAgICAgIFxuICAgICAgICAvKiogbGluayBjb250cm9sbGVyICovXG4gICAgICAgIGxldCBsaW5rX2NvbnRyb2xsZXIgPSB0aGlzLnNldENvbnRyb2xsZXJfTGlua0J1dHRvbihjb3JlKTtcbiAgICAgICAgY29udGV4dExpbmsubGlua0NvbnRyb2xsZXIgPSBsaW5rX2NvbnRyb2xsZXI7XG5cbiAgICAgICAgbGlua19kaWFsb2cucXVlcnlTZWxlY3RvcignZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuc3VibWl0LmJpbmQoY29yZSkpO1xuICAgICAgICBsaW5rX2NvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfbGlua0NvbnRyb2xsZXIuYmluZChjb3JlKSk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgIGNvbnRleHQuZGlhbG9nLm1vZGFsLmFwcGVuZENoaWxkKGxpbmtfZGlhbG9nKTtcblxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFwcGVuZENoaWxkKGxpbmtfY29udHJvbGxlcik7XG5cbiAgICAgICAgLyoqIGxpbmsgZXZlbnQgKi9cbiAgICAgICAgY29yZS5wbHVnaW5zLmFuY2hvci5pbml0RXZlbnQuY2FsbChjb3JlLCAnbGluaycsIGxpbmtfZGlhbG9nKTtcbiAgICAgICAgY29udGV4dExpbmsuZm9jdXNFbGVtZW50ID0gY29udGV4dC5hbmNob3IuY2FsbGVyLmxpbmsudXJsSW5wdXQ7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaW5rX2RpYWxvZyA9IG51bGwsIGxpbmtfY29udHJvbGxlciA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBkaWFsb2cgKi9cbiAgICBzZXREaWFsb2c6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuXG4gICAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAnc2UtZGlhbG9nLWNvbnRlbnQnO1xuICAgICAgICBkaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGV0IGh0bWwgPSAnJyArXG4gICAgICAgICAgICAnPGZvcm0+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjbG9zZVwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LmNsb3NlICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuY2FuY2VsICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1tb2RhbC10aXRsZVwiPicgKyBsYW5nLmRpYWxvZ0JveC5saW5rQm94LnRpdGxlICsgJzwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgY29yZS5jb250ZXh0LmFuY2hvci5mb3Jtcy5pbm5lckhUTUwgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZS1idG4tcHJpbWFyeVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICdcIj48c3Bhbj4nICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJzwvc3Bhbj48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9mb3JtPic7XG5cbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSxcblxuICAgIC8qKiBtb2RpZnkgY29udHJvbGxlciBidXR0b24gKi9cbiAgICBzZXRDb250cm9sbGVyX0xpbmtCdXR0b246IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGljb25zID0gY29yZS5pY29ucztcbiAgICAgICAgY29uc3QgbGlua19idG4gPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgbGlua19idG4uY2xhc3NOYW1lID0gJ3NlLWNvbnRyb2xsZXIgc2UtY29udHJvbGxlci1saW5rJztcbiAgICAgICAgbGlua19idG4uaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1hcnJvdyBzZS1hcnJvdy11cFwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJsaW5rLWNvbnRlbnRcIj48c3Bhbj48YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiXCI+PC9hPiZuYnNwOzwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWJ0bi1ncm91cFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwidXBkYXRlXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmVkaXQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5lZGl0ICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cInVubGlua1wiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy51bmxpbmsgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci51bmxpbmsgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiZGVsZXRlXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmRlbGV0ZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnJlbW92ZSArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgICAgcmV0dXJuIGxpbmtfYnRuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnbGluaycsICdsaW5rJyA9PT0gdGhpcy5jdXJyZW50Q29udHJvbGxlck5hbWUpO1xuICAgIH0sXG5cbiAgICBzdWJtaXQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG9BID0gdGhpcy5wbHVnaW5zLmFuY2hvci5jcmVhdGVBbmNob3IuY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuYW5jaG9yLmNhbGxlci5saW5rLCBmYWxzZSk7XG4gICAgXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRGb3JtYXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdCA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KHNlbGVjdGVkRm9ybWF0c1swXS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG9Gb3JtYXQuYXBwZW5kQ2hpbGQob0EpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5zZXJ0Tm9kZShvRm9ybWF0LCBudWxsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbnNlcnROb2RlKG9BLCBudWxsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKG9BLmNoaWxkTm9kZXNbMF0sIDAsIG9BLmNoaWxkTm9kZXNbMF0sIG9BLnRleHRDb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHNldCByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdGhpcy5jb250ZXh0LmxpbmsuX2xpbmtBbmNob3IuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKHRleHROb2RlLCAwLCB0ZXh0Tm9kZSwgdGV4dE5vZGUudGV4dENvbnRlbnQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cuY2xvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXJBcnJheS5pbmRleE9mKHRoaXMuY29udGV4dC5saW5rLmxpbmtDb250cm9sbGVyKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXRpbC5pc0FuY2hvcihlbGVtZW50KSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJykgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXJBcnJheS5pbmRleE9mKHRoaXMuY29udGV4dC5saW5rLmxpbmtDb250cm9sbGVyKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGluay5jYWxsX2NvbnRyb2xsZXIuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5vbi5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC5hbmNob3IuY2FsbGVyLmxpbmssIHVwZGF0ZSk7XG4gICAgfSxcblxuICAgIGNhbGxfY29udHJvbGxlcjogZnVuY3Rpb24gKHNlbGVjdGlvbkFUYWcpIHtcbiAgICAgICAgdGhpcy5lZGl0TGluayA9IHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yID0gdGhpcy5jb250ZXh0LmFuY2hvci5jYWxsZXIubGluay5saW5rQW5jaG9yID0gc2VsZWN0aW9uQVRhZztcbiAgICAgICAgY29uc3QgbGlua0J0biA9IHRoaXMuY29udGV4dC5saW5rLmxpbmtDb250cm9sbGVyO1xuICAgICAgICBjb25zdCBsaW5rID0gbGlua0J0bi5xdWVyeVNlbGVjdG9yKCdhJyk7XG5cbiAgICAgICAgbGluay5ocmVmID0gc2VsZWN0aW9uQVRhZy5ocmVmO1xuICAgICAgICBsaW5rLnRpdGxlID0gc2VsZWN0aW9uQVRhZy50ZXh0Q29udGVudDtcbiAgICAgICAgbGluay50ZXh0Q29udGVudCA9IHNlbGVjdGlvbkFUYWcudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHNlbGVjdGlvbkFUYWcsICdvbicpO1xuICAgICAgICB0aGlzLnNldENvbnRyb2xsZXJQb3NpdGlvbihsaW5rQnRuLCBzZWxlY3Rpb25BVGFnLCAnYm90dG9tJywge2xlZnQ6IDAsIHRvcDogMH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24obGlua0J0biwgc2VsZWN0aW9uQVRhZywgJ2xpbmsnLCB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLnV0aWwsIHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yLCAnb24nKSk7XG4gICAgfSxcblxuICAgIG9uQ2xpY2tfbGlua0NvbnRyb2xsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykgfHwgZS50YXJnZXQucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xuICAgICAgICBpZiAoIWNvbW1hbmQpIHJldHVybjtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKC91cGRhdGUvLnRlc3QoY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdsaW5rJywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL3VubGluay8udGVzdChjb21tYW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgc2MgPSB0aGlzLnV0aWwuZ2V0Q2hpbGRFbGVtZW50KHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCB8fCBjdXJyZW50Lm5vZGVUeXBlID09PSAzOyB9LCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBlYyA9IHRoaXMudXRpbC5nZXRDaGlsZEVsZW1lbnQodGhpcy5jb250ZXh0LmxpbmsuX2xpbmtBbmNob3IsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwIHx8IGN1cnJlbnQubm9kZVR5cGUgPT09IDM7IH0sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzYywgMCwgZWMsIGVjLnRleHRDb250ZW50Lmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobnVsbCwgbnVsbCwgWydBJ10sIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qKiBkZWxldGUgKi9cbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKHRoaXMuY29udGV4dC5saW5rLl9saW5rQW5jaG9yKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbmNob3IuY2FsbGVyLmxpbmsubGlua0FuY2hvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmxpbmsubGlua0NvbnRyb2xsZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5pbml0LmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmFuY2hvci5jYWxsZXIubGluayk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgZGlhbG9nIGZyb20gJy4uL21vZHVsZXMvZGlhbG9nJztcbmltcG9ydCBhbmNob3IgZnJvbSAnLi4vbW9kdWxlcy9fYW5jaG9yJztcbmltcG9ydCBjb21wb25lbnQgZnJvbSAnLi4vbW9kdWxlcy9jb21wb25lbnQnO1xuaW1wb3J0IHJlc2l6aW5nIGZyb20gJy4uL21vZHVsZXMvcmVzaXppbmcnO1xuaW1wb3J0IGZpbGVNYW5hZ2VyIGZyb20gJy4uL21vZHVsZXMvZmlsZU1hbmFnZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ltYWdlJyxcbiAgICBkaXNwbGF5OiAnZGlhbG9nJyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvcmUuYWRkTW9kdWxlKFtkaWFsb2csIGFuY2hvciwgY29tcG9uZW50LCByZXNpemluZywgZmlsZU1hbmFnZXJdKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb3JlLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IGNvbnRleHQuaW1hZ2UgPSB7XG4gICAgICAgICAgICBfaW5mb0xpc3Q6IFtdLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIF9pbmZvSW5kZXg6IDAsIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgX3VwbG9hZEZpbGVMZW5ndGg6IDAsIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgZm9jdXNFbGVtZW50OiBudWxsLCAvLyBAT3ZlcnJpZGUgZGlhbG9nIC8vIFRoaXMgZWxlbWVudCBoYXMgZm9jdXMgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZC5cbiAgICAgICAgICAgIHNpemVVbml0OiBvcHRpb25zLl9pbWFnZVNpemVVbml0LFxuICAgICAgICAgICAgX2xpbmtFbGVtZW50OiAnJyxcbiAgICAgICAgICAgIF9hbHRUZXh0OiAnJyxcbiAgICAgICAgICAgIF9hbGlnbjogJ25vbmUnLFxuICAgICAgICAgICAgX2Zsb2F0Q2xhc3NSZWdFeHA6ICdfX3NlX19mbG9hdFxcXFwtW2Etel0rJyxcbiAgICAgICAgICAgIF92X3NyYzoge19saW5rVmFsdWU6ICcnfSxcbiAgICAgICAgICAgIHN2Z0RlZmF1bHRTaXplOiAnMzAlJyxcbiAgICAgICAgICAgIGJhc2U2NFJlbmRlckluZGV4OiAwLFxuICAgICAgICAgICAgLy8gQHJlcXVpcmUgQE92ZXJyaWRlIGNvbXBvbmVudFxuICAgICAgICAgICAgX2VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICBfY292ZXI6IG51bGwsXG4gICAgICAgICAgICBfY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgLy8gQE92ZXJyaWRlIHJlc2l6aW5nIHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlucHV0WDogbnVsbCxcbiAgICAgICAgICAgIGlucHV0WTogbnVsbCxcbiAgICAgICAgICAgIF9lbGVtZW50X3c6IDEsXG4gICAgICAgICAgICBfZWxlbWVudF9oOiAxLFxuICAgICAgICAgICAgX2VsZW1lbnRfbDogMCxcbiAgICAgICAgICAgIF9lbGVtZW50X3Q6IDAsXG4gICAgICAgICAgICBfZGVmYXVsdFNpemVYOiAnYXV0bycsXG4gICAgICAgICAgICBfZGVmYXVsdFNpemVZOiAnYXV0bycsXG4gICAgICAgICAgICBfb3JpZ2luX3c6IG9wdGlvbnMuaW1hZ2VXaWR0aCA9PT0gJ2F1dG8nID8gJycgOiBvcHRpb25zLmltYWdlV2lkdGgsXG4gICAgICAgICAgICBfb3JpZ2luX2g6IG9wdGlvbnMuaW1hZ2VIZWlnaHQgPT09ICdhdXRvJyA/ICcnIDogb3B0aW9ucy5pbWFnZUhlaWdodCxcbiAgICAgICAgICAgIF9wcm9wb3J0aW9uQ2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAgIF9yZXNpemluZzogb3B0aW9ucy5pbWFnZVJlc2l6aW5nLFxuICAgICAgICAgICAgX3Jlc2l6ZURvdEhpZGU6ICFvcHRpb25zLmltYWdlSGVpZ2h0U2hvdyxcbiAgICAgICAgICAgIF9yb3RhdGlvbjogb3B0aW9ucy5pbWFnZVJvdGF0aW9uLFxuICAgICAgICAgICAgX29ubHlQZXJjZW50YWdlOiBvcHRpb25zLmltYWdlU2l6ZU9ubHlQZXJjZW50YWdlLFxuICAgICAgICAgICAgX3JhdGlvOiBmYWxzZSxcbiAgICAgICAgICAgIF9yYXRpb1g6IDEsXG4gICAgICAgICAgICBfcmF0aW9ZOiAxLFxuICAgICAgICAgICAgX2NhcHRpb25TaG93OiB0cnVlLFxuICAgICAgICAgICAgX2NhcHRpb25DaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgIF9jYXB0aW9uOiBudWxsLFxuICAgICAgICAgICAgY2FwdGlvbkNoZWNrRWw6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogaW1hZ2UgZGlhbG9nICovXG4gICAgICAgIGxldCBpbWFnZV9kaWFsb2cgPSB0aGlzLnNldERpYWxvZyhjb3JlKTtcbiAgICAgICAgY29udGV4dEltYWdlLm1vZGFsID0gaW1hZ2VfZGlhbG9nO1xuICAgICAgICBjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2VfZmlsZScpO1xuICAgICAgICBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZSA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX2ltYWdlX3VybCcpO1xuICAgICAgICBjb250ZXh0SW1hZ2UuZm9jdXNFbGVtZW50ID0gY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSB8fCBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZTtcbiAgICAgICAgY29udGV4dEltYWdlLmFsdFRleHQgPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV9hbHQnKTtcbiAgICAgICAgY29udGV4dEltYWdlLmNhcHRpb25DaGVja0VsID0gaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfaW1hZ2VfY2hlY2tfY2FwdGlvbicpO1xuICAgICAgICBjb250ZXh0SW1hZ2UucHJldmlld1NyYyA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYl9jb250ZW50X2ltYWdlIC5zZS1saW5rLXByZXZpZXcnKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWRpYWxvZy10YWJzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9wZW5UYWIuYmluZChjb3JlKSk7XG4gICAgICAgIGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCdmb3JtJykuYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgdGhpcy5zdWJtaXQuYmluZChjb3JlKSk7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlKSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWZpbGUtcmVtb3ZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9yZW1vdmVTZWxlY3RlZEZpbGVzLmJpbmQoY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSwgY29udGV4dEltYWdlLmltZ1VybEZpbGUsIGNvbnRleHRJbWFnZS5wcmV2aWV3U3JjKSk7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZSkgY29udGV4dEltYWdlLmltZ1VybEZpbGUuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9vbkxpbmtQcmV2aWV3LmJpbmQoY29udGV4dEltYWdlLnByZXZpZXdTcmMsIGNvbnRleHRJbWFnZS5fdl9zcmMsIG9wdGlvbnMubGlua1Byb3RvY29sKSk7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlICYmIGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSBjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2ZpbGVJbnB1dENoYW5nZS5iaW5kKGNvbnRleHRJbWFnZSkpO1xuXG4gICAgICAgIGNvbnN0IGltYWdlR2FsbGVyeUJ1dHRvbiA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX19zZV9fZ2FsbGVyeScpO1xuICAgICAgICBpZiAoaW1hZ2VHYWxsZXJ5QnV0dG9uKSBpbWFnZUdhbGxlcnlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vcGVuR2FsbGVyeS5iaW5kKGNvcmUpKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnRleHRJbWFnZS5wcm9wb3J0aW9uID0ge307XG4gICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFggPSB7fTtcbiAgICAgICAgY29udGV4dEltYWdlLmlucHV0WSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5pbWFnZVJlc2l6aW5nKSB7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UucHJvcG9ydGlvbiA9IGltYWdlX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX2ltYWdlX2NoZWNrX3Byb3BvcnRpb24nKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFggPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV9zaXplX3gnKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFkgPSBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV9pbWFnZV9zaXplX3knKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUgPSBvcHRpb25zLmltYWdlV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlID0gb3B0aW9ucy5pbWFnZUhlaWdodDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuc2V0SW5wdXRTaXplLmJpbmQoY29yZSwgJ3gnKSk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRZLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5zZXRJbnB1dFNpemUuYmluZChjb3JlLCAneScpKTtcblxuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNldFJhdGlvLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNldFJhdGlvLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLnByb3BvcnRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRSYXRpby5iaW5kKGNvcmUpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaW1hZ2VfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1kaWFsb2ctYnRuLXJldmVydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zaXplUmV2ZXJ0LmJpbmQoY29yZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgIGNvbnRleHQuZGlhbG9nLm1vZGFsLmFwcGVuZENoaWxkKGltYWdlX2RpYWxvZyk7XG5cbiAgICAgICAgLyoqIGxpbmsgZXZlbnQgKi9cbiAgICAgICAgY29yZS5wbHVnaW5zLmFuY2hvci5pbml0RXZlbnQuY2FsbChjb3JlLCAnaW1hZ2UnLCBpbWFnZV9kaWFsb2cucXVlcnlTZWxlY3RvcignLl9zZV90YWJfY29udGVudF91cmwnKSk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5hbmNob3JDdHggPSBjb3JlLmNvbnRleHQuYW5jaG9yLmNhbGxlci5pbWFnZTtcblxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIGltYWdlX2RpYWxvZyA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBkaWFsb2cgKi9cbiAgICBzZXREaWFsb2c6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgZGlhbG9nID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAnc2UtZGlhbG9nLWNvbnRlbnQgc2UtZGlhbG9nLWltYWdlJztcbiAgICAgICAgZGlhbG9nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgbGV0IGh0bWwgPSAnJyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1oZWFkZXJcIj4nICtcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiY2xvc2VcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctY2xvc2VcIiBjbGFzcz1cImNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guY2xvc2UgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2FuY2VsICtcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtbW9kYWwtdGl0bGVcIj4nICsgbGFuZy5kaWFsb2dCb3guaW1hZ2VCb3gudGl0bGUgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctdGFic1wiPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIl9zZV90YWJfbGluayBhY3RpdmVcIiBkYXRhLXRhYi1saW5rPVwiaW1hZ2VcIj4nICsgbGFuZy50b29sYmFyLmltYWdlICsgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIl9zZV90YWJfbGlua1wiIGRhdGEtdGFiLWxpbms9XCJ1cmxcIj4nICsgbGFuZy50b29sYmFyLmxpbmsgKyAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGZvcm0gbWV0aG9kPVwicG9zdFwiIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCI+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJfc2VfdGFiX2NvbnRlbnQgX3NlX3RhYl9jb250ZW50X2ltYWdlXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWJvZHlcIj48ZGl2IHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZCAjY2NjO1wiPic7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmltYWdlRmlsZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LmltYWdlQm94LmZpbGUgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybS1maWxlc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gX3NlX2ltYWdlX2ZpbGVcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIicgKyBvcHRpb24uaW1hZ2VBY2NlcHQgKyAnXCInICsgKG9wdGlvbi5pbWFnZU11bHRpcGxlRmlsZSA/ICcgbXVsdGlwbGU9XCJtdWx0aXBsZVwiJyA6ICcnKSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1maWxlcy1lZGdlLWJ1dHRvbiBzZS1maWxlLXJlbW92ZVwiIHRpdGxlPVwiJyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnXCI+JyArIGNvcmUuaWNvbnMuY2FuY2VsICsgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmltYWdlVXJsSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3guaW1hZ2VCb3gudXJsICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0tZmlsZXNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9XCJzZS1pbnB1dC1mb3JtIHNlLWlucHV0LXVybCBfc2VfaW1hZ2VfdXJsXCIgdHlwZT1cInRleHRcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcHRpb24uaW1hZ2VHYWxsZXJ5VXJsICYmIGNvcmUucGx1Z2lucy5pbWFnZUdhbGxlcnkpID8gJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1maWxlcy1lZGdlLWJ1dHRvbiBfX3NlX19nYWxsZXJ5XCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLmltYWdlR2FsbGVyeSArICdcIj4nICsgY29yZS5pY29ucy5pbWFnZV9nYWxsZXJ5ICsgJzwvYnV0dG9uPicgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cHJlIGNsYXNzPVwic2UtbGluay1wcmV2aWV3XCI+PC9wcmU+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LmltYWdlQm94LmFsdFRleHQgKyAnPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJzZS1pbnB1dC1mb3JtIF9zZV9pbWFnZV9hbHRcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbi5pbWFnZVJlc2l6aW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb25seVBlcmNlbnRhZ2UgPSBvcHRpb24uaW1hZ2VTaXplT25seVBlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgb25seVBlcmNlbnREaXNwbGF5ID0gb25seVBlcmNlbnRhZ2UgPyAnIHN0eWxlPVwiZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1wiJyA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodERpc3BsYXkgPSAhb3B0aW9uLmltYWdlSGVpZ2h0U2hvdyA/ICcgc3R5bGU9XCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCInIDogJyc7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmx5UGVyY2VudGFnZSB8fCAhb3B0aW9uLmltYWdlSGVpZ2h0U2hvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLXNpemUtdGV4dFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2l6ZS13XCI+JyArIGxhbmcuZGlhbG9nQm94LnNpemUgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctc2l6ZS10ZXh0XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzaXplLXdcIj4nICsgbGFuZy5kaWFsb2dCb3gud2lkdGggKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNlLWRpYWxvZy1zaXplLXhcIj4mbmJzcDs8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2l6ZS1oXCI+JyArIGxhbmcuZGlhbG9nQm94LmhlaWdodCArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWNvbnRyb2wgX3NlX2ltYWdlX3NpemVfeFwiIHBsYWNlaG9sZGVyPVwiYXV0b1wiJyArIChvbmx5UGVyY2VudGFnZSA/ICcgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIicgOiAndHlwZT1cInRleHRcIicpICsgKG9ubHlQZXJjZW50YWdlID8gJyBtYXg9XCIxMDBcIicgOiAnJykgKyAnIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNlLWRpYWxvZy1zaXplLXhcIicgKyBoZWlnaHREaXNwbGF5ICsgJz4nICsgKG9ubHlQZXJjZW50YWdlID8gJyUnIDogJ3gnKSArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNlLWlucHV0LWNvbnRyb2wgX3NlX2ltYWdlX3NpemVfeVwiIHBsYWNlaG9sZGVyPVwiYXV0b1wiJyArIG9ubHlQZXJjZW50RGlzcGxheSArIChvbmx5UGVyY2VudGFnZSA/ICcgbWF4PVwiMTAwXCInIDogJycpICsgaGVpZ2h0RGlzcGxheSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwnICsgb25seVBlcmNlbnREaXNwbGF5ICsgaGVpZ2h0RGlzcGxheSArICc+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1jaGVjayBfc2VfaW1hZ2VfY2hlY2tfcHJvcG9ydGlvblwiIGNoZWNrZWQvPiZuYnNwOycgKyBsYW5nLmRpYWxvZ0JveC5wcm9wb3J0aW9uICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnJldmVydEJ1dHRvbiArICdcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctYnRuLXJldmVydFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0O1wiPicgKyBjb3JlLmljb25zLnJldmVydCArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nIDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtIHNlLWRpYWxvZy1mb3JtLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1jaGVjayBfc2VfaW1hZ2VfY2hlY2tfY2FwdGlvblwiIC8+Jm5ic3A7JyArIGxhbmcuZGlhbG9nQm94LmNhcHRpb24gKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cIl9zZV90YWJfY29udGVudCBfc2VfdGFiX2NvbnRlbnRfdXJsXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+JyArXG4gICAgICAgICAgICAgICAgICAgIGNvcmUuY29udGV4dC5hbmNob3IuZm9ybXMuaW5uZXJIVE1MICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9vdGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1yYWRpb1wiIHZhbHVlPVwibm9uZVwiIGNoZWNrZWQ+JyArIGxhbmcuZGlhbG9nQm94LmJhc2ljICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VuZWRpdG9yX2ltYWdlX3JhZGlvXCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLXJhZGlvXCIgdmFsdWU9XCJsZWZ0XCI+JyArIGxhbmcuZGlhbG9nQm94LmxlZnQgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cImNlbnRlclwiPicgKyBsYW5nLmRpYWxvZ0JveC5jZW50ZXIgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cInJpZ2h0XCI+JyArIGxhbmcuZGlhbG9nQm94LnJpZ2h0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwic2UtYnRuLXByaW1hcnlcIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5zdWJtaXRCdXR0b24gKyAnXCI+PHNwYW4+JyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICc8L3NwYW4+PC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZm9ybT4nO1xuXG4gICAgICAgIGRpYWxvZy5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSxcblxuICAgIF9maWxlSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmltZ0lucHV0RmlsZS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pbWdVcmxGaWxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1NyYy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbWdVcmxGaWxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlld1NyYy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2gnO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9yZW1vdmVTZWxlY3RlZEZpbGVzOiBmdW5jdGlvbiAodXJsSW5wdXQsIHByZXZpZXdTcmMpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAodXJsSW5wdXQpIHtcbiAgICAgICAgICAgIHVybElucHV0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHByZXZpZXdTcmMuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfb3BlbkdhbGxlcnk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jYWxsUGx1Z2luKCdpbWFnZUdhbGxlcnknLCB0aGlzLnBsdWdpbnMuaW1hZ2VHYWxsZXJ5Lm9wZW4uYmluZCh0aGlzLCB0aGlzLnBsdWdpbnMuaW1hZ2UuX3NldFVybElucHV0LmJpbmQodGhpcy5jb250ZXh0LmltYWdlKSksIG51bGwpO1xuICAgIH0sXG5cbiAgICBfc2V0VXJsSW5wdXQ6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5hbHRUZXh0LnZhbHVlID0gdGFyZ2V0LmFsdDtcbiAgICAgICAgdGhpcy5fdl9zcmMuX2xpbmtWYWx1ZSA9IHRoaXMucHJldmlld1NyYy50ZXh0Q29udGVudCA9IHRoaXMuaW1nVXJsRmlsZS52YWx1ZSA9IHRhcmdldC5zcmM7XG4gICAgICAgIHRoaXMuaW1nVXJsRmlsZS5mb2N1cygpO1xuICAgIH0sXG5cbiAgICBfb25MaW5rUHJldmlldzogZnVuY3Rpb24gKGNvbnRleHQsIHByb3RvY29sLCBlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWUudHJpbSgpO1xuICAgICAgICBjb250ZXh0Ll9saW5rVmFsdWUgPSB0aGlzLnRleHRDb250ZW50ID0gIXZhbHVlID8gJycgOiAocHJvdG9jb2wgJiYgdmFsdWUuaW5kZXhPZignOi8vJykgPT09IC0xICYmIHZhbHVlLmluZGV4T2YoJyMnKSAhPT0gMCkgPyBwcm90b2NvbCArIHZhbHVlIDogdmFsdWUuaW5kZXhPZignOi8vJykgPT09IC0xID8gJy8nICsgdmFsdWUgOiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIEBSZXF1aXJlZCBmaWxlTWFuYWdlclxuICAgICAqL1xuICAgIGZpbGVUYWdzOiBbJ2ltZyddLFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmUsIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBjYWxsZWQgZnJvbSBjb3JlLnNlbGVjdENvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcbiAgICAgKi9cbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCBlbGVtZW50LCB0aGlzLnBsdWdpbnMucmVzaXppbmcuY2FsbF9jb250cm9sbGVyX3Jlc2l6ZS5jYWxsKHRoaXMsIGVsZW1lbnQsICdpbWFnZScpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWwgPSBlbGVtZW50IHx8IHRoaXMuY29udGV4dC5pbWFnZS5fZWxlbWVudDtcbiAgICAgICAgY29uc3QgaW1hZ2VDb250YWluZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChpbWFnZUVsLCB0aGlzLnV0aWwuaXNNZWRpYUNvbXBvbmVudCkgfHwgaW1hZ2VFbDtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gaW1hZ2VFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKSAqIDE7XG4gICAgICAgIGxldCBmb2N1c0VsID0gKGltYWdlQ29udGFpbmVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgaW1hZ2VDb250YWluZXIubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVtcHR5RGl2ID0gaW1hZ2VDb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oaW1hZ2VDb250YWluZXIpO1xuICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG5cbiAgICAgICAgaWYgKGVtcHR5RGl2ICE9PSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnKSB0aGlzLnV0aWwucmVtb3ZlSXRlbUFsbFBhcmVudHMoZW1wdHlEaXYsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOyB9LCBudWxsKTtcblxuICAgICAgICAvLyBmb2N1c1xuICAgICAgICB0aGlzLmZvY3VzRWRnZShmb2N1c0VsKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGV2ZW50XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5kZWxldGVJbmZvLmNhbGwodGhpcywgJ2ltYWdlJywgZGF0YUluZGV4LCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WC52YWx1ZSA9IGNvbnRleHRJbWFnZS5fb3JpZ2luX3cgPSB0aGlzLm9wdGlvbnMuaW1hZ2VXaWR0aCA9PT0gY29udGV4dEltYWdlLl9kZWZhdWx0U2l6ZVggPyAnJyA6IHRoaXMub3B0aW9ucy5pbWFnZVdpZHRoO1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSA9IGNvbnRleHRJbWFnZS5fb3JpZ2luX2ggPSB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQgPT09IGNvbnRleHRJbWFnZS5fZGVmYXVsdFNpemVZID8gJycgOiB0aGlzLm9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLmltZ0lucHV0RmlsZSAmJiB0aGlzLm9wdGlvbnMuaW1hZ2VNdWx0aXBsZUZpbGUpIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUuc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLmltYWdlTXVsdGlwbGVGaWxlKSBjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlLnJlbW92ZUF0dHJpYnV0ZSgnbXVsdGlwbGUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLm9uLmNhbGwodGhpcywgY29udGV4dEltYWdlLmFuY2hvckN0eCwgdXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdpbWFnZScsICdpbWFnZScgPT09IHRoaXMuY3VycmVudENvbnRyb2xsZXJOYW1lKTtcbiAgICB9LFxuXG4gICAgb3BlblRhYjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgbW9kYWwgPSB0aGlzLmNvbnRleHQuaW1hZ2UubW9kYWw7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSAoZSA9PT0gJ2luaXQnID8gbW9kYWwucXVlcnlTZWxlY3RvcignLl9zZV90YWJfbGluaycpIDogZS50YXJnZXQpO1xuXG4gICAgICAgIGlmICghL15CVVRUT04kL2kudGVzdCh0YXJnZXRFbGVtZW50LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNsYXJlIGFsbCB2YXJpYWJsZXNcbiAgICAgICAgY29uc3QgdGFiTmFtZSA9IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXRhYi1saW5rJyk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRDbGFzc05hbWUgPSAnX3NlX3RhYl9jb250ZW50JztcbiAgICAgICAgbGV0IGksIHRhYkNvbnRlbnQsIHRhYkxpbmtzO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgd2l0aCBjbGFzcz1cInRhYmNvbnRlbnRcIiBhbmQgaGlkZSB0aGVtXG4gICAgICAgIHRhYkNvbnRlbnQgPSBtb2RhbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNvbnRlbnRDbGFzc05hbWUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFiQ29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGFiQ29udGVudFtpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFsbCBlbGVtZW50cyB3aXRoIGNsYXNzPVwidGFibGlua3NcIiBhbmQgcmVtb3ZlIHRoZSBjbGFzcyBcImFjdGl2ZVwiXG4gICAgICAgIHRhYkxpbmtzID0gbW9kYWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnX3NlX3RhYl9saW5rJyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJMaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhYkxpbmtzW2ldLCAnYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHRoZSBjdXJyZW50IHRhYiwgYW5kIGFkZCBhbiBcImFjdGl2ZVwiIGNsYXNzIHRvIHRoZSBidXR0b24gdGhhdCBvcGVuZWQgdGhlIHRhYlxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuJyArIGNvbnRlbnRDbGFzc05hbWUgKyAnXycgKyB0YWJOYW1lKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRhcmdldEVsZW1lbnQsICdhY3RpdmUnKTtcblxuICAgICAgICAvLyBmb2N1c1xuICAgICAgICBpZiAodGFiTmFtZSA9PT0gJ2ltYWdlJyAmJiB0aGlzLmNvbnRleHQuaW1hZ2UuZm9jdXNFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW1hZ2UuZm9jdXNFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFiTmFtZSA9PT0gJ3VybCcpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbmNob3IuY2FsbGVyLmltYWdlLnVybElucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBjb25zdCBpbWFnZVBsdWdpbiA9IHRoaXMucGx1Z2lucy5pbWFnZTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9hbHRUZXh0ID0gY29udGV4dEltYWdlLmFsdFRleHQudmFsdWU7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fYWxpZ24gPSBjb250ZXh0SW1hZ2UubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiXTpjaGVja2VkJykudmFsdWU7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbkNoZWNrZWQgPSBjb250ZXh0SW1hZ2UuY2FwdGlvbkNoZWNrRWwuY2hlY2tlZDtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5fcmVzaXppbmcpIGNvbnRleHRJbWFnZS5fcHJvcG9ydGlvbkNoZWNrZWQgPSBjb250ZXh0SW1hZ2UucHJvcG9ydGlvbi5jaGVja2VkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCkge1xuICAgICAgICAgICAgICAgIGltYWdlUGx1Z2luLnVwZGF0ZV9pbWFnZS5jYWxsKHRoaXMsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlICYmIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICBpbWFnZVBsdWdpbi5zdWJtaXRBY3Rpb24uY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dEltYWdlLmltZ1VybEZpbGUgJiYgY29udGV4dEltYWdlLl92X3NyYy5fbGlua1ZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2VQbHVnaW4ub25SZW5kZXJfaW1nVXJsLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuaW1hZ2Uuc3VibWl0LmZhaWxdIGNhdXNlIDogXCInICsgZXJyb3IubWVzc2FnZSArICdcIicpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBzdWJtaXRBY3Rpb246IGZ1bmN0aW9uIChmaWxlTGlzdCkge1xuICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGZpbGVTaXplID0gMDtcbiAgICAgICAgbGV0IGZpbGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKC9pbWFnZS9pLnRlc3QoZmlsZUxpc3RbaV0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGVMaXN0W2ldKTtcbiAgICAgICAgICAgICAgICBmaWxlU2l6ZSArPSBmaWxlTGlzdFtpXS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGltaXRTaXplID0gdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkU2l6ZUxpbWl0O1xuICAgICAgICBpZiAobGltaXRTaXplID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZm9TaXplID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlc0luZm8gPSB0aGlzLmNvbnRleHQuaW1hZ2UuX2luZm9MaXN0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGltYWdlc0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpbmZvU2l6ZSArPSBpbWFnZXNJbmZvW2ldLnNpemUgKiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKGZpbGVTaXplICsgaW5mb1NpemUpID4gbGltaXRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSAnW1NVTkVESVRPUi5pbWFnZVVwbG9hZC5mYWlsXSBTaXplIG9mIHVwbG9hZGFibGUgdG90YWwgaW1hZ2VzOiAnICsgKGxpbWl0U2l6ZS8xMDAwKSArICdLQic7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEVycm9yKGVyciwgeyAnbGltaXRTaXplJzogbGltaXRTaXplLCAnY3VycmVudFNpemUnOiBpbmZvU2l6ZSwgJ3VwbG9hZFNpemUnOiBmaWxlU2l6ZSB9LCB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5ub3RpY2VPcGVuKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29udGV4dEltYWdlLl91cGxvYWRGaWxlTGVuZ3RoID0gZmlsZXMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5wbHVnaW5zLmFuY2hvci5jcmVhdGVBbmNob3IuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UuYW5jaG9yQ3R4LCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLFxuICAgICAgICAgICAgaW5wdXRXaWR0aDogY29udGV4dEltYWdlLmlucHV0WC52YWx1ZSxcbiAgICAgICAgICAgIGlucHV0SGVpZ2h0OiBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlLFxuICAgICAgICAgICAgYWxpZ246IGNvbnRleHRJbWFnZS5fYWxpZ24sXG4gICAgICAgICAgICBpc1VwZGF0ZTogdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGNvbnRleHRJbWFnZS5fZWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEJlZm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mdW5jdGlvbnMub25JbWFnZVVwbG9hZEJlZm9yZShmaWxlcywgaW5mbywgdGhpcywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiB0aGlzLl93LkFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5yZWdpc3Rlci5jYWxsKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS51cGxvYWQuY2FsbCh0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdy5BcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIGZpbGVzID0gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnVwbG9hZC5jYWxsKHRoaXMsIGluZm8sIGZpbGVzKTtcbiAgICB9LFxuXG4gICAgZXJyb3I6IGZ1bmN0aW9uIChtZXNzYWdlLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWRFcnJvciAhPT0gJ2Z1bmN0aW9uJyB8fCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkRXJyb3IobWVzc2FnZSwgcmVzcG9uc2UsIHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5ub3RpY2VPcGVuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IucGx1Z2luLmltYWdlLmVycm9yXSByZXNwb25zZTogJyArIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwbG9hZDogZnVuY3Rpb24gKGluZm8sIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmaWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5lcnJvci5jYWxsKHRoaXMsIGZpbGVzLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlVXBsb2FkVXJsID0gdGhpcy5vcHRpb25zLmltYWdlVXBsb2FkVXJsO1xuICAgICAgICBjb25zdCBmaWxlc0xlbiA9IHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPyAxIDogZmlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIHNlcnZlciB1cGxvYWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZVVwbG9hZFVybCA9PT0gJ3N0cmluZycgJiYgaW1hZ2VVcGxvYWRVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXNMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZS0nICsgaSwgZmlsZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnVwbG9hZC5jYWxsKHRoaXMsIGltYWdlVXBsb2FkVXJsLCB0aGlzLm9wdGlvbnMuaW1hZ2VVcGxvYWRIZWFkZXIsIGZvcm1EYXRhLCB0aGlzLnBsdWdpbnMuaW1hZ2UuY2FsbEJhY2tfaW1nVXBsb2FkLmJpbmQodGhpcywgaW5mbyksIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWRFcnJvcik7XG4gICAgICAgIH0gZWxzZSB7IC8vIGJhc2U2NFxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldHVwX3JlYWRlci5jYWxsKHRoaXMsIGZpbGVzLCBpbmZvLmFuY2hvciwgaW5mby5pbnB1dFdpZHRoLCBpbmZvLmlucHV0SGVpZ2h0LCBpbmZvLmFsaWduLCBmaWxlc0xlbiwgaW5mby5pc1VwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsbEJhY2tfaW1nVXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgeG1sSHR0cCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLmltYWdlVXBsb2FkSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMuaW1hZ2VVcGxvYWRIYW5kbGVyKHhtbEh0dHAsIGluZm8sIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuZXJyb3IuY2FsbCh0aGlzLCByZXNwb25zZS5lcnJvck1lc3NhZ2UsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoaW5mbywgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgZmlsZUxpc3QgPSByZXNwb25zZS5yZXN1bHQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aCwgZmlsZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0geyBuYW1lOiBmaWxlTGlzdFtpXS5uYW1lLCBzaXplOiBmaWxlTGlzdFtpXS5zaXplIH07XG4gICAgICAgICAgICBpZiAoaW5mby5pc1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS51cGRhdGVfc3JjLmNhbGwodGhpcywgZmlsZUxpc3RbaV0udXJsLCBpbmZvLmVsZW1lbnQsIGZpbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuY3JlYXRlX2ltYWdlLmNhbGwodGhpcywgZmlsZUxpc3RbaV0udXJsLCBpbmZvLmFuY2hvciwgaW5mby5pbnB1dFdpZHRoLCBpbmZvLmlucHV0SGVpZ2h0LCBpbmZvLmFsaWduLCBmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICB9LFxuXG4gICAgc2V0dXBfcmVhZGVyOiBmdW5jdGlvbiAoZmlsZXMsIGFuY2hvciwgd2lkdGgsIGhlaWdodCwgYWxpZ24sIGZpbGVzTGVuLCBpc1VwZGF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmJhc2U2NFJlbmRlckluZGV4ID0gZmlsZXNMZW47XG4gICAgICAgICAgICBjb25zdCB3RmlsZVJlYWRlciA9IHRoaXMuX3cuRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzU3RhY2sgPSBbZmlsZXNMZW5dO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmlucHV0WC52YWx1ZSA9IHdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmltYWdlLmlucHV0WS52YWx1ZSA9IGhlaWdodDtcbiAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByZWFkZXIsIGZpbGU7IGkgPCBmaWxlc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IHdGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgZmlsZSA9IGZpbGVzW2ldO1xuICAgIFxuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAocmVhZGVyLCB1cGRhdGUsIHVwZGF0ZUVsZW1lbnQsIGZpbGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzU3RhY2tbaW5kZXhdID0geyByZXN1bHQ6IHJlYWRlci5yZXN1bHQsIGZpbGU6IGZpbGUgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoLS10aGlzLmNvbnRleHQuaW1hZ2UuYmFzZTY0UmVuZGVySW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5vblJlbmRlcl9pbWdCYXNlNjQuY2FsbCh0aGlzLCB1cGRhdGUsIGZpbGVzU3RhY2ssIHVwZGF0ZUVsZW1lbnQsIGFuY2hvciwgd2lkdGgsIGhlaWdodCwgYWxpZ24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZWFkZXIsIGlzVXBkYXRlLCB0aGlzLmNvbnRleHQuaW1hZ2UuX2VsZW1lbnQsIGZpbGUsIGkpO1xuXG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5pbWFnZS5zZXR1cF9yZWFkZXIuZmFpbF0gY2F1c2UgOiBcIicgKyBlLm1lc3NhZ2UgKyAnXCInKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlbmRlcl9pbWdCYXNlNjQ6IGZ1bmN0aW9uICh1cGRhdGUsIGZpbGVzU3RhY2ssIHVwZGF0ZUVsZW1lbnQsIGFuY2hvciwgd2lkdGgsIGhlaWdodCwgYWxpZ24pIHtcbiAgICAgICAgY29uc3QgdXBkYXRlTWV0aG9kID0gdGhpcy5wbHVnaW5zLmltYWdlLnVwZGF0ZV9zcmM7XG4gICAgICAgIGNvbnN0IGNyZWF0ZU1ldGhvZCA9IHRoaXMucGx1Z2lucy5pbWFnZS5jcmVhdGVfaW1hZ2U7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZmlsZXNTdGFjay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbWFnZS5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZS1uYW1lJywgZmlsZXNTdGFja1tpXS5maWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbWFnZS5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZS1zaXplJywgZmlsZXNTdGFja1tpXS5maWxlLnNpemUpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU1ldGhvZC5jYWxsKHRoaXMsIGZpbGVzU3RhY2tbaV0ucmVzdWx0LCB1cGRhdGVFbGVtZW50LCBmaWxlc1N0YWNrW2ldLmZpbGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVNZXRob2QuY2FsbCh0aGlzLCBmaWxlc1N0YWNrW2ldLnJlc3VsdCwgYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCBhbGlnbiwgZmlsZXNTdGFja1tpXS5maWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlbmRlcl9pbWdVcmw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBpZiAoY29udGV4dEltYWdlLl92X3NyYy5fbGlua1ZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0ge25hbWU6IGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZS5zcGxpdCgnLycpLnBvcCgpLCBzaXplOiAwfTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsKSB0aGlzLnBsdWdpbnMuaW1hZ2UudXBkYXRlX3NyYy5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZSwgY29udGV4dEltYWdlLl9lbGVtZW50LCBmaWxlKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5wbHVnaW5zLmltYWdlLmNyZWF0ZV9pbWFnZS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fdl9zcmMuX2xpbmtWYWx1ZSwgdGhpcy5wbHVnaW5zLmFuY2hvci5jcmVhdGVBbmNob3IuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UuYW5jaG9yQ3R4LCB0cnVlKSwgY29udGV4dEltYWdlLmlucHV0WC52YWx1ZSwgY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSwgY29udGV4dEltYWdlLl9hbGlnbiwgZmlsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmltYWdlLlVSTFJlbmRlcmluZy5mYWlsXSBjYXVzZSA6IFwiJyArIGUubWVzc2FnZSArICdcIicpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlbmRlcl9saW5rOiBmdW5jdGlvbiAoaW1nVGFnLCBhbmNob3IpIHtcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZSgnZGF0YS1pbWFnZS1saW5rJywgJ2ltYWdlJyk7XG4gICAgICAgICAgICBpbWdUYWcuc2V0QXR0cmlidXRlKCdkYXRhLWltYWdlLWxpbmsnLCBhbmNob3IuaHJlZik7XG4gICAgICAgICAgICBhbmNob3IuYXBwZW5kQ2hpbGQoaW1nVGFnKTtcbiAgICAgICAgICAgIHJldHVybiBhbmNob3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW1nVGFnO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30geHkgJ3gnOiB3aWR0aCwgJ3knOiBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGUgRXZlbnQgb2JqZWN0XG4gICAgICovXG4gICAgc2V0SW5wdXRTaXplOiBmdW5jdGlvbiAoeHksIGUpIHtcbiAgICAgICAgaWYgKGUgJiYgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2V0SW5wdXRTaXplLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmltYWdlLCB4eSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFJhdGlvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fbW9kdWxlX3NldFJhdGlvLmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICovXG4gICAgY2hlY2tGaWxlSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbWFnZVBsdWdpbiA9IHRoaXMucGx1Z2lucy5pbWFnZTtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuXG4gICAgICAgIGNvbnN0IG1vZGlmeUhhbmRsZXIgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICBpbWFnZVBsdWdpbi5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCB0YWcsIG51bGwpO1xuICAgICAgICAgICAgaW1hZ2VQbHVnaW4ub3Blbk1vZGlmeS5jYWxsKHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgLy8gZ2V0IHNpemVcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUgPSBjb250ZXh0SW1hZ2UuX29yaWdpbl93O1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSA9IGNvbnRleHRJbWFnZS5fb3JpZ2luX2g7XG4gICAgICAgICAgICAvLyBnZXQgYWxpZ25cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMudXRpbC5nZXRGb3JtYXRFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBpZiAoZm9ybWF0KSBjb250ZXh0SW1hZ2UuX2FsaWduID0gZm9ybWF0LnN0eWxlLnRleHRBbGlnbiB8fCBmb3JtYXQuc3R5bGUuZmxvYXQ7XG4gICAgICAgICAgICAvLyBsaW5rXG4gICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGFnLCB0aGlzLnV0aWwuaXNBbmNob3IpO1xuICAgICAgICAgICAgaWYgKGxpbmsgJiYgIWNvbnRleHRJbWFnZS5hbmNob3JDdHgubGlua1ZhbHVlKSBjb250ZXh0SW1hZ2UuYW5jaG9yQ3R4LmxpbmtWYWx1ZSA9ICcgJztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaW1hZ2VQbHVnaW4udXBkYXRlX2ltYWdlLmNhbGwodGhpcywgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmNoZWNrSW5mby5jYWxsKHRoaXMsICdpbWFnZScsIFsnaW1nJ10sIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQsIG1vZGlmeUhhbmRsZXIsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICByZXNldEZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5yZXNldEluZm8uY2FsbCh0aGlzLCAnaW1hZ2UnLCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkKTtcbiAgICB9LFxuXG4gICAgY3JlYXRlX2ltYWdlOiBmdW5jdGlvbiAoc3JjLCBhbmNob3IsIHdpZHRoLCBoZWlnaHQsIGFsaWduLCBmaWxlKSB7XG4gICAgICAgIGNvbnN0IGltYWdlUGx1Z2luID0gdGhpcy5wbHVnaW5zLmltYWdlO1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZXNpemluZy5fcmVzaXplX3BsdWdpbiA9ICdpbWFnZSc7XG5cbiAgICAgICAgbGV0IG9JbWcgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnSU1HJyk7XG4gICAgICAgIG9JbWcuc3JjID0gc3JjO1xuICAgICAgICBvSW1nLmFsdCA9IGNvbnRleHRJbWFnZS5fYWx0VGV4dDtcbiAgICAgICAgb0ltZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcm90YXRlJywgJzAnKTtcbiAgICAgICAgYW5jaG9yID0gaW1hZ2VQbHVnaW4ub25SZW5kZXJfbGluay5jYWxsKHRoaXMsIG9JbWcsIGFuY2hvcik7XG5cbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5fcmVzaXppbmcpIHtcbiAgICAgICAgICAgIG9JbWcuc2V0QXR0cmlidXRlKCdkYXRhLXByb3BvcnRpb24nLCBjb250ZXh0SW1hZ2UuX3Byb3BvcnRpb25DaGVja2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBhbmNob3IpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBsdWdpbnMuY29tcG9uZW50LnNldF9jb250YWluZXIuY2FsbCh0aGlzLCBjb3ZlciwgJ3NlLWltYWdlLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIC8vIGNhcHRpb25cbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5fY2FwdGlvbkNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbiA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuY3JlYXRlX2NhcHRpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbi5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIGZhbHNlKTtcbiAgICAgICAgICAgIGNvdmVyLmFwcGVuZENoaWxkKGNvbnRleHRJbWFnZS5fY2FwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnQgPSBvSW1nO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyID0gY292ZXI7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyID0gY29udGFpbmVyO1xuXG4gICAgICAgIC8vIHNldCBzaXplXG4gICAgICAgIGltYWdlUGx1Z2luLmFwcGx5U2l6ZS5jYWxsKHRoaXMsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIC8vIGFsaWduXG4gICAgICAgIGltYWdlUGx1Z2luLnNldEFsaWduLmNhbGwodGhpcywgYWxpZ24sIG9JbWcsIGNvdmVyLCBjb250YWluZXIpO1xuXG4gICAgICAgIG9JbWcub25sb2FkID0gaW1hZ2VQbHVnaW4uX2ltYWdlX2NyZWF0ZV9vbmxvYWQuYmluZCh0aGlzLCBvSW1nLCBjb250ZXh0SW1hZ2Uuc3ZnRGVmYXVsdFNpemUsIGNvbnRhaW5lcik7XG4gICAgICAgIGlmICh0aGlzLmluc2VydENvbXBvbmVudChjb250YWluZXIsIHRydWUsIHRydWUsIHRydWUpKSB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuc2V0SW5mby5jYWxsKHRoaXMsICdpbWFnZScsIG9JbWcsIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQsIGZpbGUsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW4gPSAnJztcbiAgICB9LFxuXG4gICAgX2ltYWdlX2NyZWF0ZV9vbmxvYWQ6IGZ1bmN0aW9uIChvSW1nLCBzdmdEZWZhdWx0U2l6ZSwgY29udGFpbmVyKSB7XG4gICAgICAgIC8vIHN2ZyBleGNlcHRpb24gaGFuZGxpbmdcbiAgICAgICAgaWYgKG9JbWcub2Zmc2V0V2lkdGggPT09IDApIHRoaXMucGx1Z2lucy5pbWFnZS5hcHBseVNpemUuY2FsbCh0aGlzLCBzdmdEZWZhdWx0U2l6ZSwgJycpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1lZGlhQXV0b1NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQob0ltZywgJ2ltYWdlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5hcHBlbmRGb3JtYXRUYWcoY29udGFpbmVyLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UobGluZSwgMCwgbGluZSwgMCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlX2ltYWdlOiBmdW5jdGlvbiAoaW5pdCwgb3BlbkNvbnRyb2xsZXIsIG5vdEhpc3RvcnlQdXNoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgbGV0IGltYWdlRWwgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQ7XG4gICAgICAgIGxldCBjb3ZlciA9IGNvbnRleHRJbWFnZS5fY292ZXI7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBjb250ZXh0SW1hZ2UuX2NvbnRhaW5lcjtcbiAgICAgICAgbGV0IGlzTmV3Q29udGFpbmVyID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGNvdmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICBpc05ld0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBpbWFnZUVsID0gY29udGV4dEltYWdlLl9lbGVtZW50LmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgIGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBpbWFnZUVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvdmVyID0gY292ZXIuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgaW1hZ2VFbCA9IGNvdmVyLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaXNOZXdDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS1pbWFnZS1jb250YWluZXInKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc05ld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvdmVyKTtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIgPSBjb3ZlcjtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IGltYWdlRWw7XG4gICAgICAgICAgICBpc05ld0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgc2l6ZVxuICAgICAgICBsZXQgY2hhbmdlU2l6ZTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMudXRpbC5pc051bWJlcihjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlKSA/IGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUgKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlO1xuICAgICAgICBjb25zdCB5ID0gdGhpcy51dGlsLmlzTnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWUpID8gY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSArIGNvbnRleHRJbWFnZS5zaXplVW5pdCA6IGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWU7XG4gICAgICAgIGlmICgvJSQvLnRlc3QoaW1hZ2VFbC5zdHlsZS53aWR0aCkpIHtcbiAgICAgICAgICAgIGNoYW5nZVNpemUgPSB4ICE9PSBjb250YWluZXIuc3R5bGUud2lkdGggfHwgeSAhPT0gY29udGFpbmVyLnN0eWxlLmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZVNpemUgPSB4ICE9PSBpbWFnZUVsLnN0eWxlLndpZHRoIHx8IHkgIT09IGltYWdlRWwuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWx0XG4gICAgICAgIGltYWdlRWwuYWx0ID0gY29udGV4dEltYWdlLl9hbHRUZXh0O1xuICAgICAgICBcbiAgICAgICAgLy8gY2FwdGlvblxuICAgICAgICBsZXQgbW9kaWZpZWRDYXB0aW9uID0gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2NhcHRpb25DaGVja2VkKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRleHRJbWFnZS5fY2FwdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbiA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuY3JlYXRlX2NhcHRpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb3Zlci5hcHBlbmRDaGlsZChjb250ZXh0SW1hZ2UuX2NhcHRpb24pO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ2FwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLl9jYXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGV4dEltYWdlLl9jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ2FwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsaW5rXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMucGx1Z2lucy5hbmNob3IuY3JlYXRlQW5jaG9yLmNhbGwodGhpcywgY29udGV4dEltYWdlLmFuY2hvckN0eCwgdHJ1ZSk7XG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQgPSBjb250ZXh0SW1hZ2UuX2xpbmtFbGVtZW50ID09PSBhbmNob3IgPyBhbmNob3IuY2xvbmVOb2RlKGZhbHNlKSA6IGFuY2hvcjtcbiAgICAgICAgICAgIGNvdmVyLmluc2VydEJlZm9yZSh0aGlzLnBsdWdpbnMuaW1hZ2Uub25SZW5kZXJfbGluay5jYWxsKHRoaXMsIGltYWdlRWwsIGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQpLCBjb250ZXh0SW1hZ2UuX2NhcHRpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IGltYWdlRWw7XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWltYWdlLWxpbmsnLCAnJyk7XG4gICAgICAgICAgICBpZiAoY292ZXIuY29udGFpbnMoY29udGV4dEltYWdlLl9saW5rRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbCA9IGltYWdlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgY292ZXIucmVtb3ZlQ2hpbGQoY29udGV4dEltYWdlLl9saW5rRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY292ZXIuaW5zZXJ0QmVmb3JlKG5ld0VsLCBjb250ZXh0SW1hZ2UuX2NhcHRpb24pO1xuICAgICAgICAgICAgICAgIGltYWdlRWwgPSBuZXdFbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc05ld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RFbGVtZW50ID0gKHRoaXMudXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb250ZXh0SW1hZ2UuX2VsZW1lbnQucGFyZW50Tm9kZSkgfHwgdGhpcy51dGlsLmlzV3lzaXd5Z0Rpdihjb250ZXh0SW1hZ2UuX2VsZW1lbnQucGFyZW50Tm9kZSkpID8gXG4gICAgICAgICAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50IDogXG4gICAgICAgICAgICAgICAgL15BJC9pLnRlc3QoY29udGV4dEltYWdlLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZU5hbWUpID8gY29udGV4dEltYWdlLl9lbGVtZW50LnBhcmVudE5vZGUgOiB0aGlzLnV0aWwuZ2V0Rm9ybWF0RWxlbWVudChjb250ZXh0SW1hZ2UuX2VsZW1lbnQpIHx8IGNvbnRleHRJbWFnZS5fZWxlbWVudDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLnV0aWwuaXNGb3JtYXRFbGVtZW50KGV4aXN0RWxlbWVudCkgJiYgZXhpc3RFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIGV4aXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGV4dEltYWdlLl9lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBjbGVhbiBmb3JtYXQgdGFnXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUVtcHR5Tm9kZShleGlzdEVsZW1lbnQsIG51bGwpO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSBleGlzdEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy51dGlsLmh0bWxSZW1vdmVXaGl0ZVNwYWNlKGV4aXN0RWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51dGlsLmlzRm9ybWF0RWxlbWVudChleGlzdEVsZW1lbnQucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IGV4aXN0RWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50LnByZXZpb3VzU2libGluZyA/IGZvcm1hdHMubmV4dEVsZW1lbnRTaWJsaW5nIDogZm9ybWF0cyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKGV4aXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGltYWdlRWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IGltYWdlRWw7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyID0gY292ZXI7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyYW5zZm9ybVxuICAgICAgICBpZiAobW9kaWZpZWRDYXB0aW9uIHx8ICghY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSAmJiBjaGFuZ2VTaXplKSkge1xuICAgICAgICAgICAgaWYgKCFpbml0ICYmICgvXFxkKy8udGVzdChpbWFnZUVsLnN0eWxlLmhlaWdodCkgfHwgKHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwgJiYgY29udGV4dEltYWdlLl9jYXB0aW9uQ2hlY2tlZCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKC8lJC8udGVzdChjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlKSB8fCAvJSQvLnRlc3QoY29udGV4dEltYWdlLmlucHV0WS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnJlc2V0VHJhbnNmb3JtLmNhbGwodGhpcywgaW1hZ2VFbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnNldFRyYW5zZm9ybVNpemUuY2FsbCh0aGlzLCBpbWFnZUVsLCB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFgudmFsdWUsIDApLCB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvbnRleHRJbWFnZS5pbnB1dFkudmFsdWUsIDApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICBpbWFnZUVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wcm9wb3J0aW9uJywgY29udGV4dEltYWdlLl9wcm9wb3J0aW9uQ2hlY2tlZCk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5hcHBseVNpemUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsaWduXG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5zZXRBbGlnbi5jYWxsKHRoaXMsIG51bGwsIGltYWdlRWwsIG51bGwsIG51bGwpO1xuXG4gICAgICAgIC8vIHNldCBpbWFnZXNJbmZvXG4gICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIuc2V0SW5mby5jYWxsKHRoaXMsICdpbWFnZScsIGltYWdlRWwsIHRoaXMuZnVuY3Rpb25zLm9uSW1hZ2VVcGxvYWQsIG51bGwsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wZW5Db250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChpbWFnZUVsLCAnaW1hZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgaWYgKCFub3RIaXN0b3J5UHVzaCkgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVfc3JjOiBmdW5jdGlvbiAoc3JjLCBlbGVtZW50LCBmaWxlKSB7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gc3JjO1xuICAgICAgICB0aGlzLl93LnNldFRpbWVvdXQodGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uYmluZCh0aGlzLCAnaW1hZ2UnLCBlbGVtZW50LCB0aGlzLmZ1bmN0aW9ucy5vbkltYWdlVXBsb2FkLCBmaWxlLCB0cnVlKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGVsZW1lbnQsICdpbWFnZScpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIG9uTW9kaWZ5TW9kZTogZnVuY3Rpb24gKGVsZW1lbnQsIHNpemUpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fbGlua0VsZW1lbnQgPSBjb250ZXh0SW1hZ2UuYW5jaG9yQ3R4LmxpbmtBbmNob3IgPSAvXkEkL2kudGVzdChlbGVtZW50LnBhcmVudE5vZGUubm9kZU5hbWUpID8gZWxlbWVudC5wYXJlbnROb2RlIDogbnVsbDtcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgY29udGV4dEltYWdlLl9jb3ZlciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsICdGSUdVUkUnKTtcbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCB0aGlzLnV0aWwuaXNNZWRpYUNvbXBvbmVudCk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY2FwdGlvbiA9IHRoaXMudXRpbC5nZXRDaGlsZEVsZW1lbnQoY29udGV4dEltYWdlLl9jb3ZlciwgJ0ZJR0NBUFRJT04nKTtcbiAgICAgICAgY29udGV4dEltYWdlLl9hbGlnbiA9IGVsZW1lbnQuc3R5bGUuZmxvYXQgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nKSB8fCAnbm9uZSc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZmxvYXQgPSAnJztcbiAgICAgICAgdGhpcy5wbHVnaW5zLmFuY2hvci5zZXRDdHgoY29udGV4dEltYWdlLl9saW5rRWxlbWVudCwgY29udGV4dEltYWdlLmFuY2hvckN0eCk7XG5cbiAgICAgICAgaWYgKHNpemUpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudF93ID0gc2l6ZS53O1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50X2ggPSBzaXplLmg7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnRfdCA9IHNpemUudDtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudF9sID0gc2l6ZS5sO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVzZXJTaXplID0gY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykgfHwgY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKTtcbiAgICAgICAgbGV0IHcsIGg7XG4gICAgICAgIGlmICh1c2VyU2l6ZSkge1xuICAgICAgICAgICAgdXNlclNpemUgPSB1c2VyU2l6ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdyA9IHVzZXJTaXplWzBdO1xuICAgICAgICAgICAgaCA9IHVzZXJTaXplWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKHNpemUpIHtcbiAgICAgICAgICAgIHcgPSBzaXplLnc7XG4gICAgICAgICAgICBoID0gc2l6ZS5oO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9vcmlnaW5fdyA9IHcgfHwgZWxlbWVudC5zdHlsZS53aWR0aCB8fCBlbGVtZW50LndpZHRoIHx8ICcnO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX29yaWdpbl9oID0gaCB8fCBlbGVtZW50LnN0eWxlLmhlaWdodCB8fCBlbGVtZW50LmhlaWdodCB8fCAnJztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlTWFuYWdlciwgcmVzaXppbmdcbiAgICAgKi9cbiAgICBvcGVuTW9kaWZ5OiBmdW5jdGlvbiAobm90T3Blbikge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZSkge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl92X3NyYy5fbGlua1ZhbHVlID0gY29udGV4dEltYWdlLnByZXZpZXdTcmMudGV4dENvbnRlbnQgPSBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZS52YWx1ZSA9IGNvbnRleHRJbWFnZS5fZWxlbWVudC5zcmM7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dEltYWdlLl9hbHRUZXh0ID0gY29udGV4dEltYWdlLmFsdFRleHQudmFsdWUgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQuYWx0O1xuICAgICAgICBjb250ZXh0SW1hZ2UubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl9pbWFnZV9yYWRpb1wiXVt2YWx1ZT1cIicgKyBjb250ZXh0SW1hZ2UuX2FsaWduICsgJ1wiXScpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2FsaWduID0gY29udGV4dEltYWdlLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIl06Y2hlY2tlZCcpLnZhbHVlO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NhcHRpb25DaGVja2VkID0gY29udGV4dEltYWdlLmNhcHRpb25DaGVja0VsLmNoZWNrZWQgPSAhIWNvbnRleHRJbWFnZS5fY2FwdGlvbjtcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRNb2RpZnlJbnB1dFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UsIHRoaXMucGx1Z2lucy5pbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5vdE9wZW4pIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdpbWFnZScsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBhcHBseVNpemU6IGZ1bmN0aW9uICh3LCBoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcblxuICAgICAgICBpZiAoIXcpIHcgPSBjb250ZXh0SW1hZ2UuaW5wdXRYLnZhbHVlIHx8IHRoaXMub3B0aW9ucy5pbWFnZVdpZHRoO1xuICAgICAgICBpZiAoIWgpIGggPSBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlIHx8IHRoaXMub3B0aW9ucy5pbWFnZUhlaWdodDtcbiAgICAgICAgXG4gICAgICAgIGlmICgoY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSAmJiAhIXcpIHx8IC8lJC8udGVzdCh3KSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldFBlcmNlbnRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICgoIXcgfHwgdyA9PT0gJ2F1dG8nKSAmJiAoIWggfHwgaCA9PT0gJ2F1dG8nKSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldEF1dG9TaXplLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2Uuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2l6ZVJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zaXplUmV2ZXJ0LmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKHcsIGgsIG5vdFJlc2V0UGVyY2VudGFnZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgY29uc3Qgb25seVcgPSAvXihyd3xsdykkLy50ZXN0KGRpcmVjdGlvbik7XG4gICAgICAgIGNvbnN0IG9ubHlIID0gL14odGh8YmgpJC8udGVzdChkaXJlY3Rpb24pO1xuXG4gICAgICAgIGlmICghb25seUgpIHtcbiAgICAgICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMudXRpbC5pc051bWJlcih3KSA/IHcgKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiB3O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLmNhbmNlbFBlcmNlbnRBdHRyLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvbmx5Vykge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiAvJSQvLnRlc3QoaCkgPyAnJyA6IGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dEltYWdlLl9hbGlnbiA9PT0gJ2NlbnRlcicpIHRoaXMucGx1Z2lucy5pbWFnZS5zZXRBbGlnbi5jYWxsKHRoaXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICBpZiAoIW5vdFJlc2V0UGVyY2VudGFnZSkgY29udGV4dEltYWdlLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJyk7XG5cbiAgICAgICAgLy8gc2F2ZSBjdXJyZW50IHNpemVcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplLmNhbGwodGhpcywgY29udGV4dEltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0QXV0b1NpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuXG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5yZXNldFRyYW5zZm9ybS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fZWxlbWVudCk7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5jYW5jZWxQZXJjZW50QXR0ci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2VsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScsICdhdXRvLGF1dG8nKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UpO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0T3JpZ2luU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScpO1xuXG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5yZXNldFRyYW5zZm9ybS5jYWxsKHRoaXMsIGNvbnRleHRJbWFnZS5fZWxlbWVudCk7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5jYW5jZWxQZXJjZW50QXR0ci5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpblNpemUgPSAoY29udGV4dEltYWdlLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKSB8fCAnJykuc3BsaXQoJywnKTtcbiAgICAgICAgY29uc3QgdyA9IG9yaWdpblNpemVbMF07XG4gICAgICAgIGNvbnN0IGggPSBvcmlnaW5TaXplWzFdO1xuXG4gICAgICAgIGlmIChvcmlnaW5TaXplKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dEltYWdlLl9vbmx5UGVyY2VudGFnZSB8fCAoLyUkLy50ZXN0KHcpICYmICgvJSQvLnRlc3QoaCkgfHwgIS9cXGQvLnRlc3QoaCkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5zZXRQZXJjZW50U2l6ZS5jYWxsKHRoaXMsIHcsIGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2Uuc2V0U2l6ZS5jYWxsKHRoaXMsIHcsIGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2F2ZUN1cnJlbnRTaXplLmNhbGwodGhpcywgY29udGV4dEltYWdlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRQZXJjZW50U2l6ZTogZnVuY3Rpb24gKHcsIGgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBoID0gISFoICYmICEvJSQvLnRlc3QoaCkgJiYgIXRoaXMudXRpbC5nZXROdW1iZXIoaCwgMCkgPyB0aGlzLnV0aWwuaXNOdW1iZXIoaCkgPyBoICsgJyUnIDogaCA6IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0SW1hZ2Uuc2l6ZVVuaXQgOiAoaCB8fCAnJyk7XG4gICAgICAgIGNvbnN0IGhlaWdodFBlcmNlbnRhZ2UgPSAvJSQvLnRlc3QoaCk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLnV0aWwuaXNOdW1iZXIodykgPyB3ICsgJyUnIDogdztcbiAgICAgICAgY29udGV4dEltYWdlLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gIWhlaWdodFBlcmNlbnRhZ2UgPyAnJyA6IGg7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodFBlcmNlbnRhZ2UgPyAnJyA6IGg7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgY29udGV4dEltYWdlLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJywgdyArICcsJyArIGgpO1xuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuc2V0Q2FwdGlvblBvc2l0aW9uLmNhbGwodGhpcywgY29udGV4dEltYWdlLl9lbGVtZW50KTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBjYW5jZWxQZXJjZW50QXR0cjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0SW1hZ2UgPSB0aGlzLmNvbnRleHQuaW1hZ2U7XG4gICAgICAgIFxuICAgICAgICBjb250ZXh0SW1hZ2UuX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnO1xuXG4gICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0SW1hZ2UuX2NvbnRhaW5lciwgdGhpcy5jb250ZXh0LmltYWdlLl9mbG9hdENsYXNzUmVnRXhwKTtcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGNvbnRleHRJbWFnZS5fY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGNvbnRleHRJbWFnZS5fYWxpZ24pO1xuXG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLmltYWdlLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldEFsaWduOiBmdW5jdGlvbiAoYWxpZ24sIGVsZW1lbnQsIGNvdmVyLCBjb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEltYWdlID0gdGhpcy5jb250ZXh0LmltYWdlO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFhbGlnbikgYWxpZ24gPSBjb250ZXh0SW1hZ2UuX2FsaWduO1xuICAgICAgICBpZiAoIWVsZW1lbnQpIGVsZW1lbnQgPSBjb250ZXh0SW1hZ2UuX2VsZW1lbnQ7XG4gICAgICAgIGlmICghY292ZXIpIGNvdmVyID0gY29udGV4dEltYWdlLl9jb3ZlcjtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IGNvbnRleHRJbWFnZS5fY29udGFpbmVyO1xuXG4gICAgICAgIGlmIChhbGlnbiAmJiBhbGlnbiAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBjb3Zlci5zdHlsZS5tYXJnaW4gPSAnYXV0byc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb3Zlci5zdHlsZS5tYXJnaW4gPSAnMCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoLyUkLy50ZXN0KGVsZW1lbnQuc3R5bGUud2lkdGgpICYmIGFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUud2lkdGggPSBjb250YWluZXIuc3R5bGUud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSAnJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA/IChlbGVtZW50LnN0eWxlLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCkgOiAoKCFlbGVtZW50LnN0eWxlLndpZHRoIHx8IGVsZW1lbnQuc3R5bGUud2lkdGggPT09ICdhdXRvJykgPyAnJyA6IGVsZW1lbnQuc3R5bGUud2lkdGggfHwgJzEwMCUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy51dGlsLmhhc0NsYXNzKGNvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBhbGlnbikpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250YWluZXIsIGNvbnRleHRJbWFnZS5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGFsaWduKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nLCBhbGlnbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJbWFnZSA9IHRoaXMuY29udGV4dC5pbWFnZTtcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUpIGNvbnRleHRJbWFnZS5pbWdJbnB1dEZpbGUudmFsdWUgPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSBjb250ZXh0SW1hZ2UuX3Zfc3JjLl9saW5rVmFsdWUgPSBjb250ZXh0SW1hZ2UucHJldmlld1NyYy50ZXh0Q29udGVudCA9IGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlLnZhbHVlID0gJyc7XG4gICAgICAgIGlmIChjb250ZXh0SW1hZ2UuaW1nSW5wdXRGaWxlICYmIGNvbnRleHRJbWFnZS5pbWdVcmxGaWxlKSB7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW1nVXJsRmlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UucHJldmlld1NyYy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dEltYWdlLmFsdFRleHQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dEltYWdlLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfaW1hZ2VfcmFkaW9cIl1bdmFsdWU9XCJub25lXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIGNvbnRleHRJbWFnZS5jYXB0aW9uQ2hlY2tFbC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnRleHRJbWFnZS5fZWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMucGx1Z2lucy5pbWFnZS5vcGVuVGFiLmNhbGwodGhpcywgJ2luaXQnKTtcblxuICAgICAgICBpZiAoY29udGV4dEltYWdlLl9yZXNpemluZykge1xuICAgICAgICAgICAgY29udGV4dEltYWdlLmlucHV0WC52YWx1ZSA9IHRoaXMub3B0aW9ucy5pbWFnZVdpZHRoID09PSBjb250ZXh0SW1hZ2UuX2RlZmF1bHRTaXplWCA/ICcnIDogdGhpcy5vcHRpb25zLmltYWdlV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuaW5wdXRZLnZhbHVlID0gdGhpcy5vcHRpb25zLmltYWdlSGVpZ2h0ID09PSBjb250ZXh0SW1hZ2UuX2RlZmF1bHRTaXplWSA/ICcnIDogdGhpcy5vcHRpb25zLmltYWdlSGVpZ2h0O1xuICAgICAgICAgICAgY29udGV4dEltYWdlLnByb3BvcnRpb24uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX3JhdGlvID0gZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX3JhdGlvWCA9IDE7XG4gICAgICAgICAgICBjb250ZXh0SW1hZ2UuX3JhdGlvWSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnMuYW5jaG9yLmluaXQuY2FsbCh0aGlzLCBjb250ZXh0SW1hZ2UuYW5jaG9yQ3R4KTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCBkaWFsb2cgZnJvbSAnLi4vbW9kdWxlcy9kaWFsb2cnO1xuaW1wb3J0IGNvbXBvbmVudCBmcm9tICcuLi9tb2R1bGVzL2NvbXBvbmVudCc7XG5pbXBvcnQgcmVzaXppbmcgZnJvbSAnLi4vbW9kdWxlcy9yZXNpemluZyc7XG5pbXBvcnQgZmlsZU1hbmFnZXIgZnJvbSAnLi4vbW9kdWxlcy9maWxlTWFuYWdlcic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAndmlkZW8nLFxuICAgIGRpc3BsYXk6ICdkaWFsb2cnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29yZS5hZGRNb2R1bGUoW2RpYWxvZywgY29tcG9uZW50LCByZXNpemluZywgZmlsZU1hbmFnZXJdKTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSBjb250ZXh0LnZpZGVvID0ge1xuICAgICAgICAgICAgX2luZm9MaXN0OiBbXSwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBfaW5mb0luZGV4OiAwLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIF91cGxvYWRGaWxlTGVuZ3RoOiAwLCAvLyBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgICAgICAgIGZvY3VzRWxlbWVudDogbnVsbCwgLy8gQE92ZXJyaWRlIGRpYWxvZyAvLyBUaGlzIGVsZW1lbnQgaGFzIGZvY3VzIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuZWQuXG4gICAgICAgICAgICBzaXplVW5pdDogb3B0aW9ucy5fdmlkZW9TaXplVW5pdCxcbiAgICAgICAgICAgIF9hbGlnbjogJ25vbmUnLFxuICAgICAgICAgICAgX2Zsb2F0Q2xhc3NSZWdFeHA6ICdfX3NlX19mbG9hdFxcXFwtW2Etel0rJyxcbiAgICAgICAgICAgIF95b3V0dWJlUXVlcnk6IG9wdGlvbnMueW91dHViZVF1ZXJ5LFxuICAgICAgICAgICAgX3ZpZGVvUmF0aW86IChvcHRpb25zLnZpZGVvUmF0aW8gKiAxMDApICsgJyUnLFxuICAgICAgICAgICAgX2RlZmF1bHRSYXRpbzogKG9wdGlvbnMudmlkZW9SYXRpbyAqIDEwMCkgKyAnJScsXG4gICAgICAgICAgICBfbGlua1ZhbHVlOiAnJyxcbiAgICAgICAgICAgIC8vIEByZXF1aXJlIEBPdmVycmlkZSBjb21wb25lbnRcbiAgICAgICAgICAgIF9lbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgX2NvdmVyOiBudWxsLFxuICAgICAgICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIC8vIEBPdmVycmlkZSByZXNpemluZyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpbnB1dFg6IG51bGwsXG4gICAgICAgICAgICBpbnB1dFk6IG51bGwsXG4gICAgICAgICAgICBfZWxlbWVudF93OiAxLFxuICAgICAgICAgICAgX2VsZW1lbnRfaDogMSxcbiAgICAgICAgICAgIF9lbGVtZW50X2w6IDAsXG4gICAgICAgICAgICBfZWxlbWVudF90OiAwLFxuICAgICAgICAgICAgX2RlZmF1bHRTaXplWDogJzEwMCUnLFxuICAgICAgICAgICAgX2RlZmF1bHRTaXplWTogKG9wdGlvbnMudmlkZW9SYXRpbyAqIDEwMCkgKyAnJScsXG4gICAgICAgICAgICBfb3JpZ2luX3c6IG9wdGlvbnMudmlkZW9XaWR0aCA9PT0gJzEwMCUnID8gJycgOiBvcHRpb25zLnZpZGVvV2lkdGgsXG4gICAgICAgICAgICBfb3JpZ2luX2g6IG9wdGlvbnMudmlkZW9IZWlnaHQgPT09ICc1Ni4yNSUnID8gJycgOiBvcHRpb25zLnZpZGVvSGVpZ2h0LFxuICAgICAgICAgICAgX3Byb3BvcnRpb25DaGVja2VkOiB0cnVlLFxuICAgICAgICAgICAgX3Jlc2l6aW5nOiBvcHRpb25zLnZpZGVvUmVzaXppbmcsXG4gICAgICAgICAgICBfcmVzaXplRG90SGlkZTogIW9wdGlvbnMudmlkZW9IZWlnaHRTaG93LFxuICAgICAgICAgICAgX3JvdGF0aW9uOiBvcHRpb25zLnZpZGVvUm90YXRpb24sXG4gICAgICAgICAgICBfb25seVBlcmNlbnRhZ2U6IG9wdGlvbnMudmlkZW9TaXplT25seVBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBfcmF0aW86IGZhbHNlLFxuICAgICAgICAgICAgX3JhdGlvWDogMSxcbiAgICAgICAgICAgIF9yYXRpb1k6IDEsXG4gICAgICAgICAgICBfY2FwdGlvblNob3c6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIHZpZGVvIGRpYWxvZyAqL1xuICAgICAgICBsZXQgdmlkZW9fZGlhbG9nID0gdGhpcy5zZXREaWFsb2coY29yZSk7XG4gICAgICAgIGNvbnRleHRWaWRlby5tb2RhbCA9IHZpZGVvX2RpYWxvZztcbiAgICAgICAgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdmlkZW9fZmlsZScpO1xuICAgICAgICBjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1pbnB1dC11cmwnKTtcbiAgICAgICAgY29udGV4dFZpZGVvLmZvY3VzRWxlbWVudCA9IGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUgfHwgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlO1xuICAgICAgICBjb250ZXh0VmlkZW8ucHJldmlldyA9IHZpZGVvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtbGluay1wcmV2aWV3Jyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpKTtcbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSkgdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3JlbW92ZVNlbGVjdGVkRmlsZXMuYmluZChjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUsIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUsIGNvbnRleHRWaWRlby5wcmV2aWV3KSk7XG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUgJiYgY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSkgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2ZpbGVJbnB1dENoYW5nZS5iaW5kKGNvbnRleHRWaWRlbykpO1xuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSkgY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uTGlua1ByZXZpZXcuYmluZChjb250ZXh0VmlkZW8ucHJldmlldywgY29udGV4dFZpZGVvLCBvcHRpb25zLmxpbmtQcm90b2NvbCkpO1xuXG4gICAgICAgIGNvbnRleHRWaWRlby5wcm9wb3J0aW9uID0ge307XG4gICAgICAgIGNvbnRleHRWaWRlby52aWRlb1JhdGlvT3B0aW9uID0ge307XG4gICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFggPSB7fTtcbiAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy52aWRlb1Jlc2l6aW5nKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbiA9IHZpZGVvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX3ZpZGVvX2NoZWNrX3Byb3BvcnRpb24nKTtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby52aWRlb1JhdGlvT3B0aW9uID0gdmlkZW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS12aWRlby1yYXRpbycpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WCA9IHZpZGVvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX3ZpZGVvX3NpemVfeCcpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WSA9IHZpZGVvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuX3NlX3ZpZGVvX3NpemVfeScpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSA9IG9wdGlvbnMudmlkZW9XaWR0aDtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkudmFsdWUgPSBvcHRpb25zLnZpZGVvSGVpZ2h0O1xuXG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRYLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5zZXRJbnB1dFNpemUuYmluZChjb3JlLCAneCcpKTtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnNldElucHV0U2l6ZS5iaW5kKGNvcmUsICd5JykpO1xuXG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRYLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc2V0UmF0aW8uYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuc2V0UmF0aW8uYmluZChjb3JlKSk7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLnNldFJhdGlvLmJpbmQoY29yZSkpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnZpZGVvUmF0aW9PcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5zZXRWaWRlb1JhdGlvLmJpbmQoY29yZSkpO1xuXG4gICAgICAgICAgICB2aWRlb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWRpYWxvZy1idG4tcmV2ZXJ0JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNpemVSZXZlcnQuYmluZChjb3JlKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWwuYXBwZW5kQ2hpbGQodmlkZW9fZGlhbG9nKTtcblxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIHZpZGVvX2RpYWxvZyA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBkaWFsb2cgKi9cbiAgICBzZXREaWFsb2c6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgZGlhbG9nID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAnc2UtZGlhbG9nLWNvbnRlbnQnO1xuICAgICAgICBkaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGV0IGh0bWwgPSAnJyArXG4gICAgICAgICAgICAnPGZvcm0gbWV0aG9kPVwicG9zdFwiIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCI+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctaGVhZGVyXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjbG9zZVwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LmNsb3NlICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5jYW5jZWwgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLW1vZGFsLXRpdGxlXCI+JyArIGxhbmcuZGlhbG9nQm94LnZpZGVvQm94LnRpdGxlICsgJzwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctYm9keVwiPic7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnZpZGVvRmlsZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybVwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94LnZpZGVvQm94LmZpbGUgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtLWZpbGVzXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9XCJzZS1pbnB1dC1mb3JtIF9zZV92aWRlb19maWxlXCIgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCInICsgb3B0aW9uLnZpZGVvQWNjZXB0ICsgJ1wiJyArIChvcHRpb24udmlkZW9NdWx0aXBsZUZpbGUgPyAnIG11bHRpcGxlPVwibXVsdGlwbGVcIicgOiAnJykgKyAnLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImZpbGVzUmVtb3ZlXCIgY2xhc3M9XCJzZS1idG4gc2UtZGlhbG9nLWZpbGVzLWVkZ2UtYnV0dG9uIHNlLWZpbGUtcmVtb3ZlXCIgdGl0bGU9XCInICsgbGFuZy5jb250cm9sbGVyLnJlbW92ZSArICdcIj4nICsgY29yZS5pY29ucy5jYW5jZWwgKyAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgO1xuICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnZpZGVvVXJsSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gudmlkZW9Cb3gudXJsICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCBjbGFzcz1cInNlLWlucHV0LWZvcm0gc2UtaW5wdXQtdXJsXCIgdHlwZT1cInRleHRcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cHJlIGNsYXNzPVwic2UtbGluay1wcmV2aWV3XCI+PC9wcmU+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb24udmlkZW9SZXNpemluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdGlvTGlzdCA9IG9wdGlvbi52aWRlb1JhdGlvTGlzdCB8fCBbe25hbWU6ICcxNjo5JywgdmFsdWU6IDAuNTYyNX0sIHtuYW1lOiAnNDozJywgdmFsdWU6IDAuNzV9LCB7bmFtZTogJzIxOjknLCB2YWx1ZTogMC40Mjg1fV07XG4gICAgICAgICAgICAgICAgY29uc3QgcmF0aW8gPSBvcHRpb24udmlkZW9SYXRpbztcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGVyY2VudGFnZSA9IG9wdGlvbi52aWRlb1NpemVPbmx5UGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5UGVyY2VudERpc3BsYXkgPSBvbmx5UGVyY2VudGFnZSA/ICcgc3R5bGU9XCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCInIDogJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0RGlzcGxheSA9ICFvcHRpb24udmlkZW9IZWlnaHRTaG93ID8gJyBzdHlsZT1cImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcIicgOiAnJztcbiAgICAgICAgICAgICAgICBjb25zdCByYXRpb0Rpc3BsYXkgPSAhb3B0aW9uLnZpZGVvUmF0aW9TaG93ID8gJyBzdHlsZT1cImRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcIicgOiAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBvbmx5V2lkdGhEaXNwbGF5ID0gIW9ubHlQZXJjZW50YWdlICYmICFvcHRpb24udmlkZW9IZWlnaHRTaG93ICYmICFvcHRpb24udmlkZW9SYXRpb1Nob3cgPyAnIHN0eWxlPVwiZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1wiJyA6ICcnO1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJycgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1zaXplLXRleHRcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2l6ZS13XCI+JyArIGxhbmcuZGlhbG9nQm94LndpZHRoICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNlLWRpYWxvZy1zaXplLXhcIj4mbmJzcDs8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9XCJzaXplLWhcIicgKyBoZWlnaHREaXNwbGF5ICsgJz4nICsgbGFuZy5kaWFsb2dCb3guaGVpZ2h0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz1cInNpemUtaFwiJyArIHJhdGlvRGlzcGxheSArICc+KCcgKyBsYW5nLmRpYWxvZ0JveC5yYXRpbyArICcpPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgY2xhc3M9XCJzZS1pbnB1dC1jb250cm9sIF9zZV92aWRlb19zaXplX3hcIiBwbGFjZWhvbGRlcj1cIjEwMCVcIicgKyAob25seVBlcmNlbnRhZ2UgPyAnIHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCInIDogJ3R5cGU9XCJ0ZXh0XCInKSArIChvbmx5UGVyY2VudGFnZSA/ICcgbWF4PVwiMTAwXCInIDogJycpICsgJy8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGNsYXNzPVwic2UtZGlhbG9nLXNpemUteFwiJyArIG9ubHlXaWR0aERpc3BsYXkgKyAnPicgKyAob25seVBlcmNlbnRhZ2UgPyAnJScgOiAneCcpICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtY29udHJvbCBfc2VfdmlkZW9fc2l6ZV95XCIgcGxhY2Vob2xkZXI9XCInICsgKG9wdGlvbi52aWRlb1JhdGlvICogMTAwKSArICclXCInICsgKG9ubHlQZXJjZW50YWdlID8gJyB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiJyA6ICd0eXBlPVwidGV4dFwiJykgKyAob25seVBlcmNlbnRhZ2UgPyAnIG1heD1cIjEwMFwiJyA6ICcnKSArIGhlaWdodERpc3BsYXkgKyAnLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c2VsZWN0IGNsYXNzPVwic2UtaW5wdXQtc2VsZWN0IHNlLXZpZGVvLXJhdGlvXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3gucmF0aW8gKyAnXCInICsgcmF0aW9EaXNwbGF5ICsgJz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0RGlzcGxheSkgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPiAtIDwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhdGlvTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIHJhdGlvTGlzdFtpXS52YWx1ZSArICdcIicgKyAocmF0aW8udG9TdHJpbmcoKSA9PT0gcmF0aW9MaXN0W2ldLnZhbHVlLnRvU3RyaW5nKCkgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+JyArIHJhdGlvTGlzdFtpXS5uYW1lICsgJzwvb3B0aW9uPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3gucmV2ZXJ0QnV0dG9uICsgJ1wiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1idG4tcmV2ZXJ0XCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7XCI+JyArIGNvcmUuaWNvbnMucmV2ZXJ0ICsgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm0gc2UtZGlhbG9nLWZvcm0tZm9vdGVyXCInICsgb25seVBlcmNlbnREaXNwbGF5ICsgb25seVdpZHRoRGlzcGxheSArICc+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tY2hlY2sgX3NlX3ZpZGVvX2NoZWNrX3Byb3BvcnRpb25cIiBjaGVja2VkLz4mbmJzcDsnICsgbGFuZy5kaWFsb2dCb3gucHJvcG9ydGlvbiArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIiBjbGFzcz1cInNlLWRpYWxvZy1idG4tcmFkaW9cIiB2YWx1ZT1cIm5vbmVcIiBjaGVja2VkPicgKyBsYW5nLmRpYWxvZ0JveC5iYXNpYyArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1bmVkaXRvcl92aWRlb19yYWRpb1wiIGNsYXNzPVwic2UtZGlhbG9nLWJ0bi1yYWRpb1wiIHZhbHVlPVwibGVmdFwiPicgKyBsYW5nLmRpYWxvZ0JveC5sZWZ0ICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VuZWRpdG9yX3ZpZGVvX3JhZGlvXCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLXJhZGlvXCIgdmFsdWU9XCJjZW50ZXJcIj4nICsgbGFuZy5kaWFsb2dCb3guY2VudGVyICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3VuZWRpdG9yX3ZpZGVvX3JhZGlvXCIgY2xhc3M9XCJzZS1kaWFsb2ctYnRuLXJhZGlvXCIgdmFsdWU9XCJyaWdodFwiPicgKyBsYW5nLmRpYWxvZ0JveC5yaWdodCArICc8L2xhYmVsPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNlLWJ0bi1wcmltYXJ5XCIgdGl0bGU9XCInICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJ1wiPjxzcGFuPicgKyBsYW5nLmRpYWxvZ0JveC5zdWJtaXRCdXR0b24gKyAnPC9zcGFuPjwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Zvcm0+JztcblxuICAgICAgICBkaWFsb2cuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICByZXR1cm4gZGlhbG9nO1xuICAgIH0sXG5cbiAgICBfZmlsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb0lucHV0RmlsZS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3LnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvVXJsRmlsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcmVtb3ZlU2VsZWN0ZWRGaWxlczogZnVuY3Rpb24gKHVybElucHV0LCBwcmV2aWV3KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICAgICAgaWYgKHVybElucHV0KSB7XG4gICAgICAgICAgICB1cmxJbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICBwcmV2aWV3LnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uTGlua1ByZXZpZXc6IGZ1bmN0aW9uIChjb250ZXh0LCBwcm90b2NvbCwgZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKC9ePGlmcmFtZS4qXFwvaWZyYW1lPiQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250ZXh0Ll9saW5rVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSAnPElGcmFtZSA6c3JjPVwiLi5cIj48L0lGcmFtZT4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5fbGlua1ZhbHVlID0gdGhpcy50ZXh0Q29udGVudCA9ICF2YWx1ZSA/ICcnIDogKHByb3RvY29sICYmIHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSAmJiB2YWx1ZS5pbmRleE9mKCcjJykgIT09IDApID8gcHJvdG9jb2wgKyB2YWx1ZSA6IHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSA/ICcvJyArIHZhbHVlIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3NldFRhZ0F0dHJzOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY29udHJvbHMnLCB0cnVlKTtcblxuICAgICAgICBjb25zdCBhdHRycyA9IHRoaXMub3B0aW9ucy52aWRlb1RhZ0F0dHJzO1xuICAgICAgICBpZiAoIWF0dHJzKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGF0dHJzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXRpbC5oYXNPd24oYXR0cnMsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyc1trZXldKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVWaWRlb1RhZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB2aWRlb1RhZyA9IHRoaXMudXRpbC5jcmVhdGVFbGVtZW50KCdWSURFTycpO1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uX3NldFRhZ0F0dHJzLmNhbGwodGhpcywgdmlkZW9UYWcpO1xuICAgICAgICByZXR1cm4gdmlkZW9UYWc7XG4gICAgfSxcblxuICAgIF9zZXRJZnJhbWVBdHRyczogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5mcmFtZUJvcmRlciA9ICcwJztcbiAgICAgICAgZWxlbWVudC5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGF0dHJzID0gdGhpcy5vcHRpb25zLnZpZGVvSWZyYW1lQXR0cnM7XG4gICAgICAgIGlmICghYXR0cnMpIHJldHVybjtcblxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy51dGlsLmhhc093bihhdHRycywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIGF0dHJzW2tleV0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUlmcmFtZVRhZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpZnJhbWVUYWcgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnSUZSQU1FJyk7XG4gICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5fc2V0SWZyYW1lQXR0cnMuY2FsbCh0aGlzLCBpZnJhbWVUYWcpO1xuICAgICAgICByZXR1cm4gaWZyYW1lVGFnO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgQFJlcXVpcmVkIGZpbGVNYW5hZ2VyXG4gICAgICovXG4gICAgZmlsZVRhZ3M6IFsnaWZyYW1lJywgJ3ZpZGVvJ10sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgY29yZSwgcmVzaXppbmcsIGZpbGVNYW5hZ2VyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGNhbGxlZCBmcm9tIGNvcmUuc2VsZWN0Q29tcG9uZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudFxuICAgICAqL1xuICAgIHNlbGVjdDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLm9uTW9kaWZ5TW9kZS5jYWxsKHRoaXMsIGVsZW1lbnQsIHRoaXMucGx1Z2lucy5yZXNpemluZy5jYWxsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwodGhpcywgZWxlbWVudCwgJ3ZpZGVvJykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXIsIHJlc2l6aW5nXG4gICAgICovXG4gICAgZGVzdHJveTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBlbGVtZW50IHx8IHRoaXMuY29udGV4dC52aWRlby5fZWxlbWVudDtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250ZXh0LnZpZGVvLl9jb250YWluZXI7XG4gICAgICAgIGNvbnN0IGRhdGFJbmRleCA9IGZyYW1lLmdldEF0dHJpYnV0ZSgnZGF0YS1pbmRleCcpICogMTtcbiAgICAgICAgbGV0IGZvY3VzRWwgPSAoY29udGFpbmVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgY29udGFpbmVyLm5leHRFbGVtZW50U2libGluZyk7XG5cbiAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuXG4gICAgICAgIGlmIChlbXB0eURpdiAhPT0gdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5ZykgdGhpcy51dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKGVtcHR5RGl2LCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMDsgfSwgbnVsbCk7XG5cbiAgICAgICAgLy8gZm9jdXNcbiAgICAgICAgdGhpcy5mb2N1c0VkZ2UoZm9jdXNFbCk7XG5cbiAgICAgICAgLy8gZXZlbnRcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmRlbGV0ZUluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBkYXRhSW5kZXgsIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWQpO1xuXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcblxuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSA9IGNvbnRleHRWaWRlby5fb3JpZ2luX3cgPSB0aGlzLm9wdGlvbnMudmlkZW9XaWR0aCA9PT0gY29udGV4dFZpZGVvLl9kZWZhdWx0U2l6ZVggPyAnJyA6IHRoaXMub3B0aW9ucy52aWRlb1dpZHRoO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSA9IGNvbnRleHRWaWRlby5fb3JpZ2luX2ggPSB0aGlzLm9wdGlvbnMudmlkZW9IZWlnaHQgPT09IGNvbnRleHRWaWRlby5fZGVmYXVsdFNpemVZID8gJycgOiB0aGlzLm9wdGlvbnMudmlkZW9IZWlnaHQ7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlICYmIHRoaXMub3B0aW9ucy52aWRlb011bHRpcGxlRmlsZSkgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLnZpZGVvTXVsdGlwbGVGaWxlKSBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUucmVtb3ZlQXR0cmlidXRlKCdtdWx0aXBsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby5fcmVzaXppbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRWaWRlb1JhdGlvU2VsZWN0LmNhbGwodGhpcywgY29udGV4dFZpZGVvLl9vcmlnaW5faCB8fCBjb250ZXh0VmlkZW8uX2RlZmF1bHRSYXRpbyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICd2aWRlbycsICd2aWRlbycgPT09IHRoaXMuY3VycmVudENvbnRyb2xsZXJOYW1lKTtcbiAgICB9LFxuICAgIFxuICAgIHNldFZpZGVvUmF0aW86IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgY29uc3QgdmFsdWUgPSBlLnRhcmdldC5vcHRpb25zW2UudGFyZ2V0LnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuXG4gICAgICAgIGNvbnRleHRWaWRlby5fZGVmYXVsdFNpemVZID0gY29udGV4dFZpZGVvLl92aWRlb1JhdGlvID0gIXZhbHVlID8gY29udGV4dFZpZGVvLl9kZWZhdWx0U2l6ZVkgOiAodmFsdWUgKiAxMDApICsgJyUnO1xuICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnBsYWNlaG9sZGVyID0gIXZhbHVlID8gJycgOiAodmFsdWUgKiAxMDApICsgJyUnO1xuICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlID0gJyc7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB4eSAneCc6IHdpZHRoLCAneSc6IGhlaWdodFxuICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZSBFdmVudCBvYmplY3RcbiAgICAgKi9cbiAgICBzZXRJbnB1dFNpemU6IGZ1bmN0aW9uICh4eSwgZSkge1xuICAgICAgICBpZiAoZSAmJiBlLmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIHRoaXMucGx1Z2lucy5yZXNpemluZy5fbW9kdWxlX3NldElucHV0U2l6ZS5jYWxsKHRoaXMsIGNvbnRleHRWaWRlbywgeHkpO1xuXG4gICAgICAgIGlmICh4eSA9PT0gJ3knKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0VmlkZW9SYXRpb1NlbGVjdC5jYWxsKHRoaXMsIGUudGFyZ2V0LnZhbHVlIHx8IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRSYXRpbzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRSYXRpby5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC52aWRlbyk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb25zdCB2aWRlb1BsdWdpbiA9IHRoaXMucGx1Z2lucy52aWRlbztcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29udGV4dFZpZGVvLl9hbGlnbiA9IGNvbnRleHRWaWRlby5tb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3VuZWRpdG9yX3ZpZGVvX3JhZGlvXCJdOmNoZWNrZWQnKS52YWx1ZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSAmJiBjb250ZXh0VmlkZW8udmlkZW9JbnB1dEZpbGUuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICB2aWRlb1BsdWdpbi5zdWJtaXRBY3Rpb24uY2FsbCh0aGlzLCB0aGlzLmNvbnRleHQudmlkZW8udmlkZW9JbnB1dEZpbGUuZmlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlICYmIGNvbnRleHRWaWRlby5fbGlua1ZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgdmlkZW9QbHVnaW4uc2V0dXBfdXJsLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IudmlkZW8uc3VibWl0LmZhaWxdIGNhdXNlIDogXCInICsgZXJyb3IubWVzc2FnZSArICdcIicpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBzdWJtaXRBY3Rpb246IGZ1bmN0aW9uIChmaWxlTGlzdCkge1xuICAgICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGZpbGVTaXplID0gMDtcbiAgICAgICAgbGV0IGZpbGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmaWxlTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKC92aWRlby9pLnRlc3QoZmlsZUxpc3RbaV0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGZpbGVMaXN0W2ldKTtcbiAgICAgICAgICAgICAgICBmaWxlU2l6ZSArPSBmaWxlTGlzdFtpXS5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGltaXRTaXplID0gdGhpcy5vcHRpb25zLnZpZGVvVXBsb2FkU2l6ZUxpbWl0O1xuICAgICAgICBpZiAobGltaXRTaXplID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZm9TaXplID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvc0luZm8gPSB0aGlzLmNvbnRleHQudmlkZW8uX2luZm9MaXN0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHZpZGVvc0luZm8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpbmZvU2l6ZSArPSB2aWRlb3NJbmZvW2ldLnNpemUgKiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKGZpbGVTaXplICsgaW5mb1NpemUpID4gbGltaXRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSAnW1NVTkVESVRPUi52aWRlb1VwbG9hZC5mYWlsXSBTaXplIG9mIHVwbG9hZGFibGUgdG90YWwgdmlkZW9zOiAnICsgKGxpbWl0U2l6ZS8xMDAwKSArICdLQic7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkRXJyb3IgIT09ICdmdW5jdGlvbicgfHwgdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEVycm9yKGVyciwgeyAnbGltaXRTaXplJzogbGltaXRTaXplLCAnY3VycmVudFNpemUnOiBpbmZvU2l6ZSwgJ3VwbG9hZFNpemUnOiBmaWxlU2l6ZSB9LCB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9ucy5ub3RpY2VPcGVuKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgY29udGV4dFZpZGVvLl91cGxvYWRGaWxlTGVuZ3RoID0gZmlsZXMubGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgICAgICBpbnB1dFdpZHRoOiBjb250ZXh0VmlkZW8uaW5wdXRYLnZhbHVlLFxuICAgICAgICAgICAgaW5wdXRIZWlnaHQ6IGNvbnRleHRWaWRlby5pbnB1dFkudmFsdWUsXG4gICAgICAgICAgICBhbGlnbjogY29udGV4dFZpZGVvLl9hbGlnbixcbiAgICAgICAgICAgIGlzVXBkYXRlOiB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsLFxuICAgICAgICAgICAgZWxlbWVudDogY29udGV4dFZpZGVvLl9lbGVtZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkQmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkQmVmb3JlKGZpbGVzLCBpbmZvLCB0aGlzLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIHRoaXMuX3cuQXJyYXkuaXNBcnJheShkYXRhLnJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnVwbG9hZC5jYWxsKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQubGVuZ3RoID4gMCkgZmlsZXMgPSByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8udXBsb2FkLmNhbGwodGhpcywgaW5mbywgZmlsZXMpO1xuICAgIH0sXG5cbiAgICBlcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mdW5jdGlvbnMub25WaWRlb1VwbG9hZEVycm9yICE9PSAnZnVuY3Rpb24nIHx8IHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWRFcnJvcihtZXNzYWdlLCByZXNwb25zZSwgdGhpcykpIHtcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zLm5vdGljZU9wZW4obWVzc2FnZSk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5wbHVnaW4udmlkZW8uZXJyb3JdIHJlc3BvbnNlOiAnICsgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgZmlsZXMpIHtcbiAgICAgICAgaWYgKCFmaWxlcykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZpbGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmVycm9yLmNhbGwodGhpcywgZmlsZXMsIG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlkZW9VcGxvYWRVcmwgPSB0aGlzLm9wdGlvbnMudmlkZW9VcGxvYWRVcmw7XG4gICAgICAgIGNvbnN0IGZpbGVzTGVuID0gdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCA/IDEgOiBmaWxlcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gc2VydmVyIHVwbG9hZFxuICAgICAgICBpZiAodHlwZW9mIHZpZGVvVXBsb2FkVXJsID09PSAnc3RyaW5nJyAmJiB2aWRlb1VwbG9hZFVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlLScgKyBpLCBmaWxlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIudXBsb2FkLmNhbGwodGhpcywgdmlkZW9VcGxvYWRVcmwsIHRoaXMub3B0aW9ucy52aWRlb1VwbG9hZEhlYWRlciwgZm9ybURhdGEsIHRoaXMucGx1Z2lucy52aWRlby5jYWxsQmFja192aWRlb1VwbG9hZC5iaW5kKHRoaXMsIGluZm8pLCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkRXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IudmlkZW9VcGxvYWQuZmFpbF0gY2F1c2UgOiBUaGVyZSBpcyBubyBcInZpZGVvVXBsb2FkVXJsXCIgb3B0aW9uLicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNhbGxCYWNrX3ZpZGVvVXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgeG1sSHR0cCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLnZpZGVvVXBsb2FkSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMudmlkZW9VcGxvYWRIYW5kbGVyKHhtbEh0dHAsIGluZm8sIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uZXJyb3IuY2FsbCh0aGlzLCByZXNwb25zZS5lcnJvck1lc3NhZ2UsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoaW5mbywgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgZmlsZUxpc3QgPSByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IHZpZGVvVGFnID0gdGhpcy5wbHVnaW5zLnZpZGVvLmNyZWF0ZVZpZGVvVGFnLmNhbGwodGhpcyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aCwgZmlsZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0geyBuYW1lOiBmaWxlTGlzdFtpXS5uYW1lLCBzaXplOiBmaWxlTGlzdFtpXS5zaXplIH07XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uY3JlYXRlX3ZpZGVvLmNhbGwodGhpcywgKGluZm8uaXNVcGRhdGUgPyBpbmZvLmVsZW1lbnQgOiB2aWRlb1RhZy5jbG9uZU5vZGUoZmFsc2UpKSwgZmlsZUxpc3RbaV0udXJsLCBpbmZvLmlucHV0V2lkdGgsIGluZm8uaW5wdXRIZWlnaHQsIGluZm8uYWxpZ24sIGZpbGUsIGluZm8uaXNVcGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICB9LFxuXG4gICAgc2V0dXBfdXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgICAgICBsZXQgdXJsID0gY29udGV4dFZpZGVvLl9saW5rVmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIC8qKiBpZnJhbWUgc291cmNlICovXG4gICAgICAgICAgICBpZiAoL148aWZyYW1lLipcXC9pZnJhbWU+JC8udGVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb0lmcmFtZSA9IChuZXcgdGhpcy5fdy5ET01QYXJzZXIoKSkucGFyc2VGcm9tU3RyaW5nKHVybCwgJ3RleHQvaHRtbCcpLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuICAgICAgICAgICAgICAgIHVybCA9IG9JZnJhbWUuc3JjO1xuICAgICAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiB5b3V0dWJlICovXG4gICAgICAgICAgICBpZiAoL3lvdXR1XFwuP2JlLy50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB1cmwgPSAnaHR0cHM6Ly8nICsgdXJsO1xuICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCd3YXRjaD92PScsICcnKTtcbiAgICAgICAgICAgICAgICBpZiAoIS9eXFwvXFwvLitcXC9lbWJlZFxcLy8udGVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKHVybC5tYXRjaCgvXFwvXFwvLitcXC8vKVswXSwgJy8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycpLnJlcGxhY2UoJyYnLCAnPyYnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFZpZGVvLl95b3V0dWJlUXVlcnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoL1xcPy8udGVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFVybCA9IHVybC5zcGxpdCgnPycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gc3BsaXRVcmxbMF0gKyAnPycgKyBjb250ZXh0VmlkZW8uX3lvdXR1YmVRdWVyeSArICcmJyArIHNwbGl0VXJsWzFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICc/JyArIGNvbnRleHRWaWRlby5feW91dHViZVF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgvdmltZW9cXC5jb20vLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgICAgIGlmICh1cmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycgKyB1cmwuc2xpY2UodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmNyZWF0ZV92aWRlby5jYWxsKHRoaXMsIHRoaXMucGx1Z2lucy52aWRlby5jcmVhdGVJZnJhbWVUYWcuY2FsbCh0aGlzKSwgdXJsLCBjb250ZXh0VmlkZW8uaW5wdXRYLnZhbHVlLCBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlLCBjb250ZXh0VmlkZW8uX2FsaWduLCBudWxsLCB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLnZpZGVvLnVwbG9hZC5mYWlsXSBjYXVzZSA6IFwiJyArIGVycm9yLm1lc3NhZ2UgKyAnXCInKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlX3ZpZGVvOiBmdW5jdGlvbiAob0ZyYW1lLCBzcmMsIHdpZHRoLCBoZWlnaHQsIGFsaWduLCBmaWxlLCBpc1VwZGF0ZSkge1xuICAgICAgICB0aGlzLmNvbnRleHQucmVzaXppbmcuX3Jlc2l6ZV9wbHVnaW4gPSAndmlkZW8nO1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIFxuICAgICAgICBsZXQgY292ZXIgPSBudWxsO1xuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgbGV0IGluaXQgPSBmYWxzZTtcblxuICAgICAgICAvKiogdXBkYXRlICovXG4gICAgICAgIGlmIChpc1VwZGF0ZSkge1xuICAgICAgICAgICAgb0ZyYW1lID0gY29udGV4dFZpZGVvLl9lbGVtZW50O1xuICAgICAgICAgICAgaWYgKG9GcmFtZS5zcmMgIT09IHNyYykge1xuICAgICAgICAgICAgICAgIGluaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzWW91dHViZSA9IC95b3V0dVxcLj9iZS8udGVzdChzcmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmltZW8gPSAvdmltZW9cXC5jb20vLnRlc3Qoc3JjKTtcbiAgICAgICAgICAgICAgICBpZiAoKGlzWW91dHViZSB8fCBpc1ZpbWVvKSAmJiAhL15pZnJhbWUkL2kudGVzdChvRnJhbWUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1RhZyA9IHRoaXMucGx1Z2lucy52aWRlby5jcmVhdGVJZnJhbWVUYWcuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFnLnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICAgICAgb0ZyYW1lLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld1RhZywgb0ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50ID0gb0ZyYW1lID0gbmV3VGFnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzWW91dHViZSAmJiAhaXNWaW1lbyAmJiAhL152aWRlb28kL2kudGVzdChvRnJhbWUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1RhZyA9IHRoaXMucGx1Z2lucy52aWRlby5jcmVhdGVWaWRlb1RhZy5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBuZXdUYWcuc3JjID0gc3JjO1xuICAgICAgICAgICAgICAgICAgICBvRnJhbWUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3VGFnLCBvRnJhbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQgPSBvRnJhbWUgPSBuZXdUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb0ZyYW1lLnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250ZXh0VmlkZW8uX2NvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvdmVyID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQob0ZyYW1lLCAnRklHVVJFJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIGNyZWF0ZSAqL1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGluaXQgPSB0cnVlO1xuICAgICAgICAgICAgb0ZyYW1lLnNyYyA9IHNyYztcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudCA9IG9GcmFtZTtcbiAgICAgICAgICAgIGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBvRnJhbWUpO1xuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS12aWRlby1jb250YWluZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiByZW5kZXJpbmcgKi9cbiAgICAgICAgY29udGV4dFZpZGVvLl9jb3ZlciA9IGNvdmVyO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgICAgICBjb25zdCBpbnB1dFVwZGF0ZSA9ICh0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWC5jYWxsKHRoaXMsIGNvbnRleHRWaWRlbykgIT09ICh3aWR0aCB8fCBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWCkpIHx8ICh0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGNvbnRleHRWaWRlbykgIT09IChoZWlnaHQgfHwgY29udGV4dFZpZGVvLl92aWRlb1JhdGlvKSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZVNpemUgPSAhaXNVcGRhdGUgfHwgaW5wdXRVcGRhdGU7XG5cbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby5fcmVzaXppbmcpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC52aWRlby5fcHJvcG9ydGlvbkNoZWNrZWQgPSBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbi5jaGVja2VkO1xuICAgICAgICAgICAgb0ZyYW1lLnNldEF0dHJpYnV0ZSgnZGF0YS1wcm9wb3J0aW9uJywgY29udGV4dFZpZGVvLl9wcm9wb3J0aW9uQ2hlY2tlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplXG4gICAgICAgIGxldCBpc1BlcmNlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNoYW5nZVNpemUpIHtcbiAgICAgICAgICAgIGlzUGVyY2VudCA9IHRoaXMucGx1Z2lucy52aWRlby5hcHBseVNpemUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsaWduXG4gICAgICAgIGlmICghKGlzUGVyY2VudCAmJiBhbGlnbiA9PT0gJ2NlbnRlcicpKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0QWxpZ24uY2FsbCh0aGlzLCBudWxsLCBvRnJhbWUsIGNvdmVyLCBjb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIWlzVXBkYXRlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5pbnNlcnRDb21wb25lbnQoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSwgIXRoaXMub3B0aW9ucy5tZWRpYUF1dG9TZWxlY3QpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubWVkaWFBdXRvU2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuYXBwZW5kRm9ybWF0VGFnKGNvbnRhaW5lciwgbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShsaW5lLCAwLCBsaW5lLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VmlkZW8uX3Jlc2l6aW5nICYmIHRoaXMuY29udGV4dC5yZXNpemluZy5fcm90YXRlVmVydGljYWwgJiYgY2hhbmdlU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnNldFRyYW5zZm9ybVNpemUuY2FsbCh0aGlzLCBvRnJhbWUsIG51bGwsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBvRnJhbWUsIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWQsIGZpbGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQob0ZyYW1lLCAndmlkZW8nKTtcbiAgICAgICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yZXNpemVfcGx1Z2luID0gJyc7XG4gICAgfSxcblxuICAgIF91cGRhdGVfdmlkZW9Db3ZlcjogZnVuY3Rpb24gKG9GcmFtZSkge1xuICAgICAgICBpZiAoIW9GcmFtZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgXG4gICAgICAgIGlmICgvXnZpZGVvJC9pLnRlc3Qob0ZyYW1lLm5vZGVOYW1lKSkgdGhpcy5wbHVnaW5zLnZpZGVvLl9zZXRUYWdBdHRycy5jYWxsKHRoaXMsIG9GcmFtZSk7XG4gICAgICAgIGVsc2UgdGhpcy5wbHVnaW5zLnZpZGVvLl9zZXRJZnJhbWVBdHRycy5jYWxsKHRoaXMsIG9GcmFtZSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBleGlzdEVsZW1lbnQgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChvRnJhbWUsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KSB8fCBcbiAgICAgICAgICAgIHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KG9GcmFtZSwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1d5c2l3eWdEaXYoY3VycmVudC5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzLnV0aWwpKTtcblxuICAgICAgICBjb25zdCBwcmV2RnJhbWUgPSBvRnJhbWU7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudCA9IG9GcmFtZSA9IG9GcmFtZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gY29udGV4dFZpZGVvLl9jb3ZlciA9IHRoaXMucGx1Z2lucy5jb21wb25lbnQuc2V0X2NvdmVyLmNhbGwodGhpcywgb0ZyYW1lKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29udGV4dFZpZGVvLl9jb250YWluZXIgPSB0aGlzLnBsdWdpbnMuY29tcG9uZW50LnNldF9jb250YWluZXIuY2FsbCh0aGlzLCBjb3ZlciwgJ3NlLXZpZGVvLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWdjYXB0aW9uID0gZXhpc3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2ZpZ2NhcHRpb24nKTtcbiAgICAgICAgICAgIGxldCBjYXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghIWZpZ2NhcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXB0aW9uID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICAgICAgICAgIGNhcHRpb24uaW5uZXJIVE1MID0gZmlnY2FwdGlvbi5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oZmlnY2FwdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSAob0ZyYW1lLmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykgfHwgb0ZyYW1lLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKSB8fCAnJykuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5hcHBseVNpemUuY2FsbCh0aGlzLCAoc2l6ZVswXSB8fCBwcmV2RnJhbWUuc3R5bGUud2lkdGggfHwgcHJldkZyYW1lLndpZHRoIHx8ICcnKSwgKHNpemVbMV0gfHwgcHJldkZyYW1lLnN0eWxlLmhlaWdodCB8fCBwcmV2RnJhbWUuaGVpZ2h0IHx8ICcnKSk7XG5cbiAgICAgICAgICAgIC8vIGFsaWduXG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnV0aWwuZ2V0Rm9ybWF0RWxlbWVudChwcmV2RnJhbWUpO1xuICAgICAgICAgICAgaWYgKGZvcm1hdCkgY29udGV4dFZpZGVvLl9hbGlnbiA9IGZvcm1hdC5zdHlsZS50ZXh0QWxpZ24gfHwgZm9ybWF0LnN0eWxlLmZsb2F0O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgb0ZyYW1lLCBjb3ZlciwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5pc0Zvcm1hdEVsZW1lbnQoZXhpc3RFbGVtZW50KSAmJiBleGlzdEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlSXRlbShwcmV2RnJhbWUpO1xuICAgICAgICAgICAgICAgIC8vIGNsZWFuIGZvcm1hdCB0YWdcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlRW1wdHlOb2RlKGV4aXN0RWxlbWVudCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIGV4aXN0RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnV0aWwuaHRtbFJlbW92ZVdoaXRlU3BhY2UoZXhpc3RFbGVtZW50LmlubmVySFRNTCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjb250YWluZXIsIGV4aXN0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghIWNhcHRpb24pIGV4aXN0RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjYXB0aW9uLCBjb250YWluZXIubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1NVTkVESVRPUi52aWRlby5lcnJvcl0gTWF5YmUgdGhlIHZpZGVvIHRhZyBpcyBuZXN0ZWQuJywgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBvRnJhbWUsIHRoaXMuZnVuY3Rpb25zLm9uVmlkZW9VcGxvYWQsIG51bGwsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIG9uTW9kaWZ5TW9kZTogZnVuY3Rpb24gKGVsZW1lbnQsIHNpemUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQoZWxlbWVudCwgJ0ZJR1VSRScpO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KTtcbiAgICAgICAgY29udGV4dFZpZGVvLl9hbGlnbiA9IGVsZW1lbnQuc3R5bGUuZmxvYXQgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nKSB8fCAnbm9uZSc7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZmxvYXQgPSAnJztcblxuICAgICAgICBpZiAoc2l6ZSkge1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50X3cgPSBzaXplLnc7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnRfaCA9IHNpemUuaDtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudF90ID0gc2l6ZS50O1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50X2wgPSBzaXplLmw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luID0gY29udGV4dFZpZGVvLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zaXplJykgfHwgY29udGV4dFZpZGVvLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW4nKTtcbiAgICAgICAgbGV0IHcsIGg7XG4gICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICAgIG9yaWdpbiA9IG9yaWdpbi5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdyA9IG9yaWdpblswXTtcbiAgICAgICAgICAgIGggPSBvcmlnaW5bMV07XG4gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSkge1xuICAgICAgICAgICAgdyA9IHNpemUudztcbiAgICAgICAgICAgIGggPSBzaXplLmg7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0VmlkZW8uX29yaWdpbl93ID0gdyB8fCBlbGVtZW50LnN0eWxlLndpZHRoIHx8IGVsZW1lbnQud2lkdGggfHwgJyc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fb3JpZ2luX2ggPSBoIHx8IGVsZW1lbnQuc3R5bGUuaGVpZ2h0IHx8IGVsZW1lbnQuaGVpZ2h0IHx8ICcnO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqL1xuICAgIG9wZW5Nb2RpZnk6IGZ1bmN0aW9uIChub3RPcGVuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcblxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZSkgY29udGV4dFZpZGVvLl9saW5rVmFsdWUgPSBjb250ZXh0VmlkZW8ucHJldmlldy50ZXh0Q29udGVudCA9IGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUudmFsdWUgPSAoY29udGV4dFZpZGVvLl9lbGVtZW50LnNyYyB8fCAoY29udGV4dFZpZGVvLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NvdXJjZScpIHx8ICcnKS5zcmMgfHwgJycpO1xuICAgICAgICBjb250ZXh0VmlkZW8ubW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInN1bmVkaXRvcl92aWRlb19yYWRpb1wiXVt2YWx1ZT1cIicgKyBjb250ZXh0VmlkZW8uX2FsaWduICsgJ1wiXScpLmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8uX3Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zZXRNb2RpZnlJbnB1dFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8sIHRoaXMucGx1Z2lucy52aWRlbyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb250ZXh0VmlkZW8uX3ZpZGVvUmF0aW8gPSB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9nZXRTaXplWS5jYWxsKHRoaXMsIGNvbnRleHRWaWRlbyk7XG4gICAgICAgICAgICBjb25zdCByYXRpb1NlbGVjdGVkID0gdGhpcy5wbHVnaW5zLnZpZGVvLnNldFZpZGVvUmF0aW9TZWxlY3QuY2FsbCh0aGlzLCB5KTtcbiAgICAgICAgICAgIGlmICghcmF0aW9TZWxlY3RlZCkgY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSA9IGNvbnRleHRWaWRlby5fb25seVBlcmNlbnRhZ2UgPyB0aGlzLnV0aWwuZ2V0TnVtYmVyKHksIDIpIDogeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm90T3BlbikgdGhpcy5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwodGhpcywgJ3ZpZGVvJywgdHJ1ZSk7XG4gICAgfSxcbiAgICBcbiAgICBzZXRWaWRlb1JhdGlvU2VsZWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHJhdGlvU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY29udGV4dFZpZGVvID0gdGhpcy5jb250ZXh0LnZpZGVvO1xuICAgICAgICBjb25zdCByYXRpb09wdGlvbnMgPSBjb250ZXh0VmlkZW8udmlkZW9SYXRpb09wdGlvbi5vcHRpb25zO1xuXG4gICAgICAgIGlmICgvJSQvLnRlc3QodmFsdWUpIHx8IGNvbnRleHRWaWRlby5fb25seVBlcmNlbnRhZ2UpIHZhbHVlID0gKHRoaXMudXRpbC5nZXROdW1iZXIodmFsdWUsIDIpIC8gMTAwKSArICcnO1xuICAgICAgICBlbHNlIGlmICghdGhpcy51dGlsLmlzTnVtYmVyKHZhbHVlKSB8fCAodmFsdWUgKiAxKSA+PSAxKSB2YWx1ZSA9ICcnO1xuXG4gICAgICAgIGNvbnRleHRWaWRlby5pbnB1dFkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhdGlvT3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHJhdGlvT3B0aW9uc1tpXS52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByYXRpb1NlbGVjdGVkID0gcmF0aW9PcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnBsYWNlaG9sZGVyID0gIXZhbHVlID8gJycgOiAodmFsdWUgKiAxMDApICsgJyUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSByYXRpb09wdGlvbnNbaV0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByYXRpb1NlbGVjdGVkO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBjaGVja0ZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5jaGVja0luZm8uY2FsbCh0aGlzLCAndmlkZW8nLCBbJ2lmcmFtZScsICd2aWRlbyddLCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkLCB0aGlzLnBsdWdpbnMudmlkZW8uX3VwZGF0ZV92aWRlb0NvdmVyLmJpbmQodGhpcyksIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICByZXNldEZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5yZXNldEluZm8uY2FsbCh0aGlzLCAndmlkZW8nLCB0aGlzLmZ1bmN0aW9ucy5vblZpZGVvVXBsb2FkKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICovXG4gICAgYXBwbHlTaXplOiBmdW5jdGlvbiAodywgaCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG5cbiAgICAgICAgaWYgKCF3KSB3ID0gY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSB8fCB0aGlzLm9wdGlvbnMudmlkZW9XaWR0aDtcbiAgICAgICAgaWYgKCFoKSBoID0gY29udGV4dFZpZGVvLmlucHV0WS52YWx1ZSB8fCB0aGlzLm9wdGlvbnMudmlkZW9IZWlnaHQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9vbmx5UGVyY2VudGFnZSB8fCAvJSQvLnRlc3QodykgfHwgIXcpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRQZXJjZW50U2l6ZS5jYWxsKHRoaXMsICh3IHx8ICcxMDAlJyksIChoIHx8ICgvJSQvLnRlc3QoY29udGV4dFZpZGVvLl92aWRlb1JhdGlvKSA/IGNvbnRleHRWaWRlby5fdmlkZW9SYXRpbyA6IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKCF3IHx8IHcgPT09ICdhdXRvJykgJiYgKCFoIHx8IGggPT09ICdhdXRvJykpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRBdXRvU2l6ZS5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldFNpemUuY2FsbCh0aGlzLCB3LCAoaCB8fCBjb250ZXh0VmlkZW8uX3ZpZGVvUmF0aW8gfHwgY29udGV4dFZpZGVvLl9kZWZhdWx0UmF0aW8pLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNpemVSZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLl9tb2R1bGVfc2l6ZVJldmVydC5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC52aWRlbyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFNpemU6IGZ1bmN0aW9uICh3LCBoLCBub3RSZXNldFBlcmNlbnRhZ2UsIGRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGNvbnN0IG9ubHlXID0gL14ocnd8bHcpJC8udGVzdChkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBvbmx5SCA9IC9eKHRofGJoKSQvLnRlc3QoZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoIW9ubHlIKSB3ID0gdGhpcy51dGlsLmdldE51bWJlcih3LCAwKTtcbiAgICAgICAgaWYgKCFvbmx5VykgaCA9IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyBjb250ZXh0VmlkZW8uc2l6ZVVuaXQgOiAhaCA/ICcnIDogaDtcblxuICAgICAgICBpZiAoIW9ubHlIKSBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUud2lkdGggPSB3ID8gdyArIGNvbnRleHRWaWRlby5zaXplVW5pdCA6ICcnO1xuICAgICAgICBpZiAoIW9ubHlXKSBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLmhlaWdodCA9IGg7XG5cbiAgICAgICAgaWYgKCFvbmx5SCAmJiAhLyUkLy50ZXN0KHcpKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvbmx5VyAmJiAhLyUkLy50ZXN0KGgpKSB7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm90UmVzZXRQZXJjZW50YWdlKSBjb250ZXh0VmlkZW8uX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBlcmNlbnRhZ2UnKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRBdXRvU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0UGVyY2VudFNpemUuY2FsbCh0aGlzLCAxMDAsIHRoaXMuY29udGV4dC52aWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHJlc2l6aW5nXG4gICAgICovXG4gICAgc2V0T3JpZ2luU2l6ZTogZnVuY3Rpb24gKGRhdGFTaXplKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgY29udGV4dFZpZGVvLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wZXJjZW50YWdlJyk7XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLnJlc2l6aW5nLnJlc2V0VHJhbnNmb3JtLmNhbGwodGhpcywgY29udGV4dFZpZGVvLl9lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLmNhbmNlbFBlcmNlbnRBdHRyLmNhbGwodGhpcyk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luU2l6ZSA9ICgoZGF0YVNpemUgPyBjb250ZXh0VmlkZW8uX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNpemUnKSA6ICcnKSB8fCBjb250ZXh0VmlkZW8uX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbicpIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICBcbiAgICAgICAgaWYgKG9yaWdpblNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBvcmlnaW5TaXplWzBdO1xuICAgICAgICAgICAgY29uc3QgaCA9IG9yaWdpblNpemVbMV07XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VmlkZW8uX29ubHlQZXJjZW50YWdlIHx8ICgvJSQvLnRlc3QodykgJiYgKC8lJC8udGVzdChoKSB8fCAhL1xcZC8udGVzdChoKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnZpZGVvLnNldFBlcmNlbnRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy52aWRlby5zZXRTaXplLmNhbGwodGhpcywgdywgaCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNhdmUgY3VycmVudCBzaXplXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSByZXNpemluZ1xuICAgICAqL1xuICAgIHNldFBlcmNlbnRTaXplOiBmdW5jdGlvbiAodywgaCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIGggPSAhIWggJiYgIS8lJC8udGVzdChoKSAmJiAhdGhpcy51dGlsLmdldE51bWJlcihoLCAwKSA/IHRoaXMudXRpbC5pc051bWJlcihoKSA/IGggKyAnJScgOiBoIDogdGhpcy51dGlsLmlzTnVtYmVyKGgpID8gaCArIGNvbnRleHRWaWRlby5zaXplVW5pdCA6IChoIHx8IGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcblxuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IHRoaXMudXRpbC5pc051bWJlcih3KSA/IHcgKyAnJScgOiB3O1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgY29udGV4dFZpZGVvLl9jb3Zlci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29udGV4dFZpZGVvLl9jb3Zlci5zdHlsZS5oZWlnaHQgPSBoO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuXG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8uX2FsaWduID09PSAnY2VudGVyJykgdGhpcy5wbHVnaW5zLnZpZGVvLnNldEFsaWduLmNhbGwodGhpcywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGNvbnRleHRWaWRlby5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyY2VudGFnZScsIHcgKyAnLCcgKyBoKTtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgc2l6ZVxuICAgICAgICB0aGlzLnBsdWdpbnMucmVzaXppbmcuX21vZHVsZV9zYXZlQ3VycmVudFNpemUuY2FsbCh0aGlzLCBjb250ZXh0VmlkZW8pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBjYW5jZWxQZXJjZW50QXR0cjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0VmlkZW8gPSB0aGlzLmNvbnRleHQudmlkZW87XG4gICAgICAgIFxuICAgICAgICBjb250ZXh0VmlkZW8uX2NvdmVyLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fY292ZXIuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIGNvbnRleHRWaWRlby5fY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9ICcnO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9ICcnO1xuICAgICAgICBjb250ZXh0VmlkZW8uX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSAnJztcblxuICAgICAgICB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dFZpZGVvLl9jb250YWluZXIsIHRoaXMuY29udGV4dC52aWRlby5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0VmlkZW8uX2NvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBjb250ZXh0VmlkZW8uX2FsaWduKTtcblxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9hbGlnbiA9PT0gJ2NlbnRlcicpIHRoaXMucGx1Z2lucy52aWRlby5zZXRBbGlnbi5jYWxsKHRoaXMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgcmVzaXppbmdcbiAgICAgKi9cbiAgICBzZXRBbGlnbjogZnVuY3Rpb24gKGFsaWduLCBlbGVtZW50LCBjb3ZlciwgY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgXG4gICAgICAgIGlmICghYWxpZ24pIGFsaWduID0gY29udGV4dFZpZGVvLl9hbGlnbjtcbiAgICAgICAgaWYgKCFlbGVtZW50KSBlbGVtZW50ID0gY29udGV4dFZpZGVvLl9lbGVtZW50O1xuICAgICAgICBpZiAoIWNvdmVyKSBjb3ZlciA9IGNvbnRleHRWaWRlby5fY292ZXI7XG4gICAgICAgIGlmICghY29udGFpbmVyKSBjb250YWluZXIgPSBjb250ZXh0VmlkZW8uX2NvbnRhaW5lcjtcblxuICAgICAgICBpZiAoYWxpZ24gJiYgYWxpZ24gIT09ICdub25lJykge1xuICAgICAgICAgICAgY292ZXIuc3R5bGUubWFyZ2luID0gJ2F1dG8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY292ZXIuc3R5bGUubWFyZ2luID0gJzAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8lJC8udGVzdChlbGVtZW50LnN0eWxlLndpZHRoKSAmJiBhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gY29udGFpbmVyLnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUuaGVpZ2h0ID0gY292ZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgICAgY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9ICEvJSQvLnRlc3QoY292ZXIuc3R5bGUuaGVpZ2h0KSA/IGNvdmVyLnN0eWxlLmhlaWdodCA6IHRoaXMudXRpbC5nZXROdW1iZXIoKHRoaXMudXRpbC5nZXROdW1iZXIoY292ZXIuc3R5bGUuaGVpZ2h0LCAyKSAvIDEwMCkgKiB0aGlzLnV0aWwuZ2V0TnVtYmVyKGNvdmVyLnN0eWxlLndpZHRoLCAyKSwgMikgKyAnJSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWluV2lkdGggPSAnJztcbiAgICAgICAgICAgIGNvdmVyLnN0eWxlLndpZHRoID0gdGhpcy5jb250ZXh0LnJlc2l6aW5nLl9yb3RhdGVWZXJ0aWNhbCA/IChlbGVtZW50LnN0eWxlLmhlaWdodCB8fCBlbGVtZW50Lm9mZnNldEhlaWdodCkgOiAoZWxlbWVudC5zdHlsZS53aWR0aCB8fCAnMTAwJScpO1xuICAgICAgICAgICAgY292ZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IGNvdmVyLnN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy51dGlsLmhhc0NsYXNzKGNvbnRhaW5lciwgJ19fc2VfX2Zsb2F0LScgKyBhbGlnbikpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhjb250YWluZXIsIGNvbnRleHRWaWRlby5fZmxvYXRDbGFzc1JlZ0V4cCk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGFpbmVyLCAnX19zZV9fZmxvYXQtJyArIGFsaWduKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWxpZ24nLCBhbGlnbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRWaWRlbyA9IHRoaXMuY29udGV4dC52aWRlbztcbiAgICAgICAgaWYgKGNvbnRleHRWaWRlby52aWRlb0lucHV0RmlsZSkgY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlLnZhbHVlID0gJyc7XG4gICAgICAgIGlmIChjb250ZXh0VmlkZW8udmlkZW9VcmxGaWxlKSBjb250ZXh0VmlkZW8uX2xpbmtWYWx1ZSA9IGNvbnRleHRWaWRlby5wcmV2aWV3LnRleHRDb250ZW50ID0gY29udGV4dFZpZGVvLnZpZGVvVXJsRmlsZS52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAoY29udGV4dFZpZGVvLnZpZGVvSW5wdXRGaWxlICYmIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnRleHRWaWRlby52aWRlb1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRWaWRlby5fb3JpZ2luX3cgPSB0aGlzLm9wdGlvbnMudmlkZW9XaWR0aDtcbiAgICAgICAgY29udGV4dFZpZGVvLl9vcmlnaW5faCA9IHRoaXMub3B0aW9ucy52aWRlb0hlaWdodDtcbiAgICAgICAgY29udGV4dFZpZGVvLm1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzdW5lZGl0b3JfdmlkZW9fcmFkaW9cIl1bdmFsdWU9XCJub25lXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGV4dFZpZGVvLl9yZXNpemluZykge1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLmlucHV0WC52YWx1ZSA9IHRoaXMub3B0aW9ucy52aWRlb1dpZHRoID09PSBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWCA/ICcnIDogdGhpcy5vcHRpb25zLnZpZGVvV2lkdGg7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8uaW5wdXRZLnZhbHVlID0gdGhpcy5vcHRpb25zLnZpZGVvSGVpZ2h0ID09PSBjb250ZXh0VmlkZW8uX2RlZmF1bHRTaXplWSA/ICcnIDogdGhpcy5vcHRpb25zLnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgY29udGV4dFZpZGVvLnByb3BvcnRpb24uY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0VmlkZW8ucHJvcG9ydGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudmlkZW8uc2V0VmlkZW9SYXRpb1NlbGVjdC5jYWxsKHRoaXMsIGNvbnRleHRWaWRlby5fZGVmYXVsdFJhdGlvKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRpYWxvZyBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZyc7XG5pbXBvcnQgY29tcG9uZW50IGZyb20gJy4uL21vZHVsZXMvY29tcG9uZW50JztcbmltcG9ydCBmaWxlTWFuYWdlciBmcm9tICcuLi9tb2R1bGVzL2ZpbGVNYW5hZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdhdWRpbycsXG4gICAgZGlzcGxheTogJ2RpYWxvZycsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZGlhbG9nLCBjb21wb25lbnQsIGZpbGVNYW5hZ2VyXSk7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gY29udGV4dC5hdWRpbyA9IHtcbiAgICAgICAgICAgIF9pbmZvTGlzdDogW10sIC8vIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAgICAgICAgX2luZm9JbmRleDogMCwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBfdXBsb2FkRmlsZUxlbmd0aDogMCwgLy8gQE92ZXJyaWRlIGZpbGVNYW5hZ2VyXG4gICAgICAgICAgICBmb2N1c0VsZW1lbnQ6IG51bGwsIC8vIEBPdmVycmlkZSBkaWFsb2cgLy8gVGhpcyBlbGVtZW50IGhhcyBmb2N1cyB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLlxuICAgICAgICAgICAgdGFyZ2V0U2VsZWN0OiBudWxsLFxuICAgICAgICAgICAgX29yaWdpbl93OiBjb3JlLm9wdGlvbnMuYXVkaW9XaWR0aCxcbiAgICAgICAgICAgIF9vcmlnaW5faDogY29yZS5vcHRpb25zLmF1ZGlvSGVpZ2h0LFxuICAgICAgICAgICAgX2xpbmtWYWx1ZTogJycsXG4gICAgICAgICAgICAvLyBAcmVxdWlyZSBAT3ZlcnJpZGUgY29tcG9uZW50XG4gICAgICAgICAgICBfZWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgIF9jb3ZlcjogbnVsbCxcbiAgICAgICAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIGRpYWxvZyAqL1xuICAgICAgICBsZXQgYXVkaW9fZGlhbG9nID0gdGhpcy5zZXREaWFsb2coY29yZSk7XG4gICAgICAgIGNvbnRleHRBdWRpby5tb2RhbCA9IGF1ZGlvX2RpYWxvZztcbiAgICAgICAgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlID0gYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfYXVkaW9fZmlsZXMnKTtcbiAgICAgICAgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSA9IGF1ZGlvX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtaW5wdXQtdXJsJyk7XG4gICAgICAgIGNvbnRleHRBdWRpby5mb2N1c0VsZW1lbnQgPSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgfHwgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZTtcbiAgICAgICAgY29udGV4dEF1ZGlvLnByZXZpZXcgPSBhdWRpb19kaWFsb2cucXVlcnlTZWxlY3RvcignLnNlLWxpbmstcHJldmlldycpO1xuXG4gICAgICAgIC8qKiBjb250cm9sbGVyICovXG4gICAgICAgIGxldCBhdWRpb19jb250cm9sbGVyID0gdGhpcy5zZXRDb250cm9sbGVyKGNvcmUpO1xuICAgICAgICBjb250ZXh0QXVkaW8uY29udHJvbGxlciA9IGF1ZGlvX2NvbnRyb2xsZXI7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCB0aGlzLnN1Ym1pdC5iaW5kKGNvcmUpKTtcbiAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZSkgYXVkaW9fZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3JlbW92ZVNlbGVjdGVkRmlsZXMuYmluZChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUsIGNvbnRleHRBdWRpby5hdWRpb1VybEZpbGUsIGNvbnRleHRBdWRpby5wcmV2aWV3KSk7XG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSkgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX2ZpbGVJbnB1dENoYW5nZS5iaW5kKGNvbnRleHRBdWRpbykpO1xuICAgICAgICBhdWRpb19jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrX2NvbnRyb2xsZXIuYmluZChjb3JlKSk7XG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fb25MaW5rUHJldmlldy5iaW5kKGNvbnRleHRBdWRpby5wcmV2aWV3LCBjb250ZXh0QXVkaW8sIGNvcmUub3B0aW9ucy5saW5rUHJvdG9jb2wpKTtcblxuICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cbiAgICAgICAgY29udGV4dC5kaWFsb2cubW9kYWwuYXBwZW5kQ2hpbGQoYXVkaW9fZGlhbG9nKTtcblxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFwcGVuZENoaWxkKGF1ZGlvX2NvbnRyb2xsZXIpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgYXVkaW9fZGlhbG9nID0gbnVsbCwgYXVkaW9fY29udHJvbGxlciA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKiBIVE1MIC0gZGlhbG9nICovXG4gICAgc2V0RGlhbG9nOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBjb3JlLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGRpYWxvZyA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBkaWFsb2cuY2xhc3NOYW1lID0gJ3NlLWRpYWxvZy1jb250ZW50JztcbiAgICAgICAgZGlhbG9nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGxldCBodG1sID0gJycgK1xuICAgICAgICAgICAgJzxmb3JtIG1ldGhvZD1cInBvc3RcIiBlbmN0eXBlPVwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiY2xvc2VcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiB0aXRsZT1cIicgKyBsYW5nLmRpYWxvZ0JveC5jbG9zZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUuaWNvbnMuY2FuY2VsICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1tb2RhbC10aXRsZVwiPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC50aXRsZSArICc8L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWJvZHlcIj4nO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5hdWRpb0ZpbGVJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC5maWxlICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctZm9ybS1maWxlc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBfc2VfYXVkaW9fZmlsZXNcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIicgKyBvcHRpb24uYXVkaW9BY2NlcHQgKyAnXCInICsgKG9wdGlvbi5hdWRpb011bHRpcGxlRmlsZSA/ICcgbXVsdGlwbGU9XCJtdWx0aXBsZVwiJyA6ICcnKSArICcvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiZmlsZXNSZW1vdmVcIiBjbGFzcz1cInNlLWJ0biBzZS1kaWFsb2ctZmlsZXMtZWRnZS1idXR0b24gc2UtZmlsZS1yZW1vdmVcIiB0aXRsZT1cIicgKyBsYW5nLmNvbnRyb2xsZXIucmVtb3ZlICsgJ1wiPicgKyBjb3JlLmljb25zLmNhbmNlbCArICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24uYXVkaW9VcmxJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9ICcnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsPicgKyBsYW5nLmRpYWxvZ0JveC5hdWRpb0JveC51cmwgKyAnPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGNsYXNzPVwic2UtaW5wdXQtZm9ybSBzZS1pbnB1dC11cmxcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwcmUgY2xhc3M9XCJzZS1saW5rLXByZXZpZXdcIj48L3ByZT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaHRtbCArPSAnJyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvb3RlclwiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZS1idG4tcHJpbWFyeVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICdcIj48c3Bhbj4nICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJzwvc3Bhbj48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9mb3JtPic7XG5cbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9LFxuXG4gICAgLyoqIEhUTUwgLSBjb250cm9sbGVyICovXG4gICAgc2V0Q29udHJvbGxlcjogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBsaW5rX2J0biA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsaW5rX2J0bi5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLWxpbmsnO1xuICAgICAgICBsaW5rX2J0bi5pbm5lckhUTUwgPSAnJyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWFycm93IHNlLWFycm93LXVwXCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cImxpbmstY29udGVudFwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJ1cGRhdGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5lZGl0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuZWRpdCArICc8L3NwYW4+PC9zcGFuPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS10b29sdGlwXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29ucy5kZWxldGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaW5rX2J0bjtcbiAgICB9LFxuXG4gICAgLy8gRGlzYWJsZSB1cmwgaW5wdXQgd2hlbiB1cGxvYWRpbmcgZmlsZXNcbiAgICBfZmlsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0lucHV0RmlsZS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1VybEZpbGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3LnN0eWxlLnRleHREZWNvcmF0aW9uID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvVXJsRmlsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBEaXNhYmxlIHVybCBpbnB1dCB3aGVuIHVwbG9hZGluZyBmaWxlc1xuICAgIF9yZW1vdmVTZWxlY3RlZEZpbGVzOiBmdW5jdGlvbiAodXJsSW5wdXQsIHByZXZpZXcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAodXJsSW5wdXQpIHtcbiAgICAgICAgICAgIHVybElucHV0LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHByZXZpZXcuc3R5bGUudGV4dERlY29yYXRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBjcmVhdGUgbmV3IGF1ZGlvIHRhZ1xuICAgIF9jcmVhdGVBdWRpb1RhZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvQXVkaW8gPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnQVVESU8nKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLl9zZXRUYWdBdHRycy5jYWxsKHRoaXMsIG9BdWRpbyk7XG5cbiAgICAgICAgY29uc3QgdyA9IHRoaXMuY29udGV4dC5hdWRpby5fb3JpZ2luX3c7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLmNvbnRleHQuYXVkaW8uX29yaWdpbl9oO1xuICAgICAgICBvQXVkaW8uc2V0QXR0cmlidXRlKCdvcmlnaW4tc2l6ZScsIHcgKyAnLCcgKyBoKTtcbiAgICAgICAgb0F1ZGlvLnN0eWxlLmNzc1RleHQgPSAodyA/ICgnd2lkdGg6JyArIHcgKyAnOyAnKSA6ICcnKSArIChoID8gKCdoZWlnaHQ6JyArIGggKyAnOycpIDogJycpO1xuXG4gICAgICAgIHJldHVybiBvQXVkaW87XG4gICAgfSxcblxuICAgIF9zZXRUYWdBdHRyczogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRyb2xzJywgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLm9wdGlvbnMuYXVkaW9UYWdBdHRycztcbiAgICAgICAgaWYgKCFhdHRycykgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBhdHRycykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWwuaGFzT3duKGF0dHJzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uTGlua1ByZXZpZXc6IGZ1bmN0aW9uIChjb250ZXh0LCBwcm90b2NvbCwgZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29udGV4dC5fbGlua1ZhbHVlID0gdGhpcy50ZXh0Q29udGVudCA9ICF2YWx1ZSA/ICcnIDogKHByb3RvY29sICYmIHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSAmJiB2YWx1ZS5pbmRleE9mKCcjJykgIT09IDApID8gcHJvdG9jb2wgKyB2YWx1ZSA6IHZhbHVlLmluZGV4T2YoJzovLycpID09PSAtMSA/ICcvJyArIHZhbHVlIDogdmFsdWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBmaWxlVGFnczogWydhdWRpbyddLFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmUsIGZpbGVNYW5hZ2VyLCByZXNpemluZ1xuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBjYWxsZWQgZnJvbSBjb3JlLnNlbGVjdENvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGFyZ2V0IGVsZW1lbnRcbiAgICAgKi9cbiAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5vbk1vZGlmeU1vZGUuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGZpbGVNYW5hZ2VyLCByZXNpemluZyBcbiAgICAgKi9cbiAgICBkZXN0cm95OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCB8fCB0aGlzLmNvbnRleHQuYXVkaW8uX2VsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMudXRpbC5pc0NvbXBvbmVudCkgfHwgZWxlbWVudDtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW5kZXgnKSAqIDE7XG4gICAgICAgIGNvbnN0IGZvY3VzRWwgPSAoY29udGFpbmVyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgfHwgY29udGFpbmVyLm5leHRFbGVtZW50U2libGluZyk7XG5cbiAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuXG4gICAgICAgIGlmIChlbXB0eURpdiAhPT0gdGhpcy5jb250ZXh0LmVsZW1lbnQud3lzaXd5ZykgdGhpcy51dGlsLnJlbW92ZUl0ZW1BbGxQYXJlbnRzKGVtcHR5RGl2LCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMDsgfSwgbnVsbCk7XG5cbiAgICAgICAgLy8gZm9jdXNcbiAgICAgICAgdGhpcy5mb2N1c0VkZ2UoZm9jdXNFbCk7XG5cbiAgICAgICAgLy8gZmlsZU1hbmFnZXIgZXZlbnRcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLmRlbGV0ZUluZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBkYXRhSW5kZXgsIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQpO1xuXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgZmlsZU1hbmFnZXJcbiAgICAgKi9cbiAgICBjaGVja0ZpbGVJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlTWFuYWdlci5jaGVja0luZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBbJ2F1ZGlvJ10sIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQsIHRoaXMucGx1Z2lucy5hdWRpby51cGRhdGVDb3Zlci5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBmaWxlTWFuYWdlclxuICAgICAqL1xuICAgIHJlc2V0RmlsZUluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnJlc2V0SW5mby5jYWxsKHRoaXMsICdhdWRpbycsIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGRpYWxvZ1xuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcblxuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmluaXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUuc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICdtdWx0aXBsZScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRBdWRpby5fZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRpYWxvZy51cGRhdGVNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0QXVkaW8uX2xpbmtWYWx1ZSA9IGNvbnRleHRBdWRpby5wcmV2aWV3LnRleHRDb250ZW50ID0gY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZS52YWx1ZSA9IGNvbnRleHRBdWRpby5fZWxlbWVudC5zcmM7XG4gICAgICAgICAgICBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlICYmIHRoaXMub3B0aW9ucy5hdWRpb011bHRpcGxlRmlsZSkgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLnJlbW92ZUF0dHJpYnV0ZSgnbXVsdGlwbGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgdGhpcy5vcHRpb25zLmF1ZGlvTXVsdGlwbGVGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUucmVtb3ZlQXR0cmlidXRlKCdtdWx0aXBsZScpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZGlhbG9nXG4gICAgICovXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnYXVkaW8nLCAnYXVkaW8nID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb0lucHV0RmlsZSAmJiBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uc3VibWl0QWN0aW9uLmNhbGwodGhpcywgY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlLmZpbGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSAmJiBjb250ZXh0QXVkaW8uX2xpbmtWYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5zZXR1cFVybC5jYWxsKHRoaXMsIGNvbnRleHRBdWRpby5fbGlua1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5hdWRpby5zdWJtaXQuZmFpbF0gY2F1c2UgOiBcIicgKyBlcnJvci5tZXNzYWdlICsgJ1wiJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIHN1Ym1pdEFjdGlvbjogZnVuY3Rpb24gKGZpbGVMaXN0KSB7XG4gICAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQgZmlsZVNpemUgPSAwO1xuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoL2F1ZGlvL2kudGVzdChmaWxlTGlzdFtpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZUxpc3RbaV0pO1xuICAgICAgICAgICAgICAgIGZpbGVTaXplICs9IGZpbGVMaXN0W2ldLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW1pdFNpemUgPSB0aGlzLm9wdGlvbnMuYXVkaW9VcGxvYWRTaXplTGltaXQ7XG4gICAgICAgIGlmIChsaW1pdFNpemUgPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5mb1NpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgYXVkaW9zSW5mbyA9IHRoaXMuY29udGV4dC5hdWRpby5faW5mb0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXVkaW9zSW5mby5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGluZm9TaXplICs9IGF1ZGlvc0luZm9baV0uc2l6ZSAqIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoZmlsZVNpemUgKyBpbmZvU2l6ZSkgPiBsaW1pdFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9ICdbU1VORURJVE9SLmF1ZGlvVXBsb2FkLmZhaWxdIFNpemUgb2YgdXBsb2FkYWJsZSB0b3RhbCBhdWRpb3M6ICcgKyAobGltaXRTaXplLzEwMDApICsgJ0tCJztcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWRFcnJvciAhPT0gJ2Z1bmN0aW9uJyB8fCB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkRXJyb3IoZXJyLCB7ICdsaW1pdFNpemUnOiBsaW1pdFNpemUsICdjdXJyZW50U2l6ZSc6IGluZm9TaXplLCAndXBsb2FkU2l6ZSc6IGZpbGVTaXplIH0sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zLm5vdGljZU9wZW4oZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuICAgICAgICBjb250ZXh0QXVkaW8uX3VwbG9hZEZpbGVMZW5ndGggPSBmaWxlcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgICAgIGlzVXBkYXRlOiB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsLFxuICAgICAgICAgICAgZWxlbWVudDogY29udGV4dEF1ZGlvLl9lbGVtZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkQmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkQmVmb3JlKGZpbGVzLCBpbmZvLCB0aGlzLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIHRoaXMuX3cuQXJyYXkuaXNBcnJheShkYXRhLnJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLnVwbG9hZC5jYWxsKHRoaXMsIGluZm8sIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQubGVuZ3RoID4gMCkgZmlsZXMgPSByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8udXBsb2FkLmNhbGwodGhpcywgaW5mbywgZmlsZXMpO1xuICAgIH0sXG5cbiAgICBlcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mdW5jdGlvbnMub25BdWRpb1VwbG9hZEVycm9yICE9PSAnZnVuY3Rpb24nIHx8IHRoaXMuZnVuY3Rpb25zLm9uQXVkaW9VcGxvYWRFcnJvcihtZXNzYWdlLCByZXNwb25zZSwgdGhpcykpIHtcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25zLm5vdGljZU9wZW4obWVzc2FnZSk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5wbHVnaW4uYXVkaW8uZXhjZXB0aW9uXSByZXNwb25zZTogJyArIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwbG9hZDogZnVuY3Rpb24gKGluZm8sIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmaWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5lcnJvci5jYWxsKHRoaXMsIGZpbGVzLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF1ZGlvVXBsb2FkVXJsID0gdGhpcy5vcHRpb25zLmF1ZGlvVXBsb2FkVXJsO1xuICAgICAgICBjb25zdCBmaWxlc0xlbiA9IHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPyAxIDogZmlsZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBmb3JtRGF0YVxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzTGVuOyBpKyspIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZS0nICsgaSwgZmlsZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VydmVyIHVwbG9hZFxuICAgICAgICB0aGlzLnBsdWdpbnMuZmlsZU1hbmFnZXIudXBsb2FkLmNhbGwodGhpcywgYXVkaW9VcGxvYWRVcmwsIHRoaXMub3B0aW9ucy5hdWRpb1VwbG9hZEhlYWRlciwgZm9ybURhdGEsIHRoaXMucGx1Z2lucy5hdWRpby5jYWxsQmFja191cGxvYWQuYmluZCh0aGlzLCBpbmZvKSwgdGhpcy5mdW5jdGlvbnMub25BdWRpb1VwbG9hZEVycm9yKTtcbiAgICB9LFxuXG4gICAgY2FsbEJhY2tfdXBsb2FkOiBmdW5jdGlvbiAoaW5mbywgeG1sSHR0cCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZnVuY3Rpb25zLmF1ZGlvVXBsb2FkSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnMuYXVkaW9VcGxvYWRIYW5kbGVyKHhtbEh0dHAsIGluZm8sIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhtbEh0dHAucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uZXJyb3IuY2FsbCh0aGlzLCByZXNwb25zZS5lcnJvck1lc3NhZ2UsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLnJlZ2lzdGVyLmNhbGwodGhpcywgaW5mbywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoaW5mbywgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgZmlsZUxpc3QgPSByZXNwb25zZS5yZXN1bHQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZpbGVMaXN0Lmxlbmd0aCwgZmlsZSwgb0F1ZGlvOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmlzVXBkYXRlKSBvQXVkaW8gPSBpbmZvLmVsZW1lbnQ7XG4gICAgICAgICAgICBlbHNlIG9BdWRpbyA9IHRoaXMucGx1Z2lucy5hdWRpby5fY3JlYXRlQXVkaW9UYWcuY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgZmlsZSA9IHsgbmFtZTogZmlsZUxpc3RbaV0ubmFtZSwgc2l6ZTogZmlsZUxpc3RbaV0uc2l6ZSB9O1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmNyZWF0ZV9hdWRpby5jYWxsKHRoaXMsIG9BdWRpbywgZmlsZUxpc3RbaV0udXJsLCBmaWxlLCBpbmZvLmlzVXBkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VMb2FkaW5nKCk7XG4gICAgfSxcblxuICAgIHNldHVwVXJsOiBmdW5jdGlvbiAoc3JjKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLmNyZWF0ZV9hdWRpby5jYWxsKHRoaXMsIHRoaXMucGx1Z2lucy5hdWRpby5fY3JlYXRlQXVkaW9UYWcuY2FsbCh0aGlzKSwgc3JjLCBudWxsLCB0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmF1ZGlvLmF1ZGlvLmZhaWxdIGNhdXNlIDogXCInICsgZXJyb3IubWVzc2FnZSArICdcIicpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVfYXVkaW86IGZ1bmN0aW9uIChlbGVtZW50LCBzcmMsIGZpbGUsIGlzVXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcbiAgICAgICAgXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgdGFnXG4gICAgICAgIGlmICghaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3JjID0gc3JjO1xuICAgICAgICAgICAgY29uc3QgY292ZXIgPSB0aGlzLnBsdWdpbnMuY29tcG9uZW50LnNldF9jb3Zlci5jYWxsKHRoaXMsIGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICcnKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbnNlcnRDb21wb25lbnQoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSwgIXRoaXMub3B0aW9ucy5tZWRpYUF1dG9TZWxlY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLm1lZGlhQXV0b1NlbGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmFwcGVuZEZvcm1hdFRhZyhjb250YWluZXIsIG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UobGluZSwgMCwgbGluZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gdXBkYXRlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRBdWRpby5fZWxlbWVudCkgZWxlbWVudCA9IGNvbnRleHRBdWRpby5fZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuc3JjICE9PSBzcmMpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNyYyA9IHNyYztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChlbGVtZW50LCAnYXVkaW8nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RDb21wb25lbnQoZWxlbWVudCwgJ2F1ZGlvJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBlbGVtZW50LCB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkLCBmaWxlLCBmYWxzZSk7XG4gICAgICAgIGlmIChpc1VwZGF0ZSkgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVDb3ZlcjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGV4dEF1ZGlvID0gdGhpcy5jb250ZXh0LmF1ZGlvO1xuICAgICAgICB0aGlzLnBsdWdpbnMuYXVkaW8uX3NldFRhZ0F0dHJzLmNhbGwodGhpcywgZWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBmaW5kIGNvbXBvbmVudCBlbGVtZW50XG4gICAgICAgIGNvbnN0IGV4aXN0RWxlbWVudCA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIHRoaXMudXRpbC5pc01lZGlhQ29tcG9uZW50KSB8fCBcbiAgICAgICAgICAgIHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KGVsZW1lbnQsIGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNXeXNpd3lnRGl2KGN1cnJlbnQucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcy51dGlsKSk7XG5cbiAgICAgICAgLy8gY2xvbmUgZWxlbWVudFxuICAgICAgICBjb25zdCBwcmV2RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIGNvbnRleHRBdWRpby5fZWxlbWVudCA9IGVsZW1lbnQgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY292ZXIuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wbHVnaW5zLmNvbXBvbmVudC5zZXRfY29udGFpbmVyLmNhbGwodGhpcywgY292ZXIsICdzZS1hdWRpby1jb250YWluZXInKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5pc0Zvcm1hdEVsZW1lbnQoZXhpc3RFbGVtZW50KSAmJiBleGlzdEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlSXRlbShwcmV2RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgLy8gY2xlYW4gZm9ybWF0IHRhZ1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVFbXB0eU5vZGUoZXhpc3RFbGVtZW50LCBudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgZXhpc3RFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudXRpbC5odG1sUmVtb3ZlV2hpdGVTcGFjZShleGlzdEVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhpc3RFbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRhaW5lciwgZXhpc3RFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1NVTkVESVRPUi5hdWRpby5lcnJvcl0gTWF5YmUgdGhlIGF1ZGlvIHRhZyBpcyBuZXN0ZWQuJywgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbHVnaW5zLmZpbGVNYW5hZ2VyLnNldEluZm8uY2FsbCh0aGlzLCAnYXVkaW8nLCBlbGVtZW50LCB0aGlzLmZ1bmN0aW9ucy5vbkF1ZGlvVXBsb2FkLCBudWxsLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZU1hbmFnZXIsIHJlc2l6aW5nXG4gICAgICovXG4gICAgb25Nb2RpZnlNb2RlOiBmdW5jdGlvbiAoc2VsZWN0aW9uVGFnKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2V0Q29udHJvbGxlclBvc2l0aW9uKGNvbnRleHRBdWRpby5jb250cm9sbGVyLCBzZWxlY3Rpb25UYWcsICdib3R0b20nLCB7bGVmdDogMCwgdG9wOiAwfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPbihjb250ZXh0QXVkaW8uY29udHJvbGxlciwgc2VsZWN0aW9uVGFnLCB0aGlzLnBsdWdpbnMuYXVkaW8ub25Db250cm9sbGVyT2ZmLmJpbmQodGhpcywgc2VsZWN0aW9uVGFnKSwgJ2F1ZGlvJyk7XG5cbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHNlbGVjdGlvblRhZywgJ2FjdGl2ZScpO1xuICAgICAgICBjb250ZXh0QXVkaW8uX2VsZW1lbnQgPSBzZWxlY3Rpb25UYWc7XG4gICAgICAgIGNvbnRleHRBdWRpby5fY292ZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3Rpb25UYWcsICdGSUdVUkUnKTtcbiAgICAgICAgY29udGV4dEF1ZGlvLl9jb250YWluZXIgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3Rpb25UYWcsIHRoaXMudXRpbC5pc0NvbXBvbmVudCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZU1hbmFnZXIsIHJlc2l6aW5nXG4gICAgICovXG4gICAgb3Blbk1vZGlmeTogZnVuY3Rpb24gKG5vdE9wZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5hdWRpby5hdWRpb1VybEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcbiAgICAgICAgICAgIGNvbnRleHRBdWRpby5fbGlua1ZhbHVlID0gY29udGV4dEF1ZGlvLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlLnZhbHVlID0gY29udGV4dEF1ZGlvLl9lbGVtZW50LnNyYztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vdE9wZW4pIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdhdWRpbycsIHRydWUpO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrX2NvbnRyb2xsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoL3VwZGF0ZS8udGVzdChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmF1ZGlvLm9wZW5Nb2RpZnkuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8qKiBkZWxldGUgKi9cbiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5hdWRpby5kZXN0cm95LmNhbGwodGhpcywgdGhpcy5jb250ZXh0LmF1ZGlvLl9lbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcbiAgICB9LFxuXG4gICAgb25Db250cm9sbGVyT2ZmOiBmdW5jdGlvbiAoc2VsZWN0aW9uVGFnKSB7XG4gICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3Rpb25UYWcsICdhY3RpdmUnKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmF1ZGlvLmNvbnRyb2xsZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuZGlhbG9nLnVwZGF0ZU1vZGFsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbnRleHRBdWRpbyA9IHRoaXMuY29udGV4dC5hdWRpbztcblxuICAgICAgICBpZiAoY29udGV4dEF1ZGlvLmF1ZGlvSW5wdXRGaWxlKSBjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUudmFsdWUgPSAnJztcbiAgICAgICAgaWYgKGNvbnRleHRBdWRpby5hdWRpb1VybEZpbGUpIGNvbnRleHRBdWRpby5fbGlua1ZhbHVlID0gY29udGV4dEF1ZGlvLnByZXZpZXcudGV4dENvbnRlbnQgPSBjb250ZXh0QXVkaW8uYXVkaW9VcmxGaWxlLnZhbHVlID0gJyc7XG4gICAgICAgIGlmIChjb250ZXh0QXVkaW8uYXVkaW9JbnB1dEZpbGUgJiYgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZSkge1xuICAgICAgICAgICAgY29udGV4dEF1ZGlvLmF1ZGlvVXJsRmlsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICBjb250ZXh0QXVkaW8ucHJldmlldy5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dEF1ZGlvLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9XG59OyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGRpYWxvZyBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnbWF0aCcsXG4gICAgZGlzcGxheTogJ2RpYWxvZycsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZGlhbG9nXSk7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5tYXRoID0ge1xuICAgICAgICAgICAgZm9jdXNFbGVtZW50OiBudWxsLCAvLyBAT3ZlcnJpZGUgZGlhbG9nIC8vIFRoaXMgZWxlbWVudCBoYXMgZm9jdXMgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZC5cbiAgICAgICAgICAgIHByZXZpZXdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgZm9udFNpemVFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdEZvbnRTaXplOiAnJyxcbiAgICAgICAgICAgIF9tYXRoRXhwOiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIG1hdGggZGlhbG9nICovXG4gICAgICAgIGxldCBtYXRoX2RpYWxvZyA9IHRoaXMuc2V0RGlhbG9nKGNvcmUpO1xuICAgICAgICBjb250ZXh0Lm1hdGgubW9kYWwgPSBtYXRoX2RpYWxvZztcbiAgICAgICAgY29udGV4dC5tYXRoLmZvY3VzRWxlbWVudCA9IG1hdGhfZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy5zZS1tYXRoLWV4cCcpO1xuICAgICAgICBjb250ZXh0Lm1hdGgucHJldmlld0VsZW1lbnQgPSBtYXRoX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtbWF0aC1wcmV2aWV3Jyk7XG4gICAgICAgIGNvbnRleHQubWF0aC5mb250U2l6ZUVsZW1lbnQgPSBtYXRoX2RpYWxvZy5xdWVyeVNlbGVjdG9yKCcuc2UtbWF0aC1zaXplJyk7XG4gICAgICAgIGNvbnRleHQubWF0aC5mb2N1c0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9yZW5kZXJNYXRoRXhwLmJpbmQoY29yZSwgY29udGV4dC5tYXRoKSwgZmFsc2UpO1xuICAgICAgICBjb250ZXh0Lm1hdGguZm9jdXNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX3JlbmRlck1hdGhFeHAuYmluZChjb3JlLCBjb250ZXh0Lm1hdGgpLCBmYWxzZSk7XG4gICAgICAgIGNvbnRleHQubWF0aC5mb250U2l6ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHsgdGhpcy5mb250U2l6ZSA9IGUudGFyZ2V0LnZhbHVlOyB9LmJpbmQoY29udGV4dC5tYXRoLnByZXZpZXdFbGVtZW50LnN0eWxlKSwgZmFsc2UpO1xuXG4gICAgICAgIC8qKiBtYXRoIGNvbnRyb2xsZXIgKi9cbiAgICAgICAgbGV0IG1hdGhfY29udHJvbGxlciA9IHRoaXMuc2V0Q29udHJvbGxlcl9NYXRoQnV0dG9uKGNvcmUpO1xuICAgICAgICBjb250ZXh0Lm1hdGgubWF0aENvbnRyb2xsZXIgPSBtYXRoX2NvbnRyb2xsZXI7XG4gICAgICAgIGNvbnRleHQubWF0aC5fbWF0aEV4cCA9IG51bGw7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbWF0aF9kaWFsb2cucXVlcnlTZWxlY3RvcignZm9ybScpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIHRoaXMuc3VibWl0LmJpbmQoY29yZSksIGZhbHNlKTtcbiAgICAgICAgbWF0aF9jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrX21hdGhDb250cm9sbGVyLmJpbmQoY29yZSkpO1xuICAgICAgICBjb250ZXh0Lm1hdGgucHJldmlld0VsZW1lbnQuc3R5bGUuZm9udFNpemUgPSBjb250ZXh0Lm1hdGguZGVmYXVsdEZvbnRTaXplO1xuXG4gICAgICAgIC8qKiBhcHBlbmQgaHRtbCAqL1xuICAgICAgICBjb250ZXh0LmRpYWxvZy5tb2RhbC5hcHBlbmRDaGlsZChtYXRoX2RpYWxvZyk7XG4gICAgICAgIGNvbnRleHQuZWxlbWVudC5yZWxhdGl2ZS5hcHBlbmRDaGlsZChtYXRoX2NvbnRyb2xsZXIpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbWF0aF9kaWFsb2cgPSBudWxsLCBtYXRoX2NvbnRyb2xsZXIgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvKiogZGlhbG9nICovXG4gICAgc2V0RGlhbG9nOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBkaWFsb2cgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gY29yZS5vcHRpb25zLm1hdGhGb250U2l6ZTtcbiAgICAgICAgbGV0IGRlZmF1bHRGb250U2l6ZSA9IGZvbnRTaXplWzBdLnZhbHVlO1xuXG4gICAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAnc2UtZGlhbG9nLWNvbnRlbnQnO1xuICAgICAgICBkaWFsb2cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbGV0IGh0bWwgPSAnJyArXG4gICAgICAgICc8Zm9ybT4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWhlYWRlclwiPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJjbG9zZVwiIGNsYXNzPVwic2UtYnRuIHNlLWRpYWxvZy1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LmNsb3NlICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICBjb3JlLmljb25zLmNhbmNlbCArXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLW1vZGFsLXRpdGxlXCI+JyArIGxhbmcuZGlhbG9nQm94Lm1hdGhCb3gudGl0bGUgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1kaWFsb2ctYm9keVwiPicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gubWF0aEJveC5pbnB1dExhYmVsICsgJyAoPGEgaHJlZj1cImh0dHBzOi8va2F0ZXgub3JnL2RvY3Mvc3VwcG9ydGVkLmh0bWxcIiB0YXJnZXQ9XCJfYmxhbmtcIj5LYVRlWDwvYT4pPC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgJzx0ZXh0YXJlYSBjbGFzcz1cInNlLWlucHV0LWZvcm0gc2UtbWF0aC1leHBcIiB0eXBlPVwidGV4dFwiPjwvdGV4dGFyZWE+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtZGlhbG9nLWZvcm1cIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbD4nICsgbGFuZy5kaWFsb2dCb3gubWF0aEJveC5mb250U2l6ZUxhYmVsICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8c2VsZWN0IGNsYXNzPVwic2UtaW5wdXQtc2VsZWN0IHNlLW1hdGgtc2l6ZVwiPic7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmb250U2l6ZS5sZW5ndGgsIGY7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGZvbnRTaXplW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZGVmYXVsdCkgZGVmYXVsdEZvbnRTaXplID0gZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgZi52YWx1ZSArICdcIicgKyAoZi5kZWZhdWx0ID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPicgKyBmLnRleHQgKyAnPC9vcHRpb24+JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PicgK1xuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb3JtXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGFiZWw+JyArIGxhbmcuZGlhbG9nQm94Lm1hdGhCb3gucHJldmlld0xhYmVsICsgJzwvbGFiZWw+JyArXG4gICAgICAgICAgICAgICAgICAgICc8cCBjbGFzcz1cInNlLW1hdGgtcHJldmlld1wiPjwvcD4nICtcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWRpYWxvZy1mb290ZXJcIj4nICtcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZS1idG4tcHJpbWFyeVwiIHRpdGxlPVwiJyArIGxhbmcuZGlhbG9nQm94LnN1Ym1pdEJ1dHRvbiArICdcIj48c3Bhbj4nICsgbGFuZy5kaWFsb2dCb3guc3VibWl0QnV0dG9uICsgJzwvc3Bhbj48L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzwvZm9ybT4nO1xuXG4gICAgICAgIGNvcmUuY29udGV4dC5tYXRoLmRlZmF1bHRGb250U2l6ZSA9IGRlZmF1bHRGb250U2l6ZTtcbiAgICAgICAgZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSxcblxuICAgIC8qKiBtb2RpZnkgY29udHJvbGxlciBidXR0b24gKi9cbiAgICBzZXRDb250cm9sbGVyX01hdGhCdXR0b246IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IG1hdGhfYnRuID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIG1hdGhfYnRuLmNsYXNzTmFtZSA9ICdzZS1jb250cm9sbGVyIHNlLWNvbnRyb2xsZXItbGluayc7XG4gICAgICAgIG1hdGhfYnRuLmlubmVySFRNTCA9ICcnICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1hcnJvdyBzZS1hcnJvdy11cFwiPjwvZGl2PicgK1xuICAgICAgICAnPGRpdiBjbGFzcz1cImxpbmstY29udGVudFwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1idG4tZ3JvdXBcIj4nICtcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwidXBkYXRlXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5lZGl0ICtcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5lZGl0ICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgICAgICAgICBjb3JlLmljb25zLmRlbGV0ZSArXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIucmVtb3ZlICsgJzwvc3Bhbj48L3NwYW4+JyArXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICcnO1xuXG4gICAgICAgIHJldHVybiBtYXRoX2J0bjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQFJlcXVpcmVkIEBPdmVycmlkZSBkaWFsb2dcbiAgICAgKi9cbiAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKHRoaXMsICdtYXRoJywgJ21hdGgnID09PSB0aGlzLmN1cnJlbnRDb250cm9sbGVyTmFtZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlIC0gbWFuYWdlZFRhZ3NJbmZvXG4gICAgICovXG4gICAgbWFuYWdlZFRhZ3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2thdGV4JyxcbiAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWV4cCcpIHx8ICF0aGlzLm9wdGlvbnMua2F0ZXgpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBkb20gPSB0aGlzLl9kLmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRoaXMucGx1Z2lucy5tYXRoLl9yZW5kZXJlci5jYWxsKHRoaXMsIHRoaXMudXRpbC5IVE1MRGVjb2RlcihlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1leHAnKSkpKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGRvbS5xdWVyeVNlbGVjdG9yKCcua2F0ZXgnKS5pbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIF9yZW5kZXJlcjogZnVuY3Rpb24gKGV4cCkge1xuICAgICAgICBjb25zdCBrYXRleCA9IHRoaXMub3B0aW9ucy5rYXRleDtcbiAgICAgICAgcmV0dXJuIGthdGV4LnNyYy5yZW5kZXJUb1N0cmluZyhleHAsIGthdGV4Lm9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBfcmVuZGVyTWF0aEV4cDogZnVuY3Rpb24gKGNvbnRleHRNYXRoLCBlKSB7XG4gICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LmlubmVySFRNTCA9IHRoaXMucGx1Z2lucy5tYXRoLl9yZW5kZXJlci5jYWxsKHRoaXMsIGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuXG4gICAgc3VibWl0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGlzLnNob3dMb2FkaW5nKCk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1pdEFjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQubWF0aC5mb2N1c0VsZW1lbnQudmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0TWF0aCA9IHRoaXMuY29udGV4dC5tYXRoO1xuICAgICAgICAgICAgY29uc3QgbWF0aEV4cCA9IGNvbnRleHRNYXRoLmZvY3VzRWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGthdGV4RWwgPSBjb250ZXh0TWF0aC5wcmV2aWV3RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcua2F0ZXgnKTtcblxuICAgICAgICAgICAgaWYgKCFrYXRleEVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBrYXRleEVsLmNsYXNzTmFtZSA9ICdfX3NlX19rYXRleCAnICsga2F0ZXhFbC5jbGFzc05hbWU7XG4gICAgICAgICAgICBrYXRleEVsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xuICAgICAgICAgICAga2F0ZXhFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwJywgdGhpcy51dGlsLkhUTUxFbmNvZGVyKG1hdGhFeHApKTtcbiAgICAgICAgICAgIGthdGV4RWwuc2V0QXR0cmlidXRlKCdkYXRhLWZvbnQtc2l6ZScsIGNvbnRleHRNYXRoLmZvbnRTaXplRWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICBrYXRleEVsLnN0eWxlLmZvbnRTaXplID0gY29udGV4dE1hdGguZm9udFNpemVFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvRm9ybWF0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzWzBdLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgb0Zvcm1hdC5hcHBlbmRDaGlsZChrYXRleEVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluc2VydE5vZGUob0Zvcm1hdCwgbnVsbCwgdHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5zZXJ0Tm9kZShrYXRleEVsLCBudWxsLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0gdGhpcy51dGlsLmNyZWF0ZVRleHROb2RlKHRoaXMudXRpbC56ZXJvV2lkdGhTcGFjZSk7XG4gICAgICAgICAgICAgICAga2F0ZXhFbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eSwga2F0ZXhFbC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShrYXRleEVsLCAwLCBrYXRleEVsLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChjb250ZXh0TWF0aC5fbWF0aEV4cCwgJy5rYXRleCcpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGthdGV4RWwsIGNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGthdGV4RWwsIDAsIGthdGV4RWwsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250ZXh0TWF0aC5mb2N1c0VsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGNvbnRleHRNYXRoLmZvbnRTaXplRWxlbWVudC52YWx1ZSA9ICcxZW0nO1xuICAgICAgICAgICAgY29udGV4dE1hdGgucHJldmlld0VsZW1lbnQuc3R5bGUuZm9udFNpemUgPSAnMWVtJztcbiAgICAgICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc3VibWl0QWN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRpYWxvZy5jbG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUxvYWRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXJBcnJheS5pbmRleE9mKHRoaXMuY29udGV4dC5tYXRoLm1hdGhDb250cm9sbGVyKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWV4cCcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyQXJyYXkuaW5kZXhPZih0aGlzLmNvbnRleHQubWF0aC5tYXRoQ29udHJvbGxlcikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShlbGVtZW50LCAwLCBlbGVtZW50LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubWF0aC5jYWxsX2NvbnRyb2xsZXIuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gKHVwZGF0ZSkge1xuICAgICAgICBpZiAoIXVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLm1hdGguaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dE1hdGggPSB0aGlzLmNvbnRleHQubWF0aDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0TWF0aC5fbWF0aEV4cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cCA9IHRoaXMudXRpbC5IVE1MRGVjb2Rlcihjb250ZXh0TWF0aC5fbWF0aEV4cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZXhwJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gY29udGV4dE1hdGguX21hdGhFeHAuZ2V0QXR0cmlidXRlKCdkYXRhLWZvbnQtc2l6ZScpIHx8ICcxZW0nO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5kaWFsb2cudXBkYXRlTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRleHRNYXRoLmZvY3VzRWxlbWVudC52YWx1ZSA9IGV4cDtcbiAgICAgICAgICAgICAgICBjb250ZXh0TWF0aC5mb250U2l6ZUVsZW1lbnQudmFsdWUgPSBmb250U2l6ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0TWF0aC5wcmV2aWV3RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnBsdWdpbnMubWF0aC5fcmVuZGVyZXIuY2FsbCh0aGlzLCBleHApO1xuICAgICAgICAgICAgICAgIGNvbnRleHRNYXRoLnByZXZpZXdFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2FsbF9jb250cm9sbGVyOiBmdW5jdGlvbiAobWF0aFRhZykge1xuICAgICAgICB0aGlzLmNvbnRleHQubWF0aC5fbWF0aEV4cCA9IG1hdGhUYWc7XG4gICAgICAgIGNvbnN0IG1hdGhCdG4gPSB0aGlzLmNvbnRleHQubWF0aC5tYXRoQ29udHJvbGxlcjtcblxuICAgICAgICB0aGlzLnNldENvbnRyb2xsZXJQb3NpdGlvbihtYXRoQnRuLCBtYXRoVGFnLCAnYm90dG9tJywge2xlZnQ6IDAsIHRvcDogMH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24obWF0aEJ0biwgbWF0aFRhZywgJ21hdGgnKTtcbiAgICB9LFxuXG4gICAgb25DbGlja19tYXRoQ29udHJvbGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKSB8fCBlLnRhcmdldC5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoL3VwZGF0ZS8udGVzdChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1hdGguZm9jdXNFbGVtZW50LnZhbHVlID0gdGhpcy51dGlsLkhUTUxEZWNvZGVyKHRoaXMuY29udGV4dC5tYXRoLl9tYXRoRXhwLmdldEF0dHJpYnV0ZSgnZGF0YS1leHAnKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuZGlhbG9nLm9wZW4uY2FsbCh0aGlzLCAnbWF0aCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyoqIGRlbGV0ZSAqL1xuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGhpcy5jb250ZXh0Lm1hdGguX21hdGhFeHApO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1hdGguX21hdGhFeHAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XG4gICAgfSxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dE1hdGggPSB0aGlzLmNvbnRleHQubWF0aDtcbiAgICAgICAgY29udGV4dE1hdGgubWF0aENvbnRyb2xsZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29udGV4dE1hdGguX21hdGhFeHAgPSBudWxsO1xuICAgICAgICBjb250ZXh0TWF0aC5mb2N1c0VsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgY29udGV4dE1hdGgucHJldmlld0VsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gY29tbWFuZFxuaW1wb3J0IGJsb2NrcXVvdGUgZnJvbSAnLi9jb21tYW5kL2Jsb2NrcXVvdGUnO1xuXG4vLyBzdWJtZW51XG5pbXBvcnQgYWxpZ24gZnJvbSAnLi9zdWJtZW51L2FsaWduJztcbmltcG9ydCBmb250IGZyb20gJy4vc3VibWVudS9mb250JztcbmltcG9ydCBmb250U2l6ZSBmcm9tICcuL3N1Ym1lbnUvZm9udFNpemUnO1xuaW1wb3J0IGZvbnRDb2xvciBmcm9tICcuL3N1Ym1lbnUvZm9udENvbG9yJztcbmltcG9ydCBoaWxpdGVDb2xvciBmcm9tICcuL3N1Ym1lbnUvaGlsaXRlQ29sb3InO1xuaW1wb3J0IGhvcml6b250YWxSdWxlIGZyb20gJy4vc3VibWVudS9ob3Jpem9udGFsUnVsZSc7XG5pbXBvcnQgbGlzdCBmcm9tICcuL3N1Ym1lbnUvbGlzdCc7XG5pbXBvcnQgdGFibGUgZnJvbSAnLi9zdWJtZW51L3RhYmxlJztcbmltcG9ydCBmb3JtYXRCbG9jayBmcm9tICcuL3N1Ym1lbnUvZm9ybWF0QmxvY2snO1xuaW1wb3J0IGxpbmVIZWlnaHQgZnJvbSAnLi9zdWJtZW51L2xpbmVIZWlnaHQnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJy4vc3VibWVudS90ZW1wbGF0ZSc7XG5pbXBvcnQgcGFyYWdyYXBoU3R5bGUgZnJvbSAnLi9zdWJtZW51L3BhcmFncmFwaFN0eWxlJztcbmltcG9ydCB0ZXh0U3R5bGUgZnJvbSAnLi9zdWJtZW51L3RleHRTdHlsZSc7XG5cbi8vIGRpYWxvZ1xuaW1wb3J0IGxpbmsgZnJvbSAnLi9kaWFsb2cvbGluayc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi9kaWFsb2cvaW1hZ2UnO1xuaW1wb3J0IHZpZGVvIGZyb20gJy4vZGlhbG9nL3ZpZGVvJztcbmltcG9ydCBhdWRpbyBmcm9tICcuL2RpYWxvZy9hdWRpbyc7XG5pbXBvcnQgbWF0aCBmcm9tICcuL2RpYWxvZy9tYXRoJztcblxuLy8gZmlsZSBicm93c2VyXG5pbXBvcnQgaW1hZ2VHYWxsZXJ5IGZyb20gJy4vZmlsZUJyb3dzZXIvaW1hZ2VHYWxsZXJ5JztcblxuZXhwb3J0IHsgYmxvY2txdW90ZSwgYWxpZ24sIGZvbnQsIGZvbnRTaXplLCBmb250Q29sb3IsIGhpbGl0ZUNvbG9yLCBob3Jpem9udGFsUnVsZSwgbGlzdCwgdGFibGUsIGZvcm1hdEJsb2NrLCBsaW5lSGVpZ2h0LCB0ZW1wbGF0ZSwgcGFyYWdyYXBoU3R5bGUsIHRleHRTdHlsZSwgbGluaywgaW1hZ2UsIHZpZGVvLCBhdWRpbywgbWF0aCwgaW1hZ2VHYWxsZXJ5IH07XG5leHBvcnQgZGVmYXVsdCB7IGJsb2NrcXVvdGUsIGFsaWduLCBmb250LCBmb250U2l6ZSwgZm9udENvbG9yLCBoaWxpdGVDb2xvciwgaG9yaXpvbnRhbFJ1bGUsIGxpc3QsIHRhYmxlLCBmb3JtYXRCbG9jaywgbGluZUhlaWdodCwgdGVtcGxhdGUsIHBhcmFncmFwaFN0eWxlLCB0ZXh0U3R5bGUsIGxpbmssIGltYWdlLCB2aWRlbywgYXVkaW8sIG1hdGgsIGltYWdlR2FsbGVyeSB9O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnYmxvY2txdW90ZScsXG4gICAgZGlzcGxheTogJ2NvbW1hbmQnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5ibG9ja3F1b3RlID0ge1xuICAgICAgICAgICAgdGFyZ2V0QnV0dG9uOiB0YXJnZXRFbGVtZW50LFxuICAgICAgICAgICAgdGFnOiBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnQkxPQ0tRVU9URScpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRleHQuYmxvY2txdW90ZS50YXJnZXRCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIGlmICgvYmxvY2txdW90ZS9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0aGlzLmNvbnRleHQuYmxvY2txdW90ZS50YXJnZXRCdXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCbG9ja3F1b3RlID0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGhpcy5nZXRTZWxlY3Rpb25Ob2RlKCksICdibG9ja3F1b3RlJyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCbG9ja3F1b3RlKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50QmxvY2txdW90ZSwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlSYW5nZUZvcm1hdEVsZW1lbnQodGhpcy5jb250ZXh0LmJsb2NrcXVvdGUudGFnLmNsb25lTm9kZShmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxufTsiLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdhbGlnbicsXG4gICAgZGlzcGxheTogJ3N1Ym1lbnUnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmFsaWduID0ge1xuICAgICAgICAgICAgdGFyZ2V0QnV0dG9uOiB0YXJnZXRFbGVtZW50LFxuICAgICAgICAgICAgX2FsaWduTGlzdDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRBbGlnbjogJycsXG4gICAgICAgICAgICBkZWZhdWx0RGlyOiBjb3JlLm9wdGlvbnMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JywgXG4gICAgICAgICAgICBpY29uczoge1xuICAgICAgICAgICAgICAgIGp1c3RpZnk6IGljb25zLmFsaWduX2p1c3RpZnksXG4gICAgICAgICAgICAgICAgbGVmdDogaWNvbnMuYWxpZ25fbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodDogaWNvbnMuYWxpZ25fcmlnaHQsXG4gICAgICAgICAgICAgICAgY2VudGVyOiBpY29ucy5hbGlnbl9jZW50ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQuYWxpZ24uX2FsaWduTGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgICBjb25zdCBsZWZ0RGlyID0gY29yZS5jb250ZXh0LmFsaWduLmRlZmF1bHREaXIgPT09ICdsZWZ0JztcblxuICAgICAgICBjb25zdCBsZWZ0TWVudSA9ICc8bGk+JyArXG4gICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS1idG4tYWxpZ25cIiBkYXRhLWNvbW1hbmQ9XCJqdXN0aWZ5bGVmdFwiIGRhdGEtdmFsdWU9XCJsZWZ0XCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLmFsaWduTGVmdCArICdcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1saXN0LWljb25cIj4nICsgaWNvbnMuYWxpZ25fbGVmdCArICc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnbkxlZnQgK1xuICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAnPC9saT4nO1xuXG4gICAgICAgIGNvbnN0IHJpZ2h0TWVudSA9ICc8bGk+JyArXG4gICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS1idG4tYWxpZ25cIiBkYXRhLWNvbW1hbmQ9XCJqdXN0aWZ5cmlnaHRcIiBkYXRhLXZhbHVlPVwicmlnaHRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25SaWdodCArICdcIj4nICtcbiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS1saXN0LWljb25cIj4nICsgaWNvbnMuYWxpZ25fcmlnaHQgKyc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnblJpZ2h0ICtcbiAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvbGk+JztcblxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXIgc2UtbGlzdC1hbGlnbic7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgKGxlZnREaXIgPyBsZWZ0TWVudSA6IHJpZ2h0TWVudSkgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3Qgc2UtYnRuLWFsaWduXCIgZGF0YS1jb21tYW5kPVwianVzdGlmeWNlbnRlclwiIGRhdGEtdmFsdWU9XCJjZW50ZXJcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25DZW50ZXIgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtbGlzdC1pY29uXCI+JyArIGljb25zLmFsaWduX2NlbnRlciArICc8L3NwYW4+JyArIGxhbmcudG9vbGJhci5hbGlnbkNlbnRlciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAobGVmdERpcj8gcmlnaHRNZW51IDogbGVmdE1lbnUpICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0IHNlLWJ0bi1hbGlnblwiIGRhdGEtY29tbWFuZD1cImp1c3RpZnlmdWxsXCIgZGF0YS12YWx1ZT1cImp1c3RpZnlcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuYWxpZ25KdXN0aWZ5ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLWxpc3QtaWNvblwiPicgKyBpY29ucy5hbGlnbl9qdXN0aWZ5ICsgJzwvc3Bhbj4nICsgbGFuZy50b29sYmFyLmFsaWduSnVzdGlmeSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICc8L3VsPicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBhbGlnbkNvbnRleHQgPSB0aGlzLmNvbnRleHQuYWxpZ247XG4gICAgICAgIGNvbnN0IHRhcmdldEJ1dHRvbiA9IGFsaWduQ29udGV4dC50YXJnZXRCdXR0b247XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldEJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VFbGVtZW50KHRhcmdldCwgYWxpZ25Db250ZXh0Lmljb25zW2FsaWduQ29udGV4dC5kZWZhdWx0RGlyXSk7XG4gICAgICAgICAgICB0YXJnZXRCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZvY3VzJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51dGlsLmlzRm9ybWF0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dEFsaWduID0gZWxlbWVudC5zdHlsZS50ZXh0QWxpZ247XG4gICAgICAgICAgICBpZiAodGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZUVsZW1lbnQodGFyZ2V0LCBhbGlnbkNvbnRleHQuaWNvbnNbdGV4dEFsaWduXSB8fCBhbGlnbkNvbnRleHQuaWNvbnNbYWxpZ25Db250ZXh0LmRlZmF1bHREaXJdKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWZvY3VzJywgdGV4dEFsaWduKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQE92ZXJyaWRlIHN1Ym1lbnVcbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBhbGlnbkNvbnRleHQgPSB0aGlzLmNvbnRleHQuYWxpZ247XG4gICAgICAgIGNvbnN0IGFsaWduTGlzdCA9IGFsaWduQ29udGV4dC5fYWxpZ25MaXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50QWxpZ24gPSBhbGlnbkNvbnRleHQudGFyZ2V0QnV0dG9uLmdldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cycpIHx8IGFsaWduQ29udGV4dC5kZWZhdWx0RGlyO1xuXG4gICAgICAgIGlmIChjdXJyZW50QWxpZ24gIT09IGFsaWduQ29udGV4dC5jdXJyZW50QWxpZ24pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhbGlnbkxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEFsaWduID09PSBhbGlnbkxpc3RbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGFsaWduTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhhbGlnbkxpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFsaWduQ29udGV4dC5jdXJyZW50QWxpZ24gPSBjdXJyZW50QWxpZ247XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlICghdmFsdWUgJiYgIS9VTC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHREaXIgPSB0aGlzLmNvbnRleHQuYWxpZ24uZGVmYXVsdERpcjtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1zdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5zZXRTdHlsZShzZWxlY3RlZEZvcm1zdHNbaV0sICd0ZXh0QWxpZ24nLCAodmFsdWUgPT09IGRlZmF1bHREaXIgPyAnJyA6IHZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVmZmVjdE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICBcbiAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ZvbnQnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQuZm9udCA9IHtcbiAgICAgICAgICAgIHRhcmdldFRleHQ6IHRhcmdldEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnR4dCcpLFxuICAgICAgICAgICAgdGFyZ2V0VG9vbHRpcDogdGFyZ2V0RWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5zZS10b29sdGlwLXRleHQnKSxcbiAgICAgICAgICAgIF9mb250TGlzdDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRGb250OiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJy5zZS1saXN0LWlubmVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2t1cC5iaW5kKGNvcmUpKTtcblxuICAgICAgICBjb250ZXh0LmZvbnQuX2ZvbnRMaXN0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yQWxsKCd1bCBsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllciBzZS1saXN0LWZvbnQtZmFtaWx5JztcblxuICAgICAgICBsZXQgZm9udCwgdGV4dCwgaSwgbGVuO1xuICAgICAgICBsZXQgZm9udExpc3QgPSAhb3B0aW9uLmZvbnQgP1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICdBcmlhbCcsXG4gICAgICAgICAgICAgICAgJ0NvbWljIFNhbnMgTVMnLFxuICAgICAgICAgICAgICAgICdDb3VyaWVyIE5ldycsXG4gICAgICAgICAgICAgICAgJ0ltcGFjdCcsXG4gICAgICAgICAgICAgICAgJ0dlb3JnaWEnLFxuICAgICAgICAgICAgICAgICd0YWhvbWEnLFxuICAgICAgICAgICAgICAgICdUcmVidWNoZXQgTVMnLFxuICAgICAgICAgICAgICAgICdWZXJkYW5hJ1xuICAgICAgICAgICAgXSA6IG9wdGlvbi5mb250O1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRlZmF1bHRfdmFsdWUgc2UtYnRuLWxpc3RcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuZGVmYXVsdCArICdcIj4oJyArIGxhbmcudG9vbGJhci5kZWZhdWx0ICsgJyk8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGZvbnRMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb250ID0gZm9udExpc3RbaV07XG4gICAgICAgICAgICB0ZXh0ID0gZm9udC5zcGxpdCgnLCcpWzBdO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIGZvbnQgKyAnXCIgZGF0YS10eHQ9XCInICsgdGV4dCArICdcIiB0aXRsZT1cIicgKyB0ZXh0ICsgJ1wiIHN0eWxlPVwiZm9udC1mYW1pbHk6JyArIGZvbnQgKyAnO1wiPicgKyB0ZXh0ICsgJzwvYnV0dG9uPjwvbGk+JztcbiAgICAgICAgfVxuICAgICAgICBsaXN0ICs9ICc8L3VsPjwvZGl2Pic7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRleHQuZm9udC50YXJnZXRUZXh0O1xuICAgICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5jb250ZXh0LmZvbnQudGFyZ2V0VG9vbHRpcDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmhhc0ZvY3VzID8gdGhpcy53d0NvbXB1dGVkU3R5bGUuZm9udEZhbWlseSA6IHRoaXMubGFuZy50b29sYmFyLmZvbnQ7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRhcmdldCwgZm9udCk7XG4gICAgICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRvb2x0aXAsIHRoaXMuaGFzRm9jdXMgPyB0aGlzLmxhbmcudG9vbGJhci5mb250ICsgJyAoJyArIGZvbnQgKyAnKScgOiBmb250KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnN0eWxlICYmIGVsZW1lbnQuc3R5bGUuZm9udEZhbWlseS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RGb250ID0gZWxlbWVudC5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoL1tcIiddL2csJycpO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0YXJnZXQsIHNlbGVjdEZvbnQpO1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0b29sdGlwLCB0aGlzLmxhbmcudG9vbGJhci5mb250ICsgJyAoJyArIHNlbGVjdEZvbnQgKyAnKScpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGZvbnRDb250ZXh0ID0gdGhpcy5jb250ZXh0LmZvbnQ7XG4gICAgICAgIGNvbnN0IGZvbnRMaXN0ID0gZm9udENvbnRleHQuX2ZvbnRMaXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50Rm9udCA9IGZvbnRDb250ZXh0LnRhcmdldFRleHQudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGb250ICE9PSBmb250Q29udGV4dC5jdXJyZW50Rm9udCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGZvbnRMaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb250ID09PSBmb250TGlzdFtpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoZm9udExpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MoZm9udExpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvbnRDb250ZXh0LmN1cnJlbnRGb250ID0gY3VycmVudEZvbnQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja3VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIS9eQlVUVE9OJC9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnU1BBTicpO1xuICAgICAgICAgICAgbmV3Tm9kZS5zdHlsZS5mb250RmFtaWx5ID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UobmV3Tm9kZSwgWydmb250LWZhbWlseSddLCBudWxsLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm9kZUNoYW5nZShudWxsLCBbJ2ZvbnQtZmFtaWx5J10sIFsnc3BhbiddLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ZvbnRTaXplJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmZvbnRTaXplID0ge1xuICAgICAgICAgICAgdGFyZ2V0VGV4dDogdGFyZ2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudHh0JyksXG4gICAgICAgICAgICBfc2l6ZUxpc3Q6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50U2l6ZTogJydcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQuZm9udFNpemUuX3NpemVMaXN0ID0gbGlzdFVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpIGJ1dHRvbicpO1xuXG4gICAgICAgIC8qKiBhcHBlbmQgdGFyZ2V0IGJ1dHRvbiBtZW51ICovXG4gICAgICAgIGNvcmUuaW5pdE1lbnVUYXJnZXQodGhpcy5uYW1lLCB0YXJnZXRFbGVtZW50LCBsaXN0RGl2KTtcblxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIGxpc3REaXYgPSBudWxsLCBsaXN0VWwgPSBudWxsO1xuICAgIH0sXG5cbiAgICBzZXRTdWJtZW51OiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBjb3JlLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGxpc3REaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtZm9udC1zaXplJztcblxuICAgICAgICBjb25zdCBzaXplTGlzdCA9ICFvcHRpb24uZm9udFNpemUgPyBbOCwgOSwgMTAsIDExLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzNiwgNDgsIDcyXSA6IG9wdGlvbi5mb250U2l6ZTtcblxuICAgICAgICBsZXQgbGlzdCA9ICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPicgK1xuICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkZWZhdWx0X3ZhbHVlIHNlLWJ0bi1saXN0XCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLmRlZmF1bHQgKyAnXCI+KCcgKyBsYW5nLnRvb2xiYXIuZGVmYXVsdCArICcpPC9idXR0b24+PC9saT4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgdW5pdCA9IG9wdGlvbi5mb250U2l6ZVVuaXQsIGxlbiA9IHNpemVMaXN0Lmxlbmd0aCwgc2l6ZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBzaXplID0gc2l6ZUxpc3RbaV07XG4gICAgICAgICAgICBsaXN0ICs9ICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdFwiIGRhdGEtdmFsdWU9XCInICsgc2l6ZSArIHVuaXQgKyAnXCIgdGl0bGU9XCInICsgc2l6ZSArIHVuaXQgKyAnXCIgc3R5bGU9XCJmb250LXNpemU6JyArIHNpemUgKyB1bml0ICsgJztcIj4nICsgc2l6ZSArICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VUeHQodGhpcy5jb250ZXh0LmZvbnRTaXplLnRhcmdldFRleHQsIHRoaXMuaGFzRm9jdXMgPyB0aGlzLnd3Q29tcHV0ZWRTdHlsZS5mb250U2l6ZSA6IHRoaXMubGFuZy50b29sYmFyLmZvbnRTaXplKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnN0eWxlICYmIGVsZW1lbnQuc3R5bGUuZm9udFNpemUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0aGlzLmNvbnRleHQuZm9udFNpemUudGFyZ2V0VGV4dCwgZWxlbWVudC5zdHlsZS5mb250U2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZm9udFNpemVDb250ZXh0ID0gdGhpcy5jb250ZXh0LmZvbnRTaXplO1xuICAgICAgICBjb25zdCBzaXplTGlzdCA9IGZvbnRTaXplQ29udGV4dC5fc2l6ZUxpc3Q7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gZm9udFNpemVDb250ZXh0LnRhcmdldFRleHQudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTaXplICE9PSBmb250U2l6ZUNvbnRleHQuY3VycmVudFNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzaXplTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2l6ZSA9PT0gc2l6ZUxpc3RbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHNpemVMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHNpemVMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb250U2l6ZUNvbnRleHQuY3VycmVudFNpemUgPSBjdXJyZW50U2l6ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghL15CVVRUT04kL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcbiAgICAgICAgICAgIG5ld05vZGUuc3R5bGUuZm9udFNpemUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm9kZUNoYW5nZShuZXdOb2RlLCBbJ2ZvbnQtc2l6ZSddLCBudWxsLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm9kZUNoYW5nZShudWxsLCBbJ2ZvbnQtc2l6ZSddLCBbJ3NwYW4nXSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnaG9yaXpvbnRhbFJ1bGUnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvcmUuY29udGV4dC5ob3Jpem9udGFsUnVsZSA9IHtcbiAgICAgICAgICAgIGN1cnJlbnRIUjogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdERpdi5xdWVyeVNlbGVjdG9yKCd1bCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5ob3Jpem9udGFsUnVsZVBpY2suYmluZChjb3JlKSk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XG4gICAgICAgIGNvbnN0IGxpc3REaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtbGluZSc7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0IGJ0bl9saW5lXCIgZGF0YS1jb21tYW5kPVwiaG9yaXpvbnRhbFJ1bGVcIiBkYXRhLXZhbHVlPVwic29saWRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuaHJfc29saWQgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociBzdHlsZT1cImJvcmRlci13aWR0aDogMXB4IDAgMDsgYm9yZGVyLXN0eWxlOiBzb2xpZCBub25lIG5vbmU7IGJvcmRlci1jb2xvcjogYmxhY2s7IGJvcmRlci1pbWFnZTogaW5pdGlhbDsgaGVpZ2h0OiAxcHg7XCIgLz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwvbGk+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGk+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBidG5fbGluZVwiIGRhdGEtY29tbWFuZD1cImhvcml6b250YWxSdWxlXCIgZGF0YS12YWx1ZT1cImRvdHRlZFwiIHRpdGxlPVwiJyArIGxhbmcudG9vbGJhci5ocl9kb3R0ZWQgKyAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxociBzdHlsZT1cImJvcmRlci13aWR0aDogMXB4IDAgMDsgYm9yZGVyLXN0eWxlOiBkb3R0ZWQgbm9uZSBub25lOyBib3JkZXItY29sb3I6IGJsYWNrOyBib3JkZXItaW1hZ2U6IGluaXRpYWw7IGhlaWdodDogMXB4O1wiIC8+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXG4gICAgICAgICAgICAgICAgICAgICc8L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3QgYnRuX2xpbmVcIiBkYXRhLWNvbW1hbmQ9XCJob3Jpem9udGFsUnVsZVwiIGRhdGEtdmFsdWU9XCJkYXNoZWRcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuaHJfZGFzaGVkICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aHIgc3R5bGU9XCJib3JkZXItd2lkdGg6IDFweCAwIDA7IGJvcmRlci1zdHlsZTogZGFzaGVkIG5vbmUgbm9uZTsgYm9yZGVyLWNvbG9yOiBibGFjazsgYm9yZGVyLWltYWdlOiBpbml0aWFsOyBoZWlnaHQ6IDFweDtcIiAvPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xuICAgICAgICAgICAgICAgICAgICAnPC9saT4nICtcbiAgICAgICAgICAgICAgICAnPC91bD4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xuICAgIH0sXG5cbiAgICBhY3RpdmU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5oYXNDbGFzcyh0aGlzLmNvbnRleHQuaG9yaXpvbnRhbFJ1bGUuY3VycmVudEhSLCAnb24nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgvSFIvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaG9yaXpvbnRhbFJ1bGUuY3VycmVudEhSID0gZWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy51dGlsLmhhc0NsYXNzKGVsZW1lbnQsICdvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKGVsZW1lbnQsICdvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPbignaHInLCB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLnV0aWwsIGVsZW1lbnQsICdvbicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBhcHBlbmRIcjogZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgICBjb25zdCBvSHIgPSB0aGlzLnV0aWwuY3JlYXRlRWxlbWVudCgnSFInKTtcbiAgICAgICAgb0hyLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRDb21wb25lbnQob0hyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBob3Jpem9udGFsUnVsZVBpY2s6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoIXZhbHVlICYmICEvVUwvaS50ZXN0KHRhcmdldC50YWdOYW1lKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJyk7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBvTm9kZSA9IHRoaXMucGx1Z2lucy5ob3Jpem9udGFsUnVsZS5hcHBlbmRIci5jYWxsKHRoaXMsICdfX3NlX18nICsgdmFsdWUpO1xuICAgICAgICBpZiAob05vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uob05vZGUsIDAsIG9Ob2RlLCAwKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2xpc3QnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQubGlzdCA9IHtcbiAgICAgICAgICAgIHRhcmdldEJ1dHRvbjogdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgICAgIF9saXN0OiBudWxsLFxuICAgICAgICAgICAgY3VycmVudExpc3Q6ICcnLFxuICAgICAgICAgICAgaWNvbnM6IHtcbiAgICAgICAgICAgICAgICBidWxsZXRzOiBjb3JlLmljb25zLmxpc3RfYnVsbGV0cyxcbiAgICAgICAgICAgICAgICBudW1iZXI6IGNvcmUuaWNvbnMubGlzdF9udW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG4gICAgICAgIGNvbnRleHQubGlzdC5fbGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGNvcmUubGFuZztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcblxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLWxpc3QtbGF5ZXInO1xuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9ICcnICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPicgK1xuICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICc8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdCBzZS10b29sdGlwXCIgZGF0YS1jb21tYW5kPVwiT0xcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIub3JkZXJMaXN0ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5saXN0X251bWJlciArXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3Qgc2UtdG9vbHRpcFwiIGRhdGEtY29tbWFuZD1cIlVMXCIgdGl0bGU9XCInICsgbGFuZy50b29sYmFyLnVub3JkZXJMaXN0ICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29yZS5pY29ucy5saXN0X2J1bGxldHMgK1xuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+PC9saT4nICtcbiAgICAgICAgICAgICAgICAnPC91bD4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xuICAgIH0sXG5cbiAgICAgLyoqXG4gICAgICogQE92ZXJyaWRlIGNvcmVcbiAgICAgKi9cbiAgICBhY3RpdmU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuY29udGV4dC5saXN0LnRhcmdldEJ1dHRvbjtcbiAgICAgICAgY29uc3QgaWNvbiA9IGJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZm9jdXMnKTtcbiAgICAgICAgICAgIHV0aWwuY2hhbmdlRWxlbWVudChpY29uLCB0aGlzLmNvbnRleHQubGlzdC5pY29ucy5udW1iZXIpO1xuICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhidXR0b24sICdhY3RpdmUnKTtcbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmlzTGlzdChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cycsIG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoYnV0dG9uLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICBpZiAoL1VML2kudGVzdChub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZUVsZW1lbnQoaWNvbiwgdGhpcy5jb250ZXh0Lmxpc3QuaWNvbnMuYnVsbGV0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlRWxlbWVudChpY29uLCB0aGlzLmNvbnRleHQubGlzdC5pY29ucy5udW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbGlzdENvbnRleHQgPSB0aGlzLmNvbnRleHQubGlzdDtcbiAgICAgICAgY29uc3QgbGlzdCA9IGxpc3RDb250ZXh0Ll9saXN0O1xuICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IGxpc3RDb250ZXh0LnRhcmdldEJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtZm9jdXMnKSB8fCAnJztcblxuICAgICAgICBpZiAoY3VycmVudExpc3QgIT09IGxpc3RDb250ZXh0LmN1cnJlbnRMaXN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGlzdCA9PT0gbGlzdFtpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhsaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGxpc3RbaV0sICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpc3RDb250ZXh0LmN1cnJlbnRMaXN0ID0gY3VycmVudExpc3Q7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZWRpdExpc3Q6IGZ1bmN0aW9uIChjb21tYW5kLCBzZWxlY3RlZENlbGxzLCBkZXRhY2gpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRGb3JtYXRzID0gIXNlbGVjdGVkQ2VsbHMgPyB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHNBbmRDb21wb25lbnRzKGZhbHNlKSA6IHNlbGVjdGVkQ2VsbHM7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENlbGxzKSByZXR1cm47XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2VfYWRkTGluZShyYW5nZSwgbnVsbCk7XG4gICAgICAgICAgICBzZWxlY3RlZEZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHNBbmRDb21wb25lbnRzKGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1hdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XG4gICAgICAgIHV0aWwuc29ydEJ5RGVwdGgoc2VsZWN0ZWRGb3JtYXRzLCB0cnVlKTtcblxuICAgICAgICAvLyBtZXJnZVxuICAgICAgICBsZXQgZmlyc3RTZWwgPSBzZWxlY3RlZEZvcm1hdHNbMF07XG4gICAgICAgIGxldCBsYXN0U2VsID0gc2VsZWN0ZWRGb3JtYXRzW3NlbGVjdGVkRm9ybWF0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHRvcEVsID0gKHV0aWwuaXNMaXN0Q2VsbChmaXJzdFNlbCkgfHwgdXRpbC5pc0NvbXBvbmVudChmaXJzdFNlbCkpICYmICFmaXJzdFNlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID8gZmlyc3RTZWwucGFyZW50Tm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIDogZmlyc3RTZWwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgbGV0IGJvdHRvbUVsID0gKHV0aWwuaXNMaXN0Q2VsbChsYXN0U2VsKSB8fCB1dGlsLmlzQ29tcG9uZW50KGxhc3RTZWwpKSAmJiAhbGFzdFNlbC5uZXh0RWxlbWVudFNpYmxpbmcgPyBsYXN0U2VsLnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nIDogbGFzdFNlbC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luUmFuZ2UgPSB7XG4gICAgICAgICAgICBzYzogcmFuZ2Uuc3RhcnRDb250YWluZXIsXG4gICAgICAgICAgICBzbzogcmFuZ2Uuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICBlYzogcmFuZ2UuZW5kQ29udGFpbmVyLFxuICAgICAgICAgICAgZW86IHJhbmdlLmVuZE9mZnNldFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBpc1JlbW92ZSA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkRm9ybWF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKCF1dGlsLmlzTGlzdCh1dGlsLmdldFJhbmdlRm9ybWF0RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sIGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGN1cnJlbnQpICYmIGN1cnJlbnQgIT09IHNlbGVjdGVkRm9ybWF0c1tpXTtcbiAgICAgICAgICAgIH0uYmluZCh1dGlsKSkpKSB7XG4gICAgICAgICAgICAgICAgaXNSZW1vdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlbW92ZSAmJiAoIXRvcEVsIHx8IChmaXJzdFNlbC50YWdOYW1lICE9PSB0b3BFbC50YWdOYW1lIHx8IGNvbW1hbmQgIT09IHRvcEVsLnRhZ05hbWUudG9VcHBlckNhc2UoKSkpICYmICghYm90dG9tRWwgfHwgKGxhc3RTZWwudGFnTmFtZSAhPT0gYm90dG9tRWwudGFnTmFtZSB8fCBjb21tYW5kICE9PSBib3R0b21FbC50YWdOYW1lLnRvVXBwZXJDYXNlKCkpKSkge1xuICAgICAgICAgICAgaWYgKGRldGFjaCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0c1tqXS5jb250YWlucyhzZWxlY3RlZEZvcm1hdHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGb3JtYXRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07IGxlbi0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Rm9ybWF0ID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoZmlyc3RTZWwpO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsID0gY3VycmVudEZvcm1hdCAmJiBjdXJyZW50Rm9ybWF0LnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2VBcnIsIHRlbXBMaXN0O1xuICAgICAgICAgICAgY29uc3QgcGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgfS5iaW5kKHV0aWwpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWNhbmNlbCkgdGVtcExpc3QgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoY29tbWFuZCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoLCByLCBvOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzW2ldLCBwYXNzQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIW8gfHwgIXV0aWwuaXNMaXN0KG8pKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGlmICghcikge1xuICAgICAgICAgICAgICAgICAgICByID0gbztcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIgPSB7cjogciwgZjogW3V0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpXX07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhY2ggJiYgdXRpbC5pc0xpc3RDZWxsKG8ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGlzdC5fZGV0YWNoTmVzdGVkLmNhbGwodGhpcywgcmFuZ2VBcnIuZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoUmFuZ2VGb3JtYXRFbGVtZW50KHJhbmdlQXJyLmZbMF0ucGFyZW50Tm9kZSwgcmFuZ2VBcnIuZiwgdGVtcExpc3QsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHNlbGVjdGVkRm9ybWF0c1tpXS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5jZWwpIHRlbXBMaXN0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByID0gbztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQXJyID0ge3I6IHIsIGY6IFt1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0ZWRGb3JtYXRzW2ldLCAnTEknKV19O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VBcnIuZi5wdXNoKHV0aWwuZ2V0UGFyZW50RWxlbWVudChzZWxlY3RlZEZvcm1hdHNbaV0sICdMSScpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWNoICYmIHV0aWwuaXNMaXN0Q2VsbChvLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMubGlzdC5fZGV0YWNoTmVzdGVkLmNhbGwodGhpcywgcmFuZ2VBcnIuZik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaFJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUFyci5mWzBdLnBhcmVudE5vZGUsIHJhbmdlQXJyLmYsIHRlbXBMaXN0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0b3BFbFBhcmVudCA9IHRvcEVsID8gdG9wRWwucGFyZW50Tm9kZSA6IHRvcEVsO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tRWxQYXJlbnQgPSBib3R0b21FbCA/IGJvdHRvbUVsLnBhcmVudE5vZGUgOiBib3R0b21FbDtcbiAgICAgICAgICAgIHRvcEVsID0gdG9wRWxQYXJlbnQgJiYgIXV0aWwuaXNXeXNpd3lnRGl2KHRvcEVsUGFyZW50KSAmJiB0b3BFbFBhcmVudC5ub2RlTmFtZSA9PT0gY29tbWFuZCA/IHRvcEVsUGFyZW50IDogdG9wRWw7XG4gICAgICAgICAgICBib3R0b21FbCA9IGJvdHRvbUVsUGFyZW50ICYmICF1dGlsLmlzV3lzaXd5Z0Rpdihib3R0b21FbFBhcmVudCkgJiYgYm90dG9tRWxQYXJlbnQubm9kZU5hbWUgPT09IGNvbW1hbmQgPyBib3R0b21FbFBhcmVudCA6IGJvdHRvbUVsO1xuXG4gICAgICAgICAgICBjb25zdCBtZXJnZVRvcCA9IHRvcEVsICYmIHRvcEVsLnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBjb25zdCBtZXJnZUJvdHRvbSA9IGJvdHRvbUVsICYmIGJvdHRvbUVsLnRhZ05hbWUgPT09IGNvbW1hbmQ7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbWVyZ2VUb3AgPyB0b3BFbCA6IHV0aWwuY3JlYXRlRWxlbWVudChjb21tYW5kKTtcbiAgICAgICAgICAgIGxldCBmaXJzdExpc3QgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGxhc3RMaXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0b3BOdW1iZXIgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGJvdHRvbU51bWJlciA9IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0NvbXBvbmVudChjdXJyZW50KSAmJiAhdGhpcy5pc0xpc3QoY3VycmVudCk7XG4gICAgICAgICAgICB9LmJpbmQodXRpbCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZEZvcm1hdHMubGVuZ3RoLCBuZXdDZWxsLCBmVGFnLCBpc0NlbGwsIG5leHQsIG9yaWdpblBhcmVudCwgbmV4dFBhcmVudCwgcGFyZW50VGFnLCBzaWJsaW5nVGFnLCByYW5nZVRhZzsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZlRhZyA9IHNlbGVjdGVkRm9ybWF0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZlRhZy5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhdXRpbC5faXNJZ25vcmVOb2RlQ2hhbmdlKGZUYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShmVGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBzZWxlY3RlZEZvcm1hdHNbaSArIDFdO1xuICAgICAgICAgICAgICAgIG9yaWdpblBhcmVudCA9IGZUYWcucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBuZXh0UGFyZW50ID0gbmV4dCA/IG5leHQucGFyZW50Tm9kZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaXNDZWxsID0gdXRpbC5pc0xpc3RDZWxsKGZUYWcpO1xuICAgICAgICAgICAgICAgIHJhbmdlVGFnID0gdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChvcmlnaW5QYXJlbnQpID8gb3JpZ2luUGFyZW50IDogbnVsbDtcbiAgICAgICAgICAgICAgICBwYXJlbnRUYWcgPSBpc0NlbGwgJiYgIXV0aWwuaXNXeXNpd3lnRGl2KG9yaWdpblBhcmVudCkgPyBvcmlnaW5QYXJlbnQucGFyZW50Tm9kZSA6IG9yaWdpblBhcmVudDtcbiAgICAgICAgICAgICAgICBzaWJsaW5nVGFnID0gaXNDZWxsICYmICF1dGlsLmlzV3lzaXd5Z0RpdihvcmlnaW5QYXJlbnQpID8gKCFuZXh0IHx8IHV0aWwuaXNMaXN0Q2VsbChwYXJlbnRUYWcpKSA/IG9yaWdpblBhcmVudCA6IG9yaWdpblBhcmVudC5uZXh0U2libGluZyA6IGZUYWcubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICBuZXdDZWxsID0gdXRpbC5jcmVhdGVFbGVtZW50KCdMSScpO1xuICAgICAgICAgICAgICAgIHV0aWwuY29weUZvcm1hdEF0dHJpYnV0ZXMobmV3Q2VsbCwgZlRhZyk7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNDb21wb25lbnQoZlRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIUiA9IC9eSFIkL2kudGVzdChmVGFnLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0hSKSBuZXdDZWxsLmlubmVySFRNTCA9ICc8YnI+JztcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbC5pbm5lckhUTUwgKz0gZlRhZy5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hSKSBuZXdDZWxsLmlubmVySFRNTCArPSAnPGJyPic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZkNoaWxkcmVuID0gZlRhZy5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZkNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDZWxsLmFwcGVuZENoaWxkKGZDaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGlzdC5hcHBlbmRDaGlsZChuZXdDZWxsKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmV4dCkgbGFzdExpc3QgPSBsaXN0O1xuICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCBwYXJlbnRUYWcgIT09IG5leHRQYXJlbnQgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChzaWJsaW5nVGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0TGlzdCkgZmlyc3RMaXN0ID0gbGlzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghbWVyZ2VUb3AgfHwgIW5leHQgfHwgcGFyZW50VGFnICE9PSBuZXh0UGFyZW50KSAmJiAhKG5leHQgJiYgdXRpbC5pc0xpc3QobmV4dFBhcmVudCkgJiYgbmV4dFBhcmVudCA9PT0gb3JpZ2luUGFyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QucGFyZW50Tm9kZSAhPT0gcGFyZW50VGFnKSBwYXJlbnRUYWcuaW5zZXJ0QmVmb3JlKGxpc3QsIHNpYmxpbmdUYWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGZUYWcpO1xuICAgICAgICAgICAgICAgIGlmIChtZXJnZVRvcCAmJiB0b3BOdW1iZXIgPT09IG51bGwpIHRvcE51bWJlciA9IGxpc3QuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiAodXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQobmV4dFBhcmVudCwgcGFzc0NvbXBvbmVudCkgIT09IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KG9yaWdpblBhcmVudCwgcGFzc0NvbXBvbmVudCkgfHwgKHV0aWwuaXNMaXN0KG5leHRQYXJlbnQpICYmIHV0aWwuaXNMaXN0KG9yaWdpblBhcmVudCkgJiYgdXRpbC5nZXRFbGVtZW50RGVwdGgobmV4dFBhcmVudCkgIT09IHV0aWwuZ2V0RWxlbWVudERlcHRoKG9yaWdpblBhcmVudCkpKSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ID0gdXRpbC5jcmVhdGVFbGVtZW50KGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyYW5nZVRhZyAmJiByYW5nZVRhZy5jaGlsZHJlbi5sZW5ndGggPT09IDApIHV0aWwucmVtb3ZlSXRlbShyYW5nZVRhZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b3BOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBmaXJzdExpc3QgPSBmaXJzdExpc3QuY2hpbGRyZW5bdG9wTnVtYmVyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1lcmdlQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgYm90dG9tTnVtYmVyID0gbGlzdC5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGxpc3QuaW5uZXJIVE1MICs9IGJvdHRvbUVsLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICBsYXN0TGlzdCA9IGxpc3QuY2hpbGRyZW5bYm90dG9tTnVtYmVyXTtcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oYm90dG9tRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVmZmVjdE5vZGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gb3JpZ2luUmFuZ2U7XG4gICAgfSxcblxuICAgIF9kZXRhY2hOZXN0ZWQ6IGZ1bmN0aW9uIChjZWxscykge1xuICAgICAgICBjb25zdCBmaXJzdCA9IGNlbGxzWzBdO1xuICAgICAgICBjb25zdCBsYXN0ID0gY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IG5leHQgPSBsYXN0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgY29uc3Qgb3JpZ2luTGlzdCA9IGZpcnN0LnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBvcmlnaW5MaXN0LnBhcmVudE5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gb3JpZ2luTGlzdC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNlbGxzW2NdLCBzaWJsaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIG9yaWdpbkxpc3QuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3TGlzdCA9IG9yaWdpbkxpc3QuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JpZ2luTGlzdC5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnV0aWwuZ2V0UG9zaXRpb25JbmRleChuZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlbltpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBuZXdMaXN0LmFwcGVuZENoaWxkKGNoaWxkcmVuW2luZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0LmFwcGVuZENoaWxkKG5ld0xpc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yaWdpbkxpc3QuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB0aGlzLnV0aWwucmVtb3ZlSXRlbShvcmlnaW5MaXN0KTtcbiAgICAgICAgdGhpcy51dGlsLm1lcmdlU2FtZVRhZ3MocGFyZW50Tm9kZSk7XG5cbiAgICAgICAgY29uc3QgZWRnZSA9IHRoaXMudXRpbC5nZXRFZGdlQ2hpbGROb2RlcyhmaXJzdCwgbGFzdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNjOiBmaXJzdC5wYXJlbnROb2RlLFxuICAgICAgICAgICAgc2M6IGVkZ2Uuc2MsXG4gICAgICAgICAgICBlYzogZWRnZS5lY1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBlZGl0SW5zaWRlTGlzdDogZnVuY3Rpb24gKHJlbW92ZSwgc2VsZWN0ZWRDZWxscykge1xuICAgICAgICBzZWxlY3RlZENlbGxzID0gIXNlbGVjdGVkQ2VsbHMgPyB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzLmlzTGlzdENlbGwoZWwpOyB9LmJpbmQodGhpcy51dGlsKSkgOiBzZWxlY3RlZENlbGxzO1xuICAgICAgICBjb25zdCBjZWxsc0xlbiA9IHNlbGVjdGVkQ2VsbHMubGVuZ3RoO1xuICAgICAgICBpZiAoY2VsbHNMZW4gPT09IDAgfHwgKCFyZW1vdmUgJiYgKCF0aGlzLnV0aWwuaXNMaXN0Q2VsbChzZWxlY3RlZENlbGxzWzBdLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpICYmICF0aGlzLnV0aWwuaXNMaXN0Q2VsbChzZWxlY3RlZENlbGxzW2NlbGxzTGVuIC0gMV0ubmV4dEVsZW1lbnRTaWJsaW5nKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNjOiBzZWxlY3RlZENlbGxzWzBdLFxuICAgICAgICAgICAgICAgIHNvOiAwLFxuICAgICAgICAgICAgICAgIGVjOiBzZWxlY3RlZENlbGxzW2NlbGxzTGVuIC0gMV0sXG4gICAgICAgICAgICAgICAgZW86IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luTGlzdCA9IHNlbGVjdGVkQ2VsbHNbMF0ucGFyZW50Tm9kZTtcbiAgICAgICAgbGV0IGxhc3RDZWxsID0gc2VsZWN0ZWRDZWxsc1tjZWxsc0xlbiAtIDFdO1xuICAgICAgICBsZXQgcmFuZ2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgIGlmIChvcmlnaW5MaXN0ICE9PSBsYXN0Q2VsbC5wYXJlbnROb2RlICYmIHRoaXMudXRpbC5pc0xpc3QobGFzdENlbGwucGFyZW50Tm9kZS5wYXJlbnROb2RlKSAmJiBsYXN0Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBsYXN0Q2VsbCA9IGxhc3RDZWxsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAobGFzdENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5wdXNoKGxhc3RDZWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdENlbGwgPSBsYXN0Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnBsdWdpbnMubGlzdC5lZGl0TGlzdC5jYWxsKHRoaXMsIG9yaWdpbkxpc3Qubm9kZU5hbWUudG9VcHBlckNhc2UoKSwgc2VsZWN0ZWRDZWxscywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW5uZXJMaXN0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQob3JpZ2luTGlzdC5ub2RlTmFtZSk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHNlbGVjdGVkQ2VsbHNbMF0ucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbGFzdENlbGwubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVBhdGggPSB7IHM6IG51bGwsIGU6IG51bGwsIHNsOiBvcmlnaW5MaXN0LCBlbDogb3JpZ2luTGlzdCB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2VsbHNMZW4sIGM7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGMgPSBzZWxlY3RlZENlbGxzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjLnBhcmVudE5vZGUgIT09IG9yaWdpbkxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmxpc3QuX2luc2llZExpc3QuY2FsbCh0aGlzLCBvcmlnaW5MaXN0LCBpbm5lckxpc3QsIHByZXYsIG5leHQsIG5vZGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luTGlzdCA9IGMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJMaXN0ID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQob3JpZ2luTGlzdC5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByZXYgPSBjLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGMubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGlubmVyTGlzdC5hcHBlbmRDaGlsZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmxpc3QuX2luc2llZExpc3QuY2FsbCh0aGlzLCBvcmlnaW5MaXN0LCBpbm5lckxpc3QsIHByZXYsIG5leHQsIG5vZGVQYXRoKTtcblxuICAgICAgICAgICAgY29uc3Qgc2MgPSB0aGlzLnV0aWwuZ2V0Tm9kZUZyb21QYXRoKG5vZGVQYXRoLnMsIG5vZGVQYXRoLnNsKTtcbiAgICAgICAgICAgIGNvbnN0IGVjID0gdGhpcy51dGlsLmdldE5vZGVGcm9tUGF0aChub2RlUGF0aC5lLCBub2RlUGF0aC5lbCk7XG4gICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzYzogc2MsXG4gICAgICAgICAgICAgICAgc286IDAsXG4gICAgICAgICAgICAgICAgZWM6IGVjLFxuICAgICAgICAgICAgICAgIGVvOiBlYy50ZXh0Q29udGVudC5sZW5ndGhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfSxcblxuICAgIF9pbnNpZWRMaXN0OiBmdW5jdGlvbiAob3JpZ2luTGlzdCwgaW5uZXJMaXN0LCBwcmV2LCBuZXh0LCBub2RlUGF0aCkge1xuICAgICAgICBsZXQgaW5zZXJ0UHJldiA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcmV2ICYmIGlubmVyTGlzdC50YWdOYW1lID09PSBwcmV2LnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gaW5uZXJMaXN0LmNoaWxkcmVuO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgcHJldi5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlubmVyTGlzdCA9IHByZXY7XG4gICAgICAgICAgICBpbnNlcnRQcmV2ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ICYmIGlubmVyTGlzdC50YWdOYW1lID09PSBuZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgIGlubmVyTGlzdC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIG5leHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0KTtcbiAgICAgICAgICAgIG5leHQgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpbnNlcnRQcmV2KSB7XG4gICAgICAgICAgICBpZiAodGhpcy51dGlsLmlzTGlzdENlbGwocHJldikpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5MaXN0ID0gcHJldjtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JpZ2luTGlzdC5pbnNlcnRCZWZvcmUoaW5uZXJMaXN0LCBuZXh0KTtcblxuICAgICAgICAgICAgaWYgKCFub2RlUGF0aC5zKSB7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGgucyA9IHRoaXMudXRpbC5nZXROb2RlUGF0aChpbm5lckxpc3QuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RDaGlsZCwgb3JpZ2luTGlzdCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgbm9kZVBhdGguc2wgPSBvcmlnaW5MaXN0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzbFBhdGggPSBvcmlnaW5MaXN0LmNvbnRhaW5zKG5vZGVQYXRoLnNsKSA/IHRoaXMudXRpbC5nZXROb2RlUGF0aChub2RlUGF0aC5zbCwgb3JpZ2luTGlzdCkgOiBudWxsO1xuICAgICAgICAgICAgbm9kZVBhdGguZSA9IHRoaXMudXRpbC5nZXROb2RlUGF0aChpbm5lckxpc3QubGFzdEVsZW1lbnRDaGlsZC5maXJzdENoaWxkLCBvcmlnaW5MaXN0LCBudWxsKTtcbiAgICAgICAgICAgIG5vZGVQYXRoLmVsID0gb3JpZ2luTGlzdDtcblxuICAgICAgICAgICAgdGhpcy51dGlsLm1lcmdlU2FtZVRhZ3Mob3JpZ2luTGlzdCwgW25vZGVQYXRoLnMsIG5vZGVQYXRoLmUsIHNsUGF0aF0sIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMudXRpbC5tZXJnZU5lc3RlZFRhZ3Mob3JpZ2luTGlzdCk7XG4gICAgICAgICAgICBpZiAoc2xQYXRoKSBub2RlUGF0aC5zbCA9IHRoaXMudXRpbC5nZXROb2RlRnJvbVBhdGgoc2xQYXRoLCBvcmlnaW5MaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbm5lckxpc3Q7XG4gICAgfSxcblxuICAgIHBpY2t1cDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgbGV0IGNvbW1hbmQgPSAnJztcblxuICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9eVUwkL2kudGVzdCh0YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnBsdWdpbnMubGlzdC5lZGl0TGlzdC5jYWxsKHRoaXMsIGNvbW1hbmQsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJhbmdlKSB0aGlzLnNldFJhbmdlKHJhbmdlLnNjLCByYW5nZS5zbywgcmFuZ2UuZWMsIHJhbmdlLmVvKTtcblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICd0YWJsZScsXHJcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXHJcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcclxuICAgICAgICBsZXQgY29udGV4dFRhYmxlID0gY29udGV4dC50YWJsZSA9IHtcclxuICAgICAgICAgICAgX2VsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ZEVsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ckVsZW1lbnQ6IG51bGwsXHJcbiAgICAgICAgICAgIF90ckVsZW1lbnRzOiBudWxsLFxyXG4gICAgICAgICAgICBfdGFibGVYWTogW10sXHJcbiAgICAgICAgICAgIF9tYXhXaWR0aDogdHJ1ZSxcclxuICAgICAgICAgICAgX2ZpeGVkQ29sdW1uOiBmYWxzZSxcclxuICAgICAgICAgICAgX3J0bDogY29yZS5vcHRpb25zLnJ0bCxcclxuICAgICAgICAgICAgY2VsbENvbnRyb2xsZXJUb3A6IGNvcmUub3B0aW9ucy50YWJsZUNlbGxDb250cm9sbGVyUG9zaXRpb24gPT09ICd0b3AnLFxyXG4gICAgICAgICAgICByZXNpemVUZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBoZWFkZXJCdXR0b246IG51bGwsXHJcbiAgICAgICAgICAgIG1lcmdlQnV0dG9uOiBudWxsLFxyXG4gICAgICAgICAgICBzcGxpdEJ1dHRvbjogbnVsbCxcclxuICAgICAgICAgICAgc3BsaXRNZW51OiBudWxsLFxyXG4gICAgICAgICAgICBtYXhUZXh0OiBjb3JlLmxhbmcuY29udHJvbGxlci5tYXhTaXplLFxyXG4gICAgICAgICAgICBtaW5UZXh0OiBjb3JlLmxhbmcuY29udHJvbGxlci5taW5TaXplLFxyXG4gICAgICAgICAgICBfcGh5c2ljYWxfY2VsbENudDogMCxcclxuICAgICAgICAgICAgX2xvZ2ljYWxfY2VsbENudDogMCxcclxuICAgICAgICAgICAgX3Jvd0NudDogMCxcclxuICAgICAgICAgICAgX3Jvd0luZGV4OiAwLFxyXG4gICAgICAgICAgICBfcGh5c2ljYWxfY2VsbEluZGV4OiAwLFxyXG4gICAgICAgICAgICBfbG9naWNhbF9jZWxsSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIF9jdXJyZW50X2NvbFNwYW46IDAsXHJcbiAgICAgICAgICAgIF9jdXJyZW50X3Jvd1NwYW46IDAsXHJcbiAgICAgICAgICAgIGljb25zOiB7XHJcbiAgICAgICAgICAgICAgICBleHBhbnNpb246IGNvcmUuaWNvbnMuZXhwYW5zaW9uLFxyXG4gICAgICAgICAgICAgICAgcmVkdWN0aW9uOiBjb3JlLmljb25zLnJlZHVjdGlvblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXHJcbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XHJcbiAgICAgICAgbGV0IHRhYmxlUGlja2VyID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtY29udHJvbGxlci10YWJsZS1waWNrZXInKTtcclxuXHJcbiAgICAgICAgY29udGV4dFRhYmxlLnRhYmxlSGlnaGxpZ2h0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtdGFibGUtc2l6ZS1oaWdobGlnaHRlZCcpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZVVuSGlnaGxpZ2h0ID0gbGlzdERpdi5xdWVyeVNlbGVjdG9yKCcuc2UtdGFibGUtc2l6ZS11bmhpZ2hsaWdodGVkJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLnRhYmxlRGlzcGxheSA9IGxpc3REaXYucXVlcnlTZWxlY3RvcignLnNlLXRhYmxlLXNpemUtZGlzcGxheScpO1xyXG4gICAgICAgIGlmIChjb3JlLm9wdGlvbnMucnRsKSBjb250ZXh0VGFibGUudGFibGVIaWdobGlnaHQuc3R5bGUubGVmdCA9ICgxMCAqIDE4IC0gMTMpICsgJ3B4JztcclxuXHJcbiAgICAgICAgLyoqIHNldCB0YWJsZSBjb250cm9sbGVyICovXHJcbiAgICAgICAgbGV0IHRhYmxlQ29udHJvbGxlciA9IHRoaXMuc2V0Q29udHJvbGxlcl90YWJsZShjb3JlKTtcclxuICAgICAgICBjb250ZXh0VGFibGUudGFibGVDb250cm9sbGVyID0gdGFibGVDb250cm9sbGVyO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5yZXNpemVCdXR0b24gPSB0YWJsZUNvbnRyb2xsZXIucXVlcnlTZWxlY3RvcignLl9zZV90YWJsZV9yZXNpemUnKTtcclxuICAgICAgICBjb250ZXh0VGFibGUucmVzaXplVGV4dCA9IHRhYmxlQ29udHJvbGxlci5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX3Jlc2l6ZSA+IHNwYW4gPiBzcGFuJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoJy5fc2VfdGFibGVfZml4ZWRfY29sdW1uJyk7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLmhlYWRlckJ1dHRvbiA9IHRhYmxlQ29udHJvbGxlci5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2hlYWRlcicpO1xyXG5cclxuICAgICAgICAvKiogc2V0IHJlc2l6aW5nICovXHJcbiAgICAgICAgbGV0IHJlc2l6ZURpdiA9IHRoaXMuc2V0Q29udHJvbGxlcl90YWJsZUVkaXRvcihjb3JlLCBjb250ZXh0VGFibGUuY2VsbENvbnRyb2xsZXJUb3ApO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5yZXNpemVEaXYgPSByZXNpemVEaXY7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLnNwbGl0TWVudSA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuc2UtYnRuLWdyb3VwLXN1YicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5tZXJnZUJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX21lcmdlX2J1dHRvbicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5zcGxpdEJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX3NwbGl0X2J1dHRvbicpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dBYm92ZUJ1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2luc2VydF9yb3dfYScpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dCZWxvd0J1dHRvbiA9IHJlc2l6ZURpdi5xdWVyeVNlbGVjdG9yKCcuX3NlX3RhYmxlX2luc2VydF9yb3dfYicpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgdGFibGVQaWNrZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZV90YWJsZVBpY2tlci5iaW5kKGNvcmUsIGNvbnRleHRUYWJsZSkpO1xyXG4gICAgICAgIHRhYmxlUGlja2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5hcHBlbmRUYWJsZS5iaW5kKGNvcmUpKTtcclxuICAgICAgICByZXNpemVEaXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfdGFibGVDb250cm9sbGVyLmJpbmQoY29yZSkpO1xyXG4gICAgICAgIHRhYmxlQ29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja190YWJsZUNvbnRyb2xsZXIuYmluZChjb3JlKSk7XHJcblxyXG4gICAgICAgIC8qKiBhcHBlbmQgdGFyZ2V0IGJ1dHRvbiBtZW51ICovXHJcbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xyXG5cclxuICAgICAgICAvKiogYXBwZW5kIGNvbnRyb2xsZXIgKi9cclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQocmVzaXplRGl2KTtcclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYXBwZW5kQ2hpbGQodGFibGVDb250cm9sbGVyKTtcclxuXHJcbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xyXG4gICAgICAgIGxpc3REaXYgPSBudWxsLCB0YWJsZVBpY2tlciA9IG51bGwsIHJlc2l6ZURpdiA9IG51bGwsIHRhYmxlQ29udHJvbGxlciA9IG51bGwsIGNvbnRleHRUYWJsZSA9IG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XHJcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzZS1zdWJtZW51IHNlLXNlbGVjdG9yLXRhYmxlJztcclxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9ICcnICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS10YWJsZS1zaXplXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXRhYmxlLXNpemUtcGlja2VyIHNlLWNvbnRyb2xsZXItdGFibGUtcGlja2VyXCI+PC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLXRhYmxlLXNpemUtaGlnaGxpZ2h0ZWRcIj48L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtdGFibGUtc2l6ZS11bmhpZ2hsaWdodGVkXCI+PC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS10YWJsZS1zaXplLWRpc3BsYXlcIj4xIHggMTwvZGl2Pic7XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0RGl2O1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRDb250cm9sbGVyX3RhYmxlOiBmdW5jdGlvbiAoY29yZSkge1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUmVzaXplID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICB0YWJsZVJlc2l6ZS5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLXRhYmxlJztcclxuICAgICAgICB0YWJsZVJlc2l6ZS5pbm5lckhUTUwgPSAnJyArXHJcbiAgICAgICAgICAgICc8ZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1idG4tZ3JvdXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwicmVzaXplXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfcmVzaXplXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmV4cGFuc2lvbiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIubWF4U2l6ZSArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwibGF5b3V0XCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfZml4ZWRfY29sdW1uXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLmZpeGVkX2NvbHVtbl93aWR0aCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuZml4ZWRDb2x1bW5XaWR0aCArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiaGVhZGVyXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfaGVhZGVyXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zLnRhYmxlX2hlYWRlciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIudGFibGVIZWFkZXIgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cInJlbW92ZVwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnMuZGVsZXRlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5yZW1vdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVSZXNpemU7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldENvbnRyb2xsZXJfdGFibGVFZGl0b3I6IGZ1bmN0aW9uIChjb3JlLCBjZWxsQ29udHJvbGxlclRvcCkge1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSBjb3JlLmxhbmc7XHJcbiAgICAgICAgY29uc3QgaWNvbnMgPSBjb3JlLmljb25zO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUmVzaXplID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICB0YWJsZVJlc2l6ZS5jbGFzc05hbWUgPSAnc2UtY29udHJvbGxlciBzZS1jb250cm9sbGVyLXRhYmxlLWNlbGwnO1xyXG4gICAgICAgIHRhYmxlUmVzaXplLmlubmVySFRNTCA9IChjZWxsQ29udHJvbGxlclRvcCA/ICcnIDogJzxkaXYgY2xhc3M9XCJzZS1hcnJvdyBzZS1hcnJvdy11cFwiPjwvZGl2PicpICtcclxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1idG4tZ3JvdXBcIj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwicm93XCIgZGF0YS1vcHRpb249XCJ1cFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXAgX3NlX3RhYmxlX2luc2VydF9yb3dfYVwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLmluc2VydF9yb3dfYWJvdmUgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Um93QWJvdmUgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwicm93XCIgZGF0YS1vcHRpb249XCJkb3duXCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcCBfc2VfdGFibGVfaW5zZXJ0X3Jvd19iXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbnMuaW5zZXJ0X3Jvd19iZWxvdyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5pbnNlcnRSb3dCZWxvdyArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cImRlbGV0ZVwiIGRhdGEtdmFsdWU9XCJyb3dcIiBjbGFzcz1cInNlLWJ0biBzZS10b29sdGlwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbnMuZGVsZXRlX3JvdyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC1pbm5lclwiPjxzcGFuIGNsYXNzPVwic2UtdG9vbHRpcC10ZXh0XCI+JyArIGxhbmcuY29udHJvbGxlci5kZWxldGVSb3cgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJtZXJnZVwiIGNsYXNzPVwiX3NlX3RhYmxlX21lcmdlX2J1dHRvbiBzZS1idG4gc2UtdG9vbHRpcFwiIGRpc2FibGVkPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLm1lcmdlX2NlbGwgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIubWVyZ2VDZWxscyArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDtcIj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJpbnNlcnRcIiBkYXRhLXZhbHVlPVwiY2VsbFwiIGRhdGEtb3B0aW9uPVwibGVmdFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5pbnNlcnRfY29sdW1uX2xlZnQgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Q29sdW1uQmVmb3JlICsgJzwvc3Bhbj48L3NwYW4+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1jb21tYW5kPVwiaW5zZXJ0XCIgZGF0YS12YWx1ZT1cImNlbGxcIiBkYXRhLW9wdGlvbj1cInJpZ2h0XCIgY2xhc3M9XCJzZS1idG4gc2UtdG9vbHRpcFwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgIGljb25zLmluc2VydF9jb2x1bW5fcmlnaHQgK1xyXG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtaW5uZXJcIj48c3BhbiBjbGFzcz1cInNlLXRvb2x0aXAtdGV4dFwiPicgKyBsYW5nLmNvbnRyb2xsZXIuaW5zZXJ0Q29sdW1uQWZ0ZXIgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNvbW1hbmQ9XCJkZWxldGVcIiBkYXRhLXZhbHVlPVwiY2VsbFwiIGNsYXNzPVwic2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5kZWxldGVfY29sdW1uICtcclxuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLmRlbGV0ZUNvbHVtbiArICc8L3NwYW4+PC9zcGFuPicgK1xyXG4gICAgICAgICAgICAgICAgJzwvYnV0dG9uPicgK1xyXG4gICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY29tbWFuZD1cIm9uc3BsaXRcIiBjbGFzcz1cIl9zZV90YWJsZV9zcGxpdF9idXR0b24gc2UtYnRuIHNlLXRvb2x0aXBcIj4nICtcclxuICAgICAgICAgICAgICAgICAgICBpY29ucy5zcGxpdF9jZWxsICtcclxuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLWlubmVyXCI+PHNwYW4gY2xhc3M9XCJzZS10b29sdGlwLXRleHRcIj4nICsgbGFuZy5jb250cm9sbGVyLnNwbGl0Q2VsbHMgKyAnPC9zcGFuPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwic2UtYnRuLWdyb3VwLXN1YiBzdW4tZWRpdG9yLWNvbW1vbiBzZS1saXN0LWxheWVyIHNlLXRhYmxlLXNwbGl0XCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICc8dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGxpIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLWNvbW1hbmQ9XCJzcGxpdFwiIGRhdGEtdmFsdWU9XCJ2ZXJ0aWNhbFwiIHN0eWxlPVwibGluZS1oZWlnaHQ6MzJweDtcIiB0aXRsZT1cIicgKyBsYW5nLmNvbnRyb2xsZXIuVmVydGljYWxTcGxpdCArICdcIj4nICsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5jb250cm9sbGVyLlZlcnRpY2FsU3BsaXQgKyAnPC9saT4nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGkgY2xhc3M9XCJzZS1idG4tbGlzdFwiIGRhdGEtY29tbWFuZD1cInNwbGl0XCIgZGF0YS12YWx1ZT1cImhvcml6b250YWxcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OjMycHg7XCIgdGl0bGU9XCInICsgbGFuZy5jb250cm9sbGVyLkhvcml6b250YWxTcGxpdCArICdcIj4nICsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZy5jb250cm9sbGVyLkhvcml6b250YWxTcGxpdCArICc8L2xpPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC91bD4nICtcclxuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVSZXNpemU7XHJcbiAgICB9LFxyXG5cclxuICAgIGFwcGVuZFRhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3Qgb1RhYmxlID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQoJ1RBQkxFJyk7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlQ2VsbHMgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHM7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmNvbnRleHQudGFibGUuX3RhYmxlWFlbMF07XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLmNvbnRleHQudGFibGUuX3RhYmxlWFlbMV07XHJcbiAgICAgICAgbGV0IHRhYmxlSFRNTCA9ICc8dGJvZHk+JztcclxuICAgICAgICB3aGlsZSAoeSA+IDApIHtcclxuICAgICAgICAgICAgdGFibGVIVE1MICs9ICc8dHI+JyArIGNyZWF0ZUNlbGxzLmNhbGwodGhpcywgJ3RkJywgeCkgKyAnPC90cj4nO1xyXG4gICAgICAgICAgICAtLXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhYmxlSFRNTCArPSAnPC90Ym9keT4nO1xyXG4gICAgICAgIG9UYWJsZS5pbm5lckhUTUwgPSB0YWJsZUhUTUw7XHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmluc2VydENvbXBvbmVudChvVGFibGUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RUZCA9IG9UYWJsZS5xdWVyeVNlbGVjdG9yKCd0ZCBkaXYnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShmaXJzdFRkLCAwLCBmaXJzdFRkLCAwKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnJlc2V0X3RhYmxlX3BpY2tlci5jYWxsKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY3JlYXRlQ2VsbHM6IGZ1bmN0aW9uIChub2RlTmFtZSwgY250LCByZXR1cm5FbGVtZW50KSB7XHJcbiAgICAgICAgbm9kZU5hbWUgPSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXJldHVybkVsZW1lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGNlbGxzSFRNTCA9ICcnO1xyXG4gICAgICAgICAgICB3aGlsZSAoY250ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY2VsbHNIVE1MICs9ICc8JyArbm9kZU5hbWUgKyAnPjxkaXY+PGJyPjwvZGl2PjwvJyArIG5vZGVOYW1lICsgJz4nO1xyXG4gICAgICAgICAgICAgICAgY250LS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNlbGxzSFRNTDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGhpcy51dGlsLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xyXG4gICAgICAgICAgICBjZWxsLmlubmVySFRNTCA9ICc8ZGl2Pjxicj48L2Rpdj4nO1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIG9uTW91c2VNb3ZlX3RhYmxlUGlja2VyOiBmdW5jdGlvbiAoY29udGV4dFRhYmxlLCBlKSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgbGV0IHggPSB0aGlzLl93Lk1hdGguY2VpbChlLm9mZnNldFggLyAxOCk7XHJcbiAgICAgICAgbGV0IHkgPSB0aGlzLl93Lk1hdGguY2VpbChlLm9mZnNldFkgLyAxOCk7XHJcbiAgICAgICAgeCA9IHggPCAxID8gMSA6IHg7XHJcbiAgICAgICAgeSA9IHkgPCAxID8gMSA6IHk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbnRleHRUYWJsZS5fcnRsKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gKHggKiAxOCAtIDEzKSArICdweCc7XHJcbiAgICAgICAgICAgIHggPSAxMSAtIHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IHggKyAnZW0nO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZS5oZWlnaHQgPSB5ICsgJ2VtJztcclxuXHJcbiAgICAgICAgLy8gbGV0IHhfdSA9IHggPCA1ID8gNSA6ICh4ID4gOSA/IDEwIDogeCArIDEpO1xyXG4gICAgICAgIC8vIGxldCB5X3UgPSB5IDwgNSA/IDUgOiAoeSA+IDkgPyAxMCA6IHkgKyAxKTtcclxuICAgICAgICAvLyBjb250ZXh0VGFibGUudGFibGVVbkhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IHhfdSArICdlbSc7XHJcbiAgICAgICAgLy8gY29udGV4dFRhYmxlLnRhYmxlVW5IaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0geV91ICsgJ2VtJztcclxuXHJcbiAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dChjb250ZXh0VGFibGUudGFibGVEaXNwbGF5LCB4ICsgJyB4ICcgKyB5KTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3RhYmxlWFkgPSBbeCwgeV07XHJcbiAgICB9LFxyXG5cclxuICAgIHJlc2V0X3RhYmxlX3BpY2tlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LnRhYmxlLnRhYmxlSGlnaGxpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodCA9IHRoaXMuY29udGV4dC50YWJsZS50YWJsZUhpZ2hsaWdodC5zdHlsZTtcclxuICAgICAgICBjb25zdCB1bkhpZ2hsaWdodCA9IHRoaXMuY29udGV4dC50YWJsZS50YWJsZVVuSGlnaGxpZ2h0LnN0eWxlO1xyXG5cclxuICAgICAgICBoaWdobGlnaHQud2lkdGggPSAnMWVtJztcclxuICAgICAgICBoaWdobGlnaHQuaGVpZ2h0ID0gJzFlbSc7XHJcbiAgICAgICAgdW5IaWdobGlnaHQud2lkdGggPSAnMTBlbSc7XHJcbiAgICAgICAgdW5IaWdobGlnaHQuaGVpZ2h0ID0gJzEwZW0nO1xyXG5cclxuICAgICAgICB0aGlzLnV0aWwuY2hhbmdlVHh0KHRoaXMuY29udGV4dC50YWJsZS50YWJsZURpc3BsYXksICcxIHggMScpO1xyXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xyXG4gICAgfSxcclxuXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fcmVtb3ZlRXZlbnRzLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucXVlcnlTZWxlY3RvckFsbCgnLnNlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkQ2VsbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZENlbGxzW2ldLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fdG9nZ2xlRWRpdG9yLmNhbGwodGhpcywgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fZWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl90ZEVsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fdHJFbGVtZW50ID0gbnVsbDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3RyRWxlbWVudHMgPSBudWxsO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fdGFibGVYWSA9IFtdO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSB0cnVlO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fZml4ZWRDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxDbnQgPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsQ250ID0gMDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX3Jvd0NudCA9IDA7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl9yb3dJbmRleCA9IDA7XHJcbiAgICAgICAgY29udGV4dFRhYmxlLl9waHlzaWNhbF9jZWxsSW5kZXggPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXggPSAwO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fY3VycmVudF9jb2xTcGFuID0gMDtcclxuICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfcm93U3BhbiA9IDA7XHJcblxyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zaGlmdCA9IGZhbHNlO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGxzID0gbnVsbDtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSA9IG51bGw7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3JlZiA9IG51bGw7XHJcblxyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwgPSBudWxsO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGxOYW1lID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqIHRhYmxlIGVkaXQgY29udHJvbGxlciAqL1xyXG4gICAgY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdDogZnVuY3Rpb24gKHRkRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdldFNlbGVjdGlvbigpLmlzQ29sbGFwc2VkICYmICF0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRkRWxlbWVudCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0gY29udGV4dFRhYmxlLl9lbGVtZW50IHx8IHRoaXMucGx1Z2lucy50YWJsZS5fc2VsZWN0ZWRUYWJsZSB8fCB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudCh0ZEVsZW1lbnQsICdUQUJMRScpO1xyXG4gICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSB0aGlzLnV0aWwuaGFzQ2xhc3ModGFibGVFbGVtZW50LCAnc2UtdGFibGUtc2l6ZS0xMDAnKSB8fCB0YWJsZUVsZW1lbnQuc3R5bGUud2lkdGggPT09ICcxMDAlJyB8fCAoIXRhYmxlRWxlbWVudC5zdHlsZS53aWR0aCAmJiAhdGhpcy51dGlsLmhhc0NsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpKTtcclxuICAgICAgICBjb250ZXh0VGFibGUuX2ZpeGVkQ29sdW1uID0gdGhpcy51dGlsLmhhc0NsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLWxheW91dC1maXhlZCcpIHx8IHRhYmxlRWxlbWVudC5zdHlsZS50YWJsZUxheW91dCA9PT0gJ2ZpeGVkJztcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRUYWJsZVN0eWxlLmNhbGwodGhpcywgY29udGV4dFRhYmxlLl9tYXhXaWR0aCA/ICd3aWR0aHxjb2x1bW4nIDogJ3dpZHRoJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGFibGVQbHVnaW4uc2V0UG9zaXRpb25Db250cm9sbGVyVG9wLmNhbGwodGhpcywgdGFibGVFbGVtZW50KTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCB0ZEVsZW1lbnQsIHRhYmxlUGx1Z2luLl9zaGlmdCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0YWJsZVBsdWdpbi5fc2hpZnQpIHRoaXMuY29udHJvbGxlcnNPbihjb250ZXh0VGFibGUucmVzaXplRGl2LCBjb250ZXh0VGFibGUudGFibGVDb250cm9sbGVyLCB0YWJsZVBsdWdpbi5pbml0LmJpbmQodGhpcyksIHRkRWxlbWVudCwgJ3RhYmxlJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFBvc2l0aW9uQ29udHJvbGxlclRvcDogZnVuY3Rpb24gKHRhYmxlRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29udHJvbGxlclBvc2l0aW9uKHRoaXMuY29udGV4dC50YWJsZS50YWJsZUNvbnRyb2xsZXIsIHRhYmxlRWxlbWVudCwgJ3RvcCcsIHtsZWZ0OiAwLCB0b3A6IDB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0UG9zaXRpb25Db250cm9sbGVyRGl2OiBmdW5jdGlvbiAodGRFbGVtZW50LCByZXNldCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuICAgICAgICBjb25zdCByZXNpemVEaXYgPSBjb250ZXh0VGFibGUucmVzaXplRGl2O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucGx1Z2lucy50YWJsZS5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIHRkRWxlbWVudCwgcmVzZXQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb250ZXh0VGFibGUuY2VsbENvbnRyb2xsZXJUb3ApIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sbGVyUG9zaXRpb24ocmVzaXplRGl2LCBjb250ZXh0VGFibGUuX2VsZW1lbnQsICd0b3AnLCB7bGVmdDogY29udGV4dFRhYmxlLnRhYmxlQ29udHJvbGxlci5vZmZzZXRXaWR0aCwgdG9wOiAwfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb250cm9sbGVyUG9zaXRpb24ocmVzaXplRGl2LCB0ZEVsZW1lbnQsICdib3R0b20nLCB7bGVmdDogMCwgdG9wOiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRDZWxsSW5mbzogZnVuY3Rpb24gKHRkRWxlbWVudCwgcmVzZXQpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSBjb250ZXh0VGFibGUuX2VsZW1lbnQgPSB0aGlzLnBsdWdpbnMudGFibGUuX3NlbGVjdGVkVGFibGUgfHwgdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGRFbGVtZW50LCAnVEFCTEUnKTtcclxuXHJcbiAgICAgICAgaWYgKC9USEVBRC9pLnRlc3QodGFibGUuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhjb250ZXh0VGFibGUuaGVhZGVyQnV0dG9uLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGNvbnRleHRUYWJsZS5oZWFkZXJCdXR0b24sICdhY3RpdmUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXNldCB8fCBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxDbnQgPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRleHRUYWJsZS5fdGRFbGVtZW50ICE9PSB0ZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fdGRFbGVtZW50ID0gdGRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLl90ckVsZW1lbnQgPSB0ZEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm93cyA9IGNvbnRleHRUYWJsZS5fdHJFbGVtZW50cyA9IHRhYmxlLnJvd3M7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IHRkRWxlbWVudC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2VsbENudCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjZWxscyA9IHJvd3NbMF0uY2VsbHMsIGxlbiA9IHJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNlbGxDbnQgKz0gY2VsbHNbaV0uY29sU3BhbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcm93IGNudCwgcm93IGluZGV4XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gY29udGV4dFRhYmxlLl9yb3dJbmRleCA9IGNvbnRleHRUYWJsZS5fdHJFbGVtZW50LnJvd0luZGV4O1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX3Jvd0NudCA9IHJvd3MubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgLy8gY2VsbCBjbnQsIHBoeXNpY2FsIGNlbGwgaW5kZXhcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLl9waHlzaWNhbF9jZWxsQ250ID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnQuY2VsbHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbENudCA9IGNlbGxDbnQ7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fcGh5c2ljYWxfY2VsbEluZGV4ID0gY2VsbEluZGV4O1xyXG5cclxuICAgICAgICAgICAgLy8gc3BhblxyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfY29sU3BhbiA9IGNvbnRleHRUYWJsZS5fdGRFbGVtZW50LmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICBjb250ZXh0VGFibGUuX2N1cnJlbnRfcm93U3BhbiAtIGNvbnRleHRUYWJsZS5fdHJFbGVtZW50LmNlbGxzW2NlbGxJbmRleF0ucm93U3BhbiAtIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBmaW5kIGxvZ2NhbCBjZWxsIGluZGV4XHJcbiAgICAgICAgICAgIGxldCByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgICAgIGxldCBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNlbGxzLCBjb2xTcGFuOyBpIDw9IHJvd0luZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgIGNvbFNwYW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGgsIGNlbGwsIGNzLCBycywgbG9nY2FsSW5kZXg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHJzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCA9IGMgKyBjb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIGFycjsgciA8IHNwYW5JbmRleC5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5yb3cgPiBpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2djYWxJbmRleCA+PSBhcnIuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGFyci5jcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY0xlbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucm93ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nY2FsIGNlbGwgaW5kZXhcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gcm93SW5kZXggJiYgYyA9PT0gY2VsbEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXggPSBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocnMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbG9nY2FsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjczogY3MgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IHJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBjcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzcGFuSW5kZXggPSBzcGFuSW5kZXguY29uY2F0KHJvd1NwYW5BcnIpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtyZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7fSk7XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBudWxsO1xyXG4gICAgICAgICAgICBzcGFuSW5kZXggPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZWRpdFRhYmxlOiBmdW5jdGlvbiAodHlwZSwgb3B0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdGFibGVQbHVnaW4gPSB0aGlzLnBsdWdpbnMudGFibGU7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGV4dFRhYmxlLl9lbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGlzUm93ID0gdHlwZSA9PT0gJ3Jvdyc7XHJcblxyXG4gICAgICAgIGlmIChpc1Jvdykge1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZUF0dHIgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBpZiAoL15USEVBRCQvaS50ZXN0KHRhYmxlQXR0ci5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICd1cCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0YWJsZUF0dHIubmV4dEVsZW1lbnRTaWJsaW5nIHx8ICEvXlRCT0RZJC9pLnRlc3QodGFibGVBdHRyLm5leHRFbGVtZW50U2libGluZy5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbm5lckhUTUwgKz0gJzx0Ym9keT48dHI+JyArIHRhYmxlUGx1Z2luLmNyZWF0ZUNlbGxzLmNhbGwodGhpcywgJ3RkJywgY29udGV4dFRhYmxlLl9sb2dpY2FsX2NlbGxDbnQsIGZhbHNlKSArICc8L3RyPjwvdGJvZHk+JztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG11bHRpXHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9yZWYpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25DZWxsID0gY29udGV4dFRhYmxlLl90ZEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxscztcclxuICAgICAgICAgICAgLy8gbXVsdGkgLSByb3dcclxuICAgICAgICAgICAgaWYgKGlzUm93KSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm93XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByb3cgPSBzZWxlY3RlZENlbGxzWzBdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ2VsbHMgPSBbc2VsZWN0ZWRDZWxsc1swXV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCwgY2VsbDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwgPSBzZWxlY3RlZENlbGxzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ICE9PSBjZWxsLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBjZWxsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZW1vdmVDZWxscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIHJlbW92ZUNlbGxzW2ldLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uZWRpdFJvdy5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZWRpdCByb3dcclxuICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRDZWxsSW5mby5jYWxsKHRoaXMsIG9wdGlvbiA9PT0gJ3VwJyA/IHNlbGVjdGVkQ2VsbHNbMF0gOiBzZWxlY3RlZENlbGxzW3NlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLmVkaXRSb3cuY2FsbCh0aGlzLCBvcHRpb24sIHBvc2l0aW9uQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIG11bHRpIC0gY2VsbFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBzZWxlY3RlZENlbGxzWzBdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgY2VsbFxyXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDZWxscyA9IFtzZWxlY3RlZENlbGxzWzBdXTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMSwgbGVuID0gc2VsZWN0ZWRDZWxscy5sZW5ndGgsIGNlbGw7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gc2VsZWN0ZWRDZWxsc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Um93ID09PSBjZWxsLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlbW92ZUNlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldENlbGxJbmZvLmNhbGwodGhpcywgcmVtb3ZlQ2VsbHNbaV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5lZGl0Q2VsbC5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZWRpdCBjZWxsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJpZ2h0Q2VsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCAtIDE7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RSb3cgIT09IHNlbGVjdGVkQ2VsbHNbaSArIDFdLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2VsbCA9IHNlbGVjdGVkQ2VsbHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc2V0Q2VsbEluZm8uY2FsbCh0aGlzLCBvcHRpb24gPT09ICdsZWZ0JyA/IHNlbGVjdGVkQ2VsbHNbMF0gOiByaWdodENlbGwgfHwgc2VsZWN0ZWRDZWxsc1swXSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uZWRpdENlbGwuY2FsbCh0aGlzLCBvcHRpb24sIHBvc2l0aW9uQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghb3B0aW9uKSB0YWJsZVBsdWdpbi5pbml0LmNhbGwodGhpcyk7XHJcbiAgICAgICAgfSAvLyBvbmVcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGFibGVQbHVnaW5baXNSb3cgPyAnZWRpdFJvdycgOiAnZWRpdENlbGwnXS5jYWxsKHRoaXMsIG9wdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZnRlciByZW1vdmVcclxuICAgICAgICBpZiAoIW9wdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRhYmxlLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUl0ZW0oY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhYmxlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgdGhpcy51dGlsLnJlbW92ZUl0ZW0odGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgZWRpdFJvdzogZnVuY3Rpb24gKG9wdGlvbiwgcG9zaXRpb25SZXNldEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gIW9wdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3QgdXAgPSBvcHRpb24gPT09ICd1cCc7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luUm93SW5kZXggPSBjb250ZXh0VGFibGUuX3Jvd0luZGV4O1xyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gcmVtb3ZlIHx8IHVwID8gb3JpZ2luUm93SW5kZXggOiBvcmlnaW5Sb3dJbmRleCArIGNvbnRleHRUYWJsZS5fY3VycmVudF9yb3dTcGFuICsgMTtcclxuICAgICAgICBjb25zdCBzaWduID0gcmVtb3ZlID8gLTEgOiAxO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHJvd3MgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudHM7XHJcbiAgICAgICAgbGV0IGNlbGxDbnQgPSBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbENudDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9yaWdpblJvd0luZGV4ICsgKHJlbW92ZSA/IC0xIDogMCksIGNlbGw7IGkgPD0gbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY2VsbCA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgICAgIGlmIChjZWxsLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxsLmxlbmd0aCwgcnMsIGNzOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBycyA9IGNlbGxbY10ucm93U3BhbjtcclxuICAgICAgICAgICAgICAgIGNzID0gY2VsbFtjXS5jb2xTcGFuO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJzIDwgMiAmJiBjcyA8IDIpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChycyArIGkgPiByb3dJbmRleCAmJiByb3dJbmRleCA+IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsW2NdLnJvd1NwYW4gPSBycyArIHNpZ247XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbENudCAtPSBjcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gcm93c1tvcmlnaW5Sb3dJbmRleCArIDFdO1xyXG4gICAgICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhbkNlbGxzID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgY2VsbHMgPSByb3dzW29yaWdpblJvd0luZGV4XS5jZWxscztcclxuICAgICAgICAgICAgICAgIGxldCBjb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2VsbHMubGVuZ3RoLCBjZWxsLCBsb2djYWxJbmRleDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbCA9IGNlbGxzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gaSArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5yb3dTcGFuID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLnJvd1NwYW4gLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkNlbGxzLnB1c2goe2NlbGw6IGNlbGwuY2xvbmVOb2RlKGZhbHNlKSwgaW5kZXg6IGxvZ2NhbEluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzcGFuQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFuQ2VsbCA9IHNwYW5DZWxscy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gbmV4dC5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgbG9nY2FsSW5kZXg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gaSArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nY2FsSW5kZXggPj0gc3BhbkNlbGwuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLSwgY29sU3Bhbi0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBzcGFuQ2VsbC5jZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbnNlcnRCZWZvcmUoc3BhbkNlbGwuY2VsbCwgY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuQ2VsbCA9IHNwYW5DZWxscy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFuQ2VsbCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmFwcGVuZENoaWxkKHNwYW5DZWxsLmNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3BhbkNlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmFwcGVuZENoaWxkKHNwYW5DZWxsc1tpXS5jZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLl9lbGVtZW50LmRlbGV0ZVJvdyhyb3dJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gY29udGV4dFRhYmxlLl9lbGVtZW50Lmluc2VydFJvdyhyb3dJbmRleCk7XHJcbiAgICAgICAgICAgIG5ld1Jvdy5pbm5lckhUTUwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCAndGQnLCBjZWxsQ250LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXJlbW92ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMudGFibGUuc2V0UG9zaXRpb25Db250cm9sbGVyRGl2LmNhbGwodGhpcywgcG9zaXRpb25SZXNldEVsZW1lbnQgfHwgY29udGV4dFRhYmxlLl90ZEVsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGVkaXRDZWxsOiBmdW5jdGlvbiAob3B0aW9uLCBwb3NpdGlvblJlc2V0RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuICAgICAgICBjb25zdCB1dGlsID0gdGhpcy51dGlsO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9ICFvcHRpb247XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBvcHRpb24gPT09ICdsZWZ0JztcclxuICAgICAgICBjb25zdCBjb2xTcGFuID0gY29udGV4dFRhYmxlLl9jdXJyZW50X2NvbFNwYW47XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gcmVtb3ZlIHx8IGxlZnQgPyBjb250ZXh0VGFibGUuX2xvZ2ljYWxfY2VsbEluZGV4IDogY29udGV4dFRhYmxlLl9sb2dpY2FsX2NlbGxJbmRleCArIGNvbFNwYW4gKyAxO1xyXG5cclxuICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgIGxldCByb3dTcGFuQXJyID0gW107XHJcbiAgICAgICAgbGV0IHNwYW5JbmRleCA9IFtdO1xyXG4gICAgICAgIGxldCBwYXNzQ2VsbCA9IDA7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQ2VsbCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZVNwYW5BcnIgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbnRleHRUYWJsZS5fcm93Q250LCByb3csIGluc2VydEluZGV4LCBjZWxscywgbmV3Q2VsbCwgYXBwbHlTcGFuLCBjZWxsQ29sU3BhbjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJvdyA9IHJvd3NbaV07XHJcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gY2VsbEluZGV4O1xyXG4gICAgICAgICAgICBhcHBseVNwYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgY2VsbHMgPSByb3cuY2VsbHM7XHJcbiAgICAgICAgICAgIGNlbGxDb2xTcGFuID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjZWxsLCBjTGVuID0gY2VsbHMubGVuZ3RoLCBycywgY3MsIHJlbW92ZUluZGV4OyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIHJzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgIGNzID0gY2VsbC5jb2xTcGFuIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjID49IGluc2VydEluZGV4KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzQ2VsbCA8IDEgJiYgY3MgKyBjID49IGluc2VydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNvbFNwYW4gKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NDZWxsID0gcnMgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4IC09IGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseVNwYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIGFycjsgciA8IHNwYW5JbmRleC5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5kZXggLT0gYXJyLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTcGFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGV4ID0gYyArIGNlbGxDb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdENlbGwgPSAhY2VsbHNbYyArIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIgPSBzcGFuSW5kZXhbcl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJvdyA+IGkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVJbmRleCA+PSBhcnIuaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsQ29sU3BhbiArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5kZXggPSBjICsgY2VsbENvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJzIC09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5JbmRleC5zcGxpY2UociwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdENlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucm93ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dTcGFuQXJyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IHJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzICsgMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiByZW1vdmVJbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlSW5kZXggPj0gaW5zZXJ0SW5kZXggJiYgcmVtb3ZlSW5kZXggKyBjcyA8PSBpbnNlcnRJbmRleCArIGNvbFNwYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2VsbC5wdXNoKGNlbGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVtb3ZlSW5kZXggPD0gaW5zZXJ0SW5kZXggKyBjb2xTcGFuICYmIHJlbW92ZUluZGV4ICsgY3MgPj0gaW5zZXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5jb2xTcGFuIC09IHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChjZWxsSW5kZXgsIGNlbGxJbmRleCArIGNvbFNwYW4sIHJlbW92ZUluZGV4LCByZW1vdmVJbmRleCArIGNzKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChycyA+IDAgJiYgKHJlbW92ZUluZGV4IDwgaW5zZXJ0SW5kZXggfHwgcmVtb3ZlSW5kZXggKyBjcyA+IGluc2VydEluZGV4ICsgY29sU3BhbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGw6IGNlbGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnM6IGkgKyByc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxDb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzcGFuSW5kZXggPSBzcGFuSW5kZXguY29uY2F0KHJvd1NwYW5BcnIpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtyZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7fSk7XHJcbiAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVtb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFzc0NlbGwgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc0NlbGwgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0SW5kZXggIT09IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0NlbGwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCBjZWxsc1swXS5ub2RlTmFtZSwgMCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2VsbCA9IHJvdy5pbnNlcnRCZWZvcmUobmV3Q2VsbCwgY2VsbHNbaW5zZXJ0SW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZSkge1xyXG4gICAgICAgICAgICBsZXQgcmVtb3ZlRmlyc3QsIHJlbW92ZUVuZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgciA9IDAsIHJMZW4gPSByZW1vdmVDZWxsLmxlbmd0aCwgcm93OyByIDwgckxlbjsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICByb3cgPSByZW1vdmVDZWxsW3JdLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0ocmVtb3ZlQ2VsbFtyXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVtb3ZlRmlyc3QpIHJlbW92ZUZpcnN0ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIHJvdyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW5kID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIHJvdyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHJvdyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gcmVtb3ZlU3BhbkFyci5sZW5ndGgsIHJvd1NwYW5DZWxsOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbCA9IHJlbW92ZVNwYW5BcnJbY107XHJcbiAgICAgICAgICAgICAgICByb3dTcGFuQ2VsbC5jZWxsLnJvd1NwYW4gPSB1dGlsLmdldE92ZXJsYXBSYW5nZUF0SW5kZXgocmVtb3ZlRmlyc3QsIHJlbW92ZUVuZCwgcm93U3BhbkNlbGwuaSwgcm93U3BhbkNlbGwucnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnNldFBvc2l0aW9uQ29udHJvbGxlckRpdi5jYWxsKHRoaXMsIHBvc2l0aW9uUmVzZXRFbGVtZW50IHx8IGNvbnRleHRUYWJsZS5fdGRFbGVtZW50LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIF9jbG9zZVNwbGl0TWVudTogbnVsbCxcclxuICAgIG9wZW5TcGxpdE1lbnU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3ModGhpcy5jb250ZXh0LnRhYmxlLnNwbGl0QnV0dG9uLCAnb24nKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudGFibGUuc3BsaXRNZW51LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLXRhYmxlJztcclxuXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLl9jbG9zZVNwbGl0TWVudSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRoaXMuY29udGV4dC50YWJsZS5zcGxpdEJ1dHRvbiwgJ29uJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC50YWJsZS5zcGxpdE1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVEb2NFdmVudCgnY2xpY2snLCB0aGlzLnBsdWdpbnMudGFibGUuX2Nsb3NlU3BsaXRNZW51KTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLl9jbG9zZVNwbGl0TWVudSA9IG51bGw7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLmFkZERvY0V2ZW50KCdjbGljaycsIHRoaXMucGx1Z2lucy50YWJsZS5fY2xvc2VTcGxpdE1lbnUpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzcGxpdENlbGxzOiBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcclxuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IGRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSBjb250ZXh0VGFibGUuX3RkRWxlbWVudDtcclxuICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSb3cgPSBjb250ZXh0VGFibGUuX3RyRWxlbWVudDtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRleHRUYWJsZS5fbG9naWNhbF9jZWxsSW5kZXg7XHJcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSBjb250ZXh0VGFibGUuX3Jvd0luZGV4O1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbGwgPSB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCBjdXJyZW50Q2VsbC5ub2RlTmFtZSwgMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIHZlcnRpY2FsXHJcbiAgICAgICAgaWYgKHZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb2xTcGFuID0gY3VycmVudENlbGwuY29sU3BhbjtcclxuICAgICAgICAgICAgbmV3Q2VsbC5yb3dTcGFuID0gY3VycmVudENlbGwucm93U3BhbjtcclxuXHJcbiAgICAgICAgICAgIC8vIGNvbHNwYW4gPiAxXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sU3BhbiA+IDEpIHtcclxuICAgICAgICAgICAgICAgIG5ld0NlbGwuY29sU3BhbiA9IHRoaXMuX3cuTWF0aC5mbG9vcihjdXJyZW50Q29sU3Bhbi8yKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDZWxsLmNvbFNwYW4gPSBjdXJyZW50Q29sU3BhbiAtIG5ld0NlbGwuY29sU3BhbjtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRSb3cuaW5zZXJ0QmVmb3JlKG5ld0NlbGwsIGN1cnJlbnRDZWxsLm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGNvbHNwYW4gLSAxXHJcbiAgICAgICAgICAgICAgICBsZXQgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwYW5JbmRleCA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjb250ZXh0VGFibGUuX3Jvd0NudCwgY2VsbHMsIGNvbFNwYW47IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgY3MsIHJzLCBsb2djYWxJbmRleDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCA9IGMgKyBjb2xTcGFuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5JbmRleC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gc3BhbkluZGV4W3JdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucm93ID4gaSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4ID49IGFyci5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGFyci5jcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nY2FsSW5kZXggKz0gYXJyLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSBjTGVuIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyLnJzIDwgMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4IDw9IGluZGV4ICYmIHJzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbG9nY2FsSW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3M6IGNzICsgMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByczogcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsICE9PSBjdXJyZW50Q2VsbCAmJiBsb2djYWxJbmRleCA8PSBpbmRleCAmJiBsb2djYWxJbmRleCArIGNzID49IGluZGV4ICsgY3VycmVudENvbFNwYW4gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmNvbFNwYW4gKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nY2FsSW5kZXggPiBpbmRleCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4ID0gc3BhbkluZGV4LmNvbmNhdChyb3dTcGFuQXJyKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7cmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O30pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Um93Lmluc2VydEJlZm9yZShuZXdDZWxsLCBjdXJyZW50Q2VsbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHsgLy8gaG9yaXpvbnRhbFxyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Um93U3BhbiA9IGN1cnJlbnRDZWxsLnJvd1NwYW47XHJcbiAgICAgICAgICAgIG5ld0NlbGwuY29sU3BhbiA9IGN1cnJlbnRDZWxsLmNvbFNwYW47XHJcblxyXG4gICAgICAgICAgICAvLyByb3dzcGFuID4gMVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJvd1NwYW4gPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdDZWxsLnJvd1NwYW4gPSB0aGlzLl93Lk1hdGguZmxvb3IoY3VycmVudFJvd1NwYW4vMik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dTcGFuID0gY3VycmVudFJvd1NwYW4gLSBuZXdDZWxsLnJvd1NwYW47XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIGN1cnJlbnRSb3cpICsgbmV3Um93U3BhbjtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbHMsIGNvbFNwYW47IGkgPCBuZXh0Um93SW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgY3MsIGxvZ2NhbEluZGV4OyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gYyArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2djYWxJbmRleCA+PSBpbmRleCkgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gY2VsbC5yb3dTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzID4gMCAmJiBjcyArIGkgPj0gbmV4dFJvd0luZGV4ICYmIGxvZ2NhbEluZGV4IDwgaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxvZ2NhbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiBjZWxsLmNvbFNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gY2VsbC5jb2xTcGFuIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvdyA9IHJvd3NbbmV4dFJvd0luZGV4XTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDZWxscyA9IG5leHRSb3cuY2VsbHM7XHJcbiAgICAgICAgICAgICAgICBsZXQgcnMgPSByb3dTcGFuQXJyLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBuZXh0Q2VsbHMubGVuZ3RoLCBjb2xTcGFuID0gMCwgY2VsbCwgY3MsIGxvZ2NhbEluZGV4LCBpbnNlcnRJbmRleDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2NhbEluZGV4ID0gYyArIGNvbFNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbCA9IG5leHRDZWxsc1tjXTtcclxuICAgICAgICAgICAgICAgICAgICBjcyA9IGNlbGwuY29sU3BhbiAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBsb2djYWxJbmRleCArIGNzICsgMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzICYmIGluc2VydEluZGV4ID49IHJzLmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW4gKz0gcnMuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4ICs9IHJzLmNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBycyA9IHJvd1NwYW5BcnIuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydEluZGV4ID49IGluZGV4IHx8IGMgPT09IGNMZW4gLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSb3cuaW5zZXJ0QmVmb3JlKG5ld0NlbGwsIGNlbGwubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGN1cnJlbnRDZWxsLnJvd1NwYW4gPSBuZXdSb3dTcGFuO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyByb3dzcGFuIC0gMVxyXG4gICAgICAgICAgICAgICAgbmV3Q2VsbC5yb3dTcGFuID0gY3VycmVudENlbGwucm93U3BhbjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JvdyA9IHV0aWwuY3JlYXRlRWxlbWVudCgnVFInKTtcclxuICAgICAgICAgICAgICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChuZXdDZWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY2VsbHM7IGkgPCByb3dJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHMgPSByb3dzW2ldLmNlbGxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBjZWxscy5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyBjZWxsc1tjXS5yb3dTcGFuIC0gMSA+PSByb3dJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHNbY10ucm93U3BhbiArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBoeXNpY2FsSW5kZXggPSBjb250ZXh0VGFibGUuX3BoeXNpY2FsX2NlbGxJbmRleDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gY3VycmVudFJvdy5jZWxscztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aDsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjID09PSBwaHlzaWNhbEluZGV4KSBjb250aW51ZTsgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNbY10ucm93U3BhbiArPSAxOyAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY3VycmVudFJvdy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdSb3csIGN1cnJlbnRSb3cubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c0VkZ2UoY3VycmVudENlbGwpO1xyXG4gICAgICAgIHRoaXMucGx1Z2lucy50YWJsZS5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjdXJyZW50Q2VsbCwgdHJ1ZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIG1lcmdlQ2VsbHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCBjb250ZXh0VGFibGUgPSB0aGlzLmNvbnRleHQudGFibGU7XHJcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVmID0gdGFibGVQbHVnaW4uX3JlZjtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbHM7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VDZWxsID0gc2VsZWN0ZWRDZWxsc1swXTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgZW1wdHlSb3dGaXJzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVtcHR5Um93TGFzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGNzID0gKHJlZi5jZSAtIHJlZi5jcykgKyAxO1xyXG4gICAgICAgIGxldCBycyA9IChyZWYucmUgLSByZWYucnMpICsgMTtcclxuICAgICAgICBsZXQgbWVyZ2VIVE1MID0gJyc7XHJcbiAgICAgICAgbGV0IHJvdyA9IG51bGw7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aCwgY2VsbCwgY2g7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjZWxsID0gc2VsZWN0ZWRDZWxsc1tpXTtcclxuICAgICAgICAgICAgaWYgKHJvdyAhPT0gY2VsbC5wYXJlbnROb2RlKSByb3cgPSBjZWxsLnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgICAgICBjaCA9IGNlbGwuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwLCBjTGVuID0gY2gubGVuZ3RoOyBjIDwgY0xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoY2hbY10pICYmIHV0aWwub25seVplcm9XaWR0aFNwYWNlKGNoW2NdLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjaFtjXSk7XHJcbiAgICAgICAgICAgICAgICB9ICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbWVyZ2VIVE1MICs9IGNlbGwuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oY2VsbCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocm93LmNlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlbXB0eVJvd0ZpcnN0KSBlbXB0eVJvd0ZpcnN0ID0gcm93O1xyXG4gICAgICAgICAgICAgICAgZWxzZSBlbXB0eVJvd0xhc3QgPSByb3c7XHJcbiAgICAgICAgICAgICAgICBycyAtPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1wdHlSb3dGaXJzdCkge1xyXG4gICAgICAgICAgICBjb25zdCByb3dzID0gY29udGV4dFRhYmxlLl90ckVsZW1lbnRzO1xyXG4gICAgICAgICAgICBjb25zdCByb3dJbmRleEZpcnN0ID0gdXRpbC5nZXRBcnJheUluZGV4KHJvd3MsIGVtcHR5Um93Rmlyc3QpO1xyXG4gICAgICAgICAgICBjb25zdCByb3dJbmRleExhc3QgPSB1dGlsLmdldEFycmF5SW5kZXgocm93cywgZW1wdHlSb3dMYXN0IHx8IGVtcHR5Um93Rmlyc3QpO1xyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVSb3dzID0gW107XHJcbiAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNlbGxzOyBpIDw9IHJvd0luZGV4TGFzdDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjZWxscyA9IHJvd3NbaV0uY2VsbHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUm93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgcnM7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsID0gY2VsbHNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChycyA+IDAgJiYgaSArIHJzID49IHJvd0luZGV4Rmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5yb3dTcGFuIC09IHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyb3dJbmRleEZpcnN0LCByb3dJbmRleExhc3QsIGksIGkgKyBycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVtb3ZlUm93cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKHJlbW92ZVJvd3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtZXJnZUNlbGwuaW5uZXJIVE1MICs9IG1lcmdlSFRNTDtcclxuICAgICAgICBtZXJnZUNlbGwuY29sU3BhbiA9IGNzO1xyXG4gICAgICAgIG1lcmdlQ2VsbC5yb3dTcGFuID0gcnM7XHJcblxyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5zZXRBY3RpdmVCdXR0b24uY2FsbCh0aGlzLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdC5jYWxsKHRoaXMsIG1lcmdlQ2VsbCk7XHJcblxyXG4gICAgICAgIHV0aWwuYWRkQ2xhc3MobWVyZ2VDZWxsLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNFZGdlKG1lcmdlQ2VsbCk7XHJcbiAgICB9LFxyXG5cclxuICAgIHRvZ2dsZUhlYWRlcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyQnV0dG9uID0gdGhpcy5jb250ZXh0LnRhYmxlLmhlYWRlckJ1dHRvbjtcclxuICAgICAgICBjb25zdCBhY3RpdmUgPSB1dGlsLmhhc0NsYXNzKGhlYWRlckJ1dHRvbiwgJ2FjdGl2ZScpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ1RIRUFEJyk7XHJcbiAgICAgICAgICAgIGhlYWRlci5pbm5lckhUTUwgPSAnPHRyPicgKyB0aGlzLnBsdWdpbnMudGFibGUuY3JlYXRlQ2VsbHMuY2FsbCh0aGlzLCAndGgnLCB0aGlzLmNvbnRleHQudGFibGUuX2xvZ2ljYWxfY2VsbENudCwgZmFsc2UpICsgJzwvdHI+JztcclxuICAgICAgICAgICAgdGFibGUuaW5zZXJ0QmVmb3JlKGhlYWRlciwgdGFibGUuZmlyc3RFbGVtZW50Q2hpbGQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbSh0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHV0aWwudG9nZ2xlQ2xhc3MoaGVhZGVyQnV0dG9uLCAnYWN0aXZlJyk7XHJcblxyXG4gICAgICAgIGlmICgvVEgvaS50ZXN0KHRoaXMuY29udGV4dC50YWJsZS5fdGRFbGVtZW50Lm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnRhYmxlLnNldFBvc2l0aW9uQ29udHJvbGxlckRpdi5jYWxsKHRoaXMsIHRoaXMuY29udGV4dC50YWJsZS5fdGRFbGVtZW50LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRUYWJsZVN0eWxlOiBmdW5jdGlvbiAoc3R5bGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGV4dFRhYmxlID0gdGhpcy5jb250ZXh0LnRhYmxlO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IGNvbnRleHRUYWJsZS5fZWxlbWVudDtcclxuICAgICAgICBsZXQgaWNvbiwgc3Bhbiwgc2l6ZUljb24sIHRleHQ7XHJcblxyXG4gICAgICAgIGlmIChzdHlsZXMuaW5kZXhPZignd2lkdGgnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGljb24gPSAgY29udGV4dFRhYmxlLnJlc2l6ZUJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZDtcclxuICAgICAgICAgICAgc3BhbiA9IGNvbnRleHRUYWJsZS5yZXNpemVUZXh0O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjb250ZXh0VGFibGUuX21heFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBzaXplSWNvbiA9IGNvbnRleHRUYWJsZS5pY29ucy5leHBhbnNpb247XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gY29udGV4dFRhYmxlLm1heFRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0VGFibGUuY29sdW1uRml4ZWRCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1zaXplLTEwMCcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2l6ZUljb24gPSBjb250ZXh0VGFibGUuaWNvbnMucmVkdWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRUYWJsZS5taW5UZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtYXV0bycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLXNpemUtMTAwJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VFbGVtZW50KGljb24sIHNpemVJY29uKTtcclxuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dChzcGFuLCB0ZXh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzdHlsZXMuaW5kZXhPZignY29sdW1uJykgPiAtMSkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRleHRUYWJsZS5fZml4ZWRDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1sYXlvdXQtZml4ZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyh0YWJsZUVsZW1lbnQsICdzZS10YWJsZS1sYXlvdXQtYXV0bycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGNvbnRleHRUYWJsZS5jb2x1bW5GaXhlZEJ1dHRvbiwgJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKHRhYmxlRWxlbWVudCwgJ3NlLXRhYmxlLWxheW91dC1hdXRvJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3ModGFibGVFbGVtZW50LCAnc2UtdGFibGUtbGF5b3V0LWZpeGVkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWwuYWRkQ2xhc3MoY29udGV4dFRhYmxlLmNvbHVtbkZpeGVkQnV0dG9uLCAnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRBY3RpdmVCdXR0b246IGZ1bmN0aW9uIChmaXhlZENlbGwsIHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgaWYgKC9eVEgkL2kudGVzdChmaXhlZENlbGwubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dBYm92ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5pbnNlcnRSb3dCZWxvd0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLmluc2VydFJvd0Fib3ZlQnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLmluc2VydFJvd0JlbG93QnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRDZWxsIHx8IGZpeGVkQ2VsbCA9PT0gc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5zcGxpdEJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIGNvbnRleHRUYWJsZS5tZXJnZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLnNwbGl0QnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGV4dFRhYmxlLm1lcmdlQnV0dG9uLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8vIG11bHRpIHNlbGVjdGVcclxuICAgIF9iaW5kT25TZWxlY3Q6IG51bGwsXHJcbiAgICBfYmluZE9mZlNlbGVjdDogbnVsbCxcclxuICAgIF9iaW5kT2ZmU2hpZnQ6IG51bGwsXHJcbiAgICBfc2VsZWN0ZWRDZWxsczogbnVsbCxcclxuICAgIF9zaGlmdDogZmFsc2UsXHJcbiAgICBfZml4ZWRDZWxsOiBudWxsLFxyXG4gICAgX2ZpeGVkQ2VsbE5hbWU6IG51bGwsXHJcbiAgICBfc2VsZWN0ZWRDZWxsOiBudWxsLFxyXG4gICAgX3NlbGVjdGVkVGFibGU6IG51bGwsXHJcbiAgICBfcmVmOiBudWxsLFxyXG4gICAgX3RvZ2dsZUVkaXRvcjogZnVuY3Rpb24gKGVuYWJsZWQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZW5hYmxlZCk7XHJcbiAgICAgICAgaWYgKGVuYWJsZWQpIHRoaXMudXRpbC5yZW1vdmVDbGFzcyh0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc2UtZGlzYWJsZWQnKTtcclxuICAgICAgICBlbHNlIHRoaXMudXRpbC5hZGRDbGFzcyh0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc2UtZGlzYWJsZWQnKTtcclxuICAgIH0sXHJcblxyXG4gICAgX29mZkNlbGxNdWx0aVNlbGVjdDogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICBpZiAoIXRhYmxlUGx1Z2luLl9zaGlmdCkge1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fcmVtb3ZlRXZlbnRzLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl90b2dnbGVFZGl0b3IuY2FsbCh0aGlzLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRhYmxlUGx1Z2luLl9pbml0QmluZCkge1xyXG4gICAgICAgICAgICB0aGlzLl93ZC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0YWJsZVBsdWdpbi5faW5pdEJpbmQpO1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5faW5pdEJpbmQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0YWJsZVBsdWdpbi5fZml4ZWRDZWxsIHx8ICF0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSkgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRhYmxlUGx1Z2luLnNldEFjdGl2ZUJ1dHRvbi5jYWxsKHRoaXMsIHRhYmxlUGx1Z2luLl9maXhlZENlbGwsIHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwpO1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLmNhbGxfY29udHJvbGxlcl90YWJsZUVkaXQuY2FsbCh0aGlzLCB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsIHx8IHRhYmxlUGx1Z2luLl9maXhlZENlbGwpO1xyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxscyA9IHRhYmxlUGx1Z2luLl9zZWxlY3RlZFRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZS10YWJsZS1zZWxlY3RlZC1jZWxsJyk7XHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9zZWxlY3RlZENlbGwgJiYgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCkgdGhpcy5mb2N1c0VkZ2UodGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbCk7XHJcblxyXG4gICAgICAgIGlmICghdGFibGVQbHVnaW4uX3NoaWZ0KSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9maXhlZENlbGwgPSBudWxsO1xyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsID0gbnVsbDtcclxuICAgICAgICAgICAgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbE5hbWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX29uQ2VsbE11bHRpU2VsZWN0OiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRoaXMuX2FudGlCbHVyID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnV0aWwuZ2V0UGFyZW50RWxlbWVudChlLnRhcmdldCwgdGhpcy51dGlsLmlzQ2VsbCk7XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fc2hpZnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCkgdGFibGVQbHVnaW4uX3RvZ2dsZUVkaXRvci5jYWxsKHRoaXMsIHRydWUpO1xyXG4gICAgICAgICAgICBlbHNlIHRhYmxlUGx1Z2luLl90b2dnbGVFZGl0b3IuY2FsbCh0aGlzLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGFibGVQbHVnaW4uX3JlZikge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgIGVsc2UgdGFibGVQbHVnaW4uX3RvZ2dsZUVkaXRvci5jYWxsKHRoaXMsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldCA9PT0gdGFibGVQbHVnaW4uX3NlbGVjdGVkQ2VsbCB8fCB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsTmFtZSAhPT0gdGFyZ2V0Lm5vZGVOYW1lIHx8IFxyXG4gICAgICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSAhPT0gdGhpcy51dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0LCAnVEFCTEUnKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRDZWxsID0gdGFyZ2V0O1xyXG4gICAgICAgIHRhYmxlUGx1Z2luLl9zZXRNdWx0aUNlbGxzLmNhbGwodGhpcywgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCwgdGFyZ2V0KTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldE11bHRpQ2VsbHM6IGZ1bmN0aW9uIChzdGFydENlbGwsIGVuZENlbGwpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuICAgICAgICBjb25zdCByb3dzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucm93cztcclxuICAgICAgICBjb25zdCB1dGlsID0gdGhpcy51dGlsO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGVQbHVnaW4uX3NlbGVjdGVkVGFibGUucXVlcnlTZWxlY3RvckFsbCgnLnNlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2VsZWN0ZWRDZWxscy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKHNlbGVjdGVkQ2VsbHNbaV0sICdzZS10YWJsZS1zZWxlY3RlZC1jZWxsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhcnRDZWxsID09PSBlbmRDZWxsKSB7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3Moc3RhcnRDZWxsLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgICAgICBpZiAoIXRhYmxlUGx1Z2luLl9zaGlmdCkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZpbmRTZWxlY3RlZENlbGwgPSB0cnVlO1xyXG4gICAgICAgIGxldCBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICBsZXQgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlUGx1Z2luLl9yZWYgPSB7X2k6IDAsIGNzOiBudWxsLCBjZTogbnVsbCwgcnM6IG51bGwsIHJlOiBudWxsfTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvd3MubGVuZ3RoLCBjZWxscywgY29sU3BhbjsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNlbGxzID0gcm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgY29sU3BhbiA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMCwgY0xlbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgbG9nY2FsSW5kZXgsIGNzLCByczsgYyA8IGNMZW47IGMrKykge1xyXG4gICAgICAgICAgICAgICAgY2VsbCA9IGNlbGxzW2NdO1xyXG4gICAgICAgICAgICAgICAgY3MgPSBjZWxsLmNvbFNwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgcnMgPSBjZWxsLnJvd1NwYW4gLSAxO1xyXG4gICAgICAgICAgICAgICAgbG9nY2FsSW5kZXggPSBjICsgY29sU3BhbjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3BhbkluZGV4Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMCwgYXJyOyByIDwgc3BhbkluZGV4Lmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyciA9IHNwYW5JbmRleFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5yb3cgPiBpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2NhbEluZGV4ID49IGFyci5pbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbiArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2djYWxJbmRleCArPSBhcnIuY3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucnMgLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5yb3cgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnIucnMgPCAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4LnNwbGljZShyLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY0xlbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5ycyAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnJvdyA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyci5ycyA8IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuSW5kZXguc3BsaWNlKHIsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsID09PSBzdGFydENlbGwgfHwgY2VsbCA9PT0gZW5kQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY3MgPSByZWYuY3MgIT09IG51bGwgJiYgcmVmLmNzIDwgbG9nY2FsSW5kZXggPyByZWYuY3MgOiBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmNlID0gcmVmLmNlICE9PSBudWxsICYmIHJlZi5jZSA+IGxvZ2NhbEluZGV4ICsgY3MgPyByZWYuY2UgOiBsb2djYWxJbmRleCArIGNzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYucnMgPSByZWYucnMgIT09IG51bGwgJiYgcmVmLnJzIDwgaSA/IHJlZi5ycyA6IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5yZSA9IHJlZi5yZSAhPT0gbnVsbCAmJiByZWYucmUgPiBpICsgcnMgPyByZWYucmUgOiBpICsgcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5faSArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmLl9pID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTZWxlY3RlZENlbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkluZGV4ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NwYW5BcnIgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyZWYuY3MsIHJlZi5jZSwgbG9nY2FsSW5kZXgsIGxvZ2NhbEluZGV4ICsgY3MpICYmIHV0aWwuZ2V0T3ZlcmxhcFJhbmdlQXRJbmRleChyZWYucnMsIHJlZi5yZSwgaSwgaSArIHJzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NzID0gcmVmLmNzIDwgbG9nY2FsSW5kZXggPyByZWYuY3MgOiBsb2djYWxJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDZSA9IHJlZi5jZSA+IGxvZ2NhbEluZGV4ICsgY3MgPyByZWYuY2UgOiBsb2djYWxJbmRleCArIGNzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JzID0gcmVmLnJzIDwgaSA/IHJlZi5ycyA6IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UmUgPSByZWYucmUgPiBpICsgcnMgPyByZWYucmUgOiBpICsgcnM7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYuY3MgIT09IG5ld0NzIHx8IHJlZi5jZSAhPT0gbmV3Q2UgfHwgcmVmLnJzICE9PSBuZXdScyB8fCByZWYucmUgIT09IG5ld1JlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5jcyA9IG5ld0NzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuY2UgPSBuZXdDZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLnJzID0gbmV3UnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5yZSA9IG5ld1JlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gLTE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuSW5kZXggPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY2VsbCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocnMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbkFyci5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGxvZ2NhbEluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjczogY3MgKyAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByczogcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogLTFcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb2xTcGFuICs9IGNlbGwuY29sU3BhbiAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNwYW5JbmRleCA9IHNwYW5JbmRleC5jb25jYXQocm93U3BhbkFycikuc29ydChmdW5jdGlvbiAoYSwgYikge3JldHVybiBhLmluZGV4IC0gYi5pbmRleDt9KTtcclxuICAgICAgICAgICAgcm93U3BhbkFyciA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX3JlbW92ZUV2ZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG5cclxuICAgICAgICBpZiAodGFibGVQbHVnaW4uX2luaXRCaW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRhYmxlUGx1Z2luLl9pbml0QmluZCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9pbml0QmluZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLl93ZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0YWJsZVBsdWdpbi5fYmluZE9uU2VsZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5fd2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT25TZWxlY3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0YWJsZVBsdWdpbi5fYmluZE9mZlNlbGVjdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YWJsZVBsdWdpbi5fYmluZE9mZlNoaWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGFibGVQbHVnaW4uX2JpbmRPZmZTaGlmdCk7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgX2luaXRCaW5kOiBudWxsLFxyXG4gICAgb25UYWJsZUNlbGxNdWx0aVNlbGVjdDogZnVuY3Rpb24gKHRkRWxlbWVudCwgc2hpZnQpIHtcclxuICAgICAgICBjb25zdCB0YWJsZVBsdWdpbiA9IHRoaXMucGx1Z2lucy50YWJsZTtcclxuXHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3JlbW92ZUV2ZW50cy5jYWxsKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgdGFibGVQbHVnaW4uX3NoaWZ0ID0gc2hpZnQ7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2ZpeGVkQ2VsbCA9IHRkRWxlbWVudDtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fZml4ZWRDZWxsTmFtZSA9IHRkRWxlbWVudC5ub2RlTmFtZTtcclxuICAgICAgICB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZSA9IHRoaXMudXRpbC5nZXRQYXJlbnRFbGVtZW50KHRkRWxlbWVudCwgJ1RBQkxFJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZVBsdWdpbi5fc2VsZWN0ZWRUYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCcuc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzZWxlY3RlZENlbGxzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzZWxlY3RlZENlbGxzW2ldLCAnc2UtdGFibGUtc2VsZWN0ZWQtY2VsbCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51dGlsLmFkZENsYXNzKHRkRWxlbWVudCwgJ3NlLXRhYmxlLXNlbGVjdGVkLWNlbGwnKTtcclxuICAgICAgICBcclxuICAgICAgICB0YWJsZVBsdWdpbi5fYmluZE9uU2VsZWN0ID0gdGFibGVQbHVnaW4uX29uQ2VsbE11bHRpU2VsZWN0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2JpbmRPZmZTZWxlY3QgPSB0YWJsZVBsdWdpbi5fb2ZmQ2VsbE11bHRpU2VsZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICghc2hpZnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCwgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT24odGhpcy5jb250ZXh0LnRhYmxlLnJlc2l6ZURpdiwgdGhpcy5jb250ZXh0LnRhYmxlLnRhYmxlQ29udHJvbGxlciwgdGhpcy5wbHVnaW5zLnRhYmxlLmluaXQuYmluZCh0aGlzKSwgdGRFbGVtZW50LCAndGFibGUnKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGFibGVQbHVnaW4uX3JlZikgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl93ZC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2hpZnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGFibGVQbHVnaW4uX2JpbmRPblNlbGVjdCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRhYmxlUGx1Z2luLl9iaW5kT2ZmU2VsZWN0LCBmYWxzZSk7XHJcbiAgICAgICAgdGFibGVQbHVnaW4uX2luaXRCaW5kID0gdGFibGVQbHVnaW4uaW5pdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX3dkLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRhYmxlUGx1Z2luLl9pbml0QmluZCwgZmFsc2UpO1xyXG4gICAgfSxcclxuXHJcbiAgICBvbkNsaWNrX3RhYmxlQ29udHJvbGxlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykgPyBlLnRhcmdldCA6IGUudGFyZ2V0LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW9wdGlvbicpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlUGx1Z2luID0gdGhpcy5wbHVnaW5zLnRhYmxlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgdGFibGVQbHVnaW4uX2Nsb3NlU3BsaXRNZW51ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRhYmxlUGx1Z2luLl9jbG9zZVNwbGl0TWVudSgpO1xyXG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gJ29uc3BsaXQnKSByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbW1hbmQpIHJldHVybjtcclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHRUYWJsZSA9IHRoaXMuY29udGV4dC50YWJsZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2luc2VydCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5lZGl0VGFibGUuY2FsbCh0aGlzLCB2YWx1ZSwgb3B0aW9uKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdoZWFkZXInOlxyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4udG9nZ2xlSGVhZGVyLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnb25zcGxpdCc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5vcGVuU3BsaXRNZW51LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnc3BsaXQnOlxyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc3BsaXRDZWxscy5jYWxsKHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdtZXJnZSc6XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5tZXJnZUNlbGxzLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAncmVzaXplJzpcclxuICAgICAgICAgICAgICAgIGNvbnRleHRUYWJsZS5fbWF4V2lkdGggPSAhY29udGV4dFRhYmxlLl9tYXhXaWR0aDtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFRhYmxlU3R5bGUuY2FsbCh0aGlzLCAnd2lkdGgnKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFBvc2l0aW9uQ29udHJvbGxlclRvcC5jYWxsKHRoaXMsIGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjb250ZXh0VGFibGUuX3RkRWxlbWVudCwgdGFibGVQbHVnaW4uX3NoaWZ0KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsYXlvdXQnOlxyXG4gICAgICAgICAgICAgICAgY29udGV4dFRhYmxlLl9maXhlZENvbHVtbiA9ICFjb250ZXh0VGFibGUuX2ZpeGVkQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgdGFibGVQbHVnaW4uc2V0VGFibGVTdHlsZS5jYWxsKHRoaXMsICdjb2x1bW4nKTtcclxuICAgICAgICAgICAgICAgIHRhYmxlUGx1Z2luLnNldFBvc2l0aW9uQ29udHJvbGxlclRvcC5jYWxsKHRoaXMsIGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0YWJsZVBsdWdpbi5zZXRQb3NpdGlvbkNvbnRyb2xsZXJEaXYuY2FsbCh0aGlzLCBjb250ZXh0VGFibGUuX3RkRWxlbWVudCwgdGFibGVQbHVnaW4uX3NoaWZ0KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdyZW1vdmUnOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlEaXYgPSBjb250ZXh0VGFibGUuX2VsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVJdGVtKGNvbnRleHRUYWJsZS5fZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVtcHR5RGl2ICE9PSB0aGlzLmNvbnRleHQuZWxlbWVudC53eXNpd3lnKSB0aGlzLnV0aWwucmVtb3ZlSXRlbUFsbFBhcmVudHMoZW1wdHlEaXYsIGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwOyB9LCBudWxsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGhpc3Rvcnkgc3RhY2tcclxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChmYWxzZSk7XHJcbiAgICB9XHJcbn07XHJcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2Zvcm1hdEJsb2NrJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmZvcm1hdEJsb2NrID0ge1xuICAgICAgICAgICAgdGFyZ2V0VGV4dDogdGFyZ2V0RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudHh0JyksXG4gICAgICAgICAgICB0YXJnZXRUb29sdGlwOiB0YXJnZXRFbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignLnNlLXRvb2x0aXAtdGV4dCcpLFxuICAgICAgICAgICAgX2Zvcm1hdExpc3Q6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50Rm9ybWF0OiAnJ1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBzZXQgc3VibWVudSAqL1xuICAgICAgICBsZXQgbGlzdERpdiA9IHRoaXMuc2V0U3VibWVudShjb3JlKTtcblxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnBpY2tVcC5iaW5kKGNvcmUpKTtcbiAgICAgICAgY29udGV4dC5mb3JtYXRCbG9jay5fZm9ybWF0TGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGFuZ190b29sYmFyID0gY29yZS5sYW5nLnRvb2xiYXI7XG4gICAgICAgIGNvbnN0IGxpc3REaXYgPSBjb3JlLnV0aWwuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllciBzZS1saXN0LWZvcm1hdCc7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdEZvcm1hdHMgPSBbJ3AnLCAnZGl2JywgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J107XG4gICAgICAgIGNvbnN0IGZvcm1hdExpc3QgPSAhb3B0aW9uLmZvcm1hdHMgfHwgb3B0aW9uLmZvcm1hdHMubGVuZ3RoID09PSAwID8gZGVmYXVsdEZvcm1hdHMgOiBvcHRpb24uZm9ybWF0cztcblxuICAgICAgICBsZXQgbGlzdCA9ICc8ZGl2IGNsYXNzPVwic2UtbGlzdC1pbm5lclwiPjx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZm9ybWF0TGlzdC5sZW5ndGgsIGZvcm1hdCwgdGFnTmFtZSwgY29tbWFuZCwgbmFtZSwgaCwgYXR0cnMsIGNsYXNzTmFtZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRMaXN0W2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiYgZGVmYXVsdEZvcm1hdHMuaW5kZXhPZihmb3JtYXQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhZ05hbWUgPT09ICdibG9ja3F1b3RlJyA/ICdyYW5nZScgOiB0YWdOYW1lID09PSAncHJlJyA/ICdmcmVlJyA6ICdyZXBsYWNlJztcbiAgICAgICAgICAgICAgICBoID0gL15oLy50ZXN0KHRhZ05hbWUpID8gdGFnTmFtZS5tYXRjaCgvXFxkKy8pWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGxhbmdfdG9vbGJhclsndGFnXycgKyAoaCA/ICdoJyA6IHRhZ05hbWUpXSArIGg7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgYXR0cnMgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFnTmFtZSA9IGZvcm1hdC50YWcudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gZm9ybWF0LmNvbW1hbmQ7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGZvcm1hdC5uYW1lIHx8IHRhZ05hbWU7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZm9ybWF0LmNsYXNzO1xuICAgICAgICAgICAgICAgIGF0dHJzID0gY2xhc3NOYW1lID8gJyBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnXCInIDogJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpc3QgKz0gJzxsaT4nICtcbiAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGlzdFwiIGRhdGEtY29tbWFuZD1cIicgKyBjb21tYW5kICsgJ1wiIGRhdGEtdmFsdWU9XCInICsgdGFnTmFtZSArICdcIiBkYXRhLWNsYXNzPVwiJyArIGNsYXNzTmFtZSArICdcIiB0aXRsZT1cIicgKyBuYW1lICsgJ1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPCcgKyB0YWdOYW1lICsgYXR0cnMgKyAnPicgKyBuYW1lICsgJzwvJyArIHRhZ05hbWUgKyAnPicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBjb3JlXG4gICAgICovXG4gICAgYWN0aXZlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybWF0VGl0bGUgPSB0aGlzLmxhbmcudG9vbGJhci5mb3JtYXRzO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNvbnRleHQuZm9ybWF0QmxvY2sudGFyZ2V0VGV4dDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXRpbC5jaGFuZ2VUeHQodGFyZ2V0LCBmb3JtYXRUaXRsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy51dGlsLmlzRm9ybWF0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0Q29udGV4dCA9IHRoaXMuY29udGV4dC5mb3JtYXRCbG9jaztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdExpc3QgPSBmb3JtYXRDb250ZXh0Ll9mb3JtYXRMaXN0O1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSAoZWxlbWVudC5jbGFzc05hbWUubWF0Y2goLyhcXHN8XilfX3NlX19mb3JtYXRfX1teXFxzXSsvKSB8fCBbJyddKVswXS50cmltKCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmb3JtYXRMaXN0Lmxlbmd0aCwgZjsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZiA9IGZvcm1hdExpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBmLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpICYmIGNsYXNzTmFtZSA9PT0gZi5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xhc3MnKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRUaXRsZSA9IGYudGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGlsLmNoYW5nZVR4dCh0YXJnZXQsIGZvcm1hdFRpdGxlKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnLCBub2RlTmFtZSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJywgY2xhc3NOYW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdENvbnRleHQgPSB0aGlzLmNvbnRleHQuZm9ybWF0QmxvY2s7XG4gICAgICAgIGNvbnN0IGZvcm1hdExpc3QgPSBmb3JtYXRDb250ZXh0Ll9mb3JtYXRMaXN0O1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBmb3JtYXRDb250ZXh0LnRhcmdldFRleHQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGb3JtYXQgPSAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpIHx8ICcnKSArICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJykgfHwgJycpO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rm9ybWF0ICE9PSBmb3JtYXRDb250ZXh0LmN1cnJlbnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBmb3JtYXRMaXN0Lmxlbmd0aCwgZjsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZiA9IGZvcm1hdExpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGb3JtYXQgPT09IGYuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgKyBmLmdldEF0dHJpYnV0ZSgnZGF0YS1jbGFzcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhmLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsLnJlbW92ZUNsYXNzKGYsICdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdENvbnRleHQuY3VycmVudEZvcm1hdCA9IGN1cnJlbnRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja1VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgY29tbWFuZCA9IG51bGwsIHZhbHVlID0gbnVsbCwgdGFnID0gbnVsbCwgY2xhc3NOYW1lID0gJyc7XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9VTC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xhc3MnKTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGFnID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWxlbWVudCA9IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hcHBseVJhbmdlRm9ybWF0RWxlbWVudChyYW5nZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZyZWUsIHJlcGxhY2VcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzQW5kQ29tcG9uZW50cyhmYWxzZSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmdldFJhbmdlX2FkZExpbmUocmFuZ2UsIG51bGwpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRm9ybXN0cyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50c0FuZENvbXBvbmVudHMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCBlbmRPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHV0aWwgPSB0aGlzLnV0aWw7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBzZWxlY3RlZEZvcm1zdHNbMF07XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHNlbGVjdGVkRm9ybXN0c1tzZWxlY3RlZEZvcm1zdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhdGggPSB1dGlsLmdldE5vZGVQYXRoKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBmaXJzdCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGF0aCA9IHV0aWwuZ2V0Tm9kZVBhdGgocmFuZ2UuZW5kQ29udGFpbmVyLCBsYXN0LCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGxpc3RcbiAgICAgICAgICAgIGNvbnN0IHJsaXN0ID0gdGhpcy5kZXRhY2hMaXN0KHNlbGVjdGVkRm9ybXN0cywgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKHJsaXN0LnNjKSBmaXJzdCA9IHJsaXN0LnNjO1xuICAgICAgICAgICAgaWYgKHJsaXN0LmVjKSBsYXN0ID0gcmxpc3QuZWM7XG5cbiAgICAgICAgICAgIC8vIGNoYW5nZSBmb3JtYXQgdGFnXG4gICAgICAgICAgICB0aGlzLnNldFJhbmdlKHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGZpcnN0UGF0aCwgZmlyc3QpLCBzdGFydE9mZnNldCwgdXRpbC5nZXROb2RlRnJvbVBhdGgobGFzdFBhdGgsIGxhc3QpLCBlbmRPZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzQW5kQ29tcG9uZW50cyhmYWxzZSk7XG5cbiAgICAgICAgICAgIC8vIGZyZWUgZm9ybWF0XG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gJ2ZyZWUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbW9kaWZpZWRGb3Jtc3RzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBtb2RpZmllZEZvcm1zdHNbbGVuXS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGxldCBmcmVlRWxlbWVudCA9IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzRWxlbWVudCA9IGZyZWVFbGVtZW50O1xuICAgIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZW4sIGYsIGh0bWwsIGJlZm9yZSwgbmV4dCwgaW5uZXIsIGlzQ29tcCwgZmlyc3QgPSB0cnVlOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBmID0gbW9kaWZpZWRGb3Jtc3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PT0gKCFtb2RpZmllZEZvcm1zdHNbaSArIDFdID8gbnVsbCA6IG1vZGlmaWVkRm9ybXN0c1tpICsgMV0ucGFyZW50Tm9kZSkpIGNvbnRpbnVlO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBpc0NvbXAgPSB1dGlsLmlzQ29tcG9uZW50KGYpO1xuICAgICAgICAgICAgICAgICAgICBodG1sID0gaXNDb21wID8gJycgOiBmLmlubmVySFRNTC5yZXBsYWNlKC8oPyE+KVxccysoPz08KXxcXG4vZywgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KGYsIGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5wYXJlbnROb2RlID09PSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT09IGYucGFyZW50Tm9kZSB8fCBpc0NvbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJlZUVsZW1lbnQsIHBhcmVudE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZyZWVFbGVtZW50LCBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gZi5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZnJlZUVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBmcmVlRWxlbWVudC5ub2RlTmFtZSA9PT0gbmV4dC5ub2RlTmFtZSAmJiB1dGlsLmlzU2FtZUF0dHJpYnV0ZXMoZnJlZUVsZW1lbnQsIG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MICs9ICc8QlI+JyArIG5leHQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQgPSB0YWcuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGZyZWVFbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MID0gKChmaXJzdCB8fCAhaHRtbCB8fCAhaW5uZXIgfHwgLzxicj4kL2kudGVzdChodG1sKSkgPyBodG1sIDogaHRtbCArICc8QlI+JykgKyBpbm5lcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZnJlZUVsZW1lbnQsIGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGYubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAmJiBmcmVlRWxlbWVudC5ub2RlTmFtZSA9PT0gbmV4dC5ub2RlTmFtZSAmJiB1dGlsLmlzU2FtZUF0dHJpYnV0ZXMoZnJlZUVsZW1lbnQsIG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUVsZW1lbnQuaW5uZXJIVE1MICs9ICc8QlI+JyArIG5leHQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IGZyZWVFbGVtZW50LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICYmIGZyZWVFbGVtZW50Lm5vZGVOYW1lID09PSBwcmV2Lm5vZGVOYW1lICYmIHV0aWwuaXNTYW1lQXR0cmlidXRlcyhmcmVlRWxlbWVudCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmlubmVySFRNTCArPSAnPEJSPicgKyBmcmVlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGZyZWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNDb21wKSB1dGlsLnJlbW92ZUl0ZW0oZik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWh0bWwpIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2UoZm9jdXNFbGVtZW50LCAwLCBmb2N1c0VsZW1lbnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVwbGFjZSBmb3JtYXRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtb2RpZmllZEZvcm1zdHMubGVuZ3RoLCBub2RlLCBuZXdGb3JtYXQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gbW9kaWZpZWRGb3Jtc3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IHZhbHVlLnRvTG93ZXJDYXNlKCkgfHwgKG5vZGUuY2xhc3NOYW1lLm1hdGNoKC8oXFxzfF4pX19zZV9fZm9ybWF0X19bXlxcc10rLykgfHwgWycnXSlbMF0udHJpbSgpICE9PSBjbGFzc05hbWUpICYmICF1dGlsLmlzQ29tcG9uZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtYXQgPSB0YWcuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29weUZvcm1hdEF0dHJpYnV0ZXMobmV3Rm9ybWF0LCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5pbm5lckhUTUwgPSBub2RlLmlubmVySFRNTDtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Rm9ybWF0LCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgZmlyc3QgPSBuZXdGb3JtYXQgfHwgbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEpIGxhc3QgPSBuZXdGb3JtYXQgfHwgbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZSh1dGlsLmdldE5vZGVGcm9tUGF0aChmaXJzdFBhdGgsIGZpcnN0KSwgc3RhcnRPZmZzZXQsIHV0aWwuZ2V0Tm9kZUZyb21QYXRoKGxhc3RQYXRoLCBsYXN0KSwgZW5kT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGlzdG9yeSBzdGFja1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJtZW51T2ZmKCk7XG4gICAgfVxufTtcbiIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE5NyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdsaW5lSGVpZ2h0JyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmxpbmVIZWlnaHQgPSB7XG4gICAgICAgICAgICBfc2l6ZUxpc3Q6IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50U2l6ZTogLTFcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG5cbiAgICAgICAgY29udGV4dC5saW5lSGVpZ2h0Ll9zaXplTGlzdCA9IGxpc3RVbC5xdWVyeVNlbGVjdG9yQWxsKCdsaSBidXR0b24nKTtcblxuICAgICAgICAvKiogYXBwZW5kIHRhcmdldCBidXR0b24gbWVudSAqL1xuICAgICAgICBjb3JlLmluaXRNZW51VGFyZ2V0KHRoaXMubmFtZSwgdGFyZ2V0RWxlbWVudCwgbGlzdERpdik7XG5cbiAgICAgICAgLyoqIGVtcHR5IG1lbW9yeSAqL1xuICAgICAgICBsaXN0RGl2ID0gbnVsbCwgbGlzdFVsID0gbnVsbDtcbiAgICB9LFxuXG4gICAgc2V0U3VibWVudTogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gY29yZS5vcHRpb25zO1xuICAgICAgICBjb25zdCBsYW5nID0gY29yZS5sYW5nO1xuICAgICAgICBjb25zdCBsaXN0RGl2ID0gY29yZS51dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3NlLXN1Ym1lbnUgc2UtbGlzdC1sYXllcic7XG5cbiAgICAgICAgY29uc3Qgc2l6ZUxpc3QgPSAhb3B0aW9uLmxpbmVIZWlnaHRzID8gW1xuICAgICAgICAgICAge3RleHQ6ICcxJywgdmFsdWU6IDF9LFxuICAgICAgICAgICAge3RleHQ6ICcxLjE1JywgdmFsdWU6IDEuMTV9LFxuICAgICAgICAgICAge3RleHQ6ICcxLjUnLCB2YWx1ZTogMS41fSxcbiAgICAgICAgICAgIHt0ZXh0OiAnMicsIHZhbHVlOiAyfVxuICAgICAgICBdIDogb3B0aW9uLmxpbmVIZWlnaHRzO1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+JyArXG4gICAgICAgICAgICAgICAgJzx1bCBjbGFzcz1cInNlLWxpc3QtYmFzaWNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRlZmF1bHRfdmFsdWUgc2UtYnRuLWxpc3RcIiB0aXRsZT1cIicgKyBsYW5nLnRvb2xiYXIuZGVmYXVsdCArICdcIj4oJyArIGxhbmcudG9vbGJhci5kZWZhdWx0ICsgJyk8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzaXplTGlzdC5sZW5ndGgsIHRleHQsIHNpemU7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgc2l6ZSA9IHNpemVMaXN0W2ldO1xuICAgICAgICAgICAgbGlzdCArPSAnPGxpPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxpc3RcIiBkYXRhLXZhbHVlPVwiJyArIHNpemUudmFsdWUgKyAnXCIgdGl0bGU9XCInICsgc2l6ZS50ZXh0ICsgJ1wiPicgKyBzaXplLnRleHQgKyAnPC9idXR0b24+PC9saT4nO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QgKz0gJzwvdWw+PC9kaXY+JztcblxuICAgICAgICBsaXN0RGl2LmlubmVySFRNTCA9IGxpc3Q7XG5cbiAgICAgICAgcmV0dXJuIGxpc3REaXY7XG4gICAgfSxcblxuICAgICAvKipcbiAgICAgKiBAT3ZlcnJpZGUgc3VibWVudVxuICAgICAqL1xuICAgIG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHRDb250ZXh0ID0gdGhpcy5jb250ZXh0LmxpbmVIZWlnaHQ7XG4gICAgICAgIGNvbnN0IHNpemVMaXN0ID0gbGluZUhlaWdodENvbnRleHQuX3NpemVMaXN0O1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnV0aWwuZ2V0Rm9ybWF0RWxlbWVudCh0aGlzLmdldFNlbGVjdGlvbk5vZGUoKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gIWZvcm1hdCA/ICcnIDogZm9ybWF0LnN0eWxlLmxpbmVIZWlnaHQgKyAnJztcblxuICAgICAgICBpZiAoY3VycmVudFNpemUgIT09IGxpbmVIZWlnaHRDb250ZXh0LmN1cnJlbnRTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc2l6ZUxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPT09IHNpemVMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhzaXplTGlzdFtpXSwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZUhlaWdodENvbnRleHQuY3VycmVudFNpemUgPSBjdXJyZW50U2l6ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghL15CVVRUT04kL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykgfHwgJyc7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSB0aGlzLmdldFNlbGVjdGVkRWxlbWVudHMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZm9ybWF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgZm9ybWF0c1tpXS5zdHlsZS5saW5lSGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAncGFyYWdyYXBoU3R5bGUnLFxuICAgIGRpc3BsYXk6ICdzdWJtZW51JyxcbiAgICBhZGQ6IGZ1bmN0aW9uIChjb3JlLCB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQucGFyYWdyYXBoU3R5bGUgPSB7XG4gICAgICAgICAgICBfY2xhc3NMaXN0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIHNldCBzdWJtZW51ICovXG4gICAgICAgIGxldCBsaXN0RGl2ID0gdGhpcy5zZXRTdWJtZW51KGNvcmUpO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIGxpc3REaXYucXVlcnlTZWxlY3RvcigndWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGlja1VwLmJpbmQoY29yZSkpO1xuXG4gICAgICAgIGNvbnRleHQucGFyYWdyYXBoU3R5bGUuX2NsYXNzTGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtZm9ybWF0JztcblxuICAgICAgICBjb25zdCBtZW51TGFuZyA9IGNvcmUubGFuZy5tZW51O1xuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHtcbiAgICAgICAgICAgIHNwYWNlZDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1lbnVMYW5nLnNwYWNlZCxcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3Atc3BhY2VkJyxcbiAgICAgICAgICAgICAgICBfY2xhc3M6ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9yZGVyZWQ6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtZW51TGFuZy5ib3JkZXJlZCxcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3AtYm9yZGVyZWQnLFxuICAgICAgICAgICAgICAgIF9jbGFzczogJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogbWVudUxhbmcubmVvbixcbiAgICAgICAgICAgICAgICBjbGFzczogJ19fc2VfX3AtbmVvbicsXG4gICAgICAgICAgICAgICAgX2NsYXNzOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhTdHlsZXMgPSAhb3B0aW9uLnBhcmFncmFwaFN0eWxlcyB8fCBvcHRpb24ucGFyYWdyYXBoU3R5bGVzLmxlbmd0aCA9PT0gMCA/IFsnc3BhY2VkJywgJ2JvcmRlcmVkJywgJ25lb24nXSA6IG9wdGlvbi5wYXJhZ3JhcGhTdHlsZXM7XG5cbiAgICAgICAgbGV0IGxpc3QgPSAnPGRpdiBjbGFzcz1cInNlLWxpc3QtaW5uZXJcIj48dWwgY2xhc3M9XCJzZS1saXN0LWJhc2ljXCI+JztcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhcmFncmFwaFN0eWxlcy5sZW5ndGgsIHAsIG5hbWUsIGF0dHJzLCBfY2xhc3M7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgcCA9IHBhcmFncmFwaFN0eWxlc1tpXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTdHlsZSA9IGRlZmF1bHRMaXN0W3AudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZhdWx0U3R5bGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHAgPSBkZWZhdWx0U3R5bGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hbWUgPSBwLm5hbWU7XG4gICAgICAgICAgICBhdHRycyA9IHAuY2xhc3MgPyAnIGNsYXNzPVwiJyArIHAuY2xhc3MgKyAnXCInIDogJyc7XG4gICAgICAgICAgICBfY2xhc3MgPSBwLl9jbGFzcztcblxuICAgICAgICAgICAgbGlzdCArPSAnPGxpPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0JyArIChfY2xhc3MgPyAnICcgKyBfY2xhc3M6ICcnKSArICdcIiBkYXRhLXZhbHVlPVwiJyArIHAuY2xhc3MgKyAnXCIgdGl0bGU9XCInICsgbmFtZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYnICsgYXR0cnMgKyAnPicgKyBuYW1lICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGV4dCA9IHRoaXMuY29udGV4dC5wYXJhZ3JhcGhTdHlsZTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoTGlzdCA9IHBhcmFncmFwaENvbnRleHQuX2NsYXNzTGlzdDtcbiAgICAgICAgY29uc3QgY3VycmVudEZvcm1hdCA9IHRoaXMudXRpbC5nZXRGb3JtYXRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGFyYWdyYXBoTGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMudXRpbC5oYXNDbGFzcyhjdXJyZW50Rm9ybWF0LCBwYXJhZ3JhcGhMaXN0W2ldLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5hZGRDbGFzcyhwYXJhZ3JhcGhMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRpbC5yZW1vdmVDbGFzcyhwYXJhZ3JhcGhMaXN0W2ldLCAnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGlja1VwOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICBcbiAgICAgICAgd2hpbGUgKCEvXlVMJC9pLnRlc3QodGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgYnJlYWs7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRGb3Jtc3RzID0gdGhpcy5nZXRTZWxlY3RlZEVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZEZvcm1zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmdldFJhbmdlX2FkZExpbmUodGhpcy5nZXRSYW5nZSgpLCBudWxsKTtcbiAgICAgICAgICAgIHNlbGVjdGVkRm9ybXN0cyA9IHRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50cygpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRm9ybXN0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBmb3JtYXQgY2xhc3NcbiAgICAgICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSB0aGlzLnV0aWwuaGFzQ2xhc3ModGFyZ2V0LCAnYWN0aXZlJykgPyB0aGlzLnV0aWwucmVtb3ZlQ2xhc3MuYmluZCh0aGlzLnV0aWwpIDogdGhpcy51dGlsLmFkZENsYXNzLmJpbmQodGhpcy51dGlsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkRm9ybXN0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdG9nZ2xlQ2xhc3Moc2VsZWN0ZWRGb3Jtc3RzW2ldLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1lbnVPZmYoKTtcblxuICAgICAgICAvLyBoaXN0b3J5IHN0YWNrXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGZhbHNlKTtcbiAgICB9XG59O1xuIiwiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAndGV4dFN0eWxlJyxcbiAgICBkaXNwbGF5OiAnc3VibWVudScsXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LnRleHRTdHlsZSA9IHtcbiAgICAgICAgICAgIF9zdHlsZUxpc3Q6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogc2V0IHN1Ym1lbnUgKi9cbiAgICAgICAgbGV0IGxpc3REaXYgPSB0aGlzLnNldFN1Ym1lbnUoY29yZSk7XG4gICAgICAgIGxldCBsaXN0VWwgPSBsaXN0RGl2LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cbiAgICAgICAgbGlzdFVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5waWNrdXAuYmluZChjb3JlKSk7XG5cbiAgICAgICAgY29udGV4dC50ZXh0U3R5bGUuX3N0eWxlTGlzdCA9IGxpc3REaXYucXVlcnlTZWxlY3RvckFsbCgnbGkgYnV0dG9uJyk7XG5cbiAgICAgICAgLyoqIGFwcGVuZCB0YXJnZXQgYnV0dG9uIG1lbnUgKi9cbiAgICAgICAgY29yZS5pbml0TWVudVRhcmdldCh0aGlzLm5hbWUsIHRhcmdldEVsZW1lbnQsIGxpc3REaXYpO1xuXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cbiAgICAgICAgbGlzdERpdiA9IG51bGwsIGxpc3RVbCA9IG51bGw7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uIChjb3JlKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGNvcmUub3B0aW9ucztcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGNvcmUudXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGlzdERpdi5jbGFzc05hbWUgPSAnc2Utc3VibWVudSBzZS1saXN0LWxheWVyIHNlLWxpc3QtZm9ybWF0JztcblxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHtcbiAgICAgICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb3JlLmxhbmcubWVudS5jb2RlLFxuICAgICAgICAgICAgICAgIGNsYXNzOiAnX19zZV9fdC1jb2RlJyxcbiAgICAgICAgICAgICAgICB0YWc6ICdjb2RlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2x1Y2VudDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvcmUubGFuZy5tZW51LnRyYW5zbHVjZW50LFxuICAgICAgICAgICAgICAgIHN0eWxlOiAnb3BhY2l0eTogMC41OycsXG4gICAgICAgICAgICAgICAgdGFnOiAnc3BhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hhZG93OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogY29yZS5sYW5nLm1lbnUuc2hhZG93LFxuICAgICAgICAgICAgICAgIGNsYXNzOiAnX19zZV9fdC1zaGFkb3cnLFxuICAgICAgICAgICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdHlsZUxpc3QgPSAhb3B0aW9uLnRleHRTdHlsZXMgPyBjb3JlLl93Lk9iamVjdC5rZXlzKGRlZmF1bHRMaXN0KSA6IG9wdGlvbi50ZXh0U3R5bGVzO1xuXG4gICAgICAgIGxldCBsaXN0ID0gJzxkaXYgY2xhc3M9XCJzZS1saXN0LWlubmVyXCI+PHVsIGNsYXNzPVwic2UtbGlzdC1iYXNpY1wiPic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUxpc3QubGVuZ3RoLCB0LCB0YWcsIG5hbWUsIGF0dHJzLCBjb21tYW5kLCB2YWx1ZSwgX2NsYXNzOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHQgPSBzdHlsZUxpc3RbaV07XG4gICAgICAgICAgICBhdHRycyA9ICcnLCB2YWx1ZSA9ICcnLCBjb21tYW5kID0gW107XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U3R5bGUgPSBkZWZhdWx0TGlzdFt0LnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgICAgICAgIGlmICghZGVmYXVsdFN0eWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0ID0gZGVmYXVsdFN0eWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYW1lID0gdC5uYW1lO1xuICAgICAgICAgICAgdGFnID0gdC50YWcgfHwgJ3NwYW4nO1xuICAgICAgICAgICAgX2NsYXNzID0gdC5fY2xhc3M7XG5cbiAgICAgICAgICAgIGlmICh0LnN0eWxlKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMgKz0gJyBzdHlsZT1cIicgKyB0LnN0eWxlICsgJ1wiJztcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0LnN0eWxlLnJlcGxhY2UoLzpbXjtdKyg7fCQpXFxzKi9nLCAnLCcpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQucHVzaCgnc3R5bGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0LmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMgKz0gJyBjbGFzcz1cIicgKyB0LmNsYXNzICsgJ1wiJztcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnLicgKyB0LmNsYXNzLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcsLicpO1xuICAgICAgICAgICAgICAgIGNvbW1hbmQucHVzaCgnY2xhc3MnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8sJC8sICcnKTtcblxuICAgICAgICAgICAgbGlzdCArPSAnPGxpPicgK1xuICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1saXN0JyArIChfY2xhc3MgPyAnICcgKyBfY2xhc3M6ICcnKSArICdcIiBkYXRhLWNvbW1hbmQ9XCInICsgdGFnICsgJ1wiIGRhdGEtdmFsdWU9XCInICsgdmFsdWUgKyAnXCIgdGl0bGU9XCInICsgbmFtZSArICdcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzwnICsgdGFnICsgYXR0cnMgKyAnPicgKyBuYW1lICsgICc8LycgKyB0YWcgKyAnPicgK1xuICAgICAgICAgICAgICAgICc8L2J1dHRvbj48L2xpPic7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdCArPSAnPC91bD48L2Rpdj4nO1xuXG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gbGlzdDtcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgIC8qKlxuICAgICAqIEBPdmVycmlkZSBzdWJtZW51XG4gICAgICovXG4gICAgb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdXRpbCA9IHRoaXMudXRpbDtcbiAgICAgICAgY29uc3QgdGV4dFN0eWxlQ29udGV4dCA9IHRoaXMuY29udGV4dC50ZXh0U3R5bGU7XG4gICAgICAgIGNvbnN0IHN0eWxlQnV0dG9uTGlzdCA9IHRleHRTdHlsZUNvbnRleHQuX3N0eWxlTGlzdDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uTm9kZSA9IHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUJ1dHRvbkxpc3QubGVuZ3RoLCBidG4sIGRhdGEsIGFjdGl2ZTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBidG4gPSBzdHlsZUJ1dHRvbkxpc3RbaV07XG4gICAgICAgICAgICBkYXRhID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IHYgPSAwLCBub2RlLCB2YWx1ZTsgdiA8IGRhdGEubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc2VsZWN0aW9uTm9kZTtcbiAgICAgICAgICAgICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAmJiAhdXRpbC5pc0Zvcm1hdEVsZW1lbnQobm9kZSkgJiYgIXV0aWwuaXNDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRhW3ZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KHZhbHVlKSA/IHV0aWwuaGFzQ2xhc3Mobm9kZSwgdmFsdWUucmVwbGFjZSgvXlxcLi8sICcnKSkgOiAhIW5vZGUuc3R5bGVbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghYWN0aXZlKSBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWN0aXZlID8gdXRpbC5hZGRDbGFzcyhidG4sICdhY3RpdmUnKSA6IHV0aWwucmVtb3ZlQ2xhc3MoYnRuLCAnYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICBwaWNrdXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIGxldCBjb21tYW5kID0gbnVsbCwgdGFnID0gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL1VML2kudGVzdCh0YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGFnID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNoZWNrU3R5bGVzID0gdGFnLnN0eWxlLmNzc1RleHQucmVwbGFjZSgvOi4rKDt8JCkvZywgJywnKS5zcGxpdCgnLCcpO1xuICAgICAgICBjaGVja1N0eWxlcy5wb3AoKTtcblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gdGFnLmNsYXNzTGlzdDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNoZWNrU3R5bGVzLnB1c2goJy4nICsgY2xhc3Nlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy51dGlsLmhhc0NsYXNzKHRhcmdldCwgJ2FjdGl2ZScpID8gbnVsbCA6IHRhZy5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICBjb25zdCByZW1vdmVOb2RlcyA9IG5ld05vZGUgPyBudWxsIDogW3RhZy5ub2RlTmFtZV07XG4gICAgICAgIHRoaXMubm9kZUNoYW5nZShuZXdOb2RlLCBjaGVja1N0eWxlcywgcmVtb3ZlTm9kZXMsIHRydWUpO1xuXG4gICAgICAgIHRoaXMuc3VibWVudU9mZigpO1xuICAgIH1cbn07XG4iLCIvKlxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXG4gKlxuICogc3VuZWRpdG9yLmpzXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxuICogTUlUIGxpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGZpbGVCcm93c2VyIGZyb20gJy4uL21vZHVsZXMvZmlsZUJyb3dzZXInO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2ltYWdlR2FsbGVyeScsXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvcmUgQ29yZSBvYmplY3QgXG4gICAgICovXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xuICAgICAgICBjb3JlLmFkZE1vZHVsZShbZmlsZUJyb3dzZXJdKTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmltYWdlR2FsbGVyeSA9IHtcbiAgICAgICAgICAgIHRpdGxlOiBjb3JlLmxhbmcudG9vbGJhci5pbWFnZUdhbGxlcnksIC8vIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBGaWxlIGJyb3dzZXIgd2luZG93IHRpdGxlLlxuICAgICAgICAgICAgdXJsOiBjb3JlLm9wdGlvbnMuaW1hZ2VHYWxsZXJ5VXJsLCAvLyBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVCcm93c2VyIC0gRmlsZSBzZXJ2ZXIgdXJsLlxuICAgICAgICAgICAgaGVhZGVyOiBjb3JlLm9wdGlvbnMuaW1hZ2VHYWxsZXJ5SGVhZGVyLCAvLyBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVCcm93c2VyIC0gRmlsZSBzZXJ2ZXIgaHR0cCBoZWFkZXIuXG4gICAgICAgICAgICBsaXN0Q2xhc3M6ICdzZS1pbWFnZS1saXN0JywgLy8gQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlQnJvd3NlciAtIENsYXNzIG5hbWUgb2YgbGlzdCBkaXYuXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGVIYW5kbGVyOiB0aGlzLmRyYXdJdGVtcywgLy8gQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlQnJvd3NlciAtIEZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgSFRNTCBvZiBhbiBmaWxlIGl0ZW0uXG4gICAgICAgICAgICBzZWxlY3RvckhhbmRsZXI6IHRoaXMuc2V0SW1hZ2UuYmluZChjb3JlKSwgLy8gQFJlcXVpcmVkIEBPdmVycmlkZSBmaWxlQnJvd3NlciAtIEZ1bmN0aW9uIHRoYXQgYWN0aW9uIHdoZW4gaXRlbSBjbGljay5cbiAgICAgICAgICAgIGNvbHVtblNpemU6IDQgLy8gQE9wdGlvbiBAT3ZlcnJpZGUgZmlsZUJyb3dzZXIgLSBOdW1iZXIgb2YgXCJkaXYuc2UtZmlsZS1pdGVtLWNvbHVtblwiIHRvIGJlIGNyZWF0ZWQgKGRlZmF1bHQ6IDQpXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBAUmVxdWlyZWQgQE92ZXJyaWRlIGZpbGVCcm93c2VyXG4gICAgICogQGRlc2NyaXB0aW9uIE9wZW4gYSBmaWxlIGJyb3dzZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSBzZWxlY3RvckhhbmRsZXIgV2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgYXMgYW4gYXJndW1lbnQgdmFsdWUsIGl0IHN1YnN0aXR1dGVzIFwiY29udGV4dC5zZWxlY3RvckhhbmRsZXJcIi5cbiAgICAgKi9cbiAgICBvcGVuOiBmdW5jdGlvbiAoc2VsZWN0b3JIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucGx1Z2lucy5maWxlQnJvd3Nlci5vcGVuLmNhbGwodGhpcywgJ2ltYWdlR2FsbGVyeScsIHNlbGVjdG9ySGFuZGxlcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBSZXF1aXJlZCBAT3ZlcnJpZGUgZmlsZUJyb3dzZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lIHRoZSBIVE1MIG9mIHRoZSBpdGVtIHRvIGJlIHB1dCBpbiBcImRpdi5zZS1maWxlLWl0ZW0tY29sdW1uXCIuXG4gICAgICogRm9ybWF0OiBbXG4gICAgICogICAgICB7IHNyYzogXCJpbWFnZSBzcmNcIiwgbmFtZTogXCJuYW1lKEBvcHRpb24pXCIsIGFsdDogXCJpbWFnZSBhbHQoQG9wdGlvbilcIiwgdGFnOiBcInRhZyBuYW1lKEBvcHRpb24pXCIgfVxuICAgICAqIF1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBJdGVtIG9mIHRoZSByZXNwb25zZSBkYXRhJ3MgYXJyYXlcbiAgICAgKi9cbiAgICBkcmF3SXRlbXM6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGNvbnN0IHNyY05hbWUgPSBpdGVtLnNyYy5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICByZXR1cm4gICc8ZGl2IGNsYXNzPVwic2UtZmlsZS1pdGVtLWltZ1wiPjxpbWcgc3JjPVwiJyArIGl0ZW0uc3JjICsgJ1wiIGFsdD1cIicgKyAoaXRlbS5hbHQgfHwgc3JjTmFtZSkgKyAnXCIgZGF0YS1jb21tYW5kPVwicGlja1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInNlLWZpbGUtaW1nLW5hbWUgc2UtZmlsZS1uYW1lLWJhY2tcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzZS1maWxlLWltZy1uYW1lIF9fc2VfX2ltZ19uYW1lXCI+JyArIChpdGVtLm5hbWUgfHwgc3JjTmFtZSkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgfSxcblxuICAgIHNldEltYWdlOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuY2FsbFBsdWdpbignaW1hZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0ge25hbWU6IHRhcmdldC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5fX3NlX19pbWdfbmFtZScpLnRleHRDb250ZW50LCBzaXplOiAwfTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbWFnZS5fYWx0VGV4dCA9IHRhcmdldC5hbHQ7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMuaW1hZ2UuY3JlYXRlX2ltYWdlLmNhbGwodGhpcywgdGFyZ2V0LnNyYywgbnVsbCwgdGhpcy5jb250ZXh0LmltYWdlLl9vcmlnaW5fdywgdGhpcy5jb250ZXh0LmltYWdlLl9vcmlnaW5faCwgJ25vbmUnLCBmaWxlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCBudWxsKTtcbiAgICB9XG59OyIsIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDIwIEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAvLyBydGwgaWNvblxuICAgcnRsOiB7XG4gICAgICBpdGFsaWM6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEwLjUgMTUuOFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0wLjMsMC4xYzAuMywwLDAuNSwwLDAuNywwYzEsMC4xLDEuNywwLjEsMi4yLDAuMUg0TDcuMiwwbDAuMiwxLjFIN2MtMC41LDAtMSwwLjEtMS41LDAuM3YwLjRsMC4zLDEuOUw2LDQuNEw2LjMsNiBsMC4xLDAuNGwwLjEsMC41YzAuMSwwLjIsMC4xLDAuNCwwLjIsMC43czAuMSwwLjYsMC4yLDAuOUw3LDkuMWwwLjYsMi44bDAuMywxLjRjMC4xLDAuNCwwLjIsMC43LDAuNCwxYzAuNCwwLjIsMC44LDAuMywxLjIsMC40IGwwLjgsMC4ybDAuMiwwLjlsLTEuMSwwYy0wLjktMC4xLTEuNS0wLjEtMS44LTAuMWgtMmMtMC45LDAuMS0xLjQsMC4yLTEuNSwwLjJjLTAuMSwwLTAuMiwwLTAuMywwSDMuNGMtMC4xLDAtMC4yLDAtMC4yLDAgbC0wLjEtMC40YzAtMC4yLTAuMS0wLjQtMC4xLTAuNmwwLjctMC4xYzAuNCwwLDAuOC0wLjEsMS4yLTAuMmMwLTAuMSwwLTAuMiwwLTAuM2wtMC4xLTAuNWwtMC40LTIuNEw0LDkuNkwzLjQsNi40IEMzLjIsNS43LDMsNC43LDIuNywzLjNjMC0wLjMtMC4xLTAuNS0wLjEtMC44QzIuNSwyLjEsMi40LDEuOSwyLjMsMS42QzIsMS40LDEuNiwxLjMsMS4zLDEuMkMwLjksMS4yLDAuNSwxLjEsMC4yLDAuOUwwLDAuNEwwLDAgTDAuMywwLjFMMC4zLDAuMXpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICBpbmRlbnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTIuNFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PGc+PHBhdGggZD1cIk0xNS41LDEwLjFMMTUuNSwxMC4xYzAuMSwwLDAuMywwLjEsMC4zLDAuM3YxLjdjMCwwLjEsMCwwLjEtMC4xLDAuMmMtMC4xLDAuMS0wLjEsMC4xLTAuMiwwLjFsLTE1LjIsMCBjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCwxMi4yLDAsMTIuMiwwLDEyLjFsMC0xLjdjMC0wLjEsMC0wLjEsMC4xLTAuMmMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMUMwLjMsMTAuMSwxNS41LDEwLjEsMTUuNSwxMC4xeiBNOS44LDYuN2MwLjEsMCwwLjEsMCwwLjIsMC4xQzEwLjEsNi45LDEwLjEsNywxMC4xLDd2MS43YzAsMC4xLDAsMC4yLTAuMSwwLjJDMTAsOSw5LjksOSw5LjgsOUwwLjMsOUMwLjIsOSwwLjEsOSwwLjEsOC45IEMwLDguOSwwLDguOCwwLDguN1Y3QzAsNywwLDYuOSwwLjEsNi44YzAuMS0wLjEsMC4xLTAuMSwwLjItMC4xQzAuMyw2LjcsOS44LDYuNyw5LjgsNi43eiBNMC4zLDMuNGg5LjZoMGMwLjEsMCwwLjMsMC4xLDAuMywwLjMgdjEuN3YwYzAsMC4xLTAuMSwwLjMtMC4zLDAuM0gwLjNjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCw1LjUsMCw1LjQsMCw1LjNWMy42YzAtMC4xLDAtMC4xLDAuMS0wLjJDMC4xLDMuNCwwLjIsMy40LDAuMywzLjQgTDAuMywzLjR6IE0wLjMsMGwxNS4yLDBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMC4xLDAuMSwwLjEsMC4xLDAuMlYyYzAsMC4xLDAsMC4yLTAuMSwwLjJjLTAuMSwwLjEtMC4xLDAuMS0wLjIsMC4xSDAuMyBjLTAuMSwwLTAuMSwwLTAuMi0wLjFDMCwyLjEsMCwyLDAsMmwwLTEuN2MwLTAuMSwwLTAuMSwwLjEtMC4yQzAuMSwwLDAuMiwwLDAuMywwelwiLz48L2c+PHBhdGggZD1cIk0xMy4xLDMuNUwxNS43LDZjMC4xLDAuMSwwLjEsMC4zLDAsMC40bC0yLjUsMi41QzEzLjEsOSwxMyw5LDEyLjksOWMtMC4xLDAtMC4xLDAtMC4yLTAuMWMtMC4xLTAuMS0wLjEtMC4xLTAuMS0wLjJWMy43IGMwLTAuMSwwLTAuMiwwLjEtMC4yYzAuMS0wLjEsMC4xLTAuMSwwLjItMC4xQzEzLDMuNCwxMy4xLDMuNCwxMy4xLDMuNXpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICBvdXRkZW50OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43IDEyLjRcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPjxnPjxnPjxwYXRoIGQ9XCJNMTUuNSwxMC4xTDE1LjUsMTAuMWMwLjEsMCwwLjMsMC4xLDAuMywwLjN2MS43YzAsMC4xLDAsMC4xLTAuMSwwLjJjLTAuMSwwLjEtMC4xLDAuMS0wLjIsMC4xbC0xNS4yLDAgYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsMTIuMiwwLDEyLjIsMCwxMi4xbDAtMS43YzAtMC4xLDAtMC4xLDAuMS0wLjJjMC4xLTAuMSwwLjEtMC4xLDAuMi0wLjFDMC4zLDEwLjEsMTUuNSwxMC4xLDE1LjUsMTAuMXogTTkuOCw2LjdjMC4xLDAsMC4xLDAsMC4yLDAuMUMxMC4xLDYuOSwxMC4xLDcsMTAuMSw3djEuN2MwLDAuMSwwLDAuMi0wLjEsMC4yQzEwLDksOS45LDksOS44LDlMMC4zLDlDMC4yLDksMC4xLDksMC4xLDguOSBDMCw4LjksMCw4LjgsMCw4LjdWN0MwLDcsMCw2LjksMC4xLDYuOGMwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMUMwLjMsNi43LDkuOCw2LjcsOS44LDYuN3ogTTAuMywzLjRoOS42aDBjMC4xLDAsMC4zLDAuMSwwLjMsMC4zIHYxLjd2MGMwLDAuMS0wLjEsMC4zLTAuMywwLjNIMC4zYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsNS41LDAsNS40LDAsNS4zVjMuNmMwLTAuMSwwLTAuMSwwLjEtMC4yQzAuMSwzLjQsMC4yLDMuNCwwLjMsMy40IEwwLjMsMy40eiBNMC4zLDBsMTUuMiwwYzAuMSwwLDAuMSwwLDAuMiwwLjFjMC4xLDAuMSwwLjEsMC4xLDAuMSwwLjJWMmMwLDAuMSwwLDAuMi0wLjEsMC4yYy0wLjEsMC4xLTAuMSwwLjEtMC4yLDAuMUgwLjMgYy0wLjEsMC0wLjEsMC0wLjItMC4xQzAsMi4xLDAsMiwwLDJsMC0xLjdjMC0wLjEsMC0wLjEsMC4xLTAuMkMwLjEsMCwwLjIsMCwwLjMsMHpcIi8+PC9nPjxwYXRoIGQ9XCJNMTUuNSwzLjRjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLjEsMC4xLDAuMSwwLjEsMC4xLDAuMnY1LjFjMCwwLjEsMCwwLjEtMC4xLDAuMkMxNS42LDksMTUuNSw5LDE1LjUsOSBjLTAuMSwwLTAuMSwwLTAuMi0wLjFsLTIuNS0yLjVjLTAuMS0wLjEtMC4xLTAuMywwLTAuNGwyLjUtMi41QzE1LjMsMy40LDE1LjQsMy40LDE1LjUsMy40elwiLz48L2c+PC9zdmc+JyxcbiAgICAgIGxpc3RfYnVsbGV0czogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNyAxMi40XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj48Zz48cGF0aCBkPVwiTTEyLjQsMTAuN2MwLDAuOSwwLjgsMS43LDEuNywxLjdjMC45LDAsMS43LTAuOCwxLjctMS43QzE1LjcsOS44LDE1LDksMTQuMSw5Yy0wLjQsMC0wLjksMC4yLTEuMiwwLjUgQzEyLjUsOS44LDEyLjQsMTAuMiwxMi40LDEwLjdDMTIuNCwxMC43LDEyLjQsMTAuNywxMi40LDEwLjd6IE0xMi40LDYuMmMwLDAuOSwwLjgsMS43LDEuNywxLjdjMC40LDAsMC45LTAuMiwxLjItMC41IGMwLjMtMC4zLDAuNC0wLjcsMC40LTEuMWMwLTAuOS0wLjctMS43LTEuNi0xLjdDMTMuMSw0LjYsMTIuNCw1LjMsMTIuNCw2LjJDMTIuNCw2LjIsMTIuNCw2LjIsMTIuNCw2LjJ6IE0wLDkuOHYxLjcgYzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFsMTAuNywwYzAsMCwwLDAsMCwwYzAuMSwwLDAuMy0wLjEsMC4zLTAuM1Y5LjhjMC0wLjEsMC0wLjEtMC4xLTAuMiBDMTEuMSw5LjYsMTEsOS42LDExLDkuNmwtMTAuNywwYy0wLjEsMC0wLjEsMC0wLjIsMC4xQzAsOS43LDAsOS44LDAsOS44TDAsOS44eiBNMTIuOSwyLjljMC4zLDAuMywwLjcsMC41LDEuMiwwLjUgYzAuNCwwLDAuOS0wLjIsMS4yLTAuNWMwLjctMC43LDAuNy0xLjcsMC0yLjRDMTQuOSwwLjIsMTQuNSwwLDE0LjEsMGMtMC40LDAtMC45LDAuMi0xLjIsMC41Yy0wLjMsMC4zLTAuNSwwLjctMC41LDEuMiBDMTIuNCwyLjEsMTIuNSwyLjYsMTIuOSwyLjl6IE0wLDUuM1Y3YzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFIMTFjMC4xLDAsMC4xLDAsMC4yLTAuMSBjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWNS4zYzAsMCwwLDAsMCwwYzAtMC4xLTAuMS0wLjMtMC4zLTAuM0gwLjNjLTAuMSwwLTAuMSwwLTAuMiwwLjFDMCw1LjIsMCw1LjMsMCw1LjNMMCw1LjN6IE0wLDAuOHYxLjcgYzAsMC4xLDAsMC4xLDAuMSwwLjJjMC4xLDAuMSwwLjEsMC4xLDAuMiwwLjFoMTAuN2MwLjEsMCwwLjEsMCwwLjItMC4xYzAsMCwwLjEtMC4xLDAuMS0wLjJWMC44YzAtMC4xLDAtMC4xLTAuMS0wLjIgYzAtMC4xLTAuMS0wLjEtMC4yLTAuMUgwLjNjLTAuMSwwLTAuMSwwLTAuMiwwLjFDMCwwLjcsMCwwLjgsMCwwLjhMMCwwLjh6XCIvPjwvZz48L3N2Zz4nLFxuICAgICAgbGlzdF9udW1iZXI6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTUuN1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0wLDExLjVsMCwxLjdjMCwwLjEsMCwwLjEsMC4xLDAuMmMwLjEsMC4xLDAuMSwwLjEsMC4yLDAuMUgxMWMwLjEsMCwwLjIsMCwwLjItMC4xYzAuMS0wLjEsMC4xLTAuMSwwLjEtMC4ydi0xLjcgYzAtMC4xLDAtMC4xLTAuMS0wLjJjLTAuMS0wLjEtMC4xLTAuMS0wLjItMC4xSDAuM2MtMC4xLDAtMC4yLDAtMC4yLDAuMUMwLDExLjQsMCwxMS40LDAsMTEuNUwwLDExLjV6IE0wLDguN2MwLDAuMSwwLDAuMSwwLjEsMC4yIEMwLjEsOC45LDAuMiw5LDAuMyw5SDExYzAuMSwwLDAuMiwwLDAuMi0wLjFjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWN2MwLTAuMSwwLTAuMS0wLjEtMC4yYy0wLjEtMC4xLTAuMS0wLjEtMC4yLTAuMWwtMTAuNywwIGMtMC4xLDAtMC4yLDAtMC4yLDAuMUMwLDYuOCwwLDYuOSwwLDdDMCw3LDAsOC43LDAsOC43eiBNMCwyLjV2MS43YzAsMC4xLDAsMC4xLDAuMSwwLjJjMCwwLDAuMSwwLjEsMC4yLDAuMWwxMC43LDAgYzAuMSwwLDAuMiwwLDAuMi0wLjFjMC4xLTAuMSwwLjEtMC4xLDAuMS0wLjJWMi40YzAtMC4xLDAtMC4xLTAuMS0wLjJjLTAuMSwwLTAuMSwwLTAuMiwwSDAuM2MtMC4xLDAtMC4xLDAtMC4yLDAgQzAsMi4zLDAsMi40LDAsMi41TDAsMi41elwiLz48L2c+PHBhdGggZD1cIk0xNS42LDE0LjJjMC0wLjMtMC4xLTAuNi0wLjMtMC44Yy0wLjItMC4yLTAuNC0wLjQtMC43LTAuNGwwLjktMXYtMC44aC0yLjl2MS4zaDAuOXYtMC41aDAuOWwwLDBjLTAuMSwwLjEtMC4yLDAuMi0wLjMsMC4zIHMtMC4yLDAuMy0wLjQsMC41bC0wLjMsMC4zbDAuMiwwLjVjMC42LDAsMC45LDAuMSwwLjksMC41YzAsMC4xLTAuMSwwLjMtMC4yLDAuNGMtMC4xLDAuMS0wLjMsMC4xLTAuNCwwLjFjLTAuMywwLTAuNy0wLjEtMC45LTAuMyBsLTAuNSwwLjhjMC40LDAuNCwwLjksMC42LDEuNSwwLjZjMC40LDAsMC45LTAuMSwxLjItMC40QzE1LjUsMTUuMSwxNS42LDE0LjcsMTUuNiwxNC4yelwiLz48cGF0aCBkPVwiTTE1LjYsOC43aC0wLjl2MC41aC0xLjFjMC0wLjIsMC4yLTAuNCwwLjQtMC41YzAuMi0wLjIsMC40LTAuMywwLjctMC40YzAuMy0wLjIsMC41LTAuMywwLjctMC42YzAuMi0wLjIsMC4zLTAuNSwwLjMtMC44IGMwLTAuNC0wLjItMC44LTAuNS0xYy0wLjYtMC40LTEuNC0wLjUtMi0wLjFjLTAuMywwLjItMC41LDAuNC0wLjYsMC43TDEzLjMsN2MwLjEtMC4zLDAuNC0wLjUsMC43LTAuNWMwLjEsMCwwLjMsMCwwLjMsMC4xIGMwLjEsMC4xLDAuMSwwLjIsMC4xLDAuM2MwLDAuMi0wLjEsMC4zLTAuMiwwLjRjLTAuMiwwLjEtMC4zLDAuMy0wLjUsMC40Yy0wLjIsMC4xLTAuNCwwLjMtMC42LDAuNGMtMC4yLDAuMi0wLjQsMC40LTAuNSwwLjYgYy0wLjEsMC4yLTAuMiwwLjUtMC4yLDAuOGMwLDAuMiwwLDAuMywwLDAuNWgzLjJMMTUuNiw4LjdMMTUuNiw4Ljd6XCIvPjxwYXRoIGQ9XCJNMTUuNiwzLjZoLTFWMGgtMC45bC0xLjIsMS4xbDAuNiwwLjdjMC4yLTAuMSwwLjMtMC4zLDAuNC0wLjVsMCwwdjIuMmgtMC45djAuOWgzTDE1LjYsMy42TDE1LjYsMy42elwiLz48L3N2Zz4nLFxuICAgICAgbGluazogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNyAxNS43XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj48Zz48cGF0aCBkPVwiTTcuNCw5LjlsMy4xLDMuMWMwLjMsMC4zLDAuOCwwLjUsMS4zLDAuNWMwLjUsMCwwLjktMC4yLDEuMy0wLjVjMCwwLDAsMCwwLDBjMC43LTAuNywwLjctMS45LDAtMi42TDkuOSw3LjMgYzAtMC4xLDAtMC4yLDAtMC4zQzkuOSw3LDEwLDcsMTAuMSw3bDIuMi0wLjJjMC4xLDAsMC4xLDAsMC4yLDAuMWwyLjEsMi4xYzAuNCwwLjQsMC43LDAuOCwwLjksMS4zYzAuMiwwLjUsMC4zLDEsMC4zLDEuNSBjMCwwLjUtMC4xLDEtMC4zLDEuNWMtMC44LDItMy4yLDMtNS4yLDIuMmMtMC41LTAuMi0wLjktMC41LTEuMy0wLjlsLTIuMS0yLjFjLTAuMSwwLTAuMS0wLjEtMC4xLTAuMkw3LDEwLjFDNywxMCw3LDkuOSw3LjEsOS45IEM3LjIsOS44LDcuMyw5LjksNy40LDkuOXogTTEuMiwxLjFDMS42LDAuNywyLDAuNCwyLjUsMC4zYzEtMC40LDIuMS0wLjQsMy4xLDBDNiwwLjQsNi41LDAuNyw2LjgsMS4xTDksMy4yQzksMy4zLDkuMSwzLjMsOSwzLjQgTDguOCw1LjZjMCwwLjEtMC4xLDAuMi0wLjIsMC4yYy0wLjEsMC4xLTAuMiwwLjEtMC4zLDBMNS4zLDIuN0M1LDIuMyw0LjUsMi4xLDQsMi4xYy0wLjUsMC0wLjksMC4yLTEuMywwLjVjMCwwLDAsMCwwLDAgQzIsMy40LDIsNC41LDIuNyw1LjJsMy4xLDMuMmMwLjEsMC4xLDAuMSwwLjIsMCwwLjNjMCwwLjEtMC4xLDAuMS0wLjIsMC4xTDMuNSw5QzMuNCw5LDMuNCw5LDMuMyw4LjlMMS4yLDYuOGMwLDAsMCwwLDAsMCBDLTAuNCw1LjItMC40LDIuNywxLjIsMS4xTDEuMiwxLjF6IE0xNC4zLDZoLTIuNmMwLDAsMCwwLDAsMGMtMC4xLDAtMC4yLTAuMS0wLjItMC4yYzAtMC4xLDAtMC4yLDAuMS0wLjNsMi41LTAuNyBjMC4xLDAsMC4xLDAsMC4yLDBjMC4xLDAsMC4xLDAuMSwwLjEsMC4ybDAuMSwwLjhjMCwwLjEsMCwwLjEtMC4xLDAuMkMxNC41LDYsMTQuNCw2LDE0LjMsNkwxNC4zLDZ6IE0xMC4yLDQuMSBjMCwwLjEtMC4xLDAuMi0wLjIsMC4ybDAsMGMwLDAsMCwwLDAsMEM5LjgsNC4yLDkuNyw0LjEsOS44LDRMOS43LDEuNGMwLTAuMSwwLTAuMSwwLjEtMC4yYzAuMSwwLDAuMSwwLDAuMiwwaDAuOCBjMC4xLDAsMC4xLDAsMC4yLDAuMWMwLDAuMSwwLDAuMSwwLDAuMkwxMC4yLDQuMUwxMC4yLDQuMXogTTEuNSw5LjdoMS4zaDEuM2MwLjEsMCwwLjIsMC4xLDAuMiwwLjJjMCwwLjEsMCwwLjItMC4xLDAuM2wtMi41LDAuNiBIMS42YzAsMC0wLjEsMC0wLjEsMGMtMC4xLDAtMC4xLTAuMS0wLjEtMC4yTDEuMiw5LjljMC0wLjEsMC0wLjEsMC4xLTAuMmMwLTAuMSwwLjEtMC4xLDAuMi0wLjFMMS41LDkuN3ogTTUuNiwxMS42IEM1LjYsMTEuNiw1LjYsMTEuNiw1LjYsMTEuNmMwLTAuMSwwLjEtMC4yLDAuMy0wLjFjMCwwLDAsMCwwLDBjMC4xLDAsMC4yLDAuMSwwLjIsMC4ydjIuNmMwLDAuMSwwLDAuMS0wLjEsMC4yIGMwLDAtMC4xLDAuMS0wLjIsMC4xTDUsMTQuNWMtMC4xLDAtMC4xLDAtMC4yLTAuMWMwLTAuMSwwLTAuMSwwLTAuMkw1LjYsMTEuNkw1LjYsMTEuNnpcIi8+PC9nPjwvc3ZnPicsXG4gICAgICB1bmxpbms6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjcgMTUuN1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGc+PHBhdGggZD1cIk0xNC42LDE0LjZjMS42LTEuNiwxLjYtNC4xLDAtNS43bDAsMGwtMy4xLTMuMWwtMS4yLDEuNmwyLjksMi45YzAuNCwwLjQsMC42LDAuOSwwLjYsMS41YzAsMS4xLTAuOSwyLjEtMi4xLDIuMWwwLDAgYy0wLjYsMC0xLjEtMC4yLTEuNS0wLjZsLTAuNC0wLjRsLTEuNywxbDAuOCwwLjhDMTAuNCwxNi4yLDEzLDE2LjIsMTQuNiwxNC42TDE0LjYsMTQuNkwxNC42LDE0LjZ6IE0zLjYsNkMzLDUuOSwyLjYsNS41LDIuMyw1IFMxLjksNCwyLjEsMy40QzIuMywyLjksMi42LDIuNSwzLDIuMkMzLjUsMiw0LjEsMS45LDQuNiwybDMuMywxLjRsMC41LTJMNS4xLDAuMUM0LTAuMSwyLjksMCwyLDAuNUMxLjEsMS4xLDAuNCwxLjksMC4yLDMgQy0wLjEsNCwwLDUuMSwwLjYsNkMxLjEsNi45LDEuOSw3LjYsMyw3LjhsNS40LDJsMC41LTJMNi4yLDYuOUwzLjYsNnpcIi8+PC9nPjwvc3ZnPidcbiAgIH0sXG4gICAvLyBjb21tb24sIGx0ciBpY29uXG4gICByZWRvOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS41OSAxNC4xOFwiPjxnPjxwYXRoIGQ9XCJNMTEuNTgsMTguNDhhNi44NCw2Ljg0LDAsMSwxLDYuODUtNi44NXMwLC4yNiwwLC42N2E4LDgsMCwwLDEtLjIyLDEuNDRsLjkxLS41NWEuNTEuNTEsMCwwLDEsLjM2LDAsLjQ1LjQ1LDAsMCwxLC4yOS4yMi40Ny40NywwLDAsMSwuMDYuMzYuNDUuNDUsMCwwLDEtLjIyLjI5TDE3LjQyLDE1LjNsLS4xMiwwaC0uMjVsLS4xMi0uMDYtLjA5LS4wOS0uMDYtLjA3LDAtLjA2LS44Ny0yLjEyYS40My40MywwLDAsMSwwLS4zNy40OS40OSwwLDAsMSwuMjctLjI2LjQxLjQxLDAsMCwxLC4zNiwwLC41My41MywwLDAsMSwuMjcuMjZsLjQ0LDEuMDlhNi41MSw2LjUxLDAsMCwwLC4yNC0xLjM2LDQuNTgsNC41OCwwLDAsMCwwLS42NCw1LjgzLDUuODMsMCwwLDAtMS43My00LjE3LDUuODgsNS44OCwwLDAsMC04LjM0LDAsNS45LDUuOSwwLDAsMCw0LjE3LDEwLjA2LjUxLjUxLDAsMCwxLC4zMy4xNS40OC40OCwwLDAsMSwwLC42OC41My41MywwLDAsMS0uMzMuMTJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ4IC00LjU0KVwiLz48L2c+PC9zdmc+JyxcbiAgIHVuZG86ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjU5IDE0LjE4XCI+PGc+PHBhdGggZD1cIk01LDE0YS40My40MywwLDAsMS0uMjItLjI5LjQ2LjQ2LDAsMCwxLC4wNi0uMzYuNDMuNDMsMCwwLDEsLjI5LS4yMi41Ni41NiwwLDAsMSwuMzYsMGwuOTEuNTVhOC4yNyw4LjI3LDAsMCwxLS4yMi0xLjQ1LDUuMDcsNS4wNywwLDAsMSwwLS42N0E2Ljg1LDYuODUsMCwxLDEsMTMsMTguNDdhLjQ0LjQ0LDAsMCwxLS4zMy0uMTMuNDguNDgsMCwwLDEsMC0uNjguNTEuNTEsMCwwLDEsLjMzLS4xNUE1Ljg5LDUuODksMCwwLDAsMTcuMTUsNy40NWE1Ljg4LDUuODgsMCwwLDAtOC4zMywwLDUuODQsNS44NCwwLDAsMC0xLjczLDQuMTdzMCwuMjUsMCwuNjVhNi40OSw2LjQ5LDAsMCwwLC4yNCwxLjM3bC40NC0xLjA5YS41Ny41NywwLDAsMSwuMjctLjI2LjQxLjQxLDAsMCwxLC4zNiwwLC41My41MywwLDAsMSwuMjcuMjYuNDMuNDMsMCwwLDEsMCwuMzdMNy44MiwxNWwwLC4wOS0uMDkuMDktLjEuMDctLjA2LDBINy4yOGwtLjEzLDAtMS4wOS0uNjNjLS42NS0uMzYtMS0uNTctMS4xLS42M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDkgLTQuNTMpXCIvPjwvZz48L3N2Zz4nLFxuICAgYm9sZDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTEuNzYgMTUuNzVcIj48Zz48cGF0aCBkPVwiTTYuNCwzLjc2VjE5LjVoNi43NmE1LjU1LDUuNTUsMCwwLDAsMi0uMzIsNC45Myw0LjkzLDAsMCwwLDEuNTItMSw0LjI3LDQuMjcsMCwwLDAsMS40OC0zLjM0LDMuODcsMy44NywwLDAsMC0uNjktMi4zNyw1Ljc0LDUuNzQsMCwwLDAtLjcxLS44MywzLjQ0LDMuNDQsMCwwLDAtMS4xLS42NSwzLjYsMy42LDAsMCwwLDEuNTgtMS4zNiwzLjY2LDMuNjYsMCwwLDAsLjUzLTEuOTMsMy43LDMuNywwLDAsMC0xLjIxLTIuODcsNC42NSw0LjY1LDAsMCwwLTMuMjUtMS4xSDYuNFptMi40Niw2LjY1VjUuNTdoMy41MmE0LjkxLDQuOTEsMCwwLDEsMS4zNi4xNSwyLjMsMi4zLDAsMCwxLC44NS40NSwyLjA2LDIuMDYsMCwwLDEsLjc0LDEuNzEsMi4zLDIuMywwLDAsMS0uNzgsMS45MiwyLjU0LDIuNTQsMCwwLDEtLjg2LjQ2LDQuNyw0LjcsMCwwLDEtMS4zMi4xNUg4Ljg2Wm0wLDcuMjdWMTIuMTVIMTIuN2E0LjU2LDQuNTYsMCwwLDEsMS4zOC4xNywzLjQzLDMuNDMsMCwwLDEsLjk1LjQ5LDIuMjksMi4yOSwwLDAsMSwuOTIsMiwyLjczLDIuNzMsMCwwLDEtLjgzLDIuMSwyLjY2LDIuNjYsMCwwLDEtLjgzLjU4LDMuMjUsMy4yNSwwLDAsMS0xLjI2LjJIOC44NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTYuNCAtMy43NSlcIi8+PC9nPjwvc3ZnPicsXG4gICB1bmRlcmxpbmU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDkuNzggMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE0LjY0LDMuNzZoMi41MnY3LjcyYTQuNTEsNC41MSwwLDAsMS0uNTksMi4zMSwzLjc2LDMuNzYsMCwwLDEtMS43MSwxLjUzLDYuMTIsNi4xMiwwLDAsMS0yLjY0LjUzLDUsNSwwLDAsMS0zLjU3LTEuMTgsNC4xNyw0LjE3LDAsMCwxLTEuMjctMy4yNFYzLjc2SDkuOXY3LjNhMywzLDAsMCwwLC41NSwyLDIuMywyLjMsMCwwLDAsMS44My42NSwyLjI2LDIuMjYsMCwwLDAsMS44LS42NSwzLjA5LDMuMDksMCwwLDAsLjU1LTJWMy43NlptMi41MiwxMy4zMVYxOS41SDcuMzlWMTcuMDhoOS43N1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTcuMzggLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgaXRhbGljOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxMC40OSAxNS43NlwiPjxnPjxwYXRoIGQ9XCJNMTcuMTYsMy43OWwuMzcsMC0uMDYuMzgtLjE0LjUyQTEwLDEwLDAsMCwxLDE2LjIxLDVhOS4zNyw5LjM3LDAsMCwwLTEsLjMyLDYuNjgsNi42OCwwLDAsMC0uMjUuODljLS4wNi4zMS0uMTEuNTktLjE0Ljg1LS4zLDEuMzYtLjUyLDIuNDEtLjY4LDMuMTRsLS42MSwzLjE4TDEzLjEsMTVsLS40MywyLjQtLjEyLjQ2YS42Mi42MiwwLDAsMCwwLC4yOGMuNDQuMS44NS4xNywxLjIzLjIybC42OC4xMWE0LjUxLDQuNTEsMCwwLDEtLjA4LjZsLS4wOS40MmEuOTIuOTIsMCwwLDAtLjIzLDBsLS40MywwYTEuMzcsMS4zNywwLDAsMS0uMjksMGMtLjEzLDAtLjYzLS4wOC0xLjQ5LS4xNmwtMiwwYy0uMjgsMC0uODcsMC0xLjc4LjEyTDcsMTkuNWwuMTctLjg4LjgtLjJBNi42MSw2LjYxLDAsMCwwLDkuMTksMTgsMi42MiwyLjYyLDAsMCwwLDkuNjEsMTdsLjI4LTEuNDEuNTgtMi43NS4xMi0uNjZjLjA1LS4zLjExLS41OC4xNy0uODZzLjEyLS41MS4xNy0uNjlsLjEyLS40OC4xMi0uNDMuMzEtMS42LjE1LS42NS4zMS0xLjkxVjUuMTRhMy44NiwzLjg2LDAsMCwwLTEuNDgtLjI5bC0uMzgsMCwuMi0xLjA2LDMuMjQuMTQuNzUsMGMuNDUsMCwxLjE4LDAsMi4xOC0uMDkuMjMsMCwuNDYsMCwuNzEsMFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTcuMDQgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgc3RyaWtlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNC45XCI+PGc+PHBhdGggZD1cIk0xMi45NCwxM2E0LjI3LDQuMjcsMCwwLDEsMS4zMi41OCwxLjQ2LDEuNDYsMCwwLDEsLjU1LDEuMiwxLjg3LDEuODcsMCwwLDEtLjg4LDEuNjQsNC4xNyw0LjE3LDAsMCwxLTIuMzUuNTksNC40NCw0LjQ0LDAsMCwxLTIuNzQtLjcxLDIuNzIsMi43MiwwLDAsMS0xLTIuMTdINS41N2E0LjU2LDQuNTYsMCwwLDAsMS41NSwzLjcsNyw3LDAsMCwwLDQuNDcsMS4yMyw2LDYsMCwwLDAsNC4wNy0xLjMsNC4yNCw0LjI0LDAsMCwwLDEuNTItMy4zNyw0LDQsMCwwLDAtLjI2LTEuNGgtNFpNNi4zNywxMC4yNEEzLjI3LDMuMjcsMCwwLDEsNiw4LjY4YTQsNCwwLDAsMSwxLjQ4LTMuMyw1LjkyLDUuOTIsMCwwLDEsMy44OC0xLjIxLDUuNTgsNS41OCwwLDAsMSwzLjkxLDEuMjQsNC4zNiw0LjM2LDAsMCwxLDEuNDUsMy4xN0gxNC40NGEyLjEyLDIuMTIsMCwwLDAtLjkxLTEuODEsNC40NSw0LjQ1LDAsMCwwLTIuNDQtLjU1LDMuNjksMy42OSwwLDAsMC0yLC41MUExLjY0LDEuNjQsMCwwLDAsOC4zLDguMjJhMS4zLDEuMywwLDAsMCwuNDgsMS4xMSw3LDcsMCwwLDAsMi4xLjc4bC4yOC4wNi4yOC4wOEg2LjM3Wm0xMy4wOS42OGEuNzMuNzMsMCwwLDEsLjQ5LjIxLjY2LjY2LDAsMCwxLC4yLjQ4LjY0LjY0LDAsMCwxLS4yLjQ4LjcxLjcxLDAsMCwxLS40OS4xOUg1LjFhLjY3LjY3LDAsMCwxLS40OS0uMTkuNjYuNjYsMCwwLDEtLjItLjQ4LjY0LjY0LDAsMCwxLC4yLS40OC43My43MywwLDAsMSwuNDktLjIxSDE5LjQ2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4xNylcIi8+PC9nPjwvc3ZnPicsXG4gICBzdWJzY3JpcHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDE0LjYxXCI+PGc+PHBhdGggZD1cIk0xNS4zOCw0LjMzSDEyLjc0TDExLjE5LDdjLS4yOC40Ni0uNTEuODctLjY5LDEuMjFMMTAuMDcsOWgwbC0uNDQtLjhjLS4yMi0uNC0uNDUtLjgxLS43MS0xLjIzTDcuMzQsNC4zM0g0LjY4TDguMjYsMTAsNC40LDE2LjA4SDcuMWwxLjY5LTIuODNjLjM4LS42My43Mi0xLjIyLDEtMS43OGwuMjUtLjQ2aDBsLjQ5LjkyYy4yNC40NS40OC44OS43NCwxLjMyTDEzLDE2LjA4aDIuNjFMMTEuODQsMTBsMS43Ny0yLjg0LDEuNzctMi44NVptNC43NywxMy43NUgxN3YtLjE1YzAtLjQuMDUtLjY0LjE2LS43MmE0LjQyLDQuNDIsMCwwLDEsMS4xNi0uMzEsMy4zLDMuMywwLDAsMCwxLjU0LS41NkExLjg0LDEuODQsMCwwLDAsMjAuMTUsMTVhMS43OCwxLjc4LDAsMCwwLS40NC0xLjQxQTIuOCwyLjgsMCwwLDAsMTgsMTMuMjVhMi43MSwyLjcxLDAsMCwwLTEuNjkuMzcsMS44MywxLjgzLDAsMCwwLS40NCwxLjQzdi4yM0gxN3YtLjIzcTAtLjYzLjE4LS43OGExLjYyLDEuNjIsMCwwLDEsLjg4LS4xNSwxLjU5LDEuNTksMCwwLDEsLjg4LjE1cS4xOC4xNS4xOC43NXQtLjE4Ljc1YTMuNTgsMy41OCwwLDAsMS0xLjE4LjMzLDMuMzMsMy4zMywwLDAsMC0xLjUyLjUxLDEuNTcsMS41NywwLDAsMC0uMzIsMS4xOHYxLjE1aDQuMjd2LS44NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtNC4zMylcIi8+PC9nPjwvc3ZnPicsXG4gICBzdXBlcnNjcmlwdDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzUgMTUuNDJcIj48Zz48cGF0aCBkPVwiTTEyLDEzLjE0bDMuNjEtNS44MUgxMi45NEwxMS4zMywxMGMtLjI4LjQ2LS41MS44OC0uNjksMS4yNWwtLjQ1LjgzaDBsLS40NS0uODVjLS4yMi0uNDEtLjQ1LS44Mi0uNzEtMS4yNEw3LjQsNy4zM0g0LjY4bDMuNjYsNS44MUw0LjQsMTkuMzNINy4xNGwxLjc0LTIuODdxLjU4LTEsMS0xLjgzbC4yNS0uNDhoMGwuNTEuOTQuNzUsMS4zNywxLjcyLDIuODdoMi42N2wtMS45Mi0zLjA5Yy0xLjEyLTEuOC0xLjc2LTIuODMtMS45Mi0zLjFabTQuODQtNC40MWgwbDAsLjE1aDMuMjd2Ljg2SDE1Ljc3VjguNThhMS42NiwxLjY2LDAsMCwxLC4zMy0xLjIyLDMuNTEsMy41MSwwLDAsMSwxLjU2LS41MSwzLjY4LDMuNjgsMCwwLDAsMS4yMS0uMzRjLjEzLS4xLjE5LS4zNi4xOS0uNzdTMTksNS4wNywxOC44Nyw1QTEuNjMsMS42MywwLDAsMCwxOCw0LjhhMS41OCwxLjU4LDAsMCwwLS45MS4xN2MtLjEzLjExLS4xOS4zOC0uMTkuOFY2SDE1Ljc4VjUuNzZhMS44NywxLjg3LDAsMCwxLC40NS0xLjQ3QTIuODQsMi44NCwwLDAsMSwxOCwzLjkxYTIuOCwyLjgsMCwwLDEsMS43Mi4zOCwxLjg0LDEuODQsMCwwLDEsLjQ1LDEuNDQsMS45MSwxLjkxLDAsMCwxLS4zNCwxLjM1LDMuMjQsMy4yNCwwLDAsMS0xLjU4LjU3QTMuNjksMy42OSwwLDAsMCwxNyw4Yy0uMTIuMS0uMTcuMzUtLjE3Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC0zLjkxKVwiLz48L2c+PC9zdmc+JyxcbiAgIGVyYXNlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43NlwiPjxnPjxwYXRoIGQ9XCJNMTMuNjksMTcuMmg2LjQ2djEuMzFIOC41Nkw0LjQxLDE0LjM3LDE0LDQuNzVsNi4wNiw2LjA2TDE2Ljg5LDE0bC0zLjIsMy4xOVptLTQuNjEsMGgyLjc3TDE0LjA5LDE1LDkuODgsMTAuNzUsNi4yNSwxNC4zOGwxLjQxLDEuNDFjLjg0LjgyLDEuMzEsMS4yOSwxLjQyLDEuNDFaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00Ljc1KVwiLz48L2c+PC9zdmc+JyxcbiAgIGluZGVudDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTIuMzZcIj48Zz48cGF0aCBkPVwiTTE5Ljg3LDE1LjU3YS4yNy4yNywwLDAsMSwuMTkuMDguMjUuMjUsMCwwLDEsLjA4LjE5djEuNjlhLjI3LjI3LDAsMCwxLS4wOC4xOS4yNS4yNSwwLDAsMS0uMTkuMDhINC42OGEuMjcuMjcsMCwwLDEtLjE5LS4wOC4yNS4yNSwwLDAsMS0uMDgtLjE5VjE1Ljg0YS4yNy4yNywwLDAsMSwuMjctLjI3SDE5Ljg3Wk03LjUsMTQuNDVhLjI1LjI1LDAsMCwxLS4yLS4wOUw0Ljc2LDExLjg0YS4yOS4yOSwwLDAsMSwwLS40TDcuMyw4LjlhLjI5LjI5LDAsMCwxLC40LDAsLjMxLjMxLDAsMCwxLC4wNy4ydjUuMDZhLjMyLjMyLDAsMCwxLS4wOC4yMS4yNi4yNiwwLDAsMS0uMTkuMDhaTTE5Ljg3LDguODJhLjI3LjI3LDAsMCwxLC4xOS4wOC4yNS4yNSwwLDAsMSwuMDguMTl2MS42OWEuMjcuMjcsMCwwLDEtLjA4LjE5LjI1LjI1LDAsMCwxLS4xOS4wOEgxMC4zMWEuMjcuMjcsMCwwLDEtLjI3LS4yN1Y5LjFhLjI3LjI3LDAsMCwxLC4yNy0uMjdoOS41NlptMCwzLjM3YS4yNy4yNywwLDAsMSwuMTkuMDguMjguMjgsMCwwLDEsLjA4LjIxdjEuNjhhLjMyLjMyLDAsMCwxLS4wOC4yMS4yNS4yNSwwLDAsMS0uMTkuMDhIMTAuMzFhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWMTIuNDhhLjMyLjMyLDAsMCwxLC4wOC0uMjEuMjQuMjQsMCwwLDEsLjE5LS4wOGg5LjU2Wm0uMi02LjY2YS4yOC4yOCwwLDAsMSwuMDguMlY3LjQxYS4zMi4zMiwwLDAsMS0uMDguMjEuMjUuMjUsMCwwLDEtLjE5LjA4SDQuNjhhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWNS43M2EuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNS4yNSwwLDAsMSwuMTktLjA4SDE5Ljg3YS4yOC4yOCwwLDAsMSwuMi4wOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgb3V0ZGVudDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTIuMzZcIj48Zz48cGF0aCBkPVwiTTQuNjgsMTQuNDVhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWOS4xYS4yNy4yNywwLDAsMSwuMDgtLjE5LjI4LjI4LDAsMCwxLC4yLS4wOC4yNS4yNSwwLDAsMSwuMTkuMDdsMi41NCwyLjU0YS4yOS4yOSwwLDAsMSwwLC40TDQuODgsMTQuMzZhLjI0LjI0LDAsMCwxLS4yLjA5Wm0xNS4xOSwxLjEyYS4yNy4yNywwLDAsMSwuMTkuMDguMjUuMjUsMCwwLDEsLjA4LjE5djEuNjlhLjI3LjI3LDAsMCwxLS4wOC4xOS4yNS4yNSwwLDAsMS0uMTkuMDhINC42OGEuMjcuMjcsMCwwLDEtLjE5LS4wOC4yNS4yNSwwLDAsMS0uMDgtLjE5VjE1Ljg0YS4yNy4yNywwLDAsMSwuMjctLjI3SDE5Ljg3Wm0wLTMuMzhhLjI3LjI3LDAsMCwxLC4xOS4wOC4yOC4yOCwwLDAsMSwuMDguMjF2MS42OGEuMzIuMzIsMCwwLDEtLjA4LjIxLjI1LjI1LDAsMCwxLS4xOS4wOEgxMC4zMWEuMjcuMjcsMCwwLDEtLjE5LS4wOC4zLjMsMCwwLDEtLjA4LS4yMVYxMi40OGEuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNC4yNCwwLDAsMSwuMTktLjA4aDkuNTZabTAtMy4zN2EuMjcuMjcsMCwwLDEsLjE5LjA4LjI1LjI1LDAsMCwxLC4wOC4xOXYxLjY5YS4yNy4yNywwLDAsMS0uMDguMTkuMjUuMjUsMCwwLDEtLjE5LjA4SDEwLjMxYS4yNy4yNywwLDAsMS0uMjctLjI3VjkuMWEuMjcuMjcsMCwwLDEsLjI3LS4yN2g5LjU2Wm0uMi0zLjI5YS4yOC4yOCwwLDAsMSwuMDguMlY3LjQxYS4zMi4zMiwwLDAsMS0uMDguMjEuMjUuMjUsMCwwLDEtLjE5LjA4SDQuNjhhLjI3LjI3LDAsMCwxLS4xOS0uMDguMy4zLDAsMCwxLS4wOC0uMjFWNS43M2EuMzIuMzIsMCwwLDEsLjA4LS4yMS4yNS4yNSwwLDAsMSwuMTktLjA4SDE5Ljg3YS4yOC4yOCwwLDAsMSwuMi4wOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgZXhwYW5zaW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTEuOCwxMy4wNmwtNS4xLDUuMUg5LjUxVjE5LjVINC40MVYxNC40SDUuNzV2Mi44MUw4LjMsMTQuNjZxMi4yNS0yLjIzLDIuNTUtMi41NVptOC4zNS05LjN2NS4xSDE4LjgxVjYuMDVsLTUuMSw1LjEtMS0xLDUuMS01LjFIMTUuMDVWMy43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgcmVkdWN0aW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTQuOTEsMTBoMi44N3YxLjM4SDEyLjU1VjYuMTJoMS4zOFY5bDUuMjQtNS4yNC40OC40OS40OS40OFpNNi43NywxMS45MkgxMnY1LjIzSDEwLjYyVjE0LjI2TDUuMzcsMTkuNWwtMS0xTDkuNjMsMTMuM0g2Ljc3WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGNvZGVfdmlldzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzMgMTEuOFwiPjxnPjxwYXRoIGQ9XCJNOC4wOSw3Ljk0YS43Ni43NiwwLDAsMSwuNTMuMjIuNzIuNzIsMCwwLDEsLjIxLjUyLjc2Ljc2LDAsMCwxLS4yMi41NEw2LjE4LDExLjYzbDIuNDMsMi40NGEuNjkuNjksMCwwLDEsLjIuNTEuNjYuNjYsMCwwLDEtLjIxLjUxLjc1Ljc1LDAsMCwxLS41MS4yMi42My42MywwLDAsMS0uNTEtLjIxaDBMNC42MywxMi4xNWEuNy43LDAsMCwxLS4yMi0uNTMuNjcuNjcsMCwwLDEsLjI1LS41NUw3LjU3LDguMTZhLjgyLjgyLDAsMCwxLC41Mi0uMjJabTEyLjA1LDMuNjlhLjcuNywwLDAsMS0uMjMuNTJMMTcsMTUuMWgwYS42Ni42NiwwLDAsMS0uNTEuMjEuNzMuNzMsMCwwLDEtLjUxLS4yMi43NS43NSwwLDAsMS0uMjItLjUxLjYzLjYzLDAsMCwxLC4yMS0uNTFsMi40My0yLjQ0TDE1LjkyLDkuMjJhLjczLjczLDAsMCwxLS4yMi0uNTNBLjc0Ljc0LDAsMCwxLDE3LDguMThoMGwyLjkxLDIuOTFhLjY3LjY3LDAsMCwxLC4yNy41NFptLTUuOS01LjlhLjczLjczLDAsMCwxLC42MS4zMi43MS43MSwwLDAsMSwuMDcuNjhMMTEsMTdhMSwxLDAsMCwxLS4yMi4zMi42LjYsMCwwLDEtLjM1LjE2Ljc1Ljc1LDAsMCwxLS42OS0uMjYuNjkuNjksMCwwLDEtLjEyLS43MkwxMy41Niw2LjIzYS43NS43NSwwLDAsMSwuMjYtLjM1Ljc0Ljc0LDAsMCwxLC40Mi0uMTVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC01LjczKVwiLz48L2c+PC9zdmc+JyxcbiAgIHByZXZpZXc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY1IDE1LjY2XCI+PGc+PHBhdGggZD1cIk0xNi4xOSwxNC40M2wyLjQ5LDIuNDlhLjczLjczLDAsMCwxLC4yMS41Mi42Ny42NywwLDAsMS0uMjIuNTEuNy43LDAsMCwxLS41Mi4yMi42OS42OSwwLDAsMS0uNTEtLjIxbC0yLjQ5LTIuNDhhNS4xNyw1LjE3LDAsMCwxLTEuMzQuNjksNC42NCw0LjY0LDAsMCwxLTEuNDguMjQsNC43OCw0Ljc4LDAsMSwxLDAtOS41Niw0Ljc5LDQuNzksMCwwLDEsMS44NC4zNiw0LjksNC45LDAsMCwxLDEuNTYsMSw0Ljc3LDQuNzcsMCwwLDEsLjQ2LDYuMThaTTEwLDE0YTMuMywzLjMsMCwwLDAsMi4zNC45M0EzLjM3LDMuMzcsMCwwLDAsMTQuNywxNGEzLjMsMy4zLDAsMCwwLTEuMDgtNS40MSwzLjQ3LDMuNDcsMCwwLDAtMi41NiwwQTMsMywwLDAsMCwxMCw5LjI4LDMuMzEsMy4zMSwwLDAsMCwxMCwxNFpNMTYsNGEzLjg2LDMuODYsMCwwLDEsMi43NywxLjE0QTMuOSwzLjksMCwwLDEsMjAsNy44NXY0YS43Ny43NywwLDAsMS0uMjIuNTMuNy43LDAsMCwxLS41Mi4yMS43Mi43MiwwLDAsMS0uNzQtLjc0di00YTIuNDYsMi40NiwwLDAsMC0uNzItMS43M0EyLjM3LDIuMzcsMCwwLDAsMTYsNS40NUg4LjUzQTIuNDIsMi40MiwwLDAsMCw2LjA4LDcuODl2Ny41MmEyLjQxLDIuNDEsMCwwLDAsLjcxLDEuNzMsMi40NiwyLjQ2LDAsMCwwLDEuNzQuNzJoNC4wOGEuNzMuNzMsMCwwLDEsMCwxLjQ2SDguNTNhMy44NSwzLjg1LDAsMCwxLTIuNzgtMS4xNEEzLjkzLDMuOTMsMCwwLDEsNC42LDE1LjRWNy44N0EzLjk0LDMuOTQsMCwwLDEsNS43Niw1LjA5LDMuODgsMy44OCwwLDAsMSw4LjU0LDRIMTZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ1IC0zLjgpXCIvPjwvZz48L3N2Zz4nLFxuICAgcHJpbnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE2LjA1IDE2LjA0XCI+PGc+PHBhdGggZD1cIk0xOS43NiwxNS44NGExLjI5LDEuMjksMCwwLDAsLjM5LS45MlY4LjM1QTIuMDUsMi4wNSwwLDAsMCwxOS41Nyw3YTEuOTMsMS45MywwLDAsMC0xLjM4LS41N0g2LjM3YTEuOTUsMS45NSwwLDAsMC0yLDJ2Ni41NmExLjIzLDEuMjMsMCwwLDAsLjM4LjkyLDEuMzUsMS4zNSwwLDAsMCwuOTMuMzhoMlYxNC45bC0yLDBWOC4zNWEuNjcuNjcsMCwwLDEsLjE4LS40Ny42Mi42MiwwLDAsMSwuNDgtLjE5SDE4LjE4YS42LjYsMCwwLDEsLjQ2LjE5LjY2LjY2LDAsMCwxLC4xOC40N1YxNC45aC0ydjEuMzJoMkExLjM1LDEuMzUsMCwwLDAsMTkuNzYsMTUuODRaTTE3LjUyLDcuNjlWNS4wNmExLjMxLDEuMzEsMCwwLDAtLjM4LS45MiwxLjM0LDEuMzQsMCwwLDAtLjk0LS4zOEg4LjM0QTEuMywxLjMsMCwwLDAsNyw1LjA2VjcuNjlIOC4zNFY1LjA2aDcuODdWNy42OWgxLjMxWk04LjM0LDEyLjkzaDcuODdsMCw1LjI2SDguMzRWMTIuOTNabTcuODcsNS4yNnYwWm0uNjUsMS4zMWEuNi42LDAsMCwwLC40Ni0uMTkuNzIuNzIsMCwwLDAsLjItLjQ3VjEyLjI5YS43NC43NCwwLDAsMC0uMi0uNDcuNi42LDAsMCwwLS40Ni0uMTlINy42OGEuNi42LDAsMCwwLS40Ni4xOS43Mi43MiwwLDAsMC0uMi40N3Y2LjU1YS43NC43NCwwLDAsMCwuMi40Ny42LjYsMCwwLDAsLjQ2LjE5aDkuMThaTTE2LjY3LDkuMjhhLjcuNywwLDAsMC0uOTQsMCwuNjMuNjMsMCwwLDAtLjE4LjQ2LjY3LjY3LDAsMCwwLC4xOC40Ny42OC42OCwwLDAsMCwuOTQsMCwuNjYuNjYsMCwwLDAsLjE4LS40N0EuNTguNTgsMCwwLDAsMTYuNjcsOS4yOFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuMjUgLTMuNjEpXCIvPjwvZz48L3N2Zz4nLFxuICAgdGVtcGxhdGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE0LjI3IDE1LjY0XCI+PGc+PHBhdGggZD1cIk0xOC4xOCwxOS4xNmExLDEsMCwwLDAsMS0xVjUuNzNhMSwxLDAsMCwwLTEtMWgtMnYxaDJWMTguMTlINi4zN1Y1LjczaDJ2LTFoLTJBLjk0Ljk0LDAsMCwwLDUuNjgsNWExLDEsMCwwLDAtLjI5LjdWMTguMThhLjk0Ljk0LDAsMCwwLC4yOS42OSwxLDEsMCwwLDAsLjY5LjI5SDE4LjE4Wk05LjgyLDEwLjMxaDQuOTJhLjQ5LjQ5LDAsMCwwLC4zNS0uMTUuNDcuNDcsMCwwLDAsLjE1LS4zNS40OS40OSwwLDAsMC0uMTUtLjM1LjQ3LjQ3LDAsMCwwLS4zNS0uMTVIOS44MmEuNDkuNDksMCwwLDAtLjM1LjE1LjQ3LjQ3LDAsMCwwLS4xNS4zNS40OS40OSwwLDAsMCwuMTUuMzUuNDcuNDcsMCwwLDAsLjM1LjE1Wm01LjksNC45Mkg4LjgzYS40OS40OSwwLDAsMC0uMzUuMTUuNDcuNDcsMCwwLDAtLjE1LjM1LjQ5LjQ5LDAsMCwwLC4xNS4zNS40Ny40NywwLDAsMCwuMzUuMTVoNi44OWEuNDkuNDksMCwwLDAsLjM1LS4xNS40Ny40NywwLDAsMCwuMTUtLjM1LjUxLjUxLDAsMCwwLS41LS41Wk03LjM2LDEyLjc3YS40OS40OSwwLDAsMCwuMTUuMzUuNDcuNDcsMCwwLDAsLjM1LjE1aDguODVhLjQ5LjQ5LDAsMCwwLC4zNS0uMTUuNDcuNDcsMCwwLDAsLjE1LS4zNS40OS40OSwwLDAsMC0uMTUtLjM1LjQ3LjQ3LDAsMCwwLS4zNS0uMTVINy44NWEuNDkuNDksMCwwLDAtLjM1LjE1LjUyLjUyLDAsMCwwLS4xNC4zNVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMTQgLTMuNzcpXCIvPjxwYXRoIGQ9XCJNMTQuMjQsNi43MWExLDEsMCwwLDAsMS0xLDEsMSwwLDAsMC0xLTEsMSwxLDAsMCwwLTEtMWgtMmEuOTQuOTQsMCwwLDAtLjY5LjI4LDEsMSwwLDAsMC0uMjkuN0EuOTQuOTQsMCwwLDAsOS42Miw1YS45MS45MSwwLDAsMC0uMjkuNjksMSwxLDAsMCwwLC4yOS43LDEsMSwwLDAsMCwuNjkuMjloMy45M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMTQgLTMuNzcpXCIvPjwvZz48L3N2Zz4nLFxuICAgbGluZV9oZWlnaHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc2IDEzLjU2XCI+PGc+PHBhdGggZD1cIk00LjQsNC44OFY4LjI2YTIsMiwwLDAsMCwuNS4zOXMuMSwwLC4xOC0uMTJhLjYyLjYyLDAsMCwwLC4xNy0uMjhjLjA2LS4xOS4xMy0uNDQuMjEtLjc0cy4xNC0uNTIuMTktLjY2YS41OC41OCwwLDAsMSwuMjEtLjMsMi40MSwyLjQxLDAsMCwxLC42My0uMjEsMy44MywzLjgzLDAsMCwxLC44OC0uMTIsOS4xNSw5LjE1LDAsMCwxLDEuMzEuMDYuMTYuMTYsMCwwLDEsLjExLDAsLjI2LjI2LDAsMCwxLC4wNi4xNCw0LDQsMCwwLDEsMCwuNDl2MmwuMDUsMy43N2MwLDEuNDEsMCwyLjY4LS4wNSwzLjgxYTEuNzksMS43OSwwLDAsMS0uMTEuNDksMTAuNjgsMTAuNjgsMCwwLDEtMS40LjQ1LDEuMTIsMS4xMiwwLDAsMC0uNjkuNDN2LjMxbDAsLjIyLjYxLDBjLjg1LS4wOCwxLjU0LS4xMiwyLjA2LS4xMmExOS43NiwxOS43NiwwLDAsMSwyLjA5LjA4LDE1LjA4LDE1LjA4LDAsMCwwLDEuNjQuMDgsMS40LDEuNCwwLDAsMCwuMjksMCwxLjU4LDEuNTgsMCwwLDAsMC0uMjZsLS4wNS0uNDNhMi4yNiwyLjI2LDAsMCwwLS40My0uMTdsLS43Ny0uMjItLjE1LDBhMi41NSwyLjU1LDAsMCwxLS43OC0uMjgsMi41NiwyLjU2LDAsMCwxLS4xMS0uNzVsMC0xLjI5LDAtMy4xNVY3LjUzYTEwLjUxLDEwLjUxLDAsMCwxLC4wNi0xLjIsMy44MywzLjgzLDAsMCwxLC42LDBsMS44OCwwYTIuMTgsMi4xOCwwLDAsMSwuMzgsMCwuNDUuNDUsMCwwLDEsLjIzLjE3LjkuOSwwLDAsMSwuMDUuMjVjMCwuMTYuMDYuMzUuMS41OGEzLjMzLDMuMzMsMCwwLDAsLjE0LjU1QTYuMzksNi4zOSwwLDAsMCwxNSw5YTIuOTEsMi45MSwwLDAsMCwuNi0uMTUsMi43NywyLjc3LDAsMCwwLDAtLjQ2bDAtLjUxLDAtMi45NS0uMjUsMC0uMzgsMEwxNSw0Ljk0YS43MS43MSwwLDAsMS0uMTguMTUuNDUuNDUsMCwwLDEtLjI1LjA3bC0uMjksMEg4Ljc1bC0uMTUsMEg3LjQ1YTE3LDE3LDAsMCwxLTEuODYsMEw1LjM2LDVsLS4yNS0uMTNaTTE5Ljc1LDE2LjE0aC0uNjl2LTloLjY5QS40LjQsMCwwLDAsMjAuMTMsN2MuMDYtLjExLDAtLjI0LS4xLS4zOUwxOC45Miw1LjE1YS41Mi41MiwwLDAsMC0uODYsMEwxNyw2LjU4Yy0uMTIuMTUtLjE2LjI4LS4xLjM5cy4xOC4xNi4zOC4xNmguNjl2OWgtLjY5YS40LjQsMCwwLDAtLjM4LjE2Yy0uMDYuMTEsMCwuMjQuMS4zOWwxLjExLDEuNDNhLjUyLjUyLDAsMCwwLC44NiwwTDIwLDE2LjY5Yy4xMi0uMTUuMTYtLjI4LjEtLjM5YS40LjQsMCwwLDAtLjM4LS4xNlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtNC44NilcIi8+PC9nPjwvc3ZnPicsXG4gICBwYXJhZ3JhcGhfc3R5bGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDExLjgxIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOC4xOCwzLjc2djJoLTJWMTkuNWgtMlY1LjczaC0yVjE5LjVoLTJWMTEuNjNhMy45NCwzLjk0LDAsMCwxLDAtNy44N2g3Ljg3WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNi4zNyAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICB0ZXh0X3N0eWxlOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxMy43NiAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTcuNjgsNi43MWEyLjIyLDIuMjIsMCwwLDAsMS4wNi0uMjIuNzQuNzQsMCwwLDAsLjQyLS43LjczLjczLDAsMCwwLS4wOC0uMzMuNjcuNjcsMCwwLDAtLjE3LS4yMiwxLDEsMCwwLDAtLjMxLS4xNUwxOC4yNiw1bC0uNDUtLjA5QTE1LjI3LDE1LjI3LDAsMCwwLDEzLjI2LDVWNC43NGMwLS42Ni0uNjMtMS0xLjkyLTEtLjI0LDAtLjQzLjE1LS41OS40NmE0LDQsMCwwLDAtLjM2LDEuMTRoMHYwYTI2LjQ1LDI2LjQ1LDAsMCwxLTMuNS4zNUEyLDIsMCwwLDAsNS43Nyw2YS44NC44NCwwLDAsMC0uMzcuNzksMi4xNCwyLjE0LDAsMCwwLC40MSwxLjI5LDEuMjMsMS4yMywwLDAsMCwxLjA1LjYzLDE2LjYyLDE2LjYyLDAsMCwwLDMuMjktLjQ1bC0uMzQsMy4zNWMtLjE2LDEuNjEtLjI5LDIuOS0uMzcsMy44NnMtLjEyLDEuNjYtLjEyLDIuMDlsMCwuNjVhNS4xNSw1LjE1LDAsMCwwLC4wNS42LDEuMjgsMS4yOCwwLDAsMCwuMTYuNTQuMzQuMzQsMCwwLDAsLjI4LjE4LDEuMTYsMS4xNiwwLDAsMCwuNzktLjQ2LDMuNjYsMy42NiwwLDAsMCwuNjgtMSwyMi4wOCwyMi4wOCwwLDAsMCwxLTQuMzNxLjQ5LTMuMS43OC02LjE1YTI0LjY5LDI0LjY5LDAsMCwxLDQuNjItLjg0WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNS40IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHNhdmU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOC41MywxOS41bC4yLS4wNUExLjc4LDEuNzgsMCwwLDAsMjAuMTMsMThsMC0uMDlWNy4xNGEyLDIsMCwwLDAtLjI4LS42NEEzLjE4LDMuMTgsMCwwLDAsMTkuNDMsNmMtLjUtLjUyLTEtMS0xLjU1LTEuNTRBMi41OSwyLjU5LDAsMCwwLDE3LjM3LDRhMS44MywxLjgzLDAsMCwwLS42MS0uMjVINmwtLjIxLDBhMS43OCwxLjc4LDAsMCwwLTEuNCwxLjQ5bDAsLjFWMTcuODdhMi40OSwyLjQ5LDAsMCwwLC4wOS4zNywxLjc5LDEuNzksMCwwLDAsMS40NCwxLjIzbC4wOSwwWm0tNi4yNS0uNkg2LjkyYS42MS42MSwwLDAsMS0uNjgtLjQ4Ljc4Ljc4LDAsMCwxLDAtLjIyVjEyLjNhLjYyLjYyLDAsMCwxLC42OS0uNjhIMTcuNjRhLjYyLjYyLDAsMCwxLC42OS42OVYxOC4yYS42NC42NCwwLDAsMS0uNzEuNjlIMTIuMjhaTTEyLDkuODFIOC4xNWEuNjMuNjMsMCwwLDEtLjcyLS43MXYtNGEuNjQuNjQsMCwwLDEsLjcyLS43Mmg3LjY2YS42NC42NCwwLDAsMSwuNzIuNzJ2NGEuNjUuNjUsMCwwLDEtLjc0LjcyWk0xMy41LDVWOS4xOGgxLjc4VjVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGJsb2NrcXVvdGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ3NS4wODIgNDc1LjA4MVwiPjxnPjxwYXRoIGQ9XCJNMTY0LjQ1LDIxOS4yN2gtNjMuOTU0Yy03LjYxNCwwLTE0LjA4Ny0yLjY2NC0xOS40MTctNy45OTRjLTUuMzI3LTUuMzMtNy45OTQtMTEuODAxLTcuOTk0LTE5LjQxN3YtOS4xMzJjMC0yMC4xNzcsNy4xMzktMzcuNDAxLDIxLjQxNi01MS42NzhjMTQuMjc2LTE0LjI3MiwzMS41MDMtMjEuNDExLDUxLjY3OC0yMS40MTFoMTguMjcxYzQuOTQ4LDAsOS4yMjktMS44MDksMTIuODQ3LTUuNDI0YzMuNjE2LTMuNjE3LDUuNDI0LTcuODk4LDUuNDI0LTEyLjg0N1Y1NC44MTljMC00Ljk0OC0xLjgwOS05LjIzMy01LjQyNC0xMi44NWMtMy42MTctMy42MTItNy44OTgtNS40MjQtMTIuODQ3LTUuNDI0aC0xOC4yNzFjLTE5Ljc5NywwLTM4LjY4NCwzLjg1OC01Ni42NzMsMTEuNTYzYy0xNy45ODcsNy43MS0zMy41NDUsMTguMTMyLTQ2LjY4LDMxLjI2N2MtMTMuMTM0LDEzLjEyOS0yMy41NTMsMjguNjg4LTMxLjI2Miw0Ni42NzdDMy44NTUsMTQ0LjAzOSwwLDE2Mi45MzEsMCwxODIuNzI2djIwMC45OTFjMCwxNS4yMzUsNS4zMjcsMjguMTcxLDE1Ljk4NiwzOC44MzRjMTAuNjYsMTAuNjU3LDIzLjYwNiwxNS45ODUsMzguODMyLDE1Ljk4NWgxMDkuNjM5YzE1LjIyNSwwLDI4LjE2Ny01LjMyOCwzOC44MjgtMTUuOTg1YzEwLjY1Ny0xMC42NjMsMTUuOTg3LTIzLjU5OSwxNS45ODctMzguODM0VjI3NC4wODhjMC0xNS4yMzItNS4zMy0yOC4xNjgtMTUuOTk0LTM4LjgzMkMxOTIuNjIyLDIyNC42LDE3OS42NzUsMjE5LjI3LDE2NC40NSwyMTkuMjd6XCIvPjxwYXRoIGQ9XCJNNDU5LjEwMywyMzUuMjU2Yy0xMC42NTYtMTAuNjU2LTIzLjU5OS0xNS45ODYtMzguODI4LTE1Ljk4NmgtNjMuOTUzYy03LjYxLDAtMTQuMDg5LTIuNjY0LTE5LjQxLTcuOTk0Yy01LjMzMi01LjMzLTcuOTk0LTExLjgwMS03Ljk5NC0xOS40MTd2LTkuMTMyYzAtMjAuMTc3LDcuMTM5LTM3LjQwMSwyMS40MDktNTEuNjc4YzE0LjI3MS0xNC4yNzIsMzEuNDk3LTIxLjQxMSw1MS42ODItMjEuNDExaDE4LjI2N2M0Ljk0OSwwLDkuMjMzLTEuODA5LDEyLjg0OC01LjQyNGMzLjYxMy0zLjYxNyw1LjQyOC03Ljg5OCw1LjQyOC0xMi44NDdWNTQuODE5YzAtNC45NDgtMS44MTQtOS4yMzMtNS40MjgtMTIuODVjLTMuNjE0LTMuNjEyLTcuODk4LTUuNDI0LTEyLjg0OC01LjQyNGgtMTguMjY3Yy0xOS44MDgsMC0zOC42OTEsMy44NTgtNTYuNjg1LDExLjU2M2MtMTcuOTg0LDcuNzEtMzMuNTM3LDE4LjEzMi00Ni42NzIsMzEuMjY3Yy0xMy4xMzUsMTMuMTI5LTIzLjU1OSwyOC42ODgtMzEuMjY1LDQ2LjY3N2MtNy43MDcsMTcuOTg3LTExLjU2NywzNi44NzktMTEuNTY3LDU2LjY3NHYyMDAuOTkxYzAsMTUuMjM1LDUuMzMyLDI4LjE3MSwxNS45ODgsMzguODM0YzEwLjY1NywxMC42NTcsMjMuNiwxNS45ODUsMzguODI4LDE1Ljk4NWgxMDkuNjMzYzE1LjIyOSwwLDI4LjE3MS01LjMyOCwzOC44MjctMTUuOTg1YzEwLjY2NC0xMC42NjMsMTUuOTg1LTIzLjU5OSwxNS45ODUtMzguODM0VjI3NC4wODhDNDc1LjA4MiwyNTguODU1LDQ2OS43NiwyNDUuOTIsNDU5LjEwMywyMzUuMjU2elwiLz48L2c+PC9zdmc+JyxcbiAgIGFycm93X2Rvd246ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjczIDguNjdcIj48Zz48cGF0aCBkPVwiTTE4Ljc5LDcuNTJhLjguOCwwLDAsMSwuNTYtLjIzLjgyLjgyLDAsMCwxLC43OS43OS44LjgsMCwwLDEtLjIzLjU2bC03LjA3LDcuMDdhLjc5Ljc5LDAsMCwxLS41Ny4yNS43Ny43NywwLDAsMS0uNTctLjI1aDBMNC42NCw4LjY1YS44LjgsMCwwLDEtLjIzLS41Ny44Mi44MiwwLDAsMSwuNzktLjc5LjguOCwwLDAsMSwuNTYuMjNMMTIuMjgsMTRsMy4yNi0zLjI2LDMuMjUtMy4yNlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTcuMjkpXCIvPjwvZz48L3N2Zz4nLFxuICAgYWxpZ25fanVzdGlmeTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTAsNS45SDIwLjE1di0ySDQuNDF2MlptMCwzLjk0SDIwLjE1di0ySDQuNDF2MlptMCwzLjkzaDcuODd2LTJINC40MXYyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43NClcIi8+PC9nPjwvc3ZnPicsXG4gICBhbGlnbl9sZWZ0OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43N1wiPjxnPjxwYXRoIGQ9XCJNNC40MSw0Ljc0djJIMjAuMTV2LTJINC40MVptMTEuOCwzLjk0SDQuNDF2MkgxNi4yMnYtMlptLTExLjgsNS45SDE4LjE4di0ySDQuNDF2MlptMCwzLjkzaDkuODR2LTJINC40MXYyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43NClcIi8+PC9nPjwvc3ZnPicsXG4gICBhbGlnbl9yaWdodDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTMuOTMsNS45SDIwLjE1di0ySDguMzR2MlptLTIsMy45NEgyMC4xNHYtMkg2LjM3djJabTMuOTQsMy45M2g5Ljg0di0ySDEwLjMxdjJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00Ljc0KVwiLz48L2c+PC9zdmc+JyxcbiAgIGFsaWduX2NlbnRlcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTMuNzdcIj48Zz48cGF0aCBkPVwiTTQuNDEsNC43NHYySDIwLjE1di0ySDQuNDFabTIsMy45NHYySDE4LjE4di0ySDYuMzdabS0xLDUuOUgxOS4xNnYtMkg1LjM5djJabTIsMy45M0gxNy4ydi0ySDcuMzZ2MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTQuNzQpXCIvPjwvZz48L3N2Zz4nLFxuICAgZm9udF9jb2xvcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTQuNjFcIj48Zz48cGF0aCBkPVwiTTE4LjUsMTUuNTcsMTQuMjgsNC4zMmgtMy40TDYuNjUsMTUuNTdoM2wuOC0yLjI2aDQuMjNsLjgsMi4yNmgzWk0xNCwxMS4wN0gxMS4xNEwxMi41NCw3LDEzLjI1LDljLjQxLDEuMTguNjQsMS44Ni43LDJaTTQuNDEsMTYuNjl2Mi4yNEgyMC4xNVYxNi42OUg0LjQxWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4zMilcIi8+PC9nPjwvc3ZnPicsXG4gICBoaWdobGlnaHRfY29sb3I6JzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNjYgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTEyLjMyLDkuMzEsMTMuMzgsMTNIMTEuMjFsLjUyLTEuODNxLjQ2LTEuNjEuNTQtMS44M1pNNC40NCwzLjc2SDIwLjFWMTkuNUg0LjQ0VjMuNzZaTTE0LjcxLDE3LjMyaDIuNjNMMTMuNyw2SDEwLjg5TDcuMjYsMTcuMzJIOS44OWwuNjMtMi4yNGgzLjU1bC4zMiwxLjEyYy4xOC42NS4yOSwxLC4zMiwxLjEyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40NCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBsaXN0X2J1bGxldHM6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDEyLjM3XCI+PGc+PHBhdGggZD1cIk03Ljc3LDE2LjEyYTEuNTksMS41OSwwLDAsMC0uNDktMS4xOCwxLjYyLDEuNjIsMCwwLDAtMS4xOS0uNDksMS42OCwxLjY4LDAsMSwwLDAsMy4zNiwxLjY3LDEuNjcsMCwwLDAsMS42OC0xLjY5Wm0wLTQuNDhBMS42NywxLjY3LDAsMCwwLDYuMDksMTAsMS42OCwxLjY4LDAsMCwwLDQuOSwxMi44MmExLjYyLDEuNjIsMCwwLDAsMS4xOS40OSwxLjY3LDEuNjcsMCwwLDAsMS42OC0xLjY3Wm0xMi4zOCwzLjY0YS4yNy4yNywwLDAsMC0uMDgtLjE5LjI4LjI4LDAsMCwwLS4yLS4wOUg5LjE5YS4yOC4yOCwwLDAsMC0uMi4wOC4yOS4yOSwwLDAsMC0uMDguMTlWMTdhLjI3LjI3LDAsMCwwLC4yOC4yOEgxOS44N2EuMjcuMjcsMCwwLDAsLjE5LS4wOC4yNC4yNCwwLDAsMCwuMDgtLjJWMTUuMjhaTTcuNzcsNy4xM2ExLjYzLDEuNjMsMCwwLDAtLjQ5LTEuMiwxLjYxLDEuNjEsMCwwLDAtMS4xOS0uNDksMS42MSwxLjYxLDAsMCwwLTEuMTkuNDksMS43MSwxLjcxLDAsMCwwLDAsMi40LDEuNjIsMS42MiwwLDAsMCwxLjE5LjQ5LDEuNjEsMS42MSwwLDAsMCwxLjE5LS40OSwxLjYzLDEuNjMsMCwwLDAsLjQ5LTEuMlptMTIuMzgsMy42NmEuMjguMjgsMCwwLDAtLjA4LS4yLjI5LjI5LDAsMCwwLS4xOS0uMDhIOS4xOWEuMjcuMjcsMCwwLDAtLjI4LjI4djEuNjlhLjI3LjI3LDAsMCwwLC4wOC4xOS4yNC4yNCwwLDAsMCwuMi4wOEgxOS44N2EuMjcuMjcsMCwwLDAsLjE5LS4wOC4yNS4yNSwwLDAsMCwuMDgtLjE5VjEwLjc5Wm0wLTQuNWEuMjcuMjcsMCwwLDAtLjA4LS4xOUEuMjUuMjUsMCwwLDAsMTkuODgsNkg5LjE5QS4yOC4yOCwwLDAsMCw5LDYuMWEuMjYuMjYsMCwwLDAtLjA4LjE5VjhBLjI3LjI3LDAsMCwwLDksOC4xN2EuMjQuMjQsMCwwLDAsLjIuMDhIMTkuODdhLjI3LjI3LDAsMCwwLC4xOS0uMDhBLjI1LjI1LDAsMCwwLDIwLjE0LDhWNi4yOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTUuNDQpXCIvPjwvZz48L3N2Zz4nLFxuICAgbGlzdF9udW1iZXI6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY5IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk03LjY2LDE4YTEuMjQsMS4yNCwwLDAsMC0uMjYtLjc4LDEuMTcsMS4xNywwLDAsMC0uNzItLjQybC44NS0xVjE1SDQuNTh2MS4zNGguOTR2LS40NmwuODUsMGgwYy0uMTEuMTEtLjIyLjIzLS4zMi4zNXMtLjIzLjI3LS4zNy40N0w1LjM5LDE3bC4yMy41MWMuNjEtLjA1LjkyLjExLjkyLjQ5YS40Mi40MiwwLDAsMS0uMTguMzcuNzkuNzksMCwwLDEtLjQ1LjEyQTEuNDEsMS40MSwwLDAsMSw1LDE4LjE1bC0uNTEuNzdBMi4wNiwyLjA2LDAsMCwwLDYsMTkuNWExLjgsMS44LDAsMCwwLDEuMi0uNDFBMS4zOCwxLjM4LDAsMCwwLDcuNjYsMThabTAtNS41NEg2Ljc1VjEzSDUuNjNBLjcyLjcyLDAsMCwxLDYsMTIuNTFhNS40NSw1LjQ1LDAsMCwxLC42Ni0uNDUsMi43MSwyLjcxLDAsMCwwLC42Ny0uNTcsMS4xOSwxLjE5LDAsMCwwLC4zMS0uODEsMS4yOSwxLjI5LDAsMCwwLS40NS0xLDEuODYsMS44NiwwLDAsMC0yLS4xMSwxLjUxLDEuNTEsMCwwLDAtLjYyLjdsLjc0LjUyQS44Ny44NywwLDAsMSw2LDEwLjI4YS41MS41MSwwLDAsMSwuMzUuMTIuNDIuNDIsMCwwLDEsLjEzLjMzLjU1LjU1LDAsMCwxLS4yMS40LDMsMywwLDAsMS0uNS4zOGMtLjE5LjEzLS4zOS4yNy0uNTguNDJhMiwyLDAsMCwwLS41LjYsMS42MywxLjYzLDAsMCwwLS4yMS44MSwzLjg5LDMuODksMCwwLDAsLjA1LjQ4aDMuMlYxMi40NFptMTIuNDUsMi44MmEuMjcuMjcsMCwwLDAtLjA4LS4xOS4yOC4yOCwwLDAsMC0uMjEtLjA4SDkuMWEuMzIuMzIsMCwwLDAtLjIxLjA4LjI0LjI0LDAsMCwwLS4wOC4yVjE3YS4yNy4yNywwLDAsMCwuMDguMTkuMy4zLDAsMCwwLC4yMS4wOEgxOS44M2EuMzIuMzIsMCwwLDAsLjIxLS4wOC4yNS4yNSwwLDAsMCwuMDgtLjE5VjE1LjI2Wk03LjY5LDcuMzJoLTFWMy43Nkg1LjhMNC42LDQuODhsLjYzLjY4YTEuODUsMS44NSwwLDAsMCwuNDMtLjQ4aDBsMCwyLjI0SDQuNzRWOC4yaDNWNy4zMlptMTIuNDMsMy40MmEuMjcuMjcsMCwwLDAtLjA4LS4xOS4yOC4yOCwwLDAsMC0uMjEtLjA4SDkuMWEuMzIuMzIsMCwwLDAtLjIxLjA4LjI0LjI0LDAsMCwwLS4wOC4ydjEuNzFhLjI3LjI3LDAsMCwwLC4wOC4xOS4zLjMsMCwwLDAsLjIxLjA4SDE5LjgzYS4zMi4zMiwwLDAsMCwuMjEtLjA4LjI1LjI1LDAsMCwwLC4wOC0uMTlWMTAuNzRabTAtNC41MkEuMjcuMjcsMCwwLDAsMjAsNiwuMjguMjgsMCwwLDAsMTkuODMsNkg5LjFBLjMyLjMyLDAsMCwwLDguODksNmEuMjQuMjQsMCwwLDAtLjA4LjE5VjcuOTNhLjI3LjI3LDAsMCwwLC4wOC4xOS4zMi4zMiwwLDAsMCwuMjEuMDhIMTkuODNBLjMyLjMyLDAsMCwwLDIwLDguMTJhLjI2LjI2LDAsMCwwLC4wOC0uMlY2LjIyWlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MyAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICB0YWJsZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTQuNDEsOC4wNVYzLjc2SDguN1Y4LjA1SDQuNDFabTUuNzEsMFYzLjc2aDQuM1Y4LjA1aC00LjNabTUuNzQtNC4yOWg0LjI5VjguMDVIMTUuODZWMy43NlptLTExLjQ1LDEwVjkuNDhIOC43djQuM0g0LjQxWm01LjcxLDBWOS40OGg0LjN2NC4zaC00LjNabTUuNzQsMFY5LjQ4aDQuMjl2NC4zSDE1Ljg2Wk00LjQxLDE5LjVWMTUuMjFIOC43VjE5LjVINC40MVptNS43MSwwVjE1LjIxaDQuM1YxOS41aC00LjNabTUuNzQsMFYxNS4yMWg0LjI5VjE5LjVIMTUuODZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIGhvcml6b250YWxfcnVsZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMi4yNFwiPjxnPjxwYXRoIGQ9XCJNMjAuMTUsMTIuNzVWMTAuNTFINC40MXYyLjI0SDIwLjE1WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMTAuNTEpXCIvPjwvZz48L3N2Zz4nLFxuICAgc2hvd19ibG9ja3M6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjY2IDE1LjY3XCI+PGc+PHBhdGggZD1cIk0xOS43Miw1LjU4YTEuNjQsMS42NCwwLDAsMC0xLjY0LTEuNjRINi4yM2ExLjYyLDEuNjIsMCwwLDAtMS4xNi40OCwxLjYzLDEuNjMsMCwwLDAtLjQ4LDEuMTZWOS42M2ExLjYsMS42LDAsMCwwLC40OCwxLjE2LDEuNjIsMS42MiwwLDAsMCwxLjE2LjQ3SDE4LjA5YTEuNjcsMS42NywwLDAsMCwxLjE2LS40NywxLjYyLDEuNjIsMCwwLDAsLjQ4LTEuMTZWNS41OFptLS45NCw0LjA1YS42OC42OCwwLDAsMS0uNy43SDYuMjNhLjY2LjY2LDAsMCwxLS40OC0uMi43NC43NCwwLDAsMS0uMjEtLjVWNS41OGEuNjYuNjYsMCwwLDEsLjItLjQ4LjcxLjcxLDAsMCwxLC40OC0uMjFIMTguMDhhLjc0Ljc0LDAsMCwxLC41LjIxLjY2LjY2LDAsMCwxLC4yLjQ4Wk02LjQ4LDcuNzJhLjIxLjIxLDAsMCwwLC4xNy0uMDcuMjIuMjIsMCwwLDAsLjA3LS4xN1Y3LjA2YTEuMjcsMS4yNywwLDAsMSwuMTEtLjUyLjM3LjM3LDAsMCwxLC4zNi0uMjNIOC43N0EuMjUuMjUsMCwwLDAsOSw2LjE3YS4xOS4xOSwwLDAsMCwwLS4yMy4yNy4yNywwLDAsMC0uMi0uMTJINy4xOWEuODguODgsMCwwLDAtLjcyLjM5LDEuNTEsMS41MSwwLDAsMC0uMjMuODV2LjQyYS4yNC4yNCwwLDAsMCwuMjQuMjRabS0uMTkuODFhLjIxLjIxLDAsMCwwLC4xNy0uMDcuMjYuMjYsMCwwLDAsLjA3LS4xNy4yNC4yNCwwLDAsMC0uMjQtLjI0LjIuMiwwLDAsMC0uMTYuMDkuMi4yLDAsMCwwLS4wNy4xNi4yMi4yMiwwLDAsMCwuMDcuMTcuMjMuMjMsMCwwLDAsLjE2LjA2Wm04LjQ2LDUuMWExLjYzLDEuNjMsMCwwLDAtLjQ3LTEuMTZBMS42MSwxLjYxLDAsMCwwLDEzLjEyLDEySDYuMjNhMS42LDEuNiwwLDAsMC0xLjE2LjQ2LDEuNjIsMS42MiwwLDAsMC0uNDgsMS4xNnY0LjA1YTEuNjQsMS42NCwwLDAsMCwxLjY0LDEuNjRoNi44OWExLjYsMS42LDAsMCwwLDEuMTYtLjQ4LDEuNjIsMS42MiwwLDAsMCwuNDctMS4xNlptLS45NCw0YS43LjcsMCwwLDEtLjIuNDkuNjUuNjUsMCwwLDEtLjUuMkg2LjIzYS42Ni42NiwwLDAsMS0uNDgtLjIuNzUuNzUsMCwwLDEtLjIxLS40OXYtNGEuNzQuNzQsMCwwLDEsLjIxLS41LjY2LjY2LDAsMCwxLC40OC0uMmg2Ljg5YS42OC42OCwwLDAsMSwuNy43djRabTYuMTUsMHYtNGExLjYsMS42LDAsMCwwLS40OC0xLjE2QTEuNjcsMS42NywwLDAsMCwxOC4zMiwxMkgxNy4xYTEuNjMsMS42MywwLDAsMC0xLjE2LjQ3LDEuNjEsMS42MSwwLDAsMC0uNDcsMS4xNnY0YTEuNjcsMS42NywwLDAsMCwuNDcsMS4xNiwxLjYyLDEuNjIsMCwwLDAsMS4xNi40OGgxLjIyQTEuNjQsMS42NCwwLDAsMCwyMCwxNy42OFptLS45NC00djRhLjc1Ljc1LDAsMCwxLS4yMS40OS42Mi42MiwwLDAsMS0uNDguMkgxNy4xMWEuNjkuNjksMCwwLDEtLjUtLjIuNy43LDAsMCwxLS4yLS40OXYtNGEuNjguNjgsMCwwLDEsLjctLjdoMS4yMmEuNjYuNjYsMCwwLDEsLjQ4LjIuNzIuNzIsMCwwLDEsLjIxLjVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ0IC0zLjc5KVwiLz48L2c+PC9zdmc+JyxcbiAgIGNhbmNlbDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE0LjE1LDExLjYzbDUuNjEsNS42MWExLjI5LDEuMjksMCwwLDEsLjM4LjkzLDEuMjcsMS4yNywwLDAsMS0uNC45MywxLjI1LDEuMjUsMCwwLDEtLjkyLjQsMS4zMSwxLjMxLDAsMCwxLS45NC0uNGwtNS42MS01LjYxTDYuNjcsMTkuMWExLjMxLDEuMzEsMCwwLDEtLjk0LjQsMS4yNCwxLjI0LDAsMCwxLS45Mi0uNCwxLjI3LDEuMjcsMCwwLDEtLjQtLjkzLDEuMzMsMS4zMywwLDAsMSwuMzgtLjkzbDUuNjEtNS42M0w0Ljc5LDZhMS4yNiwxLjI2LDAsMCwxLS4zOC0uOTMsMS4yMiwxLjIyLDAsMCwxLC40LS45MiwxLjI4LDEuMjgsMCwwLDEsLjkyLS4zOSwxLjM4LDEuMzgsMCwwLDEsLjk0LjM4bDUuNjEsNS42MSw1LjYxLTUuNjFhMS4zMywxLjMzLDAsMCwxLC45NC0uMzgsMS4yNiwxLjI2LDAsMCwxLC45Mi4zOSwxLjI0LDEuMjQsMCwwLDEsLjQuOTIsMS4yOSwxLjI5LDAsMCwxLS4zOS45M0wxNyw4LjgxbC0yLjgsMi44MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgaW1hZ2U6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDE1Ljc3XCI+PGc+PHBhdGggZD1cIk04Ljc3LDguNzJhLjg4Ljg4LDAsMCwxLS42MS0uMjcuODIuODIsMCwwLDEtLjI1LS42MS44OS44OSwwLDAsMSwuMjUtLjYyQS44Mi44MiwwLDAsMSw4Ljc3LDdhLjgxLjgxLDAsMCwxLC42MS4yNS44My44MywwLDAsMSwuMjcuNjIuODEuODEsMCwwLDEtLjI1LjYxLjkxLjkxLDAsMCwxLS42My4yN1ptOS42Mi01YTEuNzQsMS43NCwwLDAsMSwxLjc2LDEuNzZWMTcuNzZhMS43NCwxLjc0LDAsMCwxLTEuNzYsMS43Nkg2LjE2QTEuNzQsMS43NCwwLDAsMSw0LjQsMTcuNzZWNS41MUExLjc0LDEuNzQsMCwwLDEsNi4xNiwzLjc1SDE4LjM5Wm0wLDEuNzVINi4xNnY4TDguNTMsMTEuOGEuOTQuOTQsMCwwLDEsLjU0LS4xNy44Ni44NiwwLDAsMSwuNTQuMkwxMS4wOSwxM2wzLjY0LTQuNTVhLjc4Ljc4LDAsMCwxLC4zNC0uMjUuODUuODUsMCwwLDEsLjQyLS4wNy44OS44OSwwLDAsMSwuMzkuMTIuNzguNzgsMCwwLDEsLjI4LjI5bDIuMjQsMy42N1Y1LjUxWm0wLDEyLjI0VjE1LjZMMTUuMywxMC41MywxMS44OSwxNC44YS44OS44OSwwLDAsMS0uNTkuMzIuODIuODIsMCwwLDEtLjY0LS4xOEw5LDEzLjYyLDYuMTYsMTUuNzR2MlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NSlcIi8+PC9nPjwvc3ZnPicsXG4gICB2aWRlbzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzQgMTQuNTVcIj48Zz48cGF0aCBkPVwiTTIwLjE1LDEwLjI2VjE4LjlsLTMuOTQtMS41N3YxLjJINC40MVYxMC42NkgxNi4yMnYxLjIzbDItLjgxLDItLjgyWk0xNC42NCwxN2gwVjEyLjU0aDB2LS4zMUg2VjE3aDguNjdabTMuOTQtLjM3di00bC0yLjM3LDF2MmwxLjE4LjQ4LDEuMTkuNDhaTTcuOTQsOS44NkEyLjc3LDIuNzcsMCwwLDEsNS4xOSw3LjExYTIuNzYsMi43NiwwLDAsMSw1LjUxLDBBMi43OCwyLjc4LDAsMCwxLDcuOTQsOS44NlptMC0zLjkzYTEuMjEsMS4yMSwwLDAsMC0uODMuMzUsMS4xNSwxLjE1LDAsMCwwLS4zNC44NEExLjA5LDEuMDksMCwwLDAsNy4xMSw4LDEuMTUsMS4xNSwwLDAsMCw4LDguMjgsMS4xMywxLjEzLDAsMCwwLDkuMTEsNy4xMiwxLjE2LDEuMTYsMCwwLDAsNy45NCw1LjkzWm01LjksMy45M2EyLjM0LDIuMzQsMCwwLDEtMS42Ny0uNjgsMi4zLDIuMywwLDAsMS0uNjgtMS42NywyLjM1LDIuMzUsMCwwLDEsNC0xLjY3LDIuMzcsMi4zNywwLDAsMSwwLDMuMzQsMi4zMywyLjMzLDAsMCwxLTEuNjguNjhabTAtMy4xNGEuNzUuNzUsMCwxLDAsLjU1LjIyLjczLjczLDAsMCwwLS41NS0uMjJaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC00LjM1KVwiLz48L2c+PC9zdmc+JyxcbiAgIGxpbms6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc0IDE1LjcyXCI+PGc+PHBhdGggZD1cIk0xMy4wNSwxMy42M2EuMjQuMjQsMCwwLDEsLjE1LjIyTDEzLjQyLDE2YS4xOS4xOSwwLDAsMS0uMDguMThsLTIuMTIsMi4xNGE0LjA4LDQuMDgsMCwwLDEtMS4yOS44NUE0LDQsMCwwLDEsNC43MSwxN2EzLjkyLDMuOTIsMCwwLDEtLjMtMS41MkE0LDQsMCwwLDEsNC43MSwxNGEzLjkxLDMuOTEsMCwwLDEsLjg3LTEuM0w3LjcsMTAuNTZhLjI1LjI1LDAsMCwxLC4yLS4wNmwyLjE3LjIyYS4yMS4yMSwwLDAsMSwuMTkuMTUuMjQuMjQsMCwwLDEsMCwuMjVMNy4xMiwxNC4yM2ExLjgxLDEuODEsMCwwLDAsMCwyLjU4LDEuNzgsMS43OCwwLDAsMCwxLjI5LjUyLDEuNzQsMS43NCwwLDAsMCwxLjI4LS41MkwxMi44LDEzLjdhLjI0LjI0LDAsMCwxLC4yNS0uMDdaTTE5LDQuOTJhNCw0LDAsMCwxLDAsNS42NkwxNi44NiwxMi43YS4yNS4yNSwwLDAsMS0uMTcuMDhsLTIuMi0uMjNhLjIxLjIxLDAsMCwxLS4xOS0uMTUuMjIuMjIsMCwwLDEsMC0uMjVMMTcuNDQsOWExLjgxLDEuODEsMCwwLDAsMC0yLjU4LDEuNzgsMS43OCwwLDAsMC0xLjI5LS41MiwxLjc0LDEuNzQsMCwwLDAtMS4yOC41MkwxMS43Niw5LjU3YS4yMS4yMSwwLDAsMS0uMjUsMCwuMjQuMjQsMCwwLDEtLjE2LS4yMWwtLjIyLTIuMTdhLjE5LjE5LDAsMCwxLC4wOC0uMThsMi4xMi0yLjE0YTQuMDgsNC4wOCwwLDAsMSwxLjI5LS44NSw0LjA1LDQuMDUsMCwwLDEsMy4wNiwwLDMuODUsMy44NSwwLDAsMSwxLjMuODVaTTUuODQsOS44MmEuMjUuMjUsMCwwLDEtLjE4LS4wOC4xOS4xOSwwLDAsMS0uMDctLjE5bC4xMS0uNzdhLjIuMiwwLDAsMSwuMTEtLjE3LjI0LjI0LDAsMCwxLC4yLDBsMi41LjcyYS4yNS4yNSwwLDAsMSwuMTUuMjcuMjIuMjIsMCwwLDEtLjIzLjIxbC0yLjU5LDBabTQuMTItMi0uNzMtMi41YS4yNy4yNywwLDAsMSwwLS4yQS4yMS4yMSwwLDAsMSw5LjQxLDVMMTAuMTksNWEuMjUuMjUsMCwwLDEsLjE5LDAsLjIzLjIzLDAsMCwxLC4wOC4xOGwtLjA1LDIuNjFhLjIuMiwwLDAsMS0uMTkuMjNoMEEuMjIuMjIsMCwwLDEsMTAsNy44NVptOC43Niw1LjU4YS4yNS4yNSwwLDAsMSwuMTguMDguMjMuMjMsMCwwLDEsLjA2LjJsLS4xMS43N2EuMjUuMjUsMCwwLDEtLjExLjE3LjIxLjIxLDAsMCwxLS4xMiwwbC0uMDgsMEwxNiwxNGEuMjUuMjUsMCwwLDEtLjE1LS4yNy4yMi4yMiwwLDAsMSwuMjItLjIxbDEuMjksMCwxLjMzLDBabS00LjEyLDIsLjc0LDIuNTFhLjI4LjI4LDAsMCwxLDAsLjIuMjMuMjMsMCwwLDEtLjE4LjExbC0uOC4xMWEuMjMuMjMsMCwwLDEtLjE3LS4wNy4yNS4yNSwwLDAsMS0uMDgtLjE4bDAtMi42MWEuMjIuMjIsMCwwLDEsLjIyLS4yMi4yMS4yMSwwLDAsMSwuMjYuMTVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc3KVwiLz48L2c+PC9zdmc+JyxcbiAgIG1hdGg6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDExLjgxIDE1LjczXCI+PGc+PHBhdGggZD1cIk0xNy4xOSw1LjczYTEsMSwwLDAsMCwuNzEtLjI5LDEsMSwwLDAsMCwuMjgtLjcsMSwxLDAsMCwwLTEtMUg3LjM1YTEsMSwwLDAsMC0xLDEsLjc3Ljc3LDAsMCwwLC4xMy40N2gwbDQuNTgsNi40M0w2LjY4LDE3LjgxYTEuMjUsMS4yNSwwLDAsMC0uMjkuNzEuOTQuOTQsMCwwLDAsLjI4LjcuOTIuOTIsMCwwLDAsLjY5LjI4SDE3LjJhMSwxLDAsMCwwLC43MS0uMjgsMSwxLDAsMCwwLDAtMS4zOS45Mi45MiwwLDAsMC0uNzEtLjI5SDkuMjZsMy44Ny01LjQzYS44Ni44NiwwLDAsMCwwLS45NUw5LjI2LDUuNzNoNy45M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTYuMzggLTMuNzcpXCIvPjwvZz48L3N2Zz4nLFxuICAgdW5saW5rOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43MlwiPjxnPjxwYXRoIGQ9XCJNMTksMTguMzJhNCw0LDAsMCwwLDAtNS42OEwxNS44NSw5LjVsLTEuMTcsMS41NUwxNy41NywxNGEyLDIsMCwwLDEsLjYxLDEuNDcsMi4wOCwyLjA4LDAsMCwxLTIuMDksMi4wOSwyLDIsMCwwLDEtMS40Ny0uNjFsLS4zOC0uMzctMS43NCwxLC44Ljc4YTQsNCwwLDAsMCw1LjY4LDBaTTgsOS43N2EyLDIsMCwwLDEtMS4yNy0xLDEuODksMS44OSwwLDAsMS0uMjEtMS41N0EyLjEsMi4xLDAsMCwxLDcuNDUsNiwyLDIsMCwwLDEsOSw1Ljc2TDEyLjI3LDcuMmwuNDktMkw5LjQ4LDMuOWE0LDQsMCwwLDAtMy4wNi40MUEzLjgyLDMuODIsMCwwLDAsNC41Niw2LjczYTMuOCwzLjgsMCwwLDAsLjQsM0EzLjc4LDMuNzgsMCwwLDAsNy4zOSwxMS42bDUuMzgsMiwuNDktMi0yLjY0LS45NEw4LDkuNzdaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQxIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHRhYmxlX2hlYWRlcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzUgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE3LDE5LjV2LS43OEgxNS41di43OEgxN1ptLTMsMHYtLjc4SDEyLjV2Ljc4SDE0Wm0tMywwdi0uNzhIOS41M3YuNzhIMTFabS0zLDB2LS43OEg2LjUzdi43OEg4Wm0xMC41NSwwYTEuNzMsMS43MywwLDAsMCwuODUtLjM1LDEuNjcsMS42NywwLDAsMCwuNTYtLjc2bC0uNzEtLjMxYTEuMjEsMS4yMSwwLDAsMS0uMzUuNCwxLjM0LDEuMzQsMCwwLDEtLjUzLjIzbC4wOC4zOGMuMDYuMjQuMDkuMzguMS40MVptLTEzLjctLjYzLjU1LS41NUEuNzcuNzcsMCwwLDEsNS4yNSwxOGExLjMxLDEuMzEsMCwwLDEtLjA2LS4zOHYtLjM4SDQuNDF2LjM4YTIsMiwwLDAsMCwuMTIuNjgsMS42LDEuNiwwLDAsMCwuMzUuNTdabTE1LjI3LTIuMTJWMTUuMjZoLS43OHYxLjQ5aC43OFptLTE1LTFWMTQuMjNINC40MXYxLjQ5aC43OFptMTUtMlYxMi4yNmgtLjc4djEuNDloLjc4Wm0tMTUtMVYxMS4yMkg0LjQxdjEuNTFoLjc4Wm0xNS0yVjkuMjZoLS43OHYxLjUxaC43OFptLTE1LTFWOC4xN0g0LjQxVjkuNzRoLjc4Wm0xNS0yVjYuMjhoLS43OFY3Ljc3aC43OFptLTE1LTEuMTFWNS4zM0w0LjQ4LDUuMWEuNzcuNzcsMCwwLDAtLjA3LjI3LDIuNzIsMi43MiwwLDAsMCwwLC4yOHYxaC43OVpNMTkuMjEsNWwuNjMtLjRBMS42MiwxLjYyLDAsMCwwLDE5LjE2LDRhMS45NCwxLjk0LDAsMCwwLS45MS0uMjJ2Ljc4YTEuMzEsMS4zMSwwLDAsMSwuNTYuMTIuODguODgsMCwwLDEsLjQuMzZaTTYsNC41NEg3Ljc4VjMuNzZINmEuODIuODIsMCwwLDAtLjI4LjA2bC4xMi4zNWMuMDcuMjEuMS4zMy4xMS4zNlptMTAuOCwwVjMuNzZIMTUuMjh2Ljc4aDEuNDlabS0zLDBWMy43NkgxMi4yOHYuNzhoMS40OVptLTMsMFYzLjc2SDkuMjh2Ljc4aDEuNTFaTTYsMTAuODRoMTIuNlY2LjkxSDZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbWVyZ2VfY2VsbDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzYgMTUuNzRcIj48Zz48cGF0aCBkPVwiTTE4LjkyLDEzLjVoMS4yM3Y0LjE1QTEuODQsMS44NCwwLDAsMSwxOC4zLDE5LjVIMTRWMTguMjdIMTguM2EuNi42LDAsMCwwLC40NC0uMTguNTkuNTksMCwwLDAsLjE4LS40NFYxMy41Wk0xOC4zLDMuNzZhMS44NCwxLjg0LDAsMCwxLDEuODUsMS44NVY5LjgySDE4LjkyVjUuNmEuNi42LDAsMCwwLS4xOC0uNDRBLjU5LjU5LDAsMCwwLDE4LjMsNUgxNFYzLjc2SDE4LjNabTEuODUsOC41MUgxNS42TDE3LjI2LDE0bC0uODYuODYtMy4xNC0zLjE3TDE2LjQsOC41MWwuODYuODZMMTUuNjIsMTFoNC41NHYxLjI0Wm0tMTMuOSw2aDQuMjdWMTkuNUg2LjI1QTEuODQsMS44NCwwLDAsMSw0LjQsMTcuNjVWMTMuNUg1LjYzdjQuMTVhLjYxLjYxLDAsMCwwLC42Mi42MlptMC0xNC41MWg0LjI3VjVINi4yNWEuNi42LDAsMCwwLS40NC4xOC41Ny41NywwLDAsMC0uMTcuNDNWOS44MUg0LjQxVjUuNkExLjgzLDEuODMsMCwwLDEsNi4yNSwzLjc2Wm01LDcuOUw4LjE1LDE0LjgzLDcuMywxNCw5LDEyLjI3SDQuNDFWMTFIOC45NEw3LjMsOS4zOCw3LjczLDlsLjQzLS40M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBzcGxpdF9jZWxsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NSAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTAuMzcsMTIuMjVINi43NEw4LjQsMTMuOTRsLS44Ny44Nkw0LjQxLDExLjYzLDcuNTMsOC41bC44Ny44Nkw2Ljc0LDExaDMuNjJ2MS4yM1ptOS43OC0uNjFMMTcsMTQuODEsMTYuMTMsMTRsMS42Ni0xLjY5SDE0LjE2VjExaDMuNjNMMTYuMTMsOS4zN2wuNDMtLjQzQTUuMjQsNS4yNCwwLDAsMSwxNyw4LjUxWk0xOC45LDguMjJWNS42MWEuNTcuNTcsMCwwLDAtLjE4LS40M0EuNjUuNjUsMCwwLDAsMTguMjksNUgxMi44OFYxOC4yOGg1LjQxYS43LjcsMCwwLDAsLjQ0LS4xOC41Ny41NywwLDAsMCwuMTgtLjQzVjE1aDEuMjN2Mi42NGExLjg0LDEuODQsMCwwLDEtMS44NSwxLjgzaC0xMkExLjg0LDEuODQsMCwwLDEsNC45NCwxOWExLjgxLDEuODEsMCwwLDEtLjU0LTEuMjlWMTVINS42M3YyLjY0YS41Ny41NywwLDAsMCwuMTguNDMuNjcuNjcsMCwwLDAsLjQ0LjE4aDUuNDFWNUg2LjI1YS43LjcsMCwwLDAtLjQ0LjE4LjU2LjU2LDAsMCwwLS4xNy40M1Y4LjIySDQuNDFWNS42MUExLjgsMS44LDAsMCwxLDUsNC4zMWExLjkxLDEuOTEsMCwwLDEsMS4zMS0uNTVoMTJhMS44OSwxLjg5LDAsMCwxLDEuMzEuNTUsMS44LDEuOCwwLDAsMSwuNTQsMS4zVjguMjNIMTguOVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNCAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBjYXB0aW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxMy43OVwiPjxnPjxwYXRoIGQ9XCJNNC40MSwxOC41MkgyMC4xNXYtMkg0LjQxWk0yMCw0LjczSDE4LjA3VjZoLjY1di42NUgyMFY0LjczWk0xNyw2VjQuNzNIMTQuNTVWNkgxN1pNMTMuNDksNlY0LjczSDExVjZoMi40N1pNMTAsNlY0LjczSDcuNVY2SDEwWk01Ljc5LDZoLjY1VjQuNzNINC41VjYuNjdINS44VjZaTTQuNSwxMS4zNEg1Ljc5VjguNDhINC41Wk02LjQ0LDEzLjhINS43OXYtLjY1SDQuNXYxLjk0SDYuNDRaTTE3LDE1LjA5VjEzLjhIMTQuNTV2MS4yOUgxN1ptLTMuNTIsMFYxMy44SDExdjEuMjloMi40N1ptLTMuNTMsMFYxMy44SDcuNXYxLjI5SDEwWk0yMCwxMy4xNkgxOC43MnYuNjVoLS42NVYxNS4xSDIwWm0tMS4yOS0xLjgySDIwVjguNDhoLTEuM3YyLjg2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC43MylcIi8+PC9nPjwvc3ZnPicsXG4gICBlZGl0OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43M1wiPjxnPjxwYXRoIGQ9XCJNNy41MSw1LjY4aDZsMS41Mi0xLjU3SDYuOTRhMi40LDIuNCwwLDAsMC0xLjc5LjgyQTIuOCwyLjgsMCwwLDAsNC40MSw2LjhWMTdhMi41NSwyLjU1LDAsMCwwLC43NSwxLjhBMi40OCwyLjQ4LDAsMCwwLDcsMTkuNUgxNy4yMmEyLjU3LDIuNTcsMCwwLDAsMS44My0uNzQsMi41MiwyLjUyLDAsMCwwLC43Ny0xLjhWOC44M2wtMS41OCwxLjU0djZhMS41NCwxLjU0LDAsMCwxLTEuNTMsMS41M0g3LjUxQTEuNTQsMS41NCwwLDAsMSw2LDE2LjQxVjcuMjFBMS41MiwxLjUyLDAsMCwxLDcuNTEsNS42OFptNS42Myw3LjQ3aDBMMTAuNywxMC43NGwtMSwzLjM4LDEuNzEtLjQ4LDEuNy0uNDlabS4zNC0uMzRoMGw1LjM2LTUuMzJMMTYuNCw1LjA4LDExLDEwLjRsMS4yMywxLjIxLDEuMjEsMS4yWk0xOS45Myw2LjRhLjgyLjgyLDAsMCwwLC4yMi0uNDhBLjU0LjU0LDAsMCwwLDIwLDUuNDdMMTguNDUsNEEuNjcuNjcsMCwwLDAsMTgsMy43N2EuNy43LDAsMCwwLS40OC4yMWwtLjc0LjcyLDIuNDQsMi40My4zNy0uMzcuMzUtLjM2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMy43NylcIi8+PC9nPjwvc3ZnPicsXG4gICBkZWxldGU6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjczIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOS4xNiw2LjcxYS45NC45NCwwLDAsMCwuNjktLjI4LjkxLjkxLDAsMCwwLC4yOS0uNjhBMSwxLDAsMCwwLDE5Ljg1LDVhLjkzLjkzLDAsMCwwLS42OS0uM0gxNC4yNEEuOTQuOTQsMCwwLDAsMTQsNC4wNmEuOTIuOTIsMCwwLDAtLjctLjNoLTJhMSwxLDAsMCwwLS43LjMuOTMuOTMsMCwwLDAtLjI4LjY4SDUuMzlBLjkyLjkyLDAsMCwwLDQuNyw1YTEsMSwwLDAsMC0uMjkuNzEuOTEuOTEsMCwwLDAsLjI5LjY4LDEsMSwwLDAsMCwuNjkuMjhIMTkuMTZabS0xMi43OSwxYTEsMSwwLDAsMC0uNy4zLjk0Ljk0LDAsMCwwLS4yOC42OXY4Ljg1QTEuODgsMS44OCwwLDAsMCw2LDE4LjkzYTEuOSwxLjksMCwwLDAsMS4zOS41N0gxNy4yYTEuODcsMS44NywwLDAsMCwxLjM5LS41OCwxLjkxLDEuOTEsMCwwLDAsLjU4LTEuMzlWOC42OEExLDEsMCwwLDAsMTguODgsOGEuODkuODksMCwwLDAtLjctLjI5LDEsMSwwLDAsMC0uNjkuMjkuOTIuOTIsMCwwLDAtLjI5LjY4djcuODdhMSwxLDAsMCwxLTEsMUg4LjM0YS45NC45NCwwLDAsMS0uNjktLjI4LDEsMSwwLDAsMS0uMjktLjcxVjguNjhhMSwxLDAsMCwwLTEtMVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbW9kaWZ5OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43IDE1Ljc0XCI+PGc+PHBhdGggZD1cIk0xOS43OSwxNS4yM2EuNjYuNjYsMCwwLDEsLjMuMzguNTkuNTksMCwwLDEtLjA3LjQ4bC0uOCwxLjM4YS42Ni42NiwwLDAsMS0uMzguMy41OS41OSwwLDAsMS0uNDgtLjA3bC0uNjgtLjM4YTQuNTUsNC41NSwwLDAsMS0xLjM0Ljc3di43OGEuNjQuNjQsMCwwLDEtLjE4LjQ1LjYxLjYxLDAsMCwxLS40NS4xOGgtMS42YS42LjYsMCwwLDEtLjQ0LS4xOC42Ni42NiwwLDAsMS0uMTktLjQ1di0uNzhhNC4zNiw0LjM2LDAsMCwxLTEuMzItLjc3bC0uNjkuMzhhLjU4LjU4LDAsMCwxLS40OC4wNy42Ni42NiwwLDAsMS0uMzgtLjNsLS4zOC0uNjZoLjgzYTEuNzcsMS43NywwLDAsMCwxLjIzLS41MiwxLjcyLDEuNzIsMCwwLDAsLjUxLTEuMjN2LS4xOGEzLDMsMCwwLDAsLjQ5LS4yOGwuMTUuMDlhMS44MywxLjgzLDAsMCwwLC44OC4yM0ExLjc1LDEuNzUsMCwwLDAsMTUuODQsMTRsLjg4LTEuNTJhMS43LDEuNywwLDAsMCwuMTctMS4zMiwxLjY2LDEuNjYsMCwwLDAtLjMtLjYxLDEuODQsMS44NCwwLDAsMC0uNTEtLjQ1bC0uMTUtLjA5LDAtLjI5LDAtLjI4LjE1LS4wOWExLDEsMCwwLDAsLjI2LS4xOGwwLC4wNnYuNzhhNC4zNCw0LjM0LDAsMCwxLDEuMzQuNzdsLjY4LS4zOGEuNjguNjgsMCwwLDEsLjQ4LS4wNi42NC42NCwwLDAsMSwuMzguMjlsLjgsMS4zOGEuNTguNTgsMCwwLDEsLjA3LjQ4LjYzLjYzLDAsMCwxLS4zLjM4bC0uNjguNGEzLjg0LDMuODQsMCwwLDEsLjA4Ljc2LDQuMTMsNC4xMywwLDAsMS0uMDguNzhsLjM0LjE4LjMyLjJaTTEwLjE3LDcuODZhMS45LDEuOSwwLDAsMSwxLjM1LDMuMjMsMS44NSwxLjg1LDAsMCwxLTEuMzUuNTVBMS45LDEuOSwwLDAsMSw4LjgzLDguNDFhMS45MiwxLjkyLDAsMCwxLDEuMzQtLjU1Wm0xLjU4LDcuMmEuNzMuNzMsMCwwLDEtLjIxLjQ5LjY2LjY2LDAsMCwxLS40OC4ySDkuMjlhLjY4LjY4LDAsMCwxLS42OS0uNjlWMTQuMmE0Ljc1LDQuNzUsMCwwLDEtMS40OC0uODZsLS43NS40NWEuNzMuNzMsMCwwLDEtLjcsMCwuNjMuNjMsMCwwLDEtLjI1LS4yNkw0LjU0LDEyYS42Ny42NywwLDAsMS0uMDgtLjUzLjcxLjcxLDAsMCwxLC4zMi0uNDJsLjc1LS40M2E0LjgsNC44LDAsMCwxLS4wOC0uODUsNC43MSw0LjcxLDAsMCwxLC4wOC0uODVsLS43NC0uNDRhLjcxLjcxLDAsMCwxLS4zMi0uNDIuNjUuNjUsMCwwLDEsLjA3LS41NEw1LjQyLDZhLjY2LjY2LDAsMCwxLC40Mi0uMzJsLjE4LDBhLjczLjczLDAsMCwxLC4zNS4wOWwuNzUuNDNBNC42OCw0LjY4LDAsMCwxLDguNiw1LjMzVjQuNDVhLjY4LjY4LDAsMCwxLC42OS0uNjloMS43N2EuNjQuNjQsMCwwLDEsLjQ4LjIuNzMuNzMsMCwwLDEsLjIxLjQ5di44OGE0Ljc1LDQuNzUsMCwwLDEsMS40OC44NUwxNCw1Ljc1YS42Ny42NywwLDAsMSwuMzQtLjA5bC4xOCwwYS43MS43MSwwLDAsMSwuNDIuMzJsLjg5LDEuNTRhLjY3LjY3LDAsMCwxLC4wNi41Mi43My43MywwLDAsMS0uMzIuNDNsLS43NS40MmE0LjgsNC44LDAsMCwxLC4wOC44NSw0LjcxLDQuNzEsMCwwLDEtLjA4Ljg1bC43NS40M2EuNjYuNjYsMCwwLDEsLjMyLjQyLjczLjczLDAsMCwxLS4wNi41NGwtLjg5LDEuNTJhLjY5LjY5LDAsMCwxLS4yNS4yNi43LjcsMCwwLDEtLjM1LjA5LjY0LjY0LDAsMCwxLS4zNC0uMDlsLS43NS0uNDVhNC44Nyw0Ljg3LDAsMCwxLTEuNDguODZ2Ljg3Wk03LjIzLDkuNzVhMywzLDAsMCwwLC44NiwyLjA4LDIuOTQsMi45NCwwLDEsMCw0LjE2LTQuMTYsMywzLDAsMCwwLTIuMDgtLjg1QTIuOTQsMi45NCwwLDAsMCw3LjIzLDkuNzVaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQ0IC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIHJldmVydDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuNzYgMTQuNjlcIj48Zz48cGF0aCBkPVwiTTE4LjI2LDE1VjEyLjNsMS44OS0yVjE1YTIuNTgsMi41OCwwLDAsMS0uMjQsMWMtLjIuNTgtLjc1LjkyLTEuNjUsMUg3LjU2djJMNC40MSwxNS42Myw3LjU2LDEzdjJoMTAuN1pNNi4zLDguMjhWMTFMNC40MSwxM1Y4LjI4YTIuNTgsMi41OCwwLDAsMSwuMjQtMWMuMi0uNTguNzUtLjkyLDEuNjUtMUgxN3YtMmwzLjE1LDMuMzRMMTcsMTAuM3YtMkg2LjNaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjQgLTQuMjgpXCIvPjwvZz48L3N2Zz4nLFxuICAgYXV0b19zaXplOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNNi43MSwxNy4xOSw2Ljg5LDE2bDEuMjEtLjE1QTYsNiwwLDAsMSw2LjgxLDEzLjlhNS43OCw1Ljc4LDAsMCwxLS40NS0yLjI3QTYsNiwwLDAsMSw4LjEsNy40NWE1LjgzLDUuODMsMCwwLDEsNC4xNy0xLjczbDEtMS0xLTFBNy44OSw3Ljg5LDAsMCwwLDUsMTQuNjRhNy43Myw3LjczLDAsMCwwLDEuNzEsMi41NVptNS41NywyLjMxaDBBNy44Niw3Ljg2LDAsMCwwLDE3Ljg1LDYuMDdMMTcuNjcsNy4zbC0xLjIxLjE1YTUuOSw1LjksMCwwLDEsMS4yOSwxLjkyLDUuODEsNS44MSwwLDAsMSwuNDUsMi4yNiw1LjkxLDUuOTEsMCwwLDEtNS45LDUuOWwtMSwxLC40OS40OS40Ny41WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtMy43NilcIi8+PC9nPjwvc3ZnPicsXG4gICBpbnNlcnRfcm93X2JlbG93OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS44IDE1LjhcIj48Zz48cGF0aCBkPVwiTTE1LjcsMS4zYy0wLjEtMC4xLTAuMS0wLjItMC4yLTAuMkwxNS4zLDFIMC40TDAuMywxLjFjMCwwLTAuMSwwLjEtMC4xLDAuMWMwLDAtMC4xLDAuMS0wLjEsMC4xTDAsMS40djcuN2wwLjEsMC4xYzAsMC4xLDAuMSwwLjEsMC4yLDAuMmwwLjEsMC4xaDIuM1Y5LjNsMC4xLTAuNUwzLDguNWwwLjEtMC4yYy0wLjEsMC0wLjIsMC0wLjMsMEgxLjJ2LTZoMTMuM3Y2aC0xLjZjLTAuMSwwLTAuMiwwLTAuMywwbDAuMSwwLjJsMC4yLDAuNEMxMi45LDksMTMsOS4yLDEzLDkuM3YwLjFoMi4zbDAuMi0wLjFjMC4xLDAsMC4xLTAuMSwwLjItMC4ybDAuMS0wLjFWMS40TDE1LjcsMS4zelwiLz48cGF0aCBkPVwiTTEwLjUsNy41QzkuOSw3LjEsOS4zLDYuOCw4LjYsNi43Yy0wLjIsMC0wLjUtMC4xLTAuNywwYy0wLjIsMC0wLjUsMC0wLjcsMEM2LjYsNi43LDYuMSw2LjksNS42LDcuM0M1LjIsNy42LDQuNyw4LDQuNCw4LjRDNC4zLDguNiw0LjIsOC44LDQuMiw4LjlDNC4xLDkuMSw0LDkuMywzLjksOS40QzMuOSw5LjYsMy44LDkuNywzLjgsOS45YzAsMC4yLTAuMSwwLjMtMC4xLDAuNXYtMC4xYy0wLjEsMC44LDAuMSwxLjYsMC41LDIuNGMwLjQsMC43LDEsMS4zLDEuNywxLjdjMC4zLDAuMiwwLjYsMC4zLDAuOSwwLjNjMC4zLDAuMSwwLjcsMC4xLDEsMC4xYzAuMywwLDAuNywwLDEtMC4xYzAuMy0wLjEsMC42LTAuMiwwLjktMC4zYzAuNS0wLjMsMC45LTAuNiwxLjMtMWMwLjMtMC40LDAuNi0wLjgsMC44LTEuM2MwLjEtMC40LDAuMi0wLjksMC4yLTEuNGMwLTAuNS0wLjEtMS0wLjMtMS40QzExLjUsOC42LDExLjEsOCwxMC41LDcuNXogTTEwLjEsMTEuM0g4LjV2MS42SDhINy45SDcuM3Ywdi0wLjF2LTEuNEg1Ljd2LTAuNHYtMC4ydi0wLjZoMGgxLjVWOC41aDEuMnYxLjZoMS42VjExLjN6XCIvPjwvZz48L3N2Zz4nLFxuICAgaW5zZXJ0X3Jvd19hYm92ZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuOCAxNS44XCI+PGc+PHBhdGggZD1cIk0wLjEsMTQuNWMwLjEsMC4xLDAuMSwwLjIsMC4yLDAuMmwwLjEsMC4xaDE0LjlsMC4xLTAuMWMwLDAsMC4xLTAuMSwwLjEtMC4xYzAsMCwwLjEtMC4xLDAuMS0wLjFsMC4xLTAuMVY2LjdsLTAuMS0wLjFjMC0wLjEtMC4xLTAuMS0wLjItMC4ybC0wLjEtMC4xaC0yLjN2MC4xbC0wLjEsMC41bC0wLjIsMC40bC0wLjEsMC4yYzAuMSwwLDAuMiwwLDAuMywwaDEuNnY2SDEuM3YtNmgxLjZjMC4xLDAsMC4yLDAsMC4zLDBMMy4xLDcuM0wyLjksNi45QzIuOCw2LjgsMi44LDYuNiwyLjcsNi41VjYuM0gwLjRMMC4zLDYuNGMtMC4xLDAtMC4xLDAuMS0wLjIsMC4yTDAsNi43djcuN0wwLjEsMTQuNXpcIi8+PHBhdGggZD1cIk01LjMsOC4zYzAuNiwwLjUsMS4yLDAuOCwxLjksMC45YzAuMiwwLDAuNSwwLjEsMC43LDBjMC4yLDAsMC41LDAsMC43LDBjMC42LTAuMSwxLjEtMC4zLDEuNi0wLjZjMC41LTAuMywwLjktMC43LDEuMi0xLjJjMC4xLTAuMiwwLjItMC4zLDAuMy0wLjVjMC4xLTAuMiwwLjItMC40LDAuMi0wLjVjMC4xLTAuMSwwLjEtMC4zLDAuMS0wLjRDMTIsNS44LDEyLDUuNiwxMiw1LjR2MC4xYzAuMS0wLjgtMC4xLTEuNi0wLjUtMi40Yy0wLjQtMC43LTEtMS4zLTEuNy0xLjdDOS41LDEuMyw5LjIsMS4yLDguOSwxLjFDOC41LDEsOC4yLDEsNy45LDFjLTAuMywwLTAuNywwLTEsMC4xQzYuNiwxLjIsNi4zLDEuMyw2LDEuNEM1LjUsMS43LDUuMSwyLDQuNywyLjRDNC40LDIuOCw0LjEsMy4zLDMuOSwzLjhDMy44LDQuMiwzLjcsNC43LDMuNyw1LjJjMCwwLjUsMC4xLDEsMC4zLDEuNEM0LjMsNy4yLDQuNyw3LjgsNS4zLDguM3ogTTUuNyw0LjVoMS42VjIuOWgwLjVoMC4xaDAuNnYwdjAuMXYxLjRIMTB2MC40djAuMnYwLjZoMEg4LjV2MS42SDcuM1Y1LjdINS43VjQuNXpcIi8+PC9nPjwvc3ZnPicsXG4gICBpbnNlcnRfY29sdW1uX2xlZnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMTQuNSwxNS43YzAuMS0wLjEsMC4yLTAuMSwwLjItMC4ybDAuMS0wLjFWMC40bC0wLjEtMC4xYzAsMC0wLjEtMC4xLTAuMS0wLjFjMCwwLTAuMS0wLjEtMC4xLTAuMUwxNC40LDBINi43TDYuNiwwLjFjLTAuMSwwLTAuMSwwLjEtMC4yLDAuMkw2LjMsMC40djIuM2gwLjFsMC41LDAuMUw3LjMsM2wwLjIsMC4xYzAtMC4xLDAtMC4yLDAtMC4zVjEuMmg2djEzLjNoLTZ2LTEuNmMwLTAuMSwwLTAuMiwwLTAuM2wtMC4yLDAuMWwtMC40LDAuMkM2LjcsMTIuOSw2LjYsMTMsNi40LDEzSDYuM3YyLjNsMC4xLDAuMmMwLDAuMSwwLjEsMC4xLDAuMiwwLjJsMC4xLDAuMWg3LjdMMTQuNSwxNS43elwiLz48cGF0aCBkPVwiTTguMywxMC41QzguNywxMCw5LDkuMyw5LjEsOC42YzAtMC4yLDAuMS0wLjUsMC0wLjdjMC0wLjIsMC0wLjUsMC0wLjdDOSw2LjcsOC44LDYuMSw4LjUsNS43QzguMiw1LjIsNy44LDQuOCw3LjMsNC41QzcuMiw0LjQsNyw0LjMsNi45LDQuMkM2LjcsNC4xLDYuNSw0LDYuNCw0QzYuMiwzLjksNi4xLDMuOSw1LjksMy44Yy0wLjIsMC0wLjMtMC4xLTAuNS0wLjFoMC4xQzQuNywzLjcsMy44LDMuOSwzLjEsNC4zQzIuNCw0LjcsMS44LDUuMywxLjQsNkMxLjMsNi4zLDEuMiw2LjYsMS4xLDYuOUMxLDcuMiwxLDcuNiwxLDcuOWMwLDAuMywwLDAuNywwLjEsMWMwLjEsMC4zLDAuMiwwLjYsMC4zLDAuOWMwLjMsMC41LDAuNiwwLjksMSwxLjNjMC40LDAuMywwLjgsMC42LDEuMywwLjhDNC4yLDEyLDQuNywxMi4xLDUuMSwxMmMwLjUsMCwxLTAuMSwxLjQtMC4zQzcuMiwxMS41LDcuOCwxMS4xLDguMywxMC41ek00LjUsMTAuMVY4LjVIMi45VjhWNy45VjcuM2gwSDNoMS40VjUuN2gwLjRoMC4yaDAuNnYwdjEuNWgxLjZ2MS4ySDUuN3YxLjZINC41elwiLz48L2c+PC9zdmc+JyxcbiAgIGluc2VydF9jb2x1bW5fcmlnaHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMS4zLDAuMUMxLjIsMC4yLDEuMSwwLjIsMS4xLDAuM0wxLDAuNHYxNC45bDAuMSwwLjFjMCwwLDAuMSwwLjEsMC4xLDAuMWMwLDAsMC4xLDAuMSwwLjEsMC4xbDAuMSwwLjFoNy43bDAuMS0wLjFjMC4xLDAsMC4xLTAuMSwwLjItMC4ybDAuMS0wLjF2LTIuM0g5LjNsLTAuNS0wLjFsLTAuNC0wLjJsLTAuMi0wLjFjMCwwLjEsMCwwLjIsMCwwLjN2MS42aC02VjEuM2g2djEuNmMwLDAuMSwwLDAuMiwwLDAuM2wwLjItMC4xbDAuNC0wLjJDOSwyLjksOS4yLDIuOCw5LjMsMi44aDAuMVYwLjVMOS40LDAuM2MwLTAuMS0wLjEtMC4xLTAuMi0wLjJMOS4xLDBIMS40TDEuMywwLjF6XCIvPjxwYXRoIGQ9XCJNNy41LDUuM0M3LDUuOCw2LjcsNi41LDYuNiw3LjJjMCwwLjItMC4xLDAuNSwwLDAuN2MwLDAuMiwwLDAuNSwwLDAuN2MwLjEsMC42LDAuMywxLjEsMC42LDEuNmMwLjMsMC41LDAuNywwLjksMS4yLDEuMmMwLjIsMC4xLDAuMywwLjIsMC41LDAuM2MwLjIsMC4xLDAuNCwwLjIsMC41LDAuMmMwLjEsMC4xLDAuMywwLjEsMC40LDAuMWMwLjIsMCwwLjMsMC4xLDAuNSwwLjFoLTAuMWMwLjgsMC4xLDEuNi0wLjEsMi40LTAuNWMwLjctMC40LDEuMy0xLDEuNy0xLjdjMC4yLTAuMywwLjMtMC42LDAuMy0wLjljMC4xLTAuMywwLjEtMC43LDAuMS0xYzAtMC4zLDAtMC43LTAuMS0xYy0wLjEtMC4zLTAuMi0wLjYtMC4zLTAuOWMtMC4zLTAuNS0wLjYtMC45LTEtMS4zQzEzLDQuNCwxMi41LDQuMiwxMiw0Yy0wLjQtMC4xLTAuOS0wLjItMS40LTAuMmMtMC41LDAtMSwwLjEtMS40LDAuMkM4LjUsNC4zLDcuOSw0LjcsNy41LDUuM3ogTTExLjMsNS43djEuNmgxLjZ2MC41djAuMXYwLjZoMGgtMC4xaC0xLjR2MS42aC0wLjRoLTAuMmgtMC42djBWOC41SDguNVY3LjNoMS42VjUuN0gxMS4zelwiLz48L2c+PC9zdmc+JyxcbiAgIGRlbGV0ZV9yb3c6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc1IDEzLjgzXCI+PGc+PHBhdGggZD1cIk00LjcsMTguNDZsLjEyLjA4SDE5LjczbC4xMi0uMDhhLjU4LjU4LDAsMCwwLC4yMi0uMjJsLjA4LS4xMiwwLTcuNjktLjA4LS4xMWEuNzcuNzcsMCwwLDAtLjE4LS4xOGwtLjExLS4wOC0yLjMxLDAtLjA4LjI4LS4xLjI5YTEuNTgsMS41OCwwLDAsMS0uMTIuMjlsLS4xNC4zNHMwLDAsLjE4LDBIMTguOXY2SDUuNjR2LTZINy4zNWMuMTQsMCwuMiwwLC4xOCwwbC0uMTQtLjM0YTIuODUsMi44NSwwLDAsMS0uMTItLjI5bC0uMS0uMjktLjA3LS4yNy0yLjMxLDAtLjExLjA4YS43Ny43NywwLDAsMC0uMTguMThsLS4wOC4xMSwwLDcuNjkuMDguMTJhLjQ3LjQ3LDAsMCwwLC4wOS4xMmwuMTMuMDlaTTEyLjExLDEzYTQsNCwwLDAsMCwxLjQ2LS4yMSw0LjUxLDQuNTEsMCwwLDAsMS4zMS0uNzFBNCw0LDAsMCwwLDE2LjI2LDEwYTQuMzIsNC4zMiwwLDAsMC0uMDgtMi41NCw0LjM0LDQuMzQsMCwwLDAtMS0xLjUyLDQuMTUsNC4xNSwwLDAsMC0xLjU0LTEsNC4zNCw0LjM0LDAsMCwwLTEuMzUtLjIyQTQuMDcsNC4wNywwLDAsMCwxMSw0LjkzLDMuOTQsMy45NCwwLDAsMCw5LjI0LDYuMDcsMy45MiwzLjkyLDAsMCwwLDguMTUsOC44OGEzLjkxLDMuOTEsMCwwLDAsLjEyLjk1QTQuMTYsNC4xNiwwLDAsMCwxMi4xMSwxM1ptMi4zNS00LjE0di41OEgxMC4wOVY4LjI3aDQuMzd2LjU4WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40IC00LjcxKVwiLz48L2c+PC9zdmc+JyxcbiAgIGRlbGV0ZV9jb2x1bW46ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDEzLjgxIDE1Ljc0XCI+PGc+PHBhdGggZD1cIk01LjY2LDE5LjQybC4xMi4wOCw3LjY5LDAsLjExLS4wOGEuNzcuNzcsMCwwLDAsLjE4LS4xOGwuMDgtLjExLDAtMi4zMi0uMTUsMC0uNDUtLjE1LS40Mi0uMTgtLjE3LS4wN2ExLDEsMCwwLDAsMCwuMjd2MS42M2gtNlY1aDZWNi42MmEuOS45LDAsMCwwLDAsLjI2bC4xNy0uMDcuNDItLjE3YTMuOTEsMy45MSwwLDAsMSwuNDUtLjE1bC4xNSwwLDAtMi4zMkwxMy43NSw0YS43Ny43NywwLDAsMC0uMTgtLjE4bC0uMTEtLjA4SDUuNzlsLS4xMy4wN2EuNjMuNjMsMCwwLDAtLjIxLjIybC0uMDguMTJWMTkuMDhsLjA4LjEyYS40Ny40NywwLDAsMCwuMDkuMTIuMzUuMzUsMCwwLDAsLjEyLjFabTktMy42N2E0LjE2LDQuMTYsMCwwLDAsMi4zNi0uNTEsNC4wOCw0LjA4LDAsMCwwLDEuNjctMS43Miw0LDQsMCwwLDAsLjM1LS45MSwzLjc5LDMuNzksMCwwLDAsLjEtMSw0LjcxLDQuNzEsMCwwLDAtLjExLTEsNSw1LDAsMCwwLS4zLS44Nyw0LjI1LDQuMjUsMCwwLDAtMS0xLjI1LDQuNDksNC40OSwwLDAsMC0xLjM0LS44MUE0LjI2LDQuMjYsMCwwLDAsMTUsNy40OGEzLjg4LDMuODgsMCwwLDAtMS40MS4yNUE0LjMyLDQuMzIsMCwwLDAsMTEuODYsOSw0LDQsMCwwLDAsMTEsMTAuOTRhNC40LDQuNCwwLDAsMC0uMDUuNjgsNC41LDQuNSwwLDAsMCwuMDUuNjgsMy45MywzLjkzLDAsMCwwLC42MSwxLjU3LDQuMjIsNC4yMiwwLDAsMCwxLjE4LDEuMiw0LjU5LDQuNTksMCwwLDAsLjQ4LjI3Yy4yLjEuMzcuMTcuNS4yMmEyLjQ0LDIuNDQsMCwwLDAsLjQ1LjEyLDQuNjEsNC42MSwwLDAsMCwuNS4wN1ptMi41NC00LjEydi41OEgxMi44N1YxMWg0LjM3di41OVpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMzcgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgZml4ZWRfY29sdW1uX3dpZHRoOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNiw1SDE4QTEsMSAwIDAsMSAxOSw2QTEsMSAwIDAsMSAxOCw3SDZBMSwxIDAgMCwxIDUsNkExLDEgMCAwLDEgNiw1TTIxLDJWNEgzVjJIMjFNMTUsOEgxN1YyMkgxNVY4TTcsOEg5VjIySDdWOE0xMSw4SDEzVjIySDExVjhaXCIgLz48L3N2Zz4nLFxuICAgcm90YXRlX2xlZnQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1LjggMTUuOFwiPjxnPjxwYXRoIGQ9XCJNMC41LDEwLjJjMCwwLjEsMCwwLjIsMCwwLjN2MC4ybDAsMGMwLjEsMC4zLDAuMywwLjYsMC40LDAuOWwwLDBDMSwxMS44LDEuMywxMiwxLjUsMTEuOWgwLjFoMC4yaDAuMWMwLjEtMC4xLDAuMy0wLjMsMC40LTAuNXYtMC4yYzAtMC4xLDAtMC4yLTAuMS0wLjNsMCwwYy0wLjItMC4yLTAuMy0wLjQtMC4zLTAuN2wwLDBDMS44LDEwLDEuNyw5LjksMS41LDkuOGMtMC4xLDAtMC4yLDAtMC4zLDBIMC45QzAuNyw5LjksMC42LDEwLDAuNSwxMC4yTDAuNSwxMC4yelwiLz48cGF0aCBkPVwiTTIuMiwxMS41TDIuMiwxMS41TDIuMiwxMS41elwiLz48cGF0aCBkPVwiTTUuOSwzLjZMNS45LDMuNkw1LjksMy42elwiLz48cGF0aCBkPVwiTTAuMSw3LjljMCwwLjMsMCwwLjYsMCwwLjlsMCwwbDAsMGwwLDBsMCwwYzAsMC4yLDAuMSwwLjMsMC4yLDAuNGwwLDBjMC4yLDAuMSwwLjMsMC4yLDAuNSwwLjJsMCwwbDAsMGMwLjIsMCwwLjQtMC4xLDAuNS0wLjNsMCwwYzAtMC4xLDAuMS0wLjMsMC4xLTAuNFY4LjZsMCwwYzAtMC4yLDAtMC41LDAtMC43bDAsMGMwLTAuMi0wLjEtMC40LTAuMi0wLjVDMS4xLDcuMywwLjksNy4yLDAuNyw3LjJTMC4zLDcuMywwLjIsNy40QzAuMSw3LjUsMCw3LjcsMC4xLDcuOXpcIi8+PHBhdGggZD1cIk0xLjksMTIuN0wxLjksMTIuN2MwLDAuMiwwLDAuNCwwLjIsMC41bDAsMGwwLjIsMC4zbDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuNGwwLDBsMCwwbDAsMGwwLDBDMi45LDE0LDMsMTQuMSwzLjIsMTQuMXMwLjQtMC4xLDAuNS0wLjJjMC4xLTAuMiwwLjItMC4zLDAuMi0wLjV2LTAuMWMwLTAuMi0wLjEtMC40LTAuMi0wLjVsMCwwbC0wLjQtMC40bC0wLjItMC4ybDAsMEMzLDEyLjEsMi44LDEyLDIuNiwxMmwwLDBjLTAuMiwwLTAuNCwwLjEtMC41LDAuMmwwLDBDMiwxMi4zLDEuOSwxMi41LDEuOSwxMi43elwiLz48cGF0aCBkPVwiTTYuNiwxNWMwLDAuMiwwLjEsMC40LDAuMiwwLjVjMC4xLDAuMSwwLjIsMC4yLDAuNCwwLjNsMCwwYzAuMywwLDAuNSwwLDAuNywwaDAuM2wwLDBjMC4yLDAsMC40LTAuMSwwLjUtMC4yYzAuMS0wLjIsMC4yLTAuMywwLjItMC41bDAsMGwwLDBjMC0wLjItMC4xLTAuNC0wLjItMC41bDAsMGMtMC4xLTAuMS0wLjMtMC4yLTAuNS0wLjJsMCwwSDcuOWMtMC4xLDAtMC4zLDAtMC41LDBsMCwwSDcuM2MtMC4yLTAuMS0wLjMsMC0wLjUsMC4xbDAsMEM2LjcsMTQuNiw2LjYsMTQuOCw2LjYsMTVMNi42LDE1TDYuNiwxNUw2LjYsMTV6XCIvPjxwYXRoIGQ9XCJNNC4yLDcuNEM0LDcuNSw0LDcuNyw0LDcuOWMwLDAuMiwwLDAuNCwwLjIsMC41bDAsMGwzLjIsMy4ybDAsMGMwLjEsMC4xLDAuMywwLjIsMC41LDAuMnMwLjMtMC4xLDAuNS0wLjJsMCwwbDMuMi0zLjJsMCwwYzAuMS0wLjEsMC4yLTAuMywwLjItMC41YzAtMC4yLTAuMS0wLjQtMC4yLTAuNWwwLDBDMTEuNSw3LjMsMTEsNi43LDEwLDUuOGwwLDBMOC40LDQuMmwwLDBDOC4zLDQuMSw4LjEsNCw3LjksNFM3LjUsNC4xLDcuNCw0LjJMNC4yLDcuNEw0LjIsNy40eiBNNi44LDlMNS43LDcuOWwyLjItMi4ybDIuMywyLjJsLTIuMywyLjJDNy43LDkuOSw3LjMsOS41LDYuOCw5TDYuOCw5elwiLz48cGF0aCBkPVwiTTQuMSwxNC4xQzQsMTQuMiw0LDE0LjMsNCwxNC40djAuMmwwLDBjMC4xLDAuMSwwLjIsMC4zLDAuNCwwLjRsMCwwYzAuMywwLjEsMC42LDAuMiwwLjksMC40aDAuMWgwLjFsMCwwYzAuMiwwLDAuMy0wLjEsMC41LTAuMWwwLDBjMC4yLTAuMSwwLjMtMC4zLDAuMy0wLjRsMCwwbDAsMGwwLDBsMCwwdi0wLjJjMC0wLjEtMC4xLTAuMi0wLjEtMC4zbDAsMEM2LjEsMTQuMiw2LDE0LjEsNS44LDE0bDAsMGMtMC4zLTAuMS0wLjUtMC4yLTAuOC0wLjJsMCwwYy0wLjEtMC4xLTAuMi0wLjEtMC4zLTAuMUg0LjVDNC4zLDEzLjcsNC4yLDEzLjksNC4xLDE0LjF6XCIvPjxwYXRoIGQ9XCJNOS4zLDE0LjRjMCwwLjEtMC4xLDAuMywwLDAuNFYxNWwwLDBjMCwwLjEsMC4xLDAuMywwLjUsMC40YzAuMSwwLjEsMC4zLDAuMSwwLjQsMC4xbDAsMGgwLjFsMCwwYzAuMy0wLjEsMC42LTAuMiwwLjktMC4zbDAsMGMwLjEtMC4xLDAuMi0wLjIsMC4zLTAuNGwwLjEtMC4zYzAtMC4xLTAuMS0wLjItMC4xLTAuM2wwLDBjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40bDAsMGgtMC4zYy0wLjEsMC0wLjIsMC0wLjMsMGwwLDBjLTAuMiwwLjEtMC41LDAuMi0wLjgsMC4zbDAsMEM5LjUsMTQuMSw5LjQsMTQuMiw5LjMsMTQuNEw5LjMsMTQuNHpcIi8+PHBhdGggZD1cIk0xMS40LDE0LjdMMTEuNCwxNC43TDExLjQsMTQuN3pcIi8+PHBhdGggZD1cIk05LjUsMTUuM0w5LjUsMTUuM0w5LjUsMTUuM3pcIi8+PHBhdGggZD1cIk0xNS45LDcuOWMwLTEtMC4yLTItMC42LTNsMCwwYy0wLjQtMS0xLTEuOS0xLjctMi42QzEyLjgsMS42LDEyLDEsMTEsMC42bDAsMEMxMC4xLDAuMiw5LDAsOCwwQzcuMywwLDYuNSwwLjEsNS44LDAuM2wwLDBDNS4yLDAuNSw0LjYsMC44LDQsMS4xTDMuMSwwLjJsMCwwQzIuOSwwLjEsMi44LDAsMi42LDBIMi40bDAsMEMyLjIsMCwyLDAuMiwxLjksMC40bDAsMEwwLjEsNC45bDAsMEMwLDUsMCw1LjEsMCw1LjJjMCwwLjIsMC4xLDAuNCwwLjIsMC41bDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuMmgwLjFIMWwwLDBsNC43LTEuOGwwLDBDNS45LDQsNi4xLDMuOCw2LjEsMy42VjMuNEM2LjEsMy4yLDYsMyw1LjksMi45bDAsMEw1LjEsMi4xYzAuNC0wLjIsMC44LTAuNCwxLjMtMC41YzAuNS0wLjEsMS4xLTAuMiwxLjctMC4yYzAuOSwwLDEuNywwLjIsMi41LDAuNWwwLDBjMC44LDAuMywxLjUsMC44LDIuMSwxLjRjMC42LDAuNiwxLjEsMS4zLDEuNCwyLjFsMCwwYzAuMywwLjgsMC41LDEuNiwwLjUsMi41cy0wLjIsMS43LTAuNSwyLjVsMCwwYy0wLjMsMC44LTAuOCwxLjUtMS40LDIuMWMtMC4yLDAuMi0wLjQsMC4zLTAuNiwwLjVsMCwwYy0wLjIsMC4xLTAuMywwLjMtMC4zLDAuNXYwLjFjMCwwLjEsMCwwLjMsMC4xLDAuNGwwLDBjMC4xLDAuMiwwLjMsMC4zLDAuNSwwLjNsMCwwYzAuMSwwLDAuMy0wLjEsMC40LTAuMmwwLDBsMCwwbDAsMGwwLDBjMC4yLTAuMiwwLjUtMC40LDAuNy0wLjZsMCwwbDAsMGwwLDBsMCwwYzAuNy0wLjgsMS4zLTEuNiwxLjctMi42QzE1LjYsMTAsMTUuOCw5LDE1LjksNy45eiBNMS45LDRDMiwzLjgsMi4xLDMuNSwyLjMsMy4xbDAsMEwyLjcsMmwxLjIsMS4yTDEuOSw0elwiLz48cGF0aCBkPVwiTTYuOCwxNS41TDYuOCwxNS41TDYuOCwxNS41elwiLz48L2c+PC9zdmc+JyxcbiAgIHJvdGF0ZV9yaWdodDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTUuOCAxNS44XCI+PGc+PHBhdGggZD1cIk05LjksMTUuM0w5LjksMTUuM0w5LjksMTUuM3pcIi8+PHBhdGggZD1cIk02LjksMTUuMUw2LjksMTUuMWMwLDAuMSwwLjEsMC4zLDAuMiwwLjRsMCwwYzAuMSwwLjIsMC4zLDAuMywwLjUsMC4zbDAsMGgwLjNjMC4yLDAsMC40LDAsMC43LDBsMCwwYzAuMi0wLjEsMC4zLTAuMiwwLjQtMC4zYzAuMS0wLjEsMC4yLTAuMiwwLjItMC40VjE1YzAtMC4yLTAuMS0wLjQtMC4yLTAuNGMtMC4yLTAuMS0wLjMtMC4yLTAuNS0wLjJIOC40bDAsMGMtMC4xLDAtMC4zLDAtMC41LDBINy42bDAsMGMtMC4yLDAtMC40LDAuMS0wLjUsMC4yQzcsMTQuNyw2LjksMTQuOSw2LjksMTUuMXpcIi8+PHBhdGggZD1cIk02LjUsMTQuNEw2LjUsMTQuNEw2LjUsMTQuNHpcIi8+PHBhdGggZD1cIk01LjgsNS44TDUuOCw1LjhjLTEsMC45LTEuNSwxLjUtMS43LDEuNmwwLDBDNCw3LjUsNCw3LjcsNCw3LjljMCwwLjIsMCwwLjQsMC4yLDAuNWwwLDBsMy4yLDMuMmwwLDBjMC4yLDAuMSwwLjMsMC4yLDAuNSwwLjJzMC40LTAuMSwwLjUtMC4ybDAsMGwzLjItMy4ybDAsMGMwLjEtMC4xLDAuMi0wLjMsMC4yLTAuNWMwLTAuMi0wLjEtMC40LTAuMi0wLjVsMCwwTDguNCw0LjJDOC4zLDQuMSw4LjEsNCw3LjksNEM3LjcsNCw3LjUsNC4xLDcuNCw0LjJsMCwwTDUuOCw1Ljh6IE01LjYsNy45bDIuMy0yLjJsMi4yLDIuMkw5LDlsMCwwbDAsMGwwLDBsMCwwYy0wLjUsMC42LTAuOSwwLjktMS4xLDEuMUw1LjYsNy45elwiLz48cGF0aCBkPVwiTTksMTUuNUw5LDE1LjVMOSwxNS41elwiLz48cGF0aCBkPVwiTTkuNiwxNC43djAuMmwwLDBsMCwwbDAsMGwwLDBjMC4xLDAuMiwwLjEsMC4zLDAuMywwLjNjMC4xLDAuMSwwLjMsMC4xLDAuNCwwLjFsMCwwaDAuMWgwLjFjMC4zLTAuMSwwLjYtMC4zLDAuOS0wLjRsMCwwYzAuMS0wLjEsMC4yLTAuMiwwLjMtMC40bDAsMHYtMC4yYzAtMC4xLDAtMC4yLTAuMS0wLjNjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40SDExYy0wLjEsMC0wLjIsMC4xLTAuMywwLjFsMCwwYy0wLjIsMC4xLTAuNCwwLjItMC43LDAuM2wwLDBsMCwwYy0wLjEsMC4xLTAuMywwLjItMC40LDAuNEM5LjYsMTQuNSw5LjYsMTQuNiw5LjYsMTQuN3pcIi8+PHBhdGggZD1cIk05LDE0LjVMOSwxNC41TDksMTQuNXpcIi8+PHBhdGggZD1cIk05LjYsMTQuNEw5LjYsMTQuNEw5LjYsMTQuNHpcIi8+PHBhdGggZD1cIk0xMS43LDE0TDExLjcsMTRMMTEuNywxNHpcIi8+PHBhdGggZD1cIk0xNS42LDcuNEwxNS42LDcuNEwxNS42LDcuNHpcIi8+PHBhdGggZD1cIk0xNSw5LjRjMC4yLDAsMC40LDAsMC42LTAuMmwwLDBjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRsMCwwbDAsMGwwLDBsMCwwYzAtMC4zLDAtMC42LDAtMC45YzAtMC4yLTAuMS0wLjQtMC4yLTAuNWMtMC4xLTAuMS0wLjMtMC4yLTAuNS0wLjJzLTAuNCwwLjEtMC41LDAuMmMtMC4xLDAuMS0wLjIsMC4zLTAuMiwwLjVsMCwwYzAsMC4yLDAsMC40LDAsMC43bDAsMHYwLjFjMCwwLjEsMCwwLjMsMC4xLDAuNGwwLDBDMTQuNiw5LjMsMTQuOCw5LjQsMTUsOS40TDE1LDkuNEwxNSw5LjR6XCIvPjxwYXRoIGQ9XCJNMTQsMTJoMC4xaDAuMmgwLjFjMC4yLDAsMC41LTAuMiwwLjYtMC40bDAsMGMwLjItMC4zLDAuMy0wLjYsMC40LTAuOWwwLDB2LTAuMmMwLTAuMS0wLjEtMC4yLTAuMS0wLjNjLTAuMS0wLjItMC4yLTAuMy0wLjQtMC40aC0wLjNjLTAuMSwwLTAuMiwwLTAuMywwQzE0LjIsOS45LDE0LDEwLDE0LDEwLjNsMCwwYy0wLjEsMC4yLTAuMiwwLjUtMC4zLDAuN2wwLDBjLTAuMSwwLjEtMC4xLDAuMi0wLjEsMC4zdjAuMmwwLDBsMCwwQzEzLjYsMTEuNiwxMy44LDExLjgsMTQsMTJ6XCIvPjxwYXRoIGQ9XCJNMTQuNiw3LjRMMTQuNiw3LjRMMTQuNiw3LjR6XCIvPjxwYXRoIGQ9XCJNNC40LDE0LjJjLTAuMSwwLjEtMC4xLDAuMi0wLjEsMC4zbDAuMSwwLjJjMCwwLjIsMC4yLDAuMywwLjMsMC40bDAsMGMwLjMsMC4xLDAuNiwwLjMsMS4xLDAuNGwwLDBoMC4xbDAsMGMwLjEsMCwwLjItMC4xLDAuNC0wLjJjMC4xLDAsMC4yLTAuMiwwLjMtMC4zbDAsMHYtMC4yYzAtMC4xLTAuMS0wLjMtMC4yLTAuNGMtMC4xLTAuMS0wLjItMC4yLTAuNC0wLjNsMCwwYy0wLjItMC4xLTAuNS0wLjItMC43LTAuM2wwLDBjLTAuMSwwLTAuMiwwLTAuMywwSDQuN2wwLDBDNC42LDEzLjksNC40LDE0LDQuNCwxNC4yTDQuNCwxNC4yelwiLz48cGF0aCBkPVwiTTExLjksMTMuM2MwLDAuMiwwLjEsMC40LDAuMiwwLjZjMC4xLDAuMSwwLjMsMC4yLDAuNSwwLjJzMC40LTAuMSwwLjUtMC4ybDAsMGwwLDBsMCwwbDAsMGMwLjEtMC4xLDAuMy0wLjMsMC40LTAuNGwwLDBsMC4yLTAuM2wwLDBjMC4xLTAuMiwwLjItMC4zLDAuMi0wLjVsMCwwYzAtMC4yLTAuMS0wLjQtMC4yLTAuNWwwLDBjLTAuMS0wLjEtMC4zLTAuMi0wLjUtMC4ybDAsMGMtMC4yLDAtMC40LDAuMS0wLjUsMC4ybDAsMGwtMC4yLDAuMmwtMC40LDAuNGwwLDBDMTIsMTMsMTEuOSwxMy4xLDExLjksMTMuM0wxMS45LDEzLjN6XCIvPjxwYXRoIGQ9XCJNMTIuMSwxMy44TDEyLjEsMTMuOEwxMi4xLDEzLjh6XCIvPjxwYXRoIGQ9XCJNMTEuOSwxMy4zTDExLjksMTMuM0wxMS45LDEzLjN6XCIvPjxwYXRoIGQ9XCJNMTUuOSw1LjJjMC0wLjEtMC4xLTAuMi0wLjEtMC4zbDAsMEwxNCwwLjRsMCwwQzEzLjksMC4yLDEzLjcsMCwxMy41LDBsMCwwbDAsMGgtMC4yYy0wLjIsMC0wLjQsMC4xLTAuNSwwLjJsMCwwbC0wLjksMC45Yy0wLjUtMC4zLTEuMS0wLjYtMS44LTAuOGwwLDBDOS40LDAuMSw4LjcsMCw3LjksMGMtMSwwLTIsMC4yLTMsMC42UzMsMS42LDIuMywyLjNDMS42LDMuMSwxLDMuOSwwLjYsNC45bDAsMEMwLjIsNS44LDAsNi44LDAsNy45YzAsMSwwLjIsMiwwLjYsM3MwLjksMS44LDEuNywyLjZsMCwwbDAsMGwwLDBsMCwwYzAuMiwwLjIsMC41LDAuNCwwLjcsMC42bDAsMGwwLDBsMCwwbDAsMGMwLjIsMC4xLDAuMywwLjIsMC41LDAuMmwwLDBjMC4yLDAsMC40LTAuMSwwLjYtMC4zbDAsMGMwLjEtMC4xLDAuMS0wLjMsMC4xLTAuNHYtMC4xbDAsMEM0LjEsMTMuMyw0LDEzLjEsMy45LDEzbDAsMGMtMC4yLTAuMS0wLjQtMC4zLTAuNi0wLjVjLTAuNi0wLjYtMS4xLTEuMy0xLjQtMi4xbDAsMEMxLjYsOS42LDEuNCw4LjgsMS40LDcuOXMwLjItMS43LDAuNS0yLjVsMCwwYzAuMy0wLjgsMC44LTEuNSwxLjQtMi4xYzAuNi0wLjYsMS4zLTEuMSwyLjEtMS40bDAsMEM2LjIsMS42LDcsMS40LDcuOSwxLjRjMC42LDAsMS4xLDAuMSwxLjcsMC4yYzAuNSwwLjEsMC45LDAuMywxLjMsMC41bC0wLjgsMC44bDAsMEMxMCwzLjEsOS45LDMuMiw5LjksMy40djAuMmwwLDBsMCwwYzAsMC4yLDAuMiwwLjQsMC40LDAuNWwwLDBsNC41LDEuOGwwLDBIMTVoMC4xYzAuMiwwLDAuNC0wLjEsMC41LTAuMmwwLDBDMTUuNyw1LjYsMTUuOCw1LjQsMTUuOSw1LjJ6IE0xMS44LDMuMkwxMywybDAuNCwxLjFsMCwwYzAuMiwwLjQsMC4zLDAuNywwLjQsMC45TDExLjgsMy4yelwiLz48L2c+PC9zdmc+JyxcbiAgIG1pcnJvcl9ob3Jpem9udGFsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNC43NSAxNS43NFwiPjxnPjxwYXRoIGQ9XCJNMTMuNzUsMy43Nmw1LjksMTUuNzRoLTUuOVYzLjc2Wk00LjksMTkuNSwxMC44LDMuNzZWMTkuNUg0LjlaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00LjkgLTMuNzYpXCIvPjwvZz48L3N2Zz4nLFxuICAgbWlycm9yX3ZlcnRpY2FsOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NCAxNC43NVwiPjxnPjxwYXRoIGQ9XCJNMjAuMTUsMTMuMSw0LjQxLDE5VjEzLjFIMjAuMTVaTTQuNDEsNC4yNWwxNS43NCw1LjlINC40MVY0LjI1WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC40MSAtNC4yNSlcIi8+PC9nPjwvc3ZnPicsXG4gICBjaGVja2VkOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43NSAxMi4xXCI+PGc+PHBhdGggZD1cIk00LjU5LDEyLjIzbC4xMi4xOEw5LjQzLDE3LjVhLjU4LjU4LDAsMCwwLC44NCwwTDIwLDcuNDVoMGEuNTguNTgsMCwwLDAsMC0uODRsLS44NS0uODVhLjU4LjU4LDAsMCwwLS44NCwwSDE4LjJsLTguMTIsOC40MWEuMjkuMjksMCwwLDEtLjQyLDBsLTMuNC0zLjYzYS41OC41OCwwLDAsMC0uODQsMGwtLjg1Ljg1YS42LjYsMCwwLDAtLjE0LjIxLjUxLjUxLDAsMCwwLDAsLjQ0Yy4wNS4wNi4xLjEzLjE2LjE5WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNC4zOCAtNS41OClcIi8+PC9nPjwvc3ZnPicsXG4gICBsaW5lX2JyZWFrOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTksNmExLDEsMCwwLDAtMSwxdjRhMSwxLDAsMCwxLTEsMUg3LjQxbDEuMy0xLjI5QTEsMSwwLDAsMCw3LjI5LDkuMjlsLTMsM2ExLDEsMCwwLDAtLjIxLjMzLDEsMSwwLDAsMCwwLC43NiwxLDEsMCwwLDAsLjIxLjMzbDMsM2ExLDEsMCwwLDAsMS40MiwwLDEsMSwwLDAsMCwwLTEuNDJMNy40MSwxNEgxN2EzLDMsMCwwLDAsMy0zVjdBMSwxLDAsMCwwLDE5LDZaXCIvPjwvc3ZnPicsXG4gICBhdWRpbzogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE0LDMuMjNWNS4yOUMxNi44OSw2LjE1IDE5LDguODMgMTksMTJDMTksMTUuMTcgMTYuODksMTcuODQgMTQsMTguN1YyMC43N0MxOCwxOS44NiAyMSwxNi4yOCAyMSwxMkMyMSw3LjcyIDE4LDQuMTQgMTQsMy4yM00xNi41LDEyQzE2LjUsMTAuMjMgMTUuNSw4LjcxIDE0LDcuOTdWMTZDMTUuNSwxNS4yOSAxNi41LDEzLjc2IDE2LjUsMTJNMyw5VjE1SDdMMTIsMjBWNEw3LDlIM1pcIiAvPjwvc3ZnPicsXG4gICBpbWFnZV9nYWxsZXJ5OiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjMwIDMwIDE1MCAxNTBcIj48Zz48cGF0aCBkPVwiTTE1Mi43NzUsMTIwLjU0OFY1MS42NTFjMC0xMi4yNzEtOS45ODQtMjIuMjU0LTIyLjI1NC0yMi4yNTRINDMuNzI3Yy0xMi4yNzEsMC0yMi4yNTQsOS45ODMtMjIuMjU0LDIyLjI1NHY2OC44OTZjMCwxMi4yNyw5Ljk4MywyMi4yNTQsMjIuMjU0LDIyLjI1NGg4Ni43OTVDMTQyLjc5MSwxNDIuODAyLDE1Mi43NzUsMTMyLjgxNywxNTIuNzc1LDEyMC41NDh6IE0zNi4zOTQsNTEuNjUxYzAtNC4wNDIsMy4yOTEtNy4zMzMsNy4zMzMtNy4zMzNoODYuNzk1YzQuMDQyLDAsNy4zMzIsMy4yOTEsNy4zMzIsNy4zMzN2MjMuOTE3bC0xNC45MzgtMTcuNzY3Yy0xLjQxLTEuNjc4LTMuNDg3LTIuNjQ5LTUuNjgtMi42NThoLTAuMDI5Yy0yLjE4NCwwLTQuMjU1LDAuOTU0LTUuNjc0LDIuNjEzTDc2LjcwOSw5OC41MTlsLTkuMDk2LTkuMzk4Yy0xLjQyNy0xLjQ3NC0zLjM5Mi0yLjI5MS01LjQ0OC0yLjI3M2MtMi4wNTIsMC4wMjUtNC4wMDQsMC44OTMtNS4zOTYsMi40TDM2LjM5NCwxMTEuMzJWNTEuNjUxeiBNNDEuNjg0LDEyNy41ODVsMjAuNjk3LTIyLjQxNmw5LjMxMiw5LjYyMmMxLjQ2MSwxLjUxMSwzLjQ4OSwyLjMzNCw1LjU5MiwyLjI3YzIuMTAxLTAuMDY2LDQuMDc1LTEuMDEzLDUuNDQtMi42MTJsMzQuNDM2LTQwLjMwOGwyMC42OTMsMjQuNjEzdjIxLjc5NGMwLDQuMDQyLTMuMjksNy4zMzItNy4zMzIsNy4zMzJINDMuNzI3QzQzLjAxOCwxMjcuODgsNDIuMzM0LDEyNy43NzUsNDEuNjg0LDEyNy41ODV6IE0xODIuNjE2LDE1Mi41Vjc1LjY1N2MwLTQuMTItMy4zNC03LjQ2LTcuNDYxLTcuNDZjLTQuMTE5LDAtNy40NiwzLjM0LTcuNDYsNy40NlYxNTIuNWMwLDQuMTEyLTMuMzQ3LDcuNDYtNy40NjEsNy40NmgtOTRjLTQuMTE5LDAtNy40NiwzLjMzOS03LjQ2LDcuNDU5YzAsNC4xMjMsMy4zNDEsNy40NjIsNy40Niw3LjQ2Mmg5NEMxNzIuNTc2LDE3NC44ODEsMTgyLjYxNiwxNjQuODQxLDE4Mi42MTYsMTUyLjV6XCIvPjwvZz48L3N2Zz4nLFxuICAgYm9va21hcms6ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTE3LDNIN0EyLDIgMCAwLDAgNSw1VjIxTDEyLDE4TDE5LDIxVjVDMTksMy44OSAxOC4xLDMgMTcsM1pcIiAvPjwvc3ZnPicsXG4gICBkb3dubG9hZDogJzxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMiAxMkg0VjE3SDIwVjEySDIyVjE3QzIyIDE4LjExIDIxLjExIDE5IDIwIDE5SDRDMi45IDE5IDIgMTguMTEgMiAxN1YxMk0xMiAxNUwxNy41NSA5LjU0TDE2LjEzIDguMTNMMTMgMTEuMjVWMkgxMVYxMS4yNUw3Ljg4IDguMTNMNi40NiA5LjU1TDEyIDE1WlwiIC8+PC9zdmc+JyxcbiAgIC8vIE1vcmUgaWNvbnNcbiAgIG1vcmVfdGV4dDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIxMCAxMCAxODAgMTgwXCI+PGc+PHBhdGggZD1cIk00OS43MTEsMTQyLjE4OGg0OS4wMjdjMi4zMjgsMC4wMDIsNC4zOTQsMS40OTIsNS4xMjksMy42OTlsOS43NDIsMjkuMjUyYzAuMzYzLDEuMDkyLDEuMzg1LDEuODI4LDIuNTM3LDEuODNsMTUuODgzLDAuMDFjMC44NTksMCwxLjY2Ny0wLjQxMiwyLjE3LTEuMTA5czAuNjQxLTEuNTk0LDAuMzctMi40MWwtMTYuNjI1LTUwLjA0NUw4Ni41MDMsMjguOTUzYy0wLjM2LTEuMDk3LTEuMzgzLTEuODM5LTIuNTM3LTEuODQySDY0LjUzMmMtMS4xNTMtMC4wMDEtMi4xNzgsMC43MzYtMi41NDIsMS44MzFMMTMuODQ3LDE3My40NTdjLTAuMjcxLDAuODE2LTAuMTM1LDEuNzEzLDAuMzY5LDIuNDEyYzAuNTAzLDAuNjk3LDEuMzExLDEuMTA5LDIuMTcxLDEuMTA5aDE1Ljg3MmMxLjE1MSwwLDIuMTczLTAuNzM2LDIuNTM3LTEuODI4bDkuNzkzLTI5LjI4N0M0NS4zMjUsMTQzLjY2LDQ3LjM5LDE0Mi4xOCw0OS43MTEsMTQyLjE4OEw0OS43MTEsMTQyLjE4OHogTTUzLjQ5MywxMTkuMDk4bDE1LjYwNy00Ni45YzAuNzQ0LTIuMTk2LDIuODA2LTMuNjc0LDUuMTI1LTMuNjc0czQuMzgxLDEuNDc4LDUuMTI1LDMuNjc0bDE1LjYwNyw0Ni45MDRjMC41MzcsMS42MjEsMC4yNjMsMy40MDItMC43MzYsNC43ODljLTEuMDE4LDEuNDA4LTIuNjQ5LDIuMjQtNC4zODYsMi4yNEg1OC42MTVjLTEuNzM2LDAtMy4zNjgtMC44MzItNC4zODYtMi4yNEM1My4yMywxMjIuNTA0LDUyLjk1NiwxMjAuNzIxLDUzLjQ5MywxMTkuMDk4TDUzLjQ5MywxMTkuMDk4eiBNMTkwLjQ2NSw2My4zMmMwLTIuOTE5LTEuMDE1LTUuMzk2LTMuMDU5LTcuNDI4Yy0yLjAyOS0yLjAzMS00LjQ5Ni0zLjA0Ny03LjM4My0zLjA0N2MtMi44ODksMC01LjM1NSwxLjAxNi03LjM4OCwzLjA0N2MtMi4wMjksMi4wMzItMy4wNTYsNC40OTgtMy4wNTYsNy4zODZjMCwyLjg4OSwxLjAyNiw1LjM1NCwzLjA1Niw3LjM4NWMyLjAzMiwyLjAzMiw0LjQ5OSwzLjA1OSw3LjM4OCwzLjA1OWMyLjg4NywwLDUuMzU0LTEuMDI2LDcuMzgzLTMuMDU5QzE4OS40NSw2OC42MzMsMTkwLjQ2NSw2Ni4xNzgsMTkwLjQ2NSw2My4zMkwxOTAuNDY1LDYzLjMyeiBNMTkwLjQ2NSwxMDEuOTk0YzAtMi44NTgtMS4wMTUtNS4zMTMtMy4wNTktNy4zMzNjLTIuMDI5LTIuMDQyLTQuNDk2LTMuMDQ3LTcuMzgzLTMuMDQ3Yy0yLjg4OSwwLTUuMzU1LDEuMDA1LTcuMzg4LDMuMDQ3Yy0yLjAyOSwyLjAyMS0zLjA1Niw0LjQ4Ni0zLjA1Niw3LjM3NmMwLDIuODg3LDEuMDI2LDUuMzUyLDMuMDU2LDcuMzk1YzIuMDMyLDIuMDIxLDQuNDk5LDMuMDQ3LDcuMzg4LDMuMDQ3YzIuODg3LDAsNS4zNTQtMS4wMjUsNy4zODMtMy4wNDdDMTg5LjQ1LDEwNy4zODksMTkwLjQ2NSwxMDQuOTE0LDE5MC40NjUsMTAxLjk5NEwxOTAuNDY1LDEwMS45OTR6IE0xOTAuNDY1LDE0MC43NmMwLTIuOTE4LTEuMDE1LTUuMzk1LTMuMDU5LTcuNDM4Yy0yLjAyOS0yLjA0MS00LjQ5Ni0zLjA0Ny03LjM4My0zLjA0N2MtMi44ODksMC01LjM1NSwxLjAwNi03LjM4OCwzLjA0N2MtMi4wMjksMi4wNDMtMy4wNTYsNC41Mi0zLjA1Niw3LjQzOGMwLDIuOTIyLDEuMDI2LDUuMzk4LDMuMDU2LDcuNDM5YzIuMDMyLDIuMDIxLDQuNDk5LDMuMDQ3LDcuMzg4LDMuMDQ3YzIuODg3LDAsNS4zNTQtMS4wMjUsNy4zODMtMy4wNDdDMTg5LjQ1LDE0Ni4xNTgsMTkwLjQ2NSwxNDMuNjgyLDE5MC40NjUsMTQwLjc2TDE5MC40NjUsMTQwLjc2elwiLz48L2c+PC9zdmc+JyxcbiAgIG1vcmVfcGFyYWdyYXBoOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjEwIDEwIDE4MCAxODBcIj48Zz48cGF0aCBkPVwiTTEyOC4zOSwyOC40OTlINjMuNDkzYy0yNS41NTgsMC00Ni4zNTQsMjAuNzk2LTQ2LjM1NCw0Ni4zNTRjMCwyNS41NTksMjAuNzk2LDQ2LjM1Myw0Ni4zNTQsNDYuMzUzaDkuMjcxdjU1LjYyNWgxOC41NDJWNDcuMDRoOS4yNzFWMTc2LjgzaDE4LjU0M1Y0Ny4wNGg5LjI3MVYyOC40OTl6IE03Mi43NjQsMTAyLjY2NGgtOS4yNzFjLTE1LjMzNywwLTI3LjgxMy0xMi40NzUtMjcuODEzLTI3LjgxMmMwLTE1LjMzNiwxMi40NzYtMjcuODEzLDI3LjgxMy0yNy44MTNoOS4yNzFWMTAyLjY2NHogTTE5MC40NjUsNjMuMzJjMC0yLjkxOS0xLjAxNS01LjM5Ni0zLjA1OS03LjQyOGMtMi4wMjktMi4wMzEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMTYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDMyLTMuMDU2LDQuNDk4LTMuMDU2LDcuMzg2YzAsMi44ODksMS4wMjYsNS4zNTQsMy4wNTYsNy4zODVjMi4wMzIsMi4wMzIsNC40OTksMy4wNTksNy4zODgsMy4wNTljMi44ODcsMCw1LjM1NC0xLjAyNiw3LjM4My0zLjA1OUMxODkuNDUsNjguNjMzLDE5MC40NjUsNjYuMTc4LDE5MC40NjUsNjMuMzJMMTkwLjQ2NSw2My4zMnogTTE5MC40NjUsMTAxLjk5NGMwLTIuODU4LTEuMDE1LTUuMzEzLTMuMDU5LTcuMzMzYy0yLjAyOS0yLjA0Mi00LjQ5Ni0zLjA0Ny03LjM4My0zLjA0N2MtMi44ODksMC01LjM1NSwxLjAwNS03LjM4OCwzLjA0N2MtMi4wMjksMi4wMjEtMy4wNTYsNC40ODYtMy4wNTYsNy4zNzZjMCwyLjg4NywxLjAyNiw1LjM1MiwzLjA1Niw3LjM5NWMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxMDcuMzg5LDE5MC40NjUsMTA0LjkxNCwxOTAuNDY1LDEwMS45OTRMMTkwLjQ2NSwxMDEuOTk0eiBNMTkwLjQ2NSwxNDAuNzZjMC0yLjkxOC0xLjAxNS01LjM5NS0zLjA1OS03LjQzOGMtMi4wMjktMi4wNDEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMDYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDQzLTMuMDU2LDQuNTItMy4wNTYsNy40MzhjMCwyLjkyMiwxLjAyNiw1LjM5OCwzLjA1Niw3LjQzOWMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxNDYuMTU4LDE5MC40NjUsMTQzLjY4MiwxOTAuNDY1LDE0MC43NkwxOTAuNDY1LDE0MC43NnpcIi8+PC9nPjwvc3ZnPicsXG4gICBtb3JlX3BsdXM6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMzUgMzAgMTQwIDE0MFwiPjxnPjxwYXRoIGQ9XCJNMTM3LjIxNSwxMDIuMDQ1YzAsMy40OTgtMi44MzUsNi4zMzItNi4zMzMsNi4zMzJIMjQuNTQ5Yy0zLjQ5OCwwLTYuMzM0LTIuODM0LTYuMzM0LTYuMzMybDAsMGMwLTMuNDk4LDIuODM2LTYuMzMzLDYuMzM0LTYuMzMzaDEwNi4zMzNDMTM0LjM4LDk1LjcxMSwxMzcuMjE1LDk4LjU0NywxMzcuMjE1LDEwMi4wNDVMMTM3LjIxNSwxMDIuMDQ1eiBNNzcuNzE1LDE2MS41NDVjLTMuNDk4LDAtNi4zMzMtMi44MzYtNi4zMzMtNi4zMzRWNDguODc4YzAtMy40OTgsMi44MzYtNi4zMzMsNi4zMzMtNi4zMzNsMCwwYzMuNDk4LDAsNi4zMzQsMi44MzUsNi4zMzQsNi4zMzN2MTA2LjMzM0M4NC4wNDksMTU4LjcwOSw4MS4yMTMsMTYxLjU0NSw3Ny43MTUsMTYxLjU0NUw3Ny43MTUsMTYxLjU0NXogTTE5MC40NjUsNjMuMzJjMC0yLjkxOS0xLjAxNS01LjM5Ni0zLjA1OS03LjQyOGMtMi4wMjktMi4wMzEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMTYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDMyLTMuMDU2LDQuNDk4LTMuMDU2LDcuMzg2YzAsMi44ODksMS4wMjYsNS4zNTQsMy4wNTYsNy4zODVjMi4wMzIsMi4wMzIsNC40OTksMy4wNTksNy4zODgsMy4wNTljMi44ODcsMCw1LjM1NC0xLjAyNiw3LjM4My0zLjA1OUMxODkuNDUsNjguNjMyLDE5MC40NjUsNjYuMTc3LDE5MC40NjUsNjMuMzJMMTkwLjQ2NSw2My4zMnogTTE5MC40NjUsMTAxLjk5M2MwLTIuODU4LTEuMDE1LTUuMzEzLTMuMDU5LTcuMzMzYy0yLjAyOS0yLjA0Mi00LjQ5Ni0zLjA0Ny03LjM4My0zLjA0N2MtMi44ODksMC01LjM1NSwxLjAwNS03LjM4OCwzLjA0N2MtMi4wMjksMi4wMjEtMy4wNTYsNC40ODYtMy4wNTYsNy4zNzZjMCwyLjg4OCwxLjAyNiw1LjM1MywzLjA1Niw3LjM5NmMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxMDcuMzg5LDE5MC40NjUsMTA0LjkxNCwxOTAuNDY1LDEwMS45OTNMMTkwLjQ2NSwxMDEuOTkzeiBNMTkwLjQ2NSwxNDAuNzZjMC0yLjkxOC0xLjAxNS01LjM5NS0zLjA1OS03LjQzOGMtMi4wMjktMi4wNDEtNC40OTYtMy4wNDctNy4zODMtMy4wNDdjLTIuODg5LDAtNS4zNTUsMS4wMDYtNy4zODgsMy4wNDdjLTIuMDI5LDIuMDQzLTMuMDU2LDQuNTItMy4wNTYsNy40MzhjMCwyLjkyMiwxLjAyNiw1LjM5OCwzLjA1Niw3LjQzOWMyLjAzMiwyLjAyMSw0LjQ5OSwzLjA0Nyw3LjM4OCwzLjA0N2MyLjg4NywwLDUuMzU0LTEuMDI1LDcuMzgzLTMuMDQ3QzE4OS40NSwxNDYuMTU4LDE5MC40NjUsMTQzLjY4MiwxOTAuNDY1LDE0MC43NkwxOTAuNDY1LDE0MC43NnpcIi8+PC9nPjwvc3ZnPicsXG4gICBtb3JlX2hvcml6b250YWw6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE1Ljc2IDMuNThcIj48Zz48cGF0aCBkPVwiTTQuNjQsMTAuNzNhMS44NCwxLjg0LDAsMCwxLC42NS0uNjUsMS43NiwxLjc2LDAsMCwxLDEuNzksMEExLjc5LDEuNzksMCwwLDEsOCwxMS42M2ExLjg0LDEuODQsMCwwLDEtLjI1LjksMS42OSwxLjY5LDAsMCwxLS42NS42NSwxLjgsMS44LDAsMCwxLTIuNjktMS41NUEyLjA4LDIuMDgsMCwwLDEsNC42NCwxMC43M1ptNi4wOSwwYTEuODQsMS44NCwwLDAsMSwuNjUtLjY1LDEuNzgsMS43OCwwLDAsMSwyLjY3LDEuNTUsMS43MywxLjczLDAsMCwxLS4yNC45LDEuODQsMS44NCwwLDAsMS0uNjUuNjUsMS43NiwxLjc2LDAsMCwxLTEuNzksMCwxLjc5LDEuNzksMCwwLDEtLjY0LTIuNDRabTYuMDgsMGExLjY5LDEuNjksMCwwLDEsLjY1LS42NSwxLjc2LDEuNzYsMCwwLDEsMS43OSwwLDEuNzksMS43OSwwLDAsMSwuOSwxLjU0LDEuNzMsMS43MywwLDAsMS0uMjQuOSwxLjg0LDEuODQsMCwwLDEtLjY1LjY1LDEuOCwxLjgsMCwwLDEtMi42OS0xLjU1QTIsMiwwLDAsMSwxNi44MSwxMC43M1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuMzkgLTkuODQpXCIvPjwvZz48L3N2Zz4nLFxuICAgbW9yZV92ZXJ0aWNhbDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMy45NCAxNS43NVwiPjxnPjxwYXRoIGQ9XCJNMTIuMjgsNy42OWExLjkyLDEuOTIsMCwwLDEtMS4zOS0uNTgsMiwyLDAsMCwxLS41OC0xLjM5LDEuOTIsMS45MiwwLDAsMSwuNTgtMS4zOSwyLDIsMCwwLDEsMS4zOS0uNTgsMS45MiwxLjkyLDAsMCwxLDEuMzkuNTgsMiwyLDAsMCwxLC41OCwxLjM5LDEuOTIsMS45MiwwLDAsMS0uNTgsMS4zOSwyLDIsMCwwLDEtMS4zOS41OFptMCwyYTEuOTIsMS45MiwwLDAsMSwxLjM5LjU4LDIsMiwwLDAsMSwuNTgsMS4zOUExLjkyLDEuOTIsMCwwLDEsMTMuNjcsMTNhMiwyLDAsMCwxLTEuMzkuNThBMS45MiwxLjkyLDAsMCwxLDEwLjg5LDEzYTIsMiwwLDAsMS0uNTgtMS4zOSwyLDIsMCwwLDEsMi0yWm0wLDUuOWExLjkyLDEuOTIsMCwwLDEsMS4zOS41OCwyLDIsMCwwLDEsLjU4LDEuMzksMS45MiwxLjkyLDAsMCwxLS41OCwxLjM5LDIsMiwwLDAsMS0xLjM5LjU4LDEuOTIsMS45MiwwLDAsMS0xLjM5LS41OCwyLDIsMCwwLDEtLjU4LTEuMzksMS45MiwxLjkyLDAsMCwxLC41OC0xLjM5LDEuOTQsMS45NCwwLDAsMSwxLjM5LS41OFpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTEwLjMxIC0zLjc1KVwiLz48L2c+PC9zdmc+JyxcbiAgIC8vIE5vdCBjdXJyZW50bHkgdXNlZFxuICAgYXR0YWNobWVudDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgOC4zOCAxNS42OFwiPjxnPjxwYXRoIGQ9XCJNMTUuMjMsNmgxdjkuNzhhMy44OCwzLjg4LDAsMCwxLTEuMzEsMi40NSw0LDQsMCwwLDEtNi41Ny0yLjQ1VjdBMywzLDAsMCwxLDkuMiw0Ljg5YTMsMywwLDAsMSw1LDIuMDl2OC4zMWExLjkyLDEuOTIsMCwwLDEtLjU4LDEuMzksMiwyLDAsMCwxLTEuMzkuNTgsMS45MiwxLjkyLDAsMCwxLTEuMzktLjU4LDIsMiwwLDAsMS0uNTgtMS4zOVY4aDF2Ny4zMmExLDEsMCwwLDAsLjI5LjY5LDEsMSwwLDAsMCwuNjkuMjhBLjkuOSwwLDAsMCwxMywxNmExLDEsMCwwLDAsLjI5LS42OVY3YTEuOTIsMS45MiwwLDAsMC0uNTgtMS4zOUEyLDIsMCwwLDAsMTEuMjcsNWExLjkyLDEuOTIsMCwwLDAtMS4zOS41OEEyLDIsMCwwLDAsOS4zMyw3djguMzFhMywzLDAsMSwwLDUuOSwwVjZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC04LjA4IC0zLjc4KVwiLz48L2c+PC9zdmc+JyxcbiAgIG1hcDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTEuNyAxNS42MlwiPjxnPjxwYXRoIGQ9XCJNMTIuMDUsMTIuNDJhMi45MywyLjkzLDAsMSwxLDIuMDctNUEyLjg4LDIuODgsMCwwLDEsMTUsOS40OWEzLDMsMCwwLDEtLjg2LDIuMDcsMi44OSwyLjg5LDAsMCwxLTIuMDcuODZabTAtNS4zNmEyLjQzLDIuNDMsMCwwLDAtMS43Miw0LjE2LDIuNDgsMi40OCwwLDAsMCwxLjcyLjcyLDIuNDQsMi40NCwwLDAsMCwwLTQuODhabTAtMy4zQTUuODQsNS44NCwwLDAsMSwxNy45LDkuNjJhOS45NCw5Ljk0LDAsMCwxLTEuNzMsNUEzMy41OSwzMy41OSwwLDAsMSwxMi44NCwxOWExLjUyLDEuNTIsMCwwLDEtLjIzLjIsMSwxLDAsMCwxLS41NS4yaDBhMSwxLDAsMCwxLS41NS0uMiwxLjUyLDEuNTIsMCwwLDEtLjIzLS4yLDMzLjU5LDMzLjU5LDAsMCwxLTMuMzMtNC4zMiw5LjkzLDkuOTMsMCwwLDEtMS43Mi01LDUuODQsNS44NCwwLDAsMSw1Ljg1LTUuODZaTTEyLDE4LjM0bC4wOC4wNS4wNi0uMDZhMzUuNTgsMzUuNTgsMCwwLDAsMy4wNi0zLjkzLDkuMzUsOS4zNSwwLDAsMCwxLjc0LTQuNzcsNC44OCw0Ljg4LDAsMCwwLTQuODgtNC44OEE0Ljc5LDQuNzksMCwwLDAsOC42LDYuMTcsNC44NCw0Ljg0LDAsMCwwLDcuMTcsOS42Miw5LjI5LDkuMjksMCwwLDAsOC45MSwxNC40LDM2LDM2LDAsMCwwLDEyLDE4LjM0WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNi4yIC0zLjc2KVwiLz48L2c+PC9zdmc+JyxcbiAgIG1hZ2ljX3N0aWNrOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNS43MyAxNS43NVwiPjxnPjxwYXRoIGQ9XCJNMTkuODYsMTkuMjFhMSwxLDAsMCwwLC4yOC0uNjgsMSwxLDAsMCwwLS4yOC0uN0wxMywxMC45M2ExLDEsMCwwLDAtLjctLjI4LDEsMSwwLDAsMC0uNjgsMS42NWw2LjksNi45YTEsMSwwLDAsMCwuNjkuMjkuOTMuOTMsMCwwLDAsLjY5LS4yOFpNOS4xOSw4LjU1YTMsMywwLDAsMCwxLjY4LDAsMTQuMTIsMTQuMTIsMCwwLDAsMS40MS0uMzJBMTEuMjYsMTEuMjYsMCwwLDAsMTAuOCw3LjA2Yy0uNTYtLjM2LS44Ni0uNTYtLjkxLS41OFMxMCw1LjkxLDEwLDUuMTFzMC0xLjI2LS4xNS0xLjM3YTQuMzUsNC4zNSwwLDAsMC0xLjE5LjcxYy0uNTMuNC0uODEuNjItLjg3LjY4YTksOSwwLDAsMC0yLS42LDYuODQsNi44NCwwLDAsMC0uNzYtLjA5czAsLjI3LjA4Ljc3YTguNiw4LjYsMCwwLDAsLjYxLDJxLS4wOS4wOS0uNjkuODdhMy41OSwzLjU5LDAsMCwwLS42OCwxLjE3Yy4xMi4xNy41Ny4yMywxLjM2LjE1UzcsOS4yNiw3LjE1LDkuMjNzLjIxLjM2LjU3LjkxYTEwLjQ5LDEwLjQ5LDAsMCwwLDEuMTQsMS40OGMwLS4xLjE0LS41Ny4zMS0xLjRhMywzLDAsMCwwLDAtMS42N1pcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQuNDEgLTMuNzQpXCIvPjwvZz48L3N2Zz4nLFxuICAgZW1wdHlfZmlsZTogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTIuNzggMTUuNzVcIj48Zz48cGF0aCBkPVwiTTE0LjczLDMuNzYsMTguNjcsNy43djkuODRhMiwyLDAsMCwxLTIsMkg3Ljg0YTEuODksMS44OSwwLDAsMS0xLjM4LS41OCwyLDIsMCwwLDEtLjU3LTEuMzlWNS43M2ExLjkzLDEuOTMsMCwwLDEsLjU3LTEuMzgsMiwyLDAsMCwxLDEuMzgtLjU4aDYuNjJsLjI2LDB2MFptMi45NSw0LjkyaC0yYTEuOTMsMS45MywwLDAsMS0xLjM4LS41NywyLDIsMCwwLDEtLjU4LTEuNFY2LjE3YzAtLjM2LDAtLjg0LDAtMS40M0g3Ljg1YTEsMSwwLDAsMC0uNy4yOSwxLDEsMCwwLDAtLjI5LjdWMTcuNTRhMSwxLDAsMCwwLC4yOS42OSwxLDEsMCwwLDAsLjY5LjI5aDguODVhMSwxLDAsMCwwLC43MS0uMjkuOTIuOTIsMCwwLDAsLjI4LS42OVptMC0xTDE0LjczLDQuNzR2MkExLDEsMCwwLDAsMTUsNy40YTEsMSwwLDAsMCwuNjkuMjlaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC01Ljg5IC0zLjc2KVwiLz48L2c+PC9zdmc+J1xufTtcbiIsIi8qXHJcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxyXG4gKlxyXG4gKiBzdW5lZGl0b3IuanNcclxuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cclxuICogTUlUIGxpY2Vuc2UuXHJcbiAqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIHV0aWxpdHkgZnVuY3Rpb25cclxuICovXHJcbmNvbnN0IHV0aWwgPSB7XHJcbiAgICBfZDogbnVsbCxcclxuICAgIF93OiBudWxsLFxyXG4gICAgaXNJRTogbnVsbCxcclxuICAgIGlzSUVfRWRnZTogbnVsbCxcclxuICAgIGlzT1NYX0lPUzogbnVsbCxcclxuICAgIF9wcm9wZXJ0aWVzSW5pdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fZCA9ICBkb2N1bWVudDtcclxuICAgICAgICB0aGlzLl93ID0gd2luZG93O1xyXG4gICAgICAgIHRoaXMuaXNJRSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudCcpID4gLTE7XHJcbiAgICAgICAgdGhpcy5pc0lFX0VkZ2UgPSAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgPiAtMSkgfHwgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ0VkZ2UnKSA+IC0xKTtcclxuICAgICAgICB0aGlzLmlzT1NYX0lPUyA9IC8oTWFjfGlQaG9uZXxpUG9kfGlQYWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk7XHJcbiAgICB9LFxyXG5cclxuICAgIF9hbGxvd2VkRW1wdHlOb2RlTGlzdDogJy5zZS1jb21wb25lbnQsIHByZSwgYmxvY2txdW90ZSwgaHIsIGxpLCB0YWJsZSwgaW1nLCBpZnJhbWUsIHZpZGVvLCBhdWRpbywgY2FudmFzJyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBIVE1MIFJlc2VydmVkIFdvcmQgQ29udmVydGVyLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIFxyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gSFRNTCBzdHJpbmdcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9IVE1MQ29udmVydG9yOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICBjb25zdCBlYyA9IHsnJic6ICcmYW1wOycsICdcXHUwMEEwJzogJyZuYnNwOycsICdcXCcnOiAnJmFwb3M7JywgJ1wiJzogJyZxdW90OycsICc8JzrCoCcmbHQ7JyzCoCc+JzrCoCcmZ3Q7J307XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoLyZ8XFx1MDBBMHwnfFwifDx8Pi9nLCBmdW5jdGlvbiAobSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBlY1ttXSA9PT0gJ3N0cmluZycpID8gZWNbbV0gOiBtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBVbmljb2RlIENoYXJhY3RlciAnWkVSTyBXSURUSCBTUEFDRScgKFxcdTIwMEIpXHJcbiAgICAgKi9cclxuICAgIHplcm9XaWR0aFNwYWNlOiBTdHJpbmcuZnJvbUNoYXJDb2RlKDgyMDMpLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBmaW5kICd6ZXJvIHdpZHRoIHNwYWNlJyAoL1xcdTIwMEIvZylcclxuICAgICAqL1xyXG4gICAgemVyb1dpZHRoUmVnRXhwOiBuZXcgUmVnRXhwKFN0cmluZy5mcm9tQ2hhckNvZGUoODIwMyksICdnJyksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVndWxhciBleHByZXNzaW9uIHRvIGZpbmQgb25seSAnemVybyB3aWR0aCBzcGFjZScgKC9eXFx1MjAwQiskLylcclxuICAgICAqL1xyXG4gICAgb25seVplcm9XaWR0aFJlZ0V4cDogbmV3IFJlZ0V4cCgnXicgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKDgyMDMpICsgJyskJyksXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQSBtZXRob2QgdGhhdCBjaGVja3MgSWYgdGhlIHRleHQgaXMgYmxhbmsgb3IgdG8gc2VlIGlmIGl0IGNvbnRhaW5zICdaRVJPIFdJRFRIIFNQQUNFJyBvciBlbXB0eSAodXRpbC56ZXJvV2lkdGhTcGFjZSlcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE5vZGV9IHRleHQgU3RyaW5nIHZhbHVlIG9yIE5vZGVcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBvbmx5WmVyb1dpZHRoU3BhY2U6IGZ1bmN0aW9uICh0ZXh0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykgdGV4dCA9IHRleHQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRleHQgPT09ICcnIHx8IHRoaXMub25seVplcm9XaWR0aFJlZ0V4cC50ZXN0KHRleHQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIFhNTEh0dHBSZXF1ZXN0IG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1hNTEh0dHBSZXF1ZXN0fEFjdGl2ZVhPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIGdldFhNTEh0dHBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLyoqIElFICovXHJcbiAgICAgICAgaWYgKHRoaXMuX3cuQWN0aXZlWE9iamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqIG5ldHNjYXBlICovXHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdy5YTUxIdHRwUmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKiBmYWlsICovXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIEVsZW1lbnQgbm9kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVsZW1lbnROYW1lIEVsZW1lbnQgbmFtZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50TmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGV4dCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCB0ZXh0IGNvbnRlbnRzXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVGV4dE5vZGU6IGZ1bmN0aW9uICh0ZXh0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QuY3JlYXRlVGV4dE5vZGUodGV4dCB8fCAnJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSBlZGl0b3IgY2hlY2tzIHRhZ3MgYnkgc3RyaW5nLlxyXG4gICAgICogSWYgdGhlcmUgaXMgXCI8XCIgb3IgXCI+XCIgaW4gdGhlIGF0dHJpYnV0ZSBvZiB0YWcsIEhUTUwgaXMgYnJva2VuIHdoZW4gY2hlY2tpbmcgdGhlIHRhZy5cclxuICAgICAqIFdoZW4gdXNpbmcgYW4gYXR0cmlidXRlIHdpdGggXCI8XCIgb3IgXCI+XCIsIHVzZSBcIkhUTUxFbmNvZGVyXCIgdG8gc2F2ZS4gKGV4OiBtYXRoKGthdGV4KSlcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyBIVE1MIG9yIFRleHQgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBIVE1MRW5jb2RlcjogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgY29uc3QgZWMgPSB7JzwnOsKgJyRsdDsnLMKgJz4nOsKgJyRndDsnfTtcclxuICAgICAgICByZXR1cm4gY29udGVudHMucmVwbGFjZSgvPHw+L2csIGZ1bmN0aW9uIChtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAodHlwZW9mIGVjW21dID09PSAnc3RyaW5nJykgPyBlY1ttXSA6IG07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSBlZGl0b3IgY2hlY2tzIHRhZ3MgYnkgc3RyaW5nLlxyXG4gICAgICogSWYgdGhlcmUgaXMgXCI8XCIgb3IgXCI+XCIgaW4gdGhlIGF0dHJpYnV0ZSBvZiB0YWcsIEhUTUwgaXMgYnJva2VuIHdoZW4gY2hlY2tpbmcgdGhlIHRhZy5cclxuICAgICAqIERlY29kZXIgb2YgZGF0YSBzdG9yZWQgYXMgXCJIVE1MRW5jb2RlclwiIChleDogbWF0aChrYXRleCkpXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgSFRNTCBvciBUZXh0IHN0cmluZ1xyXG4gICAgICogQHJldHVybnMge1N0cmluZ31cclxuICAgICAqL1xyXG4gICAgSFRNTERlY29kZXI6IGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgIGNvbnN0IGVjID0geyckbHQ7JzrCoCc8JyzCoCckZ3Q7JzrCoCc+J307XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoL1xcJGx0O3xcXCRndDsvZywgZnVuY3Rpb24gKG0pIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgZWNbbV0gPT09ICdzdHJpbmcnKSA/IGVjW21dIDogbTtcclxuICAgICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgcnVuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IG9iai5rZXlcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBoYXNPd246IGZ1bmN0aW9uIChvYmosIGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNPd24uY2FsbChvYmosIGtleSk7XHJcbiAgICB9LFxyXG4gICAgX2hhc093bjogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSB0aGUgdGFnIHBhdGggb2YgdGhlIGFyZ3VtZW50cyB2YWx1ZVxyXG4gICAgICogSWYgbm90IGZvdW5kLCByZXR1cm4gdGhlIGZpcnN0IGZvdW5kIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBuYW1lQXJyYXkgRmlsZSBuYW1lIGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXh0ZW5zaW9uIGpzLCBjc3NcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldEluY2x1ZGVQYXRoOiBmdW5jdGlvbiAobmFtZUFycmF5LCBleHRlbnNpb24pIHtcclxuICAgICAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgICAgIGNvbnN0IHBhdGhMaXN0ID0gW107XHJcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IGV4dGVuc2lvbiA9PT0gJ2pzJyA/ICdzY3JpcHQnIDogJ2xpbmsnO1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IGV4dGVuc2lvbiA9PT0gJ2pzJyA/ICdzcmMnIDogJ2hyZWYnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9ICcoPzonO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBuYW1lQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgKz0gbmFtZUFycmF5W2ldICsgKGkgPCBsZW4gLSAxID8gJ3wnIDogJyknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZ0V4cCA9IG5ldyB0aGlzLl93LlJlZ0V4cCgnKF58LipbXFxcXC9dKScgKyBmaWxlTmFtZSArICcoXFxcXC5bXlxcXFwvXSspP1xcLicgKyBleHRlbnNpb24gKyAnKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgIGNvbnN0IGV4dFJlZ0V4cCA9IG5ldyB0aGlzLl93LlJlZ0V4cCgnLitcXFxcLicgKyBleHRlbnNpb24gKyAnKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5fZC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSwgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChleHRSZWdFeHAudGVzdChjW2ldW3NyY10pKSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTGlzdC5wdXNoKGNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlZGl0b3JUYWcgPSBwYXRoTGlzdFtpXVtzcmNdLm1hdGNoKHJlZ0V4cCk7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3JUYWcpIHtcclxuICAgICAgICAgICAgICAgIHBhdGggPSBlZGl0b3JUYWdbMF07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhdGggPT09ICcnKSBwYXRoID0gcGF0aExpc3QubGVuZ3RoID4gMCA/IHBhdGhMaXN0WzBdW3NyY10gOiAnJztcclxuXHJcbiAgICAgICAgLTEgPT09IHBhdGguaW5kZXhPZignOi8nKSAmJiAnLy8nICE9PSBwYXRoLnNsaWNlKDAsIDIpICYmIChwYXRoID0gMCA9PT0gcGF0aC5pbmRleE9mKCcvJykgPyBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eLio/OlxcL1xcL1teXFwvXSovKVswXSArIHBhdGggOiBsb2NhdGlvbi5ocmVmLm1hdGNoKC9eW15cXD9dKlxcLyg/OikvKVswXSArIHBhdGgpO1xyXG5cclxuICAgICAgICBpZiAoIXBhdGgpIHRocm93ICdbU1VORURJVE9SLnV0aWwuZ2V0SW5jbHVkZVBhdGguZmFpbF0gVGhlIFNVTkVESVRPUiBpbnN0YWxsYXRpb24gcGF0aCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gKG5hbWU6ICsnICsgbmFtZSArICcsIGV4dGVuc2lvbjogJyArIGV4dGVuc2lvbiArICcpJztcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWRcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBDU1MgdGV4dCB0aGF0IGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgcGFnZS5cclxuICAgICAqIEBwYXJhbSB7RG9jdW1lbnR8bnVsbH0gZG9jIFRvIGdldCB0aGUgQ1NTIHRleHQgb2YgYW4gZG9jdW1lbnQoY29yZS5fd2QpLiBJZiBudWxsIGdldCB0aGUgY3VycmVudCBkb2N1bWVudC5cclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFN0eWxlcyBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgZ2V0UGFnZVN0eWxlOiBmdW5jdGlvbiAoZG9jKSB7XHJcbiAgICAgICAgbGV0IGNzc1RleHQgPSAnJztcclxuICAgICAgICBjb25zdCBzaGVldHMgPSAoZG9jIHx8IHRoaXMuX2QpLnN0eWxlU2hlZXRzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzaGVldHMubGVuZ3RoLCBydWxlczsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBydWxlcyA9IHNoZWV0c1tpXS5jc3NSdWxlcztcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChydWxlcykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNMZW4gPSBydWxlcy5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IHJ1bGVzW2NdLmNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjc3NUZXh0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIGFyZ3VtZW50IGlmcmFtZSdzIGRvY3VtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBpZnJhbWUgSWZyYW1lIGVsZW1lbnQgKGNvbnRleHQuZWxlbWVudC53eXNpd3lnRnJhbWUpXHJcbiAgICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldElmcmFtZURvY3VtZW50OiBmdW5jdGlvbiAoaWZyYW1lKSB7XHJcbiAgICAgICAgbGV0IHdEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICAgICAgaWYgKHdEb2N1bWVudC5kb2N1bWVudCkgd0RvY3VtZW50ID0gd0RvY3VtZW50LmRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiB3RG9jdW1lbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBhdHRyaWJ1dGVzIG9mIGFyZ3VtZW50IGVsZW1lbnQgdG8gc3RyaW5nICgnY2xhc3M9XCItLS1cIiBuYW1lPVwiLS0tXCIgJylcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtBcnJheXxudWxsfSBleGNlcHRBdHRycyBBcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSByZXN1bHRcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgKi9cclxuICAgIGdldEF0dHJpYnV0ZXNUb1N0cmluZzogZnVuY3Rpb24gKGVsZW1lbnQsIGV4Y2VwdEF0dHJzKSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50LmF0dHJpYnV0ZXMpIHJldHVybiAnJztcclxuXHJcbiAgICAgICAgY29uc3QgYXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgbGV0IGF0dHJTdHJpbmcgPSAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChleGNlcHRBdHRycyAmJiBleGNlcHRBdHRycy5pbmRleE9mKGF0dHJzW2ldLm5hbWUpID4gLTEpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBhdHRyU3RyaW5nICs9IGF0dHJzW2ldLm5hbWUgKyAnPVwiJyArIGF0dHJzW2ldLnZhbHVlICsgJ1wiICc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXR0clN0cmluZztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25HZXRzIEdldCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGEgc3RyaW5nLlxyXG4gICAgICogcmVmZXJlbmNpbmcgY29kZTogXCJodHRwczovL2dpdGh1Yi5jb20vc2hhYW4xOTc0L215cmRpbi9ibG9iL21hc3Rlci9leHByZXNzaW9ucy9zdHJpbmcuanMjTDExXCJcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFN0cmluZyB0ZXh0XHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRCeXRlTGVuZ3RoOiBmdW5jdGlvbih0ZXh0KSB7XHJcbiAgICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0LnRvU3RyaW5nKSByZXR1cm4gMDtcclxuICAgICAgICB0ZXh0ID0gdGV4dC50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBjb25zdCBlbmNvZGVyID0gdGhpcy5fdy5lbmNvZGVVUklDb21wb25lbnQ7XHJcbiAgICAgICAgbGV0IGNyLCBjbDtcclxuICAgICAgICBpZiAodGhpcy5pc0lFX0VkZ2UpIHtcclxuICAgICAgICAgICAgY2wgPSB0aGlzLl93LnVuZXNjYXBlKGVuY29kZXIodGV4dCkpLmxlbmd0aDtcclxuICAgICAgICAgICAgY3IgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVuY29kZXIodGV4dCkubWF0Y2goLyglMEF8JTBEKS9naSkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNyID0gZW5jb2Rlcih0ZXh0KS5tYXRjaCgvKCUwQXwlMEQpL2dpKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjbCArIGNyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNsID0gKG5ldyB0aGlzLl93LlRleHRFbmNvZGVyKCd1dGYtOCcpLmVuY29kZSh0ZXh0KSkubGVuZ3RoO1xyXG4gICAgICAgICAgICBjciA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW5jb2Rlcih0ZXh0KS5tYXRjaCgvKCUwQXwlMEQpL2dpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY3IgPSBlbmNvZGVyKHRleHQpLm1hdGNoKC8oJTBBfCUwRCkvZ2kpLmxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNsICsgY3I7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBqdWRnZWQgd2hldGhlciBpdCBpcyB0aGUgZWRpdCByZWdpb24gdG9wIGRpdiBlbGVtZW50IG9yIGlmcmFtZSdzIGJvZHkgdGFnLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNXeXNpd3lnRGl2OiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMuaGFzQ2xhc3MoZWxlbWVudCwgJ3NlLXdyYXBwZXItd3lzaXd5ZycpIHx8IC9eQk9EWSQvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGNvbnRlbnRlZGl0YWJsZSBwcm9wZXJ0eSBpcyBmYWxzZS5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzTm9uRWRpdGFibGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICdmYWxzZSc7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIGEgbm9kZSByZWxhdGVkIHRvIHRoZSB0ZXh0IHN0eWxlLlxyXG4gICAgICogKHN0cm9uZ3xzcGFufGZvbnR8Ynx2YXJ8aXxlbXx1fGluc3xzfHN0cmlrZXxkZWx8c3VifHN1cHxtYXJrfGF8bGFiZWx8Y29kZSlcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzVGV4dFN0eWxlRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAzICYmIC9eKHN0cm9uZ3xzcGFufGZvbnR8Ynx2YXJ8aXxlbXx1fGluc3xzfHN0cmlrZXxkZWx8c3VifHN1cHxtYXJrfGF8bGFiZWx8Y29kZSkkL2kudGVzdChlbGVtZW50Lm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGZvcm1hdCBlbGVtZW50IChQLCBESVYsIEhbMS02XSwgUFJFLCBMSSB8IGNsYXNzPVwiX19zZV9fZm9ybWF0X19yZXBsYWNlX3h4eFwiKVxyXG4gICAgICogRm9ybWF0IGVsZW1lbnQgYWxzbyBjb250YWluIFwiZnJlZSBmb3JtYXQgRWxlbWVudFwiXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc0Zvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAoL14oUHxESVZ8SFsxLTZdfFBSRXxMSXxUSHxURCkkL2kudGVzdChlbGVtZW50Lm5vZGVOYW1lKSB8fCB0aGlzLmhhc0NsYXNzKGVsZW1lbnQsICcoXFxcXHN8XilfX3NlX19mb3JtYXRfX3JlcGxhY2VfLisoXFxcXHN8JCl8KFxcXFxzfF4pX19zZV9fZm9ybWF0X19mcmVlXy4rKFxcXFxzfCQpJykpICYmICF0aGlzLmlzQ29tcG9uZW50KGVsZW1lbnQpICYmICF0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIHJhbmdlIGZvcm1hdCBlbGVtZW50LiAoQkxPQ0tRVU9URSwgT0wsIFVMLCBGSUdDQVBUSU9OLCBUQUJMRSwgVEhFQUQsIFRCT0RZLCBUUiwgVEgsIFREIHwgY2xhc3M9XCJfX3NlX19mb3JtYXRfX3JhbmdlX3h4eFwiKVxyXG4gICAgICogUmFuZ2UgZm9ybWF0IGVsZW1lbnQgaXMgd3JhcCB0aGUgXCJmb3JtYXQgZWxlbWVudFwiIGFuZCBcImNvbXBvbmVudFwiXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1JhbmdlRm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxICYmICgvXihCTE9DS1FVT1RFfE9MfFVMfEZJR0NBUFRJT058VEFCTEV8VEhFQUR8VEJPRFl8VFJ8VEh8VEQpJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgfHwgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnKFxcXFxzfF4pX19zZV9fZm9ybWF0X19yYW5nZV8uKyhcXFxcc3wkKScpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGNsb3N1cmUgcmFuZ2UgZm9ybWF0IGVsZW1lbnQuIChUSCwgVEQgfCBjbGFzcz1cIl9fc2VfX2Zvcm1hdF9fcmFuZ2VfX2Nsb3N1cmVfeHh4XCIpXHJcbiAgICAgKiBDbG9zdXJlIHJhbmdlIGZvcm1hdCBlbGVtZW50cyBpcyBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UgZm9ybWF0IGVsZW1lbnQuXHJcbiAgICAgKiAgLSBDbG9zdXJlIHJhbmdlIGZvcm1hdCBlbGVtZW50IGlzIHdyYXAgdGhlIFwiZm9ybWF0IGVsZW1lbnRcIiBhbmQgXCJjb21wb25lbnRcIlxyXG4gICAgICog4oC7IFlvdSBjYW5ub3QgZXhpdCB0aGlzIGZvcm1hdCB3aXRoIHRoZSBFbnRlciBrZXkgb3IgQmFja3NwYWNlIGtleS5cclxuICAgICAqIOKAuyBVc2UgaXQgb25seSBpbiBzcGVjaWFsIGNhc2VzLiAoW2V4XSBmb3JtYXQgb2YgdGFibGUgY2VsbHMpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIG5vZGUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc0Nsb3N1cmVSYW5nZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAoL14oVEh8VEQpJC9pLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkgfHwgdGhpcy5oYXNDbGFzcyhlbGVtZW50LCAnKFxcXFxzfF4pX19zZV9fZm9ybWF0X19yYW5nZV9fY2xvc3VyZV8uKyhcXFxcc3wkKScpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGZyZWUgZm9ybWF0IGVsZW1lbnQuIChQUkUgfCBjbGFzcz1cIl9fc2VfX2Zvcm1hdF9fZnJlZV94eHhcIilcclxuICAgICAqIEZyZWUgZm9ybWF0IGVsZW1lbnRzIGlzIGluY2x1ZGVkIGluIHRoZSBmb3JtYXQgZWxlbWVudC5cclxuICAgICAqIEZyZWUgZm9ybWF0IGVsZW1lbnRzJ3MgbGluZSBicmVhayBpcyBcIkJSXCIgdGFnLlxyXG4gICAgICog4oC7IEVudGVyaW5nIHRoZSBFbnRlciBrZXkgaW4gdGhlIHNwYWNlIG9uIHRoZSBsYXN0IGxpbmUgZW5kcyBcIkZyZWUgRm9ybWF0XCIgYW5kIGFwcGVuZHMgXCJGb3JtYXRcIi5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgbm9kZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzRnJlZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiAoL15QUkUkL2kudGVzdChlbGVtZW50Lm5vZGVOYW1lKSB8fCB0aGlzLmhhc0NsYXNzKGVsZW1lbnQsICcoXFxcXHN8XilfX3NlX19mb3JtYXRfX2ZyZWVfLisoXFxcXHN8JCknKSkgJiYgIXRoaXMuaXNDb21wb25lbnQoZWxlbWVudCkgJiYgIXRoaXMuaXNXeXNpd3lnRGl2KGVsZW1lbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJdCBpcyBqdWRnZWQgd2hldGhlciBpdCBpcyB0aGUgY2xvc3VyZSBmcmVlIGZvcm1hdCBlbGVtZW50LiAoY2xhc3M9XCJfX3NlX19mb3JtYXRfX2ZyZWVfX2Nsb3N1cmVfeHh4XCIpXHJcbiAgICAgKiBDbG9zdXJlIGZyZWUgZm9ybWF0IGVsZW1lbnRzIGlzIGluY2x1ZGVkIGluIHRoZSBmcmVlIGZvcm1hdCBlbGVtZW50LlxyXG4gICAgICogIC0gQ2xvc3VyZSBmcmVlIGZvcm1hdCBlbGVtZW50cydzIGxpbmUgYnJlYWsgaXMgXCJCUlwiIHRhZy5cclxuICAgICAqIOKAuyBZb3UgY2Fubm90IGV4aXQgdGhpcyBmb3JtYXQgd2l0aCB0aGUgRW50ZXIga2V5IG9yIEJhY2tzcGFjZSBrZXkuXHJcbiAgICAgKiDigLsgVXNlIGl0IG9ubHkgaW4gc3BlY2lhbCBjYXNlcy4gKFtleF0gZm9ybWF0IG9mIHRhYmxlIGNlbGxzKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNDbG9zdXJlRnJlZUZvcm1hdEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiB0aGlzLmhhc0NsYXNzKGVsZW1lbnQsICcoXFxcXHN8XilfX3NlX19mb3JtYXRfX2ZyZWVfX2Nsb3N1cmVfLisoXFxcXHN8JCknKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIGNvbXBvbmVudFtpbWcsIGlmcmFtZSwgdmlkZW8sIGF1ZGlvLCB0YWJsZV0gY292ZXIoY2xhc3M9XCJzZS1jb21wb25lbnRcIikgYW5kIHRhYmxlLCBoclxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNDb21wb25lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgKC9zZS1jb21wb25lbnQvLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpIHx8IC9eKFRBQkxFfEhSKSQvLnRlc3QoZWxlbWVudC5ub2RlTmFtZSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgZm9yIFwiX19zZV9fdW5lZGl0YWJsZVwiIGluIHRoZSBjbGFzcyBsaXN0LlxyXG4gICAgICogQ29tcG9uZW50cyB3aXRoIGNsYXNzIFwiX19zZV9fdW5lZGl0YWJsZVwiIGNhbm5vdCBiZSBtb2RpZmllZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzVW5lZGl0YWJsZUNvbXBvbmVudDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiB0aGlzLmhhc0NsYXNzKGVsZW1lbnQsICdfX3NlX191bmVkaXRhYmxlJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEl0IGlzIGp1ZGdlZCB3aGV0aGVyIGl0IGlzIHRoZSBjb21wb25lbnQgW2ltZywgaWZyYW1lXSBjb3ZlcihjbGFzcz1cInNlLWNvbXBvbmVudFwiKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNNZWRpYUNvbXBvbmVudDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiAvc2UtY29tcG9uZW50Ly50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgaXMganVkZ2VkIHdoZXRoZXIgaXQgaXMgdGhlIG5vdCBjaGVja2luZyBub2RlLiAoY2xhc3M9XCJrYXRleFwiLCBcIl9fc2VfX3RhZ1wiKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFRoZSBub2RlIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNOb3RDaGVja2luZ05vZGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgL2thdGV4fF9fc2VfX3RhZy8udGVzdChlbGVtZW50LmNsYXNzTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIElmIGEgcGFyZW50IG5vZGUgdGhhdCBjb250YWlucyBhbiBhcmd1bWVudCBub2RlIGZpbmRzIGEgZm9ybWF0IG5vZGUgKHV0aWwuaXNGb3JtYXRFbGVtZW50KSwgaXQgcmV0dXJucyB0aGF0IG5vZGUuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgUmVmZXJlbmNlIG5vZGUuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHZhbGlkYXRpb24gQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Rm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbGlkYXRpb24pIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGVsZW1lbnQpKSBlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Zvcm1hdEVsZW1lbnQoZWxlbWVudCkgJiYgdmFsaWRhdGlvbihlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSWYgYSBwYXJlbnQgbm9kZSB0aGF0IGNvbnRhaW5zIGFuIGFyZ3VtZW50IG5vZGUgZmluZHMgYSBmb3JtYXQgbm9kZSAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudCksIGl0IHJldHVybnMgdGhhdCBub2RlLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFJlZmVyZW5jZSBub2RlLlxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldFJhbmdlRm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbGlkYXRpb24pIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGVsZW1lbnQpICYmICEvXihUSEVBRHxUQk9EWXxUUikkL2kudGVzdChlbGVtZW50Lm5vZGVOYW1lKSAmJiB2YWxpZGF0aW9uKGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJZiBhIHBhcmVudCBub2RlIHRoYXQgY29udGFpbnMgYW4gYXJndW1lbnQgbm9kZSBmaW5kcyBhIGZyZWUgZm9ybWF0IG5vZGUgKHV0aWwuaXNGcmVlRm9ybWF0RWxlbWVudCksIGl0IHJldHVybnMgdGhhdCBub2RlLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFJlZmVyZW5jZSBub2RlLlxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldEZyZWVGb3JtYXRFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsaWRhdGlvbikge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNXeXNpd3lnRGl2KGVsZW1lbnQpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGcmVlRm9ybWF0RWxlbWVudChlbGVtZW50KSAmJiB2YWxpZGF0aW9uKGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJZiBhIHBhcmVudCBub2RlIHRoYXQgY29udGFpbnMgYW4gYXJndW1lbnQgbm9kZSBmaW5kcyBhIGNsb3N1cmUgZnJlZSBmb3JtYXQgbm9kZSAodXRpbC5pc0Nsb3N1cmVGcmVlRm9ybWF0RWxlbWVudCksIGl0IHJldHVybnMgdGhhdCBub2RlLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFJlZmVyZW5jZSBub2RlLlxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldENsb3N1cmVGcmVlRm9ybWF0RWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbGlkYXRpb24pIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghdmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzV3lzaXd5Z0RpdihlbGVtZW50KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc3VyZUZyZWVGb3JtYXRFbGVtZW50KGVsZW1lbnQpICYmIHZhbGlkYXRpb24oZWxlbWVudCkpIHJldHVybiBlbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBzdHlsZSBhbmQgY2xhc3NOYW1lIG9mIGNvcHlFbCB0byBvcmlnaW5FbFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBvcmlnaW5FbCBPcmlnaW4gZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBjb3B5RWwgRWxlbWVudCB0byBjb3B5XHJcbiAgICAgKi9cclxuICAgIGNvcHlUYWdBdHRyaWJ1dGVzOiBmdW5jdGlvbiAob3JpZ2luRWwsIGNvcHlFbCkge1xyXG4gICAgICAgIGlmIChjb3B5RWwuc3R5bGUuY3NzVGV4dCkge1xyXG4gICAgICAgICAgICBvcmlnaW5FbC5zdHlsZS5jc3NUZXh0ICs9IGNvcHlFbC5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNvcHlFbC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRDbGFzcyhvcmlnaW5FbCwgY2xhc3Nlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9yaWdpbkVsLnN0eWxlLmNzc1RleHQpIG9yaWdpbkVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcclxuICAgICAgICBpZiAoIW9yaWdpbkVsLmNsYXNzTmFtZS50cmltKCkpIG9yaWdpbkVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSBhbmQgYXBwbHkgYXR0cmlidXRlcyBvZiBmb3JtYXQgdGFnIHRoYXQgc2hvdWxkIGJlIG1haW50YWluZWQuIChzdHlsZSwgY2xhc3MpIElnbm9yZSBcIl9fc2VfX2Zvcm1hdF9fXCIgY2xhc3NcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gb3JpZ2luRWwgT3JpZ2luIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gY29weUVsIEVsZW1lbnQgdG8gY29weVxyXG4gICAgICovXHJcbiAgICBjb3B5Rm9ybWF0QXR0cmlidXRlczogZnVuY3Rpb24gKG9yaWdpbkVsLCBjb3B5RWwpIHtcclxuICAgICAgICBjb3B5RWwgPSBjb3B5RWwuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICBjb3B5RWwuY2xhc3NOYW1lID0gY29weUVsLmNsYXNzTmFtZS5yZXBsYWNlKC8oXFxzfF4pX19zZV9fZm9ybWF0X19bXlxcc10rL2csICcnKTtcclxuICAgICAgICB0aGlzLmNvcHlUYWdBdHRyaWJ1dGVzKG9yaWdpbkVsLCBjb3B5RWwpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIGl0ZW0gZnJvbSB0aGUgYXJyYXkgdGhhdCBtYXRjaGVzIHRoZSBjb25kaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBhcnJheSBBcnJheSB0byBnZXQgaXRlbVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIENvbmRpdGlvbmFsIGZ1bmN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG11bHRpIElmIHRydWUsIHJldHVybnMgYWxsIGl0ZW1zIHRoYXQgbWVldCB0aGUgY3JpdGVyaWEgb3RoZXJ3aXNlLCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LlxyXG4gICAgICogSWYgZmFsc2UsIHJldHVybnMgb25seSBvbmUgaXRlbSB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cclxuICAgICAqIEByZXR1cm5zIHtBcnJheXxOb2RlfG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldEFycmF5SXRlbTogZnVuY3Rpb24gKGFycmF5LCB2YWxpZGF0aW9uLCBtdWx0aSkge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgdmFsaWRhdGlvbiA9IHZhbGlkYXRpb24gfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoLCBhOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgYSA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbihhKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtdWx0aSkgcmV0dXJuIGE7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGFyci5wdXNoKGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gIW11bHRpID8gbnVsbCA6IGFycjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdmFsdWUgaW4gdGhlIGVsZW1lbnQgYXJyYXlcclxuICAgICAqIEBwYXJhbSB7QXJyYXl8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IGFycmF5IGVsZW1lbnQgYXJyYXlcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBmaW5kIGluZGV4XHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXRBcnJheUluZGV4OiBmdW5jdGlvbiAoYXJyYXksIGVsZW1lbnQpIHtcclxuICAgICAgICBsZXQgaWR4ID0gLTE7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgaWR4ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWR4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIG5leHQgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGluIHRoZSBlbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBhcnJheSBlbGVtZW50IGFycmF5XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGl0ZW0gVGhlIGVsZW1lbnQgdG8gZmluZCBpbmRleFxyXG4gICAgICogQHJldHVybnMge051bWJlcn1cclxuICAgICAqL1xyXG4gICAgbmV4dElkeDogZnVuY3Rpb24gKGFycmF5LCBpdGVtKSB7XHJcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXJyYXlJbmRleChhcnJheSwgaXRlbSk7XHJcbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiAtMTtcclxuICAgICAgICByZXR1cm4gaWR4ICsgMTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBwcmV2aW91cyBpbmRleCBvZiB0aGUgYXJndW1lbnQgdmFsdWUgaW4gdGhlIGVsZW1lbnQgYXJyYXlcclxuICAgICAqIEBwYXJhbSB7QXJyYXl8SFRNTENvbGxlY3Rpb258Tm9kZUxpc3R9IGFycmF5IEVsZW1lbnQgYXJyYXlcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gaXRlbSBUaGUgZWxlbWVudCB0byBmaW5kIGluZGV4XHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBwcmV2SWR4OiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0pIHtcclxuICAgICAgICBsZXQgaWR4ID0gdGhpcy5nZXRBcnJheUluZGV4KGFycmF5LCBpdGVtKTtcclxuICAgICAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIC0xO1xyXG4gICAgICAgIHJldHVybiBpZHggLSAxO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBpbmRleCBjb21wYXJlZCB0byBvdGhlciBzaWJsaW5nIG5vZGVzLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBOb2RlIHRvIGZpbmQgaW5kZXhcclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldFBvc2l0aW9uSW5kZXg6IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgbGV0IGlkeCA9IDA7XHJcbiAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpKSB7XHJcbiAgICAgICAgICAgIGlkeCArPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWR4O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgXCJub2RlXCIgaW4gdGhlIFwicGFyZW50Tm9kZVwiIGluIGEgbnVtZXJpY2FsIGFycmF5LlxyXG4gICAgICogZXgpIDxwPjxzcGFuPmFhPC9zcGFuPjxzcGFuPmJiPC9zcGFuPjwvcD4gOiBnZXROb2RlUGF0aChub2RlOiBcImJiXCIsIHBhcmVudE5vZGU6IFwiPFA+XCIpIC0+IFsxLCAwXVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBOb2RlIHRvIGZpbmQgcG9zaXRpb24gcGF0aFxyXG4gICAgICogQHBhcmFtIHtOb2RlfG51bGx9IHBhcmVudE5vZGUgUGFyZW50IG5vZGUuIElmIG51bGwsIHd5c2l3eWcgZGl2IGFyZWFcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IF9uZXdPZmZzZXRzIElmIHlvdSBzZW5kIGFuIG9iamVjdCBvZiB0aGUgZm9ybSBcIntzOiAwLCBlOiAwfVwiLCB0aGUgdGV4dCBub2RlcyB0aGF0IGFyZSBhdHRhY2hlZCB0b2dldGhlciBhcmUgbWVyZ2VkIGludG8gb25lLCBjZW50ZXJlZCBvbiB0aGUgXCJub2RlXCIgYXJndW1lbnQuXHJcbiAgICAgKiBcIl9uZXdPZmZzZXRzLnNcIiBzdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29tYmluZWQgY2hhcmFjdGVycyBhZnRlciBcIm5vZGVcIiBhbmQgXCJfbmV3T2Zmc2V0cy5lXCIgc3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvbWJpbmVkIGNoYXJhY3RlcnMgYmVmb3JlIFwibm9kZVwiLlxyXG4gICAgICogRG8gbm90IHVzZSB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgKi9cclxuICAgIGdldE5vZGVQYXRoOiBmdW5jdGlvbiAobm9kZSwgcGFyZW50Tm9kZSwgX25ld09mZnNldHMpIHtcclxuICAgICAgICBjb25zdCBwYXRoID0gW107XHJcbiAgICAgICAgbGV0IGZpbmRzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRFbGVtZW50KG5vZGUsIGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICBpZiAoZWwgPT09IHBhcmVudE5vZGUpIGZpbmRzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChmaW5kcyAmJiAhdGhpcy5pc1d5c2l3eWdEaXYoZWwpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtZXJnZSB0ZXh0IG5vZGVzXHJcbiAgICAgICAgICAgICAgICBpZiAoX25ld09mZnNldHMgJiYgZWwubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcCA9IG51bGwsIHRlbXBUZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBfbmV3T2Zmc2V0cy5zID0gX25ld09mZnNldHMuZSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aW91cyA9IGVsLnByZXZpb3VzU2libGluZztcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldmlvdXMgJiYgcHJldmlvdXMubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRleHQgPSBwcmV2aW91cy50ZXh0Q29udGVudC5yZXBsYWNlKHRoaXMuemVyb1dpZHRoUmVnRXhwLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9uZXdPZmZzZXRzLnMgKz0gdGVtcFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHRlbXBUZXh0ICsgZWwudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBwcmV2aW91cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbSh0ZW1wKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gZWwubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYgbmV4dC5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVGV4dCA9IG5leHQudGV4dENvbnRlbnQucmVwbGFjZSh0aGlzLnplcm9XaWR0aFJlZ0V4cCwgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfbmV3T2Zmc2V0cy5lICs9IHRlbXBUZXh0Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgKz0gdGVtcFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBuZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpbmRleCBwdXNoXHJcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBwYXRoLm1hcCh0aGlzLmdldFBvc2l0aW9uSW5kZXgpLnJldmVyc2UoKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbm9kZSBpbiB0aGUgbG9jYXRpb24gb2YgdGhlIHBhdGggYXJyYXkgb2J0YWluZWQgZnJvbSBcInV0aWwuZ2V0Tm9kZVBhdGhcIi5cclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG9mZnNldHMgUG9zaXRpb24gYXJyYXksIGFycmF5IG9idGFpbmVkIGZyb20gXCJ1dGlsLmdldE5vZGVQYXRoXCJcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZSBCYXNlIHBhcmVudCBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX1cclxuICAgICAqL1xyXG4gICAgZ2V0Tm9kZUZyb21QYXRoOiBmdW5jdGlvbiAob2Zmc2V0cywgcGFyZW50Tm9kZSkge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gcGFyZW50Tm9kZTtcclxuICAgICAgICBsZXQgbm9kZXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBvZmZzZXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIG5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSBicmVhaztcclxuICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA8PSBvZmZzZXRzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbm9kZXNbb2Zmc2V0c1tpXV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb21wYXJlcyB0aGUgc3R5bGUgYW5kIGNsYXNzIGZvciBlcXVhbCB2YWx1ZXMuXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgdGV4dCBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gYSBOb2RlIHRvIGNvbXBhcmVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gYiBOb2RlIHRvIGNvbXBhcmVcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1NhbWVBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgIGlmIChhLm5vZGVUeXBlID09PSAzICYmIGIubm9kZVR5cGUgPT09IDMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChhLm5vZGVUeXBlID09PSAzIHx8IGIubm9kZVR5cGUgPT09IDMpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3R5bGVfYSA9IGEuc3R5bGU7XHJcbiAgICAgICAgY29uc3Qgc3R5bGVfYiA9IGIuc3R5bGU7XHJcbiAgICAgICAgbGV0IGNvbXBTdHlsZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZV9hLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzdHlsZV9hW3N0eWxlX2FbaV1dID09PSBzdHlsZV9iW3N0eWxlX2FbaV1dKSBjb21wU3R5bGUrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNsYXNzX2EgPSBhLmNsYXNzTGlzdDtcclxuICAgICAgICBjb25zdCBjbGFzc19iID0gYi5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgcmVnID0gdGhpcy5fdy5SZWdFeHA7XHJcbiAgICAgICAgbGV0IGNvbXBDbGFzcyA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjbGFzc19hLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChyZWcoJyhcXHN8XiknICsgY2xhc3NfYVtpXSArICcoXFxzfCQpJykudGVzdChjbGFzc19iLnZhbHVlKSkgY29tcENsYXNzKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGNvbXBTdHlsZSA9PT0gc3R5bGVfYi5sZW5ndGggJiYgY29tcFN0eWxlID09PSBzdHlsZV9hLmxlbmd0aCkgJiYgKGNvbXBDbGFzcyA9PT0gY2xhc3NfYi5sZW5ndGggJiYgY29tcENsYXNzID09PSBjbGFzc19hLmxlbmd0aCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrIHRoZSBsaW5lIGVsZW1lbnQodXRpbC5pc0Zvcm1hdEVsZW1lbnQpIGlzIGVtcHR5LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEZvcm1hdCBlbGVtZW50IG5vZGVcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5TGluZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gIWVsZW1lbnQgfHwgIWVsZW1lbnQucGFyZW50Tm9kZSB8fCAoIWVsZW1lbnQucXVlcnlTZWxlY3RvcignSU1HLCBJRlJBTUUsIEFVRElPLCBWSURFTywgQ0FOVkFTLCBUQUJMRScpICYmIHRoaXMub25seVplcm9XaWR0aFNwYWNlKGVsZW1lbnQudGV4dENvbnRlbnQpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSBsaXN0IChvbCwgdWwpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzTGlzdDogZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSAmJiAvXihPTHxVTCkkL2kudGVzdCh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgPyBub2RlIDogbm9kZS5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrIHRoZSBub2RlIGlzIGEgbGlzdCBjZWxsIChsaSlcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxTdHJpbmd9IG5vZGUgVGhlIGVsZW1lbnQgb3IgZWxlbWVudCBuYW1lIHRvIGNoZWNrXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNMaXN0Q2VsbDogZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSAmJiAvXkxJJC9pLnRlc3QodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnID8gbm9kZSA6IG5vZGUubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayB0aGUgbm9kZSBpcyBhIHRhYmxlICh0YWJsZSwgdGhlYWQsIHRib2R5LCB0ciwgdGgsIHRkKVxyXG4gICAgICogQHBhcmFtIHtOb2RlfFN0cmluZ30gbm9kZSBUaGUgZWxlbWVudCBvciBlbGVtZW50IG5hbWUgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBpc1RhYmxlOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIC9eKFRBQkxFfFRIRUFEfFRCT0RZfFRSfFRIfFREKSQvaS50ZXN0KHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyA/IG5vZGUgOiBub2RlLm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSB0YWJsZSBjZWxsICh0ZCwgdGgpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzQ2VsbDogZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSAmJiAvXihURHxUSCkkL2kudGVzdCh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgPyBub2RlIDogbm9kZS5ub2RlTmFtZSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrIHRoZSBub2RlIGlzIGEgYnJlYWsgbm9kZSAoQlIpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzQnJlYWs6IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgL15CUiQvaS50ZXN0KHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyA/IG5vZGUgOiBub2RlLm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENoZWNrIHRoZSBub2RlIGlzIGEgYW5jaG9yIG5vZGUgKEEpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzQW5jaG9yOiBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIC9eQSQvaS50ZXN0KHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyA/IG5vZGUgOiBub2RlLm5vZGVOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgdGhlIG5vZGUgaXMgYSBtZWRpYSBub2RlIChpbWcsIGlmcmFtZSwgYXVkaW8sIHZpZGVvLCBjYW52YXMpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBub2RlIFRoZSBlbGVtZW50IG9yIGVsZW1lbnQgbmFtZSB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGlzTWVkaWE6IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgL14oSU1HfElGUkFNRXxBVURJT3xWSURFT3xDQU5WQVMpJC9pLnRlc3QodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnID8gbm9kZSA6IG5vZGUubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgZm9yIG51bWVyaWMgKHdpdGggZGVjaW1hbCBwb2ludCkuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHRleHQgVGV4dCBzdHJpbmcgb3IgbnVtYmVyXHJcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgaXNOdW1iZXI6IGZ1bmN0aW9uICh0ZXh0KSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGV4dCAmJiAvXi0/XFxkKyhcXC5cXGQrKT8kLy50ZXN0KHRleHQgKyAnJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBhIG51bWJlci5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdGV4dCBUZXh0IHN0cmluZyBvciBudW1iZXJcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhEZWMgTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgKC0xIDogSW5maW5pdHkpXHJcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG4gICAgICovXHJcbiAgICBnZXROdW1iZXI6IGZ1bmN0aW9uICh0ZXh0LCBtYXhEZWMpIHtcclxuICAgICAgICBpZiAoIXRleHQpIHJldHVybiAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBudW1iZXIgPSAodGV4dCArICcnKS5tYXRjaCgvLT9cXGQrKFxcLlxcZCspPy8pO1xyXG4gICAgICAgIGlmICghbnVtYmVyIHx8ICFudW1iZXJbMF0pIHJldHVybiAwO1xyXG5cclxuICAgICAgICBudW1iZXIgPSBudW1iZXJbMF07XHJcbiAgICAgICAgcmV0dXJuIG1heERlYyA8IDAgPyBudW1iZXIgKiAxIDogbWF4RGVjID09PSAwID8gdGhpcy5fdy5NYXRoLnJvdW5kKG51bWJlciAqIDEpIDogKG51bWJlciAqIDEpLnRvRml4ZWQobWF4RGVjKSAqIDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBhbGwgXCJjaGlsZHJlblwiIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBlbGVtZW50IChXaXRob3V0IHRleHQgbm9kZXMpXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgZWxlbWVudCB0byBnZXQgY2hpbGQgbm9kZVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxudWxsfSB2YWxpZGF0aW9uIENvbmRpdGlvbmFsIGZ1bmN0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgKi9cclxuICAgIGdldExpc3RDaGlsZHJlbjogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbGlkYXRpb24pIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jaGlsZHJlbiB8fCBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNoaWxkcmVuO1xyXG5cclxuICAgICAgICB2YWxpZGF0aW9uID0gdmFsaWRhdGlvbiB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xyXG5cclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSBjdXJyZW50ICYmIHZhbGlkYXRpb24oY3VycmVudCkpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghIWN1cnJlbnQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjdXJyZW50LmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjdXJyZW50LmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBhbGwgXCJjaGlsZE5vZGVzXCIgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGVsZW1lbnQgKEluY2x1ZGUgdGV4dCBub2RlcylcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBlbGVtZW50IHRvIGdldCBjaGlsZCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHZhbGlkYXRpb24gQ29uZGl0aW9uYWwgZnVuY3Rpb25cclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAqL1xyXG4gICAgZ2V0TGlzdENoaWxkTm9kZXM6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWxpZGF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcclxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNoaWxkcmVuO1xyXG5cclxuICAgICAgICB2YWxpZGF0aW9uID0gdmFsaWRhdGlvbiB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xyXG5cclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSBjdXJyZW50ICYmIHZhbGlkYXRpb24oY3VycmVudCkpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjdXJyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY3VycmVudC5jaGlsZE5vZGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIG51bWJlciBvZiBwYXJlbnRzIG5vZGVzLlxyXG4gICAgICogXCIwXCIgd2hlbiB0aGUgcGFyZW50IG5vZGUgaXMgdGhlIFdZU0lXWUcgYXJlYS5cclxuICAgICAqIFwiLTFcIiB3aGVuIHRoZSBlbGVtZW50IGFyZ3VtZW50IGlzIHRoZSBXWVNJV1lHIGFyZWEuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldEVsZW1lbnREZXB0aDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgdGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHJldHVybiAtMTtcclxuXHJcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiAhdGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgZGVwdGggKz0gMTtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkZXB0aDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcGFyZXMgdHdvIGVsZW1lbnRzIHRvIGZpbmQgYSBjb21tb24gYW5jZXN0b3IsIGFuZCByZXR1cm5zIHRoZSBvcmRlciBvZiB0aGUgdHdvIGVsZW1lbnRzLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBhIE5vZGUgdG8gY29tcGFyZS5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gYiBOb2RlIHRvIGNvbXBhcmUuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IGFuY2Vzc3RvciwgYSwgYiwgcmVzdWx0OiAoYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDApIH07XHJcbiAgICAgKi9cclxuICAgIGNvbXBhcmVFbGVtZW50czogZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICBsZXQgYU5vZGUgPSBhLCBiTm9kZSA9IGI7XHJcbiAgICAgICAgd2hpbGUgKGFOb2RlICYmIGJOb2RlICYmIGFOb2RlLnBhcmVudE5vZGUgIT09IGJOb2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgYU5vZGUgPSBhTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBiTm9kZSA9IGJOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFOb2RlIHx8ICFiTm9kZSkgcmV0dXJuIHsgYW5jZXN0b3I6IG51bGwsIGE6IGEsIGI6IGIsIHJlc3VsdDogMCB9O1xyXG5cclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGFOb2RlLnBhcmVudE5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICBjb25zdCBhSW5kZXggPSB0aGlzLmdldEFycmF5SW5kZXgoY2hpbGRyZW4sIGFOb2RlKTtcclxuICAgICAgICBjb25zdCBiSW5kZXggPSB0aGlzLmdldEFycmF5SW5kZXgoY2hpbGRyZW4sIGJOb2RlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYW5jZXN0b3I6IGFOb2RlLnBhcmVudE5vZGUsXHJcbiAgICAgICAgICAgIGE6IGFOb2RlLFxyXG4gICAgICAgICAgICBiOiBiTm9kZSxcclxuICAgICAgICAgICAgcmVzdWx0OiBhSW5kZXggPiBiSW5kZXggPyAxIDogYUluZGV4IDwgYkluZGV4ID8gLTEgOiAwXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgYXJndW1lbnQgdmFsdWUuXHJcbiAgICAgKiBBIHRhZyB0aGF0IHNhdGlzZmllcyB0aGUgcXVlcnkgY29uZGl0aW9uIGlzIGltcG9ydGVkLlxyXG4gICAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBSZWZlcmVuY2UgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IHF1ZXJ5IFF1ZXJ5IFN0cmluZyAobm9kZU5hbWUsIC5jbGFzc05hbWUsICNJRCwgOm5hbWUpIG9yIHZhbGlkYXRpb24gZnVuY3Rpb24uXHJcbiAgICAgKiBOb3QgdXNlIGl0IGxpa2UganF1ZXJ5LlxyXG4gICAgICogT25seSBvbmUgY29uZGl0aW9uIGNhbiBiZSBlbnRlcmVkIGF0IGEgdGltZS5cclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldFBhcmVudEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBxdWVyeSkge1xyXG4gICAgICAgIGxldCBjaGVjaztcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjaGVjayA9IHF1ZXJ5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhdHRyO1xyXG4gICAgICAgICAgICBpZiAoL15cXC4vLnRlc3QocXVlcnkpKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyID0gJ2NsYXNzTmFtZSc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnNwbGl0KCcuJylbMV07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL14jLy50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICdpZCc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9ICdeJyArIHF1ZXJ5LnNwbGl0KCcjJylbMV0gKyAnJCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL146Ly50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICduYW1lJztcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJ14nICsgcXVlcnkuc3BsaXQoJzonKVsxXSArICckJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnbm9kZU5hbWUnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSAnXicgKyBxdWVyeSArICckJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IHRoaXMuX3cuUmVnRXhwKHF1ZXJ5LCAnaScpO1xyXG4gICAgICAgICAgICBjaGVjayA9IGZ1bmN0aW9uIChlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ0V4cC50ZXN0KGVsW2F0dHJdKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmICFjaGVjayhlbGVtZW50KSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBjaGlsZCBlbGVtZW50IG9mIHRoZSBhcmd1bWVudCB2YWx1ZS5cclxuICAgICAqIEEgdGFnIHRoYXQgc2F0aXNmaWVzIHRoZSBxdWVyeSBjb25kaXRpb24gaXMgaW1wb3J0ZWQuXHJcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50IFJlZmVyZW5jZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gcXVlcnkgUXVlcnkgU3RyaW5nIChub2RlTmFtZSwgLmNsYXNzTmFtZSwgI0lELCA6bmFtZSkgb3IgdmFsaWRhdGlvbiBmdW5jdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbGFzdCBJZiB0cnVlIHJldHVybnMgdGhlIGxhc3Qgbm9kZSBhbW9uZyB0aGUgZm91bmQgY2hpbGQgbm9kZXMuIChkZWZhdWx0OiBmaXJzdCBub2RlKVxyXG4gICAgICogTm90IHVzZSBpdCBsaWtlIGpxdWVyeS5cclxuICAgICAqIE9ubHkgb25lIGNvbmRpdGlvbiBjYW4gYmUgZW50ZXJlZCBhdCBhIHRpbWUuXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRDaGlsZEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBxdWVyeSwgbGFzdCkge1xyXG4gICAgICAgIGxldCBjaGVjaztcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjaGVjayA9IHF1ZXJ5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhdHRyO1xyXG4gICAgICAgICAgICBpZiAoL15cXC4vLnRlc3QocXVlcnkpKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyID0gJ2NsYXNzTmFtZSc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnNwbGl0KCcuJylbMV07XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL14jLy50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICdpZCc7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9ICdeJyArIHF1ZXJ5LnNwbGl0KCcjJylbMV0gKyAnJCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL146Ly50ZXN0KHF1ZXJ5KSkge1xyXG4gICAgICAgICAgICAgICAgYXR0ciA9ICduYW1lJztcclxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJ14nICsgcXVlcnkuc3BsaXQoJzonKVsxXSArICckJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF0dHIgPSAnbm9kZU5hbWUnO1xyXG4gICAgICAgICAgICAgICAgcXVlcnkgPSAnXicgKyAocXVlcnkgPT09ICd0ZXh0JyA/ICcjJyArIHF1ZXJ5IDogcXVlcnkpICsgJyQnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZWdFeHAgPSBuZXcgdGhpcy5fdy5SZWdFeHAocXVlcnksICdpJyk7XHJcbiAgICAgICAgICAgIGNoZWNrID0gZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnRXhwLnRlc3QoZWxbYXR0cl0pO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2hpbGRMaXN0ID0gdGhpcy5nZXRMaXN0Q2hpbGROb2RlcyhlbGVtZW50LCBmdW5jdGlvbiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2hlY2soY3VycmVudCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZExpc3RbbGFzdCA/IGNoaWxkTGlzdC5sZW5ndGggLSAxIDogMF07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIDEuIFRoZSBmaXJzdCBub2RlIG9mIGFsbCB0aGUgY2hpbGQgbm9kZXMgb2YgdGhlIFwiZmlyc3RcIiBlbGVtZW50IGlzIHJldHVybmVkLlxyXG4gICAgICogMi4gVGhlIGxhc3Qgbm9kZSBvZiBhbGwgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBcImxhc3RcIiBlbGVtZW50IGlzIHJldHVybmVkLlxyXG4gICAgICogMy4gV2hlbiB0aGVyZSBpcyBubyBcImxhc3RcIiBlbGVtZW50LCB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZXMgb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgXCJmaXJzdFwiIGVsZW1lbnQgYXJlIHJldHVybmVkLlxyXG4gICAgICogeyBzYzogXCJmaXJzdFwiLCBlYzogXCJsYXN0XCIgfVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBmaXJzdCBGaXJzdCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge05vZGV8bnVsbH0gbGFzdCBMYXN0IGVsZW1lbnRcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgKi9cclxuICAgIGdldEVkZ2VDaGlsZE5vZGVzOiBmdW5jdGlvbiAoZmlyc3QsIGxhc3QpIHtcclxuICAgICAgICBpZiAoIWZpcnN0KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFsYXN0KSBsYXN0ID0gZmlyc3Q7XHJcblxyXG4gICAgICAgIHdoaWxlIChmaXJzdCAmJiBmaXJzdC5ub2RlVHlwZSA9PT0gMSAmJiBmaXJzdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIXRoaXMuaXNCcmVhayhmaXJzdCkpIGZpcnN0ID0gZmlyc3QuZmlyc3RDaGlsZDtcclxuICAgICAgICB3aGlsZSAobGFzdCAmJiBsYXN0Lm5vZGVUeXBlID09PSAxICYmIGxhc3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwICYmICAhdGhpcy5pc0JyZWFrKGxhc3QpKSBsYXN0ID0gbGFzdC5sYXN0Q2hpbGQ7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNjOiBmaXJzdCxcclxuICAgICAgICAgICAgZWM6IGxhc3QgfHwgZmlyc3RcclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGVmdCBhbmQgdG9wIG9mIGFyZ3VtZW50LiB7bGVmdDowLCB0b3A6MH1cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCBUYXJnZXQgbm9kZVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fG51bGx9IHd5c2l3eWdGcmFtZSBXaGVuIHVzZSBpZnJhbWUgb3B0aW9uLCBpZnJhbWUgb2JqZWN0IHNob3VsZCBiZSBzZW50IChjb250ZXh0LmVsZW1lbnQud3lzaXd5Z0ZyYW1lKVxyXG4gICAgICogQHJldHVybnMge09iamVjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0T2Zmc2V0OiBmdW5jdGlvbiAoZWxlbWVudCwgd3lzaXd5Z0ZyYW1lKSB7XHJcbiAgICAgICAgbGV0IG9mZnNldExlZnQgPSAwO1xyXG4gICAgICAgIGxldCBvZmZzZXRUb3AgPSAwO1xyXG4gICAgICAgIGxldCBvZmZzZXRFbGVtZW50ID0gZWxlbWVudC5ub2RlVHlwZSA9PT0gMyA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgd3lzaXd5ZyA9IHRoaXMuZ2V0UGFyZW50RWxlbWVudChlbGVtZW50LCB0aGlzLmlzV3lzaXd5Z0Rpdi5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKG9mZnNldEVsZW1lbnQgJiYgIXRoaXMuaGFzQ2xhc3Mob2Zmc2V0RWxlbWVudCwgJ3NlLWNvbnRhaW5lcicpICYmIG9mZnNldEVsZW1lbnQgIT09IHd5c2l3eWcpIHtcclxuICAgICAgICAgICAgb2Zmc2V0TGVmdCArPSBvZmZzZXRFbGVtZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgICAgICAgIG9mZnNldFRvcCArPSBvZmZzZXRFbGVtZW50Lm9mZnNldFRvcDtcclxuICAgICAgICAgICAgb2Zmc2V0RWxlbWVudCA9IG9mZnNldEVsZW1lbnQub2Zmc2V0UGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gd3lzaXd5Z0ZyYW1lICYmIC9pZnJhbWUvaS50ZXN0KHd5c2l3eWdGcmFtZS5ub2RlTmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlZnQ6IG9mZnNldExlZnQgKyAoaWZyYW1lID8gd3lzaXd5Z0ZyYW1lLnBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCA6IDApLFxyXG4gICAgICAgICAgICB0b3A6IChvZmZzZXRUb3AgLSAod3lzaXd5ZyA/IHd5c2l3eWcuc2Nyb2xsVG9wIDogMCkpICsgKGlmcmFtZSA/IHd5c2l3eWdGcmFtZS5wYXJlbnRFbGVtZW50Lm9mZnNldFRvcCA6IDApXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSXQgY29tcGFyZXMgdGhlIHN0YXJ0IGFuZCBlbmQgaW5kZXhlcyBvZiBcImFcIiBhbmQgXCJiXCIgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBvdmVybGFwcGluZyBpbmRleGVzIGluIHRoZSByYW5nZS5cclxuICAgICAqIGV4KSAxLCA1LCA0LCA2ID0+IFwiMlwiICg0IH4gNSlcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhU3RhcnQgU3RhcnQgaW5kZXggb2YgXCJhXCJcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhRW5kIEVuZCBpbmRleCBvZiBcImFcIlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJTdGFydCBTdGFydCBpbmRleCBvZiBcImJcIlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJFbmQgU3RhcnQgaW5kZXggb2YgXCJiXCJcclxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XHJcbiAgICAgKi9cclxuICAgIGdldE92ZXJsYXBSYW5nZUF0SW5kZXg6IGZ1bmN0aW9uIChhU3RhcnQsIGFFbmQsIGJTdGFydCwgYkVuZCkge1xyXG4gICAgICAgIGlmIChhU3RhcnQgPD0gYkVuZCA/IGFFbmQgPCBiU3RhcnQgOiBhRW5kID4gYlN0YXJ0KSByZXR1cm4gMDtcclxuXHJcbiAgICAgICAgY29uc3Qgb3ZlcmxhcCA9IChhU3RhcnQgPiBiU3RhcnQgPyBhU3RhcnQgOiBiU3RhcnQpIC0gKGFFbmQgPCBiRW5kID8gYUVuZCA6IGJFbmQpO1xyXG4gICAgICAgIHJldHVybiAob3ZlcmxhcCA8IDAgPyBvdmVybGFwICogLTEgOiBvdmVybGFwKSArIDE7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCB0aGUgdGV4dCBjb250ZW50IHZhbHVlIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byByZXBsYWNlIHRleHQgY29udGVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR4dCBUZXh0IHRvIGJlIGFwcGxpZWRcclxuICAgICAqL1xyXG4gICAgY2hhbmdlVHh0OiBmdW5jdGlvbiAoZWxlbWVudCwgdHh0KSB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICF0eHQpIHJldHVybjtcclxuICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdHh0O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUYXJnZXQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8RWxlbWVudH0gbmV3RWxlbWVudCBTdHJpbmcgb3IgZWxlbWVudCBvZiB0aGUgbmV3IGVsZW1lbnQgdG8gYXBwbHlcclxuICAgICAqL1xyXG4gICAgY2hhbmdlRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0VsZW1lbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG5ld0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm91dGVySFRNTCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5vdXRlckhUTUwgPSBuZXdFbGVtZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZG9jID0gdGhpcy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICAgICAgICAgIGRvYy5pbm5lckhUTUwgPSBuZXdFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudCA9IGRvYy5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAobmV3RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IHN0eWxlLCBpZiBhbGwgc3R5bGVzIGFyZSBkZWxldGVkLCB0aGUgc3R5bGUgcHJvcGVydGllcyBhcmUgZGVsZXRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRvIHNldCBzdHlsZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlTmFtZSBTdHlsZSBhdHRyaWJ1dGUgbmFtZSAobWFyZ2luTGVmdCwgdGV4dEFsaWduLi4uKVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWx1ZSBTdHlsZSB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBzZXRTdHlsZTogZnVuY3Rpb24gKGVsZW1lbnQsIHN0eWxlTmFtZSwgdmFsdWUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiAhZWxlbWVudC5zdHlsZS5jc3NUZXh0KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lIHdoZXRoZXIgYW55IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnRzIGFyZSBhc3NpZ25lZCB0aGUgZ2l2ZW4gY2xhc3NcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50cyB0byBzZWFyY2ggY2xhc3MgbmFtZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3JcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICovXHJcbiAgICBoYXNDbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICByZXR1cm4gKG5ldyB0aGlzLl93LlJlZ0V4cChjbGFzc05hbWUpKS50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQXBwZW5kIHRoZSBjbGFzc05hbWUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IHZhbHVlIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50cyB0byBhZGQgY2xhc3MgbmFtZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGJlIGFkZFxyXG4gICAgICovXHJcbiAgICBhZGRDbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xyXG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBjaGVjayA9IG5ldyB0aGlzLl93LlJlZ0V4cCgnKFxcXFxzfF4pJyArIGNsYXNzTmFtZSArICcoXFxcXHN8JCknKTtcclxuICAgICAgICBpZiAoY2hlY2sudGVzdChlbGVtZW50LmNsYXNzTmFtZSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xhc3NOYW1lLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBjbGFzc05hbWU7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSB0aGUgY2xhc3NOYW1lIHZhbHVlIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudHMgdG8gcmVtb3ZlIGNsYXNzIG5hbWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBiZSByZW1vdmVcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgY2hlY2sgPSBuZXcgdGhpcy5fdy5SZWdFeHAoJyhcXFxcc3xeKScgKyBjbGFzc05hbWUgKyAnKFxcXFxzfCQpJyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKGNoZWNrLCAnICcpLnRyaW0oKTtcclxuXHJcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTmFtZS50cmltKCkpIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBcmd1bWVudCB2YWx1ZSBJZiB0aGVyZSBpcyBubyBjbGFzcyBuYW1lLCBpbnNlcnQgaXQgYW5kIGRlbGV0ZSB0aGUgY2xhc3MgbmFtZSBpZiBpdCBleGlzdHNcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50cyB0byByZXBsYWNlIGNsYXNzIG5hbWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBiZSBjaGFuZ2VcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufHVuZGVmaW5lZH1cclxuICAgICAqL1xyXG4gICAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gbmV3IHRoaXMuX3cuUmVnRXhwKCcoXFxcXHN8XiknICsgY2xhc3NOYW1lICsgJyhcXFxcc3wkKScpO1xyXG4gICAgICAgIGlmIChjaGVjay50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoY2hlY2ssICcgJykudHJpbSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudC5jbGFzc05hbWUudHJpbSgpKSBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSW4gdGhlIHByZWRlZmluZWQgY29kZSB2aWV3IG1vZGUsIHRoZSBidXR0b25zIGV4Y2VwdCB0aGUgZXhlY3V0YWJsZSBidXR0b24gYXJlIGNoYW5nZWQgdG8gdGhlICdkaXNhYmxlZCcgc3RhdGUuXHJcbiAgICAgKiBjb3JlLmNvZGVWaWV3RGlzYWJsZWRCdXR0b25zIChBbiBhcnJheSBvZiBidXR0b25zIHdob3NlIGNsYXNzIG5hbWUgaXMgbm90IFwic2UtY29kZS12aWV3LWVuYWJsZWRcIilcclxuICAgICAqIGNvcmUucmVzaXppbmdEaXNhYmxlZEJ1dHRvbnMgKEFuIGFycmF5IG9mIGJ1dHRvbnMgd2hvc2UgY2xhc3MgbmFtZSBpcyBub3QgXCJzZS1yZXNpemluZy1lbmFibGVkXCIpXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIERpc2FibGVkIHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fEhUTUxDb2xsZWN0aW9ufE5vZGVMaXN0fSBidXR0b25MaXN0IEJ1dHRvbiBhcnJheVxyXG4gICAgICovXHJcbiAgICBzZXREaXNhYmxlZEJ1dHRvbnM6IGZ1bmN0aW9uIChkaXNhYmxlZCwgYnV0dG9uTGlzdCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBidXR0b25MaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbkxpc3RbaV0uZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSBhcmd1bWVudSB2YWx1ZSBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGl0ZW0gTm9kZSB0byBiZSByZW1vdmVcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlSXRlbTogZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYodHlwZW9mIGl0ZW0ucmVtb3ZlID09PSAnZnVuY3Rpb24nKSBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0ucGFyZW50Tm9kZSkgaXRlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGl0ZW0pO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgYWxsIHBhcmVudCBub2RlcyB0aGF0IG1hdGNoIHRoZSBjb25kaXRpb24uXHJcbiAgICAgKiBSZXR1cm5zIGFuIHtzYzogcHJldmlvdXNTaWJsaW5nLCBlYzogbmV4dFNpYmxpbmd9KHRoZSBkZWxldGVkIG5vZGUgcmVmZXJlbmNlKSBvciBudWxsLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSBpdGVtIE5vZGUgdG8gYmUgcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufG51bGx9IHZhbGlkYXRpb24gVmFsaWRhdGlvbiBmdW5jdGlvbi4gZGVmYXVsdChEZWxldGVkIGlmIGl0IG9ubHkgaGF2ZSBicmVha0xpbmUgYW5kIGJsYW5rcylcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBzdG9wUGFyZW50IFN0b3Agd2hlbiB0aGUgcGFyZW50IG5vZGUgcmVhY2hlcyBzdG9wUGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IHtzYzogcHJldmlvdXNTaWJsaW5nLCBlYzogbmV4dFNpYmxpbmd9XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUl0ZW1BbGxQYXJlbnRzOiBmdW5jdGlvbiAoaXRlbSwgdmFsaWRhdGlvbiwgc3RvcFBhcmVudCkge1xyXG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgbGV0IGNjID0gbnVsbDtcclxuICAgICAgICBpZiAoIXZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gc3RvcFBhcmVudCB8fCB0aGlzLmlzQ29tcG9uZW50KGN1cnJlbnQpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gY3VycmVudC50ZXh0Q29udGVudC50cmltKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPT09IDAgfHwgL14oXFxufFxcdTIwMEIpKyQvLnRlc3QodGV4dCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgdmFsaWRhdGlvbihlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNjID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYzogZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlYzogZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKHBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KGl0ZW0pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNjO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXRhY2ggTmVzdGVkIGFsbCBuZXN0ZWQgbGlzdHMgdW5kZXIgdGhlIFwiYmFzZU5vZGVcIi5cclxuICAgICAqIFJldHVybnMgYSBsaXN0IHdpdGggbmVzdGVkIHJlbW92ZWQuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGJhc2VOb2RlIEVsZW1lbnQgb24gd2hpY2ggdG8gYmFzZS5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxsIElmIHRydWUsIGl0IGFsc28gZGV0YWNoIGFsbCBuZXN0ZWQgbGlzdHMgb2YgYSByZXR1cm5lZCBsaXN0LlxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIGRldGFjaE5lc3RlZExpc3Q6IGZ1bmN0aW9uIChiYXNlTm9kZSwgYWxsKSB7XHJcbiAgICAgICAgY29uc3Qgck5vZGUgPSB0aGlzLl9kZWxldGVOZXN0ZWRMaXN0KGJhc2VOb2RlKTtcclxuICAgICAgICBsZXQgcmFuZ2VFbGVtZW50LCBjTm9kZXM7XHJcblxyXG4gICAgICAgIGlmIChyTm9kZSkge1xyXG4gICAgICAgICAgICByYW5nZUVsZW1lbnQgPSByTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjTm9kZXMgPSByTm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0UG9zaXRpb25JbmRleChiYXNlTm9kZSk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjTm9kZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY05vZGVzW2luZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYW5nZUVsZW1lbnQgPSBiYXNlTm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHJDaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWFsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZXB0aCA9IHRoaXMuZ2V0RWxlbWVudERlcHRoKGJhc2VOb2RlKSArIDI7XHJcbiAgICAgICAgICAgIHJDaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuKGJhc2VOb2RlLCBmdW5jdGlvbiAoY3VycmVudCkgeyByZXR1cm4gdGhpcy5pc0xpc3RDZWxsKGN1cnJlbnQpICYmICFjdXJyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgdGhpcy5nZXRFbGVtZW50RGVwdGgoY3VycmVudCkgPT09IGRlcHRoOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJDaGlsZHJlbiA9IHRoaXMuZ2V0TGlzdENoaWxkcmVuKHJhbmdlRWxlbWVudCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIHRoaXMuaXNMaXN0Q2VsbChjdXJyZW50KSAmJiAhY3VycmVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJDaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWxldGVOZXN0ZWRMaXN0KHJDaGlsZHJlbltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChyTm9kZSkge1xyXG4gICAgICAgICAgICByTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYW5nZUVsZW1lbnQsIHJOb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgaWYgKGNOb2RlcyAmJiBjTm9kZXMubGVuZ3RoID09PSAwKSB0aGlzLnJlbW92ZUl0ZW0ock5vZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlRWxlbWVudCA9PT0gYmFzZU5vZGUgPyByYW5nZUVsZW1lbnQucGFyZW50Tm9kZSA6IHJhbmdlRWxlbWVudDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU3ViIGZ1bmN0aW9uIG9mIHV0aWwuZGV0YWNoTmVzdGVkTGlzdCBtZXRob2QuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfZGVsZXRlTmVzdGVkTGlzdDogZnVuY3Rpb24gKGJhc2VOb2RlKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZVBhcmVudCA9IGJhc2VOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgbGV0IHNpYmxpbmcgPSBiYXNlUGFyZW50O1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSBzaWJsaW5nLnBhcmVudE5vZGU7XHJcbiAgICAgICAgbGV0IGxpU2libGluZywgbGlQYXJlbnQsIGNoaWxkLCBpbmRleCwgYztcclxuICAgICAgICBcclxuICAgICAgICB3aGlsZSAodGhpcy5pc0xpc3RDZWxsKHBhcmVudCkpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoYmFzZU5vZGUpO1xyXG4gICAgICAgICAgICBsaVNpYmxpbmcgPSBwYXJlbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICBsaVBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBjaGlsZCA9IHNpYmxpbmc7XHJcbiAgICAgICAgICAgIHdoaWxlKGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdChjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY1tpbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlQYXJlbnQuaW5zZXJ0QmVmb3JlKGNbaW5kZXhdLCBsaVNpYmxpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPT09IDApIHRoaXMucmVtb3ZlSXRlbShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpUGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNoaWxkID0gc2libGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzaWJsaW5nID0gbGlQYXJlbnQ7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IGxpUGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmFzZVBhcmVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHRoaXMucmVtb3ZlSXRlbShiYXNlUGFyZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpUGFyZW50O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTcGxpdCBhbGwgdGFncyBiYXNlZCBvbiBcImJhc2VOb2RlXCJcclxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgc3BsaXRlZCB0YWcuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGJhc2VOb2RlIEVsZW1lbnQgb3IgdGV4dCBub2RlIG9uIHdoaWNoIHRvIGJhc2VcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfG51bGx9IG9mZnNldCBUZXh0IG9mZnNldCBvZiBcImJhc2VOb2RlXCIgKE9ubHkgdmFsaWQgd2hlbiBcImJhc2VOb2RlXCIgaXMgYSB0ZXh0IG5vZGUpXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gZGVwdGggVGhlIG5lc3RpbmcgZGVwdGggb2YgdGhlIGVsZW1lbnQgYmVpbmcgc3BsaXQuIChkZWZhdWx0OiAwKVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9XHJcbiAgICAgKi9cclxuICAgIHNwbGl0RWxlbWVudDogZnVuY3Rpb24gKGJhc2VOb2RlLCBvZmZzZXQsIGRlcHRoKSB7XHJcbiAgICAgICAgY29uc3QgYnAgPSBiYXNlTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIGxldCBpbmRleCA9IDAsIG5ld0VsLCBjaGlsZHJlbiwgdGVtcDtcclxuICAgICAgICBsZXQgbmV4dCA9IHRydWU7XHJcbiAgICAgICAgaWYgKCFkZXB0aCB8fCBkZXB0aCA8IDApIGRlcHRoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGJhc2VOb2RlLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5nZXRQb3NpdGlvbkluZGV4KGJhc2VOb2RlKTtcclxuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBiYXNlTm9kZS5zcGxpdFRleHQob2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5nZXROb2RlRnJvbVBhdGgoW2luZGV4ICsgMV0sIGJwKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9ubHlaZXJvV2lkdGhTcGFjZShhZnRlcikpIGFmdGVyLmRhdGEgPSB0aGlzLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChiYXNlTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICBpZiAoIWJhc2VOb2RlLnByZXZpb3VzU2libGluZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RWxlbWVudERlcHRoKGJhc2VOb2RlKSA9PT0gZGVwdGgpIG5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJhc2VOb2RlID0gYmFzZU5vZGUucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGVwdGhFbCA9IGJhc2VOb2RlO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmdldEVsZW1lbnREZXB0aChkZXB0aEVsKSA+IGRlcHRoKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5nZXRQb3NpdGlvbkluZGV4KGRlcHRoRWwpICsgMTtcclxuICAgICAgICAgICAgZGVwdGhFbCA9IGRlcHRoRWwucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRlbXAgPSBuZXdFbDtcclxuICAgICAgICAgICAgbmV3RWwgPSBkZXB0aEVsLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuID0gZGVwdGhFbC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdENlbGwobmV3RWwpICYmIHRoaXMuaXNMaXN0KHRlbXApICYmIHRlbXAuZmlyc3RFbGVtZW50Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSB0ZW1wLmZpcnN0RWxlbWVudENoaWxkLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0odGVtcC5maXJzdEVsZW1lbnRDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAuY2hpbGRyZW4ubGVuZ3RoID4gMCkgbmV3RWwuYXBwZW5kQ2hpbGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0VsLmFwcGVuZENoaWxkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5baW5kZXhdKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdFbC5hcHBlbmRDaGlsZChjaGlsZHJlbltpbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGVwdGhFbC5jaGlsZE5vZGVzLmxlbmd0aCA8PSAxICYmICghZGVwdGhFbC5maXJzdENoaWxkIHx8IGRlcHRoRWwuZmlyc3RDaGlsZC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApKSBkZXB0aEVsLmlubmVySFRNTCA9ICc8YnI+JztcclxuXHJcbiAgICAgICAgY29uc3QgcEVsZW1lbnQgPSBkZXB0aEVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgaWYgKG5leHQpIGRlcHRoRWwgPSBkZXB0aEVsLm5leHRTaWJsaW5nO1xyXG4gICAgICAgIGlmICghbmV3RWwpIHJldHVybiBkZXB0aEVsO1xyXG5cclxuICAgICAgICB0aGlzLm1lcmdlU2FtZVRhZ3MobmV3RWwsIG51bGwsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLm1lcmdlTmVzdGVkVGFncyhuZXdFbCwgZnVuY3Rpb24gKGN1cnJlbnQpIHsgcmV0dXJuIHRoaXMuaXNMaXN0KGN1cnJlbnQpOyB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChuZXdFbC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHBFbGVtZW50Lmluc2VydEJlZm9yZShuZXdFbCwgZGVwdGhFbCk7XHJcbiAgICAgICAgZWxzZSBuZXdFbCA9IGRlcHRoRWw7XHJcblxyXG4gICAgICAgIGlmIChicC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5yZW1vdmVJdGVtKGJwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0VsO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBVc2Ugd2l0aCBcIm5wZGVQYXRoICh1dGlsLmdldE5vZGVQYXRoKVwiIHRvIG1lcmdlIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYW5kIHRhZ3MgaWYgdGhleSBhcmUgcHJlc2VudCBhbmQgbW9kaWZ5IHRoZSBub2RlcGF0aC5cclxuICAgICAqIElmIFwib2Zmc2V0XCIgaGFzIGJlZW4gY2hhbmdlZCwgaXQgd2lsbCByZXR1cm4gYXMgbXVjaCBcIm9mZnNldFwiIGFzIGl0IGhhcyBiZWVuIG1vZGlmaWVkLlxyXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyBjaGFuZ2Ugb2Zmc2V0cyBpcyByZXR1cm5lZCBpbiB0aGUgb3JkZXIgb2YgdGhlIFwibm9kZVBhdGhBcnJheVwiIGFycmF5LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7QXJyYXl8bnVsbH0gbm9kZVBhdGhBcnJheSBBcnJheSBvZiBOb2RlUGF0aCBvYmplY3QgKFt1dGlsLmdldE5vZGVQYXRoKCksIC4uXSlcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seVRleHQgSWYgdHJ1ZSwgbm9uLXRleHQgbm9kZXMoIXV0aWwuX2lzSWdub3JlTm9kZUNoYW5nZSkgbGlrZSAnc3BhbicsICdzdHJvbmcnLi4gYXJlIGlnbm9yZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFtvZmZzZXQsIC4uXVxyXG4gICAgICovXHJcbiAgICBtZXJnZVNhbWVUYWdzOiBmdW5jdGlvbiAoZWxlbWVudCwgbm9kZVBhdGhBcnJheSwgb25seVRleHQpIHtcclxuICAgICAgICBjb25zdCBpbnN0ID0gdGhpcztcclxuICAgICAgICBjb25zdCBub2RlUGF0aExlbiA9IG5vZGVQYXRoQXJyYXkgPyBub2RlUGF0aEFycmF5Lmxlbmd0aCA6IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldHMgPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChub2RlUGF0aExlbikge1xyXG4gICAgICAgICAgICBvZmZzZXRzID0gdGhpcy5fdy5BcnJheS5hcHBseShudWxsLCBuZXcgdGhpcy5fdy5BcnJheShub2RlUGF0aExlbikpLm1hcCh0aGlzLl93Lk51bWJlci5wcm90b3R5cGUudmFsdWVPZiwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50LCBkZXB0aCwgZGVwdGhJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGlsZHJlbi5sZW5ndGgsIGNoaWxkLCBuZXh0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICBuZXh0ID0gY2hpbGRyZW5baSArIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBpZigob25seVRleHQgJiYgaW5zdC5faXNJZ25vcmVOb2RlQ2hhbmdlKGNoaWxkKSkgfHwgKCFvbmx5VGV4dCAmJiAoaW5zdC5pc1RhYmxlKGNoaWxkKSB8fCBpbnN0LmlzTGlzdENlbGwoY2hpbGQpIHx8IChpbnN0LmlzRm9ybWF0RWxlbWVudChjaGlsZCkgJiYgIWluc3QuaXNGcmVlRm9ybWF0RWxlbWVudChjaGlsZCkpKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdC5pc1RhYmxlKGNoaWxkKSB8fCBpbnN0LmlzTGlzdENlbGwoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGRlcHRoICsgMSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSAmJiBjdXJyZW50Lm5vZGVOYW1lID09PSBjaGlsZC5ub2RlTmFtZSAmJiBjdXJyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbm9kZVBhdGhcclxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGgsIGMsIHAsIGNEZXB0aCwgc3BsaWNlRGVwdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbm9kZVBhdGhMZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5vZGVQYXRoQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAmJiBwYXRoW2RlcHRoXSA9PT0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjaGlsZCwgcCA9IGN1cnJlbnQsIGNEZXB0aCA9IGRlcHRoLCBzcGxpY2VEZXB0aCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNEZXB0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0LmdldEFycmF5SW5kZXgocC5jaGlsZE5vZGVzLCBjKSAhPT0gcGF0aFtjRGVwdGhdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VEZXB0aCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNoaWxkLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBjLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNEZXB0aC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaWNlRGVwdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zcGxpY2UoZGVwdGgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoXSA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSB0YWdcclxuICAgICAgICAgICAgICAgICAgICBpbnN0LmNvcHlUYWdBdHRyaWJ1dGVzKGNoaWxkLCBjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0LnJlbW92ZUl0ZW0oY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGRlcHRoICsgMSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVOYW1lID09PSBuZXh0Lm5vZGVOYW1lICYmIGluc3QuaXNTYW1lQXR0cmlidXRlcyhjaGlsZCwgbmV4dCkgJiYgY2hpbGQuaHJlZiA9PT0gbmV4dC5ocmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRzID0gY2hpbGQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBuTGVuID0gY2hpbGRzLmxlbmd0aDsgbiA8IG5MZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRzW25dLnRleHRDb250ZW50Lmxlbmd0aCA+IDApIGNoaWxkTGVuZ3RoKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gY2hpbGQubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBuZXh0LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0T2Zmc2V0ID0gbC5ub2RlVHlwZSA9PT0gMyAmJiByLm5vZGVUeXBlID09PSAzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRPZmZzZXQgPSBsLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBMID0gbC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHRlbXBMICYmIHRlbXBMLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPZmZzZXQgKz0gdGVtcEwudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEwgPSB0ZW1wTC5wcmV2aW91c1NpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZExlbmd0aCA+IDAgJiYgbC5ub2RlVHlwZSA9PT0gMyAmJiByLm5vZGVUeXBlID09PSAzICYmIChsLnRleHRDb250ZW50Lmxlbmd0aCA+IDAgfHwgci50ZXh0Q29udGVudC5sZW5ndGggPiAwKSkgY2hpbGRMZW5ndGgtLTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlUGF0aExlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBub2RlUGF0aExlbjsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5vZGVQYXRoQXJyYXlbbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggJiYgcGF0aFtkZXB0aF0gPiBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcGF0aFtkZXB0aCAtIDFdICE9PSBkZXB0aEluZGV4KSBjb250aW51ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoXSAtPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFtkZXB0aCArIDFdID49IDAgJiYgcGF0aFtkZXB0aF0gPT09IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhbZGVwdGggKyAxXSArPSBjaGlsZExlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0T2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgbC5ub2RlVHlwZSA9PT0gMyAmJiByICYmIHIubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c1tuXSArPSBhZGRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkT2Zmc2V0ID0gY2hpbGQudGV4dENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50ZXh0Q29udGVudCArPSBuZXh0LnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVBhdGhMZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbm9kZVBhdGhMZW47IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBub2RlUGF0aEFycmF5W25dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHBhdGhbZGVwdGhdID4gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPiAwICYmIHBhdGhbZGVwdGggLSAxXSAhPT0gZGVwdGhJbmRleCkgY29udGludWU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFtkZXB0aF0gLT0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhbZGVwdGggKyAxXSA+PSAwICYmIHBhdGhbZGVwdGhdID09PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoW2RlcHRoICsgMV0gKz0gY2hpbGRMZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW25dICs9IGFkZE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCArPSBuZXh0LmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdC5yZW1vdmVJdGVtKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGktLTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBkZXB0aCArIDEsIGkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkoZWxlbWVudCwgMCwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvZmZzZXRzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgbmVzdGVkIHRhZ3Mgd2l0aG91dCBvdGhlciBjaGlsZCBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd8bnVsbH0gdmFsaWRhdGlvbiBWYWxpZGF0aW9uIGZ1bmN0aW9uIC8gU3RyaW5nKFwidGFnMXx0YWcyLi5cIikgLyBJZiBudWxsLCBhbGwgdGFncyBhcmUgYXBwbGljYWJsZS5cclxuICAgICAqL1xyXG4gICAgbWVyZ2VOZXN0ZWRUYWdzOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsaWRhdGlvbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdmFsaWRhdGlvbiA9IGZ1bmN0aW9uIChjdXJyZW50KSB7IHJldHVybiB0aGlzLnRlc3QoY3VycmVudC50YWdOYW1lKTsgfS5iaW5kKG5ldyB0aGlzLl93LlJlZ0V4cCgnXignICsgKHZhbGlkYXRpb24gPyB2YWxpZGF0aW9uIDogJy4rJykgKyAnKSQnLCAnaScpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWxpZGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGN1cnJlbnQuY2hpbGRyZW47XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgY2hpbGRyZW5bMF0ubm9kZU5hbWUgPT09IGN1cnJlbnQubm9kZU5hbWUgJiYgdmFsaWRhdGlvbihjdXJyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IGNoaWxkcmVuWzBdO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0ZW1wLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hcHBlbmRDaGlsZChjaGlsZHJlblswXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUNoaWxkKHRlbXApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY3VycmVudC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjdXJyZW50LmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgYSBlbXB0eSBjaGlsZCBub2RlIG9mIGFyZ3VtZW50IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZXxudWxsfSBub3RSZW1vdmVOb2RlIERvIG5vdCByZW1vdmUgbm9kZVxyXG4gICAgICovXHJcbiAgICByZW1vdmVFbXB0eU5vZGU6IGZ1bmN0aW9uIChlbGVtZW50LCBub3RSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdCA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChub3RSZW1vdmVOb2RlKSB7XHJcbiAgICAgICAgICAgIG5vdFJlbW92ZU5vZGUgPSBpbnN0LmdldFBhcmVudEVsZW1lbnQobm90UmVtb3ZlTm9kZSwgZnVuY3Rpb24gKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ID09PSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAoZnVuY3Rpb24gcmVjdXJzaW9uRnVuYyhjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChpbnN0Ll9ub3RUZXh0Tm9kZShjdXJyZW50KSB8fCBjdXJyZW50ID09PSBub3RSZW1vdmVOb2RlIHx8IGluc3QuaXNOb25FZGl0YWJsZShjdXJyZW50KSkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBlbGVtZW50ICYmIGluc3Qub25seVplcm9XaWR0aFNwYWNlKGN1cnJlbnQudGV4dENvbnRlbnQpICYmICghY3VycmVudC5maXJzdENoaWxkIHx8ICFpbnN0LmlzQnJlYWsoY3VycmVudC5maXJzdENoaWxkKSkgJiYgIWN1cnJlbnQucXVlcnlTZWxlY3RvcihpbnN0Ll9hbGxvd2VkRW1wdHlOb2RlTGlzdCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjdXJyZW50LmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkcmVuLmxlbmd0aCwgciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW5baSArIHJdIHx8IGluc3QuaXNDb21wb25lbnQoY2hpbGRyZW5baSArIHJdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgciArPSByZWN1cnNpb25GdW5jKGNoaWxkcmVuW2kgKyByXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgZWxlbWVudC5pbm5lckhUTUwgPSAnPGJyPic7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBpbiBIVE1MIHN0cmluZy5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIEhUTUwgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICovXHJcbiAgICBodG1sUmVtb3ZlV2hpdGVTcGFjZTogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICBpZiAoIWh0bWwpIHJldHVybiAnJztcclxuICAgICAgICByZXR1cm4gaHRtbC50cmltKCkucmVwbGFjZSgvPFxcLz8oPyFzdHJvbmd8c3Bhbnxmb250fGJ8dmFyfGl8ZW18dXxpbnN8c3xzdHJpa2V8ZGVsfHN1YnxzdXB8bWFya3xhfGxhYmVsfGNvZGUpW14+XjxdKz5cXHMrKD89PCkvaWcsIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnRyaW0oKTsgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNvcnQgYSBlbGVtZW50IGFycmF5IGJ5IGRlcHRoIG9mIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzIHRydWU6IGRlc2NlbmRpbmcgb3JkZXIgLyBmYWxzZTogYXNjZW5kaW5nIG9yZGVyXHJcbiAgICAgKi9cclxuICAgIHNvcnRCeURlcHRoOiBmdW5jdGlvbiAoYXJyYXksIGRlcykge1xyXG4gICAgICAgIGNvbnN0IHQgPSAhZGVzID8gLTEgOiAxO1xyXG4gICAgICAgIGNvbnN0IGYgPSB0ICogLTE7XHJcblxyXG4gICAgICAgIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlzdENlbGwoYSkgfHwgIXRoaXMuaXNMaXN0Q2VsbChiKSkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIGEgPSB0aGlzLmdldEVsZW1lbnREZXB0aChhKTtcclxuICAgICAgICAgICAgYiA9IHRoaXMuZ2V0RWxlbWVudERlcHRoKGIpO1xyXG4gICAgICAgICAgICByZXR1cm4gYSA+IGIgPyB0IDogYSA8IGIgPyBmIDogMDtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlcyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgd2l0aG91dCBtb2RpZmljYXRpb24gd2hlbiBjaGFuZ2luZyB0ZXh0IG5vZGVzXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaXNJZ25vcmVOb2RlQ2hhbmdlOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT09IDMgJiYgKHRoaXMuaXNOb25FZGl0YWJsZShlbGVtZW50KSB8fCAhdGhpcy5pc1RleHRTdHlsZUVsZW1lbnQoZWxlbWVudCkpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlcyB0aGF0IG11c3QgcmVtYWluIHVuZGV0YWNoZWQgd2hlbiBjaGFuZ2luZyB0ZXh0IG5vZGVzIChBLCBMYWJlbCwgQ29kZSwgU3Bhbjpmb250LXNpemUpXHJcbiAgICAgKiBAcGFyYW0ge05vZGV8U3RyaW5nfSBlbGVtZW50IEVsZW1lbnQgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2lzTWFpbnRhaW5lZE5vZGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPT0gMyAmJiAvXihhfGxhYmVsfGNvZGUpJC9pLnRlc3QodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZWxlbWVudCA6IGVsZW1lbnQubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBOb2RlIHdpdGggZm9udC1zaXplIHN0eWxlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaXNTaXplTm9kZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlICE9PSAzICYmIHRoaXMuaXNUZXh0U3R5bGVFbGVtZW50KGVsZW1lbnQpICYmICEhZWxlbWVudC5zdHlsZS5mb250U2l6ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTm9kZXMgd2l0aG91dCB0ZXh0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfbm90VGV4dE5vZGU6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPT0gMyAmJiAodGhpcy5pc0NvbXBvbmVudChlbGVtZW50KSB8fCAvXihicnxpbnB1dHxzZWxlY3R8Y2FudmFzfGltZ3xpZnJhbWV8YXVkaW98dmlkZW8pJC9pLnRlc3QodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZWxlbWVudCA6IGVsZW1lbnQubm9kZU5hbWUpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgZGlzYWxsb3dlZCB0YWdzXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfZGlzYWxsb3dlZFRhZ3M6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIC9eKG1ldGF8c2NyaXB0fGxpbmt8c3R5bGV8W2Etel0rXFw6W2Etel0rKSQvaS50ZXN0KGVsZW1lbnQubm9kZU5hbWUpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgd2hpdGVsaXN0IFJlZ0V4cCBvYmplY3QuXHJcbiAgICAgKiBSZXR1cm4gUmVnRXhwIGZvcm1hdDogbmV3IFJlZ0V4cChcIjxcXFxcLz9cXFxcYig/IVwiICsgbGlzdCArIFwiKVxcXFxiW14+XjxdKis+XCIsIFwiZ2lcIilcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsaXN0IFRhZ3MgbGlzdCAoXCJicnxwfGRpdnxwcmUuLi5cIilcclxuICAgICAqIEByZXR1cm5zIHtSZWdFeHB9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhZ3NXaGl0ZWxpc3Q6IGZ1bmN0aW9uIChsaXN0KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoJzxcXFxcLz9cXFxcYig/IVxcXFxiJyArIGxpc3QucmVwbGFjZSgvXFx8L2csICdcXFxcYnxcXFxcYicpICsgJ1xcXFxiKVtePl0qPicsICdnaScpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBGaXggdGFncyB0aGF0IGRvIG5vdCBmaXQgdGhlIGVkaXRvciBmb3JtYXQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGRvY3VtZW50RnJhZ21lbnQgRG9jdW1lbnQgZnJhZ21lbnQgXCJET0NVTUVOVF9GUkFHTUVOVF9OT0RFXCIgKG5vZGVUeXBlID09PSAxMSlcclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBodG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHAgRWRpdG9yIHRhZ3Mgd2hpdGVsaXN0IChjb3JlLl9odG1sQ2hlY2tXaGl0ZWxpc3RSZWdFeHApXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfY29uc2lzdGVuY3lDaGVja09mSFRNTDogZnVuY3Rpb24gKGRvY3VtZW50RnJhZ21lbnQsIGh0bWxDaGVja1doaXRlbGlzdFJlZ0V4cCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEl0IGlzIGNhbiB1c2UgXCIuY2hpbGRyZW4odXRpbC5nZXRMaXN0Q2hpbGRyZW4pXCIgdG8gZXhjbHVkZSB0ZXh0IG5vZGVzLCBidXQgXCJkb2N1bWVudEZyYWdtZW50LmNoaWxkcmVuXCIgaXMgbm90IHN1cHBvcnRlZCBpbiBJRS5cclxuICAgICAgICAgKiBTbyBjaGVjayB0aGUgbm9kZSB0eXBlIGFuZCBleGNsdWRlIHRoZSB0ZXh0IG5vIChjdXJyZW50Lm5vZGVUeXBlICE9PSAxKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZVRhZ3MgPSBbXSwgZW1wdHlUYWdzID0gW10sIHdyb25nTGlzdCA9IFtdLCB3aXRob3V0Rm9ybWF0Q2VsbHMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gd3JvbmcgcG9zaXRpb25cclxuICAgICAgICBjb25zdCB3cm9uZ1RhZ3MgPSB0aGlzLmdldExpc3RDaGlsZE5vZGVzKGRvY3VtZW50RnJhZ21lbnQsIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyB3aGl0ZSBsaXN0XHJcbiAgICAgICAgICAgIGlmICghaHRtbENoZWNrV2hpdGVsaXN0UmVnRXhwLnRlc3QoY3VycmVudC5ub2RlTmFtZSkgJiYgY3VycmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzTm90Q2hlY2tpbmdOb2RlKGN1cnJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVUYWdzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ydGFnID0gIXRoaXMuZ2V0UGFyZW50RWxlbWVudChjdXJyZW50LCB0aGlzLmlzTm90Q2hlY2tpbmdOb2RlKTtcclxuICAgICAgICAgICAgLy8gZW1wdHkgdGFnc1xyXG4gICAgICAgICAgICBpZiAoKCF0aGlzLmlzVGFibGUoY3VycmVudCkgJiYgIXRoaXMuaXNMaXN0Q2VsbChjdXJyZW50KSkgJiYgKHRoaXMuaXNGb3JtYXRFbGVtZW50KGN1cnJlbnQpIHx8IHRoaXMuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY3VycmVudCkgfHwgdGhpcy5pc1RleHRTdHlsZUVsZW1lbnQoY3VycmVudCkpICYmIGN1cnJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDAgJiYgbnJ0YWcpIHtcclxuICAgICAgICAgICAgICAgIGVtcHR5VGFncy5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB3cm9uZyBsaXN0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdChjdXJyZW50LnBhcmVudE5vZGUpICYmICF0aGlzLmlzTGlzdChjdXJyZW50KSAmJiAhdGhpcy5pc0xpc3RDZWxsKGN1cnJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB3cm9uZ0xpc3QucHVzaChjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdGFibGUgY2VsbHNcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDZWxsKGN1cnJlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmZWwgPSBjdXJyZW50LmZpcnN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRm9ybWF0RWxlbWVudChmZWwpICYmICF0aGlzLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGZlbCkgJiYgIXRoaXMuaXNDb21wb25lbnQoZmVsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpdGhvdXRGb3JtYXRDZWxscy5wdXNoKGN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY3VycmVudC5wYXJlbnROb2RlICE9PSBkb2N1bWVudEZyYWdtZW50ICYmXHJcbiAgICAgICAgICAgICAodGhpcy5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudCkgfHwgdGhpcy5pc0NvbXBvbmVudChjdXJyZW50KSB8fCB0aGlzLmlzTGlzdChjdXJyZW50KSkgJiZcclxuICAgICAgICAgICAgICF0aGlzLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGN1cnJlbnQucGFyZW50Tm9kZSkgJiYgIXRoaXMuaXNMaXN0Q2VsbChjdXJyZW50LnBhcmVudE5vZGUpICYmXHJcbiAgICAgICAgICAgICAhdGhpcy5nZXRQYXJlbnRFbGVtZW50KGN1cnJlbnQsIHRoaXMuaXNDb21wb25lbnQpICYmIG5ydGFnO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmVtb3ZlVGFncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0ocmVtb3ZlVGFnc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNoZWNrVGFncyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB3cm9uZ1RhZ3MubGVuZ3RoLCB0LCBwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdCA9IHdyb25nVGFnc1tpXTtcclxuICAgICAgICAgICAgcCA9IHQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgaWYgKCFwIHx8ICFwLnBhcmVudE5vZGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsIHApO1xyXG4gICAgICAgICAgICBjaGVja1RhZ3MucHVzaChwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjaGVja1RhZ3MubGVuZ3RoLCB0OyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdCA9IGNoZWNrVGFnc1tpXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25seVplcm9XaWR0aFNwYWNlKHQudGV4dENvbnRlbnQudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZW1wdHlUYWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShlbXB0eVRhZ3NbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHdyb25nTGlzdC5sZW5ndGgsIHQsIHRwLCBjaGlsZHJlbiwgcDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHQgPSB3cm9uZ0xpc3RbaV07XHJcblxyXG4gICAgICAgICAgICB0cCA9IHRoaXMuY3JlYXRlRWxlbWVudCgnTEknKTtcclxuICAgICAgICAgICAgY2hpbGRyZW4gPSB0LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlblswXSkge1xyXG4gICAgICAgICAgICAgICAgdHAuYXBwZW5kQ2hpbGQoY2hpbGRyZW5bMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBwID0gdC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICBpZiAoIXApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBwLmluc2VydEJlZm9yZSh0cCwgdCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbSh0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB3aXRob3V0Rm9ybWF0Q2VsbHMubGVuZ3RoLCB0LCBmOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgdCA9IHdpdGhvdXRGb3JtYXRDZWxsc1tpXTtcclxuICAgICAgICAgICAgZiA9IHRoaXMuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgICAgIGYuaW5uZXJIVE1MID0gKHQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCAmJiB0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgPyAnPGJyPicgOiB0LmlubmVySFRNTDtcclxuICAgICAgICAgICAgdC5pbm5lckhUTUwgPSBmLm91dGVySFRNTDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIF9zZXREZWZhdWx0T3B0aW9uU3R5bGU6IGZ1bmN0aW9uIChvcHRpb25zLCBkZWZhdWx0U3R5bGUpIHtcclxuICAgICAgICBsZXQgb3B0aW9uU3R5bGUgPSAnJztcclxuICAgICAgICBpZiAob3B0aW9ucy5oZWlnaHQpIG9wdGlvblN0eWxlICs9ICdoZWlnaHQ6JyArIG9wdGlvbnMuaGVpZ2h0ICsgJzsnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLm1pbkhlaWdodCkgb3B0aW9uU3R5bGUgKz0gJ21pbi1oZWlnaHQ6JyArIG9wdGlvbnMubWluSGVpZ2h0ICsgJzsnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLm1heEhlaWdodCkgb3B0aW9uU3R5bGUgKz0gJ21heC1oZWlnaHQ6JyArIG9wdGlvbnMubWF4SGVpZ2h0ICsgJzsnO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uKSBvcHRpb25TdHlsZSArPSAncG9zaXRpb246JyArIG9wdGlvbnMucG9zaXRpb24gKyAnOyc7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMud2lkdGgpIG9wdGlvblN0eWxlICs9ICd3aWR0aDonICsgb3B0aW9ucy53aWR0aCArICc7JztcclxuICAgICAgICBpZiAob3B0aW9ucy5taW5XaWR0aCkgb3B0aW9uU3R5bGUgKz0gJ21pbi13aWR0aDonICsgb3B0aW9ucy5taW5XaWR0aCArICc7JztcclxuICAgICAgICBpZiAob3B0aW9ucy5tYXhXaWR0aCkgb3B0aW9uU3R5bGUgKz0gJ21heC13aWR0aDonICsgb3B0aW9ucy5tYXhXaWR0aCArICc7JztcclxuXHJcbiAgICAgICAgbGV0IHRvcCA9ICcnLCBmcmFtZSA9ICcnLCBlZGl0b3IgPSAnJztcclxuICAgICAgICBkZWZhdWx0U3R5bGUgPSBvcHRpb25TdHlsZSArIGRlZmF1bHRTdHlsZTtcclxuICAgICAgICBjb25zdCBzdHlsZUFyciA9IGRlZmF1bHRTdHlsZS5zcGxpdCgnOycpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHlsZUFyci5sZW5ndGgsIHM7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gc3R5bGVBcnJbaV0udHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoL14obWluLXxtYXgtKT93aWR0aFxccyo6Ly50ZXN0KHMpIHx8IC9eKHotaW5kZXh8cG9zaXRpb24pXFxzKjovLnRlc3QocykpIHtcclxuICAgICAgICAgICAgICAgIHRvcCArPSBzICsgJzsnO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKC9eKG1pbi18bWF4LSk/aGVpZ2h0XFxzKjovLnRlc3QocykpIHtcclxuICAgICAgICAgICAgICAgIGlmICgvXmhlaWdodC8udGVzdChzKSAmJiBzLnNwbGl0KCc6JylbMV0udHJpbSgpID09PSAnYXV0bycpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZyYW1lICs9IHMgKyAnOyc7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlZGl0b3IgKz0gcyArICc7JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvcDogdG9wLFxyXG4gICAgICAgICAgICBmcmFtZTogZnJhbWUsXHJcbiAgICAgICAgICAgIGVkaXRvcjogZWRpdG9yXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldElmcmFtZURvY3VtZW50OiBmdW5jdGlvbiAoZnJhbWUsIG9wdGlvbnMpIHtcclxuICAgICAgICBmcmFtZS5zZXRBdHRyaWJ1dGUoJ3Njcm9sbGluZycsICdhdXRvJyk7XHJcbiAgICAgICAgZnJhbWUuY29udGVudERvY3VtZW50LmhlYWQuaW5uZXJIVE1MID0gJycgK1xyXG4gICAgICAgICAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nICtcclxuICAgICAgICAgICAgJzxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPicgK1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRJZnJhbWVDc3NUYWdzKG9wdGlvbnMpO1xyXG4gICAgICAgIGZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9IG9wdGlvbnMuX2VkaXRhYmxlQ2xhc3M7XHJcbiAgICAgICAgZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NldElmcmFtZUNzc1RhZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgbGlua05hbWVzID0gb3B0aW9ucy5pZnJhbWVDU1NGaWxlTmFtZTtcclxuICAgICAgICBjb25zdCB3UmVnRXhwID0gdGhpcy5fdy5SZWdFeHA7XHJcbiAgICAgICAgbGV0IHRhZ1N0cmluZyA9ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBmID0gMCwgbGVuID0gbGlua05hbWVzLmxlbmd0aCwgcGF0aDsgZiA8IGxlbjsgZisrKSB7XHJcbiAgICAgICAgICAgIHBhdGggPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICgvKF5odHRwcz86XFwvXFwvKXwoXmRhdGE6dGV4dFxcL2NzcywpLy50ZXN0KGxpbmtOYW1lc1tmXSkpIHtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChsaW5rTmFtZXNbZl0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgQ1NTRmlsZU5hbWUgPSBuZXcgd1JlZ0V4cCgnKF58LipbXFxcXC9dKScgKyBsaW5rTmFtZXNbZl0gKyAnKFxcXFwuLispP1xcXFwuY3NzKD86XFxcXD8uKnw7LiopPyQnLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaW5rJyksIGkgPSAwLCBsZW4gPSBjLmxlbmd0aCwgc3R5bGVUYWc7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlVGFnID0gY1tpXS5ocmVmLm1hdGNoKENTU0ZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVUYWcpIHBhdGgucHVzaChzdHlsZVRhZ1swXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA9PT0gMCkgdGhyb3cgJ1tTVU5FRElUT1IuY29uc3RydWN0b3IuaWZyYW1lLmZhaWxdIFRoZSBzdW5lZGl0b3IgQ1NTIGZpbGVzIGluc3RhbGxhdGlvbiBwYXRoIGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiBQbGVhc2Ugc2V0IHRoZSBvcHRpb24gcHJvcGVydHkgXCJpZnJhbWVDU1NGaWxlTmFtZVwiIGJlZm9yZSBjcmVhdGluZyBlZGl0b3IgaW5zdGFuY2VzLic7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGF0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGFnU3RyaW5nICs9ICc8bGluayBocmVmPVwiJyArIHBhdGhbaV0gKyAnXCIgcmVsPVwic3R5bGVzaGVldFwiPic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0YWdTdHJpbmcgKyAob3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyA/ICc8c3R5bGU+XFxuLyoqIElmcmFtZSBoZWlnaHQgYXV0byAqL1xcbmJvZHl7aGVpZ2h0OiBtaW4tY29udGVudDsgb3ZlcmZsb3c6IGhpZGRlbjt9XFxuPC9zdHlsZT4nIDogJycpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXRpbDsiLCIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IF9pY29ucyBmcm9tICcuLi9hc3NldHMvZGVmYXVsdEljb25zJztcclxuaW1wb3J0IF9kZWZhdWx0TGFuZyBmcm9tICcuLi9sYW5nL2VuJztcclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGRvY3VtZW50IGNyZWF0ZVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRleHRhcmVhXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgZG9jID0gZG9jdW1lbnQ7XHJcblxyXG4gICAgICAgIC8qKiAtLS0gaW5pdCBvcHRpb25zIC0tLSAqL1xyXG4gICAgICAgIHRoaXMuX2luaXRPcHRpb25zKGVsZW1lbnQsIG9wdGlvbnMpO1xyXG4gICAgXHJcbiAgICAgICAgLy8gc3VuZWRpdG9yIGRpdlxyXG4gICAgICAgIGNvbnN0IHRvcF9kaXYgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgdG9wX2Rpdi5jbGFzc05hbWUgPSAnc3VuLWVkaXRvcicgKyAob3B0aW9ucy5ydGwgPyAnIHNlLXJ0bCcgOiAnJyk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHRvcF9kaXYuaWQgPSAnc3VuZWRpdG9yXycgKyBlbGVtZW50LmlkO1xyXG4gICAgXHJcbiAgICAgICAgLy8gcmVsYXRpdmUgZGl2XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmUgPSBkb2MuY3JlYXRlRWxlbWVudCgnRElWJyk7XHJcbiAgICAgICAgcmVsYXRpdmUuY2xhc3NOYW1lID0gJ3NlLWNvbnRhaW5lcic7XHJcbiAgICBcclxuICAgICAgICAvLyB0b29sYmFyXHJcbiAgICAgICAgY29uc3QgdG9vbF9iYXIgPSB0aGlzLl9jcmVhdGVUb29sQmFyKGRvYywgb3B0aW9ucy5idXR0b25MaXN0LCBvcHRpb25zLnBsdWdpbnMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHRvb2xfYmFyLmVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgIGlmICh0b29sX2Jhci5wbHVnaW5DYWxsQnV0dG9ucy5tYXRoKSB0aGlzLl9jaGVja0thdGV4TWF0aChvcHRpb25zLmthdGV4KTtcclxuICAgICAgICBjb25zdCBhcnJvdyA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBhcnJvdy5jbGFzc05hbWUgPSAnc2UtYXJyb3cnO1xyXG5cclxuICAgICAgICAvLyBzdGlja3kgdG9vbGJhciBkdW1teVxyXG4gICAgICAgIGNvbnN0IHN0aWNreV9kdW1teSA9IGRvYy5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBzdGlja3lfZHVtbXkuY2xhc3NOYW1lID0gJ3NlLXRvb2xiYXItc3RpY2t5LWR1bW15JztcclxuICAgIFxyXG4gICAgICAgIC8vIGlubmVyIGVkaXRvciBkaXZcclxuICAgICAgICBjb25zdCBlZGl0b3JfZGl2ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgIGVkaXRvcl9kaXYuY2xhc3NOYW1lID0gJ3NlLXdyYXBwZXInO1xyXG5cclxuICAgICAgICAvKiogLS0tIGluaXQgZWxlbWVudHMgYW5kIGNyZWF0ZSBib3R0b20gYmFyIC0tLSAqL1xyXG4gICAgICAg /** * Suneditor ko.js code from cdn */ /* * wysiwyg web editor * * suneditor.js * Copyright 2017 JiHong Lee. * MIT license. */ 'use strict'; (function (global, factory) { if (typeof module === 'object' && typeof module.exports === 'object') { module.exports = global.document ? factory(global, true) : function (w) { if (!w.document) { throw new Error('SUNEDITOR_LANG a window with a document'); } return factory(w); }; } else { factory(global); } }(typeof window !== 'undefined' ? window : this, function (window, noGlobal) { const lang = { code: 'ko', toolbar: { default: '기본값', save: '저장', font: '글꼴', formats: '문단 형식', fontSize: '크기', bold: '굵게', underline: '밑줄', italic: '기울임', strike: '취소선', subscript: '아래 첨자', superscript: '위 첨자', removeFormat: '형식 제거', fontColor: '글자색', hiliteColor: '배경색', indent: '들여쓰기', outdent: '내어쓰기', align: '정렬', alignLeft: '왼쪽 정렬', alignRight: '오른쪽 정렬', alignCenter: '가운데 정렬', alignJustify: '양쪽 정렬', list: '리스트', orderList: '숫자형 리스트', unorderList: '원형 리스트', horizontalRule: '가로 줄 삽입', hr_solid: '실선', hr_dotted: '점선', hr_dashed: '대시', table: '테이블', link: '링크', math: '수식', image: '이미지', video: '동영상', audio: '오디오', fullScreen: '전체 화면', showBlocks: '블록 보기', codeView: 'HTML 편집', undo: '실행 취소', redo: '다시 실행', preview: '미리보기', print: '인쇄', tag_p: '본문', tag_div: '기본 (DIV)', tag_h: '제목', tag_blockquote: '인용문', tag_pre: '코드', template: '템플릿', lineHeight: '줄 높이', paragraphStyle: '문단 스타일', textStyle: '글자 스타일', imageGallery: '이미지 갤러리', mention: '멘션' }, dialogBox: { linkBox: { title: '링크 삽입', url: '인터넷 주소', text: '화면 텍스트', newWindowCheck: '새창으로 열기', downloadLinkCheck: '다운로드 링크', bookmark: '북마크' }, mathBox: { title: '수식', inputLabel: '수학적 표기법', fontSizeLabel: '글자 크기', previewLabel: '미리보기' }, imageBox: { title: '이미지 삽입', file: '파일 선택', url: '이미지 주소', altText: '대체 문자열' }, videoBox: { title: '동영상 삽입', file: '파일 선택', url: '미디어 임베드 주소, 유튜브/비메오' }, audioBox: { title: '오디오 삽입', file: '파일 선택', url: '오디오 파일 주소' }, browser: { tags: '태그', search: '검색', }, caption: '설명 넣기', close: '닫기', submitButton: '확인', revertButton: '되돌리기', proportion: '비율 맞춤', basic: '기본', left: '왼쪽', right: '오른쪽', center: '가운데', width: '가로', height: '세로', size: '크기', ratio: '비율' }, controller: { edit: '편집', unlink: '링크 해제', remove: '삭제', insertRowAbove: '위에 행 삽입', insertRowBelow: '아래에 행 삽입', deleteRow: '행 삭제', insertColumnBefore: '왼쪽에 열 삽입', insertColumnAfter: '오른쪽에 열 삽입', deleteColumn: '열 삭제', fixedColumnWidth: '고정 된 열 너비', resize100: '100% 크기', resize75: '75% 크기', resize50: '50% 크기', resize25: '25% 크기', autoSize: '자동 크기', mirrorHorizontal: '좌우 반전', mirrorVertical: '상하 반전', rotateLeft: '왼쪽으로 회전', rotateRight: '오른쪽으로 회전', maxSize: '최대화', minSize: '최소화', tableHeader: '테이블 제목', mergeCells: '셀 병합', splitCells: '셀 분할', HorizontalSplit: '가로 분할', VerticalSplit: '세로 분할' }, menu: { spaced: '글자 간격', bordered: '경계선', neon: '네온', translucent: '반투명', shadow: '그림자', code: '코드' } }; if (typeof noGlobal === typeof undefined) { if (!window.SUNEDITOR_LANG) { Object.defineProperty(window, 'SUNEDITOR_LANG', { enumerable: true, writable: false, configurable: false, value: {} }); } Object.defineProperty(window.SUNEDITOR_LANG, 'ko', { enumerable: true, writable: true, configurable: true, value: lang }); } return lang; })); /** * Luckysheet plugin.js cdn code if needed to update then paste the code in this section below the * latest code from luckysheet cdn i.e plugin.js */ !function (t, e) { "object" == typeof module && "object" == typeof module.exports ? module.exports = t.document ? e(t, !0) : function (t) { if (!t.document) throw new Error("jQuery requires a window with a document"); return e(t) } : e(t) }("undefined" != typeof window ? window : this, function (x, t) { function e(t, e) { return e.toUpperCase() } var n = [], C = x.document, l = n.slice, g = n.concat, a = n.push, i = n.indexOf, r = {}, o = r.toString, d = r.hasOwnProperty, m = {}, s = "2.2.4", k = function (t, e) { return new k.fn.init(t, e) }, u = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, c = /^-ms-/, h = /-([\da-z])/gi; function f(t) { var e = !!t && "length" in t && t.length, n = k.type(t); return "function" !== n && !k.isWindow(t) && ("array" === n || 0 === e || "number" == typeof e && 0 < e && e - 1 in t) } k.fn = k.prototype = { jquery: s, constructor: k, selector: "", length: 0, toArray: function () { return l.call(this) }, get: function (t) { return null != t ? t < 0 ? this[t + this.length] : this[t] : l.call(this) }, pushStack: function (t) { t = k.merge(this.constructor(), t); return t.prevObject = this, t.context = this.context, t }, each: function (t) { return k.each(this, t) }, map: function (n) { return this.pushStack(k.map(this, function (t, e) { return n.call(t, e, t) })) }, slice: function () { return this.pushStack(l.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, eq: function (t) { var e = this.length, t = +t + (t < 0 ? e : 0); return this.pushStack(0 <= t && t < e ? [this[t]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: a, sort: n.sort, splice: n.splice }, k.extend = k.fn.extend = function () { var t, e, n, r, i, o = arguments[0] || {}, s = 1, a = arguments.length, u = !1; for ("boolean" == typeof o && (u = o, o = arguments[s] || {}, s++), "object" == typeof o || k.isFunction(o) || (o = {}), s === a && (o = this, s--); s < a; s++)if (null != (t = arguments[s])) for (e in t) i = o[e], n = t[e], o !== n && (u && n && (k.isPlainObject(n) || (r = k.isArray(n))) ? (i = r ? (r = !1, i && k.isArray(i) ? i : []) : i && k.isPlainObject(i) ? i : {}, o[e] = k.extend(u, i, n)) : void 0 !== n && (o[e] = n)); return o }, k.extend({ expando: "jQuery" + (s + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (t) { throw new Error(t) }, noop: function () { }, isFunction: function (t) { return "function" === k.type(t) }, isArray: Array.isArray, isWindow: function (t) { return null != t && t === t.window }, isNumeric: function (t) { var e = t && t.toString(); return !k.isArray(t) && 0 <= e - parseFloat(e) + 1 }, isPlainObject: function (t) { if ("object" !== k.type(t) || t.nodeType || k.isWindow(t)) return !1; if (t.constructor && !d.call(t, "constructor") && !d.call(t.constructor.prototype || {}, "isPrototypeOf")) return !1; for (var e in t); return void 0 === e || d.call(t, e) }, isEmptyObject: function (t) { for (var e in t) return !1; return !0 }, type: function (t) { return null == t ? t + "" : "object" == typeof t || "function" == typeof t ? r[o.call(t)] || "object" : typeof t }, globalEval: function (t) { var e, n = eval; (t = k.trim(t)) && (1 === t.indexOf("use strict") ? ((e = C.createElement("script")).text = t, C.head.appendChild(e).parentNode.removeChild(e)) : n(t)) }, camelCase: function (t) { return t.replace(c, "ms-").replace(h, e) }, nodeName: function (t, e) { return t.nodeName && t.nodeName.toLowerCase() === e.toLowerCase() }, each: function (t, e) { var n, r = 0; if (f(t)) for (n = t.length; r < n && !1 !== e.call(t[r], r, t[r]); r++); else for (r in t) if (!1 === e.call(t[r], r, t[r])) break; return t }, trim: function (t) { return null == t ? "" : (t + "").replace(u, "") }, makeArray: function (t, e) { e = e || []; return null != t && (f(Object(t)) ? k.merge(e, "string" == typeof t ? [t] : t) : a.call(e, t)), e }, inArray: function (t, e, n) { return null == e ? -1 : i.call(e, t, n) }, merge: function (t, e) { for (var n = +e.length, r = 0, i = t.length; r < n; r++)t[i++] = e[r]; return t.length = i, t }, grep: function (t, e, n) { for (var r = [], i = 0, o = t.length, s = !n; i < o; i++)!e(t[i], i) != s && r.push(t[i]); return r }, map: function (t, e, n) { var r, i, o = 0, s = []; if (f(t)) for (r = t.length; o < r; o++)null != (i = e(t[o], o, n)) && s.push(i); else for (o in t) i = e(t[o], o, n), null != i && s.push(i); return g.apply([], s) }, guid: 1, proxy: function (t, e) { var n, r; return "string" == typeof e && (r = t[e], e = t, t = r), k.isFunction(t) ? (n = l.call(arguments, 2), (r = function () { return t.apply(e || this, n.concat(l.call(arguments))) }).guid = t.guid = t.guid || k.guid++, r) : void 0 }, now: Date.now, support: m }), "function" == typeof Symbol && (k.fn[Symbol.iterator] = n[Symbol.iterator]), k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (t, e) { r["[object " + e + "]"] = e.toLowerCase() }); var p = function (n) { function h(t, e, n) { var r = "0x" + e - 65536; return r != r || n ? e : r < 0 ? String.fromCharCode(65536 + r) : String.fromCharCode(r >> 10 | 55296, 1023 & r | 56320) } function e() { x() } var t, d, w, o, r, g, f, m, _, u, c, x, C, i, k, v, s, a, y, S = "sizzle" + +new Date, b = n.document, O = 0, l = 0, p = it(), E = it(), T = it(), A = function (t, e) { return t === e && (c = !0), 0 }, I = {}.hasOwnProperty, j = [], P = j.pop, N = j.push, D = j.push, R = j.slice, M = function (t, e) { for (var n = 0, r = t.length; n < r; n++)if (t[n] === e) return n; return -1 }, W = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", L = "[\\x20\\t\\r\\n\\f]", F = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", H = "\\[" + L + "*(" + F + ")(?:" + L + "*([*^$|!~]?=)" + L + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + F + "))|)" + L + "*\\]", B = ":(" + F + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + H + ")*)|.*)\\)|)", q = new RegExp(L + "+", "g"), z = new RegExp("^" + L + "+|((?:^|[^\\\\])(?:\\\\.)*)" + L + "+$", "g"), U = new RegExp("^" + L + "*," + L + "*"), G = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"), V = new RegExp("=" + L + "*([^\\]'\"]*?)" + L + "*\\]", "g"), $ = new RegExp(B), X = new RegExp("^" + F + "$"), Y = { ID: new RegExp("^#(" + F + ")"), CLASS: new RegExp("^\\.(" + F + ")"), TAG: new RegExp("^(" + F + "|[*])"), ATTR: new RegExp("^" + H), PSEUDO: new RegExp("^" + B), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + L + "*(even|odd|(([+-]|)(\\d*)n|)" + L + "*(?:([+-]|)" + L + "*(\\d+)|))" + L + "*\\)|)", "i"), bool: new RegExp("^(?:" + W + ")$", "i"), needsContext: new RegExp("^" + L + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + L + "*((?:-\\d)?\\d*)" + L + "*\\)|)(?=[^-]|$)", "i") }, K = /^(?:input|select|textarea|button)$/i, Q = /^h\d$/i, J = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, tt = /[+~]/, et = /'|\\/g, nt = new RegExp("\\\\([\\da-f]{1,6}" + L + "?|(" + L + ")|.)", "ig"); try { D.apply(j = R.call(b.childNodes), b.childNodes), j[b.childNodes.length].nodeType } catch (t) { D = { apply: j.length ? function (t, e) { N.apply(t, R.call(e)) } : function (t, e) { for (var n = t.length, r = 0; t[n++] = e[r++];); t.length = n - 1 } } } function rt(t, e, n, r) { var i, o, s, a, u, c, l, h, f = e && e.ownerDocument, p = e ? e.nodeType : 9; if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; if (!r && ((e ? e.ownerDocument || e : b) !== C && x(e), e = e || C, k)) { if (11 !== p && (c = Z.exec(t))) if (i = c[1]) { if (9 === p) { if (!(s = e.getElementById(i))) return n; if (s.id === i) return n.push(s), n } else if (f && (s = f.getElementById(i)) && y(e, s) && s.id === i) return n.push(s), n } else { if (c[2]) return D.apply(n, e.getElementsByTagName(t)), n; if ((i = c[3]) && d.getElementsByClassName && e.getElementsByClassName) return D.apply(n, e.getElementsByClassName(i)), n } if (d.qsa && !T[t + " "] && (!v || !v.test(t))) { if (1 !== p) f = e, h = t; else if ("object" !== e.nodeName.toLowerCase()) { for ((a = e.getAttribute("id")) ? a = a.replace(et, "\\$&") : e.setAttribute("id", a = S), o = (l = g(t)).length, u = X.test(a) ? "#" + a : "[id='" + a + "']"; o--;)l[o] = u + " " + ft(l[o]); h = l.join(","), f = tt.test(t) && lt(e.parentNode) || e } if (h) try { return D.apply(n, f.querySelectorAll(h)), n } catch (t) { } finally { a === S && e.removeAttribute("id") } } } return m(t.replace(z, "$1"), e, n, r) } function it() { var n = []; function r(t, e) { return n.push(t + " ") > w.cacheLength && delete r[n.shift()], r[t + " "] = e } return r } function ot(t) { return t[S] = !0, t } function st(t) { var e = C.createElement("div"); try { return !!t(e) } catch (t) { return !1 } finally { e.parentNode && e.parentNode.removeChild(e), e = null } } function at(t, e) { for (var n = t.split("|"), r = n.length; r--;)w.attrHandle[n[r]] = e } function ut(t, e) { var n = e && t, r = n && 1 === t.nodeType && 1 === e.nodeType && (~e.sourceIndex || 1 << 31) - (~t.sourceIndex || 1 << 31); if (r) return r; if (n) for (; n = n.nextSibling;)if (n === e) return -1; return t ? 1 : -1 } function ct(s) { return ot(function (o) { return o = +o, ot(function (t, e) { for (var n, r = s([], t.length, o), i = r.length; i--;)t[n = r[i]] && (t[n] = !(e[n] = t[n])) }) }) } function lt(t) { return t && void 0 !== t.getElementsByTagName && t } for (t in d = rt.support = {}, r = rt.isXML = function (t) { t = t && (t.ownerDocument || t).documentElement; return !!t && "HTML" !== t.nodeName }, x = rt.setDocument = function (t) { var t = t ? t.ownerDocument || t : b; return t !== C && 9 === t.nodeType && t.documentElement && (i = (C = t).documentElement, k = !r(C), (t = C.defaultView) && t.top !== t && (t.addEventListener ? t.addEventListener("unload", e, !1) : t.attachEvent && t.attachEvent("onunload", e)), d.attributes = st(function (t) { return t.className = "i", !t.getAttribute("className") }), d.getElementsByTagName = st(function (t) { return t.appendChild(C.createComment("")), !t.getElementsByTagName("*").length }), d.getElementsByClassName = J.test(C.getElementsByClassName), d.getById = st(function (t) { return i.appendChild(t).id = S, !C.getElementsByName || !C.getElementsByName(S).length }), d.getById ? (w.find.ID = function (t, e) { if (void 0 !== e.getElementById && k) { t = e.getElementById(t); return t ? [t] : [] } }, w.filter.ID = function (t) { var e = t.replace(nt, h); return function (t) { return t.getAttribute("id") === e } }) : (delete w.find.ID, w.filter.ID = function (t) { var e = t.replace(nt, h); return function (t) { t = void 0 !== t.getAttributeNode && t.getAttributeNode("id"); return t && t.value === e } }), w.find.TAG = d.getElementsByTagName ? function (t, e) { return void 0 !== e.getElementsByTagName ? e.getElementsByTagName(t) : d.qsa ? e.querySelectorAll(t) : void 0 } : function (t, e) { var n, r = [], i = 0, o = e.getElementsByTagName(t); if ("*" !== t) return o; for (; n = o[i++];)1 === n.nodeType && r.push(n); return r }, w.find.CLASS = d.getElementsByClassName && function (t, e) { return void 0 !== e.getElementsByClassName && k ? e.getElementsByClassName(t) : void 0 }, s = [], v = [], (d.qsa = J.test(C.querySelectorAll)) && (st(function (t) { i.appendChild(t).innerHTML = "", t.querySelectorAll("[msallowcapture^='']").length && v.push("[*^$]=" + L + "*(?:''|\"\")"), t.querySelectorAll("[selected]").length || v.push("\\[" + L + "*(?:value|" + W + ")"), t.querySelectorAll("[id~=" + S + "-]").length || v.push("~="), t.querySelectorAll(":checked").length || v.push(":checked"), t.querySelectorAll("a#" + S + "+*").length || v.push(".#.+[+~]") }), st(function (t) { var e = C.createElement("input"); e.setAttribute("type", "hidden"), t.appendChild(e).setAttribute("name", "D"), t.querySelectorAll("[name=d]").length && v.push("name" + L + "*[*^$|!~]?="), t.querySelectorAll(":enabled").length || v.push(":enabled", ":disabled"), t.querySelectorAll("*,:x"), v.push(",.*:") })), (d.matchesSelector = J.test(a = i.matches || i.webkitMatchesSelector || i.mozMatchesSelector || i.oMatchesSelector || i.msMatchesSelector)) && st(function (t) { d.disconnectedMatch = a.call(t, "div"), a.call(t, "[s!='']:x"), s.push("!=", B) }), v = v.length && new RegExp(v.join("|")), s = s.length && new RegExp(s.join("|")), t = J.test(i.compareDocumentPosition), y = t || J.test(i.contains) ? function (t, e) { var n = 9 === t.nodeType ? t.documentElement : t, e = e && e.parentNode; return t === e || !(!e || 1 !== e.nodeType || !(n.contains ? n.contains(e) : t.compareDocumentPosition && 16 & t.compareDocumentPosition(e))) } : function (t, e) { if (e) for (; e = e.parentNode;)if (e === t) return !0; return !1 }, A = t ? function (t, e) { if (t === e) return c = !0, 0; var n = !t.compareDocumentPosition - !e.compareDocumentPosition; return n || (1 & (n = (t.ownerDocument || t) === (e.ownerDocument || e) ? t.compareDocumentPosition(e) : 1) || !d.sortDetached && e.compareDocumentPosition(t) === n ? t === C || t.ownerDocument === b && y(b, t) ? -1 : e === C || e.ownerDocument === b && y(b, e) ? 1 : u ? M(u, t) - M(u, e) : 0 : 4 & n ? -1 : 1) } : function (t, e) { if (t === e) return c = !0, 0; var n, r = 0, i = t.parentNode, o = e.parentNode, s = [t], a = [e]; if (!i || !o) return t === C ? -1 : e === C ? 1 : i ? -1 : o ? 1 : u ? M(u, t) - M(u, e) : 0; if (i === o) return ut(t, e); for (n = t; n = n.parentNode;)s.unshift(n); for (n = e; n = n.parentNode;)a.unshift(n); for (; s[r] === a[r];)r++; return r ? ut(s[r], a[r]) : s[r] === b ? -1 : a[r] === b ? 1 : 0 }), C }, rt.matches = function (t, e) { return rt(t, null, null, e) }, rt.matchesSelector = function (t, e) { if ((t.ownerDocument || t) !== C && x(t), e = e.replace(V, "='$1']"), d.matchesSelector && k && !T[e + " "] && (!s || !s.test(e)) && (!v || !v.test(e))) try { var n = a.call(t, e); if (n || d.disconnectedMatch || t.document && 11 !== t.document.nodeType) return n } catch (t) { } return 0 < rt(e, C, null, [t]).length }, rt.contains = function (t, e) { return (t.ownerDocument || t) !== C && x(t), y(t, e) }, rt.attr = function (t, e) { (t.ownerDocument || t) !== C && x(t); var n = w.attrHandle[e.toLowerCase()], n = n && I.call(w.attrHandle, e.toLowerCase()) ? n(t, e, !k) : void 0; return void 0 !== n ? n : d.attributes || !k ? t.getAttribute(e) : (n = t.getAttributeNode(e)) && n.specified ? n.value : null }, rt.error = function (t) { throw new Error("Syntax error, unrecognized expression: " + t) }, rt.uniqueSort = function (t) { var e, n = [], r = 0, i = 0; if (c = !d.detectDuplicates, u = !d.sortStable && t.slice(0), t.sort(A), c) { for (; e = t[i++];)e === t[i] && (r = n.push(i)); for (; r--;)t.splice(n[r], 1) } return u = null, t }, o = rt.getText = function (t) { var e, n = "", r = 0, i = t.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof t.textContent) return t.textContent; for (t = t.firstChild; t; t = t.nextSibling)n += o(t) } else if (3 === i || 4 === i) return t.nodeValue } else for (; e = t[r++];)n += o(e); return n }, (w = rt.selectors = { cacheLength: 50, createPseudo: ot, match: Y, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (t) { return t[1] = t[1].replace(nt, h), t[3] = (t[3] || t[4] || t[5] || "").replace(nt, h), "~=" === t[2] && (t[3] = " " + t[3] + " "), t.slice(0, 4) }, CHILD: function (t) { return t[1] = t[1].toLowerCase(), "nth" === t[1].slice(0, 3) ? (t[3] || rt.error(t[0]), t[4] = +(t[4] ? t[5] + (t[6] || 1) : 2 * ("even" === t[3] || "odd" === t[3])), t[5] = +(t[7] + t[8] || "odd" === t[3])) : t[3] && rt.error(t[0]), t }, PSEUDO: function (t) { var e, n = !t[6] && t[2]; return Y.CHILD.test(t[0]) ? null : (t[3] ? t[2] = t[4] || t[5] || "" : n && $.test(n) && (e = g(n, !0)) && (e = n.indexOf(")", n.length - e) - n.length) && (t[0] = t[0].slice(0, e), t[2] = n.slice(0, e)), t.slice(0, 3)) } }, filter: { TAG: function (t) { var e = t.replace(nt, h).toLowerCase(); return "*" === t ? function () { return !0 } : function (t) { return t.nodeName && t.nodeName.toLowerCase() === e } }, CLASS: function (t) { var e = p[t + " "]; return e || (e = new RegExp("(^|" + L + ")" + t + "(" + L + "|$)")) && p(t, function (t) { return e.test("string" == typeof t.className && t.className || void 0 !== t.getAttribute && t.getAttribute("class") || "") }) }, ATTR: function (e, n, r) { return function (t) { t = rt.attr(t, e); return null == t ? "!=" === n : !n || (t += "", "=" === n ? t === r : "!=" === n ? t !== r : "^=" === n ? r && 0 === t.indexOf(r) : "*=" === n ? r && -1 < t.indexOf(r) : "$=" === n ? r && t.slice(-r.length) === r : "~=" === n ? -1 < (" " + t.replace(q, " ") + " ").indexOf(r) : "|=" === n && (t === r || t.slice(0, r.length + 1) === r + "-")) } }, CHILD: function (d, t, e, g, m) { var v = "nth" !== d.slice(0, 3), y = "last" !== d.slice(-4), b = "of-type" === t; return 1 === g && 0 === m ? function (t) { return !!t.parentNode } : function (t, e, n) { var r, i, o, s, a, u, c = v != y ? "nextSibling" : "previousSibling", l = t.parentNode, h = b && t.nodeName.toLowerCase(), f = !n && !b, p = !1; if (l) { if (v) { for (; c;) { for (s = t; s = s[c];)if (b ? s.nodeName.toLowerCase() === h : 1 === s.nodeType) return !1; u = c = "only" === d && !u && "nextSibling" } return !0 } if (u = [y ? l.firstChild : l.lastChild], y && f) { for (p = (a = (r = (i = (o = (s = l)[S] || (s[S] = {}))[s.uniqueID] || (o[s.uniqueID] = {}))[d] || [])[0] === O && r[1]) && r[2], s = a && l.childNodes[a]; s = ++a && s && s[c] || (p = a = 0) || u.pop();)if (1 === s.nodeType && ++p && s === t) { i[d] = [O, a, p]; break } } else if (f && (p = a = (r = (i = (o = (s = t)[S] || (s[S] = {}))[s.uniqueID] || (o[s.uniqueID] = {}))[d] || [])[0] === O && r[1]), !1 === p) for (; (s = ++a && s && s[c] || (p = a = 0) || u.pop()) && ((b ? s.nodeName.toLowerCase() !== h : 1 !== s.nodeType) || !++p || (f && ((i = (o = s[S] || (s[S] = {}))[s.uniqueID] || (o[s.uniqueID] = {}))[d] = [O, p]), s !== t));); return (p -= m) === g || p % g == 0 && 0 <= p / g } } }, PSEUDO: function (t, o) { var e, s = w.pseudos[t] || w.setFilters[t.toLowerCase()] || rt.error("unsupported pseudo: " + t); return s[S] ? s(o) : 1 < s.length ? (e = [t, t, "", o], w.setFilters.hasOwnProperty(t.toLowerCase()) ? ot(function (t, e) { for (var n, r = s(t, o), i = r.length; i--;)t[n = M(t, r[i])] = !(e[n] = r[i]) }) : function (t) { return s(t, 0, e) }) : s } }, pseudos: { not: ot(function (t) { var r = [], i = [], a = f(t.replace(z, "$1")); return a[S] ? ot(function (t, e, n, r) { for (var i, o = a(t, null, r, []), s = t.length; s--;)(i = o[s]) && (t[s] = !(e[s] = i)) }) : function (t, e, n) { return r[0] = t, a(r, null, n, i), r[0] = null, !i.pop() } }), has: ot(function (e) { return function (t) { return 0 < rt(e, t).length } }), contains: ot(function (e) { return e = e.replace(nt, h), function (t) { return -1 < (t.textContent || t.innerText || o(t)).indexOf(e) } }), lang: ot(function (n) { return X.test(n || "") || rt.error("unsupported lang: " + n), n = n.replace(nt, h).toLowerCase(), function (t) { var e; do { if (e = k ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang")) return (e = e.toLowerCase()) === n || 0 === e.indexOf(n + "-") } while ((t = t.parentNode) && 1 === t.nodeType); return !1 } }), target: function (t) { var e = n.location && n.location.hash; return e && e.slice(1) === t.id }, root: function (t) { return t === i }, focus: function (t) { return t === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(t.type || t.href || ~t.tabIndex) }, enabled: function (t) { return !1 === t.disabled }, disabled: function (t) { return !0 === t.disabled }, checked: function (t) { var e = t.nodeName.toLowerCase(); return "input" === e && !!t.checked || "option" === e && !!t.selected }, selected: function (t) { return t.parentNode && t.parentNode.selectedIndex, !0 === t.selected }, empty: function (t) { for (t = t.firstChild; t; t = t.nextSibling)if (t.nodeType < 6) return !1; return !0 }, parent: function (t) { return !w.pseudos.empty(t) }, header: function (t) { return Q.test(t.nodeName) }, input: function (t) { return K.test(t.nodeName) }, button: function (t) { var e = t.nodeName.toLowerCase(); return "input" === e && "button" === t.type || "button" === e }, text: function (t) { return "input" === t.nodeName.toLowerCase() && "text" === t.type && (null == (t = t.getAttribute("type")) || "text" === t.toLowerCase()) }, first: ct(function () { return [0] }), last: ct(function (t, e) { return [e - 1] }), eq: ct(function (t, e, n) { return [n < 0 ? n + e : n] }), even: ct(function (t, e) { for (var n = 0; n < e; n += 2)t.push(n); return t }), odd: ct(function (t, e) { for (var n = 1; n < e; n += 2)t.push(n); return t }), lt: ct(function (t, e, n) { for (var r = n < 0 ? n + e : n; 0 <= --r;)t.push(r); return t }), gt: ct(function (t, e, n) { for (var r = n < 0 ? n + e : n; ++r < e;)t.push(r); return t }) } }).pseudos.nth = w.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) w.pseudos[t] = function (e) { return function (t) { return "input" === t.nodeName.toLowerCase() && t.type === e } }(t); for (t in { submit: !0, reset: !0 }) w.pseudos[t] = function (n) { return function (t) { var e = t.nodeName.toLowerCase(); return ("input" === e || "button" === e) && t.type === n } }(t); function ht() { } function ft(t) { for (var e = 0, n = t.length, r = ""; e < n; e++)r += t[e].value; return r } function pt(s, t, e) { var a = t.dir, u = e && "parentNode" === a, c = l++; return t.first ? function (t, e, n) { for (; t = t[a];)if (1 === t.nodeType || u) return s(t, e, n) } : function (t, e, n) { var r, i, o = [O, c]; if (n) { for (; t = t[a];)if ((1 === t.nodeType || u) && s(t, e, n)) return !0 } else for (; t = t[a];)if (1 === t.nodeType || u) { if ((i = (r = (i = t[S] || (t[S] = {}))[t.uniqueID] || (i[t.uniqueID] = {}))[a]) && i[0] === O && i[1] === c) return o[2] = i[2]; if ((r[a] = o)[2] = s(t, e, n)) return !0 } } } function dt(i) { return 1 < i.length ? function (t, e, n) { for (var r = i.length; r--;)if (!i[r](t, e, n)) return !1; return !0 } : i[0] } function gt(t, e, n, r, i) { for (var o, s = [], a = 0, u = t.length, c = null != e; a < u; a++)(o = t[a]) && (n && !n(o, r, i) || (s.push(o), c && e.push(a))); return s } function mt(p, d, g, m, v, t) { return m && !m[S] && (m = mt(m)), v && !v[S] && (v = mt(v, t)), ot(function (t, e, n, r) { var i, o, s, a = [], u = [], c = e.length, l = t || function (t, e, n) { for (var r = 0, i = e.length; r < i; r++)rt(t, e[r], n); return n }(d || "*", n.nodeType ? [n] : n, []), h = !p || !t && d ? l : gt(l, a, p, n, r), f = g ? v || (t ? p : c || m) ? [] : e : h; if (g && g(h, f, n, r), m) for (i = gt(f, u), m(i, [], n, r), o = i.length; o--;)(s = i[o]) && (f[u[o]] = !(h[u[o]] = s)); if (t) { if (v || p) { if (v) { for (i = [], o = f.length; o--;)(s = f[o]) && i.push(h[o] = s); v(null, f = [], i, r) } for (o = f.length; o--;)(s = f[o]) && -1 < (i = v ? M(t, s) : a[o]) && (t[i] = !(e[i] = s)) } } else f = gt(f === e ? f.splice(c, f.length) : f), v ? v(null, e, f, r) : D.apply(e, f) }) } function vt(m, v) { function t(t, e, n, r, i) { var o, s, a, u = 0, c = "0", l = t && [], h = [], f = _, p = t || b && w.find.TAG("*", i), d = O += null == f ? 1 : Math.random() || .1, g = p.length; for (i && (_ = e === C || e || i); c !== g && null != (o = p[c]); c++) { if (b && o) { for (s = 0, e || o.ownerDocument === C || (x(o), n = !k); a = m[s++];)if (a(o, e || C, n)) { r.push(o); break } i && (O = d) } y && ((o = !a && o) && u--, t && l.push(o)) } if (u += c, y && c !== u) { for (s = 0; a = v[s++];)a(l, h, e, n); if (t) { if (0 < u) for (; c--;)l[c] || h[c] || (h[c] = P.call(r)); h = gt(h) } D.apply(r, h), i && !t && 0 < h.length && 1 < u + v.length && rt.uniqueSort(r) } return i && (O = d, _ = f), l } var y = 0 < v.length, b = 0 < m.length; return y ? ot(t) : t } return ht.prototype = w.filters = w.pseudos, w.setFilters = new ht, g = rt.tokenize = function (t, e) { var n, r, i, o, s, a, u, c = E[t + " "]; if (c) return e ? 0 : c.slice(0); for (s = t, a = [], u = w.preFilter; s;) { for (o in n && !(r = U.exec(s)) || (r && (s = s.slice(r[0].length) || s), a.push(i = [])), n = !1, (r = G.exec(s)) && (n = r.shift(), i.push({ value: n, type: r[0].replace(z, " ") }), s = s.slice(n.length)), w.filter) !(r = Y[o].exec(s)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ value: n, type: o, matches: r }), s = s.slice(n.length)); if (!n) break } return e ? s.length : s ? rt.error(t) : E(t, a).slice(0) }, f = rt.compile = function (t, e) { var n, r = [], i = [], o = T[t + " "]; if (!o) { for (n = (e = e || g(t)).length; n--;)((o = function t(e) { for (var r, n, i, o = e.length, s = w.relative[e[0].type], a = s || w.relative[" "], u = s ? 1 : 0, c = pt(function (t) { return t === r }, a, !0), l = pt(function (t) { return -1 < M(r, t) }, a, !0), h = [function (t, e, n) { return n = !s && (n || e !== _) || ((r = e).nodeType ? c : l)(t, e, n), r = null, n }]; u < o; u++)if (n = w.relative[e[u].type]) h = [pt(dt(h), n)]; else { if ((n = w.filter[e[u].type].apply(null, e[u].matches))[S]) { for (i = ++u; i < o && !w.relative[e[i].type]; i++); return mt(1 < u && dt(h), 1 < u && ft(e.slice(0, u - 1).concat({ value: " " === e[u - 2].type ? "*" : "" })).replace(z, "$1"), n, u < i && t(e.slice(u, i)), i < o && t(e = e.slice(i)), i < o && ft(e)) } h.push(n) } return dt(h) }(e[n]))[S] ? r : i).push(o); (o = T(t, vt(i, r))).selector = t } return o }, m = rt.select = function (t, e, n, r) { var i, o, s, a, u, c = "function" == typeof t && t, l = !r && g(t = c.selector || t); if (n = n || [], 1 === l.length) { if (2 < (o = l[0] = l[0].slice(0)).length && "ID" === (s = o[0]).type && d.getById && 9 === e.nodeType && k && w.relative[o[1].type]) { if (!(e = (w.find.ID(s.matches[0].replace(nt, h), e) || [])[0])) return n; c && (e = e.parentNode), t = t.slice(o.shift().value.length) } for (i = Y.needsContext.test(t) ? 0 : o.length; i-- && (s = o[i], !w.relative[a = s.type]);)if ((u = w.find[a]) && (r = u(s.matches[0].replace(nt, h), tt.test(o[0].type) && lt(e.parentNode) || e))) { if (o.splice(i, 1), !(t = r.length && ft(o))) return D.apply(n, r), n; break } } return (c || f(t, l))(r, e, !k, n, !e || tt.test(t) && lt(e.parentNode) || e), n }, d.sortStable = S.split("").sort(A).join("") === S, d.detectDuplicates = !!c, x(), d.sortDetached = st(function (t) { return 1 & t.compareDocumentPosition(C.createElement("div")) }), st(function (t) { return t.innerHTML = "", "#" === t.firstChild.getAttribute("href") }) || at("type|href|height|width", function (t, e, n) { return n ? void 0 : t.getAttribute(e, "type" === e.toLowerCase() ? 1 : 2) }), d.attributes && st(function (t) { return t.innerHTML = "", t.firstChild.setAttribute("value", ""), "" === t.firstChild.getAttribute("value") }) || at("value", function (t, e, n) { return n || "input" !== t.nodeName.toLowerCase() ? void 0 : t.defaultValue }), st(function (t) { return null == t.getAttribute("disabled") }) || at(W, function (t, e, n) { return n ? void 0 : !0 === t[e] ? e.toLowerCase() : (e = t.getAttributeNode(e)) && e.specified ? e.value : null }), rt }(x); k.find = p, k.expr = p.selectors, k.expr[":"] = k.expr.pseudos, k.uniqueSort = k.unique = p.uniqueSort, k.text = p.getText, k.isXMLDoc = p.isXML, k.contains = p.contains; function v(t, e, n) { for (var r = [], i = void 0 !== n; (t = t[e]) && 9 !== t.nodeType;)if (1 === t.nodeType) { if (i && k(t).is(n)) break; r.push(t) } return r } function y(t, e) { for (var n = []; t; t = t.nextSibling)1 === t.nodeType && t !== e && n.push(t); return n } var b = k.expr.match.needsContext, w = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/, _ = /^.[^:#\[\.,]*$/; function S(t, n, r) { if (k.isFunction(n)) return k.grep(t, function (t, e) { return !!n.call(t, e, t) !== r }); if (n.nodeType) return k.grep(t, function (t) { return t === n !== r }); if ("string" == typeof n) { if (_.test(n)) return k.filter(n, t, r); n = k.filter(n, t) } return k.grep(t, function (t) { return -1 < i.call(n, t) !== r }) } k.filter = function (t, e, n) { var r = e[0]; return n && (t = ":not(" + t + ")"), 1 === e.length && 1 === r.nodeType ? k.find.matchesSelector(r, t) ? [r] : [] : k.find.matches(t, k.grep(e, function (t) { return 1 === t.nodeType })) }, k.fn.extend({ find: function (t) { var e, n = this.length, r = [], i = this; if ("string" != typeof t) return this.pushStack(k(t).filter(function () { for (e = 0; e < n; e++)if (k.contains(i[e], this)) return !0 })); for (e = 0; e < n; e++)k.find(t, i[e], r); return (r = this.pushStack(1 < n ? k.unique(r) : r)).selector = this.selector ? this.selector + " " + t : t, r }, filter: function (t) { return this.pushStack(S(this, t || [], !1)) }, not: function (t) { return this.pushStack(S(this, t || [], !0)) }, is: function (t) { return !!S(this, "string" == typeof t && b.test(t) ? k(t) : t || [], !1).length } }); var O, E = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/; (k.fn.init = function (t, e, n) { if (!t) return this; if (n = n || O, "string" != typeof t) return t.nodeType ? (this.context = this[0] = t, this.length = 1, this) : k.isFunction(t) ? void 0 !== n.ready ? n.ready(t) : t(k) : (void 0 !== t.selector && (this.selector = t.selector, this.context = t.context), k.makeArray(t, this)); if (!(r = "<" === t[0] && ">" === t[t.length - 1] && 3 <= t.length ? [null, t, null] : E.exec(t)) || !r[1] && e) return (!e || e.jquery ? e || n : this.constructor(e)).find(t); if (r[1]) { if (e = e instanceof k ? e[0] : e, k.merge(this, k.parseHTML(r[1], e && e.nodeType ? e.ownerDocument || e : C, !0)), w.test(r[1]) && k.isPlainObject(e)) for (var r in e) k.isFunction(this[r]) ? this[r](e[r]) : this.attr(r, e[r]); return this } return (n = C.getElementById(r[2])) && n.parentNode && (this.length = 1, this[0] = n), this.context = C, this.selector = t, this }).prototype = k.fn, O = k(C); var T = /^(?:parents|prev(?:Until|All))/, A = { children: !0, contents: !0, next: !0, prev: !0 }; function I(t, e) { for (; (t = t[e]) && 1 !== t.nodeType;); return t } k.fn.extend({ has: function (t) { var e = k(t, this), n = e.length; return this.filter(function () { for (var t = 0; t < n; t++)if (k.contains(this, e[t])) return !0 }) }, closest: function (t, e) { for (var n, r = 0, i = this.length, o = [], s = b.test(t) || "string" != typeof t ? k(t, e || this.context) : 0; r < i; r++)for (n = this[r]; n && n !== e; n = n.parentNode)if (n.nodeType < 11 && (s ? -1 < s.index(n) : 1 === n.nodeType && k.find.matchesSelector(n, t))) { o.push(n); break } return this.pushStack(1 < o.length ? k.uniqueSort(o) : o) }, index: function (t) { return t ? "string" == typeof t ? i.call(k(t), this[0]) : i.call(this, t.jquery ? t[0] : t) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (t, e) { return this.pushStack(k.uniqueSort(k.merge(this.get(), k(t, e)))) }, addBack: function (t) { return this.add(null == t ? this.prevObject : this.prevObject.filter(t)) } }), k.each({ parent: function (t) { t = t.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (t) { return v(t, "parentNode") }, parentsUntil: function (t, e, n) { return v(t, "parentNode", n) }, next: function (t) { return I(t, "nextSibling") }, prev: function (t) { return I(t, "previousSibling") }, nextAll: function (t) { return v(t, "nextSibling") }, prevAll: function (t) { return v(t, "previousSibling") }, nextUntil: function (t, e, n) { return v(t, "nextSibling", n) }, prevUntil: function (t, e, n) { return v(t, "previousSibling", n) }, siblings: function (t) { return y((t.parentNode || {}).firstChild, t) }, children: function (t) { return y(t.firstChild) }, contents: function (t) { return t.contentDocument || k.merge([], t.childNodes) } }, function (r, i) { k.fn[r] = function (t, e) { var n = k.map(this, i, t); return "Until" !== r.slice(-5) && (e = t), e && "string" == typeof e && (n = k.filter(e, n)), 1 < this.length && (A[r] || k.uniqueSort(n), T.test(r) && n.reverse()), this.pushStack(n) } }); var j, P = /\S+/g; function N() { C.removeEventListener("DOMContentLoaded", N), x.removeEventListener("load", N), k.ready() } k.Callbacks = function (r) { var t, n; r = "string" == typeof r ? (t = r, n = {}, k.each(t.match(P) || [], function (t, e) { n[e] = !0 }), n) : k.extend({}, r); function i() { for (a = r.once, s = o = !0; c.length; l = -1)for (e = c.shift(); ++l < u.length;)!1 === u[l].apply(e[0], e[1]) && r.stopOnFalse && (l = u.length, e = !1); r.memory || (e = !1), o = !1, a && (u = e ? [] : "") } var o, e, s, a, u = [], c = [], l = -1, h = { add: function () { return u && (e && !o && (l = u.length - 1, c.push(e)), function n(t) { k.each(t, function (t, e) { k.isFunction(e) ? r.unique && h.has(e) || u.push(e) : e && e.length && "string" !== k.type(e) && n(e) }) }(arguments), e && !o && i()), this }, remove: function () { return k.each(arguments, function (t, e) { for (var n; -1 < (n = k.inArray(e, u, n));)u.splice(n, 1), n <= l && l-- }), this }, has: function (t) { return t ? -1 < k.inArray(t, u) : 0 < u.length }, empty: function () { return u = u && [], this }, disable: function () { return a = c = [], u = e = "", this }, disabled: function () { return !u }, lock: function () { return a = c = [], e || (u = e = ""), this }, locked: function () { return !!a }, fireWith: function (t, e) { return a || (e = [t, (e = e || []).slice ? e.slice() : e], c.push(e), o || i()), this }, fire: function () { return h.fireWith(this, arguments), this }, fired: function () { return !!s } }; return h }, k.extend({ Deferred: function (t) { var o = [["resolve", "done", k.Callbacks("once memory"), "resolved"], ["reject", "fail", k.Callbacks("once memory"), "rejected"], ["notify", "progress", k.Callbacks("memory")]], i = "pending", s = { state: function () { return i }, always: function () { return a.done(arguments).fail(arguments), this }, then: function () { var i = arguments; return k.Deferred(function (r) { k.each(o, function (t, e) { var n = k.isFunction(i[t]) && i[t]; a[e[1]](function () { var t = n && n.apply(this, arguments); t && k.isFunction(t.promise) ? t.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[e[0] + "With"](this === s ? r.promise() : this, n ? [t] : arguments) }) }), i = null }).promise() }, promise: function (t) { return null != t ? k.extend(t, s) : s } }, a = {}; return s.pipe = s.then, k.each(o, function (t, e) { var n = e[2], r = e[3]; s[e[1]] = n.add, r && n.add(function () { i = r }, o[1 ^ t][2].disable, o[2][2].lock), a[e[0]] = function () { return a[e[0] + "With"](this === a ? s : this, arguments), this }, a[e[0] + "With"] = n.fireWith }), s.promise(a), t && t.call(a, a), a }, when: function (t) { function e(e, n, r) { return function (t) { n[e] = this, r[e] = 1 < arguments.length ? l.call(arguments) : t, r === i ? c.notifyWith(n, r) : --u || c.resolveWith(n, r) } } var i, n, r, o = 0, s = l.call(arguments), a = s.length, u = 1 !== a || t && k.isFunction(t.promise) ? a : 0, c = 1 === u ? t : k.Deferred(); if (1 < a) for (i = new Array(a), n = new Array(a), r = new Array(a); o < a; o++)s[o] && k.isFunction(s[o].promise) ? s[o].promise().progress(e(o, n, i)).done(e(o, r, s)).fail(c.reject) : --u; return u || c.resolveWith(r, s), c.promise() } }), k.fn.ready = function (t) { return k.ready.promise().done(t), this }, k.extend({ isReady: !1, readyWait: 1, holdReady: function (t) { t ? k.readyWait++ : k.ready(!0) }, ready: function (t) { (!0 === t ? --k.readyWait : k.isReady) || ((k.isReady = !0) !== t && 0 < --k.readyWait || (j.resolveWith(C, [k]), k.fn.triggerHandler && (k(C).triggerHandler("ready"), k(C).off("ready")))) } }), k.ready.promise = function (t) { return j || (j = k.Deferred(), "complete" === C.readyState || "loading" !== C.readyState && !C.documentElement.doScroll ? x.setTimeout(k.ready) : (C.addEventListener("DOMContentLoaded", N), x.addEventListener("load", N))), j.promise(t) }, k.ready.promise(); function D(t) { return 1 === t.nodeType || 9 === t.nodeType || !+t.nodeType } var R = function (t, e, n, r, i, o, s) { var a = 0, u = t.length, c = null == n; if ("object" === k.type(n)) for (a in i = !0, n) R(t, e, a, n[a], !0, o, s); else if (void 0 !== r && (i = !0, k.isFunction(r) || (s = !0), c && (e = s ? (e.call(t, r), null) : (c = e, function (t, e, n) { return c.call(k(t), n) })), e)) for (; a < u; a++)e(t[a], n, s ? r : r.call(t[a], a, e(t[a], n))); return i ? t : c ? e.call(t) : u ? e(t[0], n) : o }; function M() { this.expando = k.expando + M.uid++ } M.uid = 1, M.prototype = { register: function (t, e) { e = e || {}; return t.nodeType ? t[this.expando] = e : Object.defineProperty(t, this.expando, { value: e, writable: !0, configurable: !0 }), t[this.expando] }, cache: function (t) { if (!D(t)) return {}; var e = t[this.expando]; return e || (e = {}, D(t) && (t.nodeType ? t[this.expando] = e : Object.defineProperty(t, this.expando, { value: e, configurable: !0 }))), e }, set: function (t, e, n) { var r, i = this.cache(t); if ("string" == typeof e) i[e] = n; else for (r in e) i[r] = e[r]; return i }, get: function (t, e) { return void 0 === e ? this.cache(t) : t[this.expando] && t[this.expando][e] }, access: function (t, e, n) { var r; return void 0 === e || e && "string" == typeof e && void 0 === n ? void 0 !== (r = this.get(t, e)) ? r : this.get(t, k.camelCase(e)) : (this.set(t, e, n), void 0 !== n ? n : e) }, remove: function (t, e) { var n, r, i, o = t[this.expando]; if (void 0 !== o) { if (void 0 === e) this.register(t); else { n = (r = k.isArray(e) ? e.concat(e.map(k.camelCase)) : (i = k.camelCase(e), e in o ? [e, i] : (r = i) in o ? [r] : r.match(P) || [])).length; for (; n--;)delete o[r[n]] } void 0 !== e && !k.isEmptyObject(o) || (t.nodeType ? t[this.expando] = void 0 : delete t[this.expando]) } }, hasData: function (t) { t = t[this.expando]; return void 0 !== t && !k.isEmptyObject(t) } }; var W = new M, L = new M, F = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, H = /[A-Z]/g; function B(t, e, n) { var r; if (void 0 === n && 1 === t.nodeType) if (r = "data-" + e.replace(H, "-$&").toLowerCase(), "string" == typeof (n = t.getAttribute(r))) { try { n = "true" === n || "false" !== n && ("null" === n ? null : +n + "" === n ? +n : F.test(n) ? k.parseJSON(n) : n) } catch (t) { } L.set(t, e, n) } else n = void 0; return n } k.extend({ hasData: function (t) { return L.hasData(t) || W.hasData(t) }, data: function (t, e, n) { return L.access(t, e, n) }, removeData: function (t, e) { L.remove(t, e) }, _data: function (t, e, n) { return W.access(t, e, n) }, _removeData: function (t, e) { W.remove(t, e) } }), k.fn.extend({ data: function (r, t) { var e, n, i, o = this[0], s = o && o.attributes; if (void 0 !== r) return "object" == typeof r ? this.each(function () { L.set(this, r) }) : R(this, function (e) { var t, n; return o && void 0 === e ? void 0 !== (t = L.get(o, r) || L.get(o, r.replace(H, "-$&").toLowerCase())) ? t : (n = k.camelCase(r), void 0 !== (t = L.get(o, n)) ? t : void 0 !== (t = B(o, n, void 0)) ? t : void 0) : (n = k.camelCase(r), void this.each(function () { var t = L.get(this, n); L.set(this, n, e), -1 < r.indexOf("-") && void 0 !== t && L.set(this, r, e) })) }, null, t, 1 < arguments.length, null, !0); if (this.length && (i = L.get(o), 1 === o.nodeType && !W.get(o, "hasDataAttrs"))) { for (e = s.length; e--;)s[e] && (0 === (n = s[e].name).indexOf("data-") && (n = k.camelCase(n.slice(5)), B(o, n, i[n]))); W.set(o, "hasDataAttrs", !0) } return i }, removeData: function (t) { return this.each(function () { L.remove(this, t) }) } }), k.extend({ queue: function (t, e, n) { var r; return t ? (e = (e || "fx") + "queue", r = W.get(t, e), n && (!r || k.isArray(n) ? r = W.access(t, e, k.makeArray(n)) : r.push(n)), r || []) : void 0 }, dequeue: function (t, e) { e = e || "fx"; var n = k.queue(t, e), r = n.length, i = n.shift(), o = k._queueHooks(t, e); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === e && n.unshift("inprogress"), delete o.stop, i.call(t, function () { k.dequeue(t, e) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (t, e) { var n = e + "queueHooks"; return W.get(t, n) || W.access(t, n, { empty: k.Callbacks("once memory").add(function () { W.remove(t, [e + "queue", n]) }) }) } }), k.fn.extend({ queue: function (e, n) { var t = 2; return "string" != typeof e && (n = e, e = "fx", t--), arguments.length < t ? k.queue(this[0], e) : void 0 === n ? this : this.each(function () { var t = k.queue(this, e, n); k._queueHooks(this, e), "fx" === e && "inprogress" !== t[0] && k.dequeue(this, e) }) }, dequeue: function (t) { return this.each(function () { k.dequeue(this, t) }) }, clearQueue: function (t) { return this.queue(t || "fx", []) }, promise: function (t, e) { function n() { --i || o.resolveWith(s, [s]) } var r, i = 1, o = k.Deferred(), s = this, a = this.length; for ("string" != typeof t && (e = t, t = void 0), t = t || "fx"; a--;)(r = W.get(s[a], t + "queueHooks")) && r.empty && (i++, r.empty.add(n)); return n(), o.promise(e) } }); function q(t, e) { return t = e || t, "none" === k.css(t, "display") || !k.contains(t.ownerDocument, t) } var s = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, z = new RegExp("^(?:([+-])=|)(" + s + ")([a-z%]*)$", "i"), U = ["Top", "Right", "Bottom", "Left"]; function G(t, e, n, r) { var i, o = 1, s = 20, a = r ? function () { return r.cur() } : function () { return k.css(t, e, "") }, u = a(), c = n && n[3] || (k.cssNumber[e] ? "" : "px"), l = (k.cssNumber[e] || "px" !== c && +u) && z.exec(k.css(t, e)); if (l && l[3] !== c) for (c = c || l[3], n = n || [], l = +u || 1; o = o || ".5", l /= o, k.style(t, e, l + c), o !== (o = a() / u) && 1 !== o && --s;); return n && (l = +l || +u || 0, i = n[1] ? l + (n[1] + 1) * n[2] : +n[2], r && (r.unit = c, r.start = l, r.end = i)), i } var V = /^(?:checkbox|radio)$/i, $ = /<([\w:-]+)/, X = /^$|\/(?:java|ecma)script/i, Y = { option: [1, ""], thead: [1, "", "
      "], col: [2, "", "
      "], tr: [2, "", "
      "], td: [3, "", "
      "], _default: [0, "", ""] }; function K(t, e) { var n = void 0 !== t.getElementsByTagName ? t.getElementsByTagName(e || "*") : void 0 !== t.querySelectorAll ? t.querySelectorAll(e || "*") : []; return void 0 === e || e && k.nodeName(t, e) ? k.merge([t], n) : n } function Q(t, e) { for (var n = 0, r = t.length; n < r; n++)W.set(t[n], "globalEval", !e || W.get(e[n], "globalEval")) } Y.optgroup = Y.option, Y.tbody = Y.tfoot = Y.colgroup = Y.caption = Y.thead, Y.th = Y.td; var J = /<|&#?\w+;/; function Z(t, e, n, r, i) { for (var o, s, a, u, c, l = e.createDocumentFragment(), h = [], f = 0, p = t.length; f < p; f++)if ((o = t[f]) || 0 === o) if ("object" === k.type(o)) k.merge(h, o.nodeType ? [o] : o); else if (J.test(o)) { for (s = s || l.appendChild(e.createElement("div")), a = ($.exec(o) || ["", ""])[1].toLowerCase(), a = Y[a] || Y._default, s.innerHTML = a[1] + k.htmlPrefilter(o) + a[2], c = a[0]; c--;)s = s.lastChild; k.merge(h, s.childNodes), (s = l.firstChild).textContent = "" } else h.push(e.createTextNode(o)); for (l.textContent = "", f = 0; o = h[f++];)if (r && -1 < k.inArray(o, r)) i && i.push(o); else if (u = k.contains(o.ownerDocument, o), s = K(l.appendChild(o), "script"), u && Q(s), n) for (c = 0; o = s[c++];)X.test(o.type || "") && n.push(o); return l } n = C.createDocumentFragment().appendChild(C.createElement("div")), (p = C.createElement("input")).setAttribute("type", "radio"), p.setAttribute("checked", "checked"), p.setAttribute("name", "t"), n.appendChild(p), m.checkClone = n.cloneNode(!0).cloneNode(!0).lastChild.checked, n.innerHTML = "", m.noCloneChecked = !!n.cloneNode(!0).lastChild.defaultValue; var tt = /^key/, et = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, nt = /^([^.]*)(?:\.(.+)|)/; function rt() { return !0 } function it() { return !1 } function ot() { try { return C.activeElement } catch (t) { } } function st(t, e, n, r, i, o) { var s, a; if ("object" == typeof e) { for (a in "string" != typeof n && (r = r || n, n = void 0), e) st(t, a, n, r, e[a], o); return t } if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = it; else if (!i) return t; return 1 === o && (s = i, (i = function (t) { return k().off(t), s.apply(this, arguments) }).guid = s.guid || (s.guid = k.guid++)), t.each(function () { k.event.add(this, e, i, r, n) }) } k.event = { global: {}, add: function (e, t, n, r, i) { var o, s, a, u, c, l, h, f, p, d = W.get(e); if (d) for (n.handler && (n = (o = n).handler, i = o.selector), n.guid || (n.guid = k.guid++), (a = d.events) || (a = d.events = {}), (s = d.handle) || (s = d.handle = function (t) { return void 0 !== k && k.event.triggered !== t.type ? k.event.dispatch.apply(e, arguments) : void 0 }), u = (t = (t || "").match(P) || [""]).length; u--;)h = p = (c = nt.exec(t[u]) || [])[1], f = (c[2] || "").split(".").sort(), h && (l = k.event.special[h] || {}, h = (i ? l.delegateType : l.bindType) || h, l = k.event.special[h] || {}, c = k.extend({ type: h, origType: p, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && k.expr.match.needsContext.test(i), namespace: f.join(".") }, o), (p = a[h]) || ((p = a[h] = []).delegateCount = 0, l.setup && !1 !== l.setup.call(e, r, f, s) || e.addEventListener && e.addEventListener(h, s)), l.add && (l.add.call(e, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), k.event.global[h] = !0) }, remove: function (t, e, n, r, i) { var o, s, a, u, c, l, h, f, p, d, g, m = W.hasData(t) && W.get(t); if (m && (u = m.events)) { for (c = (e = (e || "").match(P) || [""]).length; c--;)if (p = g = (a = nt.exec(e[c]) || [])[1], d = (a[2] || "").split(".").sort(), p) { for (h = k.event.special[p] || {}, f = u[p = (r ? h.delegateType : h.bindType) || p] || [], a = a[2] && new RegExp("(^|\\.)" + d.join("\\.(?:.*\\.|)") + "(\\.|$)"), s = o = f.length; o--;)l = f[o], !i && g !== l.origType || n && n.guid !== l.guid || a && !a.test(l.namespace) || r && r !== l.selector && ("**" !== r || !l.selector) || (f.splice(o, 1), l.selector && f.delegateCount--, h.remove && h.remove.call(t, l)); s && !f.length && (h.teardown && !1 !== h.teardown.call(t, d, m.handle) || k.removeEvent(t, p, m.handle), delete u[p]) } else for (p in u) k.event.remove(t, p + e[c], n, r, !0); k.isEmptyObject(u) && W.remove(t, "handle events") } }, dispatch: function (t) { t = k.event.fix(t); var e, n, r, i, o, s = l.call(arguments), a = (W.get(this, "events") || {})[t.type] || [], u = k.event.special[t.type] || {}; if ((s[0] = t).delegateTarget = this, !u.preDispatch || !1 !== u.preDispatch.call(this, t)) { for (o = k.event.handlers.call(this, t, a), e = 0; (r = o[e++]) && !t.isPropagationStopped();)for (t.currentTarget = r.elem, n = 0; (i = r.handlers[n++]) && !t.isImmediatePropagationStopped();)t.rnamespace && !t.rnamespace.test(i.namespace) || (t.handleObj = i, t.data = i.data, void 0 !== (i = ((k.event.special[i.origType] || {}).handle || i.handler).apply(r.elem, s)) && !1 === (t.result = i) && (t.preventDefault(), t.stopPropagation())); return u.postDispatch && u.postDispatch.call(this, t), t.result } }, handlers: function (t, e) { var n, r, i, o, s = [], a = e.delegateCount, u = t.target; if (a && u.nodeType && ("click" !== t.type || isNaN(t.button) || t.button < 1)) for (; u !== this; u = u.parentNode || this)if (1 === u.nodeType && (!0 !== u.disabled || "click" !== t.type)) { for (r = [], n = 0; n < a; n++)void 0 === r[i = (o = e[n]).selector + " "] && (r[i] = o.needsContext ? -1 < k(i, this).index(u) : k.find(i, this, null, [u]).length), r[i] && r.push(o); r.length && s.push({ elem: u, handlers: r }) } return a < e.length && s.push({ elem: this, handlers: e.slice(a) }), s }, props: "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function (t, e) { return null == t.which && (t.which = null != e.charCode ? e.charCode : e.keyCode), t } }, mouseHooks: { props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function (t, e) { var n, r, i = e.button; return null == t.pageX && null != e.clientX && (n = (r = t.target.ownerDocument || C).documentElement, r = r.body, t.pageX = e.clientX + (n && n.scrollLeft || r && r.scrollLeft || 0) - (n && n.clientLeft || r && r.clientLeft || 0), t.pageY = e.clientY + (n && n.scrollTop || r && r.scrollTop || 0) - (n && n.clientTop || r && r.clientTop || 0)), t.which || void 0 === i || (t.which = 1 & i ? 1 : 2 & i ? 3 : 4 & i ? 2 : 0), t } }, fix: function (t) { if (t[k.expando]) return t; var e, n, r, i = t.type, o = t, s = this.fixHooks[i]; for (s || (this.fixHooks[i] = s = et.test(i) ? this.mouseHooks : tt.test(i) ? this.keyHooks : {}), r = s.props ? this.props.concat(s.props) : this.props, t = new k.Event(o), e = r.length; e--;)t[n = r[e]] = o[n]; return t.target || (t.target = C), 3 === t.target.nodeType && (t.target = t.target.parentNode), s.filter ? s.filter(t, o) : t }, special: { load: { noBubble: !0 }, focus: { trigger: function () { return this !== ot() && this.focus ? (this.focus(), !1) : void 0 }, delegateType: "focusin" }, blur: { trigger: function () { return this === ot() && this.blur ? (this.blur(), !1) : void 0 }, delegateType: "focusout" }, click: { trigger: function () { return "checkbox" === this.type && this.click && k.nodeName(this, "input") ? (this.click(), !1) : void 0 }, _default: function (t) { return k.nodeName(t.target, "a") } }, beforeunload: { postDispatch: function (t) { void 0 !== t.result && t.originalEvent && (t.originalEvent.returnValue = t.result) } } } }, k.removeEvent = function (t, e, n) { t.removeEventListener && t.removeEventListener(e, n) }, k.Event = function (t, e) { return this instanceof k.Event ? (t && t.type ? (this.originalEvent = t, this.type = t.type, this.isDefaultPrevented = t.defaultPrevented || void 0 === t.defaultPrevented && !1 === t.returnValue ? rt : it) : this.type = t, e && k.extend(this, e), this.timeStamp = t && t.timeStamp || k.now(), void (this[k.expando] = !0)) : new k.Event(t, e) }, k.Event.prototype = { constructor: k.Event, isDefaultPrevented: it, isPropagationStopped: it, isImmediatePropagationStopped: it, isSimulated: !1, preventDefault: function () { var t = this.originalEvent; this.isDefaultPrevented = rt, t && !this.isSimulated && t.preventDefault() }, stopPropagation: function () { var t = this.originalEvent; this.isPropagationStopped = rt, t && !this.isSimulated && t.stopPropagation() }, stopImmediatePropagation: function () { var t = this.originalEvent; this.isImmediatePropagationStopped = rt, t && !this.isSimulated && t.stopImmediatePropagation(), this.stopPropagation() } }, k.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (t, i) { k.event.special[t] = { delegateType: i, bindType: i, handle: function (t) { var e, n = t.relatedTarget, r = t.handleObj; return n && (n === this || k.contains(this, n)) || (t.type = r.origType, e = r.handler.apply(this, arguments), t.type = i), e } } }), k.fn.extend({ on: function (t, e, n, r) { return st(this, t, e, n, r) }, one: function (t, e, n, r) { return st(this, t, e, n, r, 1) }, off: function (t, e, n) { var r, i; if (t && t.preventDefault && t.handleObj) return r = t.handleObj, k(t.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" != typeof t) return !1 !== e && "function" != typeof e || (n = e, e = void 0), !1 === n && (n = it), this.each(function () { k.event.remove(this, t, n, e) }); for (i in t) this.off(i, e, t[i]); return this } }); var at = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, ut = /\s*$/g; function ft(t, e) { return k.nodeName(t, "table") && k.nodeName(11 !== e.nodeType ? e : e.firstChild, "tr") ? t.getElementsByTagName("tbody")[0] || t.appendChild(t.ownerDocument.createElement("tbody")) : t } function pt(t) { return t.type = (null !== t.getAttribute("type")) + "/" + t.type, t } function dt(t) { var e = lt.exec(t.type); return e ? t.type = e[1] : t.removeAttribute("type"), t } function gt(t, e) { var n, r, i, o, s, a; if (1 === e.nodeType) { if (W.hasData(t) && (o = W.access(t), s = W.set(e, o), a = o.events)) for (i in delete s.handle, s.events = {}, a) for (n = 0, r = a[i].length; n < r; n++)k.event.add(e, i, a[i][n]); L.hasData(t) && (t = L.access(t), t = k.extend({}, t), L.set(e, t)) } } function mt(n, r, i, o) { r = g.apply([], r); var t, e, s, a, u, c, l = 0, h = n.length, f = h - 1, p = r[0], d = k.isFunction(p); if (d || 1 < h && "string" == typeof p && !m.checkClone && ct.test(p)) return n.each(function (t) { var e = n.eq(t); d && (r[0] = p.call(this, t, e.html())), mt(e, r, i, o) }); if (h && (e = (t = Z(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === t.childNodes.length && (t = e), e || o)) { for (a = (s = k.map(K(t, "script"), pt)).length; l < h; l++)u = t, l !== f && (u = k.clone(u, !0, !0), a && k.merge(s, K(u, "script"))), i.call(n[l], u, l); if (a) for (c = s[s.length - 1].ownerDocument, k.map(s, dt), l = 0; l < a; l++)u = s[l], X.test(u.type || "") && !W.access(u, "globalEval") && k.contains(c, u) && (u.src ? k._evalUrl && k._evalUrl(u.src) : k.globalEval(u.textContent.replace(ht, ""))) } return n } function vt(t, e, n) { for (var r, i = e ? k.filter(e, t) : t, o = 0; null != (r = i[o]); o++)n || 1 !== r.nodeType || k.cleanData(K(r)), r.parentNode && (n && k.contains(r.ownerDocument, r) && Q(K(r, "script")), r.parentNode.removeChild(r)); return t } k.extend({ htmlPrefilter: function (t) { return t.replace(at, "<$1>") }, clone: function (t, e, n) { var r, i, o, s, a, u, c, l = t.cloneNode(!0), h = k.contains(t.ownerDocument, t); if (!(m.noCloneChecked || 1 !== t.nodeType && 11 !== t.nodeType || k.isXMLDoc(t))) for (s = K(l), r = 0, i = (o = K(t)).length; r < i; r++)a = o[r], u = s[r], c = void 0, "input" === (c = u.nodeName.toLowerCase()) && V.test(a.type) ? u.checked = a.checked : "input" !== c && "textarea" !== c || (u.defaultValue = a.defaultValue); if (e) if (n) for (o = o || K(t), s = s || K(l), r = 0, i = o.length; r < i; r++)gt(o[r], s[r]); else gt(t, l); return 0 < (s = K(l, "script")).length && Q(s, !h && K(t, "script")), l }, cleanData: function (t) { for (var e, n, r, i = k.event.special, o = 0; void 0 !== (n = t[o]); o++)if (D(n)) { if (e = n[W.expando]) { if (e.events) for (r in e.events) i[r] ? k.event.remove(n, r) : k.removeEvent(n, r, e.handle); n[W.expando] = void 0 } n[L.expando] && (n[L.expando] = void 0) } } }), k.fn.extend({ domManip: mt, detach: function (t) { return vt(this, t, !0) }, remove: function (t) { return vt(this, t) }, text: function (t) { return R(this, function (t) { return void 0 === t ? k.text(this) : this.empty().each(function () { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = t) }) }, null, t, arguments.length) }, append: function () { return mt(this, arguments, function (t) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || ft(this, t).appendChild(t) }) }, prepend: function () { return mt(this, arguments, function (t) { var e; 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (e = ft(this, t)).insertBefore(t, e.firstChild) }) }, before: function () { return mt(this, arguments, function (t) { this.parentNode && this.parentNode.insertBefore(t, this) }) }, after: function () { return mt(this, arguments, function (t) { this.parentNode && this.parentNode.insertBefore(t, this.nextSibling) }) }, empty: function () { for (var t, e = 0; null != (t = this[e]); e++)1 === t.nodeType && (k.cleanData(K(t, !1)), t.textContent = ""); return this }, clone: function (t, e) { return t = null != t && t, e = null == e ? t : e, this.map(function () { return k.clone(this, t, e) }) }, html: function (t) { return R(this, function (t) { var e = this[0] || {}, n = 0, r = this.length; if (void 0 === t && 1 === e.nodeType) return e.innerHTML; if ("string" == typeof t && !ut.test(t) && !Y[($.exec(t) || ["", ""])[1].toLowerCase()]) { t = k.htmlPrefilter(t); try { for (; n < r; n++)1 === (e = this[n] || {}).nodeType && (k.cleanData(K(e, !1)), e.innerHTML = t); e = 0 } catch (t) { } } e && this.empty().append(t) }, null, t, arguments.length) }, replaceWith: function () { var n = []; return mt(this, arguments, function (t) { var e = this.parentNode; k.inArray(this, n) < 0 && (k.cleanData(K(this)), e && e.replaceChild(t, this)) }, n) } }), k.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (t, s) { k.fn[t] = function (t) { for (var e, n = [], r = k(t), i = r.length - 1, o = 0; o <= i; o++)e = o === i ? this : this.clone(!0), k(r[o])[s](e), a.apply(n, e.get()); return this.pushStack(n) } }); var yt, bt = { HTML: "block", BODY: "block" }; function wt(t, e) { t = k(e.createElement(t)).appendTo(e.body), e = k.css(t[0], "display"); return t.detach(), e } function _t(t) { var e = C, n = bt[t]; return n || ("none" !== (n = wt(t, e)) && n || ((e = (yt = (yt || k("').appendTo("body"), $("#IframeReportImg").attr("src") != a ? $("#IframeReportImg").attr("src", a) : "about:blank" != $("#IframeReportImg").src && window.frames.IframeReportImg.document.execCommand("SaveAs")) })), n.find(".luckysheet-model-cancel-btn").click((function () { $("#luckysheet-confirm").hide(), $("#luckysheet-modal-dialog-mask").hide() })), $("#luckysheet-confirm .luckysheet-model-copy-btn").click((function () { var e = new clipboard.DT; e.setData("text/html", ""), "1" == Ml.isIE() ? alert(r.rightclickTip) : (clipboard.write(e), alert(r.successTip)) })) }, chartPointConfig: function (e, t, a) { $("body").append(_m(bn, { id: e, addclass: "luckysheet-chart-point-config-c", title: "数据点批量设置", content: '
      选择维度
      排序
      全选 - 清除 - 反选可以直接框选数据点
      数据点设置
      图形颜色
      图形大小
      图形形状
      边框粗细
      边框样式
      边框颜色
      文字标签
      数值比例
      小数位数
      标签格式
      数据名称
      标签位置
      ', botton: '', style: "z-index:100003;height:80%;width:80%;top:10%;left:10%;" })), $("#luckysheet-modal-dialog-mask").show(); var r = $(window).width(), n = $(window).height(); $("#" + e).find(".luckysheet-chart-point-config").css("height", n - 160), $("#" + e).css({ height: n - 90, width: r - 100, left: 7, top: 14 }).show().find(".luckysheet-model-save-btn").click((function () { "function" == typeof t && t(), $("#" + e).hide(), $("#luckysheet-modal-dialog-mask").hide() })), $("#" + e).find(".luckysheet-model-save-btn").click((function () { "function" == typeof a && a(), $("#" + e).hide(), $("#luckysheet-modal-dialog-mask").hide() })) }, sheetConfig: function () { }, hoverTipshowState: !1, hoverTipshowTimeOut: null, createHoverTip: function (e, t) { var a = this; $(e).on("mouseover", t, (function (e) { a.hoverTipshowState || (clearTimeout(a.hoverTipshowTimeOut), a.hoverTipshowTimeOut = setTimeout((function () { var t = $(e.currentTarget), a = t.offset(), r = $("#luckysheet-tooltip-up"), n = t.data("tips"); if (null != n && 0 != n.length || null != (n = t.prev().data("tips")) && 0 != n.length) { 0 == r.length && ($("body").append(''), r = $("#luckysheet-tooltip-up")), r.removeClass("jfk-tooltip-hide").find("div.jfk-tooltip-contentId").html(n); var l = r.outerWidth(); r.find("div.jfk-tooltip-arrow").css("left", l / 2); var i = a.left + (t.outerWidth() - l) / 2; i < 2 && (i = 2, r.find("div.jfk-tooltip-arrow").css("left", t.outerWidth() / 2)), r.css({ top: a.top + t.outerHeight() + 1, left: i }) } }), 300)) })).on("mouseout", t, (function (e) { a.hoverTipshowState = !1, clearTimeout(a.hoverTipshowTimeOut), $("#luckysheet-tooltip-up").addClass("jfk-tooltip-hide") })).on("click", t, (function (e) { a.hoverTipshowState = !0, clearTimeout(a.hoverTipshowTimeOut), $("#luckysheet-tooltip-up").addClass("jfk-tooltip-hide") })) }, popover: function (e, t, a, r, n, l) { var i = gn(), o = i.button, s = i.paint; null == n && (n = o.close); var c = '
      ' + s.start + '
      ' + n + "
      "; $("#luckysheetpopover").remove(), $("body").append(c), $("#luckysheetpopover .luckysheetpopover-content").html(e); var u = $("#luckysheetpopover").outerWidth(), d = $("#luckysheetpopover").outerHeight(), h = {}; "topLeft" == t ? (h.top = "20px", h.left = "20px") : "topCenter" == t ? (h.top = "20px", h.left = "50%", h["margin-left"] = -u / 2) : "topRight" == t ? (h.top = "20px", h.right = "20px") : "midLeft" == t ? (h.top = "50%", h["margin-top"] = -d / 2, h.left = "20px") : "center" == t ? (h.top = "50%", h["margin-top"] = -d / 2, h.left = "50%", h["margin-left"] = -u / 2) : "midRight" == t ? (h.top = "50%", h["margin-top"] = -d / 2, h.right = "20px") : "bottomLeft" == t ? (h.bottom = "20px", h.left = "20px") : "bottomCenter" == t ? (h.bottom = "20px", h.left = "50%", h["margin-left"] = -u / 2) : "bottomRight" == t ? (h.bottom = "20px", h.right = "20px") : (h.top = "20px", h.left = "50%", h["margin-left"] = -u / 2), "white" == r && (h.background = "rgba(255, 255, 255, 0.65)", h.color = "#000", $("#luckysheetpopover .luckysheetpopover-btn").css({ border: "1px solid #000" })), setTimeout((function () { $("#luckysheetpopover .luckysheetpopover-content").css({ "margin-left": -$("#luckysheetpopover .luckysheetpopover-btn").outerWidth() / 2 }) }), 1), $("#luckysheetpopover").css(h).fadeIn(), $("#luckysheetpopover .luckysheetpopover-btn").click((function () { "function" == typeof l && l() })), null != a && "number" == typeof a && setTimeout((function () { $("#luckysheetpopover").fadeOut().remove(), "function" == typeof l && l() }), a) } }, gd = { fileClone: [], editorRule: null, ruleTypeHtml: function () { var e = gn().conditionformat; return '
      \n
      \n \n '.concat(e.ruleTypeItem1, '\n
      \n
      \n \n ').concat(e.ruleTypeItem2, '\n
      \n
      \n \n ').concat(e.ruleTypeItem3, '\n
      \n
      \n \n ').concat(e.ruleTypeItem4, '\n
      \n
      \n \n ').concat(e.ruleTypeItem5, '\n
      \n
      \n \n ').concat(e.ruleTypeItem6, "\n
      \n
      ") }, textCellColorHtml: function () { var e = gn().conditionformat; return '
      \n
      \n \n \n \n
      \n
      \n \n \n \n
      \n
      ') }, selectRange: [], selectStatus: !1, dataBarList: [{ format: ["#638ec6", "#ffffff"] }, { format: ["#63c384", "#ffffff"] }, { format: ["#ff555a", "#ffffff"] }, { format: ["#ffb628", "#ffffff"] }, { format: ["#008aef", "#ffffff"] }, { format: ["#d6007b", "#ffffff"] }, { format: ["#638ec6"] }, { format: ["#63c384"] }, { format: ["#ff555a"] }, { format: ["#ffb628"] }, { format: ["#008aef"] }, { format: ["#d6007b"] }], colorGradationList: [{ format: ["rgb(99, 190, 123)", "rgb(255, 235, 132)", "rgb(248, 105, 107)"] }, { format: ["rgb(248, 105, 107)", "rgb(255, 235, 132)", "rgb(99, 190, 123)"] }, { format: ["rgb(99, 190, 123)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, { format: ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(99, 190, 123)"] }, { format: ["rgb(90, 138, 198)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, { format: ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(90, 138, 198)"] }, { format: ["rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, { format: ["rgb(248, 105, 107)", "rgb(252, 252, 255)"] }, { format: ["rgb(99, 190, 123)", "rgb(252, 252, 255)"] }, { format: ["rgb(252, 252, 255)", "rgb(99, 190, 123)"] }, { format: ["rgb(99, 190, 123)", "rgb(255, 235, 132)"] }, { format: ["rgb(255, 235, 132)", "rgb(99, 190, 123)"] }], init: function () { var e = this, t = gn().conditionformat; $(document).off("change.CFchooseSheet").on("change.CFchooseSheet", "#luckysheet-administerRule-dialog .chooseSheet", (function () { var t = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); e.getConditionRuleList(t) })), $(document).off("click.CFadministerRuleItem").on("click.CFadministerRuleItem", "#luckysheet-administerRule-dialog .ruleList .listBox .item", (function () { $(this).addClass("on").siblings().removeClass("on") })), $(document).off("click.CFadministerRuleConfirm").on("click.CFadministerRuleConfirm", "#luckysheet-administerRule-dialog-confirm", (function () { if (yu(ga.currentSheetIndex)) { for (var t = $.extend(!0, [], ga.luckysheetfile), a = e.getHistoryRules(t), r = $.extend(!0, [], e.fileClone), n = 0; n < r.length; n++) { var l = r[n].index; ga.luckysheetfile[_l(l)].luckysheet_conditionformat_save = r[_l(l)].luckysheet_conditionformat_save } var i = $.extend(!0, [], ga.luckysheetfile), o = e.getCurrentRules(i); if (e.ref(a, o), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-administerRule-dialog").hide(), pd.allowUpdate) for (var s = $.extend(!0, [], ga.luckysheetfile), c = 0; c < s.length; c++)pd.saveParam("all", s[c].index, s[c].luckysheet_conditionformat_save, { k: "luckysheet_conditionformat_save" }) } })), $(document).off("click.CFadministerRuleClose").on("click.CFadministerRuleClose", "#luckysheet-administerRule-dialog-close", (function () { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-administerRule-dialog").hide(), e.fileClone = [] })), $(document).off("click.CFadministerRuleFa").on("click.CFadministerRuleFa", "#luckysheet-administerRule-dialog .item .fa-table", (function () { $(this).parents("#luckysheet-administerRule-dialog").hide(); var t = $("#luckysheet-administerRule-dialog .chooseSheet select option:selected").val(); t != ga.currentSheetIndex && Sh.changeSheetExec(t); var a = $(this).siblings("input").val().trim(), r = $(this).parents(".item").attr("data-item"); e.multiRangeDialog(r, a), e.selectRange = []; var n = e.getRangeByTxt(a); if (n.length > 0) for (var l = 0; l < n.length; l++) { var i = n[l].row[0], o = n[l].row[1], s = n[l].column[0], c = n[l].column[1], u = ga.visibledatarow[o], d = i - 1 == -1 ? 0 : ga.visibledatarow[i - 1], h = ga.visibledatacolumn[c], m = s - 1 == -1 ? 0 : ga.visibledatacolumn[s - 1]; e.selectRange.push({ left: m, width: h - m - 1, top: d, height: u - d - 1, left_move: m, width_move: h - m - 1, top_move: d, height_move: u - d - 1, row: [i, o], column: [s, c], row_focus: i, column_focus: s }) } Eh(e.selectRange) })), $(document).off("click.CFmultiRangeConfirm").on("click.CFmultiRangeConfirm", "#luckysheet-multiRange-dialog-confirm", (function () { $(this).parents("#luckysheet-multiRange-dialog").hide(); var t = $(this).attr("data-item"), a = $(this).parents("#luckysheet-multiRange-dialog").find("input").val(); $("#luckysheet-administerRule-dialog .item[data-item=" + t + "] input").val(a); var r = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); e.fileClone[_l(r)].luckysheet_conditionformat_save[t].cellrange = e.getRangeByTxt(a), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").show(); Eh([]) })), $(document).off("click.CFmultiRangeClose").on("click.CFmultiRangeClose", "#luckysheet-multiRange-dialog-close", (function () { $(this).parents("#luckysheet-multiRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").show(), $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(); Eh([]) })), $(document).off("click.CFnewConditionRule").on("click.CFnewConditionRule", "#newConditionRule", (function () { yu($("#luckysheet-administerRule-dialog .chooseSheet option:selected").val()) && (0 != ga.luckysheet_select_save.length ? e.newConditionRuleDialog(1) : wa() ? alert(t.pleaseSelectRange) : fd.info(t.pleaseSelectRange, "")) })), $(document).off("click.CFnewConditionRuleConfirm").on("click.CFnewConditionRuleConfirm", "#luckysheet-newConditionRule-dialog-confirm", (function () { if (yu(ga.currentSheetIndex)) { var a, r, n = $("#luckysheet-newConditionRule-dialog .ruleTypeItem.on").index(), l = $("#luckysheet-newConditionRule-dialog #type1 option:selected").val(), i = $("#luckysheet-newConditionRule-dialog ." + l + "Box #type2 option:selected").val(); if (0 == n) { if ("dataBar" == l) { var o = $(this).parents("#luckysheet-newConditionRule-dialog").find(".dataBarBox .luckysheet-conditionformat-config-color").spectrum("get").toHexString(); "gradient" == i ? a = [o, "#ffffff"] : "solid" == i && (a = [o]), r = { type: "dataBar", cellrange: $.extend(!0, [], ga.luckysheet_select_save), format: a } } else if ("colorGradation" == l) { var s = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(), c = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(), u = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); "threeColor" == i ? a = [s, c, u] : "twoColor" == i && (a = [s, u]), r = { type: "colorGradation", cellrange: $.extend(!0, [], ga.luckysheet_select_save), format: a } } else if ("icons" == l) { a = { len: $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-len"), leftMin: $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-leftmin"), top: $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-top") }, r = { type: "icons", cellrange: $.extend(!0, [], ga.luckysheet_select_save), format: a } } } else { var d = "", h = [], m = []; if (1 == n) { if ("number" == l) if (d = i, "betweenness" == i) { var p = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(), f = $("#luckysheet-newConditionRule-dialog #conditionVal2 input").val().trim(), g = e.getRangeByTxt(p); if (g.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == g.length) { var v = g[0].row[0], y = g[0].row[1], b = g[0].column[0], k = g[0].column[1]; if (v != y || b != k) return void e.infoDialog(t.onlySingleCell, ""); p = Ko(v, b, ga.flowdata), h.push({ row: g[0].row, column: g[0].column }), m.push(p) } else if (0 == g.length) { if (isNaN(p) || "" == p) return void e.infoDialog(t.conditionValueCanOnly, ""); m.push(p) } var x = e.getRangeByTxt(f); if (x.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == x.length) { var w = x[0].row[0], _ = x[0].row[1], C = x[0].column[0], T = x[0].column[1]; if (w != _ || C != T) return void e.infoDialog(t.onlySingleCell, ""); f = Ko(w, C, ga.flowdata), h.push({ row: x[0].row, column: x[0].column }), m.push(f) } else if (0 == x.length) { if (isNaN(f) || "" == f) return void e.infoDialog(t.conditionValueCanOnly, ""); m.push(f) } } else { var A = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(), S = e.getRangeByTxt(A); if (S.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == S.length) { var I = S[0].row[0], R = S[0].row[1], q = S[0].column[0], D = S[0].column[1]; if (I != R || q != D) return void e.infoDialog(t.onlySingleCell, ""); A = Ko(I, q, ga.flowdata), h.push({ row: S[0].row, column: S[0].column }), m.push(A) } else if (0 == S.length) { if (isNaN(A) || "" == A) return void e.infoDialog(t.conditionValueCanOnly, ""); m.push(A) } } else if ("text" == l) { d = "textContains"; var F = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(), E = e.getRangeByTxt(F); if (E.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == E.length) { var M = E[0].row[0], N = E[0].row[1], P = E[0].column[0], z = E[0].column[1]; if (M != N || P != z) return void e.infoDialog(t.onlySingleCell, ""); F = Ko(M, P, ga.flowdata), h.push({ row: E[0].row, column: E[0].column }), m.push(F) } else if (0 == E.length) { if ("" == F) return void e.infoDialog(t.conditionValueCanOnly, ""); m.push(F) } } else if ("date" == l) { d = "occurrenceDate"; var L = $("#luckysheet-newConditionRule-dialog #daterange-btn").val(); if ("" == L || null == L) return void e.infoDialog(t.pleaseSelectADate, ""); m.push(L) } } else if (2 == n) { "top" == l ? d = $("#luckysheet-newConditionRule-dialog #isPercent").is(":selected") ? "top10%" : "top10" : "last" == l && (d = $("#luckysheet-newConditionRule-dialog #isPercent").is(":selected") ? "last10%" : "last10"); var O = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(); if (parseInt(O) != O || parseInt(O) < 1 || parseInt(O) > 1e3) return void e.infoDialog(t.pleaseEnterInteger, ""); m.push(parseInt(O)) } else if (3 == n) "AboveAverage" == l ? (d = "AboveAverage", m.push("AboveAverage")) : "SubAverage" == l && (d = "SubAverage", m.push("SubAverage")); else if (4 == n) d = "duplicateValue", m.push(l); else if (5 == n) { d = "formula"; var B = $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val().trim(); if ("" == B) return void e.infoDialog("Condition value cannot be empty!", ""); m.push(B) } a = { textColor: $("#luckysheet-newConditionRule-dialog #checkTextColor").is(":checked") ? $("#luckysheet-newConditionRule-dialog #textcolorshow").spectrum("get").toHexString() : null, cellColor: $("#luckysheet-newConditionRule-dialog #checkCellColor").is(":checked") ? $("#luckysheet-newConditionRule-dialog #cellcolorshow").spectrum("get").toHexString() : null }, r = { type: "default", cellrange: $.extend(!0, [], ga.luckysheet_select_save), format: a, conditionName: d, conditionRange: h, conditionValue: m } } $("#luckysheet-newConditionRule-dialog").hide(); var V = $(this).attr("data-source"); if (0 == V) { $("#luckysheet-modal-dialog-mask").hide(); var H = $.extend(!0, [], ga.luckysheetfile), U = e.getHistoryRules(H), j = null == ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save ? [] : ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save; j.push(r), ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save = j; var G = $.extend(!0, [], ga.luckysheetfile), W = e.getCurrentRules(G); e.ref(U, W), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, j, { k: "luckysheet_conditionformat_save" }) } else if (1 == V) { var Y = e.fileClone[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save ? e.fileClone[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save : []; Y.push(r), e.fileClone[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save = Y, e.administerRuleDialog() } } })), $(document).off("click.CFnewConditionRuleClose").on("click.CFnewConditionRuleClose", "#luckysheet-newConditionRule-dialog-close", (function () { var e = $(this).attr("data-source"); 0 == e && $("#luckysheet-modal-dialog-mask").hide(), 1 == e && $("#luckysheet-administerRule-dialog").show(), $("#luckysheet-newConditionRule-dialog").hide(), $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide() })), $(document).off("click.CFeditorConditionRule").on("click.CFeditorConditionRule", "#editorConditionRule", (function () { var t = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); if (yu(t)) { var a = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item"), r = { sheetIndex: t, itemIndex: a, data: e.fileClone[_l(t)].luckysheet_conditionformat_save[a] }; e.editorRule = r, e.editorConditionRuleDialog() } })), $(document).off("click.CFeditorConditionRuleConfirm").on("click.CFeditorConditionRuleConfirm", "#luckysheet-editorConditionRule-dialog-confirm", (function () { var a, r, n = $("#luckysheet-editorConditionRule-dialog .ruleTypeItem.on").index(), l = $("#luckysheet-editorConditionRule-dialog #type1 option:selected").val(), i = $("#luckysheet-editorConditionRule-dialog ." + l + "Box #type2 option:selected").val(), o = e.editorRule.data.cellrange; if (0 == n) { if ("dataBar" == l) { var s = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".dataBarBox .luckysheet-conditionformat-config-color").spectrum("get").toHexString(); "gradient" == i ? a = [s, "#ffffff"] : "solid" == i && (a = [s]), r = { type: "dataBar", cellrange: o, format: a } } else if ("colorGradation" == l) { var c = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(), u = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(), d = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); "threeColor" == i ? a = [c, u, d] : "twoColor" == i && (a = [c, d]), r = { type: "colorGradation", cellrange: o, format: a } } else if ("icons" == l) { r = { type: "icons", cellrange: o, format: a = { len: $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-len"), leftMin: $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-leftmin"), top: $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-top") } } } } else { var h = "", m = [], p = []; if (1 == n) { if ("number" == l) if (h = i, "betweenness" == i) { var f = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(), g = $("#luckysheet-editorConditionRule-dialog #conditionVal2 input").val().trim(), v = e.getRangeByTxt(f); if (v.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == v.length) { var y = v[0].row[0], b = v[0].row[1], k = v[0].column[0], x = v[0].column[1]; if (y != b || k != x) return void e.infoDialog(t.onlySingleCell, ""); f = Ko(y, k, ga.flowdata), m.push({ row: v[0].row, column: v[0].column }), p.push(f) } else if (0 == v.length) { if (isNaN(f) || "" == f) return void e.infoDialog(t.conditionValueCanOnly, ""); p.push(f) } var w = e.getRangeByTxt(g); if (w.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == w.length) { var _ = w[0].row[0], C = w[0].row[1], T = w[0].column[0], A = w[0].column[1]; if (_ != C || T != A) return void e.infoDialog(t.onlySingleCell, ""); g = Ko(_, T, ga.flowdata), m.push({ row: w[0].row, column: w[0].column }), p.push(g) } else if (0 == w.length) { if (isNaN(g) || "" == g) return void e.infoDialog(t.conditionValueCanOnly, ""); p.push(g) } } else { var S = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(), I = e.getRangeByTxt(S); if (I.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == I.length) { var R = I[0].row[0], q = I[0].row[1], D = I[0].column[0], F = I[0].column[1]; if (R != q || D != F) return void e.infoDialog(t.onlySingleCell, ""); S = Ko(R, D, ga.flowdata), m.push({ row: I[0].row, column: I[0].column }), p.push(S) } else if (0 == I.length) { if (isNaN(S) || "" == S) return void e.infoDialog(t.conditionValueCanOnly, ""); p.push(S) } } else if ("text" == l) { h = "textContains"; var E = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(), M = e.getRangeByTxt(E); if (M.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == M.length) { var N = M[0].row[0], P = M[0].row[1], z = M[0].column[0], L = M[0].column[1]; if (N != P || z != L) return void e.infoDialog(t.onlySingleCell, ""); E = Ko(N, z, ga.flowdata), m.push({ row: M[0].row, column: M[0].column }), p.push(E) } else if (0 == M.length) { if (isNaN(E) || "" == E) return void e.infoDialog(t.conditionValueCanOnly, ""); p.push(E) } } else if ("date" == l) { h = "occurrenceDate"; var O = $("#luckysheet-editorConditionRule-dialog #daterange-btn").val(); if ("" == O || null == O) return void e.infoDialog(t.pleaseSelectADate, ""); p.push(O) } } else if (2 == n) { "top" == l ? h = $("#luckysheet-editorConditionRule-dialog #isPercent").is(":selected") ? "top10%" : "top10" : "last" == l && (h = $("#luckysheet-editorConditionRule-dialog #isPercent").is(":selected") ? "last10%" : "last10"); var B = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(); if (parseInt(B) != B || parseInt(B) < 1 || parseInt(B) > 1e3) return void e.infoDialog(t.pleaseEnterInteger, ""); p.push(B) } else if (3 == n) "AboveAverage" == l ? (h = "AboveAverage", p.push("AboveAverage")) : "SubAverage" == l && (h = "SubAverage", p.push("SubAverage")); else if (4 == n) h = "duplicateValue", p.push(l); else if (5 == n) { h = "formula"; var V = $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val().trim(); if (console.log(V), "" == V) return void e.infoDialog("Condition value cannot be empty!", ""); p.push(V) } r = { type: "default", cellrange: o, format: a = { textColor: $("#luckysheet-editorConditionRule-dialog #checkTextColor").is(":checked") ? $("#luckysheet-editorConditionRule-dialog #textcolorshow").spectrum("get").toHexString() : null, cellColor: $("#luckysheet-editorConditionRule-dialog #checkCellColor").is(":checked") ? $("#luckysheet-editorConditionRule-dialog #cellcolorshow").spectrum("get").toHexString() : null }, conditionName: h, conditionRange: m, conditionValue: p } } var H = e.editorRule.sheetIndex, U = e.editorRule.itemIndex; e.fileClone[_l(H)].luckysheet_conditionformat_save[U] = r, $("#luckysheet-editorConditionRule-dialog").hide(), e.administerRuleDialog() })), $(document).off("click.CFeditorConditionRuleClose").on("click.CFeditorConditionRuleClose", "#luckysheet-editorConditionRule-dialog-close", (function () { $("#luckysheet-editorConditionRule-dialog").hide(), $("#luckysheet-administerRule-dialog").show(), $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide() })), $(document).off("click.CFnewEditorRuleItem").on("click.CFnewEditorRuleItem", ".luckysheet-newEditorRule-dialog .ruleTypeItem", (function () { $(this).addClass("on").siblings().removeClass("on"); var t = $(this).index(); $(this).parents(".luckysheet-newEditorRule-dialog").find(".ruleExplainBox").html(e.getRuleExplain(t)), e.colorSelectInit() })), $(document).off("change.CFnewEditorRuleType1").on("change.CFnewEditorRuleType1", ".luckysheet-newEditorRule-dialog #type1", (function () { var t = $(this).find("option:selected").val(); "dataBar" != t && "colorGradation" != t && "icons" != t && "number" != t && "text" != t && "date" != t || $(this).parents(".luckysheet-newEditorRule-dialog").find("." + t + "Box").show().siblings().hide(), "date" == t && e.daterangeInit($(this).parents(".luckysheet-newEditorRule-dialog").attr("id")) })), $(document).off("change.CFnewEditorRuleType2").on("change.CFnewEditorRuleType2", ".luckysheet-newEditorRule-dialog #type2", (function () { var e = $(this).parents(".luckysheet-newEditorRule-dialog").find("#type1 option:selected").val(); if ("colorGradation" == e) "threeColor" == $(this).find("option:selected").val() ? $(this).parents(".luckysheet-newEditorRule-dialog").find(".midVal").show() : $(this).parents(".luckysheet-newEditorRule-dialog").find(".midVal").hide(); else if ("number" == e) { "betweenness" == $(this).find("option:selected").val() ? ($(this).parents(".luckysheet-newEditorRule-dialog").find(".txt").show(), $(this).parents(".luckysheet-newEditorRule-dialog").find("#conditionVal2").show()) : ($(this).parents(".luckysheet-newEditorRule-dialog").find(".txt").hide(), $(this).parents(".luckysheet-newEditorRule-dialog").find("#conditionVal2").hide()) } })), $(document).off("click.CFiconsShowbox").on("click.CFiconsShowbox", ".luckysheet-newEditorRule-dialog .iconsBox .showbox", (function () { $(this).parents(".iconsBox").find("ul").toggle() })), $(document).off("click.CFiconsLi").on("click.CFiconsLi", ".luckysheet-newEditorRule-dialog .iconsBox li", (function () { var e = $(this).find("div").attr("data-len"), t = $(this).find("div").attr("data-leftmin"), a = $(this).find("div").attr("data-top"), r = $(this).find("div").attr("title"), n = $(this).find("div").css("background-position"); $(this).parents(".iconsBox").find(".showbox .model").css("background-position", n), $(this).parents(".iconsBox").find(".showbox .model").attr("data-len", e), $(this).parents(".iconsBox").find(".showbox .model").attr("data-leftmin", t), $(this).parents(".iconsBox").find(".showbox .model").attr("data-top", a), $(this).parents(".iconsBox").find(".showbox .model").attr("title", r), $(this).parents("ul").hide() })), $(document).off("click.CFdeleteConditionRule").on("click.CFdeleteConditionRule", "#deleteConditionRule", (function () { var t = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); if (yu(t)) { var a = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item"); e.fileClone[_l(t)].luckysheet_conditionformat_save.splice(a, 1), e.administerRuleDialog() } })), $(document).off("click.CFdefault").on("click.CFdefault", "#luckysheet-conditionformat-dialog-confirm", (function () { if (yu(ga.currentSheetIndex)) { var a, r, n = $("#luckysheet-conditionformat-dialog .box").attr("data-itemvalue"), l = [], i = []; if ("greaterThan" == n || "lessThan" == n || "equal" == n || "textContains" == n) { var o = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(), s = e.getRangeByTxt(o); if (s.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == s.length) { var c = s[0].row[0], u = s[0].row[1], d = s[0].column[0], h = s[0].column[1]; if (c != u || d != h) return void e.infoDialog(t.onlySingleCell, ""); o = Ko(c, d, ga.flowdata), l.push({ row: s[0].row, column: s[0].column }), i.push(o) } else if (0 == s.length) { if (isNaN(o) || "" == o) return void e.infoDialog(t.conditionValueCanOnly, ""); i.push(o) } } else if ("betweenness" == n) { var m = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(), p = $("#luckysheet-conditionformat-dialog #conditionVal2").val().trim(), f = e.getRangeByTxt(m); if (f.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == f.length) { var g = f[0].row[0], v = f[0].row[1], y = f[0].column[0], b = f[0].column[1]; if (g != v || y != b) return void e.infoDialog(t.onlySingleCell, ""); m = Ko(g, y, ga.flowdata), l.push({ row: f[0].row, column: f[0].column }), i.push(m) } else if (0 == f.length) { if (isNaN(m) || "" == m) return void e.infoDialog(t.conditionValueCanOnly, ""); i.push(m) } var k = e.getRangeByTxt(p); if (k.length > 1) return void e.infoDialog(t.onlySingleCell, ""); if (1 == k.length) { var x = k[0].row[0], w = k[0].row[1], _ = k[0].column[0], C = k[0].column[1]; if (x != w || _ != C) return void e.infoDialog(t.onlySingleCell, ""); p = Ko(x, _, ga.flowdata), l.push({ row: k[0].row, column: k[0].column }), i.push(p) } else if (0 == k.length) { if (isNaN(p) || "" == p) return void e.infoDialog(t.conditionValueCanOnly, ""); i.push(p) } } else if ("occurrenceDate" == n) { var T = $("#luckysheet-conditionformat-dialog #daterange-btn").val(); if ("" == T || null == T) return void e.infoDialog(t.pleaseSelectADate, ""); i.push(T) } else if ("duplicateValue" == n) i.push($("#luckysheet-conditionformat-dialog #conditionVal option:selected").val()); else if ("top10" == n || "top10%" == n || "last10" == n || "last10%" == n) { var A = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(); if (parseInt(A) != A || parseInt(A) < 1 || parseInt(A) > 1e3) return void e.infoDialog(t.pleaseEnterInteger, ""); i.push(A) } else "AboveAverage" == n ? i.push("AboveAverage") : "SubAverage" == n && i.push("SubAverage"); a = $("#checkTextColor").is(":checked") ? $("#textcolorshow").spectrum("get").toHexString() : null, r = $("#checkCellColor").is(":checked") ? $("#cellcolorshow").spectrum("get").toHexString() : null; var S = $.extend(!0, [], ga.luckysheetfile), I = e.getHistoryRules(S), R = { type: "default", cellrange: $.extend(!0, [], ga.luckysheet_select_save), format: { textColor: a, cellColor: r }, conditionName: n, conditionRange: l, conditionValue: i }, q = null == ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save ? [] : ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save; q.push(R), ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save = q; var D = $.extend(!0, [], ga.luckysheetfile), F = e.getCurrentRules(D); e.ref(I, F), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-conditionformat-dialog").hide(), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, q, { k: "luckysheet_conditionformat_save" }) } })), $(document).off("click.CFicons").on("click.CFicons", "#luckysheet-CFicons-dialog .item", (function () { if ($("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-CFicons-dialog").hide(), ga.luckysheet_select_save.length > 0) { var t = $.extend(!0, [], ga.luckysheet_select_save), a = { len: $(this).attr("data-len"), leftMin: $(this).attr("data-leftMin"), top: $(this).attr("data-top") }; e.updateItem("icons", t, a) } })), $(document).on("click", ".range .fa-table", (function () { var t, a = $(this).parents(".luckysheet-modal-dialog").attr("id"); if ($("#" + a).hide(), "luckysheet-conditionformat-dialog" == a) t = "conditionVal" == $(this).siblings("input").attr("id") ? "0_1" : "0_2"; else if ("luckysheet-newConditionRule-dialog" == a) { var r = $(this).parents(".range").attr("id"); t = "formulaConditionVal" == r ? "1_0" : "conditionVal" == r ? "1_1" : "1_2" } else if ("luckysheet-editorConditionRule-dialog" == a) { var n = $(this).parents(".range").attr("id"); t = "formulaConditionVal" == n ? "2_0" : "conditionVal" == n ? "2_1" : "2_2" } var l = $(this).siblings("input").val(); e.singleRangeDialog(t, l), Eh(e.getRangeByTxt(l)) })), $(document).on("click", "#luckysheet-singleRange-dialog-confirm", (function () { $("#luckysheet-modal-dialog-mask").show(), $(this).parents("#luckysheet-singleRange-dialog").hide(); var e = $(this).attr("data-source"), t = $(this).parents("#luckysheet-singleRange-dialog").find("input").val(); "0_1" == e ? ($("#luckysheet-conditionformat-dialog").show(), $("#luckysheet-conditionformat-dialog #conditionVal").val(t)) : "0_2" == e ? ($("#luckysheet-conditionformat-dialog").show(), $("#luckysheet-conditionformat-dialog #conditionVal2").val(t)) : "1_0" == e ? ($("#luckysheet-newConditionRule-dialog").show(), $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val(t)) : "1_1" == e ? ($("#luckysheet-newConditionRule-dialog").show(), $("#luckysheet-newConditionRule-dialog #conditionVal input").val(t)) : "1_2" == e ? ($("#luckysheet-newConditionRule-dialog").show(), $("#luckysheet-newConditionRule-dialog #conditionVal2 input").val(t)) : "2_0" == e ? ($("#luckysheet-editorConditionRule-dialog").show(), $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val(t)) : "2_1" == e ? ($("#luckysheet-editorConditionRule-dialog").show(), $("#luckysheet-editorConditionRule-dialog #conditionVal input").val(t)) : "2_2" == e && ($("#luckysheet-editorConditionRule-dialog").show(), $("#luckysheet-editorConditionRule-dialog #conditionVal2 input").val(t)); Eh([]) })), $(document).on("click", "#luckysheet-singleRange-dialog-close", (function () { $("#luckysheet-modal-dialog-mask").show(), $(this).parents("#luckysheet-singleRange-dialog").hide(); var e = $(this).attr("data-source"); "0_1" == e || "0_2" == e ? $("#luckysheet-conditionformat-dialog").show() : "1_0" == e || "1_1" == e || "1_2" == e ? $("#luckysheet-newConditionRule-dialog").show() : "2_0" != e && "2_1" != e && "2_2" != e || $("#luckysheet-editorConditionRule-dialog").show(); Eh([]) })), $(document).on("click", ".luckysheet-modal-dialog-title-close", (function () { var e = $(this).parents(".luckysheet-modal-dialog").attr("id"); "luckysheet-newConditionRule-dialog" == e && (1 == $("#" + e).find("#luckysheet-newConditionRule-dialog-close").attr("data-source") && $("#luckysheet-administerRule-dialog").show()); if ("luckysheet-editorConditionRule-dialog" == e && $("#luckysheet-administerRule-dialog").show(), "luckysheet-singleRange-dialog" == e) { $("#luckysheet-modal-dialog-mask").show(); var t = $(this).parents("#luckysheet-singleRange-dialog").find("#luckysheet-singleRange-dialog-confirm").attr("data-source"); "0_1" == t || "0_2" == t ? $("#luckysheet-conditionformat-dialog").show() : "1_1" == t || "1_2" == t ? $("#luckysheet-newConditionRule-dialog").show() : "2_1" != t && "2_2" != t || $("#luckysheet-editorConditionRule-dialog").show(); Eh([]) } if ("luckysheet-multiRange-dialog" == e) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").show(); Eh([]) } "luckysheet-conditionformat-info-dialog" == e && $("#luckysheet-modal-dialog-mask").show() })), $(document).on("click", "#luckysheet-conditionformat-info-dialog-close", (function () { $(this).parents("#luckysheet-conditionformat-info-dialog").hide() })) }, singleRangeDialog: function (e, t) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-singleRange-dialog").remove(); var a = gn().conditionformat; $("body").append(_m(bn, { id: "luckysheet-singleRange-dialog", addclass: "luckysheet-singleRange-dialog", title: a.selectCell, content: ''), botton: '\n "), style: "z-index:100003" })); var r = $("#luckysheet-singleRange-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), n = r.outerHeight(), l = r.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-singleRange-dialog").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show() }, multiRangeDialog: function (e, t) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-multiRange-dialog").remove(); var a = gn().conditionformat; $("body").append(_m(bn, { id: "luckysheet-multiRange-dialog", addclass: "luckysheet-multiRange-dialog", title: a.selectRange, content: ''), botton: '\n "), style: "z-index:100003" })); var r = $("#luckysheet-multiRange-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), n = r.outerHeight(), l = r.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-multiRange-dialog").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show(), Eh(this.getRangeByTxt(t)) }, getTxtByRange: function (e) { if (e.length > 0) { for (var t = [], a = 0; a < e.length; a++) { var r = e[a].row[0], n = e[a].row[1], l = e[a].column[0], i = e[a].column[1]; t.push(Cl(ga.currentSheetIndex, { row: [r, n], column: [l, i] }, ga.currentSheetIndex)) } return t.join(",") } }, getRangeByTxt: function (e) { var t = []; if (-1 != (e = e.toString()).indexOf(",")) for (var a = e.split(","), r = 0; r < a.length; r++) { if (!Ih.iscelldata(a[r])) { t = []; break } t.push(Ih.getcellrange(a[r])) } else Ih.iscelldata(e) && t.push(Ih.getcellrange(e)); return t }, colorSelectInit: function () { var e = gn().conditionformat; $(".luckysheet-conditionformat-config-color").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, maxPaletteSize: 8, maxSelectionSize: 8, cancelText: e.cancel, chooseText: e.confirmColor, togglePaletteMoreText: "自定义", togglePaletteLessText: "收起", togglePaletteOnly: !0, clearText: e.clearColorSelect, noColorSelectedText: "没有颜色被选择", localStorageKey: "spectrum.textcolor" + pd.gridKey, palette: [["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"], ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"], ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"], ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"], ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"], ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"], ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"], ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]], change: function (e) { null != e && (e = e.toHexString()) } }) }, conditionformatDialog: function (e, t) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-conditionformat-dialog").remove(); var a = gn().conditionformat; $("body").append(_m(bn, { id: "luckysheet-conditionformat-dialog", addclass: "luckysheet-conditionformat-dialog", title: e, content: t, botton: '\n "), style: "z-index:9999" })); var r = $("#luckysheet-conditionformat-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), n = r.outerHeight(), l = r.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-conditionformat-dialog").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show(), this.init(), this.colorSelectInit(), e == gn().conditionformat.conditionformat_occurrenceDate && this.daterangeInit("luckysheet-conditionformat-dialog") }, CFiconsDialog: function () { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-CFicons-dialog").remove(); var e = gn().conditionformat, t = '
      \n
      '.concat(e.pleaseSelectIcon, '
      \n
      ').concat(e.direction, '
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      ').concat(e.shape, '
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      ').concat(e.mark, '
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      ').concat(e.grade, '
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      '); $("body").append(_m(bn, { id: "luckysheet-CFicons-dialog", addclass: "luckysheet-CFicons-dialog", title: e.icons, content: t, botton: '"), style: "z-index:100003" })); var a = $("#luckysheet-CFicons-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), r = a.outerHeight(), n = a.outerWidth(), l = $(window).width(), i = $(window).height(), o = $(document).scrollLeft(), s = $(document).scrollTop(); $("#luckysheet-CFicons-dialog").css({ left: (l + o - n) / 2, top: (i + s - r) / 3 }).show() }, administerRuleDialog: function () { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").remove(); for (var e = gn().conditionformat, t = "", a = 0; a < ga.luckysheetfile.length; a++)"1" == ga.luckysheetfile[a].status ? t += '") : t += '"); var r = '
      \n \n \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n ').concat(e.rule, "\n ").concat(e.format, "\n ").concat(e.applyRange, '\n
      \n
      \n
      \n
      '); $("body").append(_m(bn, { id: "luckysheet-administerRule-dialog", addclass: "luckysheet-administerRule-dialog", title: e.conditionformatManageRules, content: r, botton: '\n "), style: "z-index:100003" })); var n = $("#luckysheet-administerRule-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-administerRule-dialog").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show(); var d = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); this.getConditionRuleList(d) }, getConditionRuleList: function (e) { $("#luckysheet-administerRule-dialog .ruleList .listBox").empty(); var t = this.fileClone[_l(e)].luckysheet_conditionformat_save; if (null != t && t.length > 0) { for (var a = gn().conditionformat, r = 0; r < t.length; r++) { var n = t[r].type, l = t[r].format, i = t[r].cellrange, o = void 0, s = ""; "dataBar" == n ? (o = a.dataBar, s = '') : "colorGradation" == n ? (o = a.colorGradation, s = '') : "icons" == n ? (o = a.icons, s = '') : (o = this.getConditionRuleName(t[r].conditionName, t[r].conditionRange, t[r].conditionValue), null != l.textColor && (s += ''), null != l.cellColor && (s += '')); for (var c = [], u = 0; u < i.length; u++) { var d = i[u].row[0], h = i[u].row[1], m = i[u].column[0], p = i[u].column[1]; c.push(Im(m) + (d + 1) + ":" + Im(p) + (h + 1)) } var f = '
      ' + o + '
      ' + s + '
      '; $("#luckysheet-administerRule-dialog .ruleList .listBox").prepend(f) } $("#luckysheet-administerRule-dialog .ruleList .listBox .item canvas").each((function (e) { var a = $(this).closest(".item").attr("data-item"), r = t[a].type, n = t[a].format, l = $(this).get(0).getContext("2d"); if ("dataBar" == r) if (2 == n.length) { var i = l.createLinearGradient(0, 0, 46, 0); i.addColorStop(0, n[0]), i.addColorStop(1, n[1]), l.fillStyle = i, l.fillRect(0, 0, 46, 18), l.beginPath(), l.moveTo(0, 0), l.lineTo(0, 18), l.lineTo(46, 18), l.lineTo(46, 0), l.lineTo(0, 0), l.lineWidth = ga.devicePixelRatio, l.strokeStyle = n[0], l.stroke(), l.closePath() } else 1 == n.length && (l.fillStyle = n[0], l.fillRect(0, 0, 46, 18), l.beginPath(), l.moveTo(0, 0), l.lineTo(0, 18), l.lineTo(46, 18), l.lineTo(46, 0), l.lineTo(0, 0), l.lineWidth = ga.devicePixelRatio, l.strokeStyle = n[0], l.stroke(), l.closePath()); else if ("colorGradation" == r) { var o = l.createLinearGradient(0, 0, 46, 0); 3 == n.length ? (o.addColorStop(0, n[0]), o.addColorStop(.5, n[1]), o.addColorStop(1, n[2])) : 2 == n.length && (o.addColorStop(0, n[0]), o.addColorStop(1, n[1])), l.fillStyle = o, l.fillRect(0, 0, 46, 18) } else if ("icons" == r) { var s = n.len, c = n.leftMin, u = n.top, d = 32 * s + 10 * (s - 1), h = 1472 / d; "0" == c ? l.drawImage(Un, 0, 32 * u, d, 32, 0, (18 - h) / 2, 46, h) : "5" == c && l.drawImage(Un, 210, 32 * u, d, 32, 0, (18 - h) / 2, 46, h) } })), $("#luckysheet-administerRule-dialog .ruleList .listBox .item").eq(0).addClass("on") } }, getConditionRuleName: function (e, t, a) { var r; r = null != t[0] ? Im(t[0].column[0]) + (t[0].row[0] + 1) : a[0]; var n, l = gn().conditionformat; if ("greaterThan" == e) return l.cellValue + " > " + r; if ("lessThan" == e) return l.cellValue + " < " + r; if ("betweenness" == e) return n = null != t[1] ? Im(t[1].column[0]) + (t[1].row[0] + 1) : a[1], l.cellValue + " " + l.between + " " + r + " " + l.in + " " + n + " " + l.between2; if ("equal" == e) return l.cellValue + " = " + r; if ("textContains" == e) return l.cellValue + l.contain + " =" + r; if ("occurrenceDate" == e) return a; if ("duplicateValue" == e) { if ("0" == a) return l.duplicateValue; if ("1" == a) return l.uniqueValue } else { if ("top10" == e) return l.top + " " + r + " " + l.oneself; if ("top10%" == e) return l.top + " " + r + "% " + l.oneself; if ("last10" == e) return l.last + " " + r + " " + l.oneself; if ("last10%" == e) return l.last + " " + r + "% " + l.oneself; if ("AboveAverage" == e) return l.aboveAverage; if ("SubAverage" == e) return l.belowAverage; if ("formula" == e) return "=" != r.slice(0, 1) && (r = "=" + r), l.formula + ": " + r } }, newConditionRuleDialog: function (e) { var t = gn().conditionformat, a = this.getRuleExplain(0); $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").hide(), $("#luckysheet-newConditionRule-dialog").remove(); var r = '
      ' + t.chooseRuleType + ":
      " + this.ruleTypeHtml() + '
      ' + t.editRuleDescription + ':
      ' + a + "
      "; $("body").append(_m(bn, { id: "luckysheet-newConditionRule-dialog", addclass: "luckysheet-newEditorRule-dialog", title: t.newFormatRule, content: r, botton: '\n "), style: "z-index:100003" })); var n = $("#luckysheet-newConditionRule-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-newConditionRule-dialog").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show(), $("#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)").addClass("on").siblings().removeClass("on"), this.colorSelectInit() }, editorConditionRuleDialog: function () { var e = gn().conditionformat, t = this.editorRule.data; if (null != t) { var a, r, n = t.type, l = t.format, i = t.conditionName; "dataBar" == n || "colorGradation" == n || "icons" == n ? (a = 0, r = n) : "greaterThan" == i || "lessThan" == i || "betweenness" == i || "equal" == i || "textContains" == i || "occurrenceDate" == i ? (a = 1, "greaterThan" == i || "lessThan" == i || "betweenness" == i || "equal" == i ? r = "number" : "textContains" == i ? r = "text" : "occurrenceDate" == i && (r = "date")) : "top10" == i || "top10%" == i || "last10" == i || "last10%" == i ? (a = 2, "top10" == i || "top10%" == i ? r = "top" : "last10" != i && "last10%" != i || (r = "last")) : "AboveAverage" == i || "SubAverage" == i ? (a = 3, r = i) : "duplicateValue" == i ? (a = 4, r = t.conditionValue) : "formula" == i && (a = 5); var o = this.getRuleExplain(a); $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-administerRule-dialog").hide(), $("#luckysheet-editorConditionRule-dialog").remove(); var s = '
      ' + e.chooseRuleType + ":
      " + this.ruleTypeHtml() + '
      ' + e.editRuleDescription + ':
      ' + o + "
      "; $("body").append(_m(bn, { id: "luckysheet-editorConditionRule-dialog", addclass: "luckysheet-newEditorRule-dialog", title: e.editFormatRule, content: s, botton: '\n "), style: "z-index:100003" })); var c = $("#luckysheet-editorConditionRule-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), u = c.outerHeight(), d = c.outerWidth(), h = $(window).width(), m = $(window).height(), p = $(document).scrollLeft(), f = $(document).scrollTop(); if ($("#luckysheet-editorConditionRule-dialog").css({ left: (h + p - d) / 2, top: (m + f - u) / 3 }).show(), this.colorSelectInit(), $("#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(" + a + ")").addClass("on").siblings().removeClass("on"), $("#luckysheet-editorConditionRule-dialog #type1").val(r), "dataBar" != r && "colorGradation" != r && "icons" != r && "number" != r && "text" != r && "date" != r || ($("#luckysheet-editorConditionRule-dialog ." + r + "Box").show(), $("#luckysheet-editorConditionRule-dialog ." + r + "Box").siblings().hide()), "date" == r && this.daterangeInit("luckysheet-editorConditionRule-dialog"), "dataBar" == n || "colorGradation" == n || "icons" == n) { if ("dataBar" == r) 2 == l.length ? $("#luckysheet-editorConditionRule-dialog .dataBarBox #type2").val("gradient") : 1 == l.length && $("#luckysheet-editorConditionRule-dialog .dataBarBox #type2").val("solid"), $("#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color").spectrum("set", l[0]); else if ("colorGradation" == r) 3 == l.length ? ($("#luckysheet-editorConditionRule-dialog .colorGradationBox #type2").val("threeColor"), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal").show(), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("set", l[0]), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("set", l[1]), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("set", l[2])) : 2 == l.length && ($("#luckysheet-editorConditionRule-dialog .colorGradationBox #type2").val("twoColor"), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal").hide(), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("set", l[0]), $("#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("set", l[1])); else if ("icons" == r) { var g = l.len, v = l.leftMin, y = l.top; $("#luckysheet-editorConditionRule-dialog .iconsBox li").each((function (e, t) { if ($(t).find("div").attr("data-len") == g && $(t).find("div").attr("data-leftmin") == v && $(t).find("div").attr("data-top") == y) return $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").css("background-position", $(t).find("div").css("background-position")), $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-len", $(t).find("div").attr("data-len")), $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-leftmin", $(t).find("div").attr("data-leftmin")), $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-top", $(t).find("div").attr("data-leftmin")), $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("title", $(t).find("div").attr("title")), !0 })) } } else { var b, k; if ("number" == r) if ($("#luckysheet-editorConditionRule-dialog .numberBox #type2").val(i), b = null != t.conditionRange[0] ? Cl(ga.currentSheetIndex, { row: t.conditionRange[0].row, column: t.conditionRange[0].column }, ga.currentSheetIndex) : t.conditionValue[0], $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input").val(b), "betweenness" == i) $("#luckysheet-editorConditionRule-dialog .numberBox .txt").show(), $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2").show(), k = null != t.conditionRange[1] ? Cl(ga.currentSheetIndex, { row: t.conditionRange[1].row, column: t.conditionRange[1].column }, ga.currentSheetIndex) : t.conditionValue[1], $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input").val(k); else $("#luckysheet-editorConditionRule-dialog .numberBox .txt").hide(), $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2").hide(); else if ("text" == r) { var x; x = null != t.conditionRange[0] ? Cl(ga.currentSheetIndex, { row: t.conditionRange[0].row, column: t.conditionRange[0].column }, ga.currentSheetIndex) : t.conditionValue[0], $("#luckysheet-editorConditionRule-dialog .textBox #conditionVal input").val(x) } else if ("date" == r) { this.daterangeInit("luckysheet-editorConditionRule-dialog"); var w = t.conditionValue[0]; $("#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn").val(w) } else if ("top" == r || "last" == r) { t.conditionValue[0]; "top10%" != i && "last10%" != i || $("#luckysheet-editorConditionRule-dialog #isPercent").attr("checked", "checked") } else if ("formula" == i) { var _ = t.conditionValue[0]; $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val(_) } $("#luckysheet-editorConditionRule-dialog #textcolorshow").spectrum("set", l.textColor), $("#luckysheet-editorConditionRule-dialog #cellcolorshow").spectrum("set", l.cellColor) } } }, infoDialog: function (e, t) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-conditionformat-info-dialog").remove(), $("body").append(_m(bn, { id: "luckysheet-conditionformat-info-dialog", addclass: "", title: e, content: t, botton: '"), style: "z-index:100003" })); var a = $("#luckysheet-conditionformat-info-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), r = a.outerHeight(), n = a.outerWidth(), l = $(window).width(), i = $(window).height(), o = $(document).scrollLeft(), s = $(document).scrollTop(); $("#luckysheet-conditionformat-info-dialog").css({ left: (l + o - n) / 2, top: (i + s - r) / 3 }).show() }, getRuleExplain: function (e) { var t, a = gn().conditionformat, r = this.textCellColorHtml(); switch (e) { case 0: t = '
      '.concat(a.ruleTypeItem1, ':
      \n
      \n \n \n
      \n
      \n
      \n
      \n \n \n
      \n
      \n \n \n
      \n
      \n \n \n
      '); break; case 1: t = '
      '.concat(a.ruleTypeItem2_title, ':
      \n
      \n \n
      \n
      \n \n
      \n \n \n
      \n \n \n
      \n \n \n
      \n
      \n
      ').concat(a.setFormat, ":
      ").concat(r); break; case 2: t = '
      '.concat(a.ruleTypeItem3_title, ':
      \n
      \n \n
      \n \n
      \n \n \n
      \n
      ').concat(a.setFormat, ":
      ").concat(r); break; case 3: t = '
      '.concat(a.ruleTypeItem4_title, ':
      \n
      \n \n ').concat(a.selectRange_average, '\n
      \n
      ').concat(a.setFormat, ":
      ").concat(r); break; case 4: t = '
      '.concat(a.all, ':
      \n
      \n \n ').concat(a.selectRange_value, '\n
      \n
      ').concat(a.setFormat, ":
      ").concat(r); break; case 5: t = '
      '.concat(a.ruleTypeItem2_title, ':
      \n
      \n
      \n \n \n
      \n
      \n
      ').concat(a.setFormat, ":
      ").concat(r) }return t }, daterangeInit: function (e) { var t = gn().conditionformat; $(".ranges_1 ul").remove(), $("#" + e).find("#daterange-btn").flatpickr({ mode: "range", onChange: function (e, a) { var r = qa(e, 2), n = r[0], l = r[1], i = [t.yesterday, t.today], o = [t.lastWeek, t.thisWeek, t.lastMonth, t.thisMonth, t.lastYear, t.thisYear, t.last7days, t.last30days]; a == t.all ? $("#daterange-btn").val("") : i.indexOf(a) > -1 ? $("#daterange-btn").val(us(n).format("YYYY/MM/DD")) : o.indexOf(a) > -1 && $("#daterange-btn").val(us(n).format("YYYY/MM/DD") + "-" + us(l).format("YYYY/MM/DD")) } }) }, CFSplitRange: function (e, t, a, r) { var n = [], l = a.row[0] - t.row[0], i = a.column[0] - t.column[0], o = e.row[0], s = e.row[1], c = e.column[0], u = e.column[1]; return o >= t.row[0] && s <= t.row[1] && c >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o + l, s + l], column: [c + i, u + i] }] : "restPart" == r ? n = [] : "operatePart" == r && (n = [{ row: [o + l, s + l], column: [c + i, u + i] }]) : o >= t.row[0] && o <= t.row[1] && c >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [t.row[1] + 1, s], column: [c, u] }, { row: [o + l, t.row[1] + l], column: [c + i, u + i] }] : "restPart" == r ? n = [{ row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [o + l, t.row[1] + l], column: [c + i, u + i] }]) : s >= t.row[0] && s <= t.row[1] && c >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0] + l, s + l], column: [c + i, u + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, s + l], column: [c + i, u + i] }]) : o < t.row[0] && s > t.row[1] && c >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [t.row[0] + l, t.row[1] + l], column: [c + i, u + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, t.row[1] + l], column: [c + i, u + i] }]) : c >= t.column[0] && c <= t.column[1] && o >= t.row[0] && s <= t.row[1] ? "allPart" == r ? n = [{ row: [o, s], column: [t.column[1] + 1, u] }, { row: [o + l, s + l], column: [c + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, s], column: [t.column[1] + 1, u] }] : "operatePart" == r && (n = [{ row: [o + l, s + l], column: [c + i, t.column[1] + i] }]) : u >= t.column[0] && u <= t.column[1] && o >= t.row[0] && s <= t.row[1] ? "allPart" == r ? n = [{ row: [o, s], column: [c, t.column[0] - 1] }, { row: [o + l, s + l], column: [t.column[0] + i, u + i] }] : "restPart" == r ? n = [{ row: [o, s], column: [c, t.column[0] - 1] }] : "operatePart" == r && (n = [{ row: [o + l, s + l], column: [t.column[0] + i, u + i] }]) : c < t.column[0] && u > t.column[1] && o >= t.row[0] && s <= t.row[1] ? "allPart" == r ? n = [{ row: [o, s], column: [c, t.column[0] - 1] }, { row: [o, s], column: [t.column[1] + 1, u] }, { row: [o + l, s + l], column: [t.column[0] + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, s], column: [c, t.column[0] - 1] }, { row: [o, s], column: [t.column[1] + 1, u] }] : "operatePart" == r && (n = [{ row: [o + l, s + l], column: [t.column[0] + i, t.column[1] + i] }]) : o >= t.row[0] && o <= t.row[1] && c >= t.column[0] && c <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [o + l, t.row[1] + l], column: [c + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [o + l, t.row[1] + l], column: [c + i, t.column[1] + i] }]) : o >= t.row[0] && o <= t.row[1] && u >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [o + l, t.row[1] + l], column: [t.column[0] + i, u + i] }] : "restPart" == r ? n = [{ row: [o, t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [o + l, t.row[1] + l], column: [t.column[0] + i, u + i] }]) : s >= t.row[0] && s <= t.row[1] && c >= t.column[0] && c <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [t.column[1] + 1, u] }, { row: [t.row[0] + l, s + l], column: [c + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [t.column[1] + 1, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, s + l], column: [c + i, t.column[1] + i] }]) : s >= t.row[0] && s <= t.row[1] && u >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [c, t.column[0] - 1] }, { row: [t.row[0] + l, s + l], column: [t.column[0] + i, u + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [c, t.column[0] - 1] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, s + l], column: [t.column[0] + i, u + i] }]) : o < t.row[0] && s > t.row[1] && c >= t.column[0] && c <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [t.row[0] + l, t.row[1] + l], column: [c + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, t.row[1] + l], column: [c + i, t.column[1] + i] }]) : o < t.row[0] && s > t.row[1] && u >= t.column[0] && u <= t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [t.row[0] + l, t.row[1] + l], column: [t.column[0] + i, u + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, t.row[1] + l], column: [t.column[0] + i, u + i] }]) : c < t.column[0] && u > t.column[1] && o >= t.row[0] && o <= t.row[1] ? "allPart" == r ? n = [{ row: [o, t.row[1]], column: [c, t.column[0] - 1] }, { row: [o, t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [o + l, t.row[1] + l], column: [t.column[0] + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[1]], column: [c, t.column[0] - 1] }, { row: [o, t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [o + l, t.row[1] + l], column: [t.column[0] + i, t.column[1] + i] }]) : c < t.column[0] && u > t.column[1] && s >= t.row[0] && s <= t.row[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [c, t.column[0] - 1] }, { row: [t.row[0], s], column: [t.column[1] + 1, u] }, { row: [t.row[0] + l, s + l], column: [t.column[0] + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], s], column: [c, t.column[0] - 1] }, { row: [t.row[0], s], column: [t.column[1] + 1, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, s + l], column: [t.column[0] + i, t.column[1] + i] }]) : o < t.row[0] && s > t.row[1] && c < t.column[0] && u > t.column[1] ? "allPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[0], t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }, { row: [t.row[0] + l, t.row[1] + l], column: [t.column[0] + i, t.column[1] + i] }] : "restPart" == r ? n = [{ row: [o, t.row[0] - 1], column: [c, u] }, { row: [t.row[0], t.row[1]], column: [c, t.column[0] - 1] }, { row: [t.row[0], t.row[1]], column: [t.column[1] + 1, u] }, { row: [t.row[1] + 1, s], column: [c, u] }] : "operatePart" == r && (n = [{ row: [t.row[0] + l, t.row[1] + l], column: [t.column[0] + i, t.column[1] + i] }]) : "allPart" == r || "restPart" == r ? n = [{ row: [o, s], column: [c, u] }] : "operatePart" == r && (n = []), n }, getcolorGradation: function (e, t, a, r, n) { var l = e.split(","), i = parseInt(l[0].split("(")[1]), o = parseInt(l[1]), s = parseInt(l[2].split(")")[0]), c = t.split(","), u = parseInt(c[0].split("(")[1]), d = parseInt(c[1]), h = parseInt(c[2].split(")")[0]); return "rgb(" + Math.round(i - (i - u) / (a - r) * (a - n)) + ", " + Math.round(o - (o - d) / (a - r) * (a - n)) + ", " + Math.round(s - (s - h) / (a - r) * (a - n)) + ")" }, getCFPartRange: function (e, t, a) { var r = [], n = ga.luckysheetfile[_l(e)].luckysheet_conditionformat_save; if (null != n && n.length > 0) e: for (var l = 0; l < n.length; l++)for (var i = n[l].cellrange, o = 0; o < i.length; o++)for (var s = i[o].row[0], c = i[o].row[1], u = i[o].column[0], d = i[o].column[1], h = 0; h < range.length; h++)if (range[h].row[0] >= s && range[h].row[0] <= c || range[h].row[1] >= s && range[h].row[1] <= c || range[h].column[0] >= u && range[h].column[0] <= d || range[h].column[1] >= u && range[h].column[1] <= d) { r.push(n[l]); continue e } return r }, checksCF: function (e, t, a) { return null != a && e + "_" + t in a ? a[e + "_" + t] : null }, getComputeMap: function (e) { var t = _l(ga.currentSheetIndex); null != e && (t = _l(e)); var a = ga.luckysheetfile[t].luckysheet_conditionformat_save, r = ga.luckysheetfile[t].data; return null == r ? null : this.compute(a, r) }, compute: function (e, t) { null == e && (e = []); var a = {}; if (e.length > 0) for (var r = 0; r < e.length; r++) { var n = e[r].type, l = e[r].cellrange, i = e[r].format; if ("dataBar" == n) { for (var o = null, s = null, c = 0; c < l.length; c++)for (var u = l[c].row[0]; u <= l[c].row[1]; u++)for (var d = l[c].column[0]; d <= l[c].column[1]; d++)if (null != t[u] && null != t[u][d]) { var h = t[u][d]; "object" == Cm(h) && null != h.ct && "n" == h.ct.t && null != h.v && ((null == o || parseInt(h.v) > o) && (o = parseInt(h.v)), (null == s || parseInt(h.v) < s) && (s = parseInt(h.v))) } if (null != o && null != s) if (s < 0) { for (var m = Math.round(o / (o - s) * 10) / 10, p = Math.round(Math.abs(s) / (o - s) * 10) / 10, f = 0; f < l.length; f++)for (var g = l[f].row[0]; g <= l[f].row[1]; g++)for (var v = l[f].column[0]; v <= l[f].column[1]; v++)if (null != t[g] && null != t[g][v]) { var y = t[g][v]; if ("object" == Cm(y) && null != y.ct && "n" == y.ct.t && null != y.v) { if (parseInt(y.v) < 0) { var b = Math.round(Math.abs(parseInt(y.v)) / Math.abs(s) * 100) / 100; g + "_" + v in a ? a[g + "_" + v].dataBar = { valueType: "minus", minusLen: p, valueLen: b, format: i } : a[g + "_" + v] = { dataBar: { valueType: "minus", minusLen: p, valueLen: b, format: i } } } if (parseInt(y.v) > 0) { var k = Math.round(parseInt(y.v) / o * 100) / 100; g + "_" + v in a ? a[g + "_" + v].dataBar = { valueType: "plus", plusLen: m, minusLen: p, valueLen: k, format: i } : a[g + "_" + v] = { dataBar: { valueType: "plus", plusLen: m, minusLen: p, valueLen: k, format: i } } } } } } else for (var x = 0; x < l.length; x++)for (var w = l[x].row[0]; w <= l[x].row[1]; w++)for (var _ = l[x].column[0]; _ <= l[x].column[1]; _++)if (null != t[w] && null != t[w][_]) { var C = t[w][_]; if ("object" == Cm(C) && null != C.ct && "n" == C.ct.t && null != C.v) { var T = void 0; T = 0 == o ? 1 : Math.round(parseInt(C.v) / o * 100) / 100, w + "_" + _ in a ? a[w + "_" + _].dataBar = { valueType: "plus", plusLen: 1, valueLen: T, format: i } : a[w + "_" + _] = { dataBar: { valueType: "plus", plusLen: 1, valueLen: T, format: i } } } } } else if ("colorGradation" == n) { for (var A = null, S = null, I = 0, R = 0, $ = 0; $ < l.length; $++)for (var q = l[$].row[0]; q <= l[$].row[1]; q++)for (var D = l[$].column[0]; D <= l[$].column[1]; D++)if (null != t[q] && null != t[q][D]) { var F = t[q][D]; "object" == Cm(F) && null != F.ct && "n" == F.ct.t && null != F.v && (R++, I += parseInt(F.v), (null == A || parseInt(F.v) > A) && (A = parseInt(F.v)), (null == S || parseInt(F.v) < S) && (S = parseInt(F.v))) } if (null != A && null != S) if (3 == i.length) { for (var E = Math.floor(I / R), M = 0; M < l.length; M++)for (var N = l[M].row[0]; N <= l[M].row[1]; N++)for (var P = l[M].column[0]; P <= l[M].column[1]; P++)if (null != t[N] && null != t[N][P]) { var z = t[N][P]; "object" == Cm(z) && null != z.ct && "n" == z.ct.t && null != z.v && (parseInt(z.v) == S ? N + "_" + P in a ? a[N + "_" + P].cellColor = i[2] : a[N + "_" + P] = { cellColor: i[2] } : parseInt(z.v) > S && parseInt(z.v) < E ? N + "_" + P in a ? a[N + "_" + P].cellColor = this.getcolorGradation(i[2], i[1], S, E, parseInt(z.v)) : a[N + "_" + P] = { cellColor: this.getcolorGradation(i[2], i[1], S, E, parseInt(z.v)) } : parseInt(z.v) == E ? N + "_" + P in a ? a[N + "_" + P].cellColor = i[1] : a[N + "_" + P] = { cellColor: i[1] } : parseInt(z.v) > E && parseInt(z.v) < A ? N + "_" + P in a ? a[N + "_" + P].cellColor = this.getcolorGradation(i[1], i[0], E, A, parseInt(z.v)) : a[N + "_" + P] = { cellColor: this.getcolorGradation(i[1], i[0], E, A, parseInt(z.v)) } : parseInt(z.v) == A && (N + "_" + P in a ? a[N + "_" + P].cellColor = i[0] : a[N + "_" + P] = { cellColor: i[0] })) } } else if (2 == i.length) for (var L = 0; L < l.length; L++)for (var O = l[L].row[0]; O <= l[L].row[1]; O++)for (var B = l[L].column[0]; B <= l[L].column[1]; B++)if (null != t[O] && null != t[O][B]) { var V = t[O][B]; "object" == Cm(V) && null != V.ct && "n" == V.ct.t && null != V.v && (parseInt(V.v) == S ? O + "_" + B in a ? a[O + "_" + B].cellColor = i[1] : a[O + "_" + B] = { cellColor: i[1] } : parseInt(V.v) > S && parseInt(V.v) < A ? O + "_" + B in a ? a[O + "_" + B].cellColor = this.getcolorGradation(i[1], i[0], S, A, parseInt(V.v)) : a[O + "_" + B] = { cellColor: this.getcolorGradation(i[1], i[0], S, A, parseInt(V.v)) } : parseInt(V.v) == A && (O + "_" + B in a ? a[O + "_" + B].cellColor = i[0] : a[O + "_" + B] = { cellColor: i[0] })) } } else if ("icons" == n) { for (var H = parseInt(i.len), U = parseInt(i.leftMin), j = parseInt(i.top), G = null, W = null, Y = 0; Y < l.length; Y++)for (var X = l[Y].row[0]; X <= l[Y].row[1]; X++)for (var K = l[Y].column[0]; K <= l[Y].column[1]; K++)if (null != t[X] && null != t[X][K]) { var Z = t[X][K]; "object" == Cm(Z) && null != Z.ct && "n" == Z.ct.t && null != Z.v && ((null == G || parseInt(Z.v) > G) && (G = parseInt(Z.v)), (null == W || parseInt(Z.v) < W) && (W = parseInt(Z.v))) } if (null != G && null != W) { var Q = Math.floor((G - W + 1) / H), J = (G - W + 1) % H; if (3 == H) { var ee = void 0, te = void 0, ae = void 0; 2 == J ? (ee = [W, W + Q], te = [W + Q + 1, W + 2 * Q], ae = [W + 2 * Q + 1, G]) : (ee = [W, W + Q - 1], te = [W + Q, W + 2 * Q - 1], ae = [W + 2 * Q, G]); for (var re = 0; re < l.length; re++)for (var ne = l[re].row[0]; ne <= l[re].row[1]; ne++)for (var le = l[re].column[0]; le <= l[re].column[1]; le++)if (null != t[ne] && null != t[ne][le]) { var ie = t[ne][le]; "object" == Cm(ie) && null != ie.ct && "n" == ie.ct.t && null != ie.v && (parseInt(ie.v) >= ee[0] && parseInt(ie.v) <= ee[1] ? ne + "_" + le in a ? a[ne + "_" + le].icons = { left: U + 2, top: j } : a[ne + "_" + le] = { icons: { left: U + 2, top: j } } : parseInt(ie.v) >= te[0] && parseInt(ie.v) <= te[1] ? ne + "_" + le in a ? a[ne + "_" + le].icons = { left: U + 1, top: j } : a[ne + "_" + le] = { icons: { left: U + 1, top: j } } : parseInt(ie.v) >= ae[0] && parseInt(ie.v) <= ae[1] && (ne + "_" + le in a ? a[ne + "_" + le].icons = { left: U, top: j } : a[ne + "_" + le] = { icons: { left: U, top: j } })) } } else if (4 == H) { var oe = void 0, se = void 0, ce = void 0, ue = void 0; 2 == J ? (oe = [W, W + Q], se = [W + Q + 1, W + 2 * Q], ce = [W + 2 * Q + 1, W + 3 * Q], ue = [W + 3 * Q + 1, G]) : 3 == J ? (oe = [W, W + Q], se = [W + Q + 1, W + 2 * Q], ce = [W + 2 * Q + 1, W + 3 * Q + 1], ue = [W + 3 * Q + 2, G]) : (oe = [W, W + Q - 1], se = [W + Q, W + 2 * Q - 1], ce = [W + 2 * Q, W + 3 * Q - 1], ue = [W + 3 * Q, G]); for (var de = 0; de < l.length; de++)for (var he = l[de].row[0]; he <= l[de].row[1]; he++)for (var me = l[de].column[0]; me <= l[de].column[1]; me++)if (null != t[he] && null != t[he][me]) { var pe = t[he][me]; "object" == Cm(pe) && null != pe.ct && "n" == pe.ct.t && null != pe.v && (parseInt(pe.v) >= oe[0] && parseInt(pe.v) <= oe[1] ? he + "_" + me in a ? a[he + "_" + me].icons = { left: U + 3, top: j } : a[he + "_" + me] = { icons: { left: U + 3, top: j } } : parseInt(pe.v) >= se[0] && parseInt(pe.v) <= se[1] ? he + "_" + me in a ? a[he + "_" + me].icons = { left: U + 2, top: j } : a[he + "_" + me] = { icons: { left: U + 2, top: j } } : parseInt(pe.v) >= ce[0] && parseInt(pe.v) <= ce[1] ? he + "_" + me in a ? a[he + "_" + me].icons = { left: U + 1, top: j } : a[he + "_" + me] = { icons: { left: U + 1, top: j } } : parseInt(pe.v) >= ue[0] && parseInt(pe.v) <= ue[1] && (he + "_" + me in a ? a[he + "_" + me].icons = { left: U, top: j } : a[he + "_" + me] = { icons: { left: U, top: j } })) } } else if (5 == H) { var fe = void 0, ge = void 0, ve = void 0, ye = void 0, be = void 0; 2 == J ? (fe = [W, W + Q], ge = [W + Q + 1, W + 2 * Q], ve = [W + 2 * Q + 1, W + 3 * Q], ye = [W + 3 * Q + 1, W + 4 * Q], be = [W + 4 * Q + 1, G]) : 3 == J ? (fe = [W, W + Q], ge = [W + Q + 1, W + 2 * Q], ve = [W + 2 * Q + 1, W + 3 * Q + 1], ye = [W + 3 * Q + 2, W + 4 * Q + 1], be = [W + 4 * Q + 2, G]) : 4 == J ? (fe = [W, W + Q], ge = [W + Q + 1, W + 2 * Q + 1], ve = [W + 2 * Q + 2, W + 3 * Q + 1], ye = [W + 3 * Q + 2, W + 4 * Q + 2], be = [W + 4 * Q + 3, G]) : (fe = [W, W + Q - 1], ge = [W + Q, W + 2 * Q - 1], ve = [W + 2 * Q, W + 3 * Q - 1], ye = [W + 3 * Q, W + 4 * Q - 1], be = [W + 4 * Q, G]); for (var ke = 0; ke < l.length; ke++)for (var xe = l[ke].row[0]; xe <= l[ke].row[1]; xe++)for (var we = l[ke].column[0]; we <= l[ke].column[1]; we++)if (null != t[xe] && null != t[xe][we]) { var _e = t[xe][we]; "object" == Cm(_e) && null != _e.ct && "n" == _e.ct.t && null != _e.v && (parseInt(_e.v) >= fe[0] && parseInt(_e.v) <= fe[1] ? xe + "_" + we in a ? a[xe + "_" + we].icons = { left: U + 4, top: j } : a[xe + "_" + we] = { icons: { left: U + 4, top: j } } : parseInt(_e.v) >= ge[0] && parseInt(_e.v) <= ge[1] ? xe + "_" + we in a ? a[xe + "_" + we].icons = { left: U + 3, top: j } : a[xe + "_" + we] = { icons: { left: U + 3, top: j } } : parseInt(_e.v) >= ve[0] && parseInt(_e.v) <= ve[1] ? xe + "_" + we in a ? a[xe + "_" + we].icons = { left: U + 2, top: j } : a[xe + "_" + we] = { icons: { left: U + 2, top: j } } : parseInt(_e.v) >= ye[0] && parseInt(_e.v) <= ye[1] ? xe + "_" + we in a ? a[xe + "_" + we].icons = { left: U + 1, top: j } : a[xe + "_" + we] = { icons: { left: U + 1, top: j } } : parseInt(_e.v) >= be[0] && parseInt(_e.v) <= be[1] && (xe + "_" + we in a ? a[xe + "_" + we].icons = { left: U, top: j } : a[xe + "_" + we] = { icons: { left: U, top: j } })) } } } } else for (var Ce = e[r].conditionName, Te = e[r].conditionValue[0], Ae = e[r].conditionValue[1], Se = i.textColor, Ie = i.cellColor, Re = 0; Re < l.length; Re++)if ("greaterThan" == Ce || "lessThan" == Ce || "equal" == Ce || "textContains" == Ce) { for (var $e = l[Re].row[0]; $e <= l[Re].row[1]; $e++)for (var qe = l[Re].column[0]; qe <= l[Re].column[1]; qe++)if (null != t[$e] && null != t[$e][qe]) { var De = t[$e][qe]; "object" != Cm(De) || ya(De.v) || ("greaterThan" == Ce && De.v > Te || "lessThan" == Ce && De.v < Te || "equal" == Ce && De.v == Te || "textContains" == Ce && -1 != De.v.toString().indexOf(Te)) && ($e + "_" + qe in a ? (a[$e + "_" + qe].textColor = Se, a[$e + "_" + qe].cellColor = Ie) : a[$e + "_" + qe] = { textColor: Se, cellColor: Ie }) } } else if ("betweenness" == Ce) { var Fe = void 0, Ee = void 0; Te > Ae ? (Fe = Te, Ee = Ae) : (Fe = Ae, Ee = Te); for (var Me = l[Re].row[0]; Me <= l[Re].row[1]; Me++)for (var Ne = l[Re].column[0]; Ne <= l[Re].column[1]; Ne++)if (null != t[Me] && null != t[Me][Ne]) { var Pe = t[Me][Ne]; "object" != Cm(Pe) || ya(Pe.v) || Pe.v >= Ee && Pe.v <= Fe && (Me + "_" + Ne in a ? (a[Me + "_" + Ne].textColor = Se, a[Me + "_" + Ne].cellColor = Ie) : a[Me + "_" + Ne] = { textColor: Se, cellColor: Ie }) } } else if ("occurrenceDate" == Ce) { var ze = void 0, Le = void 0; if (-1 == Te.toString().indexOf("-")) ze = xs(Te)[2], Le = xs(Te)[2]; else { var Oe = Te.toString().split("-"); ze = xs(Oe[1].trim())[2], Le = xs(Oe[0].trim())[2] } for (var Be = l[Re].row[0]; Be <= l[Re].row[1]; Be++)for (var Ve = l[Re].column[0]; Ve <= l[Re].column[1]; Ve++)if (null != t[Be] && null != t[Be][Ve] && null != t[Be][Ve].ct && "d" == t[Be][Ve].ct.t) { var He = Ko(Be, Ve, t); He >= Le && He <= ze && (Be + "_" + Ve in a ? (a[Be + "_" + Ve].textColor = Se, a[Be + "_" + Ve].cellColor = Ie) : a[Be + "_" + Ve] = { textColor: Se, cellColor: Ie }) } } else if ("duplicateValue" == Ce) { for (var Ue = {}, je = l[Re].row[0]; je <= l[Re].row[1]; je++)for (var Ge = l[Re].column[0]; Ge <= l[Re].column[1]; Ge++) { var We = Ko(je, Ge, t); We in Ue || (Ue[We] = []), Ue[We].push({ r: je, c: Ge }) } if ("0" == Te) for (var Ye in Ue) if ("null" != Ye && "undefined" != Ye && Ue[Ye].length > 1) for (var Xe = 0; Xe < Ue[Ye].length; Xe++)Ue[Ye][Xe].r + "_" + Ue[Ye][Xe].c in a ? (a[Ue[Ye][Xe].r + "_" + Ue[Ye][Xe].c].textColor = Se, a[Ue[Ye][Xe].r + "_" + Ue[Ye][Xe].c].cellColor = Ie) : a[Ue[Ye][Xe].r + "_" + Ue[Ye][Xe].c] = { textColor: Se, cellColor: Ie }; if ("1" == Te) for (var Ke in Ue) "null" != Ke && "undefined" != Ke && 1 == Ue[Ke].length && (Ue[Ke][0].r + "_" + Ue[Ke][0].c in a ? (a[Ue[Ke][0].r + "_" + Ue[Ke][0].c].textColor = Se, a[Ue[Ke][0].r + "_" + Ue[Ke][0].c].cellColor = Ie) : a[Ue[Ke][0].r + "_" + Ue[Ke][0].c] = { textColor: Se, cellColor: Ie }) } else if ("top10" == Ce || "top10%" == Ce || "last10" == Ce || "last10%" == Ce || "AboveAverage" == Ce || "SubAverage" == Ce) { for (var Ze = [], Qe = l[Re].row[0]; Qe <= l[Re].row[1]; Qe++)for (var Je = l[Re].column[0]; Je <= l[Re].column[1]; Je++)null != t[Qe] && null != t[Qe][Je] && null != t[Qe][Je].ct && "n" == t[Qe][Je].ct.t && Ze.push(Ko(Qe, Je, t)); if ("top10" == Ce || "top10%" == Ce || "last10" == Ce || "last10%" == Ce) { for (var et = 0; et < Ze.length; et++)for (var tt = 0; tt < Ze.length - 1 - et; tt++)if (Ze[tt] < Ze[tt + 1]) { var at = Ze[tt]; Ze[tt] = Ze[tt + 1], Ze[tt + 1] = at } var rt = void 0; "top10" == Ce ? rt = Ze.slice(0, Te) : "top10%" == Ce ? rt = Ze.slice(0, Math.floor(Te * Ze.length / 100)) : "last10" == Ce ? rt = Ze.slice(Ze.length - Te, Ze.length) : "last10%" == Ce && (rt = Ze.slice(Ze.length - Math.floor(Te * Ze.length / 100), Ze.length)); for (var nt = l[Re].row[0]; nt <= l[Re].row[1]; nt++)for (var lt = l[Re].column[0]; lt <= l[Re].column[1]; lt++)if (null != t[nt] && null != t[nt][lt]) { var it = Ko(nt, lt, t); -1 != rt.indexOf(it) && (nt + "_" + lt in a ? (a[nt + "_" + lt].textColor = Se, a[nt + "_" + lt].cellColor = Ie) : a[nt + "_" + lt] = { textColor: Se, cellColor: Ie }) } } else if ("AboveAverage" == Ce || "SubAverage" == Ce) { for (var ot = 0, st = 0; st < Ze.length; st++)ot += Ze[st]; var ct = ot / Ze.length; if ("AboveAverage" == Ce) for (var ut = l[Re].row[0]; ut <= l[Re].row[1]; ut++)for (var dt = l[Re].column[0]; dt <= l[Re].column[1]; dt++) { if (null != t[ut] && null != t[ut][dt]) Ko(ut, dt, t) > ct && (ut + "_" + dt in a ? (a[ut + "_" + dt].textColor = Se, a[ut + "_" + dt].cellColor = Ie) : a[ut + "_" + dt] = { textColor: Se, cellColor: Ie }) } else if ("SubAverage" == Ce) for (var ht = l[Re].row[0]; ht <= l[Re].row[1]; ht++)for (var mt = l[Re].column[0]; mt <= l[Re].column[1]; mt++) { if (null != t[ht] && null != t[ht][mt]) Ko(ht, mt, t) < ct && (ht + "_" + mt in a ? (a[ht + "_" + mt].textColor = Se, a[ht + "_" + mt].cellColor = Ie) : a[ht + "_" + mt] = { textColor: Se, cellColor: Ie }) } } } else if ("formula" == Ce) { var pt = l[Re].row[0], ft = l[Re].row[1], gt = l[Re].column[0], vt = l[Re].column[1], yt = Te; "=" != Te.toString().slice(0, 1) && (yt = "=" + Te); for (var bt = pt; bt <= ft; bt++)for (var kt = gt; kt <= vt; kt++) { var xt = yt, wt = bt - pt, _t = kt - gt; wt > 0 && (xt = "=" + Ih.functionCopy(xt, "down", wt)), _t > 0 && (xt = "=" + Ih.functionCopy(xt, "right", _t)); var Ct = Ih.execfunction(xt)[1]; "boolean" != typeof Ct && (Ct = !!Number(Ct)), Ct && (bt + "_" + kt in a ? (a[bt + "_" + kt].textColor = Se, a[bt + "_" + kt].cellColor = Ie) : a[bt + "_" + kt] = { textColor: Se, cellColor: Ie }) } } } return a }, updateItem: function (e, t, a) { if (yu(ga.currentSheetIndex)) { var r, n = _l(ga.currentSheetIndex), l = $.extend(!0, [], ga.luckysheetfile), i = this.getHistoryRules(l); if ("delSheet" == e) r = []; else { var o = { type: e, cellrange: t, format: a }; (r = null == ga.luckysheetfile[n].luckysheet_conditionformat_save ? [] : ga.luckysheetfile[n].luckysheet_conditionformat_save).push(o) } ga.luckysheetfile[n].luckysheet_conditionformat_save = r; var s = $.extend(!0, [], ga.luckysheetfile), c = this.getCurrentRules(s); this.ref(i, c), pd.allowUpdate && pd.saveParam("all", ga.currentSheetIndex, r, { k: "luckysheet_conditionformat_save" }) } }, getHistoryRules: function (e) { for (var t = [], a = 0; a < e.length; a++)t.push({ sheetIndex: e[a].index, luckysheet_conditionformat_save: e[a].luckysheet_conditionformat_save }); return t }, getCurrentRules: function (e) { for (var t = [], a = 0; a < e.length; a++)t.push({ sheetIndex: e[a].index, luckysheet_conditionformat_save: e[a].luckysheet_conditionformat_save }); return t }, ref: function (e, t) { if (ga.clearjfundo) { ga.jfundo.length = 0; var a = { type: "updateCF" }; a.data = { historyRules: e, currentRules: t }, ga.jfredo.push(a) } setTimeout((function () { md() }), 1) } }, vd = { clearcopy: function (e) { var t = window.clipboardData; t || e && (t = e.originalEvent.clipboardData); if (ga.luckysheet_selection_range = [], Eh(), t) return t.setData("Text", " "), !1; var a = $("#luckysheet-copy-content").css("visibility", "hidden"); a.val(" "), a.focus(), a.select(), setTimeout((function () { a.blur().css("visibility", "visible") }), 10) }, getHtmlBorderStyle: function (e, t) { var a = ""; return (e = { 0: "none", 1: "Thin", 2: "Hair", 3: "Dotted", 4: "Dashed", 5: "DashDot", 6: "DashDotDot", 7: "Double", 8: "Medium", 9: "MediumDashed", 10: "MediumDashDot", 11: "MediumDashDotDot", 12: "SlantedDashDot", 13: "Thick" }[e.toString()]).indexOf("Medium") > -1 ? a += "1pt " : a += "Thick" == e ? "1.5pt " : "0.5pt ", "Hair" == e ? a += "double " : e.indexOf("DashDotDot") > -1 ? a += "dotted " : e.indexOf("DashDot") > -1 ? a += "dashed " : e.indexOf("Dotted") > -1 ? a += "dotted " : e.indexOf("Dashed") > -1 ? a += "dashed " : a += "solid ", a + t + ";" }, copy: function (e) { var t = window.clipboardData; t || (t = e.originalEvent.clipboardData), ga.luckysheet_selection_range = []; for (var a = [], r = [], n = [], l = !1, i = !1, o = 0; o < ga.luckysheet_select_save.length; o++) { for (var s = ga.luckysheet_select_save[o], c = s.row[0], u = s.row[1], d = s.column[0], h = s.column[1], m = c; m <= u; m++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[m]) { a.includes(m) || a.push(m), null != ga.config.rowlen && m in ga.config.rowlen && (l = !0); for (var p = d; p <= h; p++)if (null == ga.config.colhidden || null == ga.config.colhidden[p]) { r.includes(p) || r.push(p); var f = ga.flowdata[m][p]; "object" == Cm(f) && "mc" in f && null != f.mc.rs && (i = !0) } } ga.luckysheet_selection_range.push({ row: s.row, column: s.column }), n.push({ row: s.row, column: s.column }) } Eh(), ga.luckysheet_copy_save = { dataSheetIndex: ga.currentSheetIndex, copyRange: n, RowlChange: l, HasMC: i }; var g; ga.config.borderInfo && ga.config.borderInfo.length > 0 && (g = Lc()); for (var v = "", y = rs.deepCopyFlowData(ga.flowdata), b = "", k = 0; k < a.length; k++) { var x = a[k]; if (null == ga.config.rowhidden || null == ga.config.rowhidden[x]) { v += ""; for (var w = 0; w < r.length; w++) { var _ = r[w]; if (null == ga.config.colhidden || null == ga.config.colhidden[_]) { var C = ''; if (null != y[x] && null != y[x][_]) { var T = "", A = ""; x == a[0] && (null == ga.config || null == ga.config.columnlen || null == ga.config.columnlen[_.toString()] ? b += '' : b += ''), _ == r[0] && (null == ga.config || null == ga.config.rowlen || null == ga.config.rowlen[x.toString()] ? T += "height:19px;" : T += "height:" + ga.config.rowlen[x.toString()] + "px;"); var S = void 0; if (S = null != y[x][_].ct && null != y[x][_].ct.fa && y[x][_].ct.fa.match(/^(w|W)((0?)|(0\.0+))$/) ? Ko(x, _, y) : Ko(x, _, y, "m"), T += xm.getStyleByCell(y, x, _), "object" == Cm(y[x][_]) && "mc" in y[x][_]) { if (!("rs" in y[x][_].mc)) continue; if (A = 'rowspan="' + y[x][_].mc.rs + '" colspan="' + y[x][_].mc.cs + '"', g && g[x + "_" + _]) { for (var I = { color: {}, style: {} }, R = { color: {}, style: {} }, $ = { color: {}, style: {} }, q = { color: {}, style: {} }, D = x; D < x + y[x][_].mc.rs; D++)for (var F = _; F < _ + y[x][_].mc.cs; F++) { if (D == x && g[D + "_" + F] && g[D + "_" + F].t) { var E = g[D + "_" + F].t.style, M = g[D + "_" + F].t.color; null == $.style[E] ? $.style[E] = 1 : $.style[E] = $.style[E] + 1, null == $.color[M] ? $.color[M] = 1 : $.color[M] = $.color[M] + 1 } if (D == x + y[x][_].mc.rs - 1 && g[D + "_" + F] && g[D + "_" + F].b) { var N = g[D + "_" + F].b.style, P = g[D + "_" + F].b.color; null == q.style[N] ? q.style[N] = 1 : q.style[N] = q.style[N] + 1, null == q.color[P] ? q.color[P] = 1 : q.color[P] = q.color[P] + 1 } if (F == _ && g[D + "_" + F] && g[D + "_" + F].l) { var z = g[x + "_" + _].l.style, L = g[D + "_" + F].l.color; null == I.style[z] ? I.style[z] = 1 : I.style[z] = I.style[z] + 1, null == I.color[L] ? I.color[L] = 1 : I.color[L] = I.color[L] + 1 } if (F == _ + y[x][_].mc.cs - 1 && g[D + "_" + F] && g[D + "_" + F].r) { var O = g[D + "_" + F].r.style, B = g[D + "_" + F].r.color; null == R.style[O] ? R.style[O] = 1 : R.style[O] = R.style[O] + 1, null == R.color[B] ? R.color[B] = 1 : R.color[B] = R.color[B] + 1 } } var V = y[x][_].mc.rs, H = y[x][_].mc.cs; if (JSON.stringify(I).length > 23) { var U = null, j = null; for (var G in I.color) I.color[G] >= V / 2 && (U = G); for (var W in I.style) I.style[W] >= V / 2 && (j = W); null != U && null != j && (T += "border-left:" + this.getHtmlBorderStyle(j, U)) } if (JSON.stringify(R).length > 23) { var Y = null, X = null; for (var K in R.color) R.color[K] >= V / 2 && (Y = K); for (var Z in R.style) R.style[Z] >= V / 2 && (X = Z); null != Y && null != X && (T += "border-right:" + this.getHtmlBorderStyle(X, Y)) } if (JSON.stringify($).length > 23) { var Q = null, J = null; for (var ee in $.color) $.color[ee] >= H / 2 && (Q = ee); for (var te in $.style) $.style[te] >= H / 2 && (J = te); null != Q && null != J && (T += "border-top:" + this.getHtmlBorderStyle(J, Q)) } if (JSON.stringify(q).length > 23) { var ae = null, re = null; for (var ne in q.color) q.color[ne] >= H / 2 && (ae = ne); for (var le in q.style) q.style[le] >= H / 2 && (re = le); null != ae && null != re && (T += "border-bottom:" + this.getHtmlBorderStyle(re, ae)) } } } else if (g && g[x + "_" + _]) { if (g[x + "_" + _].l) { var ie = g[x + "_" + _].l.style, oe = g[x + "_" + _].l.color; T += "border-left:" + this.getHtmlBorderStyle(ie, oe) } if (g[x + "_" + _].r) { var se = g[x + "_" + _].r.style, ce = g[x + "_" + _].r.color; T += "border-right:" + this.getHtmlBorderStyle(se, ce) } if (g[x + "_" + _].b) { var ue = g[x + "_" + _].b.style, de = g[x + "_" + _].b.color; T += "border-bottom:" + this.getHtmlBorderStyle(ue, de) } if (g[x + "_" + _].t) { var he = g[x + "_" + _].t.style, me = g[x + "_" + _].t.color; T += "border-top:" + this.getHtmlBorderStyle(he, me) } } C = _m(C, { style: T, span: A }), null == S && (S = Ko(x, _, y)), null == S && (S = ""), C += S } else { var pe = ""; if (g && g[x + "_" + _]) { if (g[x + "_" + _].l) { var fe = g[x + "_" + _].l.style, ge = g[x + "_" + _].l.color; pe += "border-left:" + this.getHtmlBorderStyle(fe, ge) } if (g[x + "_" + _].r) { var ve = g[x + "_" + _].r.style, ye = g[x + "_" + _].r.color; pe += "border-right:" + this.getHtmlBorderStyle(ve, ye) } if (g[x + "_" + _].b) { var be = g[x + "_" + _].b.style, ke = g[x + "_" + _].b.color; pe += "border-bottom:" + this.getHtmlBorderStyle(be, ke) } if (g[x + "_" + _].t) { var xe = g[x + "_" + _].t.style, we = g[x + "_" + _].t.color; pe += "border-top:" + this.getHtmlBorderStyle(xe, we) } } C += "", x == a[0] && (null == ga.config || null == ga.config.columnlen || null == ga.config.columnlen[_.toString()] ? b += '' : b += ''), _ == r[0] && (null == ga.config || null == ga.config.rowlen || null == ga.config.rowlen[x.toString()] ? pe += "height:19px;" : pe += "height:" + ga.config.rowlen[x.toString()] + "px;"), C = _m(C, { style: pe, span: "" }), C += "" } v += C += "" } } v += "" } } if (v = '' + b + v + "
      ", ga.iscopyself = !0, t) return t.setData("Text", v), !1; var _e = document.createElement("input"); _e.setAttribute("readonly", "readonly"), _e.value = v, document.body.appendChild(_e), _e.select(), document.execCommand("Copy"), _e.style.display = "none", document.body.removeChild(_e) }, copybyformat: function (e, t) { var a = window.clipboardData; a || (a = e.originalEvent && e.originalEvent.clipboardData), ga.luckysheet_selection_range = [{ row: ga.luckysheet_select_save[0].row, column: ga.luckysheet_select_save[0].column }], Eh(); var r = t; if (ga.iscopyself = !0, a) return a.setData("Text", r), !1; var n = $("#luckysheet-copy-content"); n.text(r), n.focus(), n.select(), document.execCommand("selectAll"), document.execCommand("Copy"), setTimeout((function () { n.blur() }), 10) }, isPasteAction: !1, paste: function (e, t) { var a = this; if (!1 !== ga.allowEdit) { var r = gn().drag, n = $("#luckysheet-copy-content"); n.focus(), n.select(), setTimeout((function () { var l = n.html(); l.indexOf("luckysheet_copy_action_table") > -1 && null != ga.luckysheet_copy_save.copyRange && ga.luckysheet_copy_save.copyRange.length > 0 ? ga.luckysheet_paste_iscut ? (ga.luckysheet_paste_iscut = !1, a.pasteHandlerOfCutPaste(ga.luckysheet_copy_save), a.clearcopy(e)) : a.pasteHandlerOfCopyPaste(ga.luckysheet_copy_save) : "btn" != t ? a.pasteHandler(l) : wa() ? alert(r.pasteMustKeybordAlert) : fd.info(r.pasteMustKeybordAlertHTMLTitle, r.pasteMustKeybordAlertHTML) }), 10) } }, pasteHandler: function (e, t) { if (fu(ga.luckysheet_select_save, ga.currentSheetIndex) && !1 !== ga.allowEdit) if (ga.luckysheet_select_save.length > 1 && (wa() ? alert("不能对多重选择区域执行此操作,请选择单个区域,然后再试") : fd.info('提示', "不能对多重选择区域执行此操作,请选择单个区域,然后再试")), "object" == Sa(e)) { if (0 == e.length) return; var a = $.extend(!0, {}, ga.config); null == a.merge && (a.merge = {}), JSON.stringify(t).length > 2 && null == a.borderInfo && (a.borderInfo = []); var r = e.length, n = e[0].length, l = ga.luckysheet_select_save[0].row[0], i = l + r - 1, o = ga.luckysheet_select_save[0].column[0], s = o + n - 1, c = !1; if (null != a.merge && (c = _a(a, l, i, o, s)), c) return void (wa() ? alert("不能对合并单元格做部分更改") : fd.info('提示', "不能对合并单元格做部分更改")); var u = rs.deepCopyFlowData(ga.flowdata), d = i - u.length + 1, h = s - u[0].length + 1; (d > 0 || h > 0) && (u = Zo([].concat(u), d, h, !0)), null == a.rowlen && (a.rowlen = {}); for (var m = !1, p = {}, f = l; f <= i; f++) { var g = [].concat(u[f]), v = ga.defaultrowlen; null != a.rowlen[f] && (v = a.rowlen[f]); for (var y = o; y <= s; y++) { "object" == Cm(g[y]) && "mc" in g[y] && ("rs" in g[y].mc && delete a.merge[g[y].mc.r + "_" + g[y].mc.c], delete g[y].mc); var b = null; if (null != e[f - l] && null != e[f - l][y - o] && (b = e[f - l][y - o]), g[y] = $.extend(!0, {}, b), null != b && "mc" in g[y] && (null != g[y].mc.rs ? (g[y].mc.r = f, g[y].mc.c = y, a.merge[g[y].mc.r + "_" + g[y].mc.c] = g[y].mc, p[b.mc.r + "_" + b.mc.c] = [g[y].mc.r, g[y].mc.c]) : g[y] = { mc: { r: p[b.mc.r + "_" + b.mc.c][0], c: p[b.mc.r + "_" + b.mc.c][1] } }), t[f - l + "_" + (y - o)]) { var k = { rangeType: "cell", value: { row_index: f, col_index: y, l: t[f - l + "_" + (y - o)].l, r: t[f - l + "_" + (y - o)].r, t: t[f - l + "_" + (y - o)].t, b: t[f - l + "_" + (y - o)].b } }; a.borderInfo.push(k) } var x = qm(g[y]), w = xm.getTextSize("田", x)[1]; w > v && (v = w, m = !0) } u[f] = g, v != ga.defaultrowlen && (a.rowlen[f] = v) } if (ga.luckysheet_select_save = [{ row: [l, i], column: [o, s] }], d > 0 || h > 0 || m) { var _ = { cfg: a, RowlChange: !0 }; id(u, ga.luckysheet_select_save, _) } else { var C = { cfg: a }; id(u, ga.luckysheet_select_save, C), Rh() } } else { for (var T = [], A = (e = e.replace(/\r/g, "")).split("\n"), S = A[0].split("\t").length, I = 0; I < A.length; I++)A[I].split("\t").length < S || T.push(A[I].split("\t")); var R = rs.deepCopyFlowData(ga.flowdata), q = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], D = null == q.row ? 0 : q.row[0], F = null == q.column ? 0 : q.column[0], E = T.length, M = T[0].length, N = !1; if (null != ga.config.merge && (N = _a(ga.config, D, D + E - 1, F, F + M - 1)), N) return void (wa() ? alert("不能对合并单元格做部分更改") : fd.info('提示', "不能对合并单元格做部分更改")); var P = D + E - R.length, z = F + M - R[0].length; (P > 0 || z > 0) && (R = Zo([].concat(R), P, z, !0)); for (var L = 0; L < E; L++) { for (var O = [].concat(R[L + D]), B = 0; B < M; B++) { var V = O[B + F], H = T[L][B]; if (ba(H) && (H = V && V.ct && "@" === V.ct.fa ? String(H) : parseFloat(H)), V instanceof Object) V.v = H, null != V.ct && null != V.ct.fa ? V.m = ws(V.ct.fa, H) : V.m = H, null != V.f && V.f.length > 0 && (V.f = "", Ih.delFunctionGroup(L + D, B + F, ga.currentSheetIndex)); else { var U = {}, j = xs(H); U.v = j[2], U.ct = j[1], U.m = j[0], O[B + F] = U } } R[L + D] = O } if (q.row = [D, D + E - 1], q.column = [F, F + M - 1], P > 0 || z > 0) { id(R, ga.luckysheet_select_save, { RowlChange: !0 }) } else id(R, ga.luckysheet_select_save), Rh() } }, pasteHandlerOfCutPaste: function (e) { if (fu(ga.luckysheet_select_save, ga.currentSheetIndex) && !1 !== ga.allowEdit) { var t = $.extend(!0, {}, ga.config); null == t.merge && (t.merge = {}); var a = e.HasMC, r = e.RowlChange, n = e.dataSheetIndex, l = e.copyRange[0].row[0], i = e.copyRange[0].row[1], o = e.copyRange[0].column[0], s = e.copyRange[0].column[1], c = $.extend(!0, [], Wo({ row: [l, i], column: [o, s] }, n)), u = c.length, d = c[0].length, h = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], m = h.row_focus, p = m + u - 1, f = h.column_focus, g = f + d - 1, v = !1; if (null != t.merge && (v = _a(t, m, p, f, g)), v) wa() ? alert("不能对合并单元格做部分更改") : fd.info('提示', "不能对合并单元格做部分更改"); else { var y = rs.deepCopyFlowData(ga.flowdata), b = u + m - y.length, k = d + f - y[0].length; (b > 0 || k > 0) && (y = Zo([].concat(y), b, k, !0)); var x = Lc(n), w = $.extend(!0, {}, ga.luckysheetfile[_l(n)].dataVerification), _ = $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification); if (ga.currentSheetIndex == n) { for (var C = l; C <= i; C++)for (var T = o; T <= s; T++) { var A = y[C][T]; "object" == Cm(A) && "mc" in A && ("rs" in A.mc && delete t.merge[A.mc.r + "_" + A.mc.c], delete A.mc), y[C][T] = null, delete _[C + "_" + T] } if (t.borderInfo && t.borderInfo.length > 0) { for (var S = [], I = 0; I < t.borderInfo.length; I++) { var R = t.borderInfo[I].rangeType; if ("range" == R) { for (var q = t.borderInfo[I].range, D = [], F = 0; F < q.length; F++)D = D.concat(gd.CFSplitRange(q[F], { row: [l, i], column: [o, s] }, { row: [m, p], column: [f, g] }, "restPart")); t.borderInfo[I].range = D, S.push(t.borderInfo[I]) } else if ("cell" == R) { var E = t.borderInfo[I].value.row_index, M = t.borderInfo[I].value.col_index; E >= l && E <= i && M >= o && M <= s || S.push(t.borderInfo[I]) } } t.borderInfo = S } } for (var N, P, z = {}, L = m; L <= p; L++) { for (var O = [].concat(y[L]), B = f; B <= g; B++) { if (x[l + L - m + "_" + (o + B - f)]) { var V = { rangeType: "cell", value: { row_index: L, col_index: B, l: x[l + L - m + "_" + (o + B - f)].l, r: x[l + L - m + "_" + (o + B - f)].r, t: x[l + L - m + "_" + (o + B - f)].t, b: x[l + L - m + "_" + (o + B - f)].b } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(V) } else if (x[L + "_" + B]) { var H = { rangeType: "cell", value: { row_index: L, col_index: B, l: null, r: null, t: null, b: null } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(H) } w[l + L - m + "_" + (o + B - f)] && (_[L + "_" + B] = w[l + L - m + "_" + (o + B - f)]), "object" == Cm(O[B]) && "mc" in O[B] && ("rs" in O[B].mc && delete t.merge[O[B].mc.r + "_" + O[B].mc.c], delete O[B].mc); var U = null; null != c[L - m] && null != c[L - m][B - f] && (U = c[L - m][B - f]), O[B] = $.extend(!0, {}, U), null != U && a && "mc" in O[B] && (null != O[B].mc.rs ? (O[B].mc.r = L, O[B].mc.c = B, t.merge[O[B].mc.r + "_" + O[B].mc.c] = O[B].mc, z[U.mc.r + "_" + U.mc.c] = [O[B].mc.r, O[B].mc.c]) : O[B] = { mc: { r: z[U.mc.r + "_" + U.mc.c][0], c: z[U.mc.r + "_" + U.mc.c][1] } }) } y[L] = O } if (h.row = [m, p], h.column = [f, g], r && (ga.currentSheetIndex != n || (t = qs(y, l, i, t)), t = qs(y, m, p, t)), ga.currentSheetIndex != n) { var j = $.extend(!0, [], ga.luckysheetfile[_l(n)].data), G = $.extend(!0, {}, ga.luckysheetfile[_l(n)].config), W = $.extend(!0, [], j), Y = $.extend(!0, {}, G); null == Y.merge && (Y.merge = {}); for (var X = l; X <= i; X++)for (var K = o; K <= s; K++) { var Z = W[X][K]; "object" == Cm(Z) && "mc" in Z && ("rs" in Z.mc && delete Y.merge[Z.mc.r + "_" + Z.mc.c], delete Z.mc), W[X][K] = null } if (r && (Y = qs(W, l, i, Y)), Y.borderInfo && Y.borderInfo.length > 0) { for (var Q = [], J = 0; J < Y.borderInfo.length; J++) { var ee = Y.borderInfo[J].rangeType; if ("range" == ee) { for (var te = Y.borderInfo[J].range, ae = [], re = 0; re < te.length; re++)ae = ae.concat(gd.CFSplitRange(te[re], { row: [l, i], column: [o, s] }, { row: [m, p], column: [f, g] }, "restPart")); Y.borderInfo[J].range = ae, Q.push(Y.borderInfo[J]) } else if ("cell" == ee) { var ne = Y.borderInfo[J].value.row_index, le = Y.borderInfo[J].value.col_index; ne >= l && ne <= i && le >= o && le <= s || Q.push(Y.borderInfo[J]) } } Y.borderInfo = Q } var ie = $.extend(!0, [], ga.luckysheetfile[_l(n)].luckysheet_conditionformat_save), oe = $.extend(!0, [], ie), se = []; if (null != oe && oe.length > 0) for (var ce = 0; ce < oe.length; ce++) { for (var ue = oe[ce].cellrange, de = [], he = [], me = 0; me < ue.length; me++) { var pe = gd.CFSplitRange(ue[me], { row: [l, i], column: [o, s] }, { row: [m, p], column: [f, g] }, "restPart"); de = de.concat(pe); var fe = gd.CFSplitRange(ue[me], { row: [l, i], column: [o, s] }, { row: [m, p], column: [f, g] }, "operatePart"); fe.length > 0 && (he = he.concat(fe)) } if (oe[ce].cellrange = de, he.length > 0) { var ge = $.extend(!0, {}, oe[ce]); ge.cellrange = he, se.push(ge) } } var ve = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save), ye = $.extend(!0, [], ve); se.length > 0 && (ye = ye.concat(se)); for (var be = l; be <= i; be++)for (var ke = o; ke <= s; ke++)delete w[be + "_" + ke]; N = { sheetIndex: n, data: j, curData: W, config: G, curConfig: Y, cdformat: ie, curCdformat: oe, dataVerification: $.extend(!0, {}, ga.luckysheetfile[_l(n)].dataVerification), curDataVerification: w, range: { row: [l, i], column: [o, s] } }, P = { sheetIndex: ga.currentSheetIndex, data: ga.flowdata, curData: y, config: $.extend(!0, {}, ga.config), curConfig: t, cdformat: ve, curCdformat: ye, dataVerification: $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification), curDataVerification: _, range: { row: [m, p], column: [f, g] } } } else { var xe = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save), we = $.extend(!0, [], xe); if (null != we && we.length > 0) for (var _e = 0; _e < we.length; _e++) { for (var Ce = we[_e].cellrange, Te = [], Ae = 0; Ae < Ce.length; Ae++) { var Se = gd.CFSplitRange(Ce[Ae], { row: [l, i], column: [o, s] }, { row: [m, p], column: [f, g] }, "allPart"); Te = Te.concat(Se) } we[_e].cellrange = Te } N = { sheetIndex: ga.currentSheetIndex, data: ga.flowdata, curData: y, config: $.extend(!0, {}, ga.config), curConfig: t, cdformat: xe, curCdformat: we, dataVerification: $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification), curDataVerification: _, range: { row: [l, i], column: [o, s] } }, P = { sheetIndex: ga.currentSheetIndex, data: ga.flowdata, curData: y, config: $.extend(!0, {}, ga.config), curConfig: t, cdformat: xe, curCdformat: we, dataVerification: $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification), curDataVerification: _, range: { row: [m, p], column: [f, g] } } } dd(N, P, b > 0 || k > 0 || r) } } }, pasteHandlerOfCopyPaste: function (e) { if (fu(ga.luckysheet_select_save, ga.currentSheetIndex)) { var t = $.extend(!0, {}, ga.config); null == t.merge && (t.merge = {}); for (var a = e.HasMC, r = e.RowlChange, n = e.dataSheetIndex, l = e.copyRange[0].row[0], i = e.copyRange[0].row[1], o = e.copyRange[0].column[0], s = e.copyRange[0].column[1], c = [], u = !1, d = function (t) { var a = Wo({ row: e.copyRange[t].row, column: e.copyRange[t].column }, n); e.copyRange.length > 1 ? l == e.copyRange[1].row[0] && i == e.copyRange[1].row[1] ? (a = a[0].map((function (e, t) { return a.map((function (e) { return e[t] })) })), c = c.concat(a), u = !0) : o == e.copyRange[1].column[0] && s == e.copyRange[1].column[1] && (c = c.concat(a)) : c = a }, h = 0; h < e.copyRange.length; h++)d(h); u && (c = c[0].map((function (e, t) { return c.map((function (e) { return e[t] })) }))); var m = $.extend(!0, [], c); if (e.copyRange.length > 1) for (var p = 0; p < m.length; p++)for (var f = 0; f < m[p].length; f++)null != m[p][f] && null != m[p][f].f && (delete m[p][f].f, delete m[p][f].spl); var g = m.length, v = m[0].length, y = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], b = y.row[0], k = y.row[1], x = y.column[0], w = y.column[1]; 0 == (k - b + 1) % g && 0 == (w - x + 1) % v || (k = b + g - 1, w = x + v - 1); var _ = !1; if (null != t.merge && (_ = _a(t, b, k, x, w)), _) wa() ? alert("不能对合并单元格做部分更改") : fd.info('提示', "不能对合并单元格做部分更改"); else { var C = (k - b + 1) / g, T = (w - x + 1) / v, A = rs.deepCopyFlowData(ga.flowdata), S = g + b - A.length, I = v + x - A[0].length; (S > 0 || I > 0) && (A = Zo([].concat(A), S, I, !0)); for (var R = Lc(n), q = $.extend(!0, {}, ga.luckysheetfile[_l(n)].dataVerification), D = null, F = 0, E = 0, M = 0, N = 0, P = 1; P <= C; P++)for (var z = 1; z <= T; z++) { N = b + P * g, M = x + z * v; for (var L = (F = b + (P - 1) * g) - l, O = (E = x + (z - 1) * v) - o, B = {}, V = F; V < N; V++) { for (var H = [].concat(A[V]), U = E; U < M; U++) { if (R[l + V - F + "_" + (o + U - E)]) { var j = { rangeType: "cell", value: { row_index: V, col_index: U, l: R[l + V - F + "_" + (o + U - E)].l, r: R[l + V - F + "_" + (o + U - E)].r, t: R[l + V - F + "_" + (o + U - E)].t, b: R[l + V - F + "_" + (o + U - E)].b } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(j) } else if (R[V + "_" + U]) { var G = { rangeType: "cell", value: { row_index: V, col_index: U, l: null, r: null, t: null, b: null } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(G) } q[l + V - F + "_" + (o + U - E)] && (null == D && (D = $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification)), D[V + "_" + U] = q[l + V - F + "_" + (o + U - E)]), "object" == Cm(H[U]) && "mc" in H[U] && ("rs" in H[U].mc && delete t.merge[H[U].mc.r + "_" + H[U].mc.c], delete H[U].mc); var W = null; if (null != m[V - F] && null != m[V - F][U - E] && (W = $.extend(!0, {}, m[V - F][U - E])), null != W && null != W.f) { var Y = W.f; L > 0 && (Y = "=" + Ih.functionCopy(Y, "down", L)), L < 0 && (Y = "=" + Ih.functionCopy(Y, "up", Math.abs(L))), O > 0 && (Y = "=" + Ih.functionCopy(Y, "right", O)), O < 0 && (Y = "=" + Ih.functionCopy(Y, "left", Math.abs(O))); var X = Ih.execfunction(Y, V, U, void 0, !0); null != W.spl ? (W.f = X[2], W.v = X[1], W.spl = X[3].data) : (W.f = X[2], W.v = X[1], null != W.ct && null != W.ct.fa && (W.m = ws(W.ct.fa, X[1]))) } H[U] = $.extend(!0, {}, W), null != W && a && "mc" in H[U] && (null != H[U].mc.rs ? (H[U].mc.r = V, H[U].mc.c = U, t.merge[H[U].mc.r + "_" + H[U].mc.c] = H[U].mc, B[W.mc.r + "_" + W.mc.c] = [H[U].mc.r, H[U].mc.c]) : H[U] = { mc: { r: B[W.mc.r + "_" + W.mc.c][0], c: B[W.mc.r + "_" + W.mc.c][1] } }) } A[V] = H } } var K = null; if (1 == e.copyRange.length) { var Z = ga.luckysheetfile[_l(n)], Q = ga.luckysheetfile[_l(ga.currentSheetIndex)], J = $.extend(!0, [], Z.luckysheet_conditionformat_save); if (null != J && J.length > 0) { K = $.extend(!0, [], Q.luckysheet_conditionformat_save); for (var ee = 0; ee < J.length; ee++) { for (var te = J[ee].cellrange, ae = [], re = 1; re <= C; re++)for (var ne = 1; ne <= T; ne++) { F = b + (re - 1) * g, E = x + (ne - 1) * v, N = b + re * g, M = x + ne * v; for (var le = 0; le < te.length; le++) { var ie = gd.CFSplitRange(te[le], { row: [l, i], column: [o, s] }, { row: [F, N - 1], column: [E, M - 1] }, "operatePart"); ie.length > 0 && (ae = ae.concat(ie)) } } ae.length > 0 && (J[ee].cellrange = ae, K.push(J[ee])) } } } if (y.row = [b, k], y.column = [x, w], r || S > 0 || I > 0) { var oe = { cfg: t = qs(A, b, k, t), RowlChange: !0, cdformat: K, dataVerification: D }; id(A, ga.luckysheet_select_save, oe) } else { var se = { cfg: t, cdformat: K, dataVerification: D }; id(A, ga.luckysheet_select_save, se), Rh() } } } }, pasteHandlerOfPaintModel: function (e) { if (fu(ga.luckysheet_select_save, ga.currentSheetIndex)) { var t = $.extend(!0, {}, ga.config); null == t.merge && (t.merge = {}); var a = e.HasMC, r = e.RowlChange, n = e.dataSheetIndex, l = e.copyRange[0].row[0], i = e.copyRange[0].row[1], o = e.copyRange[0].column[0], s = e.copyRange[0].column[1], c = $.extend(!0, [], Wo({ row: [l, i], column: [o, s] }, n)), u = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], d = u.row[0], h = u.row[1], m = u.column[0], p = u.column[1], f = c.length, g = c[0].length; if (d == h && m == p) { var v = !1; if (null != t.merge && (v = _a(t, d, d + f - 1, m, m + g - 1)), v) return void (wa() ? alert("不能对合并单元格做部分更改") : fd.info('提示', "不能对合并单元格做部分更改")); h = d + f - 1, p = m + g - 1 } for (var y = Math.ceil((h - d + 1) / f), b = Math.ceil((p - m + 1) / g), k = rs.deepCopyFlowData(ga.flowdata), x = k[0].length, w = k.length, _ = Lc(n), C = $.extend(!0, {}, ga.luckysheetfile[_l(n)].dataVerification), T = null, A = 0, S = 0, I = 0, R = 0, q = 1; q <= y; q++)for (var D = 1; D <= b; D++) { S = m + (D - 1) * g, (R = d + q * f > w ? w : d + q * f) > h + 1 && (R = h + 1), (I = m + D * g > x ? x : m + D * g) > p + 1 && (I = p + 1); for (var F = {}, E = A = d + (q - 1) * f; E < R; E++) { for (var M = [].concat(k[E]), N = S; N < I; N++) { if (_[l + E - A + "_" + (o + N - S)]) { var P = { rangeType: "cell", value: { row_index: E, col_index: N, l: _[l + E - A + "_" + (o + N - S)].l, r: _[l + E - A + "_" + (o + N - S)].r, t: _[l + E - A + "_" + (o + N - S)].t, b: _[l + E - A + "_" + (o + N - S)].b } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(P) } else if (_[E + "_" + N]) { var z = { rangeType: "cell", value: { row_index: E, col_index: N, l: null, r: null, t: null, b: null } }; null == t.borderInfo && (t.borderInfo = []), t.borderInfo.push(z) } C[l + E - A + "_" + (o + N - S)] && (null == T && (T = $.extend(!0, {}, ga.luckysheetfile[_l(ga.currentSheetIndex)].dataVerification)), T[E + "_" + N] = C[l + E - A + "_" + (o + N - S)]), "object" == Cm(M[N]) && "mc" in M[N] && ("rs" in M[N].mc && delete t.merge[M[N].mc.r + "_" + M[N].mc.c], delete M[N].mc); var L = null; if (null != c[E - A] && null != c[E - A][N - S] && (L = c[E - A][N - S]), null != L && (delete L.v, delete L.m, delete L.f, delete L.spl, L.ct && "inlineStr" == L.ct.t && delete L.ct, "object" == Cm(M[N]) || (M[N] = { v: M[N] }), M[N] = $.extend(!0, M[N], L), a && "mc" in M[N] && (null != M[N].mc.rs ? (M[N].mc.r = E, M[N].mc.rs + E >= R && (M[N].mc.rs = R - E), M[N].mc.c = N, M[N].mc.cs + N >= I && (M[N].mc.cs = I - N), t.merge[M[N].mc.r + "_" + M[N].mc.c] = M[N].mc, F[L.mc.r + "_" + L.mc.c] = [M[N].mc.r, M[N].mc.c]) : M[N] = { mc: { r: F[L.mc.r + "_" + L.mc.c][0], c: F[L.mc.r + "_" + L.mc.c][1] } }), null != M[N].v && null != L.ct && null != L.ct.fa)) { var O = ws(L.ct.fa, M[N].v); M[N].m = O } } k[E] = M } } var B = null, V = $.extend(!0, [], ga.luckysheetfile[_l(n)].luckysheet_conditionformat_save); if (null != V && V.length > 0) { B = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save); for (var H = 0; H < V.length; H++) { for (var U = V[H].cellrange, j = [], G = 0; G < U.length; G++) { var W = gd.CFSplitRange(U[G], { row: [l, i], column: [o, s] }, { row: [d, h], column: [m, p] }, "operatePart"); W.length > 0 && (j = j.concat(W)) } j.length > 0 && (V[H].cellrange = [{ row: [d, h], column: [m, p] }], B.push(V[H])) } } if (u.row = [d, h], u.column = [m, p], r) { var Y = { cfg: t = qs(k, d, h, t), RowlChange: !0, cdformat: B, dataVerification: T }; id(k, ga.luckysheet_select_save, Y) } else { var X = { cfg: t, cdformat: B, dataVerification: T }; id(k, ga.luckysheet_select_save, X), Rh() } } }, matchcopy: function (e, t) { var a, r, n = [], l = []; if ("object" == Sa(e)) n = e; else { n = e.split("\n"); for (var i = 0; i < n.length; i++)n[i] = n[i].split("\t") } if (a = n.length, "object" == Sa(t)) l = t; else { l = t.split("\n"); for (var o = 0; o < l.length; o++)l[o] = l[o].split("\t") } if (a != (r = l.length)) return !1; for (var s = 0; s < a; s++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[s]) for (var c = 0; c < r; c++)if (n[s].length != l[c].length) return !1; for (var u = 0; u < a; u++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[u]) for (var d = 0; d < n[0].length; d++)if (Ko(u, d, n) != Ko(u, d, l)) return !1; return !0 } }; function yd(e) { $("#luckysheet-cols-h-hover").hide(), $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-cell-selected-boxs .luckysheet-cell-selected").hide(), $("#luckysheet-cols-h-selected .luckysheet-cols-h-selected").hide(), $("#luckysheet-rows-h-selected .luckysheet-rows-h-selected").hide(), $("#luckysheet-cell-selected-focus").hide(), $("#luckysheet-rows-h-hover").hide(), $("#luckysheet-selection-copy .luckysheet-selection-copy").hide(), $("#luckysheet-cols-menu-btn").hide(), $("#luckysheet-row-count-show, #luckysheet-column-count-show").hide(), e || vd.clearcopy(e), $("#luckysheet-dropCell-icon").is(":visible") && e && $("#luckysheet-dropCell-icon").remove(), xm.luckysheetPaintModelOn && !e && xm.cancelPaintModel() } function bd(e, t, a, r, n) { var l, i, o, s = function () { var e = gn(), t = e.info, a = e.print, r = !0 === fa.userInfo ? ' Lucky' : fa.userInfo; return '
      \n \n
      \n
      \n
      \n \n
      \n \n
      \n \n
      \n
      ').concat(t.detailUpdate, '
      \n
      ').concat(t.wait, "
      \n \n ${functionButton}\n \n ").concat("string" === Cm(r) ? '
      \n '.concat(r, "
      ") : "", "\n\n ").concat("object" === Cm(r) ? '
      \n \n ').concat(r.userName, "\n
      ") : "", '\n \n
      \n
      ${menu}
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n \n
      \n
      \n \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      ${columnHeader}\n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      ${rowHeader}\n
      \n
      \n
      \n
      \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      ${flow} \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      100%
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \x3c!--
      --\x3e\n
      \n
      \n
      \n
      \n \n
      \n
      ') }(); s = _m(s, { logotitle: n }), s = _m(s, { menu: (l = gn().toolbar, i = gn().fontarray, o = gn().defaultFmt, '
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n \x3c!--
      --\x3e\n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n ').concat(o[0].text, '\n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n ').concat(i[0], '\n
      \n
      \n
      \n
      \n
      \n
      \n\n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n ').concat(l.sum, '\n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n\n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n
      \n\n
      \n \n
      \n
      \n
      \n
      \n
      \n
      \n ')) }); var c = '
      ${flow}
      '; null == ga.config && (ga.config = {}), So(t, e); var u = gn().info, d = '' + u.row + '(' + u.addLast + ")", h = ' ", m = _m(u.pageInfo, { total: fa.total ? fa.total : "", totalPage: fa.pageInfo.totalPage ? fa.pageInfo.totalPage : "", currentPage: fa.pageInfo.currentPage ? fa.pageInfo.currentPage : "" }), p = ' ' + m + ' ', f = ' ' + m + "", g = ""; fa.enableAddRow && (g += d), fa.enablePage && (1 == parseInt(fa.pageInfo.totalPage) ? g += f : g += p), fa.enableAddBackTop && (g += h); var v = _m('
      ' + g + "
      ", { height: ga.rh_height, width: ga.ch_width - 1 }), y = _m('
      ${column}
      ', { width: ga.ch_width, index: 0, column: "" }); c = _m(c, { width: ga.ch_width, flow: v, index: 0 }), s = _m(s, { flow: c, rowHeader: "
      ", columnHeader: y, functionButton: fa.functionButton }), $("#" + ga.container).append(s), $("#luckysheet-scrollbar-x div").width(ga.ch_width), $("#luckysheet-scrollbar-y div").height(ga.rh_height + ga.columnHeaderHeight - ga.cellMainSrollBarSize - 3), $("body").append('
      '), $("body").append(""), $("body").append(vn()), $("body").append('
      '), $("body").append(_m(xn(), { menuid: "filter" })), $("body").append(_m(wn(), { menuid: "filter" })), $("body").append(kn()), $("#luckysheet-rows-h").width(ga.rowHeaderWidth - 1.5), $("#luckysheet-cols-h-c").height(ga.columnHeaderHeight - 1.5), $("#luckysheet-left-top").css({ width: ga.rowHeaderWidth - 1.5, height: ga.columnHeaderHeight - 1.5 }), $("#luckysheet_info_detail_input").val(fa.title) } var kd = nr.findIndex, xd = !0, wd = Le("findIndex"); "findIndex" in [] && Array(1).findIndex((function () { xd = !1 })), Ee({ target: "Array", proto: !0, forced: xd || !wd }, { findIndex: function (e) { return kd(this, e, arguments.length > 1 ? arguments[1] : void 0) } }), or("findIndex"); var _d = !o((function () { return Object.isExtensible(Object.preventExtensions({})) })), Cd = a((function (e) { var t = F.f, a = W("meta"), r = 0, n = Object.isExtensible || function () { return !0 }, l = function (e) { t(e, a, { value: { objectID: "O" + ++r, weakData: {} } }) }, i = e.exports = { REQUIRED: !1, fastKey: function (e, t) { if (!k(e)) return "symbol" == typeof e ? e : ("string" == typeof e ? "S" : "P") + e; if (!_(e, a)) { if (!n(e)) return "F"; if (!t) return "E"; l(e) } return e[a].objectID }, getWeakData: function (e, t) { if (!_(e, a)) { if (!n(e)) return !0; if (!t) return !1; l(e) } return e[a].weakData }, onFreeze: function (e) { return _d && i.REQUIRED && n(e) && !_(e, a) && l(e), e } }; K[a] = !0 })), Td = $t("iterator"), Ad = Array.prototype, Sd = function (e) { return void 0 !== e && (Os.Array === e || Ad[Td] === e) }, Id = $t("iterator"), Rd = function (e) { if (null != e) return e[Id] || e["@@iterator"] || Os[Mt(e)] }, $d = function (e, t, a, r) { try { return r ? t(q(a)[0], a[1]) : t(a) } catch (t) { var n = e.return; throw void 0 !== n && q(n.call(e)), t } }, qd = a((function (e) { var t = function (e, t) { this.stopped = e, this.result = t }; (e.exports = function (e, a, r, n, l) { var i, o, s, c, u, d, h, m = tr(a, r, n ? 2 : 1); if (l) i = e; else { if ("function" != typeof (o = Rd(e))) throw TypeError("Target is not iterable"); if (Sd(o)) { for (s = 0, c = he(e.length); c > s; s++)if ((u = n ? m(q(h = e[s])[0], h[1]) : m(e[s])) && u instanceof t) return u; return new t(!1) } i = o.call(e) } for (d = i.next; !(h = d.call(i)).done;)if ("object" == typeof (u = $d(i, m, h.value, n)) && u && u instanceof t) return u; return new t(!1) }).stop = function (e) { return new t(!0, e) } })), Dd = function (e, t, a) { if (!(e instanceof t)) throw TypeError("Incorrect " + (a ? a + " " : "") + "invocation"); return e }, Fd = $t("iterator"), Ed = !1; try { var Md = 0, Nd = { next: function () { return { done: !!Md++ } }, return: function () { Ed = !0 } }; Nd[Fd] = function () { return this }, Array.from(Nd, (function () { throw 2 })) } catch (va) { } var Pd = function (e, t) { if (!t && !Ed) return !1; var a = !1; try { var r = {}; r[Fd] = function () { return { next: function () { return { done: a = !0 } } } }, e(r) } catch (e) { } return a }, zd = function (e, t, a) { for (var r in t) ne(e, r, t[r], a); return e }, Ld = F.f, Od = Cd.fastKey, Bd = re.set, Vd = re.getterFor, Hd = (function (e, t, a) { var r = -1 !== e.indexOf("Map"), n = -1 !== e.indexOf("Weak"), i = r ? "set" : "add", s = l[e], c = s && s.prototype, u = s, d = {}, h = function (e) { var t = c[e]; ne(c, e, "add" == e ? function (e) { return t.call(this, 0 === e ? 0 : e), this } : "delete" == e ? function (e) { return !(n && !k(e)) && t.call(this, 0 === e ? 0 : e) } : "get" == e ? function (e) { return n && !k(e) ? void 0 : t.call(this, 0 === e ? 0 : e) } : "has" == e ? function (e) { return !(n && !k(e)) && t.call(this, 0 === e ? 0 : e) } : function (e, a) { return t.call(this, 0 === e ? 0 : e, a), this }) }; if (De(e, "function" != typeof s || !(n || c.forEach && !o((function () { (new s).entries().next() }))))) u = a.getConstructor(t, e, r, i), Cd.REQUIRED = !0; else if (De(e, !0)) { var m = new u, p = m[i](n ? {} : -0, 1) != m, f = o((function () { m.has(1) })), g = Pd((function (e) { new s(e) })), v = !n && o((function () { for (var e = new s, t = 5; t--;)e[i](t, t); return !e.has(-0) })); g || ((u = t((function (t, a) { Dd(t, u, e); var n = We(new s, t, u); return null != a && qd(a, n[i], n, r), n }))).prototype = c, c.constructor = u), (f || v) && (h("delete"), h("has"), r && h("get")), (v || p) && h(i), n && c.clear && delete c.clear } d[e] = u, Ee({ global: !0, forced: u != s }, d), Gs(u, e), n || a.setStrong(u, e, r) }("Map", (function (e) { return function () { return e(this, arguments.length ? arguments[0] : void 0) } }), { getConstructor: function (e, t, a, r) { var n = e((function (e, l) { Dd(e, n, t), Bd(e, { type: t, index: tt(null), first: void 0, last: void 0, size: 0 }), s || (e.size = 0), null != l && qd(l, e[r], e, a) })), l = Vd(t), i = function (e, t, a) { var r, n, i = l(e), c = o(e, t); return c ? c.value = a : (i.last = c = { index: n = Od(t, !0), key: t, value: a, previous: r = i.last, next: void 0, removed: !1 }, i.first || (i.first = c), r && (r.next = c), s ? i.size++ : e.size++, "F" !== n && (i.index[n] = c)), e }, o = function (e, t) { var a, r = l(e), n = Od(t); if ("F" !== n) return r.index[n]; for (a = r.first; a; a = a.next)if (a.key == t) return a }; return zd(n.prototype, { clear: function () { for (var e = l(this), t = e.index, a = e.first; a;)a.removed = !0, a.previous && (a.previous = a.previous.next = void 0), delete t[a.index], a = a.next; e.first = e.last = void 0, s ? e.size = 0 : this.size = 0 }, delete: function (e) { var t = l(this), a = o(this, e); if (a) { var r = a.next, n = a.previous; delete t.index[a.index], a.removed = !0, n && (n.next = r), r && (r.previous = n), t.first == a && (t.first = r), t.last == a && (t.last = n), s ? t.size-- : this.size-- } return !!a }, forEach: function (e) { for (var t, a = l(this), r = tr(e, arguments.length > 1 ? arguments[1] : void 0, 3); t = t ? t.next : a.first;)for (r(t.value, t.key, this); t && t.removed;)t = t.previous }, has: function (e) { return !!o(this, e) } }), zd(n.prototype, a ? { get: function (e) { var t = o(this, e); return t && t.value }, set: function (e, t) { return i(this, 0 === e ? 0 : e, t) } } : { add: function (e) { return i(this, e = 0 === e ? 0 : e, e) } }), s && Ld(n.prototype, "size", { get: function () { return l(this).size } }), n }, setStrong: function (e, t, a) { var r = t + " Iterator", n = Vd(t), l = Vd(r); ec(e, t, (function (e, t) { Bd(this, { type: r, target: e, state: n(e), kind: t, last: void 0 }) }), (function () { for (var e = l(this), t = e.kind, a = e.last; a && a.removed;)a = a.previous; return e.target && (e.last = a = a ? a.next : e.state.first) ? "keys" == t ? { value: a.key, done: !1 } : "values" == t ? { value: a.value, done: !1 } : { value: [a.key, a.value], done: !1 } : (e.target = void 0, { value: void 0, done: !0 }) }), a ? "entries" : "values", !a, !0), ol(t) } }), ia.charAt), Ud = re.set, jd = re.getterFor("String Iterator"); function Gd(e, t) { return e.replace(/\$\{([\w]+)\}/g, (function (e, a) { var r = t[a]; return void 0 !== r ? r : e })) } ec(String, "String", (function (e) { Ud(this, { type: "String Iterator", string: String(e), index: 0 }) }), (function () { var e, t = jd(this), a = t.string, r = t.index; return r >= a.length ? { value: void 0, done: !0 } : (e = Hd(a, r), t.index += e.length, { value: e, done: !1 }) })); var Wd = "#VALUE!", Yd = { getCellDataArr: function (e, t, a) { var r = []; if (null == e.data) a || ("number" === t ? r.push(0) : "text" === t && r.push("")); else if ("array" === Cm(e.data)) for (var n = 0; n < e.data.length; n++)for (var l = 0; l < e.data[n].length; l++) { var i = e.data[n][l], o = i; "object" === Cm(i) && (o = i.v), null == o ? a || ("number" === t ? o = 0 : "text" === t && (o = ""), r.push(o)) : r.push(o) } else ya(e.data.v) ? a || ("number" == t ? r.push(0) : "text" == t && r.push("")) : r.push(e.data.v); return r }, getCellDataDyadicArr: function (e, t) { var a = []; if (null == e.data) { var r = []; "number" == t ? r.push(0) : "text" == t && r.push(""), a.push(r) } else if ("array" == Cm(e.data)) for (var n = 0; n < e.data.length; n++) { for (var l = [], i = 0; i < e.data[n].length; i++) { var o = e.data[n][i], s = o; "object" === Cm(o) && (s = o.v), null == s && ("number" === t ? s = 0 : "text" === t && (s = "")), l.push(s) } a.push(l) } else { var c = [], u = e.data.v; ya(u) && ("number" == t ? u = 0 : "text" == t && (u = "")), c.push(u), a.push(c) } return a }, getDataArr: function (e, t) { var a = []; if (null == t && (t = !1), "array" == Cm(e[0])) for (var r = 0; r < e.length; r++)for (var n = 0; n < e[r].length; n++)t && !ba(e[r][n]) || a.push(e[r][n]); else for (var l = 0; l < e.length; l++)t && !ba(e[l]) || a.push(e[l]); return a }, getDataDyadicArr: function (e) { var t = []; if ("array" == Cm(e[0])) for (var a = 0; a < e.length; a++) { for (var r = [], n = 0; n < e[a].length; n++)r.push(e[a][n]); t.push(r) } else { for (var l = [], i = 0; i < e.length; i++)l.push(e[i]); t.push(l) } return t }, isDyadicArr: function (e) { var t = !0; if (e.length > 1) for (var a = e[0].length, r = 1; r < e.length; r++)if (e[r].length != a) { t = !1; break } return t }, getFirstValue: function (e, t) { var a; if (null == t && (t = "number"), "array" == Cm(e)) if ("array" == Cm(e[0])) { if (!this.isDyadicArr(e)) return Wd; a = e[0][0] } else a = e[0]; else if ("object" == Cm(e) && null != e.startCell) if (null == e.data) "number" == t ? a = 0 : "text" == t && (a = ""); else { var r = window.luckysheetCurrentRow, n = window.luckysheetCurrentColumn; if (1 == e.rowl && 1 == e.coll) null == (a = e.data) || ya(a.v) ? "number" == t ? a = 0 : "text" == t && (a = "") : a = a.v; else if (null != e.data[0][0].mc && e.data[0][0].mc.rs == e.rowl && e.data[0][0].mc.cs == e.coll) null == (a = e.data[0][0]) || ya(a.v) ? "number" == t ? a = 0 : "text" == t && (a = "") : a = a.v; else { if (1 != e.rowl && 1 != e.coll) return Wd; var l = Ih.getcellrange(e.startCell), i = l.row[0], o = i + e.rowl - 1, s = l.column[0], c = s + e.coll - 1; if (1 == e.rowl) { if (n < s || n > c) return Wd; a = e.data[0][n - s] } else if (1 == e.coll) { if (r < i || r > o) return Wd; a = e.data[r - i][0] } null == a || ya(a.v) || null != a.mc ? "number" == t ? a = 0 : "text" == t && (a = "") : a = a.v } } else a = e; return a }, getCellBoolen: function (e) { var t = this.getFirstValue(e); if (ka(t)) return t; if ("boolean" == Cm(t)); else if ("string" != Cm(t) || "true" != t.toLowerCase() && "false" != t.toLowerCase()) { if (!ba(t)) return Wd; t = 0 != (t = parseFloat(t)) } else "true" == t.toLowerCase() ? t = !0 : "false" == t.toLowerCase() && (t = !1); return t }, getCellDate: function (e) { var t; if ("array" == Cm(e)) if ("array" == Cm(e[0])) { if (!this.isDyadicArr(e)) return Wd; t = e[0][0] } else t = e[0]; else if ("object" == Cm(e) && null != e.startCell) { if (null == e.data || "array" == Cm(e.data) || ya(e.data.v)) return Wd; t = e.data.v, null != e.data.ct && "d" == e.data.ct.t && (t = ws("YYYY-MM-DD h:mm:ss", t)) } else t = e; return t }, getCellrangeDate: function (e) { var t = []; if ("array" == Cm(e)) { if ("array" == Cm(e[0]) && !this.isDyadicArr(e)) return Wd; t = t.concat(this.getDataArr(e, !1)) } else if ("object" == Cm(e) && null != e.startCell) if (null == e.data) t.push(0); else if ("array" == Cm(e.data)) for (var a = 0; a < e.data.length; a++)for (var r = 0; r < e.data[a].length; r++)if (null == e.data[a][r] || ya(e.data[a][r].v)) t.push(0); else { var n = e.data[a][r].v; null != e.data[a][r].ct && "d" == e.data[a][r].ct.t && (n = ws("YYYY-MM-DD h:mm:ss", n)), t.push(n) } else { var l = e.data.v; null != e.data.ct && "d" == e.data.ct.t && (l = ws("YYYY-MM-DD h:mm:ss", l)), t.push(l) } else t.push(e); return t }, getRegExpStr: function (e) { return e.replace("~*", "\\*").replace("~?", "\\?").replace(".", "\\.").replace("*", ".*").replace("?", ".") }, factorial: function (e) { return 0 == e || 1 == e ? 1 : e * this.factorial(e - 1) }, factorialDouble: function (e) { return e <= 0 ? 1 : e * this.factorialDouble(e - 2) }, variance: function (e) { for (var t = 0, a = 0, r = 0; r < e.length; r++) { t += e[r], a++ } for (var n = t / a, l = 0, i = 0; i < e.length; i++) { var o = e[i]; l += (o - n) * (o - n) } return l / a }, variance_s: function (e) { for (var t = 0, a = 0, r = 0; r < e.length; r++) { t += e[r], a++ } for (var n = t / a, l = 0, i = 0; i < e.length; i++) { var o = e[i]; l += (o - n) * (o - n) } return l / (a - 1) }, standardDeviation: function (e) { for (var t = 0, a = 0, r = 0; r < e.length; r++) { t += e[r], a++ } for (var n = t / a, l = 0, i = 0; i < e.length; i++) { var o = e[i]; l += (o - n) * (o - n) } return Math.sqrt(l / a) }, standardDeviation_s: function (e) { for (var t = 0, a = 0, r = 0; r < e.length; r++) { t += e[r], a++ } for (var n = t / a, l = 0, i = 0; i < e.length; i++) { var o = e[i]; l += (o - n) * (o - n) } return Math.sqrt(l / (a - 1)) }, isLeapYear: function (e) { return 1 === new Date(e, 1, 29).getMonth() }, feb29Between: function (e, t) { var a = us(e).year(), r = us().set({ year: a, month: 2, date: 1 }); if (this.isLeapYear(a) && us(e) < us(r) && us(t) >= us(r)) return !0; var n = us(t).year(), l = us().set({ year: n, month: 2, date: 1 }); return this.isLeapYear(n) && us(t) >= us(l) && us(e) < us(l) }, findResultIndex: function (e, t) { for (var a = {}, r = 1; r < e[0].length; ++r)a[r] = !0; var n = t[0].length; for (i = 1; i < t.length; ++i)t[i].length > n && (n = t[i].length); for (var l = 1; l < e.length; ++l)for (var o = 1; o < e[l].length; ++o) { for (var s = !1, c = !1, u = 0; u < t.length; ++u) { var d = t[u]; if (!(d.length < n)) { var h = d[0]; if (e[l][0] === h) { c = !0; for (var m = 1; m < d.length; ++m)s = s || new Function("return " + e[l][o] + d[m])() } } } c && (a[o] = a[o] && s) } for (var p = [], f = 0; f < e[0].length; ++f)a[f] && p.push(f - 1); return p }, findField: function (e, t) { for (var a = null, r = 0; r < e.length; r++)if (e[r][0] == t) { a = r; break } return null == a ? Wd : a }, rest: function (e, t) { return t = t || 1, e && "function" == typeof e.slice ? e.slice(t) : e }, compact: function (e) { if (!e) return e; for (var t = [], a = 0; a < e.length; ++a)e[a] && t.push(e[a]); return t } }, Xd = {}; function Kd(e) { return Xd.sylvester_matrix.create(e).inverse().elements } function Zd() { var e, t = arguments[1], a = arguments[0]; "object" == Cm(a) && null != a.startCell ? 1 == (e = "&" == t ? Yd.getCellDataDyadicArr(a, "text") : Yd.getCellDataDyadicArr(a, "number")).length && 1 == e[0].length && (e = e[0][0]) : e = a; var r, n = arguments[2]; if ("object" == Cm(n) && null != n.startCell ? 1 == (r = "&" == t ? Yd.getCellDataDyadicArr(n, "text") : Yd.getCellDataDyadicArr(n, "number")).length && 1 == r[0].length && (r = r[0][0]) : r = n, ka(e)) return e; if (ka(r)) return r; if ("array" == Cm(e) && "array" == Cm(e[0]) && !Yd.isDyadicArr(e)) return va.v; if ("array" == Cm(r) && "array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return va.v; if ("<>" == t && (t = "!="), "=" == t && (t = "=="), null == e && null == r) return "#INVERSE!"; if ("#INVERSE!" == e) e = 0, "-" == t ? t = "+" : "+" == t && (t = "-"); else if ("-" == t && null == e) e = 0; else if ("/" == t && (0 == r || null == r)) return va.d; function l(e, t, a) { return ba(e) && (e = parseFloat(e)), ba(a) && (a = parseFloat(a)), "==" == t ? e == a : "!=" == t ? e != a : ">=" == t ? e >= a : "<=" == t ? e <= a : ">" == t ? e > a : "<" == t ? e < a : void 0 } function i(e) { return null == e ? e : "true" == e.toString().toLowerCase() ? 1 : "false" == e.toString().toLowerCase() ? 0 : e } if ("*" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var o = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) if (e.length == r.length && e[0].length == r[0].length) for (var s = 0; s < e.length; s++) { for (var c = [], u = 0; u < e[s].length; u++) { e[s][u] = i(e[s][u]), r[s][u] = i(r[s][u]); var d = void 0; d = ba(e[s][u]) && ba(r[s][u]) ? Jd(e[s][u], t, r[s][u]) : va.v, c.push(d) } o.push(c) } else if (e[0].length == r.length) for (var h = e.length, m = r[0].length, p = 0; p < h; p++) { for (var f = [], g = 0; g < m; g++) { for (var v = 0, y = 0; y < e[0].length; y++)e[p][y] = i(e[p][y]), r[y][g] = i(r[y][g]), ba(e[p][y]) && ba(r[y][g]) ? v += Jd(e[p][y], t, r[y][g]) : v += va.v; "NaN" == v.toString() && (v = va.v), f.push(v) } o.push(f) } else { if (e.length != r[0].length) return va.na; for (var b = r.length, k = e[0].length, x = 0; x < b; x++) { for (var w = [], _ = 0; _ < k; _++) { for (var C = 0, T = 0; T < r[0].length; T++)e[T][_] = i(e[T][_]), r[x][T] = i(r[x][T]), ba(r[x][T]) && ba(e[T][_]) ? C += Jd(e[T][_], t, r[x][T]) : C += va.v; "NaN" == C.toString() && (C = va.v), w.push(C) } o.push(w) } } else if ("array" == Cm(e[0])) if (e[0].length == r.length) for (var A = 0; A < e.length; A++) { for (var S = [], I = 0; I < e[A].length; I++) { e[A][I] = i(e[A][I]), r[I] = i(r[I]); var R = void 0; R = ba(e[A][I]) && ba(r[I]) ? Jd(e[A][I], t, r[I]) : va.v, S.push(R) } o.push(S) } else { if (1 != e[0].length) return va.na; for (var $ = e.length, q = r.length, D = 0; D < $; D++) { for (var F = [], E = 0; E < q; E++) { e[D][0] = i(e[D][0]), r[E] = i(r[E]); var M = void 0; M = ba(e[D][0]) && ba(r[E]) ? Jd(e[D][0], t, r[E]) : va.v, F.push(M) } o.push(F) } } else if ("array" == Cm(r[0])) if (r[0].length == e.length) for (var N = 0; N < r.length; N++) { for (var P = [], z = 0; z < r[N].length; z++) { e[z] = i(e[z]), r[N][z] = i(r[N][z]); var L = void 0; L = ba(e[z]) && ba(r[N][z]) ? Jd(e[z], t, r[N][z]) : va.v, P.push(L) } o.push(P) } else { if (1 != r[0].length) return va.na; for (var O = r.length, B = e.length, V = 0; V < O; V++) { for (var H = [], U = 0; U < B; U++) { e[U] = i(e[U]), r[V][0] = i(r[V][0]); var j = void 0; j = ba(e[U]) && ba(r[V][0]) ? Jd(e[U], t, r[V][0]) : va.v, H.push(j) } o.push(H) } } else { if (e.length != r.length) return va.na; for (var G = 0; G < e.length; G++) { e[G] = i(e[G]), r[G] = i(r[G]); var W = void 0; W = ba(e[G]) && ba(r[G]) ? Jd(e[G], t, r[G]) : va.v, o.push(W) } } return o } if ("array" == Cm(e)) { r = i(r); var Y = []; if ("array" == Cm(e[0])) for (var X = 0; X < e.length; X++) { for (var K = [], Z = 0; Z < e[X].length; Z++) { e[X][Z] = i(e[X][Z]); var Q = void 0; Q = ba(e[X][Z]) && ba(r) ? Jd(e[X][Z], t, r) : va.v, K.push(Q) } Y.push(K) } else for (var J = 0; J < e.length; J++) { e[J] = i(e[J]); var ee = void 0; ee = ba(e[J]) && ba(r) ? Jd(e[J], t, r) : va.v, Y.push(ee) } return Y } if ("array" == Cm(r)) { e = i(e); var te = []; if ("array" == Cm(r[0])) for (var ae = 0; ae < r.length; ae++) { for (var re = [], ne = 0; ne < r[ae].length; ne++) { r[ae][ne] = i(r[ae][ne]); var le = void 0; le = ba(e) && ba(r[ae][ne]) ? Jd(e, t, r[ae][ne]) : va.v, re.push(le) } te.push(re) } else for (var ie = 0; ie < r.length; ie++) { r[ie] = i(r[ie]); var oe = void 0; oe = ba(e) && ba(r[ie]) ? Jd(e, t, r[ie]) : va.v, te.push(oe) } return te } return e = i(e), r = i(r), ba(e) && ba(r) ? Jd(e, t, r) : va.v } if ("/" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var se = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) if (e.length == r.length && e[0].length == r[0].length) for (var ce = 0; ce < e.length; ce++) { for (var ue = [], de = 0; de < e[ce].length; de++) { e[ce][de] = i(e[ce][de]), r[ce][de] = i(r[ce][de]); var he = void 0; he = ba(e[ce][de]) && ba(r[ce][de]) ? 0 == parseFloat(r[ce][de]) ? va.d : Jd(e[ce][de], t, r[ce][de]) : va.v, ue.push(he) } se.push(ue) } else { if (e[0].length != r.length) return va.na; for (var me = Kd(r), pe = e.length, fe = me[0].length, ge = 0; ge < pe; ge++) { for (var ve = [], ye = 0; ye < fe; ye++) { for (var be = 0, ke = 0; ke < e[0].length; ke++)e[ge][ke] = i(e[ge][ke]), me[ke][ye] = i(me[ke][ye]), ba(e[ge][ke]) && ba(me[ke][ye]) ? be += Jd(e[ge][ke], "*", me[ke][ye]) : be += va.v; "NaN" == be.toString() && (be = va.v), ve.push(be) } se.push(ve) } } else if ("array" == Cm(e[0])) if (e[0].length == r.length) for (var xe = 0; xe < e.length; xe++) { for (var we = [], _e = 0; _e < e[xe].length; _e++) { e[xe][_e] = i(e[xe][_e]), r[_e] = i(r[_e]); var Ce = void 0; Ce = ba(e[xe][_e]) && ba(r[_e]) ? 0 == parseFloat(r[_e]) ? va.d : Jd(e[xe][_e], t, r[_e]) : va.v, we.push(Ce) } se.push(we) } else { if (1 != e[0].length) return va.na; for (var Te = e.length, Ae = r.length, Se = 0; Se < Te; Se++) { for (var Ie = [], Re = 0; Re < Ae; Re++) { e[Se][0] = i(e[Se][0]), r[Re] = i(r[Re]); var $e = void 0; $e = ba(e[Se][0]) && ba(r[Re]) ? 0 == parseFloat(r[Re]) ? va.d : Jd(e[Se][0], t, r[Re]) : va.v, Ie.push($e) } se.push(Ie) } } else if ("array" == Cm(r[0])) if (r[0].length == e.length) for (var qe = 0; qe < r.length; qe++) { for (var De = [], Fe = 0; Fe < r[qe].length; Fe++) { e[Fe] = i(e[Fe]), r[qe][Fe] = i(r[qe][Fe]); var Ee = void 0; Ee = ba(e[Fe]) && ba(r[qe][Fe]) ? 0 == parseFloat(r[qe][Fe]) ? va.d : Jd(e[Fe], t, r[qe][Fe]) : va.v, De.push(Ee) } se.push(De) } else { if (1 != r[0].length) return va.na; for (var Me = r.length, Ne = e.length, Pe = 0; Pe < Me; Pe++) { for (var ze = [], Le = 0; Le < Ne; Le++) { e[Le] = i(e[Le]), r[Pe][0] = i(r[Pe][0]); var Oe = void 0; Oe = ba(e[Le]) && ba(r[Pe][0]) ? 0 == parseFloat(r[Pe][0]) ? va.d : Jd(e[Le], t, r[Pe][0]) : va.v, ze.push(Oe) } se.push(ze) } } else { if (e.length != r.length) return va.na; for (var Be = 0; Be < e.length; Be++) { e[Be] = i(e[Be]), r[Be] = i(r[Be]); var Ve = void 0; Ve = ba(e[Be]) && ba(r[Be]) ? 0 == parseFloat(r[Be]) ? va.d : Jd(e[Be], t, r[Be]) : va.v, se.push(Ve) } } return se } if ("array" == Cm(e)) { r = i(r); var He = []; if ("array" == Cm(e[0])) for (var Ue = 0; Ue < e.length; Ue++) { for (var je = [], Ge = 0; Ge < e[Ue].length; Ge++) { e[Ue][Ge] = i(e[Ue][Ge]); var We = void 0; We = ba(e[Ue][Ge]) && ba(r) ? 0 == parseFloat(r) ? va.d : Jd(e[Ue][Ge], t, r) : va.v, je.push(We) } He.push(je) } else for (var Ye = 0; Ye < e.length; Ye++) { e[Ye] = i(e[Ye]); var Xe = void 0; Xe = ba(e[Ye]) && ba(r) ? 0 == parseFloat(r) ? va.d : Jd(e[Ye], t, r) : va.v, He.push(Xe) } return He } if ("array" == Cm(r)) { e = i(e); var Ke = []; if ("array" == Cm(r[0])) for (var Ze = 0; Ze < r.length; Ze++) { for (var Qe = [], Je = 0; Je < r[Ze].length; Je++) { r[Ze][Je] = i(r[Ze][Je]); var et = void 0; et = ba(e) && ba(r[Ze][Je]) ? 0 == parseFloat(r[Ze][Je]) ? va.d : Jd(e, t, r[Ze][Je]) : va.v, Qe.push(et) } Ke.push(Qe) } else for (var tt = 0; tt < r.length; tt++) { r[tt] = i(r[tt]); var at = void 0; at = ba(e) && ba(r[tt]) ? 0 == parseFloat(r[tt]) ? va.d : Jd(e, t, r[tt]) : va.v, Ke.push(at) } return Ke } return e = i(e), r = i(r), ba(e) && ba(r) ? 0 == parseFloat(r) ? va.d : Jd(e, t, r) : va.v } if ("+" == t || "-" == t || "%" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var rt = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) { if (e.length != r.length && e[0].length != r[0].length) return va.na; for (var nt = 0; nt < e.length; nt++) { for (var lt = [], it = 0; it < e[nt].length; it++) { e[nt][it] = i(e[nt][it]), r[nt][it] = i(r[nt][it]); var ot = void 0; ot = ba(e[nt][it]) && ba(r[nt][it]) ? "%" == t && 0 == parseFloat(r[nt][it]) ? va.d : Jd(e[nt][it], t, r[nt][it]) : va.v, lt.push(ot) } rt.push(lt) } } else if ("array" == Cm(e[0])) { if (e[0].length != r.length) return va.na; for (var st = 0; st < e.length; st++) { for (var ct = [], ut = 0; ut < e[st].length; ut++) { e[st][ut] = i(e[st][ut]), r[ut] = i(r[ut]); var dt = void 0; dt = ba(e[st][ut]) && ba(r[ut]) ? "%" == t && 0 == parseFloat(r[ut]) ? va.d : Jd(e[st][ut], t, r[ut]) : va.v, ct.push(dt) } rt.push(ct) } } else if ("array" == Cm(r[0])) { if (r[0].length != e.length) return va.na; for (var ht = 0; ht < r.length; ht++) { for (var mt = [], pt = 0; pt < r[ht].length; pt++) { e[pt] = i(e[pt]), r[ht][pt] = i(r[ht][pt]); var ft = void 0; ft = ba(e[pt]) && ba(r[ht][pt]) ? "%" == t && 0 == parseFloat(r[ht][pt]) ? va.d : Jd(e[pt], t, r[ht][pt]) : va.v, mt.push(ft) } rt.push(mt) } } else { if (e.length != r.length) return va.na; for (var gt = 0; gt < e.length; gt++) { e[gt] = i(e[gt]), r[gt] = i(r[gt]); var vt = void 0; vt = ba(e[gt]) && ba(r[gt]) ? "%" == t && 0 == parseFloat(r[gt]) ? va.d : Jd(e[gt], t, r[gt]) : va.v, rt.push(vt) } } return rt } if ("array" == Cm(e)) { r = i(r); var yt = []; if ("array" == Cm(e[0])) for (var bt = 0; bt < e.length; bt++) { for (var kt = [], xt = 0; xt < e[bt].length; xt++) { e[bt][xt] = i(e[bt][xt]); var wt = void 0; wt = ba(e[bt][xt]) && ba(r) ? "%" == t && 0 == parseFloat(r) ? va.d : Jd(e[bt][xt], t, r) : va.v, kt.push(wt) } yt.push(kt) } else for (var _t = 0; _t < e.length; _t++) { e[_t] = i(e[_t]); var Ct = void 0; Ct = ba(e[_t]) && ba(r) ? "%" == t && 0 == parseFloat(r) ? va.d : Jd(e[_t], t, r) : va.v, yt.push(Ct) } return yt } if ("array" == Cm(r)) { e = i(e); var Tt = []; if ("array" == Cm(r[0])) for (var At = 0; At < r.length; At++) { for (var St = [], It = 0; It < r[At].length; It++) { r[At][It] = i(r[At][It]); var Rt = void 0; Rt = ba(e) && ba(r[At][It]) ? "%" == t && 0 == parseFloat(r[At][It]) ? va.d : Jd(e, t, r[At][It]) : va.v, St.push(Rt) } Tt.push(St) } else for (var $t = 0; $t < r.length; $t++) { r[$t] = i(r[$t]); var qt = void 0; qt = ba(e) && ba(r[$t]) ? "%" == t && 0 == parseFloat(r[$t]) ? va.d : Jd(e, t, r[$t]) : va.v, Tt.push(qt) } return Tt } return e = i(e), r = i(r), ba(e) && ba(r) ? "%" == t && 0 == parseFloat(r) ? va.d : Jd(e, t, r) : va.v } if ("==" == t || "!=" == t || ">=" == t || "<=" == t || ">" == t || "<" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var Dt = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) { if (e.length != r.length && e[0].length != r[0].length) return va.na; for (var Ft = 0; Ft < e.length; Ft++) { for (var Et = [], Mt = 0; Mt < e[Ft].length; Mt++) { var Nt = l(e[Ft][Mt], t, r[Ft][Mt]); Et.push(Nt) } Dt.push(Et) } } else if ("array" == Cm(e[0])) { if (e[0].length != r.length) return va.na; for (var Pt = 0; Pt < e.length; Pt++) { for (var zt = [], Lt = 0; Lt < e[Pt].length; Lt++) { var Ot = l(e[Pt][Lt], t, r[Lt]); zt.push(Ot) } Dt.push(zt) } } else if ("array" == Cm(r[0])) { if (r[0].length != e.length) return va.na; for (var Bt = 0; Bt < r.length; Bt++) { for (var Vt = [], Ht = 0; Ht < r[Bt].length; Ht++) { var Ut = l(e[Ht], t, r[Bt][Ht]); Vt.push(Ut) } Dt.push(Vt) } } else { if (e.length != r.length) return va.na; for (var jt = 0; jt < e.length; jt++) { var Gt = l(e[jt], t, r[jt]); Dt.push(Gt) } } return Dt } if ("array" == Cm(e)) { var Wt = []; if ("array" == Cm(e[0])) for (var Yt = 0; Yt < e.length; Yt++) { for (var Xt = [], Kt = 0; Kt < e[Yt].length; Kt++) { var Zt = l(e[Yt][Kt], t, r); Xt.push(Zt) } Wt.push(Xt) } else for (var Qt = 0; Qt < e.length; Qt++) { var Jt = l(e[Qt], t, r); Wt.push(Jt) } return Wt } if ("array" == Cm(r)) { var ea = []; if ("array" == Cm(r[0])) for (var ta = 0; ta < r.length; ta++) { for (var aa = [], ra = 0; ra < r[ta].length; ra++) { var na = l(e, t, r[ta][ra]); aa.push(na) } ea.push(aa) } else for (var la = 0; la < r.length; la++) { var ia = l(e, t, r[la]); ea.push(ia) } return ea } return l(e, t, r) } if ("&" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var oa = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) { if (e.length != r.length && e[0].length != r[0].length) return va.na; for (var sa = 0; sa < e.length; sa++) { for (var ca = [], ua = 0; ua < e[sa].length; ua++)ca.push(e[sa][ua] + "" + r[sa][ua]); oa.push(ca) } } else if ("array" == Cm(e[0])) { if (e[0].length != r.length) return va.na; for (var da = 0; da < e.length; da++) { for (var ha = [], ma = 0; ma < e[da].length; ma++)ha.push(e[da][ma] + "" + r[ma]); oa.push(ha) } } else if ("array" == Cm(r[0])) { if (r[0].length != e.length) return va.na; for (var pa = 0; pa < r.length; pa++) { for (var fa = [], ga = 0; ga < r[pa].length; ga++)fa.push(e[ga] + "" + r[pa][ga]); oa.push(fa) } } else { if (e.length != r.length) return va.na; for (var ya = 0; ya < e.length; ya++)oa.push(e[ya] + "" + r[ya]) } return oa } if ("array" == Cm(e)) { var xa = []; if ("array" == Cm(e[0])) for (var wa = 0; wa < e.length; wa++) { for (var _a = [], Ca = 0; Ca < e[wa].length; Ca++)_a.push(e[wa][Ca] + "" + r); xa.push(_a) } else for (var Ta = 0; Ta < e.length; Ta++)xa.push(e[Ta] + "" + r); return xa } if ("array" == Cm(r)) { var Aa = []; if ("array" == Cm(r[0])) for (var Sa = 0; Sa < r.length; Sa++) { for (var Ia = [], Ra = 0; Ra < r[Sa].length; Ra++)Ia.push(e + "" + r[Sa][Ra]); Aa.push(Ia) } else for (var $a = 0; $a < r.length; $a++)Aa.push(e + "" + r[$a]); return Aa } return e + "" + r } if ("^" == t) { if ("array" == Cm(e) && "array" == Cm(r)) { var qa = []; if ("array" == Cm(e[0]) && "array" == Cm(r[0])) { if (e.length != r.length && e[0].length != r[0].length) return va.na; for (var Da = 0; Da < e.length; Da++) { for (var Fa = [], Ea = 0; Ea < e[Da].length; Ea++) { e[Da][Ea] = i(e[Da][Ea]), r[Da][Ea] = i(r[Da][Ea]); var Ma = void 0; Ma = ba(e[Da][Ea]) && ba(r[Da][Ea]) ? Math.pow(parseFloat(e[Da][Ea]), parseFloat(r[Da][Ea])) : va.v, Fa.push(Ma) } qa.push(Fa) } } else if ("array" == Cm(e[0])) { if (e[0].length != r.length) return va.na; for (var Na = 0; Na < e.length; Na++) { for (var Pa = [], za = 0; za < e[Na].length; za++) { e[Na][za] = i(e[Na][za]), r[za] = i(r[za]); var La = void 0; La = ba(e[Na][za]) && ba(r[za]) ? Math.pow(parseFloat(e[Na][za]), parseFloat(r[za])) : va.v, Pa.push(La) } qa.push(Pa) } } else if ("array" == Cm(r[0])) { if (r[0].length != e.length) return va.na; for (var Oa = 0; Oa < r.length; Oa++) { for (var Ba = [], Va = 0; Va < r[Oa].length; Va++) { e[Va] = i(e[Va]), r[Oa][Va] = i(r[Oa][Va]); var Ha = void 0; Ha = ba(e[Va]) && ba(r[Oa][Va]) ? Math.pow(parseFloat(e[Va]), parseFloat(r[Oa][Va])) : va.v, Ba.push(Ha) } qa.push(Ba) } } else { if (e.length != r.length) return va.na; for (var Ua = 0; Ua < e.length; Ua++) { e[Ua] = i(e[Ua]), r[Ua] = i(r[Ua]); var ja = void 0; ja = ba(e[Ua]) && ba(r[Ua]) ? Math.pow(parseFloat(e[Ua]), parseFloat(r[Ua])) : va.v, qa.push(ja) } } return qa } if ("array" == Cm(e)) { r = i(r); var Ga = []; if ("array" == Cm(e[0])) for (var Wa = 0; Wa < e.length; Wa++) { for (var Ya = [], Xa = 0; Xa < e[Wa].length; Xa++) { e[Wa][Xa] = i(e[Wa][Xa]); var Ka = void 0; Ka = ba(e[Wa][Xa]) && ba(r) ? Math.pow(parseFloat(e[Wa][Xa]), parseFloat(r)) : va.v, Ya.push(Ka) } Ga.push(Ya) } else for (var Za = 0; Za < e.length; Za++) { e[Za] = i(e[Za]); var Qa = void 0; Qa = ba(e[Za]) && ba(r) ? Math.pow(parseFloat(e[Za]), parseFloat(r)) : va.v, Ga.push(Qa) } return Ga } if ("array" == Cm(r)) { e = i(e); var Ja = []; if ("array" == Cm(r[0])) for (var er = 0; er < r.length; er++) { for (var tr = [], ar = 0; ar < r[er].length; ar++) { r[er][ar] = i(r[er][ar]); var rr = void 0; rr = ba(e) && ba(r[er][ar]) ? Math.pow(parseFloat(e), parseFloat(r[er][ar])) : va.v, tr.push(rr) } Ja.push(tr) } else for (var nr = 0; nr < r.length; nr++) { r[nr] = i(r[nr]); var lr = void 0; lr = ba(e) && ba(r[nr]) ? Math.pow(parseFloat(e), parseFloat(r[nr])) : va.v, Ja.push(lr) } return Ja } return e = i(e), r = i(r), ba(e) && ba(r) ? Math.pow(parseFloat(e), parseFloat(r)) : va.v } } function Qd() { var e = arguments[0], t = []; if ((e = e.replace("{", "").replace("}", "").replace(/\"/g, "")).indexOf(";") > -1) { t = e.split(";"); for (var a = 0; a < t.length; a++)t[a] = t[a].split(",") } else t = e.split(","); return t } function Jd(e, t, a) { var r; return "+" == t ? r = fs(e).add(a).value() : "-" == t ? r = fs(e).subtract(a).value() : "%" == t ? r = new Function("return " + parseFloat(e) + t + "(" + parseFloat(a) + ")")() : "/" == t ? r = fs(e).divide(a).value() : "*" == t && (r = fs(e).multiply(a).value()), r } function eh(e) { if (null == window.luckysheet_getcelldata_cache && (window.luckysheet_getcelldata_cache = {}), e in window.luckysheet_getcelldata_cache) return window.luckysheet_getcelldata_cache[e]; var t = Tl(), a = e.split("!"), r = "", n = "", l = -1, i = null; if (a.length > 1) { for (var o in r = a[0].replace(/''/g, "'"), n = a[1], "'" == r.substr(0, 1) && "'" == r.substr(r.length - 1, 1) && (r = r.substring(1, r.length - 1)), t) if (r == t[o].name) { l = t[o].index, i = t[o].data; break } -1 == l && (l = 0) } else { var s = _l(ga.calculateSheetIndex); r = t[s].name, l = t[s].index, i = t[s].data, n = a[0] } if (-1 == n.indexOf(":")) { var c = parseInt(n.replace(/[^0-9]/g, "")) - 1, u = Sm(n.replace(/[^A-Za-z]/g, "")); if (isNaN(c) || isNaN(u)) return []; var d = Yo(i, { row: [c, c], column: [u, u] })[0][0]; if (null != Ih.execFunctionGlobalData) { var h = Ih.execFunctionGlobalData[c + "_" + u + "_" + l]; null != h && (d = h) } var m = { sheetName: r, startCell: n, rowl: 1, coll: 1, data: d }; return window.luckysheet_getcelldata_cache[e] = m, m } n = n.split(":"); var p = [], f = []; if (p[0] = parseInt(n[0].replace(/[^0-9]/g, "")) - 1, p[1] = parseInt(n[1].replace(/[^0-9]/g, "")) - 1, isNaN(p[0]) && (p[0] = 0), isNaN(p[1]) && (p[1] = i.length - 1), p[0] > p[1]) return fd.info("选择失败", "输入范围错误!"), []; if (f[0] = Sm(n[0].replace(/[^A-Za-z]/g, "")), f[1] = Sm(n[1].replace(/[^A-Za-z]/g, "")), isNaN(f[0]) && (f[0] = 0), isNaN(f[1]) && (f[1] = i[0].length - 1), f[0] > f[1]) return fd.info("选择失败", "输入范围错误!"), []; var g = Yo(i, { row: p, column: f }); if (null != Ih.execFunctionGlobalData) for (var v = p[0]; v <= p[1]; v++)for (var y = f[0]; y <= f[1]; y++) { var b = Ih.execFunctionGlobalData[v + "_" + y + "_" + l]; null != b && (g[v - p[0]][y - f[0]] = b) } var k = p[1] - p[0] + 1, x = f[1] - f[0] + 1, w = { sheetName: r, startCell: n[0], rowl: k, coll: x, data: g }; return window.luckysheet_getcelldata_cache[e] = w, w } function th(e) { return "object" === Sa(e) ? null == e ? "" : Array.isArray(e) ? xs(e[0])[2] : Array.isArray(e.data) ? va.v : void 0 === e.data.v ? "" : e.data.v : Ih.isCompareOperator(e).flag ? "string" == typeof e || "number" == typeof e ? e : va.v : xs(e)[2] } function ah() { for (var e = arguments[0], t = 0; t < e.length; t++) { var a = e[t]; if ("object" === Sa(a)) if (null == a) a = ""; else if (Array.isArray(a)) { var r = xs(a[0]); a = r[2] } else a = Array.isArray(a.data) ? a.data : void 0 === a.data.v ? "" : a.data.v; else if (!Ih.isCompareOperator(a).flag) { var n = xs(a); a = n[2] } e[t] = a } } function rh() { var e = arguments[0]; return null == e || 0 == e.length ? null : e } function nh(e) { return e } function lh() { if ("object" != Cm(arguments[0]) || null == arguments[0].startCell) return Ih.error.v; var e = arguments[0].startCell, t = Yd.getFirstValue(arguments[1]); if (ka(t)) return t; if (!ba(t)) return Ih.error.v; t = parseInt(t); var a = Yd.getFirstValue(arguments[2]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = arguments[0].rowl; if (arguments.length >= 4) { if (ka(r = Yd.getFirstValue(arguments[3]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } var n = arguments[0].coll; if (5 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[4]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } if (r < 1 || n < 1) return Ih.error.r; var l = Ih.getcellrange(e), i = l.row[0], o = l.column[0], s = (i += t) + r - 1, c = (o += a) + n - 1; return i < 0 || s >= ga.flowdata.length || o < 0 || c >= ga.flowdata[0].length ? Ih.error.r : Cl(ga.calculateSheetIndex, { row: [i, s], column: [o, c] }) } function ih(e, t, a) { var r, n; if (e ? (n = t, r = a) : (r = t, n = a), r.startCell.indexOf(":") > -1 || n.indexOf(":") > -1) return va.v; if (e) return eh(n + ":" + r.startCell); var l = n, i = ""; if (n.indexOf("!") > -1) { var o = n.split("!"); i = o[0] + "!", l = o[1] } return eh(i + r.startCell + ":" + l) } !function (e) { var t = function () { }; t.precision = 1e-6, t.create = function (e) { return (new t).setElements(e) }, t.I = function (e) { for (var a, r = [], n = e; n--;)for (a = e, r[n] = []; a--;)r[n][a] = n === a ? 1 : 0; return t.create(r) }, t.prototype = { e: function (e, t) { return e < 1 || e > this.elements.length || t < 1 || t > this.elements[0].length ? null : this.elements[e - 1][t - 1] }, dimensions: function () { var e = 0 === this.elements.length ? 0 : this.elements[0].length; return { rows: this.elements.length, cols: e } }, rows: function () { return this.elements.length }, cols: function () { return 0 === this.elements.length ? 0 : this.elements[0].length }, eql: function (e) { var a = e.elements || e; if (a[0] && void 0 !== a[0][0] || (a = t.create(a).elements), 0 === this.elements.length || 0 === a.length) return this.elements.length === a.length; if (this.elements.length !== a.length) return !1; if (this.elements[0].length !== a[0].length) return !1; for (var r, n = this.elements.length, l = this.elements[0].length; n--;)for (r = l; r--;)if (Math.abs(this.elements[n][r] - a[n][r]) > t.precision) return !1; return !0 }, dup: function () { return t.create(this.elements) }, map: function (e, a) { if (0 === this.elements.length) return t.create([]); for (var r, n = [], l = this.elements.length, i = this.elements[0].length; l--;)for (r = i, n[l] = []; r--;)n[l][r] = e.call(a, this.elements[l][r], l + 1, r + 1); return t.create(n) }, isSameSizeAs: function (e) { var a = e.elements || e; return void 0 === a[0][0] && (a = t.create(a).elements), 0 === this.elements.length ? 0 === a.length : this.elements.length === a.length && this.elements[0].length === a[0].length }, add: function (e) { if (0 === this.elements.length) return this.map((function (e) { return e })); var a = e.elements || e; return void 0 === a[0][0] && (a = t.create(a).elements), this.isSameSizeAs(a) ? this.map((function (e, t, r) { return e + a[t - 1][r - 1] })) : null }, subtract: function (e) { if (0 === this.elements.length) return this.map((function (e) { return e })); var a = e.elements || e; return void 0 === a[0][0] && (a = t.create(a).elements), this.isSameSizeAs(a) ? this.map((function (e, t, r) { return e - a[t - 1][r - 1] })) : null }, canMultiplyFromLeft: function (e) { if (0 === this.elements.length) return !1; var a = e.elements || e; return void 0 === a[0][0] && (a = t.create(a).elements), this.elements[0].length === a.length }, multiply: function (e) { if (0 === this.elements.length) return null; if (!e.elements) return this.map((function (t) { return t * e })); var a = !!e.modulus; if (void 0 === (u = e.elements || e)[0][0] && (u = t.create(u).elements), !this.canMultiplyFromLeft(u)) return null; for (var r, n, l, i = this.elements.length, o = u[0].length, s = this.elements[0].length, c = []; i--;)for (r = o, c[i] = []; r--;) { for (n = s, l = 0; n--;)l += this.elements[i][n] * u[n][r]; c[i][r] = l } var u = t.create(c); return a ? u.col(1) : u }, minor: function (e, a, r, n) { if (0 === this.elements.length) return null; for (var l, i, o, s = [], c = r, u = this.elements.length, d = this.elements[0].length; c--;)for (s[l = r - c - 1] = [], i = n; i--;)o = n - i - 1, s[l][o] = this.elements[(e + l - 1) % u][(a + o - 1) % d]; return t.create(s) }, transpose: function () { if (0 === this.elements.length) return t.create([]); for (var e, a = this.elements.length, r = [], n = this.elements[0].length; n--;)for (e = a, r[n] = []; e--;)r[n][e] = this.elements[e][n]; return t.create(r) }, isSquare: function () { var e = 0 === this.elements.length ? 0 : this.elements[0].length; return this.elements.length === e }, max: function () { if (0 === this.elements.length) return null; for (var e, t = 0, a = this.elements.length, r = this.elements[0].length; a--;)for (e = r; e--;)Math.abs(this.elements[a][e]) > Math.abs(t) && (t = this.elements[a][e]); return t }, indexOf: function (e) { if (0 === this.elements.length) return null; var t, a, r = this.elements.length, n = this.elements[0].length; for (t = 0; t < r; t++)for (a = 0; a < n; a++)if (this.elements[t][a] === e) return { i: t + 1, j: a + 1 }; return null }, diagonal: function () { if (!this.isSquare) return null; for (var e = [], a = this.elements.length, r = 0; r < a; r++)e.push(this.elements[r][r]); return t.create(e) }, toRightTriangular: function () { if (0 === this.elements.length) return t.create([]); var e, a, r, n, l = this.dup(), i = this.elements.length, o = this.elements[0].length; for (a = 0; a < i; a++) { if (0 === l.elements[a][a]) for (r = a + 1; r < i; r++)if (0 !== l.elements[r][a]) { for (e = [], n = 0; n < o; n++)e.push(l.elements[a][n] + l.elements[r][n]); l.elements[a] = e; break } if (0 !== l.elements[a][a]) for (r = a + 1; r < i; r++) { var s = l.elements[r][a] / l.elements[a][a]; for (e = [], n = 0; n < o; n++)e.push(n <= a ? 0 : l.elements[r][n] - l.elements[a][n] * s); l.elements[r] = e } } return l }, determinant: function () { if (0 === this.elements.length) return 1; if (!this.isSquare()) return null; for (var e = this.toRightTriangular(), t = e.elements[0][0], a = e.elements.length, r = 1; r < a; r++)t *= e.elements[r][r]; return t }, isSingular: function () { return this.isSquare() && 0 === this.determinant() }, trace: function () { if (0 === this.elements.length) return 0; if (!this.isSquare()) return null; for (var e = this.elements[0][0], t = this.elements.length, a = 1; a < t; a++)e += this.elements[a][a]; return e }, rank: function () { if (0 === this.elements.length) return 0; for (var e, a = this.toRightTriangular(), r = 0, n = this.elements.length, l = this.elements[0].length; n--;)for (e = l; e--;)if (Math.abs(a.elements[n][e]) > t.precision) { r++; break } return r }, augment: function (e) { if (0 === this.elements.length) return this.dup(); var a = e.elements || e; void 0 === a[0][0] && (a = t.create(a).elements); var r, n = this.dup(), l = n.elements[0].length, i = n.elements.length, o = a[0].length; if (i !== a.length) return null; for (; i--;)for (r = o; r--;)n.elements[i][l + r] = a[i][r]; return n }, inverse: function () { if (0 === this.elements.length) return null; if (!this.isSquare() || this.isSingular()) return null; for (var e, a, r, n, l, i = this.elements.length, o = i, s = this.augment(t.I(i)).toRightTriangular(), c = s.elements[0].length, u = []; o--;) { for (r = [], u[o] = [], n = s.elements[o][o], a = 0; a < c; a++)l = s.elements[o][a] / n, r.push(l), a >= i && u[o].push(l); for (s.elements[o] = r, e = o; e--;) { for (r = [], a = 0; a < c; a++)r.push(s.elements[e][a] - s.elements[o][a] * s.elements[e][o]); s.elements[e] = r } } return t.create(u) }, round: function () { return this.map((function (e) { return Math.round(e) })) }, snapTo: function (e) { return this.map((function (a) { return Math.abs(a - e) <= t.precision ? e : a })) }, setElements: function (e) { var t, a, r = e.elements || e; if (r[0] && void 0 !== r[0][0]) { for (t = r.length, this.elements = []; t--;)for (a = r[t].length, this.elements[t] = []; a--;)this.elements[t][a] = r[t][a]; return this } var n = r.length; for (this.elements = [], t = 0; t < n; t++)this.elements.push([r[t]]); return this } }, e.sylvester_matrix = t }(Xd); var oh = Ss, sh = Rs, ch = ["https://cdn.jsdelivr.net/npm/vue@2.6.11", "https://unpkg.com/vuex@3.4.0", "https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/index.js", "https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts.min.js", "expendPlugins/chart/chartmix.umd.min.js"], uh = ["https://cdn.bootcdn.net/ajax/libs/element-ui/2.13.2/theme-chalk/index.css", "expendPlugins/chart/chartmix.css"]; function dh(e, t) { if (null != e) for (var a = function (a) { var r = e[a]; t && ga.chartparam.insertToStore({ chart_id: r.chart_id, chartOptions: r.chartOptions }); var n = r.chart_id, l = n + "_c", i = $(Gd('', { id: l, addclass: "luckysheet-data-visualization-chart", title: "图表生成", content: "" })).appendTo($(".luckysheet-cell-main")); ph(i), $("#".concat(l)).children(".luckysheet-modal-dialog-content")[0].id = n; var o, s = document.getElementById(l); o = ga.chartparam.getChartJson(r.chart_id), ga.chartparam.renderChart({ chart_id: r.chart_id, chartOptions: o }), ga.currentChart = o, gh(n), $("#".concat(n, "_c .luckysheet-modal-controll-del")).click((function (e) { fh(n) })), $("#".concat(n, "_c .luckysheet-modal-controll-update")).click((function (e) { kh() })), i.children(".luckysheet-modal-dialog-content").mousedown((function (e) { ga.chartparam.luckysheetCurrentChartMaxState || gh(n), e.stopPropagation() })), i.mousedown((function (e) { if (!ga.chartparam.luckysheetCurrentChartMaxState) { gh(n), Il(!0), $(e.target).is(".luckysheet-modal-dialog-controll") || $(e.target).is(".luckysheet-modal-controll-btn") || $(e.target).is("i") || (ga.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout((function () { ga.chartparam.luckysheetCurrentChartMove = !0 }), 100)); var t = ga.chartparam.luckysheetCurrentChartMoveObj.offset(), a = ga.chartparam.luckysheetCurrentChartMoveObj.position(); ga.chartparam.luckysheetCurrentChartMoveXy = [e.pageX - t.left, e.pageY - t.top, a.left, a.top, $("#luckysheet-scrollbar-x").scrollLeft(), $("#luckysheet-scrollbar-y").scrollTop()], ga.chartparam.luckysheetCurrentChartMoveWinH = $("#luckysheet-cell-main")[0].scrollHeight, ga.chartparam.luckysheetCurrentChartMoveWinW = $("#luckysheet-cell-main")[0].scrollWidth, $(e.target).hasClass("luckysheet-mousedown-cancel") || 0 != $(e.target).filter("[class*='sp-palette']").length || 0 != $(e.target).filter("[class*='sp-thumb']").length || 0 != $(e.target).filter("[class*='sp-']").length || ($("#luckysheet-rightclick-menu").hide(), $("#luckysheet-cols-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu").hide(), $("body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu").hide()), e.stopPropagation() } })).find(".luckysheet-modal-dialog-resize-item").mousedown((function (e) { if (ga.chartparam.luckysheetCurrentChartActive) { ga.chartparam.luckysheetCurrentChartResize = $(this).data("type"); var t = $s(e.pageX, e.pageY), a = $("#luckysheet-scrollbar-x").scrollLeft(), r = $("#luckysheet-scrollbar-y").scrollTop(), l = t[0] + a, o = t[1] + r, s = ga.chartparam.luckysheetCurrentChartResizeObj.position(); ga.chartparam.luckysheetCurrentChartResizeXy = [l, o, i.width(), i.height(), s.left + a, s.top + r, a, r], ga.chartparam.luckysheetCurrentChartResizeWinH = $("#luckysheet-cell-main")[0].scrollHeight, ga.chartparam.luckysheetCurrentChartResizeWinW = $("#luckysheet-cell-main")[0].scrollWidth, ga.chartparam.luckysheetCurrentChart = n, e.stopPropagation() } })); var c = r.width, u = r.height, d = r.left, h = r.top; s.style.width = c + "px", s.style.height = u + "px", s.style.position = "absolute", s.style.background = "#fff", s.style.left = d + "px", s.style.top = h + "px", s.style.zIndex = ga.zIndex ? ga.zIndex : 15, ga.zIndex++ }, r = 0; r < e.length; r++)a(r) } function hh(e, t, a, r, n) { var l = ga.currentChart; if (l && 1 == l.rangeArray.length) { var i = l.rangeArray[0].row, o = l.rangeArray[0].column; if (t > i[1] || a < i[0] || r > o[1] || n < o[0]) return; var s = Ih.getcellrange(l.rangeTxt), c = -1 == s.sheetIndex ? 0 : s.sheetIndex, u = (s.row, s.column, eh(l.rangeTxt)); if ("object" === Sa(u) && 0 != u.length && null != u.data.length) { var d = u.data; ga.chartparam.changeChartCellData(l.chart_id, d) } } } function mh(e, t, a, r) { var n = luckysheet.getluckysheet_select_save(); 1 == n.length && n[0].row[0] == n[0].row[1] && n[0].column[0] == n[0].column[1] && (gc("right", "rangeOfSelect"), gc("down", "rangeOfSelect"), n = luckysheet.getluckysheet_select_save()); for (var l = -1, i = n[0].row[1] - n[0].row[0], o = n[0].row[0]; o <= n[0].row[1]; o++) { for (var s = n[0].column[0]; s <= n[0].column[1]; s++) { if (null != (d = Ko(o, s, luckysheet.flowdata())) && d.toString().length > 0) { l = o; break } } if (-1 !== l) break } -1 == l && (l = 0), n[0].row = [l, l], luckysheet.setluckysheet_select_save(n), ga.luckysheet_shiftpositon = $.extend(!0, {}, n[0]), hc("down", "range", !1, i); var c = -1, u = (n = luckysheet.getluckysheet_select_save())[0].column[1] - n[0].column[0]; for (s = n[0].column[0]; s <= n[0].column[1]; s++) { for (o = n[0].row[0]; o <= n[0].row[1]; o++) { var d; if (null != (d = Ko(o, s, luckysheet.flowdata())) && d.toString().length > 0) { c = s; break } } if (-1 !== c) break } -1 == c && (c = 0), n[0].column = [c, c], luckysheet.setluckysheet_select_save(n), ga.luckysheet_shiftpositon = $.extend(!0, {}, n[0]), hc("right", "range", !1, u), n = luckysheet.getluckysheet_select_save(); var h = $.extend(!0, [], n), m = Cl(ga.currentSheetIndex, h[0], ga.currentSheetIndex), p = Wo(); console.dir(p); var f = function (e) { null == e && (e = "chart"); for (var t = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, "").split(""), a = "", r = 0; r < 12; r++)a += t[Math.round(Math.random() * (t.length - 1))]; return e + "_" + a + "_" + (new Date).getTime() }("chart"), g = f + "_c", v = $(Gd('', { id: g, addclass: "luckysheet-data-visualization-chart", title: "图表生成", content: "" })).appendTo($(".luckysheet-cell-main")), y = document.getElementById(g), b = ga.createChart($("#".concat(g)).children(".luckysheet-modal-dialog-content")[0], p, f, h, m), k = b.render, x = b.chart_json; console.dir(JSON.stringify(x)), e = e || 400, t = t || 250, a = a || 0, r = r || 0, y.style.width = e + "px", y.style.height = t + "px", y.style.position = "absolute", y.style.background = "#fff", y.style.left = a + "px", y.style.top = r + "px", k.style.width = "100%", k.style.height = "100%", y.style.zIndex = ga.zIndex ? ga.zIndex : 15, ga.zIndex++; var w = ga.luckysheetfile[_l(ga.currentSheetIndex)]; w.chart || (w.chart = []), w.chart.push({ chart_id: f, width: e, height: t, left: a, top: r, sheetIndex: w.index }), gh(f), $("#".concat(f, "_c .luckysheet-modal-controll-del")).click((function (e) { fh(f) })), ph(v), $("#".concat(f, "_c .luckysheet-modal-controll-update")).click((function (e) { kh() })), v.children(".luckysheet-modal-dialog-content").mousedown((function (e) { ga.chartparam.luckysheetCurrentChartMaxState || gh(f), e.stopPropagation() })), v.mousedown((function (e) { if (!ga.chartparam.luckysheetCurrentChartMaxState) { gh(f), Il(!0), $(e.target).is(".luckysheet-modal-dialog-controll") || $(e.target).is(".luckysheet-modal-controll-btn") || $(e.target).is("i") || (ga.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout((function () { ga.chartparam.luckysheetCurrentChartMove = !0 }), 100)); var t = ga.chartparam.luckysheetCurrentChartMoveObj.offset(), a = ga.chartparam.luckysheetCurrentChartMoveObj.position(); ga.chartparam.luckysheetCurrentChartMoveXy = [e.pageX - t.left, e.pageY - t.top, a.left, a.top, $("#luckysheet-scrollbar-x").scrollLeft(), $("#luckysheet-scrollbar-y").scrollTop()], ga.chartparam.luckysheetCurrentChartMoveWinH = $("#luckysheet-cell-main")[0].scrollHeight, ga.chartparam.luckysheetCurrentChartMoveWinW = $("#luckysheet-cell-main")[0].scrollWidth, $(e.target).hasClass("luckysheet-mousedown-cancel") || 0 != $(e.target).filter("[class*='sp-palette']").length || 0 != $(e.target).filter("[class*='sp-thumb']").length || 0 != $(e.target).filter("[class*='sp-']").length || ($("#luckysheet-rightclick-menu").hide(), $("#luckysheet-cols-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu").hide(), $("body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu").hide()), e.stopPropagation() } })).find(".luckysheet-modal-dialog-resize-item").mousedown((function (e) { if (ga.chartparam.luckysheetCurrentChartActive) { ga.chartparam.luckysheetCurrentChartResize = $(this).data("type"); var t = $s(e.pageX, e.pageY), a = $("#luckysheet-scrollbar-x").scrollLeft(), r = $("#luckysheet-scrollbar-y").scrollTop(), n = t[0] + a, l = t[1] + r, i = ga.chartparam.luckysheetCurrentChartResizeObj.position(); ga.chartparam.luckysheetCurrentChartResizeXy = [n, l, v.width(), v.height(), i.left + a, i.top + r, a, r], ga.chartparam.luckysheetCurrentChartResizeWinH = $("#luckysheet-cell-main")[0].scrollHeight, ga.chartparam.luckysheetCurrentChartResizeWinW = $("#luckysheet-cell-main")[0].scrollWidth, ga.chartparam.luckysheetCurrentChart = f, e.stopPropagation() } })) } function ph(e) { e.find(".luckysheet-modal-dialog-content").hover((function () { e.removeClass("chart-moveable") }), (function () { e.addClass("chart-moveable") })), e.hover((function () { e.addClass("chart-moveable") }), (function () { e.removeClass("chart-moveable") })) } function fh(e) { $(".luckysheet-cell-main #".concat(e, "_c")).remove(), vh(); var t = ga.luckysheetfile[_l(ga.currentSheetIndex)], a = t.chart.findIndex((function (t) { return t.chart_id == e })); t.chart.splice(a, 1), ga.deleteChart(e) } function gh(e) { var t = ga.luckysheetfile[_l(ga.currentSheetIndex)].chart; for (var a in t) t[a].needRangeShow = !1, t[a].chart_id == e && (t[a].needRangeShow = !0, ga.currentChart = ga.getChartJson(e)); yh(e) } function vh() { var e = ga.luckysheetfile[_l(ga.currentSheetIndex)].chart; for (var t in e) e[t].needRangeShow = !1; bh() } function yh(e) { var t = $("#" + e + "_c"); ga.chart_selection.create(), ga.chartparam.luckysheetCurrentChartActive = !0, ga.chartparam.luckysheetCurrentChartMoveObj = t, ga.chartparam.luckysheetCurrentChartResizeObj = t, ga.chartparam.luckysheetCurrentChart = e, $("#luckysheet-cell-main").find(".luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize").hide(), $("#luckysheet-cell-main").find(".luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll").hide(), t.css("z-index", ga.chartparam.luckysheetCurrentChartZIndexRank++), t.find(".luckysheet-modal-dialog-resize").show(), t.find(".luckysheet-modal-dialog-controll").show(), ($(".chartSetting").is(":visible") || ga.chartparam.luckysheet_chart_redo_click) && e != ga.chartparam.luckysheetCurrentChart && $("body .luckysheet-cols-menu").hide(), ga.currentChart = ga.highlightChart(e) } function bh(e) { $("#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll").hide(), $("#luckysheet-cell-main").find(".luckysheet-datavisual-selection-set div").remove(), ga.chartparam.luckysheetCurrentChartActive = !1, $("#luckysheet-chart-rangeShow").empty(), e || !$(".chartSetting").is(":visible") || wa() || function (e) { $(".chartSetting").is(":visible") && ($(".chartSetting").hide(), $("#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll").hide(), $("#luckysheet-cell-main").find(".luckysheet-datavisual-selection-set div").remove(), ga.chartparam.luckysheetCurrentChartActive = !1, wa() || e || setTimeout((function () { Uc() }), 0)) }() } function kh(e, t) { $(".chartSetting").is(":visible") || ($(".chartSetting").show(), $("#luckysheet-cell-main").find(".luckysheet-datavisual-selection-set div").show(), ga.chartparam.luckysheetCurrentChartActive = !0, setTimeout((function () { Uc() }), 0)) } function xh(e) { bh("true"), ga.luckysheetfile.forEach((function (t) { t.index == e ? (t.chart || []).forEach((function (e) { e.isShow = !0, $("#" + e.chart_id + "_c").show(), ga.resizeChart(e.chart_id), 1 == e.needRangeShow && (ga.currentChart = ga.getChartJson(e.chart_id), yh(e.chart_id)) })) : (t.chart || []).forEach((function (e) { e.isShow = !1, $("#" + e.chart_id + "_c").hide() })) })) } var wh = null; function _h(e) { null != ga.flowdata && 0 != ga.flowdata.length && (clearTimeout(wh), wh = setTimeout((function () { ga.clearjfundo && ga.jfredo.push({ type: "zoomChange", zoomRatio: ga.zoomRatio, curZoomRatio: e, sheetIndex: ga.currentSheetIndex }), ga.zoomRatio = e; var t = Sh.getSheetByIndex(); Pc.buildAllPs(t.data), Rc.images = t.images, Rc.allImagesShow(), Rc.init(), null == t.config && (t.config = {}), null == t.config.sheetViewZoom && (t.config.sheetViewZoom = {}); var a = t.config.curentsheetView; null == a && (a = "viewNormal"), t.config.sheetViewZoom[a + "ZoomScale"] = e, pd.saveParam("all", ga.currentSheetIndex, ga.zoomRatio, { k: "zoomRatio" }), pd.saveParam("cg", ga.currentSheetIndex, t.config.sheetViewZoom, { k: "sheetViewZoom" }), Ch() }), 100)) } function Ch() { hd(ga.flowdata.length, ga.flowdata[0].length), jc() } function Th(e) { var t = 1; return e < 50 ? t = Math.round(100 * (1.8 * e / 100 + .1)) / 100 : e > 50 && (t = Math.round(100 * (6 * (e - 50) / 100 + 1)) / 100), t } function Ah(e) { var t = Math.round(100 * e) + "%"; $("#luckysheet-zoom-ratioText").html(t), function (e) { var t = 50; e < 1 ? t = Math.round(100 * (e - .1) / .18) / 10 : e > 1 && (t = Math.round(100 * (e - 1) / .6) / 10 + 50), $("#luckysheet-zoom-cursor").css("left", t - 4) }(e) } var Sh = { generateRandomSheetIndex: function (e) { null == e && (e = "Sheet"); for (var t = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, "").split(""), a = "", r = 0; r < 12; r++)a += t[Math.round(Math.random() * (t.length - 1))]; return e + "_" + a + "_" + (new Date).getTime() }, generateRandomSheetName: function (e, t) { for (var a = e.length, r = gn().pivotTable.title, n = 0; n < e.length; n++)if (e[n].name.indexOf("Sheet") > -1 || e[n].name.indexOf(r) > -1) { var l = parseFloat(e[n].name.replace("Sheet", "").replace(r, "")); "NaN" != l && Math.ceil(l) > a && (a = Math.ceil(l)) } return t ? r + (a + 1) : "Sheet" + (a + 1) }, generateCopySheetName: function (e, t) { var a = "", r = gn().info; if (t.toString().indexOf("(" + r.copy) > -1) { for (var n = t.toString().indexOf("(" + r.copy), l = t.toString().substring(0, n) + "(" + r.copy, i = null, o = 0; o < e.length; o++) { var s = e[o].name.toString(), c = s.indexOf(l); if (c > -1) { var u = s.indexOf(")", c + l.length), d = s.substring(c + l.length, u); ba(d) && (null == i || parseInt(d) > i) && (i = parseInt(d)) } } a = null == i ? l + "2)" : l + ++i + ")" } else { for (var h = null, m = !1, p = t + "(" + r.copy, f = 0; f < e.length; f++) { var g = e[f].name.toString(), v = g.indexOf(p); if (v > -1) { m = !0; var y = g.indexOf(")", v + p.length), b = g.substring(v + p.length, y); ba(b) && (null == h || parseInt(b) > h) && (h = parseInt(b)) } } m ? null == h ? a = t + "(" + r.copy + "2)" : (h++, a = t + "(" + r.copy + h + ")") : a = t + "(" + r.copy + ")" } return a }, getSheetByIndex: function (e) { null == e && (e = ga.currentSheetIndex); var t = this.getSheetIndex(e); return ga.luckysheetfile[t] }, getSheetByName: function (e) { if (null == e) return null; for (var t = 0; t < ga.luckysheetfile.length; t++) { var a = ga.luckysheetfile[t]; if (a.name == e) return a } return null }, getCurSheetnoset: function () { for (var e = 0, t = 0; t < ga.luckysheetfile.length; t++)if (1 == ga.luckysheetfile[t].status) { e = ga.luckysheetfile[t].index; break } return e }, getCurSheet: function () { var e = this; if (ga.luckysheetfile.length) { var t = !1, a = []; ga.luckysheetfile.forEach((function (r) { void 0 === r.index && (r.index = e.generateRandomSheetIndex()), a.includes(r.index) ? r.index = e.generateRandomSheetIndex() : a.push(r.index), void 0 === r.status && (r.status = 0), 1 == r.status && (t ? r.status = 0 : t = !0) })), t || (ga.luckysheetfile[0].status = 1) } ga.currentSheetIndex = ga.luckysheetfile[0].index; for (var r = 0; r < ga.luckysheetfile.length; r++)if (1 == ga.luckysheetfile[r].status) { ga.currentSheetIndex = ga.luckysheetfile[r].index; break } return ga.currentSheetIndex }, addNewSheet: function (e, t) { if (!wa() && !1 !== ga.allowEdit) { var a = ga.luckysheetfile.length, r = this.generateRandomSheetIndex(), n = this.generateRandomSheetName(ga.luckysheetfile, t); $("#luckysheet-sheet-container-c").append(_m(yn, { index: r, active: "", name: n, style: "", colorset: "" })); var l = { name: n, color: "", status: "0", order: a, index: r, celldata: [], row: ga.defaultrowNum, column: ga.defaultcolumnNum, config: {}, pivotTable: null, isPivotTable: !!t }; if (ga.luckysheetfile.push(l), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + r).addClass("luckysheet-sheets-item-active"), $("#luckysheet-cell-main").append('
      '), yd(e), pd.saveParam("sha", null, $.extend(!0, {}, l)), ga.clearjfundo) { ga.jfundo.length = 0; var i = { type: "addSheet" }; i.sheetconfig = $.extend(!0, {}, l), i.index = r, i.currentSheetIndex = ga.currentSheetIndex, ga.jfredo.push(i) } this.changeSheetExec(r, t, !0) } }, setSheetHide: function (e) { var t = this.getSheetIndex(e); ga.luckysheetfile[t].hide = 1; var a, r = $("#luckysheet-sheets-item" + e); if (r.hide(), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), fa.showsheetbarConfig.sheet) a = r.nextAll(":visible"), a = r.nextAll(":visible").length > 0 ? a.eq(0).data("index") : r.prevAll(":visible").eq(0).data("index"); else { var n, l = []; ga.luckysheetfile.forEach((function (e, t) { 1 !== e.hide && l.push(t) })); var i = l.length; n = 1 === i ? l[0] : l[i - 1] > t ? l.find((function (e) { return e > t })) : l[i - 1], a = ga.luckysheetfile[n].index } $("#luckysheet-sheets-item" + a).addClass("luckysheet-sheets-item-active"), this.changeSheetExec(a), pd.saveParam("sh", r.data("index"), 1, { op: "hide", cur: a }) }, setSheetShow: function (e) { ga.luckysheetfile[this.getSheetIndex(e)].hide = 0, this.changeSheetExec(e), pd.saveParam("sh", e, 0, { op: "show", cur: null }) }, sheetMaxIndex: 0, ordersheet: function (e) { return function (t, a) { return t[e] - a[e] } }, getCurrentOrder: function () { var e = {}; return $("#luckysheet-sheet-area div.luckysheet-sheets-item").each((function (t) { for (var a = $(this).data("index"), r = 0; r < ga.luckysheetfile.length; r++)if (ga.luckysheetfile[r].index == a) { e[a.toString()] = t; break } })), e }, reOrderAllSheet: function () { var e = {}; $("#luckysheet-sheet-area div.luckysheet-sheets-item").each((function (t) { for (var a = $(this).data("index"), r = 0; r < ga.luckysheetfile.length; r++)if (ga.luckysheetfile[r].index == a) { ga.luckysheetfile[r].order = t, e[a.toString()] = t; break } })), pd.saveParam("shr", null, e), ga.luckysheetfile.sort((function (e, t) { var a = e.order, r = t.order; return null != a && null != r ? a - r : null != a ? -1 : 1 })) }, createSheet: function () { var e = []; ga.luckysheetfile.sort(this.ordersheet("order")); for (var t = 0; t < ga.luckysheetfile.length; t++) { var a = "", r = ga.luckysheetfile[t].index, n = ""; null != ga.luckysheetfile[t].color && (n = '
      '), ga.currentSheetIndex == r ? e.push(_m(yn, { index: r, active: "luckysheet-sheets-item-active", name: ga.luckysheetfile[t].name, style: "", colorset: n })) : (1 == ga.luckysheetfile[t].hide ? e.push(_m(yn, { index: r, active: "", name: ga.luckysheetfile[t].name, style: "display:none;", colorset: n })) : e.push(_m(yn, { index: r, active: "", name: ga.luckysheetfile[t].name, style: "", colorset: n })), a = "style='display:none;'"), $("#luckysheet-cell-main").append("
      ') } $("#luckysheet-sheet-container-c").append(e.join("")), this.locationSheet() }, locationSheet: function () { var e = $("#luckysheet-sheet-container-c"), t = $("#" + ga.container).width(), a = ($("#luckysheet-sheet-container-c > div.luckysheet-sheets-item-active").eq(0), 0), r = 0; $("#luckysheet-sheet-container-c > div.luckysheet-sheets-item:visible").each((function () { $(this).hasClass("luckysheet-sheets-item-active") && (a = r), r += $(this).outerWidth() })), setTimeout((function () { e.scrollLeft(a - 10), r >= .7 * t && fa.showsheetbarConfig.sheet && ($("#luckysheet-sheet-area .luckysheet-sheets-scroll").css("display", "inline-block"), $("#luckysheet-sheet-container .docs-sheet-fade-left").show()) }), 1) }, copySheet: function (e, t) { if (!wa() && !1 !== ga.allowEdit) { var a = ga.luckysheetfile.length, r = this.generateRandomSheetIndex(), n = this.getSheetIndex(e), l = $.extend(!0, {}, ga.luckysheetfile[n]); l.order = a, l.index = r, l.name = this.generateCopySheetName(ga.luckysheetfile, l.name); var i = ""; null != l.color && (i = '
      '); var o = $("#luckysheet-sheets-item" + e); if ($("#luckysheet-sheet-container-c").append(_m(yn, { index: l.index, active: "", name: l.name, order: l.order, style: "", colorset: i })), $("#luckysheet-sheets-item" + l.index).insertAfter(o), ga.luckysheetfile.splice(n + 1, 0, l), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + r).addClass("luckysheet-sheets-item-active"), $("#luckysheet-cell-main").append('
      '), yd(t), pd.saveParam("shc", r, { copyindex: e, name: l.name }), this.changeSheetExec(r), this.reOrderAllSheet(), ga.clearjfundo) ga.jfredo.push({ type: "copySheet", copyindex: e, index: l.index, sheetIndex: l.index }); else if (ga.jfredo.length > 0) { var s = ga.jfredo[ga.jfredo.length - 1]; "copySheet" == s.type && (s.index = l.index, s.sheetIndex = l.index) } } }, hasSheet: function (e) { return null != e && null != (e = this.getSheetIndex(e)) }, createSheetbydata: function (e, t) { var a = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], r = this, n = ""; if (null != e.color && (n = '
      '), $("#luckysheet-sheet-container-c").append(_m(yn, { index: e.index, active: "", name: e.name, order: e.order, style: "", colorset: n })), a) { var l = e.order; l >= ga.luckysheetfile.length ? (l = ga.luckysheetfile.length - 1, $("#luckysheet-sheets-item" + e.index).insertAfter($("#luckysheet-sheets-item" + ga.luckysheetfile[l].index))) : $("#luckysheet-sheets-item" + e.index).insertBefore($("#luckysheet-sheets-item" + ga.luckysheetfile[l].index)) } ga.luckysheetfile.push(e), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + e.index).addClass("luckysheet-sheets-item-active"), $("#luckysheet-cell-main").append('
      '), yd(), null != t ? (pd.saveParam("shre", null, { reIndex: e.index }), e.hide = 0, pd.saveParam("sh", e.index, 0, { op: "show", cur: null })) : pd.saveParam("sha", null, e), r.changeSheetExec(e.index, e.isPivotTable, !0), r.reOrderAllSheet() }, deleteSheet: function (e) { if (!1 !== ga.allowEdit) { var t = this.getSheetIndex(e); this.setSheetHide(e), $("#luckysheet-sheets-item" + e).remove(), $("#luckysheet-datavisual-selection-set-" + e).remove(); var a = ga.luckysheetfile.splice(t, 1); this.reOrderAllSheet(), pd.saveParam("shd", null, { deleIndex: e }), ga.clearjfundo && (a[0].type = "deleteSheet", ga.jfredo.push(a[0])) } }, nulldata: null, getGridData: function (e) { for (var t = [], a = 0; a < e.length; a++)for (var r = 0; r < e[0].length; r++)null != e[a][r] && t.push({ r: a, c: r, v: e[a][r] }); return t }, buildGridData: function (e) { var t = null == e.row ? ga.defaultrowNum : e.row, a = null == e.column ? ga.defaultcolumnNum : e.column, r = e.data && e.data.length > 0 ? e.data : Zo([], t, a), n = e.celldata; if (e.data && e.data.length > 0) for (var l = 0; l < r.length; l++)for (var i = 0; i < r[0].length; i++)Cs(l, i, r, r[l][i]); else if (n && n.length > 0) for (var o = 0; o < n.length; o++) { var s = n[o], c = s.r, u = s.c, d = s.v; c >= r.length && (r = Zo(r, c - r.length + 1, 0)), u >= r[0].length && (r = Zo(r, 0, u - r[0].length + 1)), Cs(c, u, r, d) } return fa.autoFormatw = !1, fa.accuracy = void 0, r }, cutGridData: function (e) { for (var t = 0, a = e.length - 1; a >= 0; a--) { for (var r = !0, n = 0; n < e[0].length; n++) { var l = Ko(a, n); if (null != l && $.trim(l).length > 0) { r = !1; break } } if (!r) break; t = a } return e.slice(0, t) }, addGridData: function (e, t, a) { var r = Zo([], t, a); if (null != e) for (var n = 0; n < e.length; n++) { var l = e[n], i = l.r, o = l.c, s = l.v; i >= r.length && (r = Zo(r, i - r.length + 1, 0)), o >= r[0].length && (r = Zo(r, 0, o - r[0].length + 1)), Cs(i, o, r, s) } return r }, sheetParamRestore: function (e, t) { if (ga.luckysheet_select_save = e.luckysheet_select_save, null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length || (null != t[0] && null != t[0][0] && null != t[0][0].mc ? ga.luckysheet_select_save = [{ row: [0, t[0][0].mc.rs - 1], column: [0, t[0][0].mc.cs - 1] }] : ga.luckysheet_select_save = [{ row: [0, 0], column: [0, 0] }]), ga.luckysheet_selection_range = null == e.luckysheet_selection_range ? [] : e.luckysheet_selection_range, ga.config = null == e.config ? {} : e.config, ga.zoomRatio = null == e.zoomRatio ? 1 : e.zoomRatio, null != e.defaultRowHeight ? ga.defaultrowlen = parseFloat(e.defaultRowHeight) : ga.defaultrowlen = fa.defaultRowHeight, null != e.defaultColWidth ? ga.defaultcollen = parseFloat(e.defaultColWidth) : ga.defaultcollen = fa.defaultColWidth, null != e.showGridLines) { var a = e.showGridLines; ga.showGridLines = 0 != a && 0 != a } else ga.showGridLines = !0 }, initialjfFile: function (e, t) { var a = this; a.getCurSheet(); var r = ga.luckysheetfile[a.getSheetIndex(ga.currentSheetIndex)]; a.nulldata = Zo([], ga.defaultrowNum, ga.defaultcolumnNum); var n = a.buildGridData(r), l = []; r.jfgird_select_save = r.jfgird_select_save || [], r.jfgird_select_save.forEach((function (e) { return l.push({ row: e.row, column: e.column }) })), r.luckysheet_select_save = l, this.sheetParamRestore(r, n); var i = ga.luckysheet_select_save[0].row[1], o = ga.luckysheet_select_save[0].column[1]; if (ga.luckysheet_select_save.length > 1) for (var s = 0; s < ga.luckysheet_select_save.length; s++)ga.luckysheet_select_save[s].row[1] > i && (i = ga.luckysheet_select_save[s].row[1]), ga.luckysheet_select_save[s].column[1] > o && (o = ga.luckysheet_select_save[s].column[1]); xm.fontInitial(ga.fontList), r.data = n; var c = n.length; i > c - 1 && (c = i + 1); var u = n[0].length; o > u - 1 && (u = o + 1), "function" == typeof fa.beforeCreateDom && fa.beforeCreateDom(luckysheet), "function" == typeof fa.workbookCreateBefore && fa.workbookCreateBefore(luckysheet), bd(u, c, 0, 0, t), setTimeout((function () { fd.createHoverTip("#luckysheet_info_detail", ".luckysheet_info_detail_back, .luckysheet_info_detail_input, .luckysheet_info_detail_update"), fd.createHoverTip("#luckysheet-wa-editor", ".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button"), ga.luckysheetTableContentHW = [$("#luckysheet-cell-main").width() + ga.rowHeaderWidth - ga.cellMainSrollBarSize, $("#luckysheet-cell-main").height() + ga.columnHeaderHeight - ga.cellMainSrollBarSize], $("#luckysheetTableContent, #luckysheetTableContentF").attr({ width: Math.ceil(ga.luckysheetTableContentHW[0] * ga.devicePixelRatio), height: Math.ceil(ga.luckysheetTableContentHW[1] * ga.devicePixelRatio) }).css({ width: ga.luckysheetTableContentHW[0], height: ga.luckysheetTableContentHW[1] }).get(0).getContext("2d"); var e = gn().info, t = pd.gridKey + "__qkcache", n = function () { r.load = "1", a.createSheet(); var t = function () { a.mergeCalculation(r.index), a.setSheetParam(!1), a.storeSheetParam(), a.restoreselect(), a.CacheNotLoadControll = [], a.restoreCache(), Ih.execFunctionGroupForce(fa.forceCalculation), a.restoreSheetAll(ga.currentSheetIndex), $("#luckysheet_info_detail_save").html(e.detailSave), r.isPivotTable ? ga.luckysheetcurrentisPivotTable = !0 : (ga.luckysheetcurrentisPivotTable = !1, $("#luckysheet-modal-dialog-slider-pivot").hide()), function () { var e = fa.showtoolbar, t = fa.showtoolbarConfig, a = ga.toobarObject.toobarWidths = [], r = ga.toobarObject.toobarElements = [], n = ga.toobarObject.toobarConfig = { undo: { ele: "#luckysheet-icon-undo", index: 0 }, redo: { ele: "#luckysheet-icon-redo", index: 1 }, paintFormat: { ele: ["#luckysheet-icon-paintformat", "#toolbar-separator-paint-format"], index: 2 }, currencyFormat: { ele: "#luckysheet-icon-currency", index: 3 }, percentageFormat: { ele: "#luckysheet-icon-percent", index: 4 }, numberDecrease: { ele: "#luckysheet-icon-fmt-decimal-decrease", index: 5 }, numberIncrease: { ele: "#luckysheet-icon-fmt-decimal-increase", index: 6 }, moreFormats: { ele: ["#luckysheet-icon-fmt-other", "#toolbar-separator-more-format"], index: 7 }, font: { ele: ["#luckysheet-icon-font-family", "#toolbar-separator-font-family"], index: 8 }, fontSize: { ele: ["#luckysheet-icon-font-size", "#toolbar-separator-font-size"], index: 9 }, bold: { ele: "#luckysheet-icon-bold", index: 10 }, italic: { ele: "#luckysheet-icon-italic", index: 11 }, strikethrough: { ele: "#luckysheet-icon-strikethrough", index: 12 }, underline: { ele: "#luckysheet-icon-underline", index: 13 }, textColor: { ele: ["#luckysheet-icon-text-color", "#luckysheet-icon-text-color-menu", "#toolbar-separator-text-color"], index: 14 }, fillColor: { ele: ["#luckysheet-icon-cell-color", "#luckysheet-icon-cell-color-menu"], index: 15 }, border: { ele: ["#luckysheet-icon-border-all", "#luckysheet-icon-border-menu"], index: 16 }, mergeCell: { ele: ["#luckysheet-icon-merge-button", "#luckysheet-icon-merge-menu", "#toolbar-separator-merge-cell"], index: 17 }, horizontalAlignMode: { ele: ["#luckysheet-icon-align", "#luckysheet-icon-align-menu"], index: 18 }, verticalAlignMode: { ele: ["#luckysheet-icon-valign", "#luckysheet-icon-valign-menu"], index: 19 }, textWrapMode: { ele: ["#luckysheet-icon-textwrap", "#luckysheet-icon-textwrap-menu"], index: 20 }, textRotateMode: { ele: ["#luckysheet-icon-rotation", "#luckysheet-icon-rotation-menu", "#toolbar-separator-text-rotate"], index: 21 }, image: { ele: "#luckysheet-insertImg-btn-title", index: 22 }, link: { ele: "#luckysheet-insertLink-btn-title", index: 23 }, chart: { ele: "#luckysheet-chart-btn-title", index: 24 }, postil: { ele: "#luckysheet-icon-postil", index: 25 }, pivotTable: { ele: ["#luckysheet-pivot-btn-title", "#toolbar-separator-pivot-table"], index: 26 }, function: { ele: ["#luckysheet-icon-function", "#luckysheet-icon-function-menu"], index: 27 }, frozenMode: { ele: ["#luckysheet-freezen-btn-horizontal", "#luckysheet-icon-freezen-menu"], index: 28 }, sortAndFilter: { ele: "#luckysheet-icon-autofilter", index: 29 }, conditionalFormat: { ele: "#luckysheet-icon-conditionformat", index: 30 }, dataVerification: { ele: "#luckysheet-dataVerification-btn-title", index: 31 }, splitColumn: { ele: "#luckysheet-splitColumn-btn-title", index: 32 }, screenshot: { ele: "#luckysheet-chart-btn-screenshot", index: 33 }, findAndReplace: { ele: "#luckysheet-icon-seachmore", index: 34 }, protection: { ele: "#luckysheet-icon-protection", index: 35 }, print: { ele: "#luckysheet-icon-print", index: 36 } }, l = { undo: !0, redo: !0, paintFormat: !0, currencyFormat: !0, percentageFormat: !0, numberDecrease: !0, numberIncrease: !0, moreFormats: !0, font: !0, fontSize: !0, bold: !0, italic: !0, strikethrough: !0, underline: !0, textColor: !0, fillColor: !0, border: !0, mergeCell: !0, horizontalAlignMode: !0, verticalAlignMode: !0, textWrapMode: !0, textRotateMode: !0, image: !0, link: !0, chart: !0, postil: !0, pivotTable: !0, function: !0, frozenMode: !0, sortAndFilter: !0, conditionalFormat: !0, dataVerification: !0, splitColumn: !0, screenshot: !0, findAndReplace: !0, protection: !0, print: !0 }; if (!e) for (var i in l) l[i] = !1; for (var o in "{}" !== JSON.stringify(t) && (t.hasOwnProperty("undoRedo") && (l.undo = l.redo = t.undoRedo, delete t.undoRedo), Object.assign(l, t)), l) if (l[o]) r.push($.extend(!0, {}, n[o])); else if (n[o].ele instanceof Array) { var s, c = Ma(n[o].ele); try { for (c.s(); !(s = c.n()).done;) { var u = s.value; $(u).remove() } } catch (e) { c.e(e) } finally { c.f() } } else $(n[o].ele).remove(); r.sort((function (e, t) { return e.index > t.index ? 1 : -1 })), r.forEach((function (e, t, n) { n[t] = e.ele, t !== r.length - 1 ? e.ele instanceof Array ? a.push($(e.ele[0]).offset().left) : a.push($(e.ele).offset().left) : e.ele instanceof Array ? (a.push($(e.ele[0]).offset().left), a.push($(e.ele[0]).offset().left + $(e.ele[0]).outerWidth() + 5)) : (a.push($(e.ele).offset().left), a.push($(e.ele).offset().left + $(e.ele).outerWidth() + 5)) })) }(), Uc(), null != r.scrollLeft && r.scrollLeft > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(r.scrollLeft) : $("#luckysheet-scrollbar-x").scrollLeft(0), null != r.scrollTop && r.scrollTop > 0 ? $("#luckysheet-scrollbar-y").scrollTop(r.scrollTop) : $("#luckysheet-scrollbar-y").scrollTop(0), Hm(ga.asyncLoad, "core"), fa.pointEdit ? setTimeout((function () { $("#luckysheetloadingdata").remove() }), 0) : setTimeout((function () { $("#luckysheetloadingdata").fadeOut().remove() }), 500) }, n = pd.loadSheetUrl; if ("" == n) a.loadOtherFile(r), t(); else { for (var l = a.checkLoadSheetIndex(r), i = [], o = 0; o < l.length; o++) { var s = l[o]; s != r.index && i.push(s) } if (0 === i.length) return void t(); $.post(n, { gridKey: pd.gridKey, index: i.join(",") }, (function (e) { var n = new Function("return " + e)(); for (var l in n) if (l != r.index) { var i = ga.luckysheetfile[a.getSheetIndex(l)]; null != i.load && "0" != i.load || (i.celldata = n[l.toString()], i.data = a.buildGridData(i), i.load = "1") } t() })) } }; try { localforage.getItem(t).then((function (e) { null != e && (a.CacheNotLoadControll = e), pd.clearcachelocaldata((function () { n() })) })) } catch (e) { n(), console.log("缓存操作失败") } }), 1) }, storeSheetParam: function () { var e = this.getSheetIndex(ga.currentSheetIndex), t = ga.luckysheetfile[e]; t.config = ga.config, t.visibledatarow = ga.visibledatarow, t.visibledatacolumn = ga.visibledatacolumn, t.ch_width = ga.ch_width, t.rh_height = ga.rh_height, t.luckysheet_select_save = $.extend(!0, [], ga.luckysheet_select_save), t.luckysheet_selection_range = $.extend(!0, [], ga.luckysheet_selection_range), $("#luckysheet-scrollbar-x")[0].scrollWidth > $("#luckysheet-scrollbar-x")[0].offsetWidth && (t.scrollLeft = $("#luckysheet-scrollbar-x").scrollLeft()), $("#luckysheet-scrollbar-y")[0].scrollHeight > $("#luckysheet-scrollbar-y")[0].offsetHeight && (t.scrollTop = $("#luckysheet-scrollbar-y").scrollTop()), t.zoomRatio = ga.zoomRatio }, setSheetParam: function () { var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], t = this.getSheetIndex(ga.currentSheetIndex), a = ga.luckysheetfile[t]; ga.flowdata = a.data, rs.webWorkerFlowDataCache(ga.flowdata), Ih.execFunctionGlobalData = null, window.luckysheet_getcelldata_cache = null, this.sheetParamRestore(a, ga.flowdata), null == a.freezen ? (Bc.freezenhorizontaldata = null, Bc.freezenverticaldata = null) : (Bc.freezenhorizontaldata = null == a.freezen.horizontal ? null : a.freezen.horizontal.freezenhorizontaldata, Bc.freezenverticaldata = null == a.freezen.vertical ? null : a.freezen.vertical.freezenverticaldata), e && So(ga.flowdata.length, ga.flowdata[0].length), Pc.buildAllPs(ga.flowdata), Rc.currentImgId = null, Rc.images = a.images, Rc.allImagesShow(), Rc.init(), $c.dataVerification = a.dataVerification, $c.init(), rd.hyperlink = a.hyperlink, rd.init(), Sc(a.filter_select, a.filter) }, restoreselect: function () { var e = this.getSheetIndex(ga.currentSheetIndex), t = ga.luckysheetfile[e]; Rh(), Eh(), null != t.scrollLeft && t.scrollLeft > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(t.scrollLeft) : $("#luckysheet-scrollbar-x").scrollLeft(0), null != t.scrollTop && t.scrollTop > 0 ? $("#luckysheet-scrollbar-y").scrollTop(t.scrollTop) : $("#luckysheet-scrollbar-y").scrollTop(0) }, storeSheetParamALL: function () { this.storeSheetParam(); var e = this.getSheetIndex(ga.currentSheetIndex); ga.luckysheetfile[e].data = ga.flowdata, ga.luckysheetfile[e].config = $.extend(!0, {}, ga.config) }, mergeCalculationSheet: {}, mergeCalculation: function (e) { var t = ga.luckysheetfile[this.getSheetIndex(e)], a = t.config, r = t.data; if (null != a) { var n = a.merge; if (null != n && !(e in this.mergeCalculationSheet) && !1 !== t.autoCalculationMerge) for (var l in this.mergeCalculationSheet[e] = 1, n) { var i = parseInt(l.substr(0, l.indexOf("_"))), o = parseInt(l.substr(l.indexOf("_") + 1)), s = n[l]; null == r[i][o] && (r[i][o] = {}), r[i][o].mc = { r: i, c: o, rs: s.rs, cs: s.cs }; for (var c = i; c < i + s.rs; c++)for (var u = o; u < o + s.cs; u++)c == i && u == o || (null == r[c][u] && (r[c][u] = {}), r[c][u].mc = { r: i, c: o }) } } }, loadOtherFile: function (e) { for (var t = 0; t < ga.luckysheetfile.length; t++) { var a = ga.luckysheetfile[t]; a.index != e.index && (null != a.load && "0" != a.load || (a.data = this.buildGridData(a), a.load = "1")) } }, changeSheet: function (e, t, a) { if (!wa()) { var r = this; if (e != ga.currentSheetIndex) { pd.allowUpdate && ($("#luckysheet-cell-main #luckysheet-multipleRange-show").empty(), pd.multipleIndex = 0), Nc.createHookFunction("sheetActivate", e, t, a), $("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex + ", #luckysheet-filter-options-sheet" + ga.currentSheetIndex).hide(), $("#luckysheet-filter-selected-sheet" + e + ", #luckysheet-filter-options-sheet" + e).show(), r.storeSheetParamALL(), r.setCurSheet(e); var n = ga.luckysheetfile[r.getSheetIndex(e)]; if (n.isPivotTable ? (ga.luckysheetcurrentisPivotTable = !0, t || Ru.changePivotTable(e)) : (ga.luckysheetcurrentisPivotTable = !1, $("#luckysheet-modal-dialog-slider-pivot").hide(), Uc(!1)), null != n.load) { var l = r.buildGridData(n); n.data = l, r.mergeCalculation(e), r.setSheetParam(!0), r.showSheet(), setTimeout((function () { Ih.execFunctionGroup(), md(), pd.saveParam("shs", null, ga.currentSheetIndex) }), 1) } else { var i = pd.loadSheetUrl; if ("" == i || ga.luckysheetcurrentisPivotTable || a) { var o = r.buildGridData(n); n.data = o, n.load = "1", r.loadOtherFile(n), r.mergeCalculation(e), r.setSheetParam(), r.showSheet(), setTimeout((function () { r.restoreCache(), Ih.execFunctionGroupForce(fa.forceCalculation), r.restoreSheetAll(ga.currentSheetIndex), md() }), 1), pd.saveParam("shs", null, ga.currentSheetIndex) } else { $("#luckysheet-grid-window-1").append(_n()); var s = r.checkLoadSheetIndex(n); $.post(i, { gridKey: pd.gridKey, index: s.join(",") }, (function (t) { var a = new Function("return " + t)(); n.celldata = a[e.toString()]; var l = r.buildGridData(n); for (var i in setTimeout((function () { $("#luckysheetloadingdata").fadeOut().remove() }), 500), a) if (i != e) { var o = ga.luckysheetfile[r.getSheetIndex(i)]; null != o.load && "0" != o.load || (o.celldata = a[i.toString()], o.data = r.buildGridData(o), o.load = "1") } n.data = l, n.load = "1", r.mergeCalculation(e), r.setSheetParam(), r.showSheet(), setTimeout((function () { r.restoreCache(), Ih.execFunctionGroupForce(fa.forceCalculation), r.restoreSheetAll(ga.currentSheetIndex), md() }), 1), pd.saveParam("shs", null, ga.currentSheetIndex) })) } } $("#luckysheet-cell-main .luckysheet-datavisual-selection-set").hide(), $("#luckysheet-datavisual-selection-set-" + e).show(), xh(e), Bc.initialFreezen(e), r.restoreselect() } } }, checkLoadSheetIndexToDataIndex: {}, checkLoadSheetIndex: function (e) { var t = this, a = Ih.getAllFunctionGroup(), r = e.chart, n = e.pivotTable, l = [], i = {}; if (e.index in this.checkLoadSheetIndexToDataIndex) return []; if (l.push(e.index), i[e.index.toString()] = 1, this.checkLoadSheetIndexToDataIndex[e.index] = 1, null != a && function () { for (var e = {}, r = function (r) { var n = a[r], l = n.index, i = Qo(n.r, n.c, l); if (null == i) { var o = ga.luckysheetfile[t.getSheetIndex(l)]; if (o.data = t.buildGridData(o), null == (i = Qo(n.r, n.c, l))) return "continue" } if (-1 == i.indexOf("!")) Ih.addToSheetIndexList(i, l); else if (null != Ih.formulaContainSheetList && null != Ih.formulaContainSheetList[i]) for (var s in Ih.formulaContainSheetList[i]) e[s] = 1; else Ih.functionParser(i, (function (a) { if (Ih.addToCellList(i, a), a.indexOf("!") > -1) { var r = a.substr(0, a.indexOf("!")), n = t.getSheetByName(r); if (null != n) { var l = n.index; e[l] = 1, Ih.addToSheetIndexList(i, l) } } })), null == Ih.formulaContainSheetList[i] && Ih.addToSheetIndexList(i, l); if (null == l) return "continue" }, n = 0; n < a.length; n++)r(n); for (var o in e) { var s = o; null == i[s.toString()] && (l.push(s), i[s.toString()] = 1, t.checkLoadSheetIndexToDataIndex[s] = 1) } }(), null != r) for (var o = 0; o < r.length; o++) { var s = r[o].dataSheetIndex; null != s && (null == i[s.toString()] && (l.push(s), i[s.toString()] = 1)) } if (null != n) { var c = n.pivotDataSheetIndex; null != c && null == i[c.toString()] && (l.push(c), i[c.toString()] = 1) } return l }, showSheet: function () { $("#luckysheet-cell-flow_0").css({ width: ga.ch_width, top: "-1px" }), $("#luckysheet-sheettable_0").css({ width: ga.ch_width - 1, height: ga.rh_height }), $("#luckysheetrowHeader_0").css("height", ga.rh_height), $("#luckysheet-cols-h-cells_0").css("width", ga.ch_width), $("#luckysheet-scrollbar-x div").width(ga.ch_width), $("#luckysheet-scrollbar-y div").height(ga.rh_height + ga.columnHeaderHeight - ga.cellMainSrollBarSize - 3); var e = this.getSheetIndex(ga.currentSheetIndex), t = ga.luckysheetfile[e]; ga.scrollRefreshSwitch = !1, null != t.scrollLeft && t.scrollLeft > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(t.scrollLeft * ga.zoomRatio) : $("#luckysheet-scrollbar-x").scrollLeft(0), null != t.scrollTop && t.scrollTop > 0 ? $("#luckysheet-scrollbar-y").scrollTop(t.scrollTop * ga.zoomRatio) : $("#luckysheet-scrollbar-y").scrollTop(0), setTimeout((function () { ga.scrollRefreshSwitch = !0 }), 0), Ah(ga.zoomRatio) }, setCurSheet: function (e) { for (var t = 0; t < ga.luckysheetfile.length; t++)ga.luckysheetfile[t].index == e ? ga.luckysheetfile[t].status = 1 : ga.luckysheetfile[t].status = 0; ga.currentSheetIndex = e }, getSheetIndex: function (e) { for (var t = 0; t < ga.luckysheetfile.length; t++)if (ga.luckysheetfile[t].index == e) return t; return null }, changeSheetExec: function (e, t, a) { var r = $("#luckysheet-sheets-item" + e); window.luckysheet_getcelldata_cache = null, $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), r.addClass("luckysheet-sheets-item-active").show(), yd(), this.changeSheet(e, t, a), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(), Ih.rangestart && Ih.createRangeHightlight(), this.sheetBarShowAndHide(e) }, sheetArrowShowAndHide: function () { var e = $("#luckysheet-sheet-container").width(), t = 0; $("#luckysheet-sheet-container-c > div.luckysheet-sheets-item:visible").each((function () { t += $(this).outerWidth() })), t >= e ? fa.showsheetbarConfig.sheet && ($("#luckysheet-sheet-area .luckysheet-sheets-scroll").css("display", "inline-block"), $("#luckysheet-sheet-container .docs-sheet-fade-left").show()) : ($("#luckysheet-sheet-area .luckysheet-sheets-scroll").css("display", "none"), $("#luckysheet-sheet-container .docs-sheet-fade-left").hide()) }, sheetBarShowAndHide: function (e) { var t = $("#luckysheet-sheet-container-c"); if (null != e) { var a = $("#luckysheet-sheets-item" + e); t.scrollLeft(a.offset().left) } var r = t.width(), n = t[0].scrollWidth, l = t.scrollLeft(); l <= 0 ? $("#luckysheet-sheet-container .docs-sheet-fade-left").hide() : $("#luckysheet-sheet-container .docs-sheet-fade-left").show(), r + l >= n ? $("#luckysheet-sheet-container .docs-sheet-fade-right").hide() : $("#luckysheet-sheet-container .docs-sheet-fade-right").show() }, delChart: function (e, t) { var a = this.getSheetIndex(t), r = ga.luckysheetfile[a]; if (null == r.chart) r.chart = []; else for (var n = 0; n < r.chart.length; n++)if (r.chart[n].chart_id == e) { ga.luckysheetfile[a].chart.splice(n, 1); break } }, saveChart: function (e) { var t = this.getSheetIndex(e.sheetIndex), a = ga.luckysheetfile[t]; if (null == a.chart) a.chart = [], a.chart.push(e); else { for (var r = 0; r < a.chart.length; r++)if (a.chart[r].chart_id == e.chart_id) { var n = $.extend(!0, {}, a.chart[r]); return void (a.chart[r] = $.extend(!0, {}, n, e)) } a.chart.push(e) } }, getChart: function (e, t) { var a = this.getSheetIndex(e), r = ga.luckysheetfile[a]; if (null == r.chart) return null; for (var n = 0; n < r.chart.length; n++)if (r.chart[n].chart_id == t) return r.chart[n]; return null }, getRangetxt: function (e, t, a) { var r = ""; null == a && (a = ga.currentSheetIndex), e != a && (r = ga.luckysheetfile[this.getSheetIndex(e)].name + "!"); var n = t.row[0], l = t.row[1], i = t.column[0], o = t.column[1]; return null == n && null == l ? r + Im(i) + ":" + Im(o) : null == i && null == o ? r + (n + 1) + ":" + (l + 1) : i == o && n == l ? r + Im(i) + (n + 1) : r + Im(i) + (n + 1) + ":" + Im(o) + (l + 1) }, getSheetName: function (e) { return null == e && (e = ga.currentSheetIndex), ga.luckysheetfile[this.getSheetIndex(e)].name }, getSheetMerge: function () { return null == ga.config.merge ? null : ga.config.merge }, getSheetData: function (e) { return null == e && (e = ga.currentSheetIndex), ga.luckysheetfile[this.getSheetIndex(e)].data }, getSheetConfig: function (e) { return null == e && (e = ga.currentSheetIndex), null == ga.luckysheetfile[this.getSheetIndex(e)].config && (ga.luckysheetfile[this.getSheetIndex(e)].config = {}), ga.luckysheetfile[this.getSheetIndex(e)].config }, restoreFilter: function (e) { var t = this.getSheetIndex(e), a = ga.luckysheetfile[t]; if ("string" == Cm(a.filter_select) && (a.filter_select = JSON.parse(a.filter_select)), null != a.filter_select && null != a.filter_select.row && null != a.filter_select.column) { Sc(a.filter_select), "object" != Cm(a.filter) && null != a.filter && "string" == Cm(a.filter) && (a.filter = JSON.parse(a.filter)); var r = {}; null != a.config && null != a.config.rowhidden && (r = a.config.rowhidden), $("#luckysheet-filter-options-sheet" + e + " .luckysheet-filter-options").each((function (e) { if (null == a.filter) return !1; var t = $(this), n = a.filter[e]; if (null == n) return !0; "object" != Cm(n) && (n = JSON.parse(n)), Cc(t, n.optionstate, n.rowhidden, n.caljs, !1, n.st_r, n.ed_r, n.cindex, n.st_c, n.ed_c), r = $.extend(!0, r, n.rowhidden) })), null == a.config && (a.config = {}), a.config.rowhidden = r, ga.config = a.config, hd(ga.flowdata.length, ga.flowdata[0].length, !1) } }, restorePivot: function (e) { var t = this.getSheetIndex(e); ga.luckysheetfile[t].isPivotTable && (Ru.getCellData(e), Ru.initialPivotManage(!0), Ru.refreshPivotTable(!1)) }, restoreSheetAll: function (e) { this.restorePivot(e), this.restoreFilter(e), this.restoreFreezen(e) }, restoreFreezen: function (e) { Bc.initialFreezen(e) }, restoreCache: function () { var e = this.CacheNotLoadControll; if (this.CacheNotLoadControll = [], 0 != e.length) for (var t = 0; t < e.length; t++) { var a = e[t]; this.execCache(a) } }, CacheNotLoadControll: [], execCache: function (e) { var t = this, a = e.t, r = e.i, n = e.v, l = ga.luckysheetfile[t.getSheetIndex(r)]; if ("sha" == a) ga.luckysheetfile.push(n); else if ("shc" == a) { var i = $.extend(!0, {}, ga.luckysheetfile[t.getSheetIndex(n.copyindex)]); i.index = r, ga.luckysheetfile.push(i) } else if ("shd" == a) ga.luckysheetfile.splice(n.deleIndex, 1); else if ("shr" == a) for (var o in n) ga.luckysheetfile[t.getSheetIndex(o)].order = n[o]; if (null != l && "1" == l.load || a in { sha: 0, shc: 0, shd: 0, shr: 0 }) if ("v" == a) { var s = e.r, c = e.c, u = e.v; t.getSheetData(r); l.data[s][c] = u } else if ("fc" == a) { var d = e.op; e.pos; "object" != Cm(n) && (n = new Function("return " + n)()); var h = n.r, m = n.c; "del" == d ? Ih.delFunctionGroup(h, m, r) : Ih.insertUpdateFunctionGroup(h, m, r) } else if ("cg" == a) { var p = n, f = e.k, g = t.getSheetConfig(r); for (var v in f in g || (g[f] = {}), p) g[f][v] = p[v]; ga.config = g } else if ("f" == a) { var y = n, b = e.op, k = e.pos, x = l.filter; null == x && (x = {}), "upOrAdd" == b ? x[k] = y : "del" == b && delete x[k] } else if ("fsc" == a) l.filter = null, l.filter_select = null; else if ("fsr" == a) { var w = n; l.filter = w.filter, l.filter_select = w.filter_select } else if ("sh" == a) { var _ = e.op, C = e.cur; if ("hide" == _) l.status = 0, ga.luckysheetfile[t.getSheetIndex(C)].status = 1; else if ("show" == _) { for (var T = 0; T < ga.luckysheetfile.length; T++)ga.luckysheetfile[T].status = 0; l.status = 1 } } else if ("all" == a) { var A = e.k; e.s && "object" != Cm(n) ? l[A] = JSON.stringify(n) : l[A] = n } else if ("c" == a) { var S = e.op, I = e.cid; if ("add" == S) l.chart.push(n); else if ("xy" == S || "wh" == S || "update" == S) { for (var R = 0; R < l.chart.length; R++)if (l.chart[R].chart_id == I) { for (var q in l.chart[R]) for (var D in n) q == D && (l.chart[R][q] = n[D]); return } } else if ("del" == S) for (var F = 0; F < l.chart.length; F++)if (l.chart[F].chart_id == I) return void l.chart.splice(F, 1) } else if ("drc" == a) { var E = e.rc, M = n.index, N = n.len, P = l.celldata; if ("r" == E) { for (var z = 0; 0 == P.length; z++) { var L = P[z]; L.r >= M && L.r < M + N ? delete P[z] : L.r >= M + N && (L.r -= N) } l.row -= N } else { for (var O = 0; 0 == P.length; O++) { var B = P[O]; B.c >= M && B.c < M + N ? delete P[O] : B.c >= M + N && (B.c -= N) } l.column -= N } for (var V = [], H = 0; H < P.length; H++)null != P[H] && V.push(P[H]); l.celldata = V, Dc("r" == E ? "row" : "column", M, M + N - 1, !0) } else if ("arc" == a) { var U = e.rc, j = n.index, G = n.len, W = l.celldata; if ("r" == U) { for (var Y = 0; Y < W.length; Y++) { var X = W[Y]; X.r > j && (X.r += G) } l.row += G } else { for (var K = 0; K < W.length; K++) { var Z = W[K]; Z.c > j && (Z.c += G) } l.column += G } qc("r" == U ? "row" : "column", j, G, !0) } else "na" == a ? pd.saveParam("na", null, n) : "thumb" == a && setTimeout((function () { t.imageRequest() }), 2e3); else t.CacheNotLoadControll.push(e) } }, Ih = { error: { v: "#VALUE!", n: "#NAME?", na: "#N/A", r: "#REF!", d: "#DIV/0!", nm: "#NUM!", nl: "#NULL!", sp: "#SPILL!" }, errorInfo: function (e) { return e }, errorParamCheck: function (e, t, a) { var r, n, l = gn().formulaMore; return a < e.length ? (r = e[a].type, n = e[a].require) : (r = e[e.length - 1].type, n = e[e.length - 1].require), "o" != n || null != t && "" != t ? r.indexOf("all") > -1 || r.indexOf("range") > -1 && ("object" == Cm(t) || "array" == Cm(t)) || r.indexOf("number") > -1 && (ba(t) || "boolean" == Cm(t)) || r.indexOf("string") > -1 && "string" == Cm(t) || r.indexOf("date") > -1 && ds(t) ? [!0, l.tipSuccessText] : [!1, l.tipParamErrorText] : [!0, l.tipSuccessText] }, getPureValueByData: function (e) { if (0 == e.length) return []; var t = []; if ("array" == Cm(e)) if ("array" == Cm(e[0])) for (var a = 0; a < e.length; a++) { for (var r = [], n = 0; n < e[0].length; n++) { var l = e[a][n]; "object" == Cm(l) ? r.push(l.v) : r.push(l) } t.push(r) } else for (var i = 0; i < e.length; i++) { var o = e[i]; "object" == Cm(o) ? t.push(o.v) : t.push(o) } else { var s = e; "object" == Cm(s) ? t.push(s.v) : t.push(s) } return t }, readCellDataToOneArray: function (e) { if (null == e) return []; if ("object" != Cm(e)) return [e]; var t = [], a = []; if (null == e || null == e.data) return null == e || ya(e.v) ? [] : [e.v]; if ("array" == Cm(a = e.data)) a = this.getPureValueByData(a); else { if ("object" == Cm(a)) return [a = a.v]; /\{.*?\}/.test(a) && (a = a.replace(/\{/g, "[").replace(/\}/g, "]")), a = new Function("return " + a)() } if ("array" == Cm(a[0])) for (var r = 0; r < a.length; r++)t = t.concat(a[r]); else t = a; return t }, getValueByFuncData: function (e, t) { return null == e ? null : "array" == Cm(e) ? "avg" == t ? luckysheet_function.AVERAGE.f.apply(luckysheet_function.AVERAGE, e) : "sum" == t ? luckysheet_function.SUM.f.apply(luckysheet_function.SUM, e) : "object" == Cm(e[0]) ? luckysheet.mask.getValueByFormat(e[0]) : e[0] : "object" == Cm(e) ? luckysheet.mask.getValueByFormat(e) : e }, sparklinesColorMap: function (e, t) { var a = null; if (null == t && (t = 5), e.length > t) for (var r = t; r < e.length; r++)for (var n = e[r], l = this.readCellDataToOneArray(n), i = 0; i < l.length; i++) { var o = l[i]; if (o.indexOf(":") > -1) { a || (a = {}); var s = o.split(":"); 2 == s.length ? a[s[0]] = s[1] : s.length > 1 && (a[s[0] + ":" + s[1]] = s[2]) } else a || (a = []), a.push(o) } return a }, colorList: ["#2ec7c9", "#fc5c5c", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3", "#e5cf0d", "#97b552", "#95706d", "#dc69aa", "#07a2a4", "#9a7fd1", "#588dd5", "#f5994e", "#c05050", "#59678c", "#c9ab00", "#7eb00a", "#6f5553", "#c14089"], classlist: { province: { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" } }, oldvalue: null, dontupdate: function () { ga.luckysheetCellUpdate.length = 0, $("#luckysheet-functionbox-cell, #luckysheet-rich-text-editor").html(this.oldvalue), this.cancelNormalSelected(), this.rangetosheet != ga.currentSheetIndex && Sh.changeSheetExec(this.rangetosheet) }, fucntionboxshow: function (e, t) { if (pu(e, t, ga.currentSheetIndex)) { var a = ga.flowdata, r = ""; if (null != a[e] && null != a[e][t]) { var n = $.extend(!0, {}, a[e][t]); r = No(n) ? function (e, t) { var a = Ko(e, t, null, "ct"); if (Po(a)) { for (var r = a.s, n = "", l = 0; l < r.length; l++) { var i = r[l]; null != i.v && (n += i.v) } return n } return "" }(e, t) : null != n.f ? Ko(e, t, a, "f") : _s(e, t, a) } this.oldvalue = r, $("#luckysheet-functionbox-cell").html(r) } else $("#luckysheet-functionbox-cell").html("") }, cellOffset: function (e, t, a, r, n) { var l = e.startCell, i = (e.rowl, e.coll, parseInt(l.replace(/[^0-9]/g, ""))), o = Sm(l.replace(/[^A-Za-z]/g, "")), s = [], c = []; s[0] = i + t, c[0] = o + a, s[1] = s[0] + r - 1, c[1] = c[0] + n - 1, c[0] = Im(c[0]), c[1] = Im(c[1]); var u = c[0] + s[0], d = c[1] + s[1]; return u == d ? e.sheetName + "!" + u : e.sheetName + "!" + u + ":" + d }, parseDatetoNum: function (e) { if ("object" == Sa(e) && "number" == typeof e.v) e = e.v; else if ("num" == ps(e)) e = parseFloat(e); else { if ("date" != ps(e)) return this.error.v; e = xs(e)[2] } return e }, getRangeArray: function (e) { var t = [], a = "General"; if (1 == e.length) for (var r = 0; r < e[0].length; r++)if (null != e[0][r] && e[0][r].v) { t.push(e[0][r].v); var n = e[0][r].ct.fa; a = "General" == a ? n : a } else t.push(null); else if (1 == e[0].length) for (var l = 0; l < e.length; l++)if (null != e[l][0] && e[l][0].v) { t.push(e[l][0].v); var i = e[l][0].ct.fa; a = "General" == a ? i : a } else t.push(null); else for (var o = 0; o < e.length; o++)for (var s = 0; s < e[o].length; s++)if (null != e[o][s] && e[o][s].v) { t.push(e[o][s].v); var c = e[o][s].ct.fa; a = "General" == a ? c : a } else t.push(null); return [e = t, a] }, getRangeArrayTwo: function (e) { var t = $.extend(!0, [], e); if (1 == t.length) for (var a = 0; a < t[0].length; a++)t[0][a] instanceof Object && (null != t[0][a] && t[0][a] instanceof Object && t[0][a].m ? t[0][a] = t[0][a].m : null != t[0][a] && t[0][a] instanceof Object && t[0][a].v ? t[0][a] = t[0][a].v : t[0][a] = null); else if (1 == t[0].length) for (var r = 0; r < t.length; r++)t[r][0] instanceof Object && (null != t[r][0] && t[r][0] instanceof Object && t[r][0].m ? t[r][0] = t[r][0].m : null != t[r][0] && t[r][0] instanceof Object && t[r][0].v ? t[r][0] = t[r][0].v : t[r][0] = null); else for (var n = 0; n < t.length; n++)for (var l = 0; l < t[n].length; l++)t[n][l] instanceof Object && (null != t[n][l] && t[n][l] instanceof Object && t[n][l].m ? t[n][l] = t[n][l].m : null != t[n][l] && t[n][l] instanceof Object && t[n][l].v ? t[n][l] = t[n][l].v : t[n][l] = null); return t }, isWildcard: function (e, t) { e = e.toString(), t = t.toString(), this.isCompareOperator(t).flag && (t = this.isCompareOperator(t).num); for (var a = "", r = 0; r < t.length; r++) { var n = t.charAt(r); "*" == n ? a += ".*" : "?" == n ? a += "." : "~" == n ? "*" == t.charAt(r + 1) ? (a += "\\*", r++) : "?" == t.charAt(r + 1) ? (a += "\\?", r++) : a += "~" : a += n } var l = new RegExp("^" + a + "$", "g"); return !!e.match(l) }, isCompareOperator: function (e) { var t = "", a = "", r = (e = e.toString()).substr(0, 1), n = e.substr(1, 1), l = !1; return ">" == r ? "=" == n ? (t = e.substr(0, 2), a = e.substr(2), l = !0) : "=" != n && (t = e.substr(0, 1), a = e.substr(1), l = !0) : "<" == r ? "=" == n || ">" == n ? (t = e.substr(0, 2), a = e.substr(2), l = !0) : "=" != n && ">" != n && (t = e.substr(0, 1), a = e.substr(1), l = !0) : "=" == r && "=" != n && (t = e.substr(0, 1), a = e.substr(1), l = !0), { flag: l, ope: t, num: a } }, acompareb: function (e, t) { var a = !1; if (ba(t)) a = Zd(e, "==", t); else if ("string" == typeof t) { if (-1 != t.indexOf("*") || -1 != t.indexOf("?")) return this.isWildcard(e, t); a = this.isCompareOperator(t).flag ? Zd(e, this.isCompareOperator(t).ope, this.isCompareOperator(t).num) : Zd(e, "==", t) } return a }, compareParams: function (e, t, a) { var r = !1, n = toString.call(e), l = toString.call(t); if ((">" == a && e > t || ">=" == a && e >= t || "<" == a && e < t || "<=" == a && e <= t || "=" == a && e == t || "<>" == a && e != t) && (r = !0), "[object Object]" == n && "[object Object]" == l) { var i = Object.getOwnPropertyNames(e), o = Object.getOwnPropertyNames(t); if (i.length != o.length) return !1; for (var s = 0; s < i.length; s++) { var c = i[s]; if (e[c] !== t[c]) return !1 } return !0 } return "[object Array]" == n && "[object Array]" == l ? e.toString() == t.toString() : r }, parseDecimal: function (e) { e = parseFloat(e); var t = parseInt(e, 10); return 0 == t ? e : e %= t }, getcellrange: function (e, t) { if (null != e && 0 != e.length) { var a = "", r = "", n = null, l = null, i = Tl(); if (e.indexOf("!") > -1) { if (e in this.cellTextToIndexList) return this.cellTextToIndexList[e]; var o = e.split("!"); for (var s in a = o[0], r = o[1], "'" == (a = a.replace(/\\'/g, "'").replace(/''/g, "'")).substr(0, 1) && "'" == a.substr(a.length - 1, 1) && (a = a.substring(1, a.length - 1)), i) if (a == i[s].name) { n = i[s].index, l = i[s].data; break } } else { var c = t; if (null == c && (c = ga.currentSheetIndex), e + "_" + c in this.cellTextToIndexList) return this.cellTextToIndexList[e + "_" + c]; var u = _l(c); a = i[u].name, n = i[u].index, l = ga.flowdata, r = e } if (-1 == r.indexOf(":")) { var d = parseInt(r.replace(/[^0-9]/g, "")) - 1, h = Sm(r.replace(/[^A-Za-z]/g, "")); if (isNaN(d) || isNaN(h)) return null; var m = { row: [d, d], column: [h, h], sheetIndex: n }; return this.addToCellIndexList(e, m), m } r = r.split(":"); var p = [], f = []; if (p[0] = parseInt(r[0].replace(/[^0-9]/g, "")) - 1, p[1] = parseInt(r[1].replace(/[^0-9]/g, "")) - 1, isNaN(p[0]) && (p[0] = 0), isNaN(p[1]) && (p[1] = l.length - 1), p[0] > p[1]) return null; if (f[0] = Sm(r[0].replace(/[^A-Za-z]/g, "")), f[1] = Sm(r[1].replace(/[^A-Za-z]/g, "")), isNaN(f[0]) && (f[0] = 0), isNaN(f[1]) && (f[1] = l[0].length - 1), f[0] > f[1]) return null; var g = { row: p, column: f, sheetIndex: n }; return this.addToCellIndexList(e, g), g } }, rangeHightlightHTML: '
      ', createRangeHightlight: function () { var e = this, t = $("#luckysheet-rich-text-editor").find("span.luckysheet-formula-functionrange-cell"); $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").remove(), t.each((function () { var t = $(this).attr("rangeindex"), a = $(this).text(); $("#luckysheet-formula-functionrange").append(_m(e.rangeHightlightHTML, { id: t })); var r = e.getcellrange(a), n = "luckysheet-formula-functionrange-highlight-" + t; null == r || (r.sheetIndex == ga.currentSheetIndex || -1 == r.sheetIndex && e.rangetosheet == ga.currentSheetIndex) && ($("#" + n).data("range", r).find(".luckysheet-copy").css({ background: Cn[t] }).end().find(".luckysheet-highlight").css({ background: Cn[t] }).end().find(".luckysheet-selection-copy-hc").css({ background: Cn[t] }), function (e, t, a, r, n) { var l = ga.visibledatarow[a], i = t - 1 == -1 ? 0 : ga.visibledatarow[t - 1], o = ga.visibledatacolumn[n], s = r - 1 == -1 ? 0 : ga.visibledatacolumn[r - 1]; $("#" + e).css({ left: s, width: o - s - 1, top: i, height: l - i - 1 }) }(n, r.row[0], r.row[1], r.column[0], r.column[1])) })), $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").show() }, searchHTML: '
      ', helpHTML: '
      SUM ( A2:A100, 101 )
      ${helpExample}
      SUM ( A2:A100, 101 )
      ${helpAbstract}
      ${helpAbstract}
      ${param}
      ', getrangeseleciton: function () { var e = window.getSelection(), t = $(e.anchorNode), a = e.anchorOffset; if (t.parent().is("span") && 0 != a) { var r = $.trim(t.text()); if (0 == r.length && t.parent().prev().length > 0) { var n = t.parent().prev(); return (r = $.trim(n.text())).substr(r.length - 1, 1), n } return r.substr(a - 1, 1), t.parent() } if (t.is("#luckysheet-rich-text-editor") || t.is("#luckysheet-functionbox-cell")) { var l = $.trim(t.find("span").last().text()); if (0 == l.length && t.find("span").length > 1) { var i = t.find("span"); return l = $.trim(i.eq(i.length - 2).text()), i } return t.find("span").last() } if ((t.parent().is("#luckysheet-rich-text-editor") || t.parent().is("#luckysheet-functionbox-cell") || 0 == a) && (0 == a && (t = t.parent()), t.prev().length > 0)) { var o = $.trim(t.prev().text()); o.substr(o.length - 1, 1); return t.prev() } return null }, searchFunctionPosition: function (e, t, a, r, n) { var l = $(window).height(), i = $(window).width(), o = e.outerWidth(), s = e.outerHeight(); null == n && (n = !1); var c = a; c = a + o > i ? a - o + t.outerWidth() : a; var u = r; r + s > l ? u = r - s : (u = r + t.outerHeight(), n || e.html(e.find(".luckysheet-formula-search-item").get().reverse())), u < 0 && (u = 0), c < 0 && (c = 0), e.css({ top: u, left: c }).show() }, searchFunctionCell: null, searchFunction: function (e) { var t = ga.functionlist, a = this.getrangeseleciton(); if (this.searchFunctionCell = a, null != a && null != e) { var r = e.text(), n = a.text().toUpperCase(); if (/^[a-zA-Z]|[a-zA-Z_]+$/.test(n) && "=" == r.substr(0, 1)) { for (var l = { f: [], s: [], t: [] }, i = 0, o = 0; o < t.length; o++) { var s = t[o], c = s.n; if (c == n ? (l.f.unshift(s), i++) : c.substr(0, n.length) == n ? (l.s.unshift(s), i++) : c.indexOf(n) > -1 && (l.t.unshift(s), i++), i >= 10) break } var u = l.t.concat(l.s.concat(l.f)); if (!(u.length <= 0)) { var d = this.searchFunctionHTML(u); $("#luckysheet-formula-search-c").html(d).show(), $("#luckysheet-formula-help-c").hide(); var h = e.parent(), m = h.offset(); this.searchFunctionPosition($("#luckysheet-formula-search-c"), h, m.left, m.top) } } } }, searchFunctionEnter: function (e) { var t = e.data("func"); this.searchFunctionCell.text(t).after('('), this.setCaretPosition(this.searchFunctionCell.next().get(0), 0, 1), $("#luckysheet-formula-search-c").hide(), this.helpFunctionExe(this.searchFunctionCell.closest("div"), this.searchFunctionCell.next()) }, searchFunctionHTML: function (e) { var t = this; 0 == $("#luckysheet-formula-search-c").length && ($("body").append(t.searchHTML), $("#luckysheet-formula-search-c").on("mouseover", ".luckysheet-formula-search-item", (function () { $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").removeClass("luckysheet-formula-search-item-active"), $(this).addClass("luckysheet-formula-search-item-active") })).on("mouseout", ".luckysheet-formula-search-item", (function () { })).on("click", ".luckysheet-formula-search-item", (function () { null != t.searchFunctionCell && t.searchFunctionEnter($(this)) }))); for (var a = '
      ${n}
      ${a}
      ', r = "", n = 0; n < e.length; n++) { var l = e[n]; n == e.length - 1 ? r += _m(a, { class: "luckysheet-formula-search-item-active", n: l.n, a: l.a }) : r += _m(a, { class: "", n: l.n, a: l.a }) } return r }, functionlistPosition: {}, helpFunction: function (e, t, a) { var r = ga.functionlist[this.functionlistPosition[$.trim(t).toUpperCase()]]; if (null != r) { var n = gn().formulaMore; $("#luckysheet-formula-help-c .luckysheet-arguments-help-function-name").html(r.n), $("#luckysheet-formula-help-c .luckysheet-arguments-help-parameter-content").html(r.d); for (var l = "", i = "", o = "", s = 0; s < r.p.length; s++) { var c = r.p[s], u = c.name, d = c.name; "y" == c.repeat && (u += ", ...", d += '...-' + n.allowRepeatText + ""), "o" == c.require && (u = "[" + u + "]", d += '-[' + n.allowOptionText + "]"), l += '' + u + ", ", i += '' + c.example + ", ", o += _m('
      ${param}
      ${content}
      ', { param: d, content: c.detail }) } if (l = l.substr(0, l.length - 2), i = i.substr(0, i.length - 2), $("#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder").html(l), $("#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder").html(i), $("#luckysheet-formula-help-c .luckysheet-formula-help-content-param").html(o), null == a) $("#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name").css("font-weight", "bold"); else { $("#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name").css("font-weight", "normal"); var h = a >= r.p.length ? r.p.length - 1 : a; $("#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter").removeClass("luckysheet-arguments-help-parameter-active"), $("#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter").eq(h).addClass("luckysheet-arguments-help-parameter-active"), $("#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter").removeClass("luckysheet-arguments-help-parameter-active"), $("#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter").eq(h).addClass("luckysheet-arguments-help-parameter-active"), $("#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section").removeClass("luckysheet-arguments-help-parameter-active"), $("#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section").eq(h).addClass("luckysheet-arguments-help-parameter-active") } var m = e.parent(), p = m.offset(); this.searchFunctionPosition($("#luckysheet-formula-help-c"), m, p.left, p.top, !0) } }, helpFunctionExe: function (e, t) { var a = this, r = ga.functionlist, n = gn().formulaMore; if (0 == $("#luckysheet-formula-help-c").length) { $("body").after(_m(a.helpHTML, { helpClose: n.helpClose, helpCollapse: n.helpCollapse, helpExample: n.helpExample, helpAbstract: n.helpAbstract })), $("#luckysheet-formula-help-c .luckysheet-formula-help-close").click((function () { $("#luckysheet-formula-help-c").hide() })), $("#luckysheet-formula-help-c .luckysheet-formula-help-collapse").click((function () { var e = $("#luckysheet-formula-help-c .luckysheet-formula-help-content"); e.slideToggle(100, (function () { var e = a.rangeResizeTo.parent(), t = e.offset(); a.searchFunctionPosition($("#luckysheet-formula-help-c"), e, t.left, t.top, !0) })), e.is(":hidden") ? $(this).html('') : $(this).html('') })); for (var l = 0; l < r.length; l++)a.functionlistPosition[r[l].n] = l } if (t) { var i = t, o = (e.length, e.find("span")), s = t.index(), c = s; if (null != i) { var u = null, d = null; if (o.eq(c).is(".luckysheet-formula-text-func")) u = o.eq(c).text(); else for (var h = null, m = [-1, -1]; --c > 0;)if ((h = o.eq(c)).is(".luckysheet-formula-text-func") || $.trim(h.text()).toUpperCase() in a.functionlistPosition) { u = h.text(), d = null; for (var p = !0, f = c; f <= s; f++)if (d || (d = 0), !(f >= m[0] && f <= m[1])) { if ((h = o.eq(f)).is(".luckysheet-formula-text-rpar")) { m = [c, f], u = null, p = !1; break } h.is(".luckysheet-formula-text-comma") && d++ } if (p) break } null != u && a.helpFunction(e, u, d) } } }, rangeHightlightselected: function (e, t) { var a = this.getrangeseleciton(); if ($("#luckysheet-formula-search-c, #luckysheet-formula-help-c").hide(), $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-hc").css("opacity", "0.03"), $("#luckysheet-formula-search-c, #luckysheet-formula-help-c").hide(), this.helpFunctionExe(e, a), 0 != $(a).closest(".luckysheet-formula-functionrange-cell").length) { var r = $(a).closest(".luckysheet-formula-functionrange-cell").attr("rangeindex"); $("#" + ("luckysheet-formula-functionrange-highlight-" + r)).find(".luckysheet-selection-copy-hc").css({ opacity: "0.13" }) } else this.searchFunction(e) }, updatecell: function (e, t, a) { var r = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], n = this, l = $("#luckysheet-rich-text-editor"), i = l.text(), o = l.html(); if (null != n.rangetosheet && n.rangetosheet != ga.currentSheetIndex && Sh.changeSheetExec(n.rangetosheet), mu(e, t, ga.currentSheetIndex)) { if (null != $c.dataVerification) { var s = $c.dataVerification[e + "_" + t]; if (null != s && s.prohibitInput && !$c.validateCellData(i, s)) { var c = $c.getFailureText(s); return fd.info(c, ""), void n.cancelNormalSelected() } } var u = ga.flowdata[e][t], d = JSON.stringify(u), h = No(u), m = "=" != i.slice(0, 1) && " 0) { var f = i.replace(/\r\n/g, "_x000D_").replace(/ /g, "_x000D_").replace(/\r/g, "_x000D_").replace(/\n/g, "_x000D_").split("_x000D_"); f.length > 1 && (p = !0, m = !0, i = f.join("\r\n")) } if (a || m || !h ? m && ("object" != Cm(u) && (u = {}), delete u.f, delete u.v, delete u.m, null == u.ct && (u.ct = {}, u.ct.fa = "General"), u.ct.t = "inlineStr", u.ct.s = Bo(l.find("span")), p && (u.ct.s = [{ v: i }])) : (delete u.ct.s, u.ct.t = "g", u.ct.fa = "General", a = ""), a = a || l.text(), Nc.createHookFunction("cellUpdateBefore", e, t, a, r)) { if (!m) { if (ya(a) && !h) { if (null == u || ya(u.v) && null == u.spl && null == u.f) return void n.cancelNormalSelected() } else if (null != u && 1 != u.qp) { if ("object" == Cm(u) && (a == u.f || a == u.v || a == u.m)) return void n.cancelNormalSelected(); if (a == u) return void n.cancelNormalSelected() } "string" == Cm(a) && "=" == a.slice(0, 1) && a.length > 1 || "object" != Cm(u) || null == u.ct || null == u.ct.fa || "@" == u.ct.fa || ya(a) || (delete u.m, null != u.f && (delete u.f, delete u.spl)) } window.luckysheet_getcelldata_cache = null; var g = !0, v = rs.deepCopyFlowData(ga.flowdata), y = null; if ("object" == Cm(u)) { if (!m) if ("string" == Cm(a) && "=" == a.slice(0, 1) && a.length > 1) { var b = n.execfunction(a, e, t, void 0, !0); if (g = !1, (u = $.extend(!0, {}, v[e][t])).v = b[1], u.f = b[2], 4 == b.length && "sparklines" == b[3].type) { delete u.m, delete u.v; var k = b[3].data; "array" == Cm(k) && "object" != Cm(k[0]) ? u.v = k[0] : u.spl = b[3].data } else 4 == b.length && "dynamicArrayItem" == b[3].type && (y = b[3].data) } else if ("object" == Cm(a)) { var x = a.f; if ("string" == Cm(x) && "=" == x.slice(0, 1) && x.length > 1) { var w = n.execfunction(x, e, t, void 0, !0); if (g = !1, (u = $.extend(!0, {}, v[e][t])).v = w[1], u.f = w[2], 4 == w.length && "sparklines" == w[3].type) { delete u.m, delete u.v; var _ = w[3].data; "array" == Cm(_) && "object" != Cm(_[0]) ? u.v = _[0] : u.spl = w[3].data } else 4 == w.length && "dynamicArrayItem" == w[3].type && (y = w[3].data) } else for (var C in a) u[C] = a[C] } else n.delFunctionGroup(e, t), n.execFunctionGroup(e, t, a), g = !1, (u = $.extend(!0, {}, v[e][t])).v = a, delete u.f, delete u.spl, 1 == u.qp && "'" != ("" + a).substr(0, 1) && (u.qp = 0, null != u.ct && (u.ct.fa = "General", u.ct.t = "n")); a = u } else if ("string" == Cm(a) && "=" == a.slice(0, 1) && a.length > 1) { var T = n.execfunction(a, e, t, void 0, !0); if (g = !1, a = { v: T[1], f: T[2] }, 4 == T.length && "sparklines" == T[3].type) { var A = T[3].data; "array" == Cm(A) && "object" != Cm(A[0]) ? a.v = A[0] : a.spl = T[3].data } else 4 == T.length && "dynamicArrayItem" == T[3].type && (y = T[3].data) } else if ("object" == Cm(a)) { var S = a.f; if ("string" == Cm(S) && "=" == S.slice(0, 1) && S.length > 1) { var I = n.execfunction(S, e, t, void 0, !0); if (g = !1, a.v = I[1], a.f = I[2], 4 == I.length && "sparklines" == I[3].type) { var R = I[3].data; "array" == Cm(R) && "object" != Cm(R[0]) ? a.v = R[0] : a.spl = I[3].data } else 4 == I.length && "dynamicArrayItem" == I[3].type && (y = I[3].data) } else { var q = u; null == a.v && (a.v = q) } } else n.delFunctionGroup(e, t), n.execFunctionGroup(e, t, a), g = !1; Cs(e, t, v, a), n.cancelNormalSelected(); var D = !1, F = $.extend(!0, {}, Tl()[_l(ga.currentSheetIndex)].config); if (null == F.rowlen && (F.rowlen = {}), "2" == v[e][t].tb && null != v[e][t].v || No(v[e][t])) { var E = ga.defaultrowlen, M = $("#luckysheetTableContent").get(0).getContext("2d"); if (F.customHeight && 1 == F.customHeight[e]); else { var N = Is(t)[1] - Is(t)[0] - 2, P = Es(v[e][t], M, { r: e, c: t, cellWidth: N }), z = E; null != P && (z = P.textHeightAll + 2), z > E && (F.rowlen[e] = z, D = !0) } } var L = null; y && (L = $.extend(!0, [], this.insertUpdateDynamicArray(y))); var O = { dynamicArray: L }; if (D && (O = { cfg: F, dynamicArray: L, RowlChange: D }), setTimeout((function () { Nc.createHookFunction("cellUpdated", e, t, JSON.parse(d), ga.flowdata[e][t], r) }), 0), !r) return { data: v, allParam: O }; id(v, [{ row: [e, e], column: [t, t] }], O, g), n.execFunctionGlobalData = null } else n.cancelNormalSelected() } }, cancelNormalSelected: function () { this.canceFunctionrangeSelected(), $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").remove(), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-input-box-index").hide(), $("#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm").removeClass("luckysheet-wa-calculate-active"), this.rangestart = !1, this.rangedrag_column_start = !1, this.rangedrag_row_start = !1 }, canceFunctionrangeSelected: function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show, #luckysheet-column-count-show").hide(), $("#luckysheet-formula-search-c, #luckysheet-formula-help-c").hide() }, iscellformat: function (e) { }, iscelldata: function (e) { var t, a = e.split("!"), r = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+))))$/g; if (-1 == (t = a.length > 1 ? a[1] : a[0]).indexOf(":")) { var n = parseInt(t.replace(/[^0-9]/g, "")) - 1, l = Sm(t.replace(/[^A-Za-z]/g, "")); return !(isNaN(n) || isNaN(l) || !t.toString().match(/^(([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+))$/g)) || !!isNaN(n) && (isNaN(l), !1) } r = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+)))|((([0-9]+)|([$][0-9]+s))))$/g, t = t.split(":"); var i = [], o = []; return i[0] = parseInt(t[0].replace(/[^0-9]/g, "")) - 1, i[1] = parseInt(t[1].replace(/[^0-9]/g, "")) - 1, !(i[0] > i[1]) && (o[0] = Sm(t[0].replace(/[^A-Za-z]/g, "")), o[1] = Sm(t[1].replace(/[^A-Za-z]/g, "")), !(o[0] > o[1]) && !(!t[0].toString().match(r) || !t[1].toString().match(r))) }, operator: "==|!=|<>|<=|>=|=|+|-|>|<|/|*|%|&|^", operatorjson: null, functionCopy: function (e, t, a) { if (null == this.operatorjson) { for (var r = this.operator.split("|"), n = {}, l = 0; l < r.length; l++)n[r[l].toString()] = 1; this.operatorjson = n } null == t && (t = "down"), null == a && (a = 1), "=" == e.substr(0, 1) && (e = e.substr(1)); for (var i = e.split(""), o = 0, s = "", c = "", u = { bracket: 0, comma: 0, squote: 0, dquote: 0 }; o < i.length;) { var d = i[o]; if ("(" == d && 0 == u.dquote) u.bracket += 1, s.length > 0 ? c += s + "(" : c += "(", s = ""; else if (")" == d && 0 == u.dquote) u.bracket -= 1, c += this.functionCopy(s, t, a) + ")", s = ""; else if ('"' == d && 0 == u.squote) u.dquote > 0 ? (c += s + '"', u.dquote -= 1, s = "") : (u.dquote += 1, s += '"'); else if ("," == d && 0 == u.dquote) c += this.functionCopy(s, t, a) + ",", s = ""; else if ("&" == d && 0 == u.dquote) s.length > 0 ? (c += this.functionCopy(s, t, a) + "&", s = "") : c += "&"; else if (d in this.operatorjson && 0 == u.dquote) { var h = ""; o + 1 < i.length && (h = i[o + 1]); var m = o - 1, p = null; if (m >= 0) do { p = i[m--] } while (m >= 0 && " " == p); d + h in this.operatorjson ? (s.length > 0 ? (c += this.functionCopy(s, t, a) + d + h, s = "") : c += d + h, o++) : /[^0-9]/.test(h) || "-" != d || "(" != p && null != p && "," != p && " " != p && !(p in this.operatorjson) ? s.length > 0 ? (c += this.functionCopy(s, t, a) + d, s = "") : c += d : s += d } else s += d; o == i.length - 1 && (this.iscelldata($.trim(s)) ? "down" == t ? c += this.downparam($.trim(s), a) : "up" == t ? c += this.upparam($.trim(s), a) : "left" == t ? c += this.leftparam($.trim(s), a) : "right" == t && (c += this.rightparam($.trim(s), a)) : c += $.trim(s)), o++ } return c }, isfreezonFuc: function (e) { var t = e.replace(/[^0-9]/g, ""), a = e.replace(/[^A-Za-z]/g, ""), r = e.substr(e.indexOf(t) - 1, 1), n = e.substr(e.indexOf(a) - 1, 1), l = [!1, !1]; return "$" == r && (l[0] = !0), "$" == n && (l[1] = !0), l }, setfreezonFuceExe: function (e) { var t = parseInt(e.replace(/[^0-9]/g, "")), a = Sm(e.replace(/[^A-Za-z]/g, "")); return isNaN(t) || isNaN(a) ? isNaN(t) ? isNaN(a) ? e : "$" + Im(a) : "$" + t : "$" + Im(a) + "$" + t }, setfreezonFuc: function (e) { var t = this.getrangeseleciton(); if (this.iscelldata(t.text())) { var a, r = t.text(), n = window.getSelection().anchorOffset, l = r.split("!"), i = ""; l.length > 1 ? (a = l[1], i = l[0] + "!") : a = l[0]; var o = "", s = "", c = a.indexOf(":"); if (-1 == c) s = (o = i + this.setfreezonFuceExe(a)).length; else if (a = a.split(":"), n > c) { var u = i + a[0] + ":" + this.setfreezonFuceExe(a[1]); o = u, s = u.length } else { var d = i + this.setfreezonFuceExe(a[0]); o = d + ":" + a[1], s = d.length } t.text(i + o), this.setCaretPosition(t.get(0), 0, s) } }, updateparam: function (e, t, a) { var r, n = t.split("!"), l = ""; if (n.length > 1 ? (r = n[1], l = n[0] + "!") : r = n[0], -1 == r.indexOf(":")) { var i = parseInt(r.replace(/[^0-9]/g, "")), o = Sm(r.replace(/[^A-Za-z]/g, "")), s = this.isfreezonFuc(r), c = s[0] ? "$" : "", u = s[1] ? "$" : ""; return "u" != e || s[0] ? "r" != e || s[1] ? "l" != e || s[1] ? "d" != e || s[0] || (i += a) : o -= a : o += a : i -= a, i[0] < 0 || o[0] < 0 ? this.error.r : isNaN(i) || isNaN(o) ? isNaN(i) ? isNaN(o) ? t : l + u + Im(o) : l + c + i : l + u + Im(o) + c + i } r = r.split(":"); var d = [], h = []; if (d[0] = parseInt(r[0].replace(/[^0-9]/g, "")), d[1] = parseInt(r[1].replace(/[^0-9]/g, "")), d[0] > d[1]) return t; if (h[0] = Sm(r[0].replace(/[^A-Za-z]/g, "")), h[1] = Sm(r[1].replace(/[^A-Za-z]/g, "")), h[0] > h[1]) return t; var m = this.isfreezonFuc(r[0]), p = this.isfreezonFuc(r[1]), f = m[0] ? "$" : "", g = m[1] ? "$" : "", v = p[0] ? "$" : "", y = p[1] ? "$" : ""; return "u" == e ? (m[0] || (d[0] -= a), p[0] || (d[1] -= a)) : "r" == e ? (m[1] || (h[0] += a), p[1] || (h[1] += a)) : "l" == e ? (m[1] || (h[0] -= a), p[1] || (h[1] -= a)) : "d" == e && (m[0] || (d[0] += a), p[0] || (d[1] += a)), d[0] < 0 || h[0] < 0 ? this.error.r : isNaN(h[0]) && isNaN(h[1]) ? l + f + d[0] + ":" + v + d[1] : isNaN(d[0]) && isNaN(d[1]) ? l + g + Im(h[0]) + ":" + y + Im(h[1]) : l + g + Im(h[0]) + f + d[0] + ":" + y + Im(h[1]) + v + d[1] }, downparam: function (e, t) { return this.updateparam("d", e, t) }, upparam: function (e, t) { return this.updateparam("u", e, t) }, leftparam: function (e, t) { return this.updateparam("l", e, t) }, rightparam: function (e, t) { return this.updateparam("r", e, t) }, functionStrChange: function (e, t, a, r, n, l) { if (null == this.operatorjson) { for (var i = this.operator.split("|"), o = {}, s = 0; s < i.length; s++)o[i[s].toString()] = 1; this.operatorjson = o } "=" == e.substr(0, 1) && (e = e.substr(1)); for (var c = e.split(""), u = 0, d = "", h = "", m = { bracket: 0, comma: 0, squote: 0, dquote: 0 }; u < c.length;) { var p = c[u]; if ("(" == p && 0 == m.dquote) m.bracket += 1, d.length > 0 ? h += d + "(" : h += "(", d = ""; else if (")" == p && 0 == m.dquote) m.bracket -= 1, h += this.functionStrChange(d, t, a, r, n, l) + ")", d = ""; else if ('"' == p && 0 == m.squote) m.dquote > 0 ? (h += d + '"', m.dquote -= 1, d = "") : (m.dquote += 1, d += '"'); else if ("," == p && 0 == m.dquote) h += this.functionStrChange(d, t, a, r, n, l) + ",", d = ""; else if ("&" == p && 0 == m.dquote) d.length > 0 ? (h += this.functionStrChange(d, t, a, r, n, l) + "&", d = "") : h += "&"; else if (p in this.operatorjson && 0 == m.dquote) { var f = ""; u + 1 < c.length && (f = c[u + 1]); var g = u - 1, v = null; if (g >= 0) do { v = c[g--] } while (g >= 0 && " " == v); p + f in this.operatorjson ? (d.length > 0 ? (h += this.functionStrChange(d, t, a, r, n, l) + p + f, d = "") : h += p + f, u++) : /[^0-9]/.test(f) || "-" != p || "(" != v && null != v && "," != v && " " != v && !(v in this.operatorjson) ? d.length > 0 ? (h += this.functionStrChange(d, t, a, r, n, l) + p, d = "") : h += p : d += p } else d += p; u == c.length - 1 && (this.iscelldata($.trim(d)) ? h += this.functionStrChange_range($.trim(d), t, a, r, n, l) : h += $.trim(d)), u++ } return h }, functionStrChange_range: function (e, t, a, r, n, l) { var i, o, s, c, u, d, h, m, p, f = e.split("!"), g = ""; if (f.length > 1 ? (i = f[1], g = f[0] + "!") : i = f[0], -1 == i.indexOf(":")) { o = s = parseInt(i.replace(/[^0-9]/g, "")) - 1, c = u = Sm(i.replace(/[^A-Za-z]/g, "")); var v = this.isfreezonFuc(i); d = h = v[0] ? "$" : "", m = p = v[1] ? "$" : "" } else { if (i = i.split(":"), (o = parseInt(i[0].replace(/[^0-9]/g, "")) - 1) > (s = parseInt(i[1].replace(/[^0-9]/g, "")) - 1)) return e; if ((c = Sm(i[0].replace(/[^A-Za-z]/g, ""))) > (u = Sm(i[1].replace(/[^A-Za-z]/g, "")))) return e; var y = this.isfreezonFuc(i[0]); d = y[0] ? "$" : "", m = y[1] ? "$" : ""; var b = this.isfreezonFuc(i[1]); h = b[0] ? "$" : "", p = b[1] ? "$" : "" } if ("del" == t) { if ("row" == a) { if (o >= n && s <= n + l - 1) return this.error.r; o > n + l - 1 ? o -= l : o >= n && (o = n), s > n + l - 1 ? s -= l : s >= n && (s = n - 1), o < 0 && (o = 0), s < o && (s = o) } else if ("col" == a) { if (c >= n && u <= n + l - 1) return this.error.r; c > n + l - 1 ? c -= l : c >= n && (c = n), u > n + l - 1 ? u -= l : u >= n && (u = n - 1), c < 0 && (c = 0), u < c && (u = c) } return o == s && c == u ? isNaN(o) || isNaN(c) ? isNaN(o) ? isNaN(c) ? e : g + m + Im(c) : g + d + (o + 1) : g + m + Im(c) + d + (o + 1) : isNaN(c) && isNaN(u) ? g + d + (o + 1) + ":" + h + (s + 1) : isNaN(o) && isNaN(s) ? g + m + Im(c) + ":" + p + Im(u) : g + m + Im(c) + d + (o + 1) + ":" + p + Im(u) + h + (s + 1) } if ("add" == t) return "row" == a ? "lefttop" == r ? (o >= n && (o += l), s >= n && (s += l)) : "rightbottom" == r && (o > n && (o += l), s > n && (s += l)) : "col" == a && ("lefttop" == r ? (c >= n && (c += l), u >= n && (u += l)) : "rightbottom" == r && (c > n && (c += l), u > n && (u += l))), o == s && c == u ? isNaN(o) || isNaN(c) ? isNaN(o) ? isNaN(c) ? e : g + m + Im(c) : g + d + (o + 1) : g + m + Im(c) + d + (o + 1) : isNaN(c) && isNaN(u) ? g + d + (o + 1) + ":" + h + (s + 1) : isNaN(o) && isNaN(s) ? g + m + Im(c) + ":" + p + Im(u) : g + m + Im(c) + d + (o + 1) + ":" + p + Im(u) + h + (s + 1) }, israngeseleciton: function (e) { if (null == this.operatorjson) { for (var t = this.operator.split("|"), a = {}, r = 0; r < t.length; r++)a[t[r].toString()] = 1; this.operatorjson = a } null == e && (e = !1); var n = window.getSelection(), l = $(n.anchorNode), i = n.anchorOffset; if (l.parent().is("span") && 0 != i) { var o = $.trim(l.text()), s = ""; if (0 == o.length && l.parent().prev().length > 0) { var c = l.parent().prev(); s = (o = $.trim(c.text())).substr(o.length - 1, 1), this.rangeSetValueTo = c } else s = o.substr(i - 1, 1), this.rangeSetValueTo = l.parent(); if (e && ("(" == s || "," == s) || !e && ("(" == s || "," == s || "=" == s || s in this.operatorjson || "&" == s)) return !0 } else if (l.is("#luckysheet-rich-text-editor") || l.is("#luckysheet-functionbox-cell")) { var u, d = $.trim(l.find("span").last().text()); if (this.rangeSetValueTo = l.find("span").last(), 0 == d.length && l.find("span").length > 1) { var h = l.find("span"); d = $.trim(h.eq(h.length - 2).text()), this.rangeSetValueTo = h } if (u = d.substr(d.length - 1, 1), e && ("(" == u || "," == u) || !e && ("(" == u || "," == u || "=" == u || u in this.operatorjson || "&" == u)) return !0 } else if ((l.parent().is("#luckysheet-rich-text-editor") || l.parent().is("#luckysheet-functionbox-cell") || 0 == i) && (0 == i && (l = l.parent()), l.prev().length > 0)) { var m = $.trim(l.prev().text()), p = m.substr(m.length - 1, 1); if (this.rangeSetValueTo = l.prev(), e && ("(" == p || "," == p) || !e && ("(" == p || "," == p || "=" == p || p in this.operatorjson || "&" == p)) return !0 } return !1 }, rangechangeindex: null, rangestart: !1, rangetosheet: null, rangeSetValueTo: null, func_selectedrange: {}, rangeSetValue: function (e, t) { var a, r = "", n = e.row[0], l = e.column[0]; if (r = null != ga.config.merge && n + "_" + l in ga.config.merge ? Cl(ga.currentSheetIndex, { column: [l, l], row: [n, n] }, this.rangetosheet) : Cl(ga.currentSheetIndex, e, this.rangetosheet), this.rangestart || this.rangedrag_column_start || this.rangedrag_row_start) if ($("#luckysheet-search-formula-parm").is(":visible") || $("#luckysheet-search-formula-parm-select").is(":visible")) { a = $("#luckysheet-rich-text-editor"), $("#luckysheet-search-formula-parm-select-input").val(r), $("#luckysheet-search-formula-parm .parmBox").eq(this.data_parm_index).find(".txt input").val(r); var i = eh(r).data; if (i instanceof Array) { for (var o = [], s = 0; s < i.length; s++)for (var c = 0; c < i[s].length; c++)null == i[s][c] ? o.push(null) : o.push(i[s][c].v); $("#luckysheet-search-formula-parm .parmBox").eq(this.data_parm_index).find(".val").text(" = {" + o.join(",") + "}") } else $("#luckysheet-search-formula-parm .parmBox").eq(this.data_parm_index).find(".val").text(" = {" + i.v + "}"); var u, d = !0, h = [], m = -1; if ($("#luckysheet-search-formula-parm .parmBox").each((function (e, t) { var a = $(t).find(".txt input").val(); "" == a && "m" == $(t).find(".txt input").attr("data_parm_require") && (d = !1), "" != a && (m = e) })), -1 == m) u = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "()"; else if (0 == m) u = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + $("#luckysheet-search-formula-parm .parmBox").eq(0).find(".txt input").val() + ")"; else { for (var p = 0; p <= m; p++)h.push($("#luckysheet-search-formula-parm .parmBox").eq(p).find(".txt input").val()); u = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + h.join(",") + ")" } var f = this.functionHTMLGenerate(u); if ($("#luckysheet-rich-text-editor").html(f), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), d) { var g = $.trim(this.functionParserExe($("#luckysheet-rich-text-editor").text())), v = new Function("return " + g)(); $("#luckysheet-search-formula-parm .result span").text(v) } } else { var y = window.getSelection().anchorNode, b = (a = $(y).closest("div")).find("span[rangeindex='" + this.rangechangeindex + "']").html(r); this.setCaretPosition(b.get(0), 0, r.length) } else { var k = '' + r + ""; $(k).insertAfter(this.rangeSetValueTo); this.rangechangeindex = this.functionHTMLIndex, a = $(this.rangeSetValueTo).closest("div"), this.setCaretPosition(a.find("span[rangeindex='" + this.rangechangeindex + "']").get(0), 0, r.length), this.functionHTMLIndex++ } "luckysheet-rich-text-editor" == a.attr("id") ? $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()) : $("#luckysheet-rich-text-editor").html($("#luckysheet-functionbox-cell").html()) }, rangedrag: function (e) { var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = Ss(t[1] + $("#luckysheet-cell-main").scrollTop()), n = r[1], l = r[0], i = r[2], o = Rs(a), s = o[1], c = o[0], u = o[2], d = 0, h = 0, m = []; this.func_selectedrange.top > l ? (d = l, h = this.func_selectedrange.top + this.func_selectedrange.height - l, m = [i, this.func_selectedrange.row[1]]) : this.func_selectedrange.top == l ? (d = l, h = this.func_selectedrange.top + this.func_selectedrange.height - l, m = [i, this.func_selectedrange.row[0]]) : (d = this.func_selectedrange.top, h = n - this.func_selectedrange.top - 1, m = [this.func_selectedrange.row[0], i]); var p = 0, f = 0, g = []; this.func_selectedrange.left > c ? (p = c, f = this.func_selectedrange.left + this.func_selectedrange.width - c, g = [u, this.func_selectedrange.column[1]]) : this.func_selectedrange.left == c ? (p = c, f = this.func_selectedrange.left + this.func_selectedrange.width - c, g = [u, this.func_selectedrange.column[0]]) : (p = this.func_selectedrange.left, f = s - this.func_selectedrange.left - 1, g = [this.func_selectedrange.column[0], u]), m[0] = Bc.changeFreezenIndex(m[0], "h"), m[1] = Bc.changeFreezenIndex(m[1], "h"), g[0] = Bc.changeFreezenIndex(g[0], "v"), g[1] = Bc.changeFreezenIndex(g[1], "v"); var v = xm.mergeMoveMain(g, m, this.func_selectedrange, d, h, p, f); if (null != v && (g = v[0], m = v[1], d = v[2], h = v[3], p = v[4], f = v[5]), this.func_selectedrange.row = m, this.func_selectedrange.column = g, this.func_selectedrange.left_move = p, this.func_selectedrange.width_move = f, this.func_selectedrange.top_move = d, this.func_selectedrange.height_move = h, Mh(p, d, f, h, m, g), $("#luckysheet-formula-functionrange-select").css({ left: p, width: f, top: d, height: h }).show(), $("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { var y = Cl(ga.currentSheetIndex, { row: m, column: g }, ga.currentSheetIndex); $("#luckysheet-ifFormulaGenerator-multiRange-dialog input").val(y) } else this.rangeSetValue({ row: m, column: g }); Bc.scrollFreezen(m, g) }, rangedrag_column_start: !1, rangedrag_row_start: !1, rangedrag_column: function (e) { var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = (t[1], $("#luckysheet-cell-main").scrollTop(), ga.visibledatarow), n = r.length - 1, l = r[n], i = Rs(a), o = i[1], s = i[0], c = i[2], u = 0, d = 0, h = []; this.func_selectedrange.left > s ? (u = s, d = this.func_selectedrange.left + this.func_selectedrange.width - s, h = [c, this.func_selectedrange.column[1]]) : this.func_selectedrange.left == s ? (u = s, d = this.func_selectedrange.left + this.func_selectedrange.width - s, h = [c, this.func_selectedrange.column[0]]) : (u = this.func_selectedrange.left, d = o - this.func_selectedrange.left - 1, h = [this.func_selectedrange.column[0], c]), h[0] = Bc.changeFreezenIndex(h[0], "v"), h[1] = Bc.changeFreezenIndex(h[1], "v"); var m = xm.mergeMoveMain(h, [0, n], this.func_selectedrange, 0, l - 0 - 1, u, d); null != m && (h = m[0], u = m[4], d = m[5]), this.func_selectedrange.column = h, this.func_selectedrange.left_move = u, this.func_selectedrange.width_move = d, Mh(u, 0, d, l - 0 - 1, [0, n], h), this.rangeSetValue({ row: [null, null], column: h }), $("#luckysheet-formula-functionrange-select").css({ left: u, width: d, top: 0, height: l - 0 - 1 }).show(), Bc.scrollFreezen([0, n], h) }, rangedrag_row: function (e) { var t = $s(e.pageX, e.pageY), a = (t[0], $("#luckysheet-cell-main").scrollLeft(), Ss(t[1] + $("#luckysheet-cell-main").scrollTop())), r = a[1], n = a[0], l = a[2], i = ga.visibledatacolumn, o = i.length - 1, s = i[o], c = 0, u = 0, d = []; this.func_selectedrange.top > n ? (c = n, u = this.func_selectedrange.top + this.func_selectedrange.height - n, d = [l, this.func_selectedrange.row[1]]) : this.func_selectedrange.top == n ? (c = n, u = this.func_selectedrange.top + this.func_selectedrange.height - n, d = [l, this.func_selectedrange.row[0]]) : (c = this.func_selectedrange.top, u = r - this.func_selectedrange.top - 1, d = [this.func_selectedrange.row[0], l]), d[0] = Bc.changeFreezenIndex(d[0], "h"), d[1] = Bc.changeFreezenIndex(d[1], "h"); var h = xm.mergeMoveMain([0, o], d, this.func_selectedrange, c, u, 0, s - 0 - 1); null != h && (d = h[1], c = h[2], u = h[3]), this.func_selectedrange.row = d, this.func_selectedrange.top_move = c, this.func_selectedrange.height_move = u, Mh(0, c, s - 0 - 1, u, d, [0, o]), this.rangeSetValue({ row: d, column: [null, null] }), $("#luckysheet-formula-functionrange-select").css({ left: 0, width: s - 0 - 1, top: c, height: u }).show(), Bc.scrollFreezen(d, [0, o]) }, rangedragged: function () { }, rangeResizeObj: null, rangeResize: null, rangeResizeIndex: null, rangeResizexy: null, rangeResizeWinH: null, rangeResizeWinW: null, rangeResizeTo: null, rangeResizeDraging: function (e, t, a, r, n, l, i, o) { var s = $("#luckysheet-scrollbar-y").scrollTop(), c = $("#luckysheet-scrollbar-x").scrollLeft(), u = $s(e.pageX, e.pageY), d = u[0] + c, h = u[1] + s, m = Ss(h), p = m[1], f = m[0], g = Rs(d), v = g[1], y = g[0]; if (d < 0 || h < 0) return !1; var b = f - a[1], k = y - a[0], x = a[5], w = a[3], _ = a[4], C = a[2]; if ("lt" == r || "lb" == r) { if (a[0] + a[2] < y) return; _ = y, C = a[2] - k, _ > a[2] + a[4] - v + y ? (_ = a[2] + a[4] - v + y, C = a[2] - (a[2] + a[4] - v + y - a[0])) : _ <= 0 && (_ = 0, C = a[2] + a[0]) } if ("rt" == r || "rb" == r) { if (a[6] - a[2] > v) return; (C = a[2] + v - a[6]) < v - y - 1 ? C = v - y - 1 : C >= i - _ && (C = i - _) } if ("lt" == r || "rt" == r) { if (a[1] + a[3] < f) return; x = f, w = a[3] - b, x > a[3] + a[5] - p + f ? (x = a[3] + a[5] - p + f, w = a[3] - (a[3] + a[5] - p + f - a[1])) : x <= 0 && (x = 0, w = a[3] + a[1]) } if ("lb" == r || "rb" == r) { if (a[7] - a[3] > p) return; (w = a[3] + p - a[7]) < p - f - 1 ? w = p - f - 1 : w >= o - x && (w = o - x) } var T = this.rangeResizeIndex, A = { top: x, left: _, height: w, width: C }, S = this.getSelectedFromRange(A), I = Cl(ga.currentSheetIndex, S, this.rangetosheet); this.rangeResizeTo.find("span[rangeindex='" + T + "']").html(I); qo(this.rangeResizeTo[0]), t.css(A).data("range", S) }, getSelectedFromRange: function (e) { var t = e.top + 2, a = e.top + e.height - 2, r = e.left + 2, n = e.left + e.width - 2; return { row: [Ss(t)[2], Ss(a)[2]], column: [Rs(r)[2], Rs(n)[2]] } }, rangeResizeDragged: function (e, t, a, r, n, l) { this.rangeResize = null, $("#luckysheet-formula-functionrange-highlight-" + this.rangeResizeIndex).find(".luckysheet-selection-copy-hc").css("opacity", .03) }, rangeMovexy: null, rangeMove: !1, rangeMoveObj: null, rangeMoveIndex: null, rangeMoveRangedata: null, rangeMoveDraging: function (e, t, a, r, n, l) { var i = $s(e.pageX, e.pageY), o = $("#luckysheet-scrollbar-x").scrollLeft(), s = $("#luckysheet-scrollbar-y").scrollTop(), c = i[0] + o, u = i[1] + s, d = $(window).height() + s - n - l, h = $(window).width() + o, m = t[0], p = t[1], f = a.row[0] - m + Ss(u)[2], g = a.row[1] - m + Ss(u)[2], v = a.column[0] - p + Rs(c)[2], y = a.column[1] - p + Rs(c)[2]; (f < 0 || u < 0) && (f = 0, g = a.row[1] - a.row[0]), (v < 0 || c < 0) && (v = 0, y = a.column[1] - a.column[0]); var b = ga.visibledatarow; (g >= b[b.length - 1] || u > d) && (f = b.length - 1 - a.row[1] + a.row[0], g = b.length - 1); var k = ga.visibledatacolumn; (y >= k[k.length - 1] || c > h) && (v = k.length - 1 - a.column[1] + a.column[0], y = k.length - 1); var x = v - 1 == -1 ? 0 : k[v - 1], w = k[y], _ = f - 1 == -1 ? 0 : b[f - 1], C = b[g], T = this.rangeMoveIndex, A = { left: x, width: w - x - 2, top: _, height: C - _ - 2, display: "block" }, S = this.getSelectedFromRange(A), I = Cl(ga.currentSheetIndex, S, this.rangetosheet); this.rangeResizeTo.find("span[rangeindex='" + T + "']").html(I); qo(this.rangeResizeTo[0]), this.rangeMoveRangedata = S, r.css(A) }, rangeMoveDragged: function (e) { this.rangeMove = !1, $("#luckysheet-formula-functionrange-highlight-" + this.rangeMoveIndex).data("range", this.rangeMoveRangedata).find(".luckysheet-selection-copy-hc").css("opacity", .03) }, functionHTMLIndex: 0, functionRangeIndex: null, findrangeindex: function (e, t) { var a = //g, r = e.replace(a, ""), n = t.replace(a, ""); r = r.split("
      "), n = n.split(""), r.pop(), n.pop(); var l = this.functionRangeIndex, i = (n.length > r.length ? r.length : n.length, n.length), o = r.length; if (i == o) { var s = l[0], c = n[s], u = r[s]; if (null == c) return n.length <= s ? l = [n.length - 1, n.length - 1] : r.length <= s && (l = [r.length - 1, r.length - 1]), l; if (c.length == u.length) return null != n[s + 1] && null != r[s + 1] && n[s + 1].length < r[s + 1].length && (l[0] = l[0] + 1, l[1] = 1), l; if (c.length > u.length) return null != c && null != r[s + 1] && '"' == r[s + 1].substr(0, 1) && (c.indexOf("{") > -1 || c.indexOf("}") > -1) && (l[0] = l[0] + 1, l[1] = 1), l; if (c.length < u.length) return l[1] > u.length && (l[1] = u.length), l } else { if (i > o) { var d = l[0], h = n[d], m = r[d]; if (null == m) if (r[d - 1].indexOf("{") > -1) { l[0] = l[0] - 1; var p = r[d - 1].search("{"); l[1] = l[1] + p } else l[0] = 0, l[1] = 0; else { if (h.length == m.length) return null == r[d + 1] || '"' != r[d + 1].substr(0, 1) && "{" != r[d + 1].substr(0, 1) && "}" != r[d + 1].substr(0, 1) ? null != h && h.length > 2 && '"' == h.substr(0, 1) && '"' == h.substr(h.length - 1, 1) || (null != r[d] && '")' == r[d] || null != r[d] && '"}' == r[d] || null != r[d] && "{)" == r[d] ? l[1] = 1 : l[1] = m.length) : (l[0] = l[0] + 1, l[1] = 1), l; if (h.length > m.length) return null == r[d + 1] || '"' != r[d + 1].substr(0, 1) && "{" != r[d + 1].substr(0, 1) && "}" != r[d + 1].substr(0, 1) || (l[0] = l[0] + 1, l[1] = 1), l; if (h.length < m.length) return l } return l } if (i < o) { var f = l[0], g = n[f], v = r[f]; if (null == g) l[0] = r.length - 1, l[1] = null != v ? v.length : 1; else { if (g.length == v.length) return null == n[f + 1] || '"' != n[f + 1].substr(0, 1) && "{" != n[f + 1].substr(0, 1) && "}" != n[f + 1].substr(0, 1) ? null == r[f + 1] || '"' != r[f + 1].substr(0, 1) || "{" != r[f + 1].substr(0, 1) && "}" != r[f + 1].substr(0, 1) ? null != v && '"' == v.substr(0, 1) && '"' == v.substr(v.length - 1, 1) && '"' == g.substr(0, 1) && ")" == g.substr(g.length - 1, 1) || null != v && "{" == v.substr(0, 1) && "}" == v.substr(v.length - 1, 1) && "{" == g.substr(0, 1) && ")" == g.substr(g.length - 1, 1) ? l[1] = v.length : (l[0] = l[0] + o - i, r.length > n.length ? l[1] = r[f + 1].length : l[1] = 1) : (l[0] = l[0] + 1, l[1] = 1) : l[1] = v.length, l; if (g.length > v.length) return null != g && '"' == g.substr(0, 1) ? l[1] = v.length : null != r[f + 1] && /{.*?}/.test(r[f + 1]) ? (l[0] = l[0] + 1, l[1] = r[f + 1].length) : null != g && '"' == r[f + 1].substr(0, 1) && (g.indexOf("{") > -1 || g.indexOf("}") > -1) ? (l[0] = l[0] + 1, l[1] = 1) : null != g && (g.indexOf("{") > -1 || g.indexOf("}") > -1) || (l[0] = l[0] + o - i - 1, l[1] = r[f - 1].length), l; if (g.length < v.length) return l } return l } } return null }, setCaretPosition: function (e, t, a) { try { var r = e, n = document.createRange(), l = window.getSelection(); n.setStart(r.childNodes[t], a), n.collapse(!0), l.removeAllRanges(), l.addRange(n), r.focus() } catch (e) { qo(this.rangeResizeTo[0]) } }, functionRange: function (e, t, a) { if (window.getSelection) { var r = window.getSelection(), n = this.findrangeindex(t, a); null == n ? (r.selectAllChildren(e.get(0)), r.collapseToEnd()) : this.setCaretPosition(e.find("span").get(n[0]), 0, n[1]) } else document.selection && (this.functionRangeIndex.moveToElementText(e), this.functionRangeIndex.collapse(!1), this.functionRangeIndex.select()) }, functionInputHanddler: function (e, t, a) { if (!wa()) { var r = this, n = e, l = t, i = l.html(), o = l.text(); setTimeout((function () { var e = l.text(); if (e.length > 0 && "=" == e.substr(0, 1) && (229 != a || 1 == e.length)) { if (e = r.functionHTMLGenerate(e), i = r.functionHTMLGenerate(o), window.getSelection) { var t = window.getSelection(); if ($(t.anchorNode).is("div")) { var s = $("#luckysheet-rich-text-editor span").length; r.functionRangeIndex = [s - 1, $("#luckysheet-rich-text-editor").find("span").eq(s - 1).text().length] } else r.functionRangeIndex = [$(t.anchorNode).parent().index(), t.anchorOffset] } else { var c = document.selection.createRange(); r.functionRangeIndex = c } l.html(e), r.functionRange(l, e, i), r.canceFunctionrangeSelected(), 46 != a && r.createRangeHightlight(), n.html(e), r.rangestart = !1, r.rangedrag_column_start = !1, r.rangedrag_row_start = !1, r.rangeHightlightselected(l, a) } else "=" != o.substr(0, 1) && ("luckysheet-rich-text-editor" == n.attr("id") && "=' + this.functionHTML(e)) }, functionHTML: function (e) { if (null == this.operatorjson) { for (var t = this.operator.split("|"), a = {}, r = 0; r < t.length; r++)a[t[r].toString()] = 1; this.operatorjson = a } "=" == e.substr(0, 1) && (e = e.substr(1)); for (var n = e.split(""), l = 0, i = "", o = "", s = { bracket: 0, comma: 0, squote: 0, dquote: 0, braces: 0 }; l < n.length;) { var c = n[l]; if ("(" == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) s.bracket += 1, i.length > 0 ? o += '' + i + '(' : o += '(', i = ""; else if (")" == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) s.bracket -= 1, o += this.functionHTML(i) + ')', i = ""; else if ("{" == c && 0 == s.squote && 0 == s.dquote) i += "{", s.braces += 1; else if ("}" == c && 0 == s.squote && 0 == s.dquote) i += "}", s.braces -= 1; else if ('"' == c && 0 == s.squote) s.dquote > 0 ? (i.length > 0 ? o += i + '"' : o += '"', s.dquote -= 1, i = "") : (s.dquote += 1, i.length > 0 ? o += this.functionHTML(i) + '"' : o += '"', i = ""); else if ("'" == c && 0 == s.dquote) i += "'", s.squote = 0 == s.squote ? 1 : 0; else if ("," == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) o += this.functionHTML(i) + ',', i = ""; else if ("&" == c && 0 == s.squote && 0 == s.dquote && 0 == s.braces) i.length > 0 ? (o += this.functionHTML(i) + '&', i = "") : o += '&'; else if (c in this.operatorjson && 0 == s.squote && 0 == s.dquote && 0 == s.braces) { var u = ""; l + 1 < n.length && (u = n[l + 1]); var d = l - 1, h = null; if (d >= 0) do { h = n[d--] } while (d >= 0 && " " == h); c + u in this.operatorjson ? (i.length > 0 ? (o += this.functionHTML(i) + '' + c + u + "", i = "") : o += '' + c + u + "", l++) : /[^0-9]/.test(u) || "-" != c || "(" != h && null != h && "," != h && " " != h && !(h in this.operatorjson) ? i.length > 0 ? (o += this.functionHTML(i) + '' + c + "", i = "") : o += '' + c + "" : i += c } else i += c; if (l == n.length - 1) if (this.iscelldata($.trim(i))) o += '' + i + "", this.functionHTMLIndex++; else if (s.dquote > 0) o += i + ""; else if (-1 == i.indexOf("") && i.length > 0) { var m = /{.*?}/; if (m.test($.trim(i))) { var p = m.exec(i)[0], f = i.search(m), g = ""; f > 0 && (g += '' + i.substr(0, f) + ""), g += '' + p + "", f + p.length < i.length && (g += '' + i.substr(f + p.length, i.length) + ""), o += g } else o += '' + i + "" } l++ } return o }, getfunctionParam: function (e) { if (null == this.operatorjson) { for (var t = this.operator.split("|"), a = {}, r = 0; r < t.length; r++)a[t[r].toString()] = 1; this.operatorjson = a } "=" == e.substr(0, 1) && (e = e.substr(1)); for (var n = e.split(""), l = 0, i = "", o = { bracket: 0, comma: 0, squote: 0, dquote: 0, compare: 0 }, s = null, c = [], u = []; l < n.length;) { var d = n[l]; if ("(" == d && 0 == o.dquote) i.length > 0 && 0 == u.length ? (s = i.toUpperCase(), u.push(1), i = "") : 0 == u.length ? (u.push(0), i = "") : (u.push(0), i += d); else if (")" == d && 0 == o.dquote) { u.pop(); 0 == u.length ? (c.push(i), i = "") : i += d } else if ('"' == d) i += '"', o.dquote > 0 ? (o.dquote -= 1, i = "") : o.dquote += 1; else if ("," == d && 0 == o.dquote) u.length <= 1 ? (c.push(i), i = "") : i += ","; else if (d in this.operatorjson && 0 == o.dquote) { var h = ""; l + 1 < n.length && (h = n[l + 1]); var m = l - 1, p = null; if (m >= 0) do { p = n[m--] } while (m >= 0 && " " == p); /[^0-9]/.test(h) || "-" != d || "(" != p && null != p && "," != p && " " != p && !(p in this.operatorjson) ? i = "" : 0 == o.dquote ? i += $.trim(d) : i += d } else 0 == o.dquote ? i += $.trim(d) : i += d; l++ } return { fn: s, param: c } }, calPostfixExpression: function (e) { if (0 == e.length) return ""; for (var t = [], a = e.length - 1; a >= 0; a--) { var r = e[a]; if (r in this.operatorjson) { var n = t.pop(), l = "luckysheet_compareWith(" + t.pop() + ",'" + r + "', " + n + ")"; t.push(l) } else t.push(r) } return t.length > 0 ? t[0] : "" }, checkBracketNum: function (e) { var t = e.match(/\(/g), a = e.match(/\)/g), r = e.match(/(['"])(?:(?!\1).)*?\1/g), n = e.match(/(['"])(?:(?!\1).)*?\1/g), l = 0, i = 0; null != t && (l += t.length), null != a && (i += a.length); var o = 0, s = 0; if (null != r) for (var c = 0; c < r.length; c++) { var u = r[c].match(/\(/g); null != u && (o += u.length) } if (null != n) for (var d = 0; d < n.length; d++) { var h = n[d].match(/\)/g); null != h && (s += h.length) } return (l -= o) == (i -= s) }, operatorPriority: { "^": 0, "%": 1, "*": 1, "/": 1, "+": 2, "-": 2 }, functionParserExe: function (e) { return this.functionParser(e) }, functionParser: function (e, t) { if (null == this.operatorjson) { for (var a = this.operator.split("|"), r = {}, n = 0; n < a.length; n++)r[a[n].toString()] = 1; this.operatorjson = r } if (null == e) return ""; "=+" == e.substr(0, 2) ? e = e.substr(2) : "=" == e.substr(0, 1) && (e = e.substr(1)); for (var l = e.split(""), i = 0, o = "", s = "", c = { bracket: 0, comma: 0, squote: 0, dquote: 0, compare: 0, braces: 0 }, u = [], d = [], h = [], m = -1; i < l.length;) { var p = l[i]; if ("(" == p && 0 == c.squote && 0 == c.dquote && 0 == c.braces) if (o.length > 0 && 0 == h.length) { if ((o = o.toUpperCase()).indexOf(":") > -1) { var f = o.split(":"); s += "luckysheet_getSpecialReference(true,'" + $.trim(f[0]).replace(/'/g, "\\'") + "', luckysheet_function." + f[1] + ".f(#lucky#" } else s += "luckysheet_function." + o + ".f("; h.push(1), o = "" } else 0 == h.length ? (s += "(", h.push(0), o = "") : (h.push(0), o += p); else if (")" == p && 0 == c.squote && 0 == c.dquote && 0 == c.braces) { h.pop(); if (0 == h.length) { var g = this.functionParser(o, t); g.indexOf("#lucky#") > -1 && (g = g.replace(/#lucky#/g, "") + ")"), s += g + ")", o = "" } else o += p } else if ("{" == p && 0 == c.squote && 0 == c.dquote) o += "{", c.braces += 1; else if ("}" == p && 0 == c.squote && 0 == c.dquote) o += "}", c.braces -= 1; else if ('"' == p && 0 == c.squote) c.dquote > 0 ? i < l.length - 1 && '"' == l[i + 1] ? (i++, o += "") : (c.dquote -= 1, o += '"') : (c.dquote += 1, o += '"'); else if ("'" == p && 0 == c.dquote) if (o += "'", c.squote > 0) { if (m == i - 1) return ""; if (i < l.length - 1 && "'" == l[i + 1]) i++, o += "'"; else { if ("'" == l[i - 1]) return ""; c.squote -= 1 } } else c.squote += 1, m = i; else if ("," == p && 0 == c.squote && 0 == c.dquote && 0 == c.braces) if (h.length <= 1) { var v = this.functionParser(o, t); v.indexOf("#lucky#") > -1 && (v = v.replace(/#lucky#/g, "") + ")"), s += v + ",", o = "" } else o += ","; else if (p in this.operatorjson && 0 == c.squote && 0 == c.dquote && 0 == c.braces) { var y = "", b = this.operatorPriority; if (i + 1 < l.length && (y = l[i + 1]), p + y in this.operatorjson) { if (0 == h.length) { if ($.trim(o).length > 0 ? d.unshift(this.functionParser($.trim(o), t)) : $.trim(s).length > 0 && d.unshift($.trim(s)), u[0] in this.operatorjson) for (var k = b[u[0]]; u.length > 0 && null != k;)d.unshift(u.shift()), k = b[u[0]]; u.unshift(p + y), s = "", o = "" } else o += p + y; i++ } else if (0 == h.length) { if ($.trim(o).length > 0 ? d.unshift(this.functionParser($.trim(o), t)) : $.trim(s).length > 0 && d.unshift($.trim(s)), u[0] in this.operatorjson) { var x = b[u[0]]; x = null == x ? 1e3 : x; var w = b[p]; for (w = null == w ? 1e3 : w; u.length > 0 && w >= x;)d.unshift(u.shift()), x = null == (x = b[u[0]]) ? 1e3 : x } u.unshift(p), s = "", o = "" } else o += p } else 0 == c.dquote && c.squote, o += p; if (i == l.length - 1) { var _ = "", C = $.trim(o).replace(/'/g, "\\'"); if (this.iscelldata(C) && ":" != C.substr(0, 1)) _ = "luckysheet_getcelldata('" + C + "')", "function" == typeof t && t(C); else if (":" == C.substr(0, 1)) C = C.substr(1), this.iscelldata(C) && (_ = "luckysheet_getSpecialReference(false," + s + ",'" + C + "')"); else { o = $.trim(o); var T = /{.*?}/; if (T.test(o) && '"' != o.substr(0, 1) && '"' != o.substr(o.length - 1, 1)) { var A = T.exec(o)[0], S = o.search(T); S > 0 && (_ += o.substr(0, S)), _ += "luckysheet_getarraydata('" + A + "')", S + A.length < o.length && (_ += o.substr(S + A.length, o.length)) } else _ = o } if (_.length > 0 && d.unshift(_), u.length > 0) for (s.length > 0 && (d.unshift(s), s = ""); u.length > 0;)d.unshift(u.shift()); d.length > 0 ? s = this.calPostfixExpression(d) : s += _ } i++ } return s }, insertUpdateDynamicArray: function (e) { var t = e.r, a = e.c, r = e.index; null == r && (r = ga.currentSheetIndex); var n = Tl()[_l(r)].dynamicArray; null == n && (n = []); for (var l = 0; l < n.length; l++) { var i = n[l]; if (i.r == t && i.c == a && i.index == r) return i.data = e.data, i.f = e.f, n } return n.push(e), n }, addFunctionGroup: function (e, t, a, r) { null == r && (r = ga.currentSheetIndex); var n = Tl(), l = n[_l(r)]; null == l.calcChain && (l.calcChain = []); var i = { r: e, c: t, index: r, func: a }; l.calcChain.push(i), pd.saveParam("fc", r, JSON.stringify(i), { op: "add", pos: l.calcChain.length - 1 }), Rl(n) }, getAllFunctionGroup: function () { for (var e = Tl(), t = [], a = 0; a < e.length; a++) { var r = e[a], n = r.calcChain; n && function () { var e = []; n.forEach((function (t, a) { "string" == typeof t ? e.push(JSON.parse(t)) : e.push(t) })), n = r.calcChain = e }(); var l = r.dynamicArray_compute; null == n && (n = []), null == l && (l = []), t = t.concat(n); for (var i = 0; i < l.length; i++) { var o = l[0]; t.push({ r: o.r, c: o.c, index: o.index }) } } return t }, getFunctionGroup: function (e) { null == e && (e = ga.currentSheetIndex); var t = Tl()[_l(e)]; return null == t.calcChain ? [] : t.calcChain }, updateFunctionGroup: function (e, t, a) { null == a && (a = ga.currentSheetIndex); var r = Tl(), n = r[_l(a)].calcChain; if (null != n) for (var l = 0; l < n.length; l++) { var i = n[l]; if (i.r == e && i.c == t && i.index == a) { pd.saveParam("fc", a, JSON.stringify(i), { op: "update", pos: l }); break } } Rl(r) }, insertUpdateFunctionGroup: function (e, t, a) { null == a && (a = ga.currentSheetIndex); var r = Tl(), n = r[_l(a)], l = n.calcChain; null == l && (l = []); for (var i = 0; i < l.length; i++) { var o = l[i]; if (o.r == e && o.c == t && o.index == a) return void pd.saveParam("fc", a, JSON.stringify(o), { op: "update", pos: i }) } var s = { r: e, c: t, index: a }; l.push(s), n.calcChain = l, pd.saveParam("fc", a, JSON.stringify(s), { op: "add", pos: n.calcChain.length - 1 }), Rl(r) }, isFunctionRangeSave: !1, isFunctionRangeSimple: function (e, t, a, r, n) { if (null != e && 0 != e.length) { var l = e.split(/==|!=|<>|<=|>=|[,()=+-\/*%&^><]/g); if (l.length > 0) for (var i = 0; i < l.length; i++) { var o = l[i]; o.length <= 1 || ('"' == o.substr(0, 1) && '"' == o.substr(o.length - 1, 1) || this.isFunctionRangeSaveChange(o, t, a, r, n)) } } }, isFunctionRangeSimple1: function (e, t, a, r, n) { if (null == this.operatorjson) { for (var l = this.operator.split("|"), i = {}, o = 0; o < l.length; o++)i[l[o].toString()] = 1; this.operatorjson = i } "=" == e.substr(0, 1) && (e = e.substr(1)); var s = e.split(""), c = 0, u = "", d = "", h = { bracket: 0, comma: 0, squote: 0, dquote: 0 }; for (Tl(); c < s.length;) { var m = s[c]; if ("(" == m && 0 == h.dquote) h.bracket += 1, u.length > 0 ? d += "luckysheet_function." + u.toUpperCase() + ".f(" : d += "(", u = ""; else if (")" == m && 0 == h.dquote) h.bracket -= 1, d += this.isFunctionRangeSimple(u, t, a, r, n) + ")", u = ""; else if ("," == m && 0 == h.dquote) d += this.isFunctionRangeSimple(u, t, a, r, n) + ",", u = ""; else if (m in this.operatorjson && 0 == h.dquote) { var p = ""; c + 1 < s.length && (p = s[c + 1]), m + p in this.operatorjson ? (u.length > 0 ? (d += this.isFunctionRangeSimple(u, t, a, r, n) + m + p, u = "") : d += m + p, c++) : u.length > 0 ? (d += this.isFunctionRangeSimple(u, t, a, r, n) + m, u = "") : d += m } else u += m; c == s.length - 1 && this.iscelldata($.trim(u)) && this.isFunctionRangeSaveChange(u, t, a, r, n), c++ } return d }, isFunctionRangeSelect: function (e, t, a, r, n) { if (null != e && "" != e) { null == r && (r = ga.currentSheetIndex), null == n && (n = {}); var l = this, i = e.toUpperCase(), o = i.indexOf("INDIRECT(") > -1 || i.indexOf("OFFSET(") > -1 || i.indexOf("INDEX(") > -1; if (e in this.formulaContainCellList) { var s = this.formulaContainCellList[e]; if (o) if (1 == s.__LuckyisOff__) for (var c in s) "__LuckyisOff__" != c && this.isFunctionRangeSaveChange(c, t, a, r, n); else this.isFunctionRange(e, t, a, r, n, (function (t) { l.addToCellList(e, t) })), s.__LuckyisOff__ = !0; else for (var u in s) "__LuckyisOff__" != u && this.isFunctionRangeSaveChange(u, t, a, r, n) } else o ? this.isFunctionRange(e, t, a, r, n) : this.isFunctionRangeSimple(e, t, a, r, n) } }, isFunctionRange: function (e, t, a, r, n, l) { if (null == this.operatorjson) { for (var i = this.operator.split("|"), o = {}, s = 0; s < i.length; s++)o[i[s].toString()] = 1; this.operatorjson = o } "=" == e.substr(0, 1) && (e = e.substr(1)); for (var c = e.split(""), u = 0, d = "", h = "", m = { bracket: 0, comma: 0, squote: 0, dquote: 0, compare: 0, braces: 0 }, p = [], f = [], g = []; u < c.length;) { var v = c[u]; if ("(" == v && 0 == m.squote && 0 == m.dquote && 0 == m.braces) if (d.length > 0 && 0 == g.length) { if ((d = d.toUpperCase()).indexOf(":") > -1) { var y = d.split(":"); h += "luckysheet_getSpecialReference(true,'" + $.trim(y[0]).replace(/'/g, "\\'") + "', luckysheet_function." + y[1] + ".f(#lucky#" } else h += "luckysheet_function." + d + ".f("; g.push(1), d = "" } else 0 == g.length ? (h += "(", g.push(0), d = "") : (g.push(0), d += v); else if (")" == v && 0 == m.squote && 0 == m.dquote && 0 == m.braces) { g.pop(); if (0 == g.length) { var b = this.isFunctionRange(d, t, a, r, n, l); b.indexOf("#lucky#") > -1 && (b = b.replace(/#lucky#/g, "") + ")"), h += b + ")", d = "" } else d += v } else if ("{" == v && 0 == m.squote && 0 == m.dquote) d += "{", m.braces += 1; else if ("}" == v && 0 == m.squote && 0 == m.dquote) d += "}", m.braces -= 1; else if ('"' == v && 0 == m.squote) m.dquote > 0 ? u < c.length - 1 && '"' == c[u + 1] ? (u++, d += "") : (m.dquote -= 1, d += '"') : (m.dquote += 1, d += '"'); else if ("'" == v && 0 == m.dquote) d += "'", m.squote > 0 ? u < c.length - 1 && "'" == c[u + 1] ? (u++, d += "'") : m.squote -= 1 : m.squote += 1; else if ("," == v && 0 == m.squote && 0 == m.dquote && 0 == m.braces) if (g.length <= 1) { var k = this.isFunctionRange(d, t, a, r, n, l); k.indexOf("#lucky#") > -1 && (k = k.replace(/#lucky#/g, "") + ")"), h += k + ",", d = "" } else d += ","; else if (v in this.operatorjson && 0 == m.squote && 0 == m.dquote && 0 == m.braces) { var x = "", w = this.operatorPriority; if (u + 1 < c.length && (x = c[u + 1]), v + x in this.operatorjson) { if (0 == g.length) { if ($.trim(d).length > 0 ? f.unshift(this.isFunctionRange($.trim(d), t, a, r, n, l)) : $.trim(h).length > 0 && f.unshift($.trim(h)), p[0] in this.operatorjson) for (var _ = w[p[0]]; p.length > 0 && null != _;)f.unshift(p.shift()), _ = w[p[0]]; p.unshift(v + x), h = "", d = "" } else d += v + x; u++ } else if (0 == g.length) { if ($.trim(d).length > 0 ? f.unshift(this.isFunctionRange($.trim(d), t, a, r, n, l)) : $.trim(h).length > 0 && f.unshift($.trim(h)), p[0] in this.operatorjson) { var C = w[p[0]]; C = null == C ? 1e3 : C; var T = w[v]; for (T = null == T ? 1e3 : T; p.length > 0 && T >= C;)f.unshift(p.shift()), C = null == (C = w[p[0]]) ? 1e3 : C } p.unshift(v), h = "", d = "" } else d += v } else 0 == m.dquote && 0 == m.squote ? d += $.trim(v) : d += v; if (u == c.length - 1) { var A = "", S = $.trim(d).replace(/'/g, "\\'"); if (this.iscelldata(S) && ":" != S.substr(0, 1)) A = "luckysheet_getcelldata('" + S + "')", this.isFunctionRangeSaveChange(d, t, a, r, n); else if (":" == S.substr(0, 1)) S = S.substr(1), this.iscelldata(S) && (A = "luckysheet_getSpecialReference(false," + h + ",'" + S + "')"); else { d = $.trim(d); var I = /{.*?}/; if (I.test(d) && '"' != d.substr(0, 1) && '"' != d.substr(d.length - 1, 1)) { var R = I.exec(d)[0], q = d.search(I); q > 0 && (A += d.substr(0, q)), A += "luckysheet_getarraydata('" + R + "')", q + R.length < d.length && (A += d.substr(q + R.length, d.length)) } else A = d } if (A.length > 0 && f.unshift(A), p.length > 0) for (h.length > 0 && (f.unshift(h), h = ""); p.length > 0;)f.unshift(p.shift()); f.length > 0 ? h = this.calPostfixExpression(f) : h += A } u++ } return this.checkSpecialFunctionRange(h, t, a, r, n, l), h }, isFunctionRangeSaveChange: function (e, t, a, r, n) { if (null != t && null != a) { var l = this.getcellrange($.trim(e), r); if (null == l) return; var i = l.row, o = l.column, s = l.sheetIndex; if (!(t + "_" + a in n) || r != s && null != r) t >= i[0] && t <= i[1] && a >= o[0] && a <= o[1] && (r == s || null == r) ? this.isFunctionRangeSave = this.isFunctionRangeSave || !0 : this.isFunctionRangeSave = this.isFunctionRangeSave || !1; else { for (var c = !1, u = i[0]; u <= i[1]; u++)for (var d = o[0]; d <= o[1]; d++)u + "_" + d in n && n[u + "_" + d].r == t && n[u + "_" + d].c == a && (c = !0); this.isFunctionRangeSave = c ? this.isFunctionRangeSave || !0 : this.isFunctionRangeSave || !1 } } else this.isFunctionRangeSave = this.isFunctionRangeSave || !1 }, checkSpecialFunctionRange: function (e, t, a, r, n, l) { if ("luckysheet_getSpecialReference" == e.substr(0, 30) || "luckysheet_function." == e.substr(0, 20)) { if ("luckysheet_function." == e.substr(0, 20)) { var i = e.split(".")[1]; if (null != i && "INDIRECT" != (i = i.toUpperCase()) && "OFFSET" != i && "INDEX" != i) return } try { ga.calculateSheetIndex = r; var o = new Function("return " + e)(); o instanceof Object && null != o.startCell && (o = o.startCell); var s = $.trim(o); this.iscelldata(s) && "function" == typeof l && l(s) } catch (e) { } } }, execvertex: {}, execFunctionGroupData: null, execFunctionExist: null, formulaContainSheetList: {}, formulaContainCellList: {}, cellTextToIndexList: {}, addToCellList: function (e, t) { null != e && 0 != e.length && null != t && 0 != t.length && (null == this.formulaContainCellList && (this.formulaContainCellList = {}), null == this.formulaContainCellList[e] && (this.formulaContainCellList[e] = {}), this.formulaContainCellList[e][t] = 1) }, addToCellIndexList: function (e, t) { null != e && 0 != e.length && null != t && (null == this.cellTextToIndexList && (this.cellTextToIndexList = {}), e.indexOf("!") > -1 ? (e = e.replace(/\\'/g, "'").replace(/''/g, "'"), this.cellTextToIndexList[e] = t) : this.cellTextToIndexList[e + "_" + t.sheetIndex] = t) }, addToSheetIndexList: function (e, t, a) { null != e && 0 != e.length && (null != t && 0 != t.length || (t = ga.currentSheetIndex), null != a && 0 != a.length || (a = ""), null == this.formulaContainSheetList && (this.formulaContainSheetList = {}), null == this.formulaContainSheetList[e] && (this.formulaContainSheetList[e] = {}), this.formulaContainSheetList[e][t] = a) }, execFunctionGlobalData: {}, execFunctionGroupForce: function (e) { e ? this.execFunctionGroup(void 0, void 0, void 0, void 0, void 0, !0) : this.execFunctionGroup() }, execFunctionGroup: function (e, t, a, r, n) { var l = this, i = arguments.length > 5 && void 0 !== arguments[5] && arguments[5], o = this; if (null == n && (n = ga.flowdata), window.luckysheet_compareWith || (window.luckysheet_compareWith = Zd, window.luckysheet_getarraydata = Qd, window.luckysheet_getcelldata = eh, window.luckysheet_parseData = th, window.luckysheet_getValue = ah, window.luckysheet_indirect_check = rh, window.luckysheet_indirect_check_return = nh, window.luckysheet_offset_check = lh, window.luckysheet_calcADPMM = Jd, window.luckysheet_getSpecialReference = ih), null == o.execFunctionGlobalData && (o.execFunctionGlobalData = {}), null == r && (r = ga.currentSheetIndex), null != a) { var s = [[{ v: null }]]; Cs(0, 0, s, a), o.execFunctionGlobalData[e + "_" + t + "_" + r] = s[0][0] } for (var c = o.getAllFunctionGroup(), u = {}, d = Tl(), h = {}, m = 0; m < d.length; m++) { var p = d[m]; h[p.index] = p.data } var f = {}, g = []; if (null == o.execFunctionExist) { var v = "r" + e + "c" + t + "i" + r; f[v] = 1 } else for (var y = 0; y < o.execFunctionExist.length; y++) { var b = o.execFunctionExist[y], k = "r" + b.r + "c" + b.c + "i" + b.i; f[k] = 1 } for (var x = {}, w = function (e, t, a, r) { for (var n = 0; n < e.length; n++) { var l = e[n], i = "r" + l.row[0] + l.row[1] + "c" + l.column[0] + l.column[1] + "index" + l.sheetIndex; if (i in x) { x[i].forEach((function (e) { r(e.key, e.r, e.c, e.sheetIndex) })) } else { for (var o = [], s = l.row[0]; s <= l.row[1]; s++)for (var c = l.column[0]; c <= l.column[1]; c++) { var u = "r" + s + "c" + c + "i" + l.sheetIndex; r(u, s, c, l.sheetIndex), (t && u in t || a && u in a) && o.push({ key: u, r: s, c: c, sheetIndex: l.sheetIndex }) } (t || a) && (x[i] = o) } } }, _ = function (e) { var t = c[e], a = "r" + t.r + "c" + t.c + "i" + t.index, r = Qo(t.r, t.c, t.index); if (null == r) return "continue"; var n = r.toUpperCase(), i = n.indexOf("INDIRECT(") > -1 || n.indexOf("OFFSET(") > -1 || n.indexOf("INDEX(") > -1, s = []; if (i) l.isFunctionRange(r, null, null, t.index, null, (function (e) { var a = o.getcellrange($.trim(e), t.index); null != a && s.push(a) })); else if ('="' != r.substr(0, 2) || '"' != r.substr(r.length - 1, 1)) { for (var d = 0, h = -1, m = -1, p = [], f = [], g = r.length, v = 0; v < g; v++) { var y = r.charAt(v); "'" == y && -1 == m && (-1 == h ? (d != v && p.push.apply(p, Da(r.substring(d, v).split(/==|!=|<>|<=|>=|[,()=+-\/*%&\^><]/))), h = v, d = v) : v < g - 1 && "'" == r.charAt(v + 1) ? v++ : (d = v + 1, p.push(r.substring(h, d)), f.push(p.length - 1), h = -1)), '"' == y && -1 == h && (-1 == m ? (d != v && p.push.apply(p, Da(r.substring(d, v).split(/==|!=|<>|<=|>=|[,()=+-\/*%&\^><]/))), m = v, d = v) : v < g - 1 && '"' == r.charAt(v + 1) ? v++ : (d = v + 1, p.push(r.substring(m, d)), m = -1)) } d != g && p.push.apply(p, Da(r.substring(d, g).split(/==|!=|<>|<=|>=|[,()=+-\/*%&\^><]/))); for (var b = f.length - 1; b >= 0; b--)f[b] != p.length - 1 && (p[f[b]] = p[f[b]] + p[f[b] + 1], p.splice(f[b] + 1, 1)); for (var k = 0; k < p.length; k++) { var x = p[k]; if (!(x.length <= 1) && ('"' != x.substr(0, 1) || '"' != x.substr(x.length - 1, 1) || o.iscelldata(x))) { var w = o.getcellrange($.trim(x), t.index); null != w && s.push(w) } } } var _ = { formulaArray: s, calc_funcStr: r, key: a, r: t.r, c: t.c, index: t.index, parents: {}, chidren: {}, color: "w" }; u[a] = _ }, C = 0; C < c.length; C++)_(C); Object.keys(u).forEach((function (e) { var t = u[e]; w(t.formulaArray, u, f, (function (a) { if (a in u) { var r = u[a]; t.chidren[a] = 1, r.parents[e] = 1 } !i && a in f && g.push(t) })), i && g.push(t) })); for (var T = [], A = g, S = {}, I = function () { var e = A.pop(); if (null == e || e.key in S) return "continue"; if ("b" == e.color) return T.push(e), S[e.key] = 1, "continue"; var t = []; Object.keys(e.parents).forEach((function (e) { var a = u[e]; null != a && t.push(a) })), 0 == t.length ? (T.push(e), S[e.key] = 1) : (e.color = "b", A.push(e), A = A.concat(t)) }; A.length > 0;)I(); T.reverse(); for (var R = 0; R < T.length; R++) { var q = T[R]; if (q.level != Math.max) { window.luckysheet_getcelldata_cache = null; var D = q.calc_funcStr, F = o.execfunction(D, q.r, q.c, q.index); o.groupValuesRefreshData.push({ r: q.r, c: q.c, v: F[1], f: F[2], spe: F[3], index: q.index }), o.execFunctionGlobalData[q.r + "_" + q.c + "_" + q.index] = { v: F[1], f: F[2] } } } o.execFunctionExist = null }, execFunctionGroup1: function (e, t, a, r, n) { var l = arguments.length > 5 && void 0 !== arguments[5] && arguments[5], i = this; null == n && (n = ga.flowdata), window.luckysheet_compareWith || (window.luckysheet_compareWith = Zd, window.luckysheet_getarraydata = Qd, window.luckysheet_getcelldata = eh, window.luckysheet_parseData = th, window.luckysheet_getValue = ah, window.luckysheet_indirect_check = rh, window.luckysheet_indirect_check_return = nh, window.luckysheet_offset_check = lh, window.luckysheet_calcADPMM = Jd, window.luckysheet_getSpecialReference = ih), null == i.execFunctionGlobalData && (i.execFunctionGlobalData = {}); var o = Tl(), s = null == o[_l(ga.currentSheetIndex)].dynamicArray_compute ? {} : o[_l(ga.currentSheetIndex)].dynamicArray_compute; if (null == r && (r = ga.currentSheetIndex), null != a) { var c = [[{ v: null }]]; Cs(0, 0, c, a), i.execFunctionGlobalData[e + "_" + t + "_" + r] = c[0][0] } var u = i.getAllFunctionGroup(), d = {}, h = [], m = 0; if (i.execvertex = {}, null == i.execFunctionExist) for (var p = 0; p < u.length; p++) { var f = u[p], g = o[_l(f.index)]; if (null != g) { var v = g.data[f.r][f.c], y = Qo(f.r, f.c, f.index); null != v && null != v.f && v.f == y && (f instanceof Object || (f = new Function("return " + f)()), f.color = "w", f.parent = null, f.chidren = {}, f.times = 0, d["r" + f.r + "c" + f.c + "i" + f.index] = f, i.isFunctionRangeSave = !1, l ? i.isFunctionRangeSave = !0 : null != e && null != t && i.isFunctionRangeSelect(y, e, t, r, s), i.isFunctionRangeSave && (h.push(f), i.execvertex["r" + f.r + "c" + f.c + "i" + f.index] = f, m++)) } } else for (var b = 0; b < i.execFunctionExist.length; b++) { var k = i.execFunctionExist[b]; if (!("r" + k.r + "c" + k.c + "i" + k.i in d)) for (var x = 0; x < u.length; x++) { var w = u[x], _ = Qo(w.r, w.c, w.index); w.color = "w", w.parent = null, w.chidren = {}, w.times = 0, d["r" + w.r + "c" + w.c + "i" + w.index] = w, i.isFunctionRangeSave = !1, l ? i.isFunctionRangeSave = !0 : i.isFunctionRangeSelect(_, k.r, k.c, k.i, s), i.isFunctionRangeSave && (h.push(w), i.execvertex["r" + w.r + "c" + w.c + "i" + w.index] = w, m++) } } for (; h.length > 0;) { var C = h.shift(), T = {}; for (var A in i.getChildrenVertex(C, d, T), d) { var S = d[A]; if (null != S) { var I = "r" + C.r + "c" + C.c + "i" + C.index; if (!(A in T)) { i.isFunctionRangeSave = !1; var R = Qo(S.r, S.c, S.index); i.isFunctionRangeSelect(R, C.r, C.c, C.index, s), i.isFunctionRangeSave && (A in i.execvertex || (h.push(S), i.execvertex[A] = S), m++, i.execvertex[A].chidren[I] = 1) } } } } i.groupValuesRefreshData = []; for (var $ = 0; $ < m;)for (var q in i.execvertex) { var D = i.execvertex[q]; "w" == D.color ? i.functionDFS(D) : "b" == D.color && $++ } i.execFunctionExist = null }, getChildrenVertex: function (e, t, a) { if (a["r" + e.r + "c" + e.c + "i" + e.index] = 1, null != e.chidren) for (var r in e.chidren) t[r] && !(r in a) && this.getChildrenVertex(t[r], t, a) }, functionDFS: function (e) { for (var t in e.color = "g", e.times += 1, e.chidren) { var a = this.execvertex[t]; "w" == a.color && (a.parent = "r" + e.r.toString() + "c" + e.c.toString() + "i" + e.index, this.functionDFS(a)) } e.color = "b", window.luckysheet_getcelldata_cache = null; var r = Qo(e.r, e.c, e.index), n = this.execfunction(r, e.r, e.c, e.index); this.groupValuesRefreshData.push({ r: e.r, c: e.c, v: n[1], f: n[2], spe: n[3], index: e.index }), this.execFunctionGlobalData[e.r + "_" + e.c + "_" + e.index] = { v: n[1], f: n[2] } }, groupValuesRefreshData: [], groupValuesRefresh: function () { var e = Tl(); if (this.groupValuesRefreshData.length > 0) { for (var t = 0; t < this.groupValuesRefreshData.length; t++) { var a = this.groupValuesRefreshData[t], r = e[_l(a.index)], n = r.data; if (null != n) { var l = {}; null != a.spe && ("sparklines" == a.spe.type ? l.spl = a.spe.data : "dynamicArrayItem" == a.spe.type && (r.dynamicArray = this.insertUpdateDynamicArray(a.spe.data))), l.v = a.v, l.f = a.f, Cs(a.r, a.c, n, l), pd.saveParam("v", a.index, a.v, { r: a.r, c: a.c }) } } rs.webWorkerFlowDataCache(ga.flowdata), this.groupValuesRefreshData = [] } }, delFunctionGroup: function (e, t, a) { null == a && (a = ga.currentSheetIndex); var r = Tl(), n = r[_l(a)], l = n.calcChain; if (null != l) for (var i = 0; i < l.length; i++) { var o = l[i]; if (o.r == e && o.c == t && o.index == a) { l.splice(i, 1), pd.saveParam("fc", a, null, { op: "del", pos: i }); break } } var s = n.dynamicArray; if (null != s) for (var c = 0; c < s.length; c++) { var u = s[c]; if (u.r == e && u.c == t && (null == u.index || u.index == a)) { s.splice(c, 1), pd.saveParam("ac", a, null, { op: "del", pos: c }); break } } Rl(r) }, execfunction: function (e, t, a, r, n, l) { var i = gn().formulaMore; if (e.indexOf(this.error.r) > -1) return [!1, this.error.r, e]; this.checkBracketNum(e) || (e += ")"), null == r && (r = ga.currentSheetIndex), ga.calculateSheetIndex = r; var o = $.trim(this.functionParserExe(e)); if ("luckysheet_function." != o.substr(0, 20) && "luckysheet_compareWith" != o.substr(0, 22) || (this.functionHTMLIndex = 0), !this.testFunction(e, o) || "" == o) return fd.info("", i.execfunctionError), [!1, this.error.n, e]; var s = null; window.luckysheetCurrentRow = t, window.luckysheetCurrentColumn = a, window.luckysheetCurrentIndex = r, window.luckysheetCurrentFunction = e; var c = null; try { if (o.indexOf("luckysheet_getcelldata") > -1) for (var u = o.split("luckysheet_getcelldata('"), d = 1; d < u.length; d++) { var h = u[d].split("')")[0], m = this.getcellrange(h); if (m.row[0] < 0 || m.column[0] < 0) return [!0, this.error.r, e]; if (m.sheetIndex == ga.calculateSheetIndex && t >= m.row[0] && t <= m.row[1] && a >= m.column[0] && a <= m.column[1]) return wa() ? alert(i.execfunctionSelfError) : fd.info("", i.execfunctionSelfErrorResult), [!1, 0, e] } "string" == typeof (s = new Function("return " + o)()) && (s = s.replace(/\x7F/g, '"')), o.indexOf("SPLINES") > -1 && (c = s, s = "") } catch (e) { var p = e; console.log(e, o), p = this.errorInfo(p), s = [this.error.n, p] } "object" == Cm(s) && null != s.startCell && (s = "array" == Cm(s.data) ? this.error.v : "object" != Cm(s.data) || ya(s.data.v) ? ya(s.data) ? 0 : s.cell > 1 || s.rowl > 1 ? s.data : 0 : s.data.v); var f = null; if ("array" == Cm(s)) { var g = !1; "array" != Cm(s[0]) && 2 == s.length && (g = ka(s[0])), g ? s = s[0] : "array" == Cm(s[0]) && 1 == s.length && 1 == s[0].length ? s = s[0][0] : (f = { r: t, c: a, f: e, index: r, data: s }, s = "") } return window.luckysheetCurrentRow = null, window.luckysheetCurrentColumn = null, window.luckysheetCurrentIndex = null, window.luckysheetCurrentFunction = null, null != t && null != a && (n && this.execFunctionGroup(t, a, s, r), l || this.insertUpdateFunctionGroup(t, a, r)), c ? [!0, s, e, { type: "sparklines", data: c }] : f ? [!0, s, e, { type: "dynamicArrayItem", data: f }] : [!0, s, e] }, testFunction: function (e, t) { return "=" == e.substr(0, 1) }, execstringformula: function (e, t, a, r) { return this.execfunction(e, t, a, r) }, functionResizeData: {}, functionResizeStatus: !1, functionResizeTimeout: null, data_parm_index: 0 }; function Rh() { if ($("#luckysheet-cell-selected-boxs").show(), $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").siblings(".luckysheet-cell-selected").remove(), ga.luckysheet_select_save.length > 0) { for (var e = 0; e < ga.luckysheet_select_save.length; e++) { var t = ga.luckysheet_select_save[e].row[0], a = ga.luckysheet_select_save[e].row[1], r = ga.luckysheet_select_save[e].column[0], n = ga.luckysheet_select_save[e].column[1], l = void 0, i = void 0; l = null == ga.luckysheet_select_save[e].row_focus ? t : ga.luckysheet_select_save[e].row_focus, i = null == ga.luckysheet_select_save[e].column_focus ? r : ga.luckysheet_select_save[e].column_focus; var o = ga.visibledatarow[a], s = t - 1 == -1 ? 0 : ga.visibledatarow[t - 1], c = ga.visibledatacolumn[n], u = r - 1 == -1 ? 0 : ga.visibledatacolumn[r - 1], d = ga.visibledatarow[l], h = l - 1 == -1 ? 0 : ga.visibledatarow[l - 1], m = ga.visibledatacolumn[i], p = i - 1 == -1 ? 0 : ga.visibledatacolumn[i - 1], f = xm.mergeborer(ga.flowdata, l, i); f && (d = f.row[1], h = f.row[0], m = f.column[1], p = f.column[0]), ga.luckysheet_select_save[e].row = [t, a], ga.luckysheet_select_save[e].column = [r, n], ga.luckysheet_select_save[e].row_focus = l, ga.luckysheet_select_save[e].column_focus = i, ga.luckysheet_select_save[e].left = p, ga.luckysheet_select_save[e].width = m - p - 1, ga.luckysheet_select_save[e].top = h, ga.luckysheet_select_save[e].height = d - h - 1, ga.luckysheet_select_save[e].left_move = u, ga.luckysheet_select_save[e].width_move = c - u - 1, ga.luckysheet_select_save[e].top_move = s, ga.luckysheet_select_save[e].height_move = o - s - 1, 0 == e ? 1 == ga.luckysheet_select_save.length ? Ml.mobilecheck() ? $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ left: ga.luckysheet_select_save[e].left_move, width: ga.luckysheet_select_save[e].width_move, top: ga.luckysheet_select_save[e].top_move, height: ga.luckysheet_select_save[e].height_move, display: "block", border: "1px solid #0188fb" }).find(".luckysheet-cs-draghandle").css("display", "block").end().find(".luckysheet-cs-fillhandle").css("display", "none").end().find(".luckysheet-cs-touchhandle").css("display", "block") : $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ left: ga.luckysheet_select_save[e].left_move, width: ga.luckysheet_select_save[e].width_move, top: ga.luckysheet_select_save[e].top_move, height: ga.luckysheet_select_save[e].height_move, display: "block", border: "1px solid #0188fb" }).find(".luckysheet-cs-draghandle").css("display", "block").end().find(".luckysheet-cs-fillhandle").css("display", "block").end().find(".luckysheet-cs-touchhandle").css("display", "none") : $("#luckysheet-cell-selected-boxs #luckysheet-cell-selected").css({ left: ga.luckysheet_select_save[e].left_move, width: ga.luckysheet_select_save[e].width_move, top: ga.luckysheet_select_save[e].top_move, height: ga.luckysheet_select_save[e].height_move, display: "block", border: "1px solid rgba(1, 136, 251, 0.15)" }).find(".luckysheet-cs-draghandle").css("display", "none").end().find(".luckysheet-cs-fillhandle").css("display", "none") : $("#luckysheet-cell-selected-boxs").append('
      '), e == ga.luckysheet_select_save.length - 1 && ($("#luckysheet-cell-selected-focus").css({ left: ga.luckysheet_select_save[e].left, width: ga.luckysheet_select_save[e].width, top: ga.luckysheet_select_save[e].top, height: ga.luckysheet_select_save[e].height, display: "block" }), Mh(ga.luckysheet_select_save[e].left_move, ga.luckysheet_select_save[e].top_move, ga.luckysheet_select_save[e].width_move, ga.luckysheet_select_save[e].height_move, [t, a], [r, n]), Ih.fucntionboxshow(l, i), $c.cellFocus(l, i)) } !function (e) { for (var t = $.extend(!0, [], e), a = {}, r = {}, n = 0; n < t.length; n++) { var l = t[n].row[0], i = t[n].row[1], o = t[n].column[0], s = t[n].column[1]; a = $h(a, l, i), r = $h(r, o, s) } $("#luckysheet-rows-h-selected").empty(); for (var c = qh(a), u = 0; u < c.length; u++) { var d = c[u][0], h = As(c[u][c[u].length - 1])[1], m = As(d)[0]; $("#luckysheet-rows-h-selected").append('
      ') } $("#luckysheet-cols-h-selected").empty(); for (var p = qh(r), f = 0; f < p.length; f++) { var g = p[f][0], v = Is(p[f][p[f].length - 1])[1], y = Is(g)[0]; $("#luckysheet-cols-h-selected").append('
      ') } }(ga.luckysheet_select_save), Nh(), 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] && function (e, t) { var a = null == ga.luckysheetfile[_l(ga.currentSheetIndex)].dynamicArray ? [] : ga.luckysheetfile[_l(ga.currentSheetIndex)].dynamicArray, r = Io(a); if (e + "_" + t in r && "#SPILL!" != r[e + "_" + t].v) { for (var n, l, i = r[e + "_" + t].r, o = r[e + "_" + t].c, s = ga.flowdata[i][o].f, c = 0; c < a.length; c++)a[c].f == s && (n = a[c].data.length, l = "array" == Cm(a[c].data[0]) ? a[c].data[0].length : 1); var u = i + n - 1, d = o + l - 1, h = ga.visibledatarow[u], m = i - 1 == -1 ? 0 : ga.visibledatarow[i - 1], p = ga.visibledatacolumn[d], f = o - 1 == -1 ? 0 : ga.visibledatacolumn[o - 1]; $("#luckysheet-dynamicArray-hightShow").css({ left: f, width: p - f - 1, top: m, height: h - m - 1, display: "block" }) } else $("#luckysheet-dynamicArray-hightShow").hide() }(ga.luckysheet_select_save[0].row[0], ga.luckysheet_select_save[0].column[0]) } ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_select_save = ga.luckysheet_select_save; var g = JSON.stringify(ga.luckysheet_select_save); null == ga.luckysheet_select_save_previous | ga.luckysheet_select_save_previous !== g && Nc.createHookFunction("rangeSelect", ga.luckysheetfile[_l(ga.currentSheetIndex)], ga.luckysheet_select_save), ga.luckysheet_select_save_previous = g } function $h(e, t, a) { for (var r = $.extend(!0, {}, e), n = t; n <= a; n++)n in r || (r[n] = 0); return r } function qh(e) { var t = []; for (var a in e) t.push(a); t.sort((function (e, t) { return e - t })); var r = [], n = []; if (t.length > 1) for (var l = 1; l < t.length; l++)t[l] - t[l - 1] == 1 ? (n.push(t[l - 1]), l == t.length - 1 && (n.push(t[l]), r.push(n))) : 1 == l ? l == t.length - 1 ? (n.push(t[l - 1]), r.push(n), r.push([t[l]])) : r.push(t[0]) : l == t.length - 1 ? (n.push(t[l - 1]), r.push(n), r.push([t[l]])) : (n.push(t[l - 1]), r.push(n), n = []); else r.push([t[0]]); return r } function Dh(e) { null == e && (e = ga.luckysheet_select_save); for (var t = !1, a = {}, r = 0; r < e.length; r++)for (var n = e[r].row[0], l = e[r].row[1], i = e[r].column[0], o = e[r].column[1], s = n; s <= l; s++)for (var c = i; c <= o; c++) { if (s + "_" + c in a) { t = !0; break } a[s + "_" + c] = 0 } return t } function Fh() { var e = ga.visibledatacolumn, t = ga.visibledatarow; ga.cooperativeEdit.changeCollaborationSize.forEach((function (a) { if (a.i == ga.currentSheetIndex) { var r = a.v.column, n = e[r[0]] - 1; 0 !== a.v.column[0] && (n = e[r[1]] - e[r[0] - 1] - (r[1] - r[0] + 1)); var l = a.v.row, i = t[l[0]] - 1; 0 !== a.v.row[0] && (i = t[l[1]] - t[l[0] - 1] - (l[1] - l[0] + 1)); var o = ga.cooperativeEdit.merge_range, s = e[a.v.column[0] - 1] - 1, c = t[a.v.row[0] - 1] - 1; if (null !== ga.config.columnlen) for (var u in ga.config.columnlen) if (a.v.column[0] <= u && u <= a.v.column[1]) { ga.luckysheet_cols_change_size_start[1] = u - 0; break } if (null !== ga.config.rowlen) for (var d in ga.config.rowlen) if (a.v.row[0] <= d && d <= a.v.row[1]) { ga.luckysheet_rows_change_size_start[1] = d - 0; break } if (a.v.column[0] <= ga.luckysheet_cols_change_size_start[1] && ga.luckysheet_cols_change_size_start[1] <= a.v.column[1]) if (0 == ga.luckysheet_cols_change_size_start[1]) n = e[0] - 1; else { var h = a.v.column; n = e[h[1]] - e[h[0] - 1] - (h[1] - h[0] + 1) } if (a.v.row[0] <= ga.luckysheet_rows_change_size_start[1] && ga.luckysheet_rows_change_size_start[1] <= a.v.row[1]) if (0 == ga.luckysheet_rows_change_size_start[1]) i = t[0] - 1; else { var m = a.v.row; i = t[m[1]] - t[m[0] - 1] - (m[1] - m[0] + 1) } if (Object.keys(o).length > 0) { var p = !1; if (o.v.length > 1 && (p = Object.keys(o.v[1][0]).length > 0), o.v[0].length > 1 && (p = Object.keys(o.v[0][1]).length > 0), p) { var f = o.column[0] <= a.v.column[0] && o.column[1] >= a.v.column[1]; if (s = e[o.column[0] - 1] - 1, c = t[o.row[0] - 1] - 1, n = e[o.column[1]] - 1, i = t[o.row[1]] - 1, f) { if (0 !== o.column[0]) { var g = o.column; n = e[g[1]] - e[g[0] - 1] - (g[1] - g[0] + 1) } else s = 0; a.v.column = o.column } if (o.row[0] <= a.v.row[0] && o.row[1] >= a.v.row[1]) { if (0 !== o.row[0]) { var v = o.row; i = t[v[1]] - t[v[0] - 1] - (v[1] - v[0] + 1) } else c = 0; a.v.row = o.row } } else n = e[r[0]] - e[r[0] - 1] - 1, 0 === r[0] && (n = e[r[0]] - 1), i = t[l[0]] - t[l[0] - 1] - 1, 0 === l[0] && (i = t[l[0]] - 1) } $("#luckysheet-multipleRange-show-" + a.id).css({ height: i, width: n, top: c + "px", left: s + "px" }); var y = $("#luckysheet-multipleRange-show-" + a.id)[0].offsetHeight - 1; $("#luckysheet-multipleRange-show-" + a.id + ">.username").css({ bottom: y + "px" }) } })) } function Eh(e) { if ($("#luckysheet-selection-copy").empty(), null == e && (e = ga.luckysheet_selection_range), e.length > 0) for (var t = 0; t < e.length; t++) { var a = e[t].row[0], r = e[t].row[1], n = e[t].column[0], l = e[t].column[1], i = ga.visibledatarow[r], o = a - 1 == -1 ? 0 : ga.visibledatarow[a - 1], s = ga.visibledatacolumn[l], c = n - 1 == -1 ? 0 : ga.visibledatacolumn[n - 1], u = '
      '; $("#luckysheet-selection-copy").append(u) } } function Mh(e, t, a, r, n, l) { var i = n[1] - n[0] + 1, o = l[1] - l[0] + 1, s = ga.luckysheetTableContentHW[0], c = ga.luckysheetTableContentHW[1], u = $("#luckysheet-cell-main").scrollLeft(), d = $("#luckysheet-cell-main").scrollTop(), h = gn().info; if (i >= 4) { var m = e - 25; m < 0 && (m = e + 5), m < u && (m = u + 10); var p = t + r / 2; r > c && (p = d + c / 2), $("#luckysheet-row-count-show").css({ left: m, top: p, display: "block", width: "11px" }).html("
      " + i.toString().split("").join("
      ") + "
      " + h.row + "
      ") } else $("#luckysheet-row-count-show").hide(); if (o >= 4) { var f = t - 25; f < 0 && (f = t + 5), f < d && (f = d + 10); var g = e + a / 2; a > s && (g = u + s / 2), $("#luckysheet-column-count-show").css({ left: g, top: f, display: "block" }).text(o + h.column) } else $("#luckysheet-column-count-show").hide() } function Nh() { var e = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], t = e.row_focus, a = e.column_focus; null != ga.config.merge && t + "_" + a in ga.config.merge ? $("#luckysheet-helpbox-cell").text(Cl(ga.currentSheetIndex, { column: [a, a], row: [t, t] })) : $("#luckysheet-helpbox-cell").text(Cl(ga.currentSheetIndex, e)) } var Ph = { moneyFmtList: [{ name: "人民币", pos: "before", value: "¥" }, { name: "美元", pos: "before", value: "$" }, { name: "欧元", pos: "before", value: "€" }, { name: "英镑", pos: "before", value: "£" }, { name: "港元", pos: "before", value: "$" }, { name: "日元", pos: "before", value: "¥" }, { name: "阿尔巴尼亚列克", pos: "before", value: "Lek" }, { name: "阿尔及利亚第纳尔", pos: "before", value: "din" }, { name: "阿富汗尼", pos: "after", value: "Af" }, { name: "阿根廷比索", pos: "before", value: "$" }, { name: "阿拉伯联合酋长国迪拉姆", pos: "before", value: "dh" }, { name: "阿鲁巴弗罗林", pos: "before", value: "Afl" }, { name: "阿曼里亚尔", pos: "before", value: "Rial" }, { name: "阿塞拜疆马纳特", pos: "before", value: "?" }, { name: "埃及镑", pos: "before", value: "£" }, { name: "埃塞俄比亚比尔", pos: "before", value: "Birr" }, { name: "安哥拉宽扎", pos: "before", value: "Kz" }, { name: "澳大利亚元", pos: "before", value: "$" }, { name: "澳门元", pos: "before", value: "MOP" }, { name: "巴巴多斯元", pos: "before", value: "$" }, { name: "巴布亚新几内亚基那", pos: "before", value: "PGK" }, { name: "巴哈马元", pos: "before", value: "$" }, { name: "巴基斯坦卢比", pos: "before", value: "Rs" }, { name: "巴拉圭瓜拉尼", pos: "after", value: "Gs" }, { name: "巴林第纳尔", pos: "before", value: "din" }, { name: "巴拿马巴波亚", pos: "before", value: "B/" }, { name: "巴西里亚伊", pos: "before", value: "R$" }, { name: "白俄罗斯卢布", pos: "after", value: "р" }, { name: "百慕大元", pos: "before", value: "$" }, { name: "保加利亚列弗", pos: "before", value: "lev" }, { name: "冰岛克朗", pos: "before", value: "kr" }, { name: "波黑可兑换马克", pos: "before", value: "KM" }, { name: "波兰兹罗提", pos: "after", value: "z?" }, { name: "玻利维亚诺", pos: "before", value: "Bs" }, { name: "伯利兹元", pos: "before", value: "$" }, { name: "博茨瓦纳普拉", pos: "before", value: "P" }, { name: "不丹努扎姆", pos: "before", value: "Nu" }, { name: "布隆迪法郎", pos: "before", value: "FBu" }, { name: "朝鲜圆", pos: "before", value: "?KP" }, { name: "丹麦克朗", pos: "after", value: "kr" }, { name: "东加勒比元", pos: "before", value: "$" }, { name: "多米尼加比索", pos: "before", value: "RD$" }, { name: "俄国卢布", pos: "after", value: "?" }, { name: "厄立特里亚纳克法", pos: "before", value: "Nfk" }, { name: "非洲金融共同体法郎", pos: "before", value: "CFA" }, { name: "菲律宾比索", pos: "before", value: "?" }, { name: "斐济元", pos: "before", value: "$" }, { name: "佛得角埃斯库多", pos: "before", value: "CVE" }, { name: "福克兰群岛镑", pos: "before", value: "£" }, { name: "冈比亚达拉西", pos: "before", value: "GMD" }, { name: "刚果法郎", pos: "before", value: "FrCD" }, { name: "哥伦比亚比索", pos: "before", value: "$" }, { name: "哥斯达黎加科朗", pos: "before", value: "?" }, { name: "古巴比索", pos: "before", value: "$" }, { name: "古巴可兑换比索", pos: "before", value: "$" }, { name: "圭亚那元", pos: "before", value: "$" }, { name: "哈萨克斯坦坚戈", pos: "before", value: "?" }, { name: "海地古德", pos: "before", value: "HTG" }, { name: "韩元", pos: "before", value: "?" }, { name: "荷属安的列斯盾", pos: "before", value: "NAf." }, { name: "洪都拉斯拉伦皮拉", pos: "before", value: "L" }, { name: "吉布提法郎", pos: "before", value: "Fdj" }, { name: "吉尔吉斯斯坦索姆", pos: "before", value: "KGS" }, { name: "几内亚法郎", pos: "before", value: "FG" }, { name: "加拿大元", pos: "before", value: "$" }, { name: "加纳塞地", pos: "before", value: "GHS" }, { name: "柬埔寨瑞尔", pos: "before", value: "Riel" }, { name: "捷克克朗", pos: "after", value: "K?" }, { name: "津巴布韦元", pos: "before", value: "$" }, { name: "卡塔尔里亚尔", pos: "before", value: "Rial" }, { name: "开曼群岛元", pos: "before", value: "$" }, { name: "科摩罗法郎", pos: "before", value: "CF" }, { name: "科威特第纳尔", pos: "before", value: "din" }, { name: "克罗地亚库纳", pos: "before", value: "kn" }, { name: "肯尼亚先令", pos: "before", value: "Ksh" }, { name: "莱索托洛蒂", pos: "before", value: "LSL" }, { name: "老挝基普", pos: "before", value: "?" }, { name: "黎巴嫩镑", pos: "before", value: "L£" }, { name: "立陶宛立特", pos: "before", value: "Lt" }, { name: "利比亚第纳尔", pos: "before", value: "din" }, { name: "利比亚元", pos: "before", value: "$" }, { name: "卢旺达法郎", pos: "before", value: "RF" }, { name: "罗马尼亚列伊", pos: "before", value: "RON" }, { name: "马达加斯加阿里亚里", pos: "before", value: "Ar" }, { name: "马尔代夫拉菲亚", pos: "before", value: "Rf" }, { name: "马拉维克瓦查", pos: "before", value: "MWK" }, { name: "马来西亚林吉特", pos: "before", value: "RM" }, { name: "马其顿戴第纳尔", pos: "before", value: "din" }, { name: "毛里求斯卢比", pos: "before", value: "MURs" }, { name: "毛里塔尼亚乌吉亚", pos: "before", value: "MRO" }, { name: "蒙古图格里克", pos: "before", value: "?" }, { name: "孟加拉塔卡", pos: "before", value: "?" }, { name: "秘鲁新索尔", pos: "before", value: "S/" }, { name: "缅甸开亚特", pos: "before", value: "K" }, { name: "摩尔多瓦列伊", pos: "before", value: "MDL" }, { name: "摩洛哥迪拉姆", pos: "before", value: "dh" }, { name: "莫桑比克梅蒂卡尔", pos: "before", value: "MTn" }, { name: "墨西哥比索", pos: "before", value: "$" }, { name: "纳米比亚元", pos: "before", value: "$" }, { name: "南非兰特", pos: "before", value: "R" }, { name: "南苏丹镑", pos: "before", value: "£" }, { name: "尼加拉瓜科多巴", pos: "before", value: "C$" }, { name: "尼泊尔卢比", pos: "before", value: "Rs" }, { name: "尼日利亚奈拉", pos: "before", value: "?" }, { name: "挪威克朗", pos: "after", value: "kr" }, { name: "乔治亚拉瑞", pos: "before", value: "GEL" }, { name: "人民币(离岸)", pos: "before", value: "¥" }, { name: "瑞典克朗", pos: "after", value: "kr" }, { name: "瑞士法郎", pos: "before", value: "CHF" }, { name: "塞尔维亚第纳尔", pos: "before", value: "din" }, { name: "塞拉利昂利昂", pos: "before", value: "SLL" }, { name: "塞舌尔卢比", pos: "before", value: "SCR" }, { name: "沙特里亚尔", pos: "before", value: "Rial" }, { name: "圣多美多布拉", pos: "before", value: "Db" }, { name: "圣赫勒拿群岛磅", pos: "before", value: "£" }, { name: "斯里兰卡卢比", pos: "before", value: "Rs" }, { name: "斯威士兰里兰吉尼", pos: "before", value: "SZL" }, { name: "苏丹镑", pos: "before", value: "SDG" }, { name: "苏里南元", pos: "before", value: "$" }, { name: "所罗门群岛元", pos: "before", value: "$" }, { name: "索马里先令", pos: "before", value: "SOS" }, { name: "塔吉克斯坦索莫尼", pos: "before", value: "Som" }, { name: "太平洋法郎", pos: "after", value: "FCFP" }, { name: "泰国铢", pos: "before", value: "?" }, { name: "坦桑尼亚先令", pos: "before", value: "TSh" }, { name: "汤加潘加", pos: "before", value: "T$" }, { name: "特立尼达和多巴哥元", pos: "before", value: "$" }, { name: "突尼斯第纳尔", pos: "before", value: "din" }, { name: "土耳其里拉", pos: "before", value: "?" }, { name: "瓦努阿图瓦图", pos: "before", value: "VUV" }, { name: "危地马拉格查尔", pos: "before", value: "Q" }, { name: "委内瑞拉博利瓦", pos: "before", value: "Bs" }, { name: "文莱元", pos: "before", value: "$" }, { name: "乌干达先令", pos: "before", value: "UGX" }, { name: "乌克兰格里夫尼亚", pos: "before", value: "грн." }, { name: "乌拉圭比索", pos: "before", value: "$" }, { name: "乌兹别克斯坦苏姆", pos: "before", value: "so?m" }, { name: "西萨摩亚塔拉", pos: "before", value: "WST" }, { name: "新加坡元", pos: "before", value: "$" }, { name: "新台币", pos: "before", value: "NT$" }, { name: "新西兰元", pos: "before", value: "$" }, { name: "匈牙利福林", pos: "before", value: "Ft" }, { name: "叙利亚镑", pos: "before", value: "£" }, { name: "牙买加元", pos: "before", value: "$" }, { name: "亚美尼亚德拉姆", pos: "before", value: "Dram" }, { name: "也门里亚尔", pos: "before", value: "Rial" }, { name: "伊拉克第纳尔", pos: "before", value: "din" }, { name: "伊朗里亚尔", pos: "before", value: "Rial" }, { name: "以色列新谢克尔", pos: "before", value: "?" }, { name: "印度卢比", pos: "before", value: "?" }, { name: "印度尼西亚卢比", pos: "before", value: "Rp" }, { name: "约旦第纳尔", pos: "before", value: "din" }, { name: "越南盾", pos: "after", value: "?" }, { name: "赞比亚克瓦查", pos: "before", value: "ZMW" }, { name: "直布罗陀镑", pos: "before", value: "£" }, { name: "智利比索", pos: "before", value: "$" }, { name: "中非金融合作法郎", pos: "before", value: "FCFA" }], dateFmtList: [{ name: "1930-08-05", value: "yyyy-MM-dd" }, { name: "1930/8/5", value: "yyyy/MM/dd" }, { name: "1930年8月5日", value: 'yyyy"年"M"月"d"日"' }, { name: "08-05", value: "MM-dd" }, { name: "8-5", value: "M-d" }, { name: "8月5日", value: 'M"月"d"日"' }, { name: "13:30:30", value: "h:mm:ss" }, { name: "13:30", value: "h:mm" }, { name: "下午01:30", value: "上午/下午 hh:mm" }, { name: "下午1:30", value: "上午/下午 h:mm" }, { name: "下午1:30:30", value: "上午/下午 h:mm:ss" }, { name: "08-05 下午01:30", value: "MM-dd 上午/下午 hh:mm" }], numFmtList: [{ name: "1235", value: "0" }, { name: "1234.56", value: "0.00" }, { name: "1,235", value: "#,##0" }, { name: "1,234.56", value: "#,##0.00" }, { name: "1,235", value: "#,##0_);(#,##0)" }, { name: "1,235", value: "#,##0_);[Red](#,##0)" }, { name: "1,234.56", value: "#,##0.00_);(#,##0.00)" }, { name: "1,234.56", value: "#,##0.00_);[Red](#,##0.00)" }, { name: "$1,235", value: "$#,##0_);($#,##0)" }, { name: "$1,235", value: "$#,##0_);[Red]($#,##0)" }, { name: "$1,234.56", value: "$#,##0.00_);($#,##0.00)" }, { name: "$1,234.56", value: "$#,##0.00_);[Red]($#,##0.00)" }, { name: "1234.56", value: "@" }, { name: "123456%", value: "0%" }, { name: "123456.00%", value: "0.00%" }, { name: "1.23E+03", value: "0.00E+00" }, { name: "1.2E+3", value: "##0.0E+0" }, { name: "1234 5/9", value: "# ?/?" }, { name: "1234 14/25", value: "# ??/??" }, { name: "$ 1,235", value: '_($* #,##0_);_(...($* "-"_);_(@_)' }, { name: "1,235", value: '_(* #,##0_);_(*..._(* "-"_);_(@_)' }, { name: "$ 1,234.56", value: '_($* #,##0.00_);_(...($* "-"_);_(@_)' }, { name: "1,234.56", value: '_(* #,##0.00_);...* "-"??_);_(@_)' }], createDialog: function (e) { var t = gn().currencyDetail, a = gn().format, r = gn().button; this.moneyFmtList = [{ name: t.RMB, pos: "before", value: "¥" }, { name: t.USdollar, pos: "before", value: "$" }, { name: t.EUR, pos: "before", value: "€" }, { name: t.GBP, pos: "before", value: "£" }, { name: t.HK, pos: "before", value: "$" }, { name: t.JPY, pos: "before", value: "¥" }, { name: t.AlbanianLek, pos: "before", value: "Lek" }, { name: t.AlgerianDinar, pos: "before", value: "din" }, { name: t.Afghani, pos: "after", value: "Af" }, { name: t.ArgentinePeso, pos: "before", value: "$" }, { name: t.UnitedArabEmiratesDirham, pos: "before", value: "dh" }, { name: t.ArubanFlorin, pos: "before", value: "Afl" }, { name: t.OmaniRial, pos: "before", value: "Rial" }, { name: t.Azerbaijanimanat, pos: "before", value: "?" }, { name: t.EgyptianPound, pos: "before", value: "£" }, { name: t.EthiopianBirr, pos: "before", value: "Birr" }, { name: t.AngolaKwanza, pos: "before", value: "Kz" }, { name: t.AustralianDollar, pos: "before", value: "$" }, { name: t.Patacas, pos: "before", value: "MOP" }, { name: t.BarbadosDollar, pos: "before", value: "$" }, { name: t.PapuaNewGuineaKina, pos: "before", value: "PGK" }, { name: t.BahamianDollar, pos: "before", value: "$" }, { name: t.PakistanRupee, pos: "before", value: "Rs" }, { name: t.ParaguayanGuarani, pos: "after", value: "Gs" }, { name: t.BahrainiDinar, pos: "before", value: "din" }, { name: t.PanamanianBalboa, pos: "before", value: "B/" }, { name: t.Brazilianreal, pos: "before", value: "R$" }, { name: t.Belarusianruble, pos: "after", value: "р" }, { name: t.BermudianDollar, pos: "before", value: "$" }, { name: t.BulgarianLev, pos: "before", value: "lev" }, { name: t.IcelandKrona, pos: "before", value: "kr" }, { name: t.BosniaHerzegovinaConvertibleMark, pos: "before", value: "KM" }, { name: t.PolishZloty, pos: "after", value: "z?" }, { name: t.Boliviano, pos: "before", value: "Bs" }, { name: t.BelizeDollar, pos: "before", value: "$" }, { name: t.BotswanaPula, pos: "before", value: "P" }, { name: t.NotDannuzhamu, pos: "before", value: "Nu" }, { name: t.BurundiFranc, pos: "before", value: "FBu" }, { name: t.NorthKoreanWon, pos: "before", value: "?KP" }, { name: t.DanishKrone, pos: "after", value: "kr" }, { name: t.EastCaribbeanDollar, pos: "before", value: "$" }, { name: t.DominicaPeso, pos: "before", value: "RD$" }, { name: t.RussianRuble, pos: "after", value: "?" }, { name: t.EritreanNakfa, pos: "before", value: "Nfk" }, { name: t.CFAfranc, pos: "before", value: "CFA" }, { name: t.PhilippinePeso, pos: "before", value: "?" }, { name: t.FijiDollar, pos: "before", value: "$" }, { name: t.CapeVerdeEscudo, pos: "before", value: "CVE" }, { name: t.FalklandIslandsPound, pos: "before", value: "£" }, { name: t.GambianDalasi, pos: "before", value: "GMD" }, { name: t.Congolesefranc, pos: "before", value: "FrCD" }, { name: t.ColombianPeso, pos: "before", value: "$" }, { name: t.CostaRicanColon, pos: "before", value: "?" }, { name: t.CubanPeso, pos: "before", value: "$" }, { name: t.Cubanconvertiblepeso, pos: "before", value: "$" }, { name: t.GuyanaDollar, pos: "before", value: "$" }, { name: t.KazakhstanTenge, pos: "before", value: "?" }, { name: t.Haitiangourde, pos: "before", value: "HTG" }, { name: t.won, pos: "before", value: "?" }, { name: t.NetherlandsAntillesGuilder, pos: "before", value: "NAf." }, { name: t.Honduraslempiras, pos: "before", value: "L" }, { name: t.DjiboutiFranc, pos: "before", value: "Fdj" }, { name: t.KyrgyzstanSom, pos: "before", value: "KGS" }, { name: t.GuineaFranc, pos: "before", value: "FG" }, { name: t.CanadianDollar, pos: "before", value: "$" }, { name: t.GhanaianCedi, pos: "before", value: "GHS" }, { name: t.Cambodianriel, pos: "before", value: "Riel" }, { name: t.CzechKoruna, pos: "after", value: "K?" }, { name: t.ZimbabweDollar, pos: "before", value: "$" }, { name: t.QatariRiyal, pos: "before", value: "Rial" }, { name: t.CaymanIslandsDollar, pos: "before", value: "$" }, { name: t.Comorianfranc, pos: "before", value: "CF" }, { name: t.KuwaitiDinar, pos: "before", value: "din" }, { name: t.CroatianKuna, pos: "before", value: "kn" }, { name: t.KenyanShilling, pos: "before", value: "Ksh" }, { name: t.LesothoLoti, pos: "before", value: "LSL" }, { name: t.LaoKip, pos: "before", value: "?" }, { name: t.LebanesePound, pos: "before", value: "L£" }, { name: t.Lithuanianlitas, pos: "before", value: "Lt" }, { name: t.LibyanDinar, pos: "before", value: "din" }, { name: t.LiberianDollar, pos: "before", value: "$" }, { name: t.RwandaFranc, pos: "before", value: "RF" }, { name: t.RomanianLeu, pos: "before", value: "RON" }, { name: t.MalagasyAriary, pos: "before", value: "Ar" }, { name: t.MaldivianRufiyaa, pos: "before", value: "Rf" }, { name: t.MalawiKwacha, pos: "before", value: "MWK" }, { name: t.MalaysianRinggit, pos: "before", value: "RM" }, { name: t.MacedoniawearingDinar, pos: "before", value: "din" }, { name: t.MauritiusRupee, pos: "before", value: "MURs" }, { name: t.MauritanianOuguiya, pos: "before", value: "MRO" }, { name: t.MongolianTugrik, pos: "before", value: "?" }, { name: t.BangladeshiTaka, pos: "before", value: "?" }, { name: t.PeruvianNuevoSol, pos: "before", value: "S/" }, { name: t.MyanmarKyat, pos: "before", value: "K" }, { name: t.MoldovanLeu, pos: "before", value: "MDL" }, { name: t.MoroccanDirham, pos: "before", value: "dh" }, { name: t.MozambiqueMetical, pos: "before", value: "MTn" }, { name: t.MexicanPeso, pos: "before", value: "$" }, { name: t.NamibianDollar, pos: "before", value: "$" }, { name: t.SouthAfricanRand, pos: "before", value: "R" }, { name: t.SouthSudanesePound, pos: "before", value: "£" }, { name: t.NicaraguaCordoba, pos: "before", value: "C$" }, { name: t.NepaleseRupee, pos: "before", value: "Rs" }, { name: t.NigerianNaira, pos: "before", value: "?" }, { name: t.NorwegianKrone, pos: "after", value: "kr" }, { name: t.GeorgianLari, pos: "before", value: "GEL" }, { name: t.RenminbiOffshore, pos: "before", value: "¥" }, { name: t.SwedishKrona, pos: "after", value: "kr" }, { name: t.SwissFranc, pos: "before", value: "CHF" }, { name: t.SerbianDinar, pos: "before", value: "din" }, { name: t.SierraLeone, pos: "before", value: "SLL" }, { name: t.SeychellesRupee, pos: "before", value: "SCR" }, { name: t.SaudiRiyal, pos: "before", value: "Rial" }, { name: t.SaoTomeDobra, pos: "before", value: "Db" }, { name: t.SaintHelenapound, pos: "before", value: "£" }, { name: t.SriLankaRupee, pos: "before", value: "Rs" }, { name: t.SwazilandLilangeni, pos: "before", value: "SZL" }, { name: t.SudanesePound, pos: "before", value: "SDG" }, { name: t.Surinamesedollar, pos: "before", value: "$" }, { name: t.SolomonIslandsDollar, pos: "before", value: "$" }, { name: t.SomaliShilling, pos: "before", value: "SOS" }, { name: t.TajikistanSomoni, pos: "before", value: "Som" }, { name: t.PacificFranc, pos: "after", value: "FCFP" }, { name: t.ThaiBaht, pos: "before", value: "?" }, { name: t.TanzanianShilling, pos: "before", value: "TSh" }, { name: t.TonganPaanga, pos: "before", value: "T$" }, { name: t.TrinidadandTobagoDollar, pos: "before", value: "$" }, { name: t.TunisianDinar, pos: "before", value: "din" }, { name: t.TurkishLira, pos: "before", value: "?" }, { name: t.VanuatuVatu, pos: "before", value: "VUV" }, { name: t.GuatemalanQuetzal, pos: "before", value: "Q" }, { name: t.CommissionBolivar, pos: "before", value: "Bs" }, { name: t.BruneiDollar, pos: "before", value: "$" }, { name: t.UgandanShilling, pos: "before", value: "UGX" }, { name: t.UkrainianHryvnia, pos: "before", value: "грн." }, { name: t.UruguayanPeso, pos: "before", value: "$" }, { name: t.Uzbekistansom, pos: "before", value: "so?m" }, { name: t.WesternSamoaTala, pos: "before", value: "WST" }, { name: t.SingaporeDollar, pos: "before", value: "$" }, { name: t.NT, pos: "before", value: "NT$" }, { name: t.NewZealandDollar, pos: "before", value: "$" }, { name: t.HungarianForint, pos: "before", value: "Ft" }, { name: t.SyrianPound, pos: "before", value: "£" }, { name: t.JamaicanDollar, pos: "before", value: "$" }, { name: t.ArmenianDram, pos: "before", value: "Dram" }, { name: t.YemeniRial, pos: "before", value: "Rial" }, { name: t.IraqiDinar, pos: "before", value: "din" }, { name: t.IranianRial, pos: "before", value: "Rial" }, { name: t.NewIsraeliShekel, pos: "before", value: "?" }, { name: t.IndianRupee, pos: "before", value: "?" }, { name: t.IndonesianRupiah, pos: "before", value: "Rp" }, { name: t.JordanianDinar, pos: "before", value: "din" }, { name: t.VND, pos: "after", value: "?" }, { name: t.ZambianKwacha, pos: "before", value: "ZMW" }, { name: t.GibraltarPound, pos: "before", value: "£" }, { name: t.ChileanPeso, pos: "before", value: "$" }, { name: t.CFAFrancBEAC, pos: "before", value: "FCFA" }], this.dateFmtList = gn().dateFmtList, this.numFmtList = [{ name: "1235", value: "0" }, { name: "1234.56", value: "0.00" }, { name: "1,235", value: "#,##0" }, { name: "1,234.56", value: "#,##0.00" }, { name: "1,235", value: "#,##0_);(#,##0)" }, { name: "1,235", value: "#,##0_);[Red](#,##0)" }, { name: "1,234.56", value: "#,##0.00_);(#,##0.00)" }, { name: "1,234.56", value: "#,##0.00_);[Red](#,##0.00)" }, { name: "$1,235", value: "$#,##0_);($#,##0)" }, { name: "$1,235", value: "$#,##0_);[Red]($#,##0)" }, { name: "$1,234.56", value: "$#,##0.00_);($#,##0.00)" }, { name: "$1,234.56", value: "$#,##0.00_);[Red]($#,##0.00)" }, { name: "1234.56", value: "@" }, { name: "123456%", value: "0%" }, { name: "123456.00%", value: "0.00%" }, { name: "1.23E+03", value: "0.00E+00" }, { name: "1.2E+3", value: "##0.0E+0" }, { name: "1234 5/9", value: "# ?/?" }, { name: "1234 14/25", value: "# ??/??" }, { name: "$ 1,235", value: '_($* #,##0_);_(...($* "-"_);_(@_)' }, { name: "1,235", value: '_(* #,##0_);_(*..._(* "-"_);_(@_)' }, { name: "$ 1,234.56", value: '_($* #,##0.00_);_(...($* "-"_);_(@_)' }, { name: "1,234.56", value: '_(* #,##0.00_);...* "-"??_);_(@_)' }], $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-moreFormat-dialog").remove(); var n = "", l = ""; if ("morecurrency" == e) { n = a.titleCurrency; for (var i = "", o = 0; o < this.moneyFmtList.length; o++) { var s = this.moneyFmtList[o].name, c = this.moneyFmtList[o].pos; i += '
      ' + s + '
      ' + this.moneyFmtList[o].value + '
      ' } l = '
      ' + i + "
      " } else if ("moredatetime" == e) { n = a.titleDateTime; for (var u = "", d = 0; d < this.dateFmtList.length; d++) { u += '
      ' + this.dateFmtList[d].name + '
      ' + this.dateFmtList[d].value + "
      " } l = '
      ' + u + "
      " } else if ("moredigit" == e) { n = a.titleNumber; for (var h = "", m = 0; m < this.numFmtList.length; m++) { h += '
      ' + this.numFmtList[m].name + '
      ' + this.numFmtList[m].value + "
      " } l = '
      ' + h + "
      " } $("body").append(_m(bn, { id: "luckysheet-moreFormat-dialog", addclass: "luckysheet-moreFormat-dialog", title: n, content: l, botton: '", style: "z-index:100003" })); var p = $("#luckysheet-moreFormat-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), f = p.outerHeight(), g = p.outerWidth(), v = $(window).width(), y = $(window).height(), b = $(document).scrollLeft(), k = $(document).scrollTop(); $("#luckysheet-moreFormat-dialog").css({ left: (v + b - g) / 2, top: (y + k - f) / 3 }).show(), $("#luckysheet-moreFormat-dialog .listbox .listItem").eq(0).addClass("on") }, init: function () { $(document).on("click", "#luckysheet-moreFormat-dialog .listbox .listItem", (function () { $(this).addClass("on").siblings().removeClass("on") })), $(document).off("click.moreFormatConfirm").on("click.moreFormatConfirm", "#luckysheet-moreFormat-dialog #luckysheet-moreFormat-dialog-confirm", (function () { $("#luckysheet-moreFormat-dialog").hide(), $("#luckysheet-modal-dialog-mask").hide(); var e = rs.deepCopyFlowData(ga.flowdata), t = $("#luckysheet-moreFormat-dialog .listbox .listItem.on .value").text(), a = $(this).parents("#luckysheet-moreFormat-dialog").find(".box").attr("id"); if ("morecurrency" == a) { if (-1 != t.indexOf("?")) return; var r = parseInt($("#luckysheet-moreFormat-dialog .decimal input").val().trim()); if ("NaN" == r.toString() || r < 0 || r > 9) return void (wa() ? alert("小数位数必须在0-9之间!") : fd.info("小数位数必须在0-9之间!", "")); var n = ""; if (r > 0) { for (var l = 1; l <= r; l++)n += "0"; n = "0." + n } else n = "#"; var i = $("#luckysheet-moreFormat-dialog .listbox .listItem.on input:hidden").val(); "before" == i ? n = '"' + t + '" ' + n : "after" == i && (n = n + ' "' + t + '"'), xm.updateFormat(e, "ct", n) } else ("moredatetime" == a || "moredigit" == a) && xm.updateFormat(e, "ct", t) })) } }, zh = { createDialog: function (e) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-search-replace").remove(); var t = gn(), a = t.findAndReplace, r = t.button, n = '
      ' + a.find + '' + a.replace + '
      ' + a.findTextbox + ':
      ' + a.replaceTextbox + ':
      ' + a.regexTextbox + '
      ' + a.wholeTextbox + '
      ' + a.distinguishTextbox + '
      "; $("body").append(_m(bn, { id: "luckysheet-search-replace", addclass: "luckysheet-search-replace", title: "", content: n, botton: '", style: "z-index:100003", close: r.close })); var l = $("#luckysheet-search-replace").find(".luckysheet-modal-dialog-content").css("min-width", 500).end(), i = l.outerHeight(), o = l.outerWidth(), s = $(window).width(), c = $(window).height(), u = $(document).scrollLeft(), d = $(document).scrollTop(); $("#luckysheet-search-replace").css({ left: (s + u - o) / 2, top: (c + d - i) / 3 }).show(), "0" == e ? ($("#luckysheet-search-replace #searchTab").addClass("on").siblings().removeClass("on"), $("#luckysheet-search-replace #replaceInput").hide(), $("#luckysheet-search-replace #replaceAllBtn").hide(), $("#luckysheet-search-replace #replaceBtn").hide()) : "1" == e && ($("#luckysheet-search-replace #replaceTab").addClass("on").siblings().removeClass("on"), $("#luckysheet-search-replace #replaceInput").show(), $("#luckysheet-search-replace #replaceAllBtn").show(), $("#luckysheet-search-replace #replaceBtn").show()) }, init: function () { var e = this; $(document).off("click.SRtabBoxspan").on("click.SRtabBoxspan", "#luckysheet-search-replace .tabBox span", (function () { $(this).addClass("on").siblings().removeClass("on"); var e = $(this).attr("id"); "searchTab" == e ? ($("#luckysheet-search-replace #replaceInput").hide(), $("#luckysheet-search-replace #replaceAllBtn").hide(), $("#luckysheet-search-replace #replaceBtn").hide(), $("#luckysheet-search-replace #searchInput input").focus()) : "replaceTab" == e && ($("#luckysheet-search-replace #replaceInput").show(), $("#luckysheet-search-replace #replaceAllBtn").show(), $("#luckysheet-search-replace #replaceBtn").show(), $("#luckysheet-search-replace #replaceInput input").focus()) })), $(document).off("keyup.SRsearchInput").on("keyup.SRsearchInput", "#luckysheet-search-replace #searchInput input", (function (t) { t.keyCode == Sn && e.searchNext() })), $(document).off("click.SRsearchNextBtn").on("click.SRsearchNextBtn", "#luckysheet-search-replace #searchNextBtn", (function () { e.searchNext() })), $(document).off("click.SRsearchAllBtn").on("click.SRsearchAllBtn", "#luckysheet-search-replace #searchAllBtn", (function () { e.searchAll() })), $(document).off("click.SRsearchAllboxItem").on("click.SRsearchAllboxItem", "#luckysheet-search-replace #searchAllbox .boxItem", (function () { $(this).addClass("on").siblings().removeClass("on"); var e = $(this).attr("data-row"), t = $(this).attr("data-col"), a = $(this).attr("data-sheetIndex"); a != ga.currentSheetIndex && Sh.changeSheetExec(a), ga.luckysheet_select_save = [{ row: [e, e], column: [t, t] }], Rh(); var r = $("#luckysheet-cell-main").scrollLeft(), n = $("#luckysheet-cell-main").scrollTop(), l = $("#luckysheet-cell-main").height(), i = $("#luckysheet-cell-main").width(), o = ga.visibledatarow[e], s = e - 1 == -1 ? 0 : ga.visibledatarow[e - 1], c = ga.visibledatacolumn[t], u = t - 1 == -1 ? 0 : ga.visibledatacolumn[t - 1]; c - r - i + 20 > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(c - i + 20) : u - r - 20 < 0 && $("#luckysheet-scrollbar-x").scrollLeft(u - 20), o - n - l + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(o - l + 20) : s - n - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(s - 20) })), $(document).off("click.SRreplaceBtn").on("click.SRreplaceBtn", "#luckysheet-search-replace #replaceBtn", (function () { e.replace() })), $(document).off("click.SRreplaceAllBtn").on("click.SRreplaceAllBtn", "#luckysheet-search-replace #replaceAllBtn", (function () { e.replaceAll() })) }, searchNext: function () { var e = $("#luckysheet-search-replace #searchInput input").val(); if ("" != e && null != e) { var t, a = gn().findAndReplace; t = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save); var r = this.getSearchIndexArr(e, t); if (0 != r.length) { var n = 0; if (0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1]) { if (0 == ga.luckysheet_select_save.length) n = 0; else for (var l = 0; l < r.length; l++)if (r[l].r == ga.luckysheet_select_save[0].row[0] && r[l].c == ga.luckysheet_select_save[0].column[0]) { n = l == r.length - 1 ? 0 : l + 1; break } ga.luckysheet_select_save = [{ row: [r[n].r, r[n].r], column: [r[n].c, r[n].c] }] } else { for (var i = t[t.length - 1].row_focus, o = t[t.length - 1].column_focus, s = 0; s < r.length; s++)if (r[s].r == i && r[s].c == o) { n = s == r.length - 1 ? 0 : s + 1; break } for (var c = 0; c < t.length; c++) { var u = t[c].row[0], d = t[c].row[1], h = t[c].column[0], m = t[c].column[1]; if (r[n].r >= u && r[n].r <= d && r[n].c >= h && r[n].c <= m) { var p = t[c]; p.row_focus = r[n].r, p.column_focus = r[n].c, t.splice(c, 1), t.push(p); break } } ga.luckysheet_select_save = t } Rh(); var f = $("#luckysheet-cell-main").scrollLeft(), g = $("#luckysheet-cell-main").scrollTop(), v = $("#luckysheet-cell-main").height(), y = $("#luckysheet-cell-main").width(), b = ga.visibledatarow[r[n].r], k = r[n].r - 1 == -1 ? 0 : ga.visibledatarow[r[n].r - 1], x = ga.visibledatacolumn[r[n].c], w = r[n].c - 1 == -1 ? 0 : ga.visibledatacolumn[r[n].c - 1]; x - f - y + 20 > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(x - y + 20) : w - f - 20 < 0 && $("#luckysheet-scrollbar-x").scrollLeft(w - 20), b - g - v + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(b - v + 20) : k - g - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(k - 20), $("#searchAllbox").is(":visible") && $("#luckysheet-search-replace #searchAllbox .boxItem").removeClass("on") } else wa() ? alert(a.noFindTip) : fd.info(a.noFindTip, "") } }, searchAll: function () { var e = gn().findAndReplace; $("#luckysheet-search-replace #searchAllbox").remove(); var t = $("#luckysheet-search-replace #searchInput input").val(); if ("" != t && null != t) { var a; a = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save); var r = this.getSearchIndexArr(t, a); if (0 != r.length) { for (var n = "", l = 0; l < r.length; l++) { var i = _s(r[l].r, r[l].c, ga.flowdata).toString(); i.indexOf(" -1 && i.indexOf(">") > -1 ? n += '
      ' + ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "" + Im(r[l].c) + (r[l].r + 1) + "" + i + "
      " : n += '
      ' + ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "" + Im(r[l].c) + (r[l].r + 1) + '' + i + "
      " } $('
      ' + e.searchTargetSheet + "" + e.searchTargetCell + "" + e.searchTargetValue + '
      ' + n + "
      ").appendTo($("#luckysheet-search-replace")), $("#luckysheet-search-replace #searchAllbox .boxItem").eq(0).addClass("on").siblings().removeClass("on"), ga.luckysheet_select_save = [{ row: [r[0].r, r[0].r], column: [r[0].c, r[0].c] }], Rh() } else wa() ? alert(e.noFindTip) : fd.info(e.noFindTip, "") } }, getSearchIndexArr: function (e, t) { var a = [], r = {}, n = !1; $("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked") && (n = !0); var l = !1; $("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked") && (l = !0); var i = !1; $("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked") && (i = !0); for (var o = 0; o < t.length; o++)for (var s = t[o].row[0], c = t[o].row[1], u = t[o].column[0], d = t[o].column[1], h = s; h <= c; h++)for (var m = u; m <= d; m++) { if (null != ga.flowdata[h][m]) { var p = _s(h, m, ga.flowdata); if (0 == p && (p = p.toString()), null != p && "" != p) if (p = p.toString(), l) if (i) e == p && (h + "_" + m in r || (r[h + "_" + m] = 0, a.push({ r: h, c: m }))); else e.toLowerCase() == p.toLowerCase() && (h + "_" + m in r || (r[h + "_" + m] = 0, a.push({ r: h, c: m }))); else if (n) { (i ? new RegExp(Yd.getRegExpStr(e), "g") : new RegExp(Yd.getRegExpStr(e), "ig")).test(p) && (h + "_" + m in r || (r[h + "_" + m] = 0, a.push({ r: h, c: m }))) } else if (i) { new RegExp(Yd.getRegExpStr(e), "g").test(p) && (h + "_" + m in r || (r[h + "_" + m] = 0, a.push({ r: h, c: m }))) } else { new RegExp(Yd.getRegExpStr(e), "ig").test(p) && (h + "_" + m in r || (r[h + "_" + m] = 0, a.push({ r: h, c: m }))) } } } return a }, replace: function () { var e = gn().findAndReplace; if (ga.allowEdit) { var t = $("#luckysheet-search-replace #searchInput input").val(); if ("" != t && null != t) { var a; a = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save); var r = this.getSearchIndexArr(t, a); if (0 != r.length) { for (var n = null, l = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], i = l.row_focus, o = l.column_focus, s = 0; s < r.length; s++)if (r[s].r == i && r[s].c == o) { n = s; break } if (null == n) { if (0 == r.length) return void (wa() ? alert(e.noMatchTip) : fd.info(e.noMatchTip, "")); n = 0 } $("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked"); var c = !1; $("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked") && (c = !0); var u = !1; $("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked") && (u = !0); var d, h, m, p = $("#luckysheet-search-replace #replaceInput input").val(), f = rs.deepCopyFlowData(ga.flowdata); if (c) Cs(d = r[n].r, h = r[n].c, f, p); else m = u ? new RegExp(Yd.getRegExpStr(t), "g") : new RegExp(Yd.getRegExpStr(t), "ig"), Cs(d = r[n].r, h = r[n].c, f, _s(d, h, f).toString().replace(m, p)); ga.luckysheet_select_save = [{ row: [d, d], column: [h, h] }], $("#luckysheet-search-replace #searchAllbox").is(":visible") && $("#luckysheet-search-replace #searchAllbox").hide(), id(f, ga.luckysheet_select_save), Rh(); var g = $("#luckysheet-cell-main").scrollLeft(), v = $("#luckysheet-cell-main").scrollTop(), y = $("#luckysheet-cell-main").height(), b = $("#luckysheet-cell-main").width(), k = ga.visibledatarow[d], x = d - 1 == -1 ? 0 : ga.visibledatarow[d - 1], w = ga.visibledatacolumn[h], _ = h - 1 == -1 ? 0 : ga.visibledatacolumn[h - 1]; w - g - b + 20 > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(w - b + 20) : _ - g - 20 < 0 && $("#luckysheet-scrollbar-x").scrollLeft(_ - 20), k - v - y + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(k - y + 20) : x - v - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(x - 20) } else wa() ? alert(e.noReplceTip) : fd.info(e.noReplceTip, "") } else wa() ? alert(e.searchInputTip) : fd.info(e.searchInputTip, "") } else fd.info(e.modeTip, "") }, replaceAll: function () { var e = gn().findAndReplace; if (ga.allowEdit) { var t = $("#luckysheet-search-replace #searchInput input").val(); if ("" != t && null != t) { var a; a = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save); var r = this.getSearchIndexArr(t, a); if (0 != r.length) { $("#luckysheet-search-replace #regCheck input[type='checkbox']").is(":checked"); var n = !1; $("#luckysheet-search-replace #wordCheck input[type='checkbox']").is(":checked") && (n = !0); var l = !1; $("#luckysheet-search-replace #caseCheck input[type='checkbox']").is(":checked") && (l = !0); var i = $("#luckysheet-search-replace #replaceInput input").val(), o = rs.deepCopyFlowData(ga.flowdata); if (n) for (var s = 0; s < r.length; s++) { var c = r[s].r, u = r[s].c; Cs(c, u, o, i), a.push({ row: [c, c], column: [u, u] }) } else { var d; d = l ? new RegExp(Yd.getRegExpStr(t), "g") : new RegExp(Yd.getRegExpStr(t), "ig"); for (var h = 0; h < r.length; h++) { var m = r[h].r, p = r[h].c; Cs(m, p, o, _s(m, p, o).toString().replace(d, i)), a.push({ row: [m, m], column: [p, p] }) } } $("#luckysheet-search-replace #searchAllbox").is(":visible") && $("#luckysheet-search-replace #searchAllbox").hide(), id(o, a), ga.luckysheet_select_save = $.extend(!0, [], a), Rh(); var f = _m(e.successTip, { xlength: r.length }); wa() ? alert(f) : fd.info(f, "") } else wa() ? alert(e.noReplceTip) : fd.info(e.noReplceTip, "") } else wa() ? alert(e.searchInputTip) : fd.info(e.searchInputTip, "") } else fd.info(e.modeTip, "") } }, Lh = { createDialog: function () { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-locationCell-dialog").remove(); var e = gn(), t = e.findAndReplace, a = e.button, r = '
      "; $("body").append(_m(bn, { id: "luckysheet-locationCell-dialog", addclass: "luckysheet-locationCell-dialog", title: t.location, content: r, botton: '", style: "z-index:100003" })); var n = $("#luckysheet-locationCell-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-locationCell-dialog").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show() }, init: function () { var e = this, t = gn().findAndReplace; $(document).on("click", "#luckysheet-locationCell-dialog .listItem input:radio", (function (e) { $("#luckysheet-locationCell-dialog .listItem input:checkbox").prop("disabled", !0), $("#luckysheet-locationCell-dialog .listItem .subbox label").css("color", "#666"), $(this).siblings(".subbox").find("input:checkbox").removeAttr("disabled"), $(this).siblings(".subbox").find("label").css("color", "#000") })), $(document).off("click.locationCellConfirm").on("click.locationCellConfirm", "#luckysheet-locationCell-dialog #luckysheet-locationCell-dialog-confirm", (function () { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-locationCell-dialog").hide(); var a = $("#luckysheet-locationCell-dialog .listItem input:radio:checked"), r = a.attr("id"); if ("locationConstant" == r || "locationFormula" == r) { var n, l, i = a.siblings(".subbox").find("input:checkbox:checked"); if (0 == i.length) return; if (5 == i.length) n = "all"; else { for (var o = [], s = 0; s < i.length; s++)$(i[s]).hasClass("date") ? o.push("d") : $(i[s]).hasClass("number") ? o.push("n") : $(i[s]).hasClass("string") ? o.push("s,g") : $(i[s]).hasClass("boolean") ? o.push("b") : $(i[s]).hasClass("error") && o.push("e"); n = o.join(",") } l = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save), e.apply(l, r, n) } else if ("locationStepRow" == r) { if (0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1]) return void (wa() ? alert(t.locationTiplessTwoRow) : fd.info("", t.locationTiplessTwoRow)); var c = $.extend(!0, [], ga.luckysheet_select_save); e.apply(c, "locationStepRow") } else if ("locationStepColumn" == r) { if (0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1]) return void (wa() ? alert(t.locationTiplessTwoColumn) : fd.info("", t.locationTiplessTwoColumn)); var u = $.extend(!0, [], ga.luckysheet_select_save); e.apply(u, "locationStepColumn") } else { var d; d = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1] && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save), e.apply(d, r) } })) }, apply: function (e, t, a) { var r = gn().findAndReplace, n = []; if ("locationFormula" == t || "locationConstant" == t || "locationNull" == t) { for (var l = null, i = null, o = null, s = null, c = {}, u = 0; u < e.length; u++) { var d = e[u].row[0], h = e[u].row[1], m = e[u].column[0], p = e[u].column[1]; (null == l || l < d) && (l = d), (null == i || i > h) && (i = h), (null == o || o < m) && (o = m), (null == s || s > p) && (s = p); for (var f = d; f <= h; f++)for (var g = m; g <= p; g++) { var v = ga.flowdata[f][g]; null != v && null != v.mc && (v = ga.flowdata[v.mc.r][v.mc.c]), "locationFormula" == t && null != v && !ya(v.v) && null != v.f && ("all" == a || null != v.ct && a.indexOf(v.ct.t) > -1) || "locationConstant" == t && null != v && !ya(v.v) && ("all" == a || null != v.ct && a.indexOf(v.ct.t) > -1) ? c[f + "_" + g] = 0 : "locationNull" != t || null != v && !ya(v.v) || (c[f + "_" + g] = 0) } } n = this.getRangeArr(l, i, o, s, c, n) } else if ("locationCF" == t) { var y = _l(ga.currentSheetIndex), b = ga.luckysheetfile[y].luckysheet_conditionformat_save, k = ga.luckysheetfile[y].data; if (null == b || 0 == b.length) return void (wa() ? alert(r.locationTipNotFindCell) : fd.info("", r.locationTipNotFindCell)); if (computeMap = gd.compute(b, k), 0 == Object.keys(computeMap).length) return void (wa() ? alert(r.locationTipNotFindCell) : fd.info("", r.locationTipNotFindCell)); for (var x = null, w = null, _ = null, C = null, T = {}, A = 0; A < e.length; A++) { var S = e[A].row[0], I = e[A].row[1], R = e[A].column[0], q = e[A].column[1]; (null == x || x < S) && (x = S), (null == w || w > I) && (w = I), (null == _ || _ < R) && (_ = R), (null == C || C > q) && (C = q); for (var D = S; D <= I; D++)for (var F = R; F <= q; F++)D + "_" + F in computeMap && (T[D + "_" + F] = 0) } n = this.getRangeArr(x, w, _, C, T, n) } else if ("locationStepRow" == t) { for (var E = 0; E < e.length; E++)if (e[E].row[0] != e[E].row[1]) for (var M = e[E].row[0], N = e[E].row[1], P = e[E].column[0], z = e[E].column[1], L = M; L <= N; L++)(L - M) % 2 == 0 && n.push({ row: [L, L], column: [P, z] }) } else if ("locationStepColumn" == t) for (var O = 0; O < e.length; O++)if (e[O].column[0] != e[O].column[1]) for (var B = e[O].row[0], V = e[O].row[1], H = e[O].column[0], U = e[O].column[1], j = H; j <= U; j++)(j - H) % 2 == 0 && n.push({ row: [B, V], column: [j, j] }); if (0 == n.length) wa() ? alert(r.locationTipNotFindCell) : fd.info("", r.locationTipNotFindCell); else { ga.luckysheet_select_save = n, Rh(); var G = $("#luckysheet-cell-main").scrollLeft(), W = $("#luckysheet-cell-main").scrollTop(), Y = $("#luckysheet-cell-main").height(), X = $("#luckysheet-cell-main").width(), K = ga.luckysheet_select_save[0].row[0], Z = ga.luckysheet_select_save[0].row[1], Q = ga.luckysheet_select_save[0].column[0], J = ga.luckysheet_select_save[0].column[1], ee = ga.visibledatarow[Z], te = K - 1 == -1 ? 0 : ga.visibledatarow[K - 1], ae = ga.visibledatacolumn[J], re = Q - 1 == -1 ? 0 : ga.visibledatacolumn[Q - 1]; ae - G - X + 20 > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(ae - X + 20) : re - G - 20 < 0 && $("#luckysheet-scrollbar-x").scrollLeft(re - 20), ee - W - Y + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(ee - Y + 20) : te - W - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(te - 20) } }, getRangeArr: function (e, t, a, r, n, l) { if (0 == Object.keys(n).length) return l; for (var i = null, o = null, s = null, c = null, u = e; u <= t; u++)for (var d = a; d <= r; d++) { var h = ga.flowdata[u][d]; if (u + "_" + d in n) { if (null != h && null != h.mc) { if (null == s) { var m = { row: [h.mc.r, h.mc.r + h.mc.rs - 1], column: [h.mc.c, h.mc.c + h.mc.cs - 1] }; return l.push(m), n = this.deleteCellInSave(n, m), this.getRangeArr(e, t, a, r, n, l) } if (d < c) { var p = { row: [i, o], column: [s, c] }; return l.push(p), n = this.deleteCellInSave(n, p), this.getRangeArr(e, t, a, r, n, l) } break } null == s ? (s = d, c = d, i = u, o = u) : d > c && (c = d) } else if (null != s) { if (null != h && null != h.mc) break; if (d < s); else { if (d <= c) { var f = { row: [i, o], column: [s, c] }; return l.push(f), n = this.deleteCellInSave(n, f), this.getRangeArr(e, t, a, r, n, l) } o = u } } } if (null != s) { var g = { row: [i, o], column: [s, c] }; return l.push(g), n = this.deleteCellInSave(n, g), this.getRangeArr(e, t, a, r, n, l) } }, deleteCellInSave: function (e, t) { for (var a = t.row[0]; a <= t.row[1]; a++)for (var r = t.column[0]; r <= t.column[1]; r++)delete e[a + "_" + r]; return e } }, Oh = function (e) { if (Nr(e)) throw TypeError("The method doesn't accept regular expressions"); return e }, Bh = $t("match"); Ee({ target: "String", proto: !0, forced: !function (e) { var t = /./; try { "/./"[e](t) } catch (a) { try { return t[Bh] = !1, "/./"[e](t) } catch (e) { } } return !1 }("includes") }, { includes: function (e) { return !!~String(y(this)).indexOf(Oh(e), arguments.length > 1 ? arguments[1] : void 0) } }); var Vh = a((function (e, t) { /* flatpickr v4.6.6, @license MIT */ e.exports = function () { /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ var e = function () { return (e = Object.assign || function (e) { for (var t, a = 1, r = arguments.length; a < r; a++)for (var n in t = arguments[a]) Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]); return e }).apply(this, arguments) }; function t() { for (var e = 0, t = 0, a = arguments.length; t < a; t++)e += arguments[t].length; var r = Array(e), n = 0; for (t = 0; t < a; t++)for (var l = arguments[t], i = 0, o = l.length; i < o; i++, n++)r[n] = l[i]; return r } var a = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition"], r = { _disable: [], _enable: [], allowInput: !1, allowInvalidPreload: !1, altFormat: "F j, Y", altInput: !1, altInputClass: "form-control input", animate: "object" == typeof window && -1 === window.navigator.userAgent.indexOf("MSIE"), ariaDateFormat: "F j, Y", autoFillDefaultTime: !0, clickOpens: !0, closeOnSelect: !0, conjunction: ", ", dateFormat: "Y-m-d", defaultHour: 12, defaultMinute: 0, defaultSeconds: 0, disable: [], disableMobile: !1, enable: [], enableSeconds: !1, enableTime: !1, errorHandler: function (e) { return "undefined" != typeof console && console.warn(e) }, getWeek: function (e) { var t = new Date(e.getTime()); t.setHours(0, 0, 0, 0), t.setDate(t.getDate() + 3 - (t.getDay() + 6) % 7); var a = new Date(t.getFullYear(), 0, 4); return 1 + Math.round(((t.getTime() - a.getTime()) / 864e5 - 3 + (a.getDay() + 6) % 7) / 7) }, hourIncrement: 1, ignoredFocusElements: [], inline: !1, locale: "default", minuteIncrement: 5, mode: "single", monthSelectorType: "dropdown", nextArrow: "", noCalendar: !1, now: new Date, onChange: [], onClose: [], onDayCreate: [], onDestroy: [], onKeyDown: [], onMonthChange: [], onOpen: [], onParseConfig: [], onReady: [], onValueUpdate: [], onYearChange: [], onPreCalendarPosition: [], plugins: [], position: "auto", positionElement: void 0, prevArrow: "", shorthandCurrentMonth: !1, showMonths: 1, static: !1, time_24hr: !1, weekNumbers: !1, wrap: !1 }, n = { weekdays: { shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] }, months: { shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] }, daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], firstDayOfWeek: 0, ordinal: function (e) { var t = e % 100; if (t > 3 && t < 21) return "th"; switch (t % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th" } }, rangeSeparator: " to ", weekAbbreviation: "Wk", scrollTitle: "Scroll to increment", toggleTitle: "Click to toggle", amPM: ["AM", "PM"], yearAriaLabel: "Year", monthAriaLabel: "Month", hourAriaLabel: "Hour", minuteAriaLabel: "Minute", time_24hr: !1 }, l = function (e, t) { return void 0 === t && (t = 2), ("000" + e).slice(-1 * t) }, i = function (e) { return !0 === e ? 1 : 0 }; function o(e, t, a) { var r; return void 0 === a && (a = !1), function () { var n = this, l = arguments; null !== r && clearTimeout(r), r = window.setTimeout((function () { r = null, a || e.apply(n, l) }), t), a && !r && e.apply(n, l) } } var s = function (e) { return e instanceof Array ? e : [e] }; function c(e, t, a) { if (!0 === a) return e.classList.add(t); e.classList.remove(t) } function u(e, t, a) { var r = window.document.createElement(e); return t = t || "", a = a || "", r.className = t, void 0 !== a && (r.textContent = a), r } function d(e) { for (; e.firstChild;)e.removeChild(e.firstChild) } function h(e, t) { var a = u("div", "numInputWrapper"), r = u("input", "numInput " + e), n = u("span", "arrowUp"), l = u("span", "arrowDown"); if (-1 === navigator.userAgent.indexOf("MSIE 9.0") ? r.type = "number" : (r.type = "text", r.pattern = "\\d*"), void 0 !== t) for (var i in t) r.setAttribute(i, t[i]); return a.appendChild(r), a.appendChild(n), a.appendChild(l), a } function m(e) { try { return "function" == typeof e.composedPath ? e.composedPath()[0] : e.target } catch (t) { return e.target } } var p = function () { }, f = function (e, t, a) { return a.months[t ? "shorthand" : "longhand"][e] }, g = { D: p, F: function (e, t, a) { e.setMonth(a.months.longhand.indexOf(t)) }, G: function (e, t) { e.setHours(parseFloat(t)) }, H: function (e, t) { e.setHours(parseFloat(t)) }, J: function (e, t) { e.setDate(parseFloat(t)) }, K: function (e, t, a) { e.setHours(e.getHours() % 12 + 12 * i(new RegExp(a.amPM[1], "i").test(t))) }, M: function (e, t, a) { e.setMonth(a.months.shorthand.indexOf(t)) }, S: function (e, t) { e.setSeconds(parseFloat(t)) }, U: function (e, t) { return new Date(1e3 * parseFloat(t)) }, W: function (e, t, a) { var r = parseInt(t), n = new Date(e.getFullYear(), 0, 2 + 7 * (r - 1), 0, 0, 0, 0); return n.setDate(n.getDate() - n.getDay() + a.firstDayOfWeek), n }, Y: function (e, t) { e.setFullYear(parseFloat(t)) }, Z: function (e, t) { return new Date(t) }, d: function (e, t) { e.setDate(parseFloat(t)) }, h: function (e, t) { e.setHours(parseFloat(t)) }, i: function (e, t) { e.setMinutes(parseFloat(t)) }, j: function (e, t) { e.setDate(parseFloat(t)) }, l: p, m: function (e, t) { e.setMonth(parseFloat(t) - 1) }, n: function (e, t) { e.setMonth(parseFloat(t) - 1) }, s: function (e, t) { e.setSeconds(parseFloat(t)) }, u: function (e, t) { return new Date(parseFloat(t)) }, w: p, y: function (e, t) { e.setFullYear(2e3 + parseFloat(t)) } }, v = { D: "(\\w+)", F: "(\\w+)", G: "(\\d\\d|\\d)", H: "(\\d\\d|\\d)", J: "(\\d\\d|\\d)\\w+", K: "", M: "(\\w+)", S: "(\\d\\d|\\d)", U: "(.+)", W: "(\\d\\d|\\d)", Y: "(\\d{4})", Z: "(.+)", d: "(\\d\\d|\\d)", h: "(\\d\\d|\\d)", i: "(\\d\\d|\\d)", j: "(\\d\\d|\\d)", l: "(\\w+)", m: "(\\d\\d|\\d)", n: "(\\d\\d|\\d)", s: "(\\d\\d|\\d)", u: "(.+)", w: "(\\d\\d|\\d)", y: "(\\d{2})" }, y = { Z: function (e) { return e.toISOString() }, D: function (e, t, a) { return t.weekdays.shorthand[y.w(e, t, a)] }, F: function (e, t, a) { return f(y.n(e, t, a) - 1, !1, t) }, G: function (e, t, a) { return l(y.h(e, t, a)) }, H: function (e) { return l(e.getHours()) }, J: function (e, t) { return void 0 !== t.ordinal ? e.getDate() + t.ordinal(e.getDate()) : e.getDate() }, K: function (e, t) { return t.amPM[i(e.getHours() > 11)] }, M: function (e, t) { return f(e.getMonth(), !0, t) }, S: function (e) { return l(e.getSeconds()) }, U: function (e) { return e.getTime() / 1e3 }, W: function (e, t, a) { return a.getWeek(e) }, Y: function (e) { return l(e.getFullYear(), 4) }, d: function (e) { return l(e.getDate()) }, h: function (e) { return e.getHours() % 12 ? e.getHours() % 12 : 12 }, i: function (e) { return l(e.getMinutes()) }, j: function (e) { return e.getDate() }, l: function (e, t) { return t.weekdays.longhand[e.getDay()] }, m: function (e) { return l(e.getMonth() + 1) }, n: function (e) { return e.getMonth() + 1 }, s: function (e) { return e.getSeconds() }, u: function (e) { return e.getTime() }, w: function (e) { return e.getDay() }, y: function (e) { return String(e.getFullYear()).substring(2) } }, b = function (e) { var t = e.config, a = void 0 === t ? r : t, l = e.l10n, i = void 0 === l ? n : l, o = e.isMobile, s = void 0 !== o && o; return function (e, t, r) { var n = r || i; return void 0 === a.formatDate || s ? t.split("").map((function (t, r, l) { return y[t] && "\\" !== l[r - 1] ? y[t](e, n, a) : "\\" !== t ? t : "" })).join("") : a.formatDate(e, t, n) } }, k = function (e) { var t = e.config, a = void 0 === t ? r : t, l = e.l10n, i = void 0 === l ? n : l; return function (e, t, n, l) { if (0 === e || e) { var o, s = l || i, c = e; if (e instanceof Date) o = new Date(e.getTime()); else if ("string" != typeof e && void 0 !== e.toFixed) o = new Date(e); else if ("string" == typeof e) { var u = t || (a || r).dateFormat, d = String(e).trim(); if ("today" === d) o = new Date, n = !0; else if (/Z$/.test(d) || /GMT$/.test(d)) o = new Date(e); else if (a && a.parseDate) o = a.parseDate(e, u); else { o = a && a.noCalendar ? new Date((new Date).setHours(0, 0, 0, 0)) : new Date((new Date).getFullYear(), 0, 1, 0, 0, 0, 0); for (var h = void 0, m = [], p = 0, f = 0, y = ""; p < u.length; p++) { var b = u[p], k = "\\" === b, x = "\\" === u[p - 1] || k; if (v[b] && !x) { y += v[b]; var w = new RegExp(y).exec(e); w && (h = !0) && m["Y" !== b ? "push" : "unshift"]({ fn: g[b], val: w[++f] }) } else k || (y += "."); m.forEach((function (e) { var t = e.fn, a = e.val; return o = t(o, a, s) || o })) } o = h ? o : void 0 } } if (o instanceof Date && !isNaN(o.getTime())) return !0 === n && o.setHours(0, 0, 0, 0), o; a.errorHandler(new Error("Invalid date provided: " + c)) } } }; function x(e, t, a) { return void 0 === a && (a = !0), !1 !== a ? new Date(e.getTime()).setHours(0, 0, 0, 0) - new Date(t.getTime()).setHours(0, 0, 0, 0) : e.getTime() - t.getTime() } var w = 864e5; function _(p, g) { var y = { config: e(e({}, r), T.defaultConfig), l10n: n }; function _(e) { return e.bind(y) } function C() { var e = y.config; !1 === e.weekNumbers && 1 === e.showMonths || !0 !== e.noCalendar && window.requestAnimationFrame((function () { if (void 0 !== y.calendarContainer && (y.calendarContainer.style.visibility = "hidden", y.calendarContainer.style.display = "block"), void 0 !== y.daysContainer) { var t = (y.days.offsetWidth + 1) * e.showMonths; y.daysContainer.style.width = t + "px", y.calendarContainer.style.width = t + (void 0 !== y.weekWrapper ? y.weekWrapper.offsetWidth : 0) + "px", y.calendarContainer.style.removeProperty("visibility"), y.calendarContainer.style.removeProperty("display") } })) } function A(e) { if (0 === y.selectedDates.length) { var t = void 0 !== y.config.minDate ? new Date(y.config.minDate.getTime()) : new Date, a = R(), r = a.hours, n = a.minutes, o = a.seconds; t.setHours(r, n, o, 0), y.setDate(t, !1) } void 0 !== e && "blur" !== e.type && function (e) { e.preventDefault(); var t = "keydown" === e.type, a = m(e), r = a; void 0 !== y.amPM && a === y.amPM && (y.amPM.textContent = y.l10n.amPM[i(y.amPM.textContent === y.l10n.amPM[0])]); var n = parseFloat(r.getAttribute("min")), o = parseFloat(r.getAttribute("max")), s = parseFloat(r.getAttribute("step")), c = parseInt(r.value, 10), u = e.delta || (t ? 38 === e.which ? 1 : -1 : 0), d = c + s * u; if (void 0 !== r.value && 2 === r.value.length) { var h = r === y.hourElement, p = r === y.minuteElement; d < n ? (d = o + d + i(!h) + (i(h) && i(!y.amPM)), p && N(void 0, -1, y.hourElement)) : d > o && (d = r === y.hourElement ? d - o - i(!y.amPM) : n, p && N(void 0, 1, y.hourElement)), y.amPM && h && (1 === s ? d + c === 23 : Math.abs(d - c) > s) && (y.amPM.textContent = y.l10n.amPM[i(y.amPM.textContent === y.l10n.amPM[0])]), r.value = l(d) } }(e); var s = y._input.value; S(), be(), y._input.value !== s && y._debouncedChange() } function S() { if (void 0 !== y.hourElement && void 0 !== y.minuteElement) { var e, t, a = (parseInt(y.hourElement.value.slice(-2), 10) || 0) % 24, r = (parseInt(y.minuteElement.value, 10) || 0) % 60, n = void 0 !== y.secondElement ? (parseInt(y.secondElement.value, 10) || 0) % 60 : 0; void 0 !== y.amPM && (e = a, t = y.amPM.textContent, a = e % 12 + 12 * i(t === y.l10n.amPM[1])); var l = void 0 !== y.config.minTime || y.config.minDate && y.minDateHasTime && y.latestSelectedDateObj && 0 === x(y.latestSelectedDateObj, y.config.minDate, !0); if (void 0 !== y.config.maxTime || y.config.maxDate && y.maxDateHasTime && y.latestSelectedDateObj && 0 === x(y.latestSelectedDateObj, y.config.maxDate, !0)) { var o = void 0 !== y.config.maxTime ? y.config.maxTime : y.config.maxDate; (a = Math.min(a, o.getHours())) === o.getHours() && (r = Math.min(r, o.getMinutes())), r === o.getMinutes() && (n = Math.min(n, o.getSeconds())) } if (l) { var s = void 0 !== y.config.minTime ? y.config.minTime : y.config.minDate; (a = Math.max(a, s.getHours())) === s.getHours() && (r = Math.max(r, s.getMinutes())), r === s.getMinutes() && (n = Math.max(n, s.getSeconds())) } $(a, r, n) } } function I(e) { var t = e || y.latestSelectedDateObj; t && $(t.getHours(), t.getMinutes(), t.getSeconds()) } function R() { var e = y.config.defaultHour, t = y.config.defaultMinute, a = y.config.defaultSeconds; if (void 0 !== y.config.minDate) { var r = y.config.minDate.getHours(), n = y.config.minDate.getMinutes(); (e = Math.max(e, r)) === r && (t = Math.max(n, t)), e === r && t === n && (a = y.config.minDate.getSeconds()) } if (void 0 !== y.config.maxDate) { var l = y.config.maxDate.getHours(), i = y.config.maxDate.getMinutes(); (e = Math.min(e, l)) === l && (t = Math.min(i, t)), e === l && t === i && (a = y.config.maxDate.getSeconds()) } return { hours: e, minutes: t, seconds: a } } function $(e, t, a) { void 0 !== y.latestSelectedDateObj && y.latestSelectedDateObj.setHours(e % 24, t, a || 0, 0), y.hourElement && y.minuteElement && !y.isMobile && (y.hourElement.value = l(y.config.time_24hr ? e : (12 + e) % 12 + 12 * i(e % 12 == 0)), y.minuteElement.value = l(t), void 0 !== y.amPM && (y.amPM.textContent = y.l10n.amPM[i(e >= 12)]), void 0 !== y.secondElement && (y.secondElement.value = l(a))) } function q(e) { var t = m(e), a = parseInt(t.value) + (e.delta || 0); (a / 1e3 > 1 || "Enter" === e.key && !/[^\d]/.test(a.toString())) && Z(a) } function D(e, t, a, r) { return t instanceof Array ? t.forEach((function (t) { return D(e, t, a, r) })) : e instanceof Array ? e.forEach((function (e) { return D(e, t, a, r) })) : (e.addEventListener(t, a, r), void y._handlers.push({ element: e, event: t, handler: a, options: r })) } function F() { pe("onChange") } function E(e, t) { var a = void 0 !== e ? y.parseDate(e) : y.latestSelectedDateObj || (y.config.minDate && y.config.minDate > y.now ? y.config.minDate : y.config.maxDate && y.config.maxDate < y.now ? y.config.maxDate : y.now), r = y.currentYear, n = y.currentMonth; try { void 0 !== a && (y.currentYear = a.getFullYear(), y.currentMonth = a.getMonth()) } catch (e) { e.message = "Invalid date supplied: " + a, y.config.errorHandler(e) } t && y.currentYear !== r && (pe("onYearChange"), H()), !t || y.currentYear === r && y.currentMonth === n || pe("onMonthChange"), y.redraw() } function M(e) { var t = m(e); ~t.className.indexOf("arrow") && N(e, t.classList.contains("arrowUp") ? 1 : -1) } function N(e, t, a) { var r = e && m(e), n = a || r && r.parentNode && r.parentNode.firstChild, l = fe("increment"); l.delta = t, n && n.dispatchEvent(l) } function P(e, t, a, r) { var n = Q(t, !0), l = u("span", "flatpickr-day " + e, t.getDate().toString()); return l.dateObj = t, l.$i = r, l.setAttribute("aria-label", y.formatDate(t, y.config.ariaDateFormat)), -1 === e.indexOf("hidden") && 0 === x(t, y.now) && (y.todayDateElem = l, l.classList.add("today"), l.setAttribute("aria-current", "date")), n ? (l.tabIndex = -1, ge(t) && (l.classList.add("selected"), y.selectedDateElem = l, "range" === y.config.mode && (c(l, "startRange", y.selectedDates[0] && 0 === x(t, y.selectedDates[0], !0)), c(l, "endRange", y.selectedDates[1] && 0 === x(t, y.selectedDates[1], !0)), "nextMonthDay" === e && l.classList.add("inRange")))) : l.classList.add("flatpickr-disabled"), "range" === y.config.mode && function (e) { return !("range" !== y.config.mode || y.selectedDates.length < 2) && x(e, y.selectedDates[0]) >= 0 && x(e, y.selectedDates[1]) <= 0 }(t) && !ge(t) && l.classList.add("inRange"), y.weekNumbers && 1 === y.config.showMonths && "prevMonthDay" !== e && a % 7 == 1 && y.weekNumbers.insertAdjacentHTML("beforeend", "" + y.config.getWeek(t) + ""), pe("onDayCreate", l), l } function z(e) { e.focus(), "range" === y.config.mode && ae(e) } function L(e) { for (var t = e > 0 ? 0 : y.config.showMonths - 1, a = e > 0 ? y.config.showMonths : -1, r = t; r != a; r += e)for (var n = y.daysContainer.children[r], l = e > 0 ? 0 : n.children.length - 1, i = e > 0 ? n.children.length : -1, o = l; o != i; o += e) { var s = n.children[o]; if (-1 === s.className.indexOf("hidden") && Q(s.dateObj)) return s } } function O(e, t) { var a = J(document.activeElement || document.body), r = void 0 !== e ? e : a ? document.activeElement : void 0 !== y.selectedDateElem && J(y.selectedDateElem) ? y.selectedDateElem : void 0 !== y.todayDateElem && J(y.todayDateElem) ? y.todayDateElem : L(t > 0 ? 1 : -1); void 0 === r ? y._input.focus() : a ? function (e, t) { for (var a = -1 === e.className.indexOf("Month") ? e.dateObj.getMonth() : y.currentMonth, r = t > 0 ? y.config.showMonths : -1, n = t > 0 ? 1 : -1, l = a - y.currentMonth; l != r; l += n)for (var i = y.daysContainer.children[l], o = a - y.currentMonth === l ? e.$i + t : t < 0 ? i.children.length - 1 : 0, s = i.children.length, c = o; c >= 0 && c < s && c != (t > 0 ? s : -1); c += n) { var u = i.children[c]; if (-1 === u.className.indexOf("hidden") && Q(u.dateObj) && Math.abs(e.$i - c) >= Math.abs(t)) return z(u) } y.changeMonth(n), O(L(n), 0) }(r, t) : z(r) } function B(e, t) { for (var a = (new Date(e, t, 1).getDay() - y.l10n.firstDayOfWeek + 7) % 7, r = y.utils.getDaysInMonth((t - 1 + 12) % 12, e), n = y.utils.getDaysInMonth(t, e), l = window.document.createDocumentFragment(), i = y.config.showMonths > 1, o = i ? "prevMonthDay hidden" : "prevMonthDay", s = i ? "nextMonthDay hidden" : "nextMonthDay", c = r + 1 - a, d = 0; c <= r; c++, d++)l.appendChild(P(o, new Date(e, t - 1, c), c, d)); for (c = 1; c <= n; c++, d++)l.appendChild(P("", new Date(e, t, c), c, d)); for (var h = n + 1; h <= 42 - a && (1 === y.config.showMonths || d % 7 != 0); h++, d++)l.appendChild(P(s, new Date(e, t + 1, h % n), h, d)); var m = u("div", "dayContainer"); return m.appendChild(l), m } function V() { if (void 0 !== y.daysContainer) { d(y.daysContainer), y.weekNumbers && d(y.weekNumbers); for (var e = document.createDocumentFragment(), t = 0; t < y.config.showMonths; t++) { var a = new Date(y.currentYear, y.currentMonth, 1); a.setMonth(y.currentMonth + t), e.appendChild(B(a.getFullYear(), a.getMonth())) } y.daysContainer.appendChild(e), y.days = y.daysContainer.firstChild, "range" === y.config.mode && 1 === y.selectedDates.length && ae() } } function H() { if (!(y.config.showMonths > 1 || "dropdown" !== y.config.monthSelectorType)) { var e = function (e) { return !(void 0 !== y.config.minDate && y.currentYear === y.config.minDate.getFullYear() && e < y.config.minDate.getMonth() || void 0 !== y.config.maxDate && y.currentYear === y.config.maxDate.getFullYear() && e > y.config.maxDate.getMonth()) }; y.monthsDropdownContainer.tabIndex = -1, y.monthsDropdownContainer.innerHTML = ""; for (var t = 0; t < 12; t++)if (e(t)) { var a = u("option", "flatpickr-monthDropdown-month"); a.value = new Date(y.currentYear, t).getMonth().toString(), a.textContent = f(t, y.config.shorthandCurrentMonth, y.l10n), a.tabIndex = -1, y.currentMonth === t && (a.selected = !0), y.monthsDropdownContainer.appendChild(a) } } } function U() { var e, t = u("div", "flatpickr-month"), a = window.document.createDocumentFragment(); y.config.showMonths > 1 || "static" === y.config.monthSelectorType ? e = u("span", "cur-month") : (y.monthsDropdownContainer = u("select", "flatpickr-monthDropdown-months"), y.monthsDropdownContainer.setAttribute("aria-label", y.l10n.monthAriaLabel), D(y.monthsDropdownContainer, "change", (function (e) { var t = m(e), a = parseInt(t.value, 10); y.changeMonth(a - y.currentMonth), pe("onMonthChange") })), H(), e = y.monthsDropdownContainer); var r = h("cur-year", { tabindex: "-1" }), n = r.getElementsByTagName("input")[0]; n.setAttribute("aria-label", y.l10n.yearAriaLabel), y.config.minDate && n.setAttribute("min", y.config.minDate.getFullYear().toString()), y.config.maxDate && (n.setAttribute("max", y.config.maxDate.getFullYear().toString()), n.disabled = !!y.config.minDate && y.config.minDate.getFullYear() === y.config.maxDate.getFullYear()); var l = u("div", "flatpickr-current-month"); return l.appendChild(e), l.appendChild(r), a.appendChild(l), t.appendChild(a), { container: t, yearElement: n, monthElement: e } } function j() { d(y.monthNav), y.monthNav.appendChild(y.prevMonthNav), y.config.showMonths && (y.yearElements = [], y.monthElements = []); for (var e = y.config.showMonths; e--;) { var t = U(); y.yearElements.push(t.yearElement), y.monthElements.push(t.monthElement), y.monthNav.appendChild(t.container) } y.monthNav.appendChild(y.nextMonthNav) } function G() { y.weekdayContainer ? d(y.weekdayContainer) : y.weekdayContainer = u("div", "flatpickr-weekdays"); for (var e = y.config.showMonths; e--;) { var t = u("div", "flatpickr-weekdaycontainer"); y.weekdayContainer.appendChild(t) } return W(), y.weekdayContainer } function W() { if (y.weekdayContainer) { var e = y.l10n.firstDayOfWeek, a = t(y.l10n.weekdays.shorthand); e > 0 && e < a.length && (a = t(a.splice(e, a.length), a.splice(0, e))); for (var r = y.config.showMonths; r--;)y.weekdayContainer.children[r].innerHTML = "\n \n " + a.join("") + "\n \n " } } function Y(e, t) { void 0 === t && (t = !0); var a = t ? e : e - y.currentMonth; a < 0 && !0 === y._hidePrevMonthArrow || a > 0 && !0 === y._hideNextMonthArrow || (y.currentMonth += a, (y.currentMonth < 0 || y.currentMonth > 11) && (y.currentYear += y.currentMonth > 11 ? 1 : -1, y.currentMonth = (y.currentMonth + 12) % 12, pe("onYearChange"), H()), V(), pe("onMonthChange"), ve()) } function X(e) { return !(!y.config.appendTo || !y.config.appendTo.contains(e)) || y.calendarContainer.contains(e) } function K(e) { if (y.isOpen && !y.config.inline) { var t = m(e), a = X(t), r = t === y.input || t === y.altInput || y.element.contains(t) || e.path && e.path.indexOf && (~e.path.indexOf(y.input) || ~e.path.indexOf(y.altInput)), n = "blur" === e.type ? r && e.relatedTarget && !X(e.relatedTarget) : !r && !a && !X(e.relatedTarget), l = !y.config.ignoredFocusElements.some((function (e) { return e.contains(t) })); n && l && (void 0 !== y.timeContainer && void 0 !== y.minuteElement && void 0 !== y.hourElement && "" !== y.input.value && void 0 !== y.input.value && A(), y.close(), y.config && "range" === y.config.mode && 1 === y.selectedDates.length && (y.clear(!1), y.redraw())) } } function Z(e) { if (!(!e || y.config.minDate && e < y.config.minDate.getFullYear() || y.config.maxDate && e > y.config.maxDate.getFullYear())) { var t = e, a = y.currentYear !== t; y.currentYear = t || y.currentYear, y.config.maxDate && y.currentYear === y.config.maxDate.getFullYear() ? y.currentMonth = Math.min(y.config.maxDate.getMonth(), y.currentMonth) : y.config.minDate && y.currentYear === y.config.minDate.getFullYear() && (y.currentMonth = Math.max(y.config.minDate.getMonth(), y.currentMonth)), a && (y.redraw(), pe("onYearChange"), H()) } } function Q(e, t) { void 0 === t && (t = !0); var a = y.parseDate(e, void 0, t); if (y.config.minDate && a && x(a, y.config.minDate, void 0 !== t ? t : !y.minDateHasTime) < 0 || y.config.maxDate && a && x(a, y.config.maxDate, void 0 !== t ? t : !y.maxDateHasTime) > 0) return !1; if (0 === y.config.enable.length && 0 === y.config.disable.length) return !0; if (void 0 === a) return !1; for (var r = y.config.enable.length > 0, n = r ? y.config.enable : y.config.disable, l = 0, i = void 0; l < n.length; l++) { if ("function" == typeof (i = n[l]) && i(a)) return r; if (i instanceof Date && void 0 !== a && i.getTime() === a.getTime()) return r; if ("string" == typeof i && void 0 !== a) { var o = y.parseDate(i, void 0, !0); return o && o.getTime() === a.getTime() ? r : !r } if ("object" == typeof i && void 0 !== a && i.from && i.to && a.getTime() >= i.from.getTime() && a.getTime() <= i.to.getTime()) return r } return !r } function J(e) { return void 0 !== y.daysContainer && -1 === e.className.indexOf("hidden") && -1 === e.className.indexOf("flatpickr-disabled") && y.daysContainer.contains(e) } function ee(e) { e.target !== y._input || e.relatedTarget && X(e.relatedTarget) || y.setDate(y._input.value, !0, e.target === y.altInput ? y.config.altFormat : y.config.dateFormat) } function te(e) { var t = m(e), a = y.config.wrap ? p.contains(t) : t === y._input, r = y.config.allowInput, n = y.isOpen && (!r || !a), l = y.config.inline && a && !r; if (13 === e.keyCode && a) { if (r) return y.setDate(y._input.value, !0, t === y.altInput ? y.config.altFormat : y.config.dateFormat), t.blur(); y.open() } else if (X(t) || n || l) { var i = !!y.timeContainer && y.timeContainer.contains(t); switch (e.keyCode) { case 13: i ? (e.preventDefault(), A(), ce()) : ue(e); break; case 27: e.preventDefault(), ce(); break; case 8: case 46: a && !y.config.allowInput && (e.preventDefault(), y.clear()); break; case 37: case 39: if (i || a) y.hourElement && y.hourElement.focus(); else if (e.preventDefault(), void 0 !== y.daysContainer && (!1 === r || document.activeElement && J(document.activeElement))) { var o = 39 === e.keyCode ? 1 : -1; e.ctrlKey ? (e.stopPropagation(), Y(o), O(L(1), 0)) : O(void 0, o) } break; case 38: case 40: e.preventDefault(); var s = 40 === e.keyCode ? 1 : -1; y.daysContainer && void 0 !== t.$i || t === y.input || t === y.altInput ? e.ctrlKey ? (e.stopPropagation(), Z(y.currentYear - s), O(L(1), 0)) : i || O(void 0, 7 * s) : t === y.currentYearElement ? Z(y.currentYear - s) : y.config.enableTime && (!i && y.hourElement && y.hourElement.focus(), A(e), y._debouncedChange()); break; case 9: if (i) { var c = [y.hourElement, y.minuteElement, y.secondElement, y.amPM].concat(y.pluginElements).filter((function (e) { return e })), u = c.indexOf(t); if (-1 !== u) { var d = c[u + (e.shiftKey ? -1 : 1)]; e.preventDefault(), (d || y._input).focus() } } else !y.config.noCalendar && y.daysContainer && y.daysContainer.contains(t) && e.shiftKey && (e.preventDefault(), y._input.focus()) } } if (void 0 !== y.amPM && t === y.amPM) switch (e.key) { case y.l10n.amPM[0].charAt(0): case y.l10n.amPM[0].charAt(0).toLowerCase(): y.amPM.textContent = y.l10n.amPM[0], S(), be(); break; case y.l10n.amPM[1].charAt(0): case y.l10n.amPM[1].charAt(0).toLowerCase(): y.amPM.textContent = y.l10n.amPM[1], S(), be() }(a || X(t)) && pe("onKeyDown", e) } function ae(e) { if (1 === y.selectedDates.length && (!e || e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled"))) { for (var t = e ? e.dateObj.getTime() : y.days.firstElementChild.dateObj.getTime(), a = y.parseDate(y.selectedDates[0], void 0, !0).getTime(), r = Math.min(t, y.selectedDates[0].getTime()), n = Math.max(t, y.selectedDates[0].getTime()), l = !1, i = 0, o = 0, s = r; s < n; s += w)Q(new Date(s), !0) || (l = l || s > r && s < n, s < a && (!i || s > i) ? i = s : s > a && (!o || s < o) && (o = s)); for (var c = 0; c < y.config.showMonths; c++)for (var u = y.daysContainer.children[c], d = function (r, n) { var s, c, d, h = u.children[r], m = h.dateObj.getTime(), p = i > 0 && m < i || o > 0 && m > o; return p ? (h.classList.add("notAllowed"), ["inRange", "startRange", "endRange"].forEach((function (e) { h.classList.remove(e) })), "continue") : l && !p ? "continue" : (["startRange", "inRange", "endRange", "notAllowed"].forEach((function (e) { h.classList.remove(e) })), void (void 0 !== e && (e.classList.add(t <= y.selectedDates[0].getTime() ? "startRange" : "endRange"), a < t && m === a ? h.classList.add("startRange") : a > t && m === a && h.classList.add("endRange"), m >= i && (0 === o || m <= o) && (c = a, d = t, (s = m) > Math.min(c, d) && s < Math.max(c, d)) && h.classList.add("inRange")))) }, h = 0, m = u.children.length; h < m; h++)d(h) } } function re() { !y.isOpen || y.config.static || y.config.inline || oe() } function ne(e) { return function (t) { var a = y.config["_" + e + "Date"] = y.parseDate(t, y.config.dateFormat), r = y.config["_" + ("min" === e ? "max" : "min") + "Date"]; void 0 !== a && (y["min" === e ? "minDateHasTime" : "maxDateHasTime"] = a.getHours() > 0 || a.getMinutes() > 0 || a.getSeconds() > 0), y.selectedDates && (y.selectedDates = y.selectedDates.filter((function (e) { return Q(e) })), y.selectedDates.length || "min" !== e || I(a), be()), y.daysContainer && (se(), void 0 !== a ? y.currentYearElement[e] = a.getFullYear().toString() : y.currentYearElement.removeAttribute(e), y.currentYearElement.disabled = !!r && void 0 !== a && r.getFullYear() === a.getFullYear()) } } function le() { return y.config.wrap ? p.querySelector("[data-input]") : p } function ie() { "object" != typeof y.config.locale && void 0 === T.l10ns[y.config.locale] && y.config.errorHandler(new Error("flatpickr: invalid locale " + y.config.locale)), y.l10n = e(e({}, T.l10ns.default), "object" == typeof y.config.locale ? y.config.locale : "default" !== y.config.locale ? T.l10ns[y.config.locale] : void 0), v.K = "(" + y.l10n.amPM[0] + "|" + y.l10n.amPM[1] + "|" + y.l10n.amPM[0].toLowerCase() + "|" + y.l10n.amPM[1].toLowerCase() + ")", void 0 === e(e({}, g), JSON.parse(JSON.stringify(p.dataset || {}))).time_24hr && void 0 === T.defaultConfig.time_24hr && (y.config.time_24hr = y.l10n.time_24hr), y.formatDate = b(y), y.parseDate = k({ config: y.config, l10n: y.l10n }) } function oe(e) { if (void 0 !== y.calendarContainer) { pe("onPreCalendarPosition"); var t = e || y._positionElement, a = Array.prototype.reduce.call(y.calendarContainer.children, (function (e, t) { return e + t.offsetHeight }), 0), r = y.calendarContainer.offsetWidth, n = y.config.position.split(" "), l = n[0], i = n.length > 1 ? n[1] : null, o = t.getBoundingClientRect(), s = window.innerHeight - o.bottom, u = "above" === l || "below" !== l && s < a && o.top > a, d = window.pageYOffset + o.top + (u ? -a - 2 : t.offsetHeight + 2); if (c(y.calendarContainer, "arrowTop", !u), c(y.calendarContainer, "arrowBottom", u), !y.config.inline) { var h = window.pageXOffset + o.left, m = !1, p = !1; "center" === i ? (h -= (r - o.width) / 2, m = !0) : "right" === i && (h -= r - o.width, p = !0), c(y.calendarContainer, "arrowLeft", !m && !p), c(y.calendarContainer, "arrowCenter", m), c(y.calendarContainer, "arrowRight", p); var f = window.document.body.offsetWidth - (window.pageXOffset + o.right), g = h + r > window.document.body.offsetWidth, v = f + r > window.document.body.offsetWidth; if (c(y.calendarContainer, "rightMost", g), !y.config.static) if (y.calendarContainer.style.top = d + "px", g) if (v) { var b = function () { for (var e = null, t = 0; t < document.styleSheets.length; t++) { var a = document.styleSheets[t]; try { a.cssRules } catch (e) { continue } e = a; break } return null != e ? e : (r = document.createElement("style"), document.head.appendChild(r), r.sheet); var r }(); if (void 0 === b) return; var k = window.document.body.offsetWidth, x = Math.max(0, k / 2 - r / 2), w = b.cssRules.length, _ = "{left:" + o.left + "px;right:auto;}"; c(y.calendarContainer, "rightMost", !1), c(y.calendarContainer, "centerMost", !0), b.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after" + _, w), y.calendarContainer.style.left = x + "px", y.calendarContainer.style.right = "auto" } else y.calendarContainer.style.left = "auto", y.calendarContainer.style.right = f + "px"; else y.calendarContainer.style.left = h + "px", y.calendarContainer.style.right = "auto" } } } function se() { y.config.noCalendar || y.isMobile || (H(), ve(), V()) } function ce() { y._input.focus(), -1 !== window.navigator.userAgent.indexOf("MSIE") || void 0 !== navigator.msMaxTouchPoints ? setTimeout(y.close, 0) : y.close() } function ue(e) { e.preventDefault(), e.stopPropagation(); var t = function e(t, a) { return a(t) ? t : t.parentNode ? e(t.parentNode, a) : void 0 }(m(e), (function (e) { return e.classList && e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled") && !e.classList.contains("notAllowed") })); if (void 0 !== t) { var a = t, r = y.latestSelectedDateObj = new Date(a.dateObj.getTime()), n = (r.getMonth() < y.currentMonth || r.getMonth() > y.currentMonth + y.config.showMonths - 1) && "range" !== y.config.mode; if (y.selectedDateElem = a, "single" === y.config.mode) y.selectedDates = [r]; else if ("multiple" === y.config.mode) { var l = ge(r); l ? y.selectedDates.splice(parseInt(l), 1) : y.selectedDates.push(r) } else "range" === y.config.mode && (2 === y.selectedDates.length && y.clear(!1, !1), y.latestSelectedDateObj = r, y.selectedDates.push(r), 0 !== x(r, y.selectedDates[0], !0) && y.selectedDates.sort((function (e, t) { return e.getTime() - t.getTime() }))); if (S(), n) { var i = y.currentYear !== r.getFullYear(); y.currentYear = r.getFullYear(), y.currentMonth = r.getMonth(), i && (pe("onYearChange"), H()), pe("onMonthChange") } if (ve(), V(), be(), n || "range" === y.config.mode || 1 !== y.config.showMonths ? void 0 !== y.selectedDateElem && void 0 === y.hourElement && y.selectedDateElem && y.selectedDateElem.focus() : z(a), void 0 !== y.hourElement && void 0 !== y.hourElement && y.hourElement.focus(), y.config.closeOnSelect) { var o = "single" === y.config.mode && !y.config.enableTime, s = "range" === y.config.mode && 2 === y.selectedDates.length && !y.config.enableTime; (o || s) && ce() } F() } } y.parseDate = k({ config: y.config, l10n: y.l10n }), y._handlers = [], y.pluginElements = [], y.loadedPlugins = [], y._bind = D, y._setHoursFromDate = I, y._positionCalendar = oe, y.changeMonth = Y, y.changeYear = Z, y.clear = function (e, t) { if (void 0 === e && (e = !0), void 0 === t && (t = !0), y.input.value = "", void 0 !== y.altInput && (y.altInput.value = ""), void 0 !== y.mobileInput && (y.mobileInput.value = ""), y.selectedDates = [], y.latestSelectedDateObj = void 0, !0 === t && (y.currentYear = y._initialDate.getFullYear(), y.currentMonth = y._initialDate.getMonth()), !0 === y.config.enableTime) { var a = R(), r = a.hours, n = a.minutes, l = a.seconds; $(r, n, l) } y.redraw(), e && pe("onChange") }, y.close = function () { y.isOpen = !1, y.isMobile || (void 0 !== y.calendarContainer && y.calendarContainer.classList.remove("open"), void 0 !== y._input && y._input.classList.remove("active")), pe("onClose") }, y._createElement = u, y.destroy = function () { void 0 !== y.config && pe("onDestroy"); for (var e = y._handlers.length; e--;) { var t = y._handlers[e]; t.element.removeEventListener(t.event, t.handler, t.options) } if (y._handlers = [], y.mobileInput) y.mobileInput.parentNode && y.mobileInput.parentNode.removeChild(y.mobileInput), y.mobileInput = void 0; else if (y.calendarContainer && y.calendarContainer.parentNode) if (y.config.static && y.calendarContainer.parentNode) { var a = y.calendarContainer.parentNode; if (a.lastChild && a.removeChild(a.lastChild), a.parentNode) { for (; a.firstChild;)a.parentNode.insertBefore(a.firstChild, a); a.parentNode.removeChild(a) } } else y.calendarContainer.parentNode.removeChild(y.calendarContainer); y.altInput && (y.input.type = "text", y.altInput.parentNode && y.altInput.parentNode.removeChild(y.altInput), delete y.altInput), y.input && (y.input.type = y.input._type, y.input.classList.remove("flatpickr-input"), y.input.removeAttribute("readonly")), ["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "monthsDropdownContainer", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach((function (e) { try { delete y[e] } catch (e) { } })) }, y.isEnabled = Q, y.jumpToDate = E, y.open = function (e, t) { if (void 0 === t && (t = y._positionElement), !0 === y.isMobile) { if (e) { e.preventDefault(); var a = m(e); a && a.blur() } return void 0 !== y.mobileInput && (y.mobileInput.focus(), y.mobileInput.click()), void pe("onOpen") } if (!y._input.disabled && !y.config.inline) { var r = y.isOpen; y.isOpen = !0, r || (y.calendarContainer.classList.add("open"), y._input.classList.add("active"), pe("onOpen"), oe(t)), !0 === y.config.enableTime && !0 === y.config.noCalendar && (!1 !== y.config.allowInput || void 0 !== e && y.timeContainer.contains(e.relatedTarget) || setTimeout((function () { return y.hourElement.select() }), 50)) } }, y.redraw = se, y.set = function (e, t) { if (null !== e && "object" == typeof e) for (var r in Object.assign(y.config, e), e) void 0 !== de[r] && de[r].forEach((function (e) { return e() })); else y.config[e] = t, void 0 !== de[e] ? de[e].forEach((function (e) { return e() })) : a.indexOf(e) > -1 && (y.config[e] = s(t)); y.redraw(), be(!0) }, y.setDate = function (e, t, a) { if (void 0 === t && (t = !1), void 0 === a && (a = y.config.dateFormat), 0 !== e && !e || e instanceof Array && 0 === e.length) return y.clear(t); he(e, a), y.latestSelectedDateObj = y.selectedDates[y.selectedDates.length - 1], y.redraw(), E(void 0, t), I(), 0 === y.selectedDates.length && y.clear(!1), be(t), t && pe("onChange") }, y.toggle = function (e) { if (!0 === y.isOpen) return y.close(); y.open(e) }; var de = { locale: [ie, W], showMonths: [j, C, G], minDate: [E], maxDate: [E] }; function he(e, t) { var a = []; if (e instanceof Array) a = e.map((function (e) { return y.parseDate(e, t) })); else if (e instanceof Date || "number" == typeof e) a = [y.parseDate(e, t)]; else if ("string" == typeof e) switch (y.config.mode) { case "single": case "time": a = [y.parseDate(e, t)]; break; case "multiple": a = e.split(y.config.conjunction).map((function (e) { return y.parseDate(e, t) })); break; case "range": a = e.split(y.l10n.rangeSeparator).map((function (e) { return y.parseDate(e, t) })) } else y.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(e))); y.selectedDates = y.config.allowInvalidPreload ? a : a.filter((function (e) { return e instanceof Date && Q(e, !1) })), "range" === y.config.mode && y.selectedDates.sort((function (e, t) { return e.getTime() - t.getTime() })) } function me(e) { return e.slice().map((function (e) { return "string" == typeof e || "number" == typeof e || e instanceof Date ? y.parseDate(e, void 0, !0) : e && "object" == typeof e && e.from && e.to ? { from: y.parseDate(e.from, void 0), to: y.parseDate(e.to, void 0) } : e })).filter((function (e) { return e })) } function pe(e, t) { if (void 0 !== y.config) { var a = y.config[e]; if (void 0 !== a && a.length > 0) for (var r = 0; a[r] && r < a.length; r++)a[r](y.selectedDates, y.input.value, y, t); "onChange" === e && (y.input.dispatchEvent(fe("change")), y.input.dispatchEvent(fe("input"))) } } function fe(e) { var t = document.createEvent("Event"); return t.initEvent(e, !0, !0), t } function ge(e) { for (var t = 0; t < y.selectedDates.length; t++)if (0 === x(y.selectedDates[t], e)) return "" + t; return !1 } function ve() { y.config.noCalendar || y.isMobile || !y.monthNav || (y.yearElements.forEach((function (e, t) { var a = new Date(y.currentYear, y.currentMonth, 1); a.setMonth(y.currentMonth + t), y.config.showMonths > 1 || "static" === y.config.monthSelectorType ? y.monthElements[t].textContent = f(a.getMonth(), y.config.shorthandCurrentMonth, y.l10n) + " " : y.monthsDropdownContainer.value = a.getMonth().toString(), e.value = a.getFullYear().toString() })), y._hidePrevMonthArrow = void 0 !== y.config.minDate && (y.currentYear === y.config.minDate.getFullYear() ? y.currentMonth <= y.config.minDate.getMonth() : y.currentYear < y.config.minDate.getFullYear()), y._hideNextMonthArrow = void 0 !== y.config.maxDate && (y.currentYear === y.config.maxDate.getFullYear() ? y.currentMonth + 1 > y.config.maxDate.getMonth() : y.currentYear > y.config.maxDate.getFullYear())) } function ye(e) { return y.selectedDates.map((function (t) { return y.formatDate(t, e) })).filter((function (e, t, a) { return "range" !== y.config.mode || y.config.enableTime || a.indexOf(e) === t })).join("range" !== y.config.mode ? y.config.conjunction : y.l10n.rangeSeparator) } function be(e) { void 0 === e && (e = !0), void 0 !== y.mobileInput && y.mobileFormatStr && (y.mobileInput.value = void 0 !== y.latestSelectedDateObj ? y.formatDate(y.latestSelectedDateObj, y.mobileFormatStr) : ""), y.input.value = ye(y.config.dateFormat), void 0 !== y.altInput && (y.altInput.value = ye(y.config.altFormat)), !1 !== e && pe("onValueUpdate") } function ke(e) { var t = m(e), a = y.prevMonthNav.contains(t), r = y.nextMonthNav.contains(t); a || r ? Y(a ? -1 : 1) : y.yearElements.indexOf(t) >= 0 ? t.select() : t.classList.contains("arrowUp") ? y.changeYear(y.currentYear + 1) : t.classList.contains("arrowDown") && y.changeYear(y.currentYear - 1) } return function () { y.element = y.input = p, y.isOpen = !1, function () { var t = ["wrap", "weekNumbers", "allowInput", "allowInvalidPreload", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"], n = e(e({}, JSON.parse(JSON.stringify(p.dataset || {}))), g), l = {}; y.config.parseDate = n.parseDate, y.config.formatDate = n.formatDate, Object.defineProperty(y.config, "enable", { get: function () { return y.config._enable }, set: function (e) { y.config._enable = me(e) } }), Object.defineProperty(y.config, "disable", { get: function () { return y.config._disable }, set: function (e) { y.config._disable = me(e) } }); var i = "time" === n.mode; if (!n.dateFormat && (n.enableTime || i)) { var o = T.defaultConfig.dateFormat || r.dateFormat; l.dateFormat = n.noCalendar || i ? "H:i" + (n.enableSeconds ? ":S" : "") : o + " H:i" + (n.enableSeconds ? ":S" : "") } if (n.altInput && (n.enableTime || i) && !n.altFormat) { var c = T.defaultConfig.altFormat || r.altFormat; l.altFormat = n.noCalendar || i ? "h:i" + (n.enableSeconds ? ":S K" : " K") : c + " h:i" + (n.enableSeconds ? ":S" : "") + " K" } Object.defineProperty(y.config, "minDate", { get: function () { return y.config._minDate }, set: ne("min") }), Object.defineProperty(y.config, "maxDate", { get: function () { return y.config._maxDate }, set: ne("max") }); var u = function (e) { return function (t) { y.config["min" === e ? "_minTime" : "_maxTime"] = y.parseDate(t, "H:i:S") } }; Object.defineProperty(y.config, "minTime", { get: function () { return y.config._minTime }, set: u("min") }), Object.defineProperty(y.config, "maxTime", { get: function () { return y.config._maxTime }, set: u("max") }), "time" === n.mode && (y.config.noCalendar = !0, y.config.enableTime = !0), Object.assign(y.config, l, n); for (var d = 0; d < t.length; d++)y.config[t[d]] = !0 === y.config[t[d]] || "true" === y.config[t[d]]; for (a.filter((function (e) { return void 0 !== y.config[e] })).forEach((function (e) { y.config[e] = s(y.config[e] || []).map(_) })), y.isMobile = !y.config.disableMobile && !y.config.inline && "single" === y.config.mode && !y.config.disable.length && !y.config.enable.length && !y.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), d = 0; d < y.config.plugins.length; d++) { var h = y.config.plugins[d](y) || {}; for (var m in h) a.indexOf(m) > -1 ? y.config[m] = s(h[m]).map(_).concat(y.config[m]) : void 0 === n[m] && (y.config[m] = h[m]) } n.altInputClass || (y.config.altInputClass = le().className + " " + y.config.altInputClass), pe("onParseConfig") }(), ie(), y.input = le(), y.input ? (y.input._type = y.input.type, y.input.type = "text", y.input.classList.add("flatpickr-input"), y._input = y.input, y.config.altInput && (y.altInput = u(y.input.nodeName, y.config.altInputClass), y._input = y.altInput, y.altInput.placeholder = y.input.placeholder, y.altInput.disabled = y.input.disabled, y.altInput.required = y.input.required, y.altInput.tabIndex = y.input.tabIndex, y.altInput.type = "text", y.input.setAttribute("type", "hidden"), !y.config.static && y.input.parentNode && y.input.parentNode.insertBefore(y.altInput, y.input.nextSibling)), y.config.allowInput || y._input.setAttribute("readonly", "readonly"), y._positionElement = y.config.positionElement || y._input) : y.config.errorHandler(new Error("Invalid input element specified")), function () { y.selectedDates = [], y.now = y.parseDate(y.config.now) || new Date; var e = y.config.defaultDate || ("INPUT" !== y.input.nodeName && "TEXTAREA" !== y.input.nodeName || !y.input.placeholder || y.input.value !== y.input.placeholder ? y.input.value : null); e && he(e, y.config.dateFormat), y._initialDate = y.selectedDates.length > 0 ? y.selectedDates[0] : y.config.minDate && y.config.minDate.getTime() > y.now.getTime() ? y.config.minDate : y.config.maxDate && y.config.maxDate.getTime() < y.now.getTime() ? y.config.maxDate : y.now, y.currentYear = y._initialDate.getFullYear(), y.currentMonth = y._initialDate.getMonth(), y.selectedDates.length > 0 && (y.latestSelectedDateObj = y.selectedDates[0]), void 0 !== y.config.minTime && (y.config.minTime = y.parseDate(y.config.minTime, "H:i")), void 0 !== y.config.maxTime && (y.config.maxTime = y.parseDate(y.config.maxTime, "H:i")), y.minDateHasTime = !!y.config.minDate && (y.config.minDate.getHours() > 0 || y.config.minDate.getMinutes() > 0 || y.config.minDate.getSeconds() > 0), y.maxDateHasTime = !!y.config.maxDate && (y.config.maxDate.getHours() > 0 || y.config.maxDate.getMinutes() > 0 || y.config.maxDate.getSeconds() > 0) }(), y.utils = { getDaysInMonth: function (e, t) { return void 0 === e && (e = y.currentMonth), void 0 === t && (t = y.currentYear), 1 === e && (t % 4 == 0 && t % 100 != 0 || t % 400 == 0) ? 29 : y.l10n.daysInMonth[e] } }, y.isMobile || function () { var e = window.document.createDocumentFragment(); if (y.calendarContainer = u("div", "flatpickr-calendar"), y.calendarContainer.tabIndex = -1, !y.config.noCalendar) { if (e.appendChild((y.monthNav = u("div", "flatpickr-months"), y.yearElements = [], y.monthElements = [], y.prevMonthNav = u("span", "flatpickr-prev-month"), y.prevMonthNav.innerHTML = y.config.prevArrow, y.nextMonthNav = u("span", "flatpickr-next-month"), y.nextMonthNav.innerHTML = y.config.nextArrow, j(), Object.defineProperty(y, "_hidePrevMonthArrow", { get: function () { return y.__hidePrevMonthArrow }, set: function (e) { y.__hidePrevMonthArrow !== e && (c(y.prevMonthNav, "flatpickr-disabled", e), y.__hidePrevMonthArrow = e) } }), Object.defineProperty(y, "_hideNextMonthArrow", { get: function () { return y.__hideNextMonthArrow }, set: function (e) { y.__hideNextMonthArrow !== e && (c(y.nextMonthNav, "flatpickr-disabled", e), y.__hideNextMonthArrow = e) } }), y.currentYearElement = y.yearElements[0], ve(), y.monthNav)), y.innerContainer = u("div", "flatpickr-innerContainer"), y.config.weekNumbers) { var t = function () { y.calendarContainer.classList.add("hasWeeks"); var e = u("div", "flatpickr-weekwrapper"); e.appendChild(u("span", "flatpickr-weekday", y.l10n.weekAbbreviation)); var t = u("div", "flatpickr-weeks"); return e.appendChild(t), { weekWrapper: e, weekNumbers: t } }(), a = t.weekWrapper, r = t.weekNumbers; y.innerContainer.appendChild(a), y.weekNumbers = r, y.weekWrapper = a } y.rContainer = u("div", "flatpickr-rContainer"), y.rContainer.appendChild(G()), y.daysContainer || (y.daysContainer = u("div", "flatpickr-days"), y.daysContainer.tabIndex = -1), V(), y.rContainer.appendChild(y.daysContainer), y.innerContainer.appendChild(y.rContainer), e.appendChild(y.innerContainer) } y.config.enableTime && e.appendChild(function () { y.calendarContainer.classList.add("hasTime"), y.config.noCalendar && y.calendarContainer.classList.add("noCalendar"), y.timeContainer = u("div", "flatpickr-time"), y.timeContainer.tabIndex = -1; var e = u("span", "flatpickr-time-separator", ":"), t = h("flatpickr-hour", { "aria-label": y.l10n.hourAriaLabel }); y.hourElement = t.getElementsByTagName("input")[0]; var a = h("flatpickr-minute", { "aria-label": y.l10n.minuteAriaLabel }); if (y.minuteElement = a.getElementsByTagName("input")[0], y.hourElement.tabIndex = y.minuteElement.tabIndex = -1, y.hourElement.value = l(y.latestSelectedDateObj ? y.latestSelectedDateObj.getHours() : y.config.time_24hr ? y.config.defaultHour : function (e) { switch (e % 24) { case 0: case 12: return 12; default: return e % 12 } }(y.config.defaultHour)), y.minuteElement.value = l(y.latestSelectedDateObj ? y.latestSelectedDateObj.getMinutes() : y.config.defaultMinute), y.hourElement.setAttribute("step", y.config.hourIncrement.toString()), y.minuteElement.setAttribute("step", y.config.minuteIncrement.toString()), y.hourElement.setAttribute("min", y.config.time_24hr ? "0" : "1"), y.hourElement.setAttribute("max", y.config.time_24hr ? "23" : "12"), y.minuteElement.setAttribute("min", "0"), y.minuteElement.setAttribute("max", "59"), y.timeContainer.appendChild(t), y.timeContainer.appendChild(e), y.timeContainer.appendChild(a), y.config.time_24hr && y.timeContainer.classList.add("time24hr"), y.config.enableSeconds) { y.timeContainer.classList.add("hasSeconds"); var r = h("flatpickr-second"); y.secondElement = r.getElementsByTagName("input")[0], y.secondElement.value = l(y.latestSelectedDateObj ? y.latestSelectedDateObj.getSeconds() : y.config.defaultSeconds), y.secondElement.setAttribute("step", y.minuteElement.getAttribute("step")), y.secondElement.setAttribute("min", "0"), y.secondElement.setAttribute("max", "59"), y.timeContainer.appendChild(u("span", "flatpickr-time-separator", ":")), y.timeContainer.appendChild(r) } return y.config.time_24hr || (y.amPM = u("span", "flatpickr-am-pm", y.l10n.amPM[i((y.latestSelectedDateObj ? y.hourElement.value : y.config.defaultHour) > 11)]), y.amPM.title = y.l10n.toggleTitle, y.amPM.tabIndex = -1, y.timeContainer.appendChild(y.amPM)), y.timeContainer }()), c(y.calendarContainer, "rangeMode", "range" === y.config.mode), c(y.calendarContainer, "animate", !0 === y.config.animate), c(y.calendarContainer, "multiMonth", y.config.showMonths > 1), y.calendarContainer.appendChild(e); var n = void 0 !== y.config.appendTo && void 0 !== y.config.appendTo.nodeType; if ((y.config.inline || y.config.static) && (y.calendarContainer.classList.add(y.config.inline ? "inline" : "static"), y.config.inline && (!n && y.element.parentNode ? y.element.parentNode.insertBefore(y.calendarContainer, y._input.nextSibling) : void 0 !== y.config.appendTo && y.config.appendTo.appendChild(y.calendarContainer)), y.config.static)) { var o = u("div", "flatpickr-wrapper"); y.element.parentNode && y.element.parentNode.insertBefore(o, y.element), o.appendChild(y.element), y.altInput && o.appendChild(y.altInput), o.appendChild(y.calendarContainer) } y.config.static || y.config.inline || (void 0 !== y.config.appendTo ? y.config.appendTo : window.document.body).appendChild(y.calendarContainer) }(), function () { if (y.config.wrap && ["open", "close", "toggle", "clear"].forEach((function (e) { Array.prototype.forEach.call(y.element.querySelectorAll("[data-" + e + "]"), (function (t) { return D(t, "click", y[e]) })) })), y.isMobile) !function () { var e = y.config.enableTime ? y.config.noCalendar ? "time" : "datetime-local" : "date"; y.mobileInput = u("input", y.input.className + " flatpickr-mobile"), y.mobileInput.tabIndex = 1, y.mobileInput.type = e, y.mobileInput.disabled = y.input.disabled, y.mobileInput.required = y.input.required, y.mobileInput.placeholder = y.input.placeholder, y.mobileFormatStr = "datetime-local" === e ? "Y-m-d\\TH:i:S" : "date" === e ? "Y-m-d" : "H:i:S", y.selectedDates.length > 0 && (y.mobileInput.defaultValue = y.mobileInput.value = y.formatDate(y.selectedDates[0], y.mobileFormatStr)), y.config.minDate && (y.mobileInput.min = y.formatDate(y.config.minDate, "Y-m-d")), y.config.maxDate && (y.mobileInput.max = y.formatDate(y.config.maxDate, "Y-m-d")), y.input.getAttribute("step") && (y.mobileInput.step = String(y.input.getAttribute("step"))), y.input.type = "hidden", void 0 !== y.altInput && (y.altInput.type = "hidden"); try { y.input.parentNode && y.input.parentNode.insertBefore(y.mobileInput, y.input.nextSibling) } catch (e) { } D(y.mobileInput, "change", (function (e) { y.setDate(m(e).value, !1, y.mobileFormatStr), pe("onChange"), pe("onClose") })) }(); else { var e = o(re, 50); y._debouncedChange = o(F, 300), y.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && D(y.daysContainer, "mouseover", (function (e) { "range" === y.config.mode && ae(m(e)) })), D(window.document.body, "keydown", te), y.config.inline || y.config.static || D(window, "resize", e), void 0 !== window.ontouchstart ? D(window.document, "touchstart", K) : D(window.document, "click", K), D(window.document, "focus", K, { capture: !0 }), !0 === y.config.clickOpens && (D(y._input, "focus", y.open), D(y._input, "click", y.open)), void 0 !== y.daysContainer && (D(y.monthNav, "click", ke), D(y.monthNav, ["keyup", "increment"], q), D(y.daysContainer, "click", ue)), void 0 !== y.timeContainer && void 0 !== y.minuteElement && void 0 !== y.hourElement && (D(y.timeContainer, ["increment"], A), D(y.timeContainer, "blur", A, { capture: !0 }), D(y.timeContainer, "click", M), D([y.hourElement, y.minuteElement], ["focus", "click"], (function (e) { return m(e).select() })), void 0 !== y.secondElement && D(y.secondElement, "focus", (function () { return y.secondElement && y.secondElement.select() })), void 0 !== y.amPM && D(y.amPM, "click", (function (e) { A(e), F() }))), y.config.allowInput && D(y._input, "blur", ee) } }(), (y.selectedDates.length || y.config.noCalendar) && (y.config.enableTime && I(y.config.noCalendar ? y.latestSelectedDateObj || y.config.minDate : void 0), be(!1)), C(); var t = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); !y.isMobile && t && oe(), pe("onReady") }(), y } function C(e, t) { for (var a = Array.prototype.slice.call(e).filter((function (e) { return e instanceof HTMLElement })), r = [], n = 0; n < a.length; n++) { var l = a[n]; try { if (null !== l.getAttribute("data-fp-omit")) continue; void 0 !== l._flatpickr && (l._flatpickr.destroy(), l._flatpickr = void 0), l._flatpickr = _(l, t || {}), r.push(l._flatpickr) } catch (e) { console.error(e) } } return 1 === r.length ? r[0] : r } "function" != typeof Object.assign && (Object.assign = function (e) { for (var t = [], a = 1; a < arguments.length; a++)t[a - 1] = arguments[a]; if (!e) throw TypeError("Cannot convert undefined or null to object"); for (var r = function (t) { t && Object.keys(t).forEach((function (a) { return e[a] = t[a] })) }, n = 0, l = t; n < l.length; n++) { var i = l[n]; r(i) } return e }), "undefined" != typeof HTMLElement && "undefined" != typeof HTMLCollection && "undefined" != typeof NodeList && (HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (e) { return C(this, e) }, HTMLElement.prototype.flatpickr = function (e) { return C([this], e) }); var T = function (e, t) { return "string" == typeof e ? C(window.document.querySelectorAll(e), t) : e instanceof Node ? C([e], t) : C(e, t) }; return T.defaultConfig = {}, T.l10ns = { en: e({}, n), default: e({}, n) }, T.localize = function (t) { T.l10ns.default = e(e({}, T.l10ns.default), t) }, T.setDefaults = function (t) { T.defaultConfig = e(e({}, T.defaultConfig), t) }, T.parseDate = k({}), T.formatDate = b({}), T.compareDates = x, "undefined" != typeof jQuery && void 0 !== jQuery.fn && (jQuery.fn.flatpickr = function (e) { return C(this, e) }), Date.prototype.fp_incr = function (e) { return new Date(this.getFullYear(), this.getMonth(), this.getDate() + ("string" == typeof e ? parseInt(e, 10) : e)) }, "undefined" != typeof window && (window.flatpickr = T), T }() })), Hh = Math.sign || function (e) { return 0 == (e = +e) || e != e ? e : e < 0 ? -1 : 1 }, Uh = Math.abs, jh = Math.pow; function Gh(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "redo"; if (null != e) { var a = e.data; "undo" == t && (a = e.curdata); for (var r = 0; r < e.range.length; r++)for (var n = e.range[r].row[0], l = e.range[r].row[1], i = e.range[r].column[0], o = e.range[r].column[1], s = n; s < l + 1; s++)for (var c = i; c < o + 1 && !(s > a.length - 1); c++)null == a[s][c] || null == a[s][c].f || "" == a[s][c].f ? Ih.delFunctionGroup(s, c, e.sheetIndex) : null != a[s][c] && null != a[s][c].f && a[s][c].f.length > 0 && Ih.insertUpdateFunctionGroup(s, c, e.sheetIndex) } } Ee({ target: "Math", stat: !0 }, { cbrt: function (e) { return Hh(e = +e) * jh(Uh(e), 1 / 3) } }); var Wh = function (e) { if (0 != ga.jfredo.length) { var t = ga.jfredo.pop(); if (ga.jfundo.push(t), ga.clearjfundo = !1, Sh.hasSheet(t.sheetIndex) && ga.currentSheetIndex != t.sheetIndex && Sh.changeSheetExec(t.sheetIndex), "datachange" == t.type) { Gh(t); var a = { cfg: t.config, RowlChange: t.RowlChange, cdformat: t.cdformat, dataVerification: t.dataVerification, dynamicArray: t.dynamicArray }; id(t.data, t.range, a) } else if ("pasteCut" == t.type) { dd({ sheetIndex: t.source.sheetIndex, data: t.source.curData, curData: t.source.data, config: t.source.curConfig, curConfig: t.source.config, cdformat: t.source.curCdformat, curCdformat: t.source.cdformat, dataVerification: t.source.curDataVerification, curDataVerification: t.source.dataVerification, range: t.source.range }, { sheetIndex: t.target.sheetIndex, data: t.target.curData, curData: t.target.data, config: t.target.curConfig, curConfig: t.target.config, cdformat: t.target.curCdformat, curCdformat: t.target.cdformat, dataVerification: t.target.curDataVerification, curDataVerification: t.target.dataVerification, range: t.target.range }, t.RowlChange) } else if ("rangechange" == t.type) Gh(t), sd(t.data, t.range, t.cdformat); else if ("resize" == t.type) { ga.config = t.config, ga.luckysheetfile[_l(t.sheetIndex)].config = ga.config, "resizeR" == t.ctrlType ? pd.saveParam("cg", t.sheetIndex, t.config.rowlen, { k: "rowlen" }) : "resizeC" == t.ctrlType && pd.saveParam("cg", t.sheetIndex, t.config.columnlen, { k: "columnlen" }); var r = $.extend(!0, {}, t.images); ga.luckysheetfile[_l(t.sheetIndex)].images = r, pd.saveParam("all", t.sheetIndex, r, { k: "images" }), Rc.images = r, Rc.allImagesShow(), hd(ga.flowdata.length, ga.flowdata[0].length) } else if ("cellRowChange" == t.type) od(t.data[0].length, t.data.length, t.data, t.config, t.range, t.ctrlType, t.ctrlValue, t.cdformat); else if ("extend" == t.type) od(t.data[0].length, t.data.length, t.data, t.config, t.range, "dele", t.ctrlValue); else if ("dele" == t.type) { var n = $.extend(!0, {}, t.ctrlValue); n.restore = !0, od(t.data[0].length, t.data.length, t.data, t.config, t.range, "extend", n) } else if ("addRC" == t.type) { var l = $.extend(!0, {}, t.ctrlValue); "rightbottom" == l.direction && (l.index = l.index + 1), cd(t.data, t.config, "delRC", l, t.calc, t.filterObj, t.cf, t.af, t.freezen, t.dataVerification, t.hyperlink) } else if ("delRC" == t.type) { var i = $.extend(!0, {}, t.ctrlValue); i.restore = !0, i.direction = "lefttop", cd(t.data, t.config, "addRC", i, t.calc, t.filterObj, t.cf, t.af, t.freezen, t.dataVerification, t.hyperlink) } else if ("deleteCell" == t.type) ud(t.data, t.config, t.ctrl, t.calc, t.filterObj, t.cf, t.dataVerification, t.hyperlink); else if ("showHidRows" == t.type) ga.config = t.config, ga.luckysheetfile[_l(t.sheetIndex)].config = t.config, pd.saveParam("cg", t.sheetIndex, t.config.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length); else if ("showHidCols" == t.type) ga.config = t.config, ga.luckysheetfile[_l(t.sheetIndex)].config = t.config, pd.saveParam("cg", t.sheetIndex, t.config.colhidden, { k: "colhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length); else if ("datachangeAll" == t.type) Ih.execFunctionGroup(), od(t.data[0].length, t.data.length, t.data, null, t.range, "datachangeAll", t.ctrlValue); else if ("datachangeAll_filter_clear" == t.type) Sc(t.filter_save), $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function (e) { var a = $(this), r = t.optiongroups[e]; Cc(a, r.optionstate, r.rowhidden, r.caljs, !1, r.st_r, r.ed_r, r.cindex, r.st_c, r.ed_c) })), pd.saveParam("fsr", ga.currentSheetIndex, { filter: t.optiongroups, filter_select: t.filter_save }), ga.config = t.config, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, null == ga.config.rowhidden && (ga.config.rowhidden = {}), pd.saveParam("cg", ga.currentSheetIndex, ga.config.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(); else if ("datachangeAll_filter" == t.type) { var o = $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(t.optionsindex), s = o.data("str"), c = o.data("edr"), u = o.data("cindex"), d = o.data("stc"), h = o.data("edc"); Cc(o, _c.hasKey(t.rowhidenPre), t.rowhidenPre, t.caljs, !0, s, c, u, d, h), ga.config = t.config, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, null == ga.config.rowhidden && (ga.config.rowhidden = {}), pd.saveParam("cg", ga.currentSheetIndex, ga.config.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide() } else if ("filtershow" == t.type) $("#luckysheet-filter-selected-sheet" + t.sheetIndex + ", #luckysheet-filter-options-sheet" + t.sheetIndex).remove(), pd.allowUpdate && pd.saveParam("all", t.sheetIndex, null, { k: "filter_select" }); else if ("pivotTable_change" == t.type) ga.luckysheetfile[_l(t.sheetIndex)].pivotTable = t.pivotTable, Ru.getCellData(t.sheetIndex), Ru.initialPivotManage(!0), Ru.refreshPivotTable(); else if ("addSheet" == t.type) Sh.deleteSheet(t.index), Sh.changeSheetExec(t.currentSheetIndex), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(); else if ("copySheet" == t.type) Sh.deleteSheet(t.index), Sh.changeSheetExec(t.copyindex); else if ("deleteSheet" == t.type) { for (var m = !1, p = 0; p < ga.luckysheetfile.length; p++)ga.luckysheetfile[p].name == t.name && (m = !0); m || (Sh.createSheetbydata(t, "isrenew"), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide()) } else if ("sheetName" == t.type) ga.luckysheetfile[_l(t.sheetIndex)].name = t.oldtxt, $("#luckysheet-sheets-item" + t.sheetIndex).find(".luckysheet-sheets-item-name").html(t.oldtxt), pd.saveParam("all", t.sheetIndex, t.oldtxt, { k: "name" }); else if ("sheetColor" == t.type) { ga.luckysheetfile[_l(t.sheetIndex)].color = t.oldcolor; var f = $("#luckysheet-sheets-item" + t.sheetIndex); f.find(".luckysheet-sheets-item-color").remove(), null != t.oldcolor && f.append('
      '), pd.saveParam("all", t.sheetIndex, t.oldcolor, { k: "color" }) } else if ("mergeChange" == t.type) { var g = { cfg: t.config }; id(t.data, t.range, g) } else if ("updateDataVerification" == t.type) $c.ref(t.currentDataVerification, t.historyDataVerification, t.sheetIndex); else if ("updateDataVerificationOfCheckbox" == t.type) $c.refOfCheckbox(t.currentDataVerification, t.historyDataVerification, t.sheetIndex, t.data, t.range); else if ("updateHyperlink" == t.type) rd.ref(t.currentHyperlink, t.historyHyperlink, t.sheetIndex, t.data, t.range); else if ("updateCF" == t.type) { for (var v = t.data.historyRules, y = 0; y < v.length; y++) { var b = v[y].sheetIndex; ga.luckysheetfile[_l(b)].luckysheet_conditionformat_save = v[y].luckysheet_conditionformat_save, pd.allowUpdate && pd.saveParam("all", b, v[y].luckysheet_conditionformat_save, { k: "luckysheet_conditionformat_save" }) } gd.ref() } else if ("updateAF" == t.type) { var k = t.data.historyRules, x = _l(t.sheetIndex); ga.luckysheetfile[x].luckysheet_alternateformat_save = $.extend(!0, [], k), setTimeout((function () { md() }), 1) } else if ("borderChange" == t.type) null == t.config.borderInfo ? pd.saveParam("cg", t.sheetIndex, [], { k: "borderInfo" }) : pd.saveParam("cg", t.sheetIndex, t.config.borderInfo, { k: "borderInfo" }), ga.config = t.config, ga.luckysheetfile[_l(t.sheetIndex)].config = ga.config, setTimeout((function () { md() }), 1); else if ("postil" == t.type) { Pc.ref(t.data, t.rc); for (var w = 0; w < t.rc.length; w++) { var _ = t.rc[w].split("_")[0], C = t.rc[w].split("_")[1]; null != t.data[_][C] && null != t.data[_][C].ps ? Pc.buildPs(_, C, t.data[_][C].ps) : Pc.buildPs(_, C, null) } } else "imageCtrl" == t.type ? (Rc.images = $.extend(!0, {}, t.images), Rc.allImagesShow(), Rc.ref()) : "zoomChange" == t.type && (ga.zoomRatio = t.zoomRatio, pd.saveParam("all", t.currentSheetIndex, t.zoomRatio, { k: "zoomRatio" }), Ah(), Ch()); yd(e), t.range && (ga.luckysheet_select_save = t.range, Rh()), ga.clearjfundo = !0, pm(); var T = $a($a({}, t), { data: t.curdata, curdata: t.data }); Nc.createHookFunction("updated", T) } }, Yh = function () { if (0 != ga.jfundo.length) { var e = ga.jfundo.pop(); if (ga.jfredo.push(e), ga.clearjfundo = !1, Sh.hasSheet(e.sheetIndex) && ga.currentSheetIndex != e.sheetIndex && Sh.changeSheetExec(e.sheetIndex), "datachange" == e.type) { Ih.execFunctionGroup(); var t = { cfg: e.curConfig, RowlChange: e.RowlChange, cdformat: e.curCdformat, dataVerification: e.curDataVerification, dynamicArray: e.curDynamicArray }; Gh(e, "undo"), id(e.curdata, e.range, t) } else if ("pasteCut" == e.type) dd(e.source, e.target, e.RowlChange); else if ("rangechange" == e.type) Gh(e, "undo"), sd(e.curdata, e.range, e.curCdformat); else if ("resize" == e.type) { ga.config = e.curconfig, ga.luckysheetfile[_l(e.sheetIndex)].config = ga.config, "resizeR" == e.ctrlType ? pd.saveParam("cg", e.sheetIndex, e.curconfig.rowlen, { k: "rowlen" }) : "resizeC" == e.ctrlType && pd.saveParam("cg", e.sheetIndex, e.curconfig.columnlen, { k: "columnlen" }); var a = $.extend(!0, {}, e.curImages); ga.luckysheetfile[_l(e.sheetIndex)].images = a, pd.saveParam("all", e.sheetIndex, a, { k: "images" }), Rc.images = a, Rc.allImagesShow(), hd(ga.flowdata.length, ga.flowdata[0].length) } else if ("cellRowChange" == e.type) od(e.curdata[0].length, e.curdata.length, e.curdata, e.curconfig, e.currange, e.ctrlType, e.ctrlValue, e.curCdformat); else if ("extend" == e.type) od(e.curdata[0].length, e.curdata.length, e.curdata, e.curconfig, e.currange, e.ctrlType, e.ctrlValue); else if ("dele" == e.type) { $.extend(!0, {}, e.ctrlValue).restore = !0, od(e.curdata[0].length, e.curdata.length, e.curdata, e.curconfig, e.currange, e.ctrlType, e.ctrlValue) } else if ("addRC" == e.type) cd(e.curData, e.curConfig, "addRC", e.ctrlValue, e.curCalc, e.curFilterObj, e.curCf, e.curAf, e.curFreezen, e.curDataVerification, e.curHyperlink); else if ("delRC" == e.type) cd(e.curData, e.curConfig, "delRC", e.ctrlValue, e.curCalc, e.curFilterObj, e.curCf, e.curAf, e.curFreezen, e.curDataVerification, e.curHyperlink); else if ("deleteCell" == e.type) ud(e.curData, e.curConfig, e.ctrl, e.curCalc, e.curFilterObj, e.curCf, e.curDataVerification, e.curHyperlink); else if ("showHidRows" == e.type) ga.config = e.curconfig, ga.luckysheetfile[_l(e.sheetIndex)].config = e.curconfig, pd.saveParam("cg", e.sheetIndex, e.curconfig.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length); else if ("showHidCols" == e.type) ga.config = e.curconfig, ga.luckysheetfile[_l(e.sheetIndex)].config = e.curconfig, pd.saveParam("cg", e.sheetIndex, e.curconfig.colhidden, { k: "colhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length); else if ("datachangeAll" == e.type) Ih.execFunctionGroup(), od(e.curdata[0].length, e.curdata.length, e.curdata, null, e.currange, "datachangeAll", e.ctrlValue); else if ("datachangeAll_filter_clear" == e.type) pd.saveParam("fsc", ga.currentSheetIndex, null), ga.config = e.curconfig, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, {}, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu .luckysheet-filter-selected-input").hide().find("input").val(), $("#luckysheet-filter-selected span").data("type", "0").data("type", null).text("无"), $("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex + ", #luckysheet-filter-options-sheet" + ga.currentSheetIndex).remove(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(); else if ("datachangeAll_filter" == e.type) { var r = $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(e.optionsindex), n = r.data("str"), l = r.data("edr"), i = r.data("cindex"), o = r.data("stc"), s = r.data("edc"); Cc(r, _c.hasKey(e.rowhidden), e.rowhidden, e.caljs, !0, n, l, i, o, s), ga.config = e.curconfig, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, ga.config.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide() } else if ("filtershow" == e.type) ga.luckysheet_select_save = [e.filter_save], ga.filterchage = !1, Ac(), ga.filterchage = !0, pd.saveParam("all", e.sheetIndex, e.filter_save, { k: "filter_select" }); else if ("pivotTable_change" == e.type) ga.luckysheetfile[_l(e.sheetIndex)].pivotTable = e.pivotTablecur, Ru.getCellData(e.sheetIndex), Ru.initialPivotManage(!0), Ru.refreshPivotTable(); else if ("addSheet" == e.type) Sh.createSheetbydata(e.sheetconfig), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(); else if ("copySheet" == e.type) Sh.copySheet(e.copyindex); else if ("deleteSheet" == e.type) Sh.deleteSheet(e.index), 0 == e.order ? Sh.changeSheetExec(ga.luckysheetfile[0].index) : Sh.changeSheetExec(ga.luckysheetfile[e.order - 1].index), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(); else if ("sheetName" == e.type) ga.luckysheetfile[_l(e.sheetIndex)].name = e.txt, $("#luckysheet-sheets-item" + e.sheetIndex).find(".luckysheet-sheets-item-name").html(e.txt), pd.saveParam("all", e.sheetIndex, e.txt, { k: "name" }); else if ("sheetColor" == e.type) { ga.luckysheetfile[_l(e.sheetIndex)].color = e.color; var c = $("#luckysheet-sheets-item" + e.sheetIndex); c.find(".luckysheet-sheets-item-color").remove(), null != e.color && c.append('
      '), pd.saveParam("all", e.sheetIndex, e.color, { k: "color" }) } else if ("mergeChange" == e.type) { var u = { cfg: e.curConfig }; id(e.curData, e.range, u) } else if ("updateDataVerification" == e.type) $c.ref(e.historyDataVerification, e.currentDataVerification, e.sheetIndex); else if ("updateDataVerificationOfCheckbox" == e.type) $c.refOfCheckbox(e.historyDataVerification, e.currentDataVerification, e.sheetIndex, e.curData, e.range); else if ("updateHyperlink" == e.type) rd.ref(e.historyHyperlink, e.currentHyperlink, e.sheetIndex, e.curData, e.range); else if ("updateCF" == e.type) { for (var d = e.data.currentRules, h = 0; h < d.length; h++) { var m = d[h].sheetIndex; ga.luckysheetfile[_l(m)].luckysheet_conditionformat_save = d[h].luckysheet_conditionformat_save, pd.allowUpdate && pd.saveParam("all", m, d[h].luckysheet_conditionformat_save, { k: "luckysheet_conditionformat_save" }) } gd.ref() } else if ("updateAF" == e.type) { var p = e.data.currentRules, f = _l(e.sheetIndex); ga.luckysheetfile[f].luckysheet_alternateformat_save = $.extend(!0, [], p), setTimeout((function () { md() }), 1) } else if ("borderChange" == e.type) pd.saveParam("cg", e.sheetIndex, e.curconfig.borderInfo, { k: "borderInfo" }), ga.config = e.curconfig, ga.luckysheetfile[_l(e.sheetIndex)].config = ga.config, setTimeout((function () { md() }), 1); else if ("postil" == e.type) { Pc.ref(e.curdata, e.rc); for (var g = 0; g < e.rc.length; g++) { var v = e.rc[g].split("_")[0], y = e.rc[g].split("_")[1]; null != e.curdata[v][y] && null != e.curdata[v][y].ps ? Pc.buildPs(v, y, e.curdata[v][y].ps) : Pc.buildPs(v, y, null) } } else "imageCtrl" == e.type ? (Rc.images = $.extend(!0, {}, e.curImages), Rc.allImagesShow(), Rc.ref()) : "zoomChange" == e.type && (ga.zoomRatio = e.curZoomRatio, pd.saveParam("all", e.currentSheetIndex, e.curZoomRatio, { k: "zoomRatio" }), Ah(), Ch()); e.range && (ga.luckysheet_select_save = e.range, Rh()), ga.clearjfundo = !0, pm() } }; function Xh(e, t, a) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, n = ga.flowdata[e][t], l = JSON.stringify(n); if (!ba(e) || !ba(t)) return fd.info("The row or column parameter is invalid.", ""); var i = $a({}, r), o = i.order, s = void 0 === o ? _l(ga.currentSheetIndex) : o, c = i.isRefresh, u = void 0 === c || c, d = i.success, h = ga.luckysheetfile[s]; if (null == h) return fd.info("The order parameter is invalid.", ""); if (Nc.createHookFunction("cellUpdateBefore", e, t, a, u)) { var m = h.data; u && (m = $.extend(!0, [], h.data)), 0 == m.length && (m = Sh.buildGridData(h)); var p = { bg: 1, ff: 1, fc: 1, bl: 1, it: 1, fs: 1, cl: 1, un: 1, vt: 1, ht: 1, mc: 1, tr: 1, tb: 1, rt: 1, qp: 1 }; if (null == a || 0 == a.toString().length) Ih.delFunctionGroup(e, t), Cs(e, t, m, a); else if (a instanceof Object) { var f = {}, g = m[e][t]; for (var v in ya(g) && (g = {}), null != a.f && null == a.v ? (f.f = a.f, null != a.ct && (f.ct = a.ct), m = Ih.updatecell(e, t, f, !1).data) : (null != a.ct && (f.ct = a.ct), null != a.f && (f.f = a.f), null != a.v ? f.v = a.v : f.v = g.v, null != a.m && (f.m = a.m), Ih.delFunctionGroup(e, t), Cs(e, t, m, f)), a) { var y = a[v]; v in p ? xm.updateFormatCell(m, v, y, e, e, t, t) : g[v] = y } m[e][t] = g } else "=" == a.toString().substr(0, 1) || " 4 && void 0 !== arguments[4] ? arguments[4] : {}; if (!ba(e) || !ba(t)) return fd.info("Arguments row or column cannot be null or undefined.", ""); if (!a) return fd.info("Arguments attr cannot be null or undefined.", ""); var l = _l(ga.currentSheetIndex), i = $a({}, n), o = i.order, s = void 0 === o ? l : o, c = i.success, u = ga.luckysheetfile[s]; if (null == u) return fd.info("The order parameter is invalid.", ""); var d = $.extend(!0, [], u.data); 0 == d.length && (d = Sh.buildGridData(u)); var h = d[e][t] || {}, m = $.extend(!0, {}, u.config); if (!("ct" != a || r && r.hasOwnProperty("fa") && r.hasOwnProperty("t"))) return new TypeError("While set attribute 'ct' to cell, the value must have property 'fa' and 't'"); if ("bd" == a) { null == m.borderInfo && (m.borderInfo = []); var p = $a({ rangeType: "range", borderType: "border-all", color: "#000", style: "1", range: [{ column: [t, t], row: [e, e] }] }, r); m.borderInfo.push(p) } else h[a] = r; d[e][t] = h, u.index == ga.currentSheetIndex ? (u.config = m, ga.config = m, id(d, [{ row: [e, e], column: [t, t] }])) : (u.config = m, u.data = d), c && "function" == typeof c && c(h) } function Zh(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (!e && 0 != e) return fd.info("Search content cannot be null or empty", ""); for (var a = _l(ga.currentSheetIndex), r = $a({}, t), n = r.isRegularExpression, l = void 0 !== n && n, i = r.isWholeWord, o = void 0 !== i && i, s = r.isCaseSensitive, c = void 0 !== s && s, u = r.order, d = void 0 === u ? a : u, h = r.type, m = void 0 === h ? "m" : h, p = ga.luckysheetfile[d].data, f = [], g = 0; g < p.length; g++)for (var v = p[g], y = 0; y < v.length; y++) { var b = v[y]; if (b) if (b.row = g, b.column = y, o) c ? e.toString() == b[m] && f.push(b) : b[m] && e.toString().toLowerCase() == b[m].toLowerCase() && f.push(b); else if (l) { (c ? new RegExp(Yd.getRegExpStr(e), "g") : new RegExp(Yd.getRegExpStr(e), "ig")).test(b[m]) && f.push(b) } else if (c) { var k = new RegExp(Yd.getRegExpStr(e), "g"); k.test(b[m]) && f.push(b) } else { var x = new RegExp(Yd.getRegExpStr(e), "ig"); x.test(b[m]) && f.push(b) } } return f } function Qh(e) { if (Bc.saveFrozen("freezenRow", e), !e || e == _l(ga.currentSheetIndex)) { var t = $("#luckysheet-cell-main").scrollTop(), a = Ts(ga.visibledatarow, t); -1 == a && (a = 0); var r = ga.visibledatarow[a] - 2 - t + ga.columnHeaderHeight, n = [ga.visibledatarow[a], a + 1, t, Bc.cutVolumn(ga.visibledatarow, a + 1), r]; Bc.saveFreezen(n, r, null, null), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), Bc.createFreezenHorizontal(n, r), Bc.createAssistCanvas(), md() } } function Jh(e) { if (Bc.saveFrozen("freezenColumn", e), !e || e == _l(ga.currentSheetIndex)) { var t = $("#luckysheet-cell-main").scrollLeft(), a = Ts(ga.visibledatacolumn, t); -1 == a && (a = 0); var r = ga.visibledatacolumn[a] - 2 - t + ga.rowHeaderWidth, n = [ga.visibledatacolumn[a], a + 1, t, Bc.cutVolumn(ga.visibledatacolumn, a + 1), r]; Bc.saveFreezen(null, null, n, r), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.createFreezenVertical(n, r), Bc.createAssistCanvas(), md() } } function em(e, t) { var a = gn().freezen; if (e && (e.hasOwnProperty("row_focus") || Ih.iscelldata(e))) { if ("string" == typeof e && Ih.iscelldata(e) && (e = { row_focus: (e = Ih.getcellrange(e)).row[0], column_focus: e.column[0] }), Bc.saveFrozen("freezenRowRange", t, e), !t || t == _l(ga.currentSheetIndex)) { var r = $("#luckysheet-cell-main").scrollTop(), n = Ts(ga.visibledatarow, r), l = e.row_focus; l > n && (n = l), -1 == n && (n = 0); var i = ga.visibledatarow[n] - 2 - r + ga.columnHeaderHeight, o = [ga.visibledatarow[n], n + 1, r, Bc.cutVolumn(ga.visibledatarow, n + 1), i]; Bc.saveFreezen(o, i, null, null), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), Bc.createFreezenHorizontal(o, i), Bc.createAssistCanvas(), md() } } else wa() ? alert(a.noSeletionError) : fd.info(a.noSeletionError, "") } function tm(e, t) { var a = gn().freezen, r = "string" == typeof e && Ih.iscelldata(e); if (e && (e.hasOwnProperty("column_focus") || r)) { if (r && (e = { row_focus: (e = Ih.getcellrange(e)).row[0], column_focus: e.column[0] }), Bc.saveFrozen("freezenColumnRange", t, e), !t || t == _l(ga.currentSheetIndex)) { var n = $("#luckysheet-cell-main").scrollLeft(), l = Ts(ga.visibledatacolumn, n), i = e.column_focus; i > l && (l = i), -1 == l && (l = 0); var o = ga.visibledatacolumn[l] - 2 - n + ga.rowHeaderWidth, s = [ga.visibledatacolumn[l], l + 1, n, Bc.cutVolumn(ga.visibledatacolumn, l + 1), o]; Bc.saveFreezen(null, null, s, o), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.createFreezenVertical(s, o), Bc.createAssistCanvas(), md() } } else wa() ? alert(a.noSeletionError) : fd.info(a.noSeletionError, "") } function am(e) { Bc.saveFrozen("freezenCancel", e), e && e != _l(ga.currentSheetIndex) || (null != Bc.freezenverticaldata && Bc.cancelFreezenVertical(), null != Bc.freezenhorizontaldata && Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()) } function rm(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; if (!ba(t)) return fd.info("The index parameter is invalid.", ""); var r, n = _l(ga.currentSheetIndex), l = $a({}, a), i = l.number, o = void 0 === i ? 1 : i, s = l.order, c = void 0 === s ? n : s, u = l.success, d = gn(), h = d.info; ba(o) ? (o = parseInt(o)) < 1 || o > 100 ? wa() ? alert(h.tipInputNumberLimit) : fd.info(h.tipInputNumberLimit, "") : (c && ga.luckysheetfile[c] && (r = ga.luckysheetfile[c].index), qc(e, t, o, "lefttop", r), u && "function" == typeof u && u()) : wa() ? alert(h.tipInputNumber) : fd.info(h.tipInputNumber, "") } function nm(e, t, a) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; if (!ba(t) || !ba(a)) return fd.info("Please enter the index for deleting rows or columns correctly.", ""); var n, l = _l(ga.currentSheetIndex), i = $a({}, r), o = i.order, s = void 0 === o ? l : o, c = i.success; s && ga.luckysheetfile[s] && (n = ga.luckysheetfile[s].index), Dc(e, t, a, n), c && "function" == typeof c && c() } function lm(e, t, a) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; if (!ba(t) || !ba(a)) return fd.info("Please enter the index for deleting rows or columns correctly.", ""); var n = _l(ga.currentSheetIndex), l = $a({}, r), i = l.order, o = void 0 === i ? n : i, s = l.success, c = ga.luckysheetfile[o], u = "row" === e ? "rowhidden" : "colhidden", d = $.extend(!0, {}, c.config); null == d[u] && (d[u] = {}); for (var h = t; h <= a; h++)d[u][h] = 0; if (ga.clearjfundo) { var m = {}; m.type = "row" === e ? "showHidRows" : "showHidCols", m.sheetIndex = c.index, m.config = $.extend(!0, {}, c.config), m.curconfig = d, ga.jfundo.length = 0, ga.jfredo.push(m) } ga.luckysheetfile[o].config = d, pd.saveParam("cg", c.index, d[u], { k: u }), o == n && (ga.config = d, hd(ga.flowdata.length, ga.flowdata[0].length)), s && "function" == typeof s && s() } function im(e, t, a) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; if (!ba(t) || !ba(a)) return fd.info("Please enter the index for deleting rows or columns correctly.", ""); var n = _l(ga.currentSheetIndex), l = $a({}, r), i = l.order, o = void 0 === i ? n : i, s = l.success, c = ga.luckysheetfile[o], u = "row" === e ? "rowhidden" : "colhidden", d = $.extend(!0, {}, c.config); if (null != d[u]) { for (var h = t; h <= a; h++)delete d[u][h]; if (ga.clearjfundo) { var m = {}; m.type = "row" === e ? "showHidRows" : "showHidCols", m.sheetIndex = c.index, m.config = $.extend(!0, {}, c.config), m.curconfig = d, ga.jfundo.length = 0, ga.jfredo.push(m) } ga.luckysheetfile[o].config = ga.config, pd.saveParam("cg", c.index, d[u], { k: u }), o === n && (ga.config = d, hd(ga.flowdata.length, ga.flowdata[0].length)), s && "function" == typeof s && s() } } function om() { for (var e = ga.luckysheet_select_save, t = [], a = 0; a < e.length; a++) { var r = e[a], n = { row: r.row, column: r.column }; t.push(n) } return t } function sm(e) { e = e || om(); var t = []; return e.forEach((function (e) { for (var a = e.row, r = e.column, n = a[0]; n <= a[1]; n++)for (var l = r[0]; l <= r[1]; l++)t.push({ r: n, c: l }) })), t } function cm(e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], l = $a({}, a), i = l.range, o = void 0 === i ? n : i, s = l.order, c = void 0 === s ? r : s; if (!e) return fd.info("Arguments attr cannot be null or undefined.", ""), "error"; if (o instanceof Array) return fd.info("setRangeValue only supports a single selection.", ""), "error"; if ("string" == Cm(o)) { if (!Ih.iscelldata(o)) return fd.info("The range parameter is invalid.", ""), "error"; o = Ih.getcellrange(o) } if ("object" != Cm(o) || null == o.row || null == o.column) return fd.info("The range parameter is invalid.", ""), "error"; for (var u = o.row[0]; u <= o.row[1]; u++)for (var d = o.column[0]; d <= o.column[1]; d++)console.log("r", u), console.log("c", d), Xh(u, d, Ia({}, e, t), { order: c, isRefresh: !1 }) } function um() { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = ga.luckysheet_select_save, a = _l(ga.currentSheetIndex), r = $a({}, e), n = r.range, l = void 0 === n ? t : n, i = r.order, o = void 0 === i ? a : i, s = (r.success, ga.luckysheetfile[o]), c = $.extend(!0, {}, s.config), u = $.extend(!0, [], s.data); if (0 == u.length && (u = $.extend(!0, [], Sh.buildGridData(s))), "string" == Cm(l)) { if (!Ih.iscelldata(l)) return fd.info("Incorrect selection format", ""); var d = Ih.getcellrange(l); l = [{ row: d.row, column: d.column }] } else if ("object" == Cm(l)) { if (!l.hasOwnProperty("row") || !l.hasOwnProperty("column")) return fd.info("Incorrect selection format", ""); l = [{ row: l.row, column: l.column }] } if (Dh(l)) return fd.info("Cannot merge overlapping range", ""); if (null != c.merge) { for (var h = !1, m = 0; m < l.length; m++) { var p = l[m].row[0], f = l[m].row[1], g = l[m].column[0], v = l[m].column[1]; if (h = _a(c, p, f, g, v)) break } if (h) return fd.info("Cannot perform this operation on partially merged cells", "") } for (var y = 0; y < l.length; y++) { var b = l[y].row[0], k = l[y].row[1], x = l[y].column[0], w = l[y].column[1]; if (b != k || x != w) for (var _ = {}, C = b; C <= k; C++)for (var T = x; T <= w; T++) { var A = u[C][T]; if (null != A && null != A.mc) { var S = A.mc.r, I = A.mc.c; if ("rs" in A.mc) delete A.mc, delete c.merge[S + "_" + I], _[S + "_" + I] = $.extend(!0, {}, A); else { var R = JSON.parse(JSON.stringify(_[S + "_" + I])); delete R.v, delete R.m, delete R.ct, delete R.f, delete R.spl, u[C][T] = R } } } } o == a ? (ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "mergeChange", sheetIndex: s.index, data: $.extend(!0, [], s.data), curData: u, range: l, config: $.extend(!0, {}, s.config), curConfig: c })), ga.clearjfundo = !1, id(u, l, { cfg: c }), ga.clearjfundo = !0) : (s.data = u, s.config = c) } function dm() { var e = $.extend(!0, [], ga.luckysheetfile); return e.forEach((function (e, t, a) { null != e.data && e.data.length > 0 && (e.celldata = Sh.getGridData(e.data)), delete e.load, delete e.freezen })), e } function hm() { var e = ga.toJsonOptions; return e.title = $("#luckysheet_info_detail_input").val(), e.data = dm(), Tl().forEach((function (t, a) { null != t.data && (e.data[a].row = "array" === Cm(t.data) ? t.data.length : 0, e.data[a].column = "array" === Cm(t.data[0]) ? t.data[0].length : 0) })), e } function mm(e) { $("#luckysheet-bottom-pager").remove(), $("#luckysheet-sheet-area").append('
      '), $("#luckysheet-bottom-pager").sPage({ page: e.pageIndex, total: e.total, selectOption: e.selectOption, pageSize: e.pageSize, showTotal: !0, showSkip: e.showSkip || !0, showPN: e.showPN || !0, backFun: function (e) { e.pageIndex = e.page, Nc.createHookFunction("onTogglePager", e) } }) } function pm(e, t, a, r) { if (e = e || ga.flowdata, null == t && null == a) { var n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; t = n.row_focus || n.row[0], a = n.column_focus || n.column[0] } xm.menuButtonFocus(e, t, a), setTimeout((function () { r && "function" == typeof r && r() })) } var fm = Object.freeze({ __proto__: null, getCellValue: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; if (!ba(e) || !ba(t)) return fd.info("Arguments row or column cannot be null or undefined.", ""); var r, n = _l(ga.currentSheetIndex), l = $a({}, a), i = l.type, o = void 0 === i ? "v" : i, s = l.order, c = void 0 === s ? n : s, u = ga.luckysheetfile[c].data, d = u[e][t]; return "object" == Cm(d) && (r = d[o], "f" == o && null != r ? r = Ih.functionHTMLGenerate(r) : "f" == o ? r = d.v : d && d.ct && "yyyy-MM-dd" == d.ct.fa && (r = d.m)), null == r && (r = null), r }, setCellValue: Xh, clearCell: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; if (!ba(e) || !ba(t)) return fd.info("Arguments row and column cannot be null or undefined.", ""); var r = _l(ga.currentSheetIndex), n = $a({}, a), l = n.order, i = void 0 === l ? r : l, o = n.success, s = $.extend(!0, [], ga.luckysheetfile[i].data), c = s[e][t]; "object" == Cm(c) ? (delete c.m, delete c.v, null != c.f && (delete c.f, Ih.delFunctionGroup(e, t, i), delete c.spl)) : c = null, i === r ? id(s, [{ row: [e, e], column: [t, t] }]) : ga.luckysheetfile[i].data = s, o && "function" == typeof o && o(c) }, deleteCell: function (e, t, a) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, n = ["left", "up"]; if (!e || n.indexOf(e) < 0) return fd.info("Arguments move cannot be null or undefined and its value must be 'left' or 'up'", ""); if (!ba(t) || !ba(a)) return fd.info("Arguments row and column cannot be null or undefined.", ""); var l, i = _l(ga.currentSheetIndex), o = $a({}, r), s = o.order, c = void 0 === s ? i : s, u = o.success, d = "move" + e.replace(e[0], e[0].toUpperCase()); c && ga.luckysheetfile[c] && (l = ga.luckysheetfile[c].index), Fc(d, t, t, a, a, l), u && "function" == typeof u && u() }, setCellFormat: Kh, find: Zh, replace: function (e, t) { var a, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, n = Zh(e, r), l = _l(ga.currentSheetIndex), i = $a({}, r), o = i.order, s = void 0 === o ? l : o, c = ga.luckysheetfile[s]; if (null == c) return fd.info("The order parameter is invalid.", ""); var u = $.extend(!0, [], c.data); n.forEach((function (e) { e.m = t, Xh(e.row, e.column, t, { order: s, isRefresh: !1 }) })); var d = $.extend(!0, [], c.data); return c.data.length = 0, (a = c.data).push.apply(a, Da(u)), c.index == ga.currentSheetIndex && id(d, void 0, void 0, !0, !1), md(), r.success && "function" == typeof r.success && r.success(n), n }, exitEditMode: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; parseInt($("#luckysheet-input-box").css("top")) > 0 && ($("#luckysheet-formula-search-c").is(":visible") && null != Ih.searchFunctionCell ? Ih.searchFunctionEnter($("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active")) : (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_select_save = [{ row: [ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[0]], column: [ga.luckysheetCellUpdate[1], ga.luckysheetCellUpdate[1]], row_focus: ga.luckysheetCellUpdate[0], column_focus: ga.luckysheetCellUpdate[1] }]), $("#luckysheet-search-formula-parm").is(":visible") && $("#luckysheet-search-formula-parm").hide(), $("#luckysheet-search-formula-parm-select").is(":visible") && $("#luckysheet-search-formula-parm-select").hide()), e.success && "function" == typeof e.success && e.success() }, enterEditMode: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; if (!$("#luckysheet-conditionformat-dialog").is(":visible")) { if ($("#luckysheet-cell-selected").is(":visible")) { var t = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], a = t.row_focus, r = t.column_focus; vm(a, r, ga.flowdata) } e.success && "function" == typeof e.success && e.success() } }, frozenFirstRow: Qh, frozenFirstColumn: Jh, frozenRowRange: em, frozenColumnRange: tm, cancelFrozen: am, setHorizontalFrozen: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = _l(ga.currentSheetIndex), r = $a({}, t), n = r.range, l = r.order, i = void 0 === l ? a : l, o = r.success; am(i), e ? em(n, i) : Qh(i), o && "function" == typeof o && o() }, setVerticalFrozen: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = _l(ga.currentSheetIndex), r = $a({}, t), n = r.range, l = r.order, i = void 0 === l ? a : l, o = r.success; am(i), e ? tm(n, i) : Jh(i), o && "function" == typeof o && o() }, setBothFrozen: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = _l(ga.currentSheetIndex), r = $a({}, t), n = r.range, l = r.order, i = void 0 === l ? a : l, o = (r.success, !i || i == _l(ga.currentSheetIndex)), s = gn().freezen; if (am(i), e) { Bc.saveFrozen("freezenRCRange", i, n); var c = "string" == typeof n && Ih.iscelldata(n); if (o) { if (!(n && n.hasOwnProperty("column_focus") && n.hasOwnProperty("row_focus") || c)) return void (wa() ? alert(s.noSeletionError) : fd.info(s.noSeletionError, "")); c && (n = { row_focus: (n = Ih.getcellrange(n)).row[0], column_focus: n.column[0] }); var u = $("#luckysheet-cell-main").scrollTop(), d = Ts(ga.visibledatarow, u), h = n.row_focus; h > d && (d = h), -1 == d && (d = 0); var m = ga.visibledatarow[d] - 2 - u + ga.columnHeaderHeight, p = [ga.visibledatarow[d], d + 1, u, Bc.cutVolumn(ga.visibledatarow, d + 1), m]; Bc.saveFreezen(p, m, null, null), Bc.createFreezenHorizontal(p, m); var f = $("#luckysheet-cell-main").scrollLeft(), g = Ts(ga.visibledatacolumn, f), v = n.column_focus; v > g && (g = v), -1 == g && (g = 0); var y = ga.visibledatacolumn[g] - 2 - f + ga.rowHeaderWidth, b = [ga.visibledatacolumn[g], g + 1, f, Bc.cutVolumn(ga.visibledatacolumn, g + 1), y]; Bc.saveFreezen(null, null, b, y), Bc.createFreezenVertical(b, y), Bc.createAssistCanvas(), md() } } else if (Bc.saveFrozen("freezenRC", i), o) { var k = $("#luckysheet-cell-main").scrollTop(), x = Ts(ga.visibledatarow, k); -1 == x && (x = 0); var w = ga.visibledatarow[x] - 2 - k + ga.columnHeaderHeight, _ = [ga.visibledatarow[x], x + 1, k, Bc.cutVolumn(ga.visibledatarow, x + 1), w]; Bc.saveFreezen(_, w, null, null), Bc.createFreezenHorizontal(_, w); var C = $("#luckysheet-cell-main").scrollLeft(), T = Ts(ga.visibledatacolumn, C); -1 == T && (T = 0); var A = ga.visibledatacolumn[T] - 2 - C + ga.rowHeaderWidth, S = [ga.visibledatacolumn[T], T + 1, C, Bc.cutVolumn(ga.visibledatacolumn, T + 1), A]; Bc.saveFreezen(null, null, S, A), Bc.createFreezenVertical(S, A), Bc.createAssistCanvas(), md() } }, insertRowOrColumn: rm, insertRow: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; rm("row", e, t) }, insertColumn: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; rm("column", e, t) }, deleteRowOrColumn: nm, deleteRow: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; nm("row", e, t, a) }, deleteColumn: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; nm("column", e, t, a) }, hideRowOrColumn: lm, showRowOrColumn: im, hideRow: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; lm("row", e, t, a) }, showRow: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; im("row", e, t, a) }, hideColumn: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; lm("column", e, t, a) }, showColumn: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; im("column", e, t, a) }, setRowHeight: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("object" != Cm(e)) return fd.info("The rowInfo parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = $.extend(!0, {}, i.config); for (var s in null == o.rowlen && (o.rowlen = {}), e) if (parseInt(s) >= 0) { var c = e[s]; Number(c) >= 0 && (o.rowlen[parseInt(s)] = Number(c)) } i.config = o, pd.saveParam("cg", i.index, o.rowlen, { k: "rowlen" }), i.index == ga.currentSheetIndex && (ga.config = o, hd(ga.flowdata.length, ga.flowdata[0].length)), l && "function" == typeof l && l() }, setColumnWidth: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("object" != Cm(e)) return fd.info("The columnInfo parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = $.extend(!0, {}, i.config); for (var s in null == o.columnlen && (o.columnlen = {}), e) if (parseInt(s) >= 0) { var c = e[s]; Number(c) >= 0 && (o.columnlen[parseInt(s)] = Number(c)) } i.config = o, pd.saveParam("cg", i.index, o.columnlen, { k: "columnlen" }), i.index == ga.currentSheetIndex && (ga.config = o, hd(ga.flowdata.length, ga.flowdata[0].length)), l && "function" == typeof l && l() }, getRowHeight: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("array" != Cm(e) || 0 == e.length) return fd.info("The rowInfo parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = $.extend(!0, {}, i.config), s = o.rowlen || {}, c = {}; return e.forEach((function (e) { if (parseInt(e) >= 0) { var t = s[parseInt(e)] || ga.defaultrowlen; c[parseInt(e)] = t } })), setTimeout((function () { l && "function" == typeof l && l() }), 1), c }, getColumnWidth: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("array" != Cm(e) || 0 == e.length) return fd.info("The columnInfo parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = $.extend(!0, {}, i.config), s = o.columnlen || {}, c = {}; return e.forEach((function (e) { if (parseInt(e) >= 0) { var t = s[parseInt(e)] || ga.defaultcollen; c[parseInt(e)] = t } })), setTimeout((function () { l && "function" == typeof l && l() }), 1), c }, getDefaultRowHeight: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success; return setTimeout((function () { n && "function" == typeof n && n() }), 1), ga.luckysheetfile[r].defaultRowHeight }, getDefaultColWidth: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success; return setTimeout((function () { n && "function" == typeof n && n() }), 1), ga.luckysheetfile[r].defaultColWidth }, getRange: om, getRangeWithFlatten: sm, getRangeValuesWithFlatte: function (e) { e = e || sm(); var t = []; return e.forEach((function (e) { t.push(ga.flowdata[e.r][e.c]) })), t }, getRangeAxis: function () { var e = [], t = ga.luckysheet_select_save, a = ga.currentSheetIndex; return t.forEach((function (t) { var r = Cl(a, { column: t.column, row: t.row }); e.push(r) })), e }, getRangeValue: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = _l(ga.currentSheetIndex), a = $a({}, e), r = a.range, n = a.order, l = void 0 === n ? t : n, i = ga.luckysheetfile[l]; if (!r || "object" === Sa(r)) return Wo(r, i.index); if ("string" == typeof r) { if (Ih.iscelldata(r)) return Wo(Ih.getcellrange(r), i.index); fd.info("The range is invalid, please check range parameter.", "") } }, getRangeHtml: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.range, r = void 0 === a ? ga.luckysheet_select_save : a, n = t.order, l = void 0 === n ? _l(ga.currentSheetIndex) : n; if (t.success, "string" == Cm(r)) { if (!Ih.iscelldata(r)) return fd.info("The range parameter is invalid.", ""); var i = Ih.getcellrange(r); r = [{ row: i.row, column: i.column }] } else if ("object" == Cm(r)) { if (null == r.row || null == r.column) return fd.info("The range parameter is invalid.", ""); r = [{ row: r.row, column: r.column }] } if ("array" != Cm(r)) return fd.info("The range parameter is invalid.", ""); var o = ga.luckysheetfile[l]; if (null == o) return fd.info("The order parameter is invalid.", ""); var s = $.extend(!0, {}, o.config); if (null != s.merge) { for (var c = !1, u = 0; u < r.length; u++) { var d = r[u].row[0], h = r[u].row[1], m = r[u].column[0], p = r[u].column[1]; if (c = _a(s, d, h, m, p)) break } if (c) return fd.info("Cannot perform this operation on partially merged cells", "") } var f = $.extend(!0, [], o.luckysheet_conditionformat_save); if (r.length > 1 && f.length > 0) { for (var g = !1, v = gd.getComputeMap(o.index), y = 0; y < r.length; y++) { for (var b = r[y].row[0], k = r[y].row[1], x = r[y].column[0], w = r[y].column[1], _ = b; _ <= k; _++) { for (var C = x; C <= w; C++)if (null != gd.checksCF(_, C, v)) { g = !0; break } if (g) break } if (g) break } if (g) return fd.info("Cannot perform this operation on multiple selection areas, please select a single area", "") } if (r.length > 1) { for (var T = !0, A = r[0].row[0], S = r[0].row[1], I = !0, R = r[0].column[0], q = r[0].column[1], D = 1; D < r.length; D++)r[D].row[0] == A && r[D].row[1] == S || (T = !1), r[D].column[0] == R && r[D].column[1] == q || (I = !1); if (!T && !I || Dh(r)) return fd.info("Cannot perform this operation on multiple selection areas, please select a single area", "") } for (var F, E = [], M = [], N = 0; N < r.length; N++)for (var P = r[N].row[0], z = r[N].row[1], L = r[N].column[0], O = r[N].column[1], B = P; B <= z; B++)if (null == s.rowhidden || null == s.rowhidden[B]) { E.includes(B) || E.push(B); for (var V = L; V <= O; V++)null != s.colhidden && null != s.colhidden[V] || M.includes(V) || M.push(V) } s.borderInfo && s.borderInfo.length > 0 && (F = Lc(o.index)); var H = o.data; null != H && 0 != H.length || (H = Sh.buildGridData(o)); var U = "", j = ""; E = E.sort(), M = M.sort(); for (var G = 0; G < E.length; G++) { var W = E[G]; if (null == s.rowhidden || null == s.rowhidden[W]) { U += ""; for (var Y = 0; Y < M.length; Y++) { var X = M[Y]; if (null == s.colhidden || null == s.colhidden[X]) { var K = ''; if (null != H[W] && null != H[W][X]) { var Z = "", Q = ""; W == E[0] && (null == s.columnlen || null == s.columnlen[X.toString()] ? j += '' : j += ''), X == M[0] && (null == s.rowlen || null == s.rowlen[W.toString()] ? Z += "height:19px;" : Z += "height:" + s.rowlen[W.toString()] + "px;"); var J = /^(w|W)((0?)|(0\.0+))$/, ee = void 0; if (ee = null != H[W][X].ct && null != H[W][X].ct.fa && H[W][X].ct.fa.match(J) ? Ko(W, X, H) : Ko(W, X, H, "m"), Z += xm.getStyleByCell(H, W, X), "object" == Cm(H[W][X]) && "mc" in H[W][X]) { if (!("rs" in H[W][X].mc)) continue; if (Q = 'rowspan="' + H[W][X].mc.rs + '" colspan="' + H[W][X].mc.cs + '"', F && F[W + "_" + X]) { for (var te = { color: {}, style: {} }, ae = { color: {}, style: {} }, re = { color: {}, style: {} }, ne = { color: {}, style: {} }, le = W; le < W + H[W][X].mc.rs; le++)for (var ie = X; ie < X + H[W][X].mc.cs; ie++) { if (le == W && F[le + "_" + ie] && F[le + "_" + ie].t) { var oe = F[le + "_" + ie].t.style, se = F[le + "_" + ie].t.color; null == re.style[oe] ? re.style[oe] = 1 : re.style[oe] = re.style[oe] + 1, null == re.color[se] ? re.color[se] = 1 : re.color[se] = re.color[se] + 1 } if (le == W + H[W][X].mc.rs - 1 && F[le + "_" + ie] && F[le + "_" + ie].b) { var ce = F[le + "_" + ie].b.style, ue = F[le + "_" + ie].b.color; null == ne.style[ce] ? ne.style[ce] = 1 : ne.style[ce] = ne.style[ce] + 1, null == ne.color[ue] ? ne.color[ue] = 1 : ne.color[ue] = ne.color[ue] + 1 } if (ie == X && F[le + "_" + ie] && F[le + "_" + ie].l) { var de = F[W + "_" + X].l.style, he = F[le + "_" + ie].l.color; null == te.style[de] ? te.style[de] = 1 : te.style[de] = te.style[de] + 1, null == te.color[he] ? te.color[he] = 1 : te.color[he] = te.color[he] + 1 } if (ie == X + H[W][X].mc.cs - 1 && F[le + "_" + ie] && F[le + "_" + ie].r) { var me = F[le + "_" + ie].r.style, pe = F[le + "_" + ie].r.color; null == ae.style[me] ? ae.style[me] = 1 : ae.style[me] = ae.style[me] + 1, null == ae.color[pe] ? ae.color[pe] = 1 : ae.color[pe] = ae.color[pe] + 1 } } var fe = H[W][X].mc.rs, ge = H[W][X].mc.cs; if (JSON.stringify(te).length > 23) { var ve = null, ye = null; for (var be in te.color) te.color[be] >= fe / 2 && (ve = be); for (var ke in te.style) te.style[ke] >= fe / 2 && (ye = ke); null != ve && null != ye && (Z += "border-left:" + vd.getHtmlBorderStyle(ye, ve)) } if (JSON.stringify(ae).length > 23) { var xe = null, we = null; for (var _e in ae.color) ae.color[_e] >= fe / 2 && (xe = _e); for (var Ce in ae.style) ae.style[Ce] >= fe / 2 && (we = Ce); null != xe && null != we && (Z += "border-right:" + vd.getHtmlBorderStyle(we, xe)) } if (JSON.stringify(re).length > 23) { var Te = null, Ae = null; for (var Se in re.color) re.color[Se] >= ge / 2 && (Te = Se); for (var Ie in re.style) re.style[Ie] >= ge / 2 && (Ae = Ie); null != Te && null != Ae && (Z += "border-top:" + vd.getHtmlBorderStyle(Ae, Te)) } if (JSON.stringify(ne).length > 23) { var Re = null, $e = null; for (var qe in ne.color) ne.color[qe] >= ge / 2 && (Re = qe); for (var De in ne.style) ne.style[De] >= ge / 2 && ($e = De); null != Re && null != $e && (Z += "border-bottom:" + vd.getHtmlBorderStyle($e, Re)) } } } else if (F && F[W + "_" + X]) { if (F[W + "_" + X].l) { var Fe = F[W + "_" + X].l.style, Ee = F[W + "_" + X].l.color; Z += "border-left:" + vd.getHtmlBorderStyle(Fe, Ee) } if (F[W + "_" + X].r) { var Me = F[W + "_" + X].r.style, Ne = F[W + "_" + X].r.color; Z += "border-right:" + vd.getHtmlBorderStyle(Me, Ne) } if (F[W + "_" + X].b) { var Pe = F[W + "_" + X].b.style, ze = F[W + "_" + X].b.color; Z += "border-bottom:" + vd.getHtmlBorderStyle(Pe, ze) } if (F[W + "_" + X].t) { var Le = F[W + "_" + X].t.style, Oe = F[W + "_" + X].t.color; Z += "border-top:" + vd.getHtmlBorderStyle(Le, Oe) } } K = _m(K, { style: Z, span: Q }), null == ee && (ee = Ko(W, X, H)), null == ee && (ee = " "), K += ee } else { var Be = ""; if (F && F[W + "_" + X]) { if (F[W + "_" + X].l) { var Ve = F[W + "_" + X].l.style, He = F[W + "_" + X].l.color; Be += "border-left:" + vd.getHtmlBorderStyle(Ve, He) } if (F[W + "_" + X].r) { var Ue = F[W + "_" + X].r.style, je = F[W + "_" + X].r.color; Be += "border-right:" + vd.getHtmlBorderStyle(Ue, je) } if (F[W + "_" + X].b) { var Ge = F[W + "_" + X].b.style, We = F[W + "_" + X].b.color; Be += "border-bottom:" + vd.getHtmlBorderStyle(Ge, We) } if (F[W + "_" + X].t) { var Ye = F[W + "_" + X].t.style, Xe = F[W + "_" + X].t.color; Be += "border-top:" + vd.getHtmlBorderStyle(Ye, Xe) } } K += "", W == E[0] && (null == s.columnlen || null == s.columnlen[X.toString()] ? j += '' : j += ''), X == M[0] && (null == s.rowlen || null == s.rowlen[W.toString()] ? Be += "height:19px;" : Be += "height:" + s.rowlen[W.toString()] + "px;"), K = _m(K, { style: Be, span: "" }), K += " " } U += K += "" } } U += "" } } return U = '' + j + U + "
      " }, getRangeArray: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["oneDimensional", "twoDimensional"]; if (!a.includes(e)) return fd.info("The dimensional parameter is invalid.", ""); var r = $a({}, t), n = r.range, l = void 0 === n ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : n, i = r.order, o = void 0 === i ? _l(ga.currentSheetIndex) : i, s = ga.luckysheetfile[o]; if (null == s) return fd.info("The order parameter is invalid.", ""); if ("string" == Cm(l)) { if (!Ih.iscelldata(l)) return fd.info("The range parameter is invalid.", ""); l = Ih.getcellrange(l) } if ("object" != Cm(l) || null == l.row || null == l.column) return fd.info("The range parameter is invalid.", ""); var c = l.row[0], u = l.row[1], d = l.column[0], h = l.column[1], m = $.extend(!0, {}, s.config); if (null != m.merge) { var p = _a(m, c, u, d, h); if (p) return fd.info("Cannot perform this operation on partially merged cells", "") } var f = s.data; null != f && 0 != f.length || (f = Sh.buildGridData(s)); var g = []; if ("oneDimensional" == e) for (var v = c; v <= u; v++)for (var y = d; y <= h; y++) { var b = f[v][y]; null == b || null == b.v ? g.push(null) : g.push(b.v) } else if ("twoDimensional" == e) for (var k = c; k <= u; k++) { for (var x = [], w = d; w <= h; w++) { var _ = f[k][w]; null == _ || null == _.v ? x.push(null) : x.push(_.v) } g.push(x) } return g }, getRangeJson: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ga.luckysheet_select_save[0], r = _l(ga.currentSheetIndex), n = $a({}, t), l = n.range, i = void 0 === l ? a : l, o = n.order, s = void 0 === o ? r : o, c = ga.luckysheetfile[s], u = c.config; if (i && "string" == typeof i && Ih.iscelldata(i) && (i = Ih.getcellrange(i)), !i || i.length > 1) wa() ? alert(locale_drag.noMulti) : fd.info(locale_drag.noMulti, ""); else { if (null != u.merge) { var d = i.row[0], h = i.row[1], m = i.column[0], p = i.column[1]; if (_a(u, d, h, m, p)) return void (wa() ? alert(gn().drag.noPartMerge) : fd.info(gn().drag.noPartMerge, "")) } var f = Wo(i, c.index), g = []; if (0 !== f.length) { if (e) if (1 === f.length) { for (var v = {}, y = 0; y < f[0].length; y++)v[Ko(0, y, f)] = ""; g.push(v) } else for (var b = 1; b < f.length; b++) { for (var k = {}, x = 0; x < f[0].length; x++)null == Ko(0, x, f) ? k[""] = Ko(b, x, f) : k[Ko(0, x, f)] = Ko(b, x, f); g.push(k) } else for (var w = i.column[0], _ = 0; _ < f.length; _++) { for (var C = {}, T = 0; T < f[0].length; T++)C[Im(T + w)] = Ko(_, T, f); g.push(C) } return g } } }, getRangeDiagonal: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["normal", "anti", "offset"]; if (a.indexOf(e) < 0) return fd.info("The type parameter must be included in ['normal', 'anti', 'offset']", ""); var r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save, l = $a({}, t), i = l.column, o = void 0 === i ? 1 : i, s = l.range, c = void 0 === s ? n : s, u = l.order, d = void 0 === u ? r : u, h = ga.luckysheetfile[d], m = h.config; if (c && "string" == typeof c && Ih.iscelldata(c) && (c = Ih.getcellrange(c)), !c || c.length > 1) wa() ? alert(gn().drag.noMulti) : fd.info(gn().drag.noMulti, ""); else { if (null != m.merge) { var p = c[0].row[0], f = c[0].row[1], g = c[0].column[0], v = c[0].column[1]; if (_a(m, p, f, g, v)) return void (wa() ? alert(gn().drag.noPartMerge) : fd.info(gn().drag.noPartMerge, "")) } var y = Wo(c, d), b = []; if (0 !== y.length) { var k = y[0].length; switch (e) { case "normal": for (var x = 0; x < y.length && !(x >= k); x++)b.push(y[x][x]); break; case "anti": for (var w = 0; w < y.length && !(w >= k); w++)b.push(y[w][k - w - 1]); break; case "offset": if ("NaN" == o.toString()) return void (wa() ? alert(gn().drag.inputCorrect) : fd.info(gn().drag.inputCorrect, "")); if (o < 0) return void (wa() ? alert(gn().drag.offsetColumnLessZero) : fd.info(gn().drag.offsetColumnLessZero, "")); for (var _ = 0; _ < y.length && !(_ + o >= k); _++)b.push(y[_][_ + o]) }vd.copybyformat(new Event, JSON.stringify(b)) } } }, getRangeBoolean: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = _l(ga.currentSheetIndex), a = ga.luckysheet_select_save, r = $a({}, e), n = r.range, l = void 0 === n ? a : n, i = r.order, o = void 0 === i ? t : i, s = ga.luckysheetfile[o], c = s.config; if (l && "string" == typeof l && Ih.iscelldata(l) && (l = Ih.getcellrange(l)), !l || l.length > 1) wa() ? alert(gn().drag.noMulti) : fd.info(gn().drag.noMulti, ""); else { if (null != c.merge) { var u = l[0].row[0], d = l[0].row[1], h = l[0].column[0], m = l[0].column[1]; if (_a(c, u, d, h, m)) return void (wa() ? alert(gn().drag.noPartMerge) : fd.info(gn().drag.noPartMerge, "")) } var p = Wo(l, o), f = []; if (0 !== p.length) { for (var g = 0; g < p.length; g++) { for (var v = [], y = 0; y < p[0].length; y++) { var b = !1, k = void 0; b = null != (k = "object" == Cm(p[g][y]) ? p[g][y].v : p[g][y]) && "" != k && (null == (k = parseInt(k)) || k > 0), v.push(b) } f.push(v) } vd.copybyformat(event, JSON.stringify(f)) } } }, setRangeShow: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("string" == Cm(e)) { if (!Ih.iscelldata(e)) return fd.info("The range parameter is invalid.", ""); var a = Ih.getcellrange(e); e = [{ row: a.row, column: a.column }] } else if ("object" == Cm(e)) { if (null == e.row || null == e.column) return fd.info("The range parameter is invalid.", ""); e = [{ row: e.row, column: e.column }] } if ("array" == Cm(e)) for (var r = 0; r < e.length; r++)if ("string" === Cm(e[r])) { if (!Ih.iscelldata(e[r])) return fd.info("The range parameter is invalid.", ""); var n = Ih.getcellrange(e[r]); e[r] = { row: n.row, column: n.column } } else if ("object" == Cm(e)) { if (null == e.row || null == e.column) return fd.info("The range parameter is invalid.", ""); e = { row: e.row, column: e.column } } if ("array" != Cm(e)) return fd.info("The range parameter is invalid.", ""); var l = $a({}, t), i = l.show, o = void 0 === i || i, s = l.order, c = void 0 === s ? _l(ga.currentSheetIndex) : s, u = l.success, d = ga.luckysheetfile[c]; if (null == d) return fd.info("The order parameter is invalid.", ""); for (var h = 0; h < e.length; h++) { var m = xm.mergeMoveMain(e[h].column, e[h].row, e[h]); m && (e[h] = { row: m[1], column: m[0] }) } d.luckysheet_select_save = e, d.index == ga.currentSheetIndex && (ga.luckysheet_select_save = e, Rh(), o || ($("#luckysheet-cell-selected-boxs").hide(), $("#luckysheet-cell-selected-focus").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(), $("#luckysheet-rows-h-selected").empty(), $("#luckysheet-cols-h-selected").empty())), u && "function" == typeof u && u() }, setRangeValue: function (e) { var t, a = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], l = $a({}, a), i = l.range, o = void 0 === i ? n : i, s = l.isRefresh, c = void 0 === s || s, u = l.order, d = void 0 === u ? r : u, h = l.success; if (null == e) return fd.info("The data which will be set to range cannot be null.", ""); if (o instanceof Array) return fd.info("setRangeValue only supports a single selection.", ""); "string" == typeof o && Ih.iscelldata(o) && (o = Ih.getcellrange(o)); var m = o.row[1] - o.row[0] + 1, p = o.column[1] - o.column[0] + 1; if (e.length !== m || e[0].length !== p) return fd.info("The data to be set does not match the selection.", ""); var f = ga.luckysheetfile[d]; if (null == f) return fd.info("The order parameter is invalid.", ""); for (var g = $.extend(!0, [], f.data), v = 0; v < m; v++)for (var y = 0; y < p; y++) { var b = o.row[0] + v, k = o.column[0] + y; Xh(b, k, e[v][y], { order: d, isRefresh: !1 }) } var x = $.extend(!0, [], f.data); f.data.length = 0, (t = f.data).push.apply(t, Da(g)), f.index == ga.currentSheetIndex && id(x, [{ row: o.row, column: o.column }], void 0, !0, !1), c && md(), h && "function" == typeof h && h() }, setSingleRangeFormat: cm, setRangeFormat: function (e, t) { var a, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, n = _l(ga.currentSheetIndex), l = ga.luckysheet_select_save, i = $a({}, r), o = i.range, s = void 0 === o ? l : o, c = i.order, u = void 0 === c ? n : c, d = i.success; if ("string" == Cm(s)) { if (!Ih.iscelldata(s)) return fd.info("The range parameter is invalid.", ""); var h = Ih.getcellrange(s); s = [{ row: h.row, column: h.column }] } else if ("object" == Cm(s)) { if (null == s.row || null == s.column) return fd.info("The range parameter is invalid.", ""); s = [{ row: s.row, column: s.column }] } if ("array" != Cm(s)) return fd.info("The range parameter is invalid.", ""); var m = ga.luckysheetfile[u]; if (null == m) return fd.info("The order parameter is invalid.", ""); for (var p, f = $.extend(!0, [], m.data), g = [], v = 0; v < s.length; v++)g.push(cm(e, t, { range: s[v], order: u })); if (g.some((function (e) { return "error" === e }))) return m.data.length = 0, (p = m.data).push.apply(p, Da(f)), !1; var y = $.extend(!0, [], m.data); m.data.length = 0, (a = m.data).push.apply(a, Da(f)), m.index == ga.currentSheetIndex && id(y, void 0, void 0, !0, !1), md(), d && "function" == typeof d && d() }, setRangeFilter: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["open", "close"]; if (!a.includes(e)) return fd.info("The type parameter is invalid.", ""); var r = $a({}, t), n = r.range, l = void 0 === n ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : n, i = r.order, o = void 0 === i ? _l(ga.currentSheetIndex) : i, s = r.success, c = ga.luckysheetfile[o]; if (null == c) return fd.info("The order parameter is invalid.", ""); if ("string" == Cm(l)) { if (!Ih.iscelldata(l)) return fd.info("The range parameter is invalid.", ""); l = Ih.getcellrange(l) } if ("object" != Cm(l) || null == l.row || null == l.column) return fd.info("The range parameter is invalid.", ""); if (setTimeout((function () { s && "function" == typeof s && s() }), 1), "open" == e) return c.filter_select = l, c.index == ga.currentSheetIndex && Sc(l, c.filter), { row: l.row, column: l.column }; if ("close" == e) { var u = $.extend(!0, {}, c.filter_select); return c.filter_select = null, $("#luckysheet-filter-selected-sheet" + c.index).remove(), $("#luckysheet-filter-options-sheet" + c.index).remove(), { row: u.row, column: u.column } } }, setRangeMerge: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["all", "horizontal", "vertical"]; if (a.indexOf(e) < 0) return fd.info("The type parameter must be included in ['all', 'horizontal', 'vertical']", ""); var r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save, l = $a({}, t), i = l.range, o = void 0 === i ? n : i, s = l.order, c = void 0 === s ? r : s, u = l.success, d = ga.luckysheetfile[c], h = $.extend(!0, {}, d.config), m = $.extend(!0, [], d.data); if (0 == m.length && (m = $.extend(!0, [], Sh.buildGridData(d))), "string" == Cm(o)) { if (!Ih.iscelldata(o)) return fd.info("Incorrect selection format", ""); var p = Ih.getcellrange(o); o = [{ row: p.row, column: p.column }] } else if ("object" == Cm(o)) { if (!o.hasOwnProperty("row") || !o.hasOwnProperty("column")) return fd.info("Incorrect selection format", ""); o = [{ row: o.row, column: o.column }] } if (Dh(o)) return fd.info("Cannot merge overlapping range", ""); if (null != h.merge) { for (var f = !1, g = 0; g < o.length; g++) { var v = o[g].row[0], y = o[g].row[1], b = o[g].column[0], k = o[g].column[1]; if (f = _a(h, v, y, b, k)) break } if (f) return fd.info("Cannot perform this operation on partially merged cells", "") } for (var x = !1, w = 0; w < o.length; w++)for (var _ = o[w].row[0], C = o[w].row[1], T = o[w].column[0], A = o[w].column[1], S = _; S <= C; S++) { for (var I = T; I <= A; I++) { var R = m[S][I]; if ("object" == Cm(R) && "mc" in R) { x = !0; break } } if (x) break } if (x) um({ range: o, order: c }); else { for (var q = 0; q < o.length; q++) { var D = o[q].row[0], F = o[q].row[1], E = o[q].column[0], M = o[q].column[1]; if (D != F || E != M) if ("all" == e) { for (var N = {}, P = !1, z = D; z <= F; z++)for (var L = E; L <= M; L++) { var O = m[z][L]; null == O || ya(O.v) && null == O.f || P || (N = $.extend(!0, {}, O), P = !0), m[z][L] = { mc: { r: D, c: E } } } m[D][E] = N, m[D][E].mc = { r: D, c: E, rs: F - D + 1, cs: M - E + 1 }, h.merge[D + "_" + E] = { r: D, c: E, rs: F - D + 1, cs: M - E + 1 } } else if ("vertical" == e) for (var B = E; B <= M; B++) { for (var V = {}, H = !1, U = D; U <= F; U++) { var j = m[U][B]; null == j || ya(j.v) && null == j.f || H || (V = $.extend(!0, {}, j), H = !0), m[U][B] = { mc: { r: D, c: B } } } m[D][B] = V, m[D][B].mc = { r: D, c: B, rs: F - D + 1, cs: 1 }, h.merge[D + "_" + B] = { r: D, c: B, rs: F - D + 1, cs: 1 } } else if ("horizontal" == e) for (var G = D; G <= F; G++) { for (var W = {}, Y = !1, X = E; X <= M; X++) { var K = m[G][X]; null == K || ya(K.v) && null == K.f || Y || (W = $.extend(!0, {}, K), Y = !0), m[G][X] = { mc: { r: G, c: E } } } m[G][E] = W, m[G][E].mc = { r: G, c: E, rs: 1, cs: M - E + 1 }, h.merge[G + "_" + E] = { r: G, c: E, rs: 1, cs: M - E + 1 } } } c == r ? (ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "mergeChange", sheetIndex: d.index, data: $.extend(!0, [], d.data), curData: m, range: o, config: $.extend(!0, {}, d.config), curConfig: h })), ga.clearjfundo = !1, id(m, o, { cfg: h }), ga.clearjfundo = !0) : (d.data = m, d.config = h) } u && "function" == typeof u && u() }, cancelRangeMerge: um, setRangeSort: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["asc", "desc"]; if (a.indexOf(e) < 0) return fd.info("The type parameter must be included in ['asc', 'desc'", ""); var r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save[0], l = $a({}, t), i = l.range, o = void 0 === i ? n : i, s = l.order, c = void 0 === s ? r : s, u = l.success, d = ga.luckysheetfile[c], h = $.extend(!0, {}, d.config), m = $.extend(!0, [], d.data); if (0 == m.length && (m = $.extend(!0, [], Sh.buildGridData(d))), o instanceof Array && o.length > 1) fd.info(gn().sort.noRangeError, ""); else { o && "string" == typeof o && Ih.iscelldata(o) && (o = Ih.getcellrange(o)); for (var p = o.row[0], f = o.row[1], g = o.column[0], v = o.column[1], y = !1, b = [], k = p; k <= f; k++) { for (var x = [], w = g; w <= v; w++) { if (null != m[k][w] && null != m[k][w].mc) { y = !0; break } x.push(m[k][w]) } b.push(x) } if (y) fd.info(gn().sort.mergeError, ""); else { b = ku([].concat(b), 0, "asc" === e); for (var _ = p; _ <= f; _++)for (var C = g; C <= v; C++)m[_][C] = b[_ - p][C - g]; var T = {}; null != h.rowlen && (T = { cfg: h = qs(m, p, f, h), RowlChange: !0 }), d.index == ga.currentSheetIndex ? id(m, [{ row: [p, f], column: [g, v] }], T) : (d.data = m, d.config = h), u && "function" == typeof u && u() } } }, setRangeSortMulti: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; if (!(t && t instanceof Array)) return fd.info("The sort parameter is invalid.", ""); var r = _l(ga.currentSheetIndex), n = ga.luckysheet_select_save[0], l = $a({}, a), i = l.range, o = void 0 === i ? n : i, s = l.order, c = void 0 === s ? r : s, u = l.success, d = ga.luckysheetfile[c], h = $.extend(!0, {}, d.config), m = $.extend(!0, [], d.data); if (0 == m.length && (m = $.extend(!0, [], Sh.buildGridData(d))), o instanceof Array && o.length > 1) fd.info(gn().sort.noRangeError, ""); else { o && "string" == typeof o && Ih.iscelldata(o) && (o = Ih.getcellrange(o)); for (var p, f = o.row[0], g = o.row[1], v = o.column[0], y = o.column[1], b = !1, k = [], x = p = e ? f + 1 : f; x <= g; x++) { for (var w = [], _ = v; _ <= y; _++) { if (null != m[x][_] && null != m[x][_].mc) { b = !0; break } w.push(m[x][_]) } k.push(w) } if (b) fd.info(gn().sort.mergeError, ""); else { t.forEach((function (e) { var t = e.i; t -= v, k = ku([].concat(k), t, "asc" === e.sort) })); for (var C = p; C <= g; C++)for (var T = v; T <= y; T++)m[C][T] = k[C - p][T - v]; var A = {}; null != h.rowlen && (A = { cfg: h = qs(m, p, g, h), RowlChange: !0 }), d.index === ga.currentSheetIndex ? id(m, [{ row: [p, g], column: [v, y] }], A) : (d.data = m, d.config = h), u && "function" == typeof u && u() } } }, setRangeConditionalFormatDefault: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = ["greaterThan", "lessThan", "betweenness", "equal", "textContains", "occurrenceDate", "duplicateValue", "top10", "top10%", "last10", "last10%", "AboveAverage", "SubAverage"]; if (!e || !r.includes(e)) return fd.info("The conditionName parameter is invalid.", ""); if ("array" != Cm(t) || 0 == t.length) return fd.info("The conditionValue parameter is invalid.", ""); var n = $a({}, a), l = n.format, i = void 0 === l ? { textColor: "#000000", cellColor: "#ff0000" } : l, o = n.cellrange, s = void 0 === o ? ga.luckysheet_select_save : o, c = n.order, u = void 0 === c ? _l(ga.currentSheetIndex) : c, d = n.success, h = ga.luckysheetfile[u], m = h.data; if (null != m && 0 != m.length || (m = Sh.buildGridData(h)), null == h) return fd.info("Incorrect worksheet index", ""); var p = gn().conditionformat, f = [], g = []; if ("betweenness" == e) { var v = t[0], y = t[1], b = gd.getRangeByTxt(v); if (b.length > 1) return void gd.infoDialog(p.onlySingleCell, ""); if (1 == b.length) { var k = b[0].row[0], x = b[0].row[1], w = b[0].column[0], _ = b[0].column[1]; if (k != x || w != _) return void gd.infoDialog(p.onlySingleCell, ""); v = Ko(k, w, m), f.push({ row: b[0].row, column: b[0].column }), g.push(v) } else if (0 == b.length) { if (isNaN(v) || "" == v) return void gd.infoDialog(p.conditionValueCanOnly, ""); g.push(v) } var C = gd.getRangeByTxt(y); if (C.length > 1) return void gd.infoDialog(p.onlySingleCell, ""); if (1 == C.length) { var T = C[0].row[0], A = C[0].row[1], S = C[0].column[0], I = C[0].column[1]; if (T != A || S != I) return void gd.infoDialog(p.onlySingleCell, ""); y = Ko(T, S, m), f.push({ row: C[0].row, column: C[0].column }), g.push(y) } else if (0 == C.length) { if (isNaN(y) || "" == y) return void gd.infoDialog(p.conditionValueCanOnly, ""); g.push(y) } } else if ("greaterThan" == e || "lessThan" == e || "equal" == e) { var R = t[0], q = gd.getRangeByTxt(R); if (q.length > 1) return void gd.infoDialog(p.onlySingleCell, ""); if (1 == q.length) { var D = q[0].row[0], F = q[0].row[1], E = q[0].column[0], M = q[0].column[1]; if (D != F || E != M) return void gd.infoDialog(p.onlySingleCell, ""); R = Ko(D, E, m), f.push({ row: q[0].row, column: q[0].column }), g.push(R) } else if (0 == q.length) { if (isNaN(R) || "" == R) return void gd.infoDialog(p.conditionValueCanOnly, ""); g.push(R) } } else if ("textContains" == e) { var N = t[0], P = gd.getRangeByTxt(N); if (P.length > 1) return void gd.infoDialog(p.onlySingleCell, ""); if (1 == P.length) { var z = P[0].row[0], L = P[0].row[1], O = P[0].column[0], B = P[0].column[1]; if (z != L || O != B) return void gd.infoDialog(p.onlySingleCell, ""); N = Ko(z, O, m), f.push({ row: P[0].row, column: P[0].column }), g.push(N) } else if (0 == P.length) { if ("" == N) return void gd.infoDialog(p.conditionValueCanOnly, ""); g.push(N) } } else if ("occurrenceDate" == e) { var V, H = t[0], U = t[1]; if (!ds(H) || !ds(U)) return fd.info("The conditionValue parameter is invalid.", ""); V = hs(H, U) > 0 ? us(U).format("YYYY/MM/DD") + "-" + us(H).format("YYYY/MM/DD") : us(H).format("YYYY/MM/DD") + "-" + us(U).format("YYYY/MM/DD"), g.push(V) } else if ("duplicateValue" == e) { var j = t[0]; if ("0" != j || "1" != j) return fd.info("The conditionValue parameter is invalid.", ""); g.push(j) } else if ("top10" == e || "top10%" == e || "last10" == e || "last10%" == e) { var G = t[0]; if (parseInt(G) != G || parseInt(G) < 1 || parseInt(G) > 1e3) return void gd.infoDialog(p.pleaseEnterInteger, ""); g.push(parseInt(G)) } else "AboveAverage" != e && "SubAverage" != e || g.push(e); if (!i.hasOwnProperty("textColor") || !i.hasOwnProperty("cellColor")) return fd.info("The format parameter is invalid.", ""); if ("string" == Cm(s) ? s = gd.getRangeByTxt(s) : "object" == Cm(s) && (s = [s]), "array" != Cm(s)) return fd.info("The cellrange parameter is invalid.", ""); var W = { type: "default", cellrange: s, format: i, conditionName: e, conditionRange: f, conditionValue: g }, Y = $.extend(!0, [], ga.luckysheetfile), X = gd.getHistoryRules(Y), K = h.luckysheet_conditionformat_save || []; K.push(W), h.luckysheet_conditionformat_save = K; var Z = $.extend(!0, [], ga.luckysheetfile), Q = gd.getCurrentRules(Z); gd.ref(X, Q), pd.allowUpdate && pd.saveParam("all", h.index, K, { k: "luckysheet_conditionformat_save" }), d && "function" == typeof d && d() }, setRangeConditionalFormat: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["dataBar", "colorGradation", "icons"]; if (!e || !a.includes(e)) return fd.info("The type parameter is invalid.", ""); var r = $a({}, t), n = r.format, l = r.cellrange, i = void 0 === l ? ga.luckysheet_select_save : l, o = r.order, s = void 0 === o ? _l(ga.currentSheetIndex) : o, c = r.success, u = ga.luckysheetfile[s]; if (null == u) return fd.info("Incorrect worksheet index", ""); if ("dataBar" == e) { if (null == n && (n = ["#638ec6", "#ffffff"]), "array" != Cm(n) || n.length < 1 || n.length > 2) return fd.info("The format parameter is invalid.", "") } else if ("colorGradation" == e) { if (null == n && (n = ["rgb(99, 190, 123)", "rgb(255, 235, 132)", "rgb(248, 105, 107)"]), "array" != Cm(n) || n.length < 2 || n.length > 3) return fd.info("The format parameter is invalid.", "") } else if ("icons" == e) { null == n && (n = "threeWayArrowMultiColor"); var d = ["threeWayArrowMultiColor", "threeTriangles", "fourWayArrowMultiColor", "fiveWayArrowMultiColor", "threeWayArrowGrayColor", "fourWayArrowGrayColor", "fiveWayArrowGrayColor", "threeColorTrafficLightRimless", "threeSigns", "greenRedBlackGradient", "threeColorTrafficLightBordered", "fourColorTrafficLight", "threeSymbolsCircled", "tricolorFlag", "threeSymbolsnoCircle", "threeStars", "fiveQuadrantDiagram", "fiveBoxes", "grade4", "grade5"]; if ("string" != Cm(n) || !d.includes(n)) return fd.info("The format parameter is invalid.", ""); switch (n) { case "threeWayArrowMultiColor": n = { len: 3, leftMin: 0, top: 0 }; break; case "threeTriangles": n = { len: 3, leftMin: 0, top: 1 }; break; case "fourWayArrowMultiColor": n = { len: 4, leftMin: 0, top: 2 }; break; case "fiveWayArrowMultiColor": n = { len: 5, leftMin: 0, top: 3 }; break; case "threeWayArrowGrayColor": n = { len: 3, leftMin: 5, top: 0 }; break; case "fourWayArrowGrayColor": n = { len: 4, leftMin: 5, top: 1 }; break; case "fiveWayArrowGrayColor": n = { len: 5, leftMin: 5, top: 2 }; break; case "threeColorTrafficLightRimless": n = { len: 3, leftMin: 0, top: 4 }; break; case "threeSigns": n = { len: 3, leftMin: 0, top: 5 }; break; case "greenRedBlackGradient": n = { len: 4, leftMin: 0, top: 6 }; break; case "threeColorTrafficLightBordered": n = { len: 3, leftMin: 5, top: 4 }; break; case "fourColorTrafficLight": n = { len: 4, leftMin: 5, top: 5 }; break; case "threeSymbolsCircled": n = { len: 3, leftMin: 0, top: 7 }; break; case "tricolorFlag": n = { len: 3, leftMin: 0, top: 8 }; break; case "threeSymbolsnoCircle": n = { len: 3, leftMin: 5, top: 7 }; break; case "threeStars": n = { len: 3, leftMin: 0, top: 9 }; break; case "fiveQuadrantDiagram": n = { len: 5, leftMin: 0, top: 10 }; break; case "fiveBoxes": n = { len: 5, leftMin: 0, top: 11 }; break; case "grade4": n = { len: 4, leftMin: 5, top: 9 }; break; case "grade5": n = { len: 5, leftMin: 5, top: 10 } } } if ("string" == Cm(i) ? i = gd.getRangeByTxt(i) : "object" == Cm(i) && (i = [i]), "array" != Cm(i)) return fd.info("The cellrange parameter is invalid.", ""); var h = { type: e, cellrange: i, format: n }, m = $.extend(!0, [], ga.luckysheetfile), p = gd.getHistoryRules(m), f = u.luckysheet_conditionformat_save || []; f.push(h), u.luckysheet_conditionformat_save = f; var g = $.extend(!0, [], ga.luckysheetfile), v = gd.getCurrentRules(g); gd.ref(p, v), pd.allowUpdate && pd.saveParam("all", u.index, f, { k: "luckysheet_conditionformat_save" }), c && "function" == typeof c && c() }, deleteRangeConditionalFormat: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (!ba(e)) return fd.info("The itemIndex parameter is invalid.", ""); e = Number(e); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = $.extend(!0, [], i.luckysheet_conditionformat_save); if (0 == o.length) return fd.info("This worksheet has no conditional format to delete", ""); if (null == o[e]) return fd.info("The conditional format of the index cannot be found", ""); var s = o.splice(e, 1), c = $.extend(!0, [], ga.luckysheetfile), u = gd.getHistoryRules(c); i.luckysheet_conditionformat_save = o; var d = $.extend(!0, [], ga.luckysheetfile), h = gd.getCurrentRules(d); return gd.ref(u, h), pd.allowUpdate && pd.saveParam("all", i.index, ruleArr, { k: "luckysheet_conditionformat_save" }), setTimeout((function () { l && "function" == typeof l && l() }), 1), s }, clearRange: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.range, r = void 0 === a ? ga.luckysheet_select_save : a, n = t.order, l = void 0 === n ? _l(ga.currentSheetIndex) : n, i = t.success; if ("string" == Cm(r)) { if (!Ih.iscelldata(r)) return fd.info("The range parameter is invalid.", ""); var o = Ih.getcellrange(r); r = [{ row: o.row, column: o.column }] } else if ("object" == Cm(r)) { if (null == r.row || null == r.column) return fd.info("The range parameter is invalid.", ""); r = [{ row: r.row, column: r.column }] } if ("array" != Cm(r)) return fd.info("The range parameter is invalid.", ""); var s = ga.luckysheetfile[l]; if (null == s) return fd.info("The order parameter is invalid.", ""); for (var c = $.extend(!0, {}, s.config), u = !1, d = 0; d < r.length; d++) { var h = r[d].row[0], m = r[d].row[1], p = r[d].column[0], f = r[d].column[1]; if (u = _a(c, h, m, p, f)) break } if (u) return fd.info("Cannot perform this operation on partially merged cells", ""); var g = $.extend(!0, [], s.data); 0 == g.length && (g = $.extend(!0, [], Sh.buildGridData(s))); for (var v = 0; v < r.length; v++)for (var y = r[v].row[0], b = r[v].row[1], k = r[v].column[0], x = r[v].column[1], w = y; w <= b; w++)for (var _ = k; _ <= x; _++) { var C = g[w][_]; "object" == Cm(C) ? (delete C.m, delete C.v, null != C.f && (delete C.f, Ih.delFunctionGroup(w, _, s.index), delete C.spl), null != C.ct && "inlineStr" == C.ct.t && delete C.ct) : g[w][_] = null } s.index == ga.currentSheetIndex ? id(g, r) : s.data = g, i && "function" == typeof i && i() }, deleteRange: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["left", "up"]; if (!a.includes(e)) return fd.info("The move parameter is invalid.", ""); var r = $a({}, t), n = r.range, l = void 0 === n ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : n, i = r.order, o = void 0 === i ? _l(ga.currentSheetIndex) : i, s = r.success; if ("string" == Cm(l)) { if (!Ih.iscelldata(l)) return fd.info("The range parameter is invalid.", ""); var c = Ih.getcellrange(l); l = { row: c.row, column: c.column } } if ("object" != Cm(l) || null == l.row || null == l.column) return fd.info("The range parameter is invalid.", ""); var u = ga.luckysheetfile[o]; if (null == u) return fd.info("The order parameter is invalid.", ""); var d = l.row[0], h = l.row[1], m = l.column[0], p = l.column[1]; "left" == e ? Fc("moveLeft", d, h, m, p, o) : "up" == e && Fc("moveUp", d, h, m, p, o), s && "function" == typeof s && s() }, matrixOperation: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = ["flipUpDown", "flipLeftRight", "flipClockwise", "flipCounterClockwise", "transpose", "deleteZeroByRow", "deleteZeroByColumn", "removeDuplicateByRow", "removeDuplicateByColumn", "newMatrix"]; if (!e || a.indexOf(e) < 0) return fd.info("The type parameter is invalid.", ""); var r = ga.luckysheet_select_save[0], n = $a({}, t), l = n.range, i = void 0 === l ? r : l, o = n.success; if (i instanceof Array && i.length > 1) fd.info(gn().drag.noMulti, ""); else { i && "string" == typeof i && Ih.iscelldata(i) && (i = Ih.getcellrange(i)); var s = Wo(i), c = []; if (0 !== s.length) { var u, d, h; switch (e) { case "flipUpDown": for (var m = s.length - 1; m >= 0; m--) { for (var p = [], f = 0; f < s[0].length; f++) { var g = ""; null != s[m] && null != s[m][f] && (g = s[m][f]), p.push(g) } c.push(p) } break; case "flipLeftRight": for (var v = 0; v < s.length; v++) { for (var y = [], b = s[0].length - 1; b >= 0; b--) { var k = ""; null != s[v] && null != s[v][b] && (k = s[v][b]), y.push(k) } c.push(y) } break; case "flipClockwise": for (var x = 0; x < s[0].length; x++) { for (var w = [], _ = s.length - 1; _ >= 0; _--) { var C = ""; null != s[_] && null != s[_][x] && (C = s[_][x]), w.push(C) } c.push(w) } break; case "flipCounterClockwise": for (var T = s[0].length - 1; T >= 0; T--) { for (var A = [], S = 0; S < s.length; S++) { var I = ""; null != s[S] && null != s[S][T] && (I = s[S][T]), A.push(I) } c.push(A) } break; case "transpose": for (var R = 0; R < s[0].length; R++) { for (var $ = [], q = 0; q < s.length; q++) { var D = ""; null != s[q] && null != s[q][R] && (D = s[q][R]), $.push(D) } c.push($) } break; case "deleteZeroByRow": u = s[0].length; for (var F = 0; F < s.length; F++) { for (var E = [], M = !0, N = !0, P = 0; P < u; P++) { var z = ""; if (null != s[F] && null != s[F][P]) { if (("0" == (z = s[F][P]).v || 0 == z.v) && M) continue; M = !1 } E.push(z) } var L = []; if (E.length == u) L = E; else { for (var O = E.length - 1; O >= 0; O--) { var B = ""; if (null != E[O]) { if (("0" == (B = E[O]).v || 0 == B.v) && N) continue; N = !1 } L.unshift(B) } for (var V = u - L.length, H = 0; H < V; H++)L.push("") } c.push(L) } break; case "deleteZeroByColumn": u = s.length, d = s[0].length; for (var U = 0; U < d; U++) { for (var j = [], G = !0, W = !0, Y = 0; Y < u; Y++) { var X = ""; if (null != s[Y] && null != s[Y][U]) { if (("0" == (X = s[Y][U]).v || 0 == X.v) && G) continue; G = !1 } j.push(X) } var K = []; if (j.length == u) K = j; else { for (var Z = j.length - 1; Z >= 0; Z--) { var Q = ""; if (null != j[Z]) { if (("0" == (Q = j[Z]).v || 0 == Q.v) && W) continue; W = !1 } K.unshift(Q) } for (var J = u - K.length, ee = 0; ee < J; ee++)K.push("") } c.push(K) } h = []; for (var te = 0; te < c[0].length; te++) { for (var ae = [], re = 0; re < c.length; re++) { var ne = ""; null != c[re] && null != c[re][te] && (ne = c[re][te]), ae.push(ne) } h.push(ae) } break; case "removeDuplicateByRow": u = s[0].length; for (var le = 0; le < s.length; le++) { for (var ie = [], oe = {}, se = 0; se < u; se++) { var ce = null; null != s[le] && null != s[le][se] && ((ce = s[le][se]).v in oe || (oe[ce.v] = []), oe[ce.v].push(ce)) } for (var ue = 0; ue < u; ue++) { var de = null; null != s[le] && null != s[le][ue] && 1 == oe[(de = s[le][ue]).v].length && ie.push(de) } for (var he = u - ie.length, me = 0; me < he; me++)ie.push(null); c.push(ie) } break; case "removeDuplicateByColumn": d = s[0].length, u = s.length; for (var pe = 0; pe < d; pe++) { for (var fe = [], ge = {}, ve = 0; ve < u; ve++) { var ye = null; null != s[ve] && null != s[ve][pe] && ((ye = s[ve][pe]).v in ge || (ge[ye.v] = []), ge[ye.v].push(ye)) } for (var be = 0; be < u; be++) { var ke = null; null != s[be] && null != s[be][pe] && 1 == ge[(ke = s[be][pe]).v].length && fe.push(ke) } a1 = fe; for (var xe = u - a1.length, we = 0; we < xe; we++)a1.push(null); c.push(a1) } h = []; for (var _e = 0; _e < c[0].length; _e++) { for (var Ce = [], Te = 0; Te < c.length; Te++) { var Ae = null; null != c[Te] && null != c[Te][_e] && (Ae = c[Te][_e]), Ce.push(Ae) } h.push(Ce) } break; case "newMatrix": console.log("TODO") }rs.controlHandler(c, i), o && "function" == typeof o && o() } } }, matrixCalculation: function (e, t) { var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = ["plus", "minus", "multiply", "divided", "power", "root", "log"]; if (!e || r.indexOf(e) < 0) return fd.info("The type parameter is invalid.", ""); if (!ba(t)) return fd.info("The number parameter is invalid.", ""); var n = ga.luckysheet_select_save[0], l = $a({}, a), i = l.range, o = void 0 === i ? n : i, s = l.success; if (o instanceof Array && o.length > 1) fd.info(gn().drag.noMulti, ""); else { o && "string" == typeof o && Ih.iscelldata(o) && (o = Ih.getcellrange(o)); var c = Wo(o); if (0 != c.length) { for (var u = [], d = 0; d < c.length; d++) { for (var h = [], m = 0; m < c[0].length; m++) { var p = ""; null != c[d] && null != c[d][m] && (p = c[d][m], null != parseInt(p) && null != c[d][m].ct && "n" == c[d][m].ct.t && ("minus" == e ? p.v = p.v - t : "multiply" == e ? p.v = p.v * t : "divided" == e ? p.v = numFormat(p.v / t, 4) : "power" == e ? p.v = Math.pow(p.v, t) : "root" == e ? 2 == t ? p.v = numFormat(Math.sqrt(p.v), 4) : 3 == t && Math.cbrt ? p.v = numFormat(Math.cbrt(p.v), 4) : p.v = numFormat(jfnqrt(p.v, t), 4) : p.v = "log" == e ? numFormat(1e4 * Math.log(p.v) / Math.log(Math.abs(t)), 4) : p.v + t, null == p.v ? p.m = "" : p.m = p.v.toString())), h.push(p) } u.push(h) } rs.controlHandler(u, o), s && "function" == typeof s && s() } } }, setSheetAdd: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = ga.luckysheetfile.length - 1, a = $a({}, e), r = a.sheetObject, n = void 0 === r ? {} : r, l = a.order, i = void 0 === l ? t : l, o = a.success; if (!ba(i)) return fd.info("Parameter is not a table index", ""); i = Number(i); var s = Sh.generateRandomSheetIndex(); n.calcChain && n.calcChain.length > 0 && n.calcChain.forEach((function (e) { e.index = s })); var c = Sh.generateRandomSheetName(ga.luckysheetfile, !1); if (n.name) { for (var u = !1, d = 0; d < ga.luckysheetfile.length; d++)if (ga.luckysheetfile[d].name == n.name) { u = !0; break } u || (c = n.name) } $("#luckysheet-sheet-container-c").append(_m(yn, { index: s, active: "", name: c, style: "", colorset: "" })); var h = { name: "", color: "", status: "0", order: "", index: "", celldata: [], row: ga.defaultrowNum, column: ga.defaultcolumnNum, config: {}, pivotTable: null, isPivotTable: !1 }; if ((h = $.extend(!0, h, n)).index = s, h.name = c, h.order = i, i <= 0) { var m = ga.luckysheetfile[0].index, p = $("#luckysheet-sheets-item" + m); $("#luckysheet-sheets-item" + s).insertBefore(p), ga.luckysheetfile.splice(0, 0, h) } else { i > ga.luckysheetfile.length && (i = ga.luckysheetfile.length); var f = ga.luckysheetfile[i - 1].index, g = $("#luckysheet-sheets-item" + f); $("#luckysheet-sheets-item" + s).insertAfter(g), ga.luckysheetfile.splice(i, 0, h) } var v = {}; if (ga.luckysheetfile.forEach((function (e, t, a) { a[t].order = t, v[e.index.toString()] = t })), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + s).addClass("luckysheet-sheets-item-active"), $("#luckysheet-cell-main").append('
      '), yd(!0), pd.saveParam("sha", null, $.extend(!0, {}, h)), pd.saveParam("shr", null, v), ga.clearjfundo) { ga.jfundo.length = 0; var y = { type: "addSheet" }; y.sheetconfig = $.extend(!0, {}, h), y.index = s, y.currentSheetIndex = ga.currentSheetIndex, ga.jfredo.push(y) } Sh.changeSheetExec(s, !1, !0), o && "function" == typeof o && o() }, setSheetDelete: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : 1 === ga.luckysheetfile.length ? fd.info(gn().sheetconfig.noMoreSheet, "") : (Sh.deleteSheet(l.index), setTimeout((function () { n && "function" == typeof n && n() }), 1), l) }, setSheetCopy: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.targetOrder, r = t.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = t.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); if (null == a && (a = n + 1), !ba(a)) return fd.info("The targetOrder parameter is invalid.", ""); var o = i.index, s = Sh.generateRandomSheetIndex(), c = $.extend(!0, {}, i); c.order = ga.luckysheetfile.length, c.index = s, c.name = Sh.generateCopySheetName(ga.luckysheetfile, c.name); var u = ""; null != c.color && (u = '
      '); var d = $("#luckysheet-sheets-item" + o); if (ba(a) && (d = $("#luckysheet-sheets-item" + ga.luckysheetfile[a - 1].index)), $("#luckysheet-sheet-container-c").append(_m(yn, { index: c.index, active: "", name: c.name, order: c.order, style: "", colorset: u })), $("#luckysheet-sheets-item" + c.index).insertAfter(d), ga.luckysheetfile.splice(a, 0, c), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + s).addClass("luckysheet-sheets-item-active"), $("#luckysheet-cell-main").append('
      '), yd(!0), pd.saveParam("shc", s, { copyindex: o, name: c.name }), Sh.changeSheetExec(s), Sh.reOrderAllSheet(), ga.clearjfundo) ga.jfredo.push({ type: "copySheet", copyindex: o, index: c.index, sheetIndex: c.index }); else if (ga.jfredo.length > 0) { var h = ga.jfredo[ga.jfredo.length - 1]; "copySheet" == h.type && (h.index = c.index, h.sheetIndex = c.index) } return setTimeout((function () { l && "function" == typeof l && l() }), 1), c }, setSheetHide: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : (Sh.setSheetHide(l.index), setTimeout((function () { n && "function" == typeof n && n() }), 1), l) }, setSheetShow: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : (Sh.setSheetShow(l.index), setTimeout((function () { n && "function" == typeof n && n() }), 1), l) }, setSheetActive: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (null == e || !ba(e) || null == ga.luckysheetfile[e]) return fd.info("The order parameter is invalid.", ""); var a = ga.luckysheetfile[e], r = $a({}, t), n = r.success; return $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), $("#luckysheet-sheets-item" + a.index).addClass("luckysheet-sheets-item-active"), Sh.changeSheet(a.index), setTimeout((function () { n && "function" == typeof n && n() }), 1), pd.multipleRangeShow(), a }, setSheetName: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("string" != Cm(e) || 0 == e.toString().length) return fd.info("The name parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = i.name; if (i.name = e, $("#luckysheet-sheets-item" + i.index + " .luckysheet-sheets-item-name").text(e), pd.saveParam("all", i.index, e, { k: "name" }), ga.clearjfundo) { var s = { type: "sheetName" }; s.sheetIndex = i.index, s.oldtxt = o, s.txt = e, ga.jfundo.length = 0, ga.jfredo.push(s) } l && "function" == typeof l && l() }, setSheetColor: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("string" != Cm(e) || 0 == e.toString().length) return fd.info("The color parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); var o = i.color; if (i.color = e, $("#luckysheet-sheets-item" + i.index).find(".luckysheet-sheets-item-color").remove(), $("#luckysheet-sheets-item" + i.index).append('
      '), pd.saveParam("all", i.index, e, { k: "color" }), ga.clearjfundo) { var s = { type: "sheetColor" }; s.sheetIndex = i.index, s.oldcolor = o, s.color = e, ga.jfundo.length = 0, ga.jfredo.push(s) } l && "function" == typeof l && l() }, setSheetMove: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("left" != e && "right" != e && !ba(e)) return fd.info("Type parameter not available", ""); ba(e) && (e = parseInt(e)); var a = _l(ga.currentSheetIndex), r = $a({}, t), n = r.order, l = void 0 === n ? a : n, i = r.success, o = ga.luckysheetfile[l]; if (null == o) return fd.info("ncorrect worksheet index", ""); var s = o.index; if ("left" == e) { if (0 == l) return; var c = ga.luckysheetfile[l - 1].index; $("#luckysheet-sheets-item" + s).insertBefore($("#luckysheet-sheets-item" + c)), ga.luckysheetfile.splice(l, 1), ga.luckysheetfile.splice(l - 1, 0, o) } else if ("right" == e) { if (l == ga.luckysheetfile.length - 1) return; var u = ga.luckysheetfile[l + 1].index; $("#luckysheet-sheets-item" + s).insertAfter($("#luckysheet-sheets-item" + u)), ga.luckysheetfile.splice(l, 1), ga.luckysheetfile.splice(l + 1, 0, o) } else { if (e < 0 && (e = 0), e > ga.luckysheetfile.length - 1 && (e = ga.luckysheetfile.length - 1), e == l) return; if (e < l) { var d = ga.luckysheetfile[e].index; $("#luckysheet-sheets-item" + s).insertBefore($("#luckysheet-sheets-item" + d)) } else { var h = ga.luckysheetfile[e].index; $("#luckysheet-sheets-item" + s).insertAfter($("#luckysheet-sheets-item" + h)) } ga.luckysheetfile.splice(l, 1), ga.luckysheetfile.splice(e, 0, o) } var m = {}; ga.luckysheetfile.forEach((function (e, t, a) { a[t].order = t, m[e.index.toString()] = t })), pd.saveParam("shr", null, m), i && "function" == typeof i && i() }, setSheetOrder: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (null == e || 0 == e.length) return fd.info("Type orderList not available", ""); var a = {}; e.forEach((function (e) { a[e.index.toString()] = e.order })), ga.luckysheetfile.sort((function (e, t) { var r = a[e.index.toString()], n = a[t.index.toString()]; return null != r && null != n ? r - n : null != r ? -1 : 1 })); var r = {}; ga.luckysheetfile.forEach((function (e, t, a) { if (a[t].order = t, r[e.index.toString()] = t, t > 0) { var n = a[t - 1].index; $("#luckysheet-sheets-item" + e.index).insertAfter($("#luckysheet-sheets-item" + n)) } })), pd.saveParam("shr", null, r); var n = $a({}, t), l = n.success; l && "function" == typeof l && l() }, setSheetZoom: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (!ba(e) || e < .1 || e > 4) return fd.info("The zoom parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); i.zoomRatio = e, pd.saveParam("all", i.index, e, { k: "zoomRatio" }), i.index == ga.currentSheetIndex && (ga.zoomRatio = e, Ah(), Ch()), l && "function" == typeof l && l() }, showGridLines: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : (l.showGridLines = !0, l.index == ga.currentSheetIndex && (ga.showGridLines = !0, setTimeout((function () { md() }), 1)), setTimeout((function () { n && "function" == typeof n && n() }), 1), l) }, hideGridLines: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : (l.showGridLines = !1, l.index == ga.currentSheetIndex && (ga.showGridLines = !1, setTimeout((function () { md() }), 1)), setTimeout((function () { n && "function" == typeof n && n() }), 1), l) }, refresh: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; id(); var t = $a({}, e), a = t.success; a && "function" == typeof a && a() }, scroll: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.scrollLeft, r = t.scrollTop, n = t.targetRow, l = t.targetColumn, i = t.success; if (null != a) { if (!ba(a)) return fd.info("The scrollLeft parameter is invalid.", ""); $("#luckysheet-scrollbar-x").scrollLeft(a) } else if (null != l) { if (!ba(l)) return fd.info("The targetColumn parameter is invalid.", ""); ga.visibledatacolumn[l]; var o = l <= 0 ? 0 : ga.visibledatacolumn[l - 1]; $("#luckysheet-scrollbar-x").scrollLeft(o) } if (null != r) { if (!ba(r)) return fd.info("The scrollTop parameter is invalid.", ""); $("#luckysheet-scrollbar-y").scrollTop(r) } else if (null != n) { if (!ba(n)) return fd.info("The targetRow parameter is invalid.", ""); ga.visibledatarow[n]; var s = n <= 0 ? 0 : ga.visibledatarow[n - 1]; $("#luckysheet-scrollbar-y").scrollTop(s) } i && "function" == typeof i && i() }, resize: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; Uc(); var t = $a({}, e), a = t.success; a && "function" == typeof a && a() }, getScreenshot: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.range, r = void 0 === a ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : a; if ("string" == Cm(r)) { if (!Ih.iscelldata(r)) return fd.info("The range parameter is invalid.", ""); var n = Ih.getcellrange(r); r = { row: n.row, column: n.column } } if ("object" != Cm(r) || null == r.row || null == r.column) return fd.info("The range parameter is invalid.", ""); var l = r.row[0], i = r.row[1], o = r.column[0], s = r.column[1], c = _a(ga.config, l, i, o, s); if (c) return fd.info("Cannot perform this operation on partially merged cells", ""); var u, d, h, m, p = ga.visibledatarow, f = ga.visibledatacolumn; l - 1 < 0 ? (u = 0, d = p[i]) : (u = p[l - 1], d = p[i] - p[l - 1]), o - 1 < 0 ? (h = 0, m = f[s]) : (h = f[o - 1], m = f[s] - f[o - 1]); var g = $("").attr({ width: Math.ceil(m * ga.devicePixelRatio), height: Math.ceil(d * ga.devicePixelRatio) }).css({ width: m, height: d }); Xu(h, u, m, d, 1, 1, null, null, g); var v = g.get(0).getContext("2d"); v.beginPath(), v.moveTo(0, 0), v.lineTo(0, ga.devicePixelRatio * d), v.lineWidth = 2 * ga.devicePixelRatio, v.strokeStyle = Vn, v.stroke(), v.closePath(), v.beginPath(), v.moveTo(0, 0), v.lineTo(ga.devicePixelRatio * m, 0), v.lineWidth = 2 * ga.devicePixelRatio, v.strokeStyle = Vn, v.stroke(), v.closePath(); var y = g.get(0).toDataURL("image/png"); return y }, setWorkbookName: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (null == e || 0 == e.toString().length) return fd.info("The name parameter is invalid.", ""); $("#luckysheet_info_detail_input").val(e); var a = $a({}, t), r = a.success; r && "function" == typeof r && r() }, getWorkbookName: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = "", a = $("#luckysheet_info_detail_input"); if (0 == a.length) return fd.info("Failed to get workbook name, label loading failed!"), t; t = $.trim(a.val()); var r = $a({}, e), n = r.success; return setTimeout((function () { n && "function" == typeof n && n() }), 1), t }, undo: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $.extend(!0, {}, ga.jfredo[ga.jfredo.length - 1]); Wh(new Event("custom")), Fm(); var a = $a({}, e), r = a.success; return setTimeout((function () { r && "function" == typeof r && r() }), 1), t }, redo: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $.extend(!0, {}, ga.jfundo[ga.jfundo.length - 1]); Yh(new Event("custom")), Fm(); var a = $a({}, e), r = a.success; return setTimeout((function () { r && "function" == typeof r && r() }), 1), t }, getAllSheets: dm, getSheet: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.index, r = t.order, n = t.name; return null != a ? Sh.getSheetByIndex(a) : null != r ? ga.luckysheetfile[r] : null != n ? Sh.getSheetByName(n) : Sh.getSheetByIndex() }, getSheetData: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = ga.luckysheetfile[r]; if (null == n) return fd.info("The order parameter is invalid.", ""); var l = $.extend(!0, [], n.data); return null != l && 0 != l.length || (l = $.extend(!0, [], Sh.buildGridData(n))), l }, getConfig: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = ga.luckysheetfile[r]; if (null == n) return fd.info("The order parameter is invalid.", ""); var l = $.extend(!0, {}, n.config); return l }, setConfig: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("object" != Cm(e)) return fd.info("The cfg parameter is invalid.", ""); var a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.success, i = ga.luckysheetfile[n]; if (null == i) return fd.info("The order parameter is invalid.", ""); i.config = e, i.index == ga.currentSheetIndex && (ga.config = e, ("rowhidden" in e || "colhidden" in e || "rowlen" in e || "columnlen" in e) && hd(ga.flowdata.length, ga.flowdata[0].length), setTimeout((function () { md() }), 1)), l && "function" == typeof l && l() }, getLuckysheetfile: function () { return Tl() }, setDataVerification: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if ("object" != Cm(e)) return fd.info("The optionItem parameter is invalid.", ""); var a = $a({}, e), r = a.type, n = a.type2, l = void 0 === n ? null : n, i = a.value1, o = void 0 === i ? "" : i, s = a.value2, c = void 0 === s ? "" : s, u = a.remote, d = void 0 !== u && u, h = a.prohibitInput, m = void 0 !== h && h, p = a.hintShow, f = void 0 !== p && p, g = a.hintText, v = void 0 === g ? "" : g, y = a.checked, b = void 0 !== y && y, k = ["dropdown", "checkbox", "number", "number_integer", "number_decimal", "text_content", "text_length", "date", "validity"], x = ["bw", "nb", "eq", "ne", "gt", "lt", "gte", "lte"], w = ["include", "exclude", "equal"], _ = ["bw", "nb", "eq", "ne", "bf", "nbf", "af", "naf"], C = ["card", "phone"]; if (!k.includes(r)) return fd.info("The optionItem.type parameter is invalid.", ""); var T = gn().dataVerification; if ("dropdown" == r) { if (0 == o.length) return void fd.info('', T.tooltipInfo1) } else if ("checkbox" == r) { if (0 == o.length || 0 == c.length) return void fd.info('', T.tooltipInfo2) } else if ("number" == r || "number_integer" == r || "number_decimal" == r) { if (!x.includes(l)) return fd.info("The optionItem.type2 parameter is invalid.", ""); if (!ba(o)) return void fd.info('', T.tooltipInfo3); if ("bw" == l || "nb" == l) { if (!ba(c)) return void fd.info('', T.tooltipInfo3); if (Number(c) < Number(o)) return void fd.info('', T.tooltipInfo4) } } else if ("text_content" == r) { if (!w.includes(l)) return fd.info("The optionItem.type2 parameter is invalid.", ""); if (0 == o.length) return void fd.info('', T.tooltipInfo5) } else if ("text_length" == r) { if (!x.includes(l)) return fd.info("The optionItem.type2 parameter is invalid.", ""); if (!ba(o)) return void fd.info('', T.tooltipInfo3); if ("bw" == l || "nb" == l) { if (!ba(c)) return void fd.info('', T.tooltipInfo3); if (Number(c) < Number(o)) return void fd.info('', T.tooltipInfo4) } } else if ("date" == r) { if (!_.includes(l)) return fd.info("The optionItem.type2 parameter is invalid.", ""); if (!ds(o)) return void fd.info('', T.tooltipInfo6); if ("bw" == l || "nb" == l) { if (!ds(c)) return void fd.info('', T.tooltipInfo6); if (hs(o, c) > 0) return void fd.info('', T.tooltipInfo7) } } else if ("validity" == r && !C.includes(l)) return fd.info("The optionItem.type2 parameter is invalid.", ""); if ("boolean" != Cm(d)) return fd.info("The optionItem.remote parameter is invalid.", ""); if ("boolean" != Cm(m)) return fd.info("The optionItem.prohibitInput parameter is invalid.", ""); if ("boolean" != Cm(f)) return fd.info("The optionItem.hintShow parameter is invalid.", ""); var A = $a({}, t), S = A.range, I = void 0 === S ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : S, R = A.order, q = void 0 === R ? _l(ga.currentSheetIndex) : R, D = A.success; if ("string" == Cm(I)) { if (!Ih.iscelldata(I)) return fd.info("The range parameter is invalid.", ""); var F = Ih.getcellrange(I); I = { row: F.row, column: F.column } } if ("object" != Cm(I) || null == I.row || null == I.column) return fd.info("The range parameter is invalid.", ""); var E = ga.luckysheetfile[q]; if (null == E) return fd.info("The order parameter is invalid.", ""); var M = { type: r, type2: l, value1: o, value2: c, checked: b, remote: d, prohibitInput: m, hintShow: f, hintText: v }, N = $.extend(!0, {}, E.dataVerification), P = $.extend(!0, [], E.data); 0 == P.length && (P = Sh.buildGridData(E)); for (var z = I.row[0], L = I.row[1], O = I.column[0], B = I.column[1], V = z; V <= L; V++)for (var H = O; H <= B; H++)N[V + "_" + H] = M, "checkbox" == r && (M.checked ? Cs(V, H, P, M.value1) : Cs(V, H, P, M.value2)); if (E.index == ga.currentSheetIndex) { var U = $.extend(!0, {}, E.dataVerification); "checkbox" == r ? $c.refOfCheckbox(U, N, ga.currentSheetIndex, P, I) : $c.ref(U, N, ga.currentSheetIndex) } else E.dataVerification = N, E.data = P; D && "function" == typeof D && D() }, deleteDataVerification: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.range, r = void 0 === a ? ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] : a, n = t.order, l = void 0 === n ? _l(ga.currentSheetIndex) : n, i = t.success; if ("string" == Cm(r)) { if (!Ih.iscelldata(r)) return fd.info("The range parameter is invalid.", ""); var o = Ih.getcellrange(r); r = { row: o.row, column: o.column } } if ("object" != Cm(r) || null == r.row || null == r.column) return fd.info("The range parameter is invalid.", ""); var s = ga.luckysheetfile[l]; if (null == s) return fd.info("The order parameter is invalid.", ""); for (var c = $.extend(!0, {}, s.dataVerification), u = r.row[0], d = r.row[1], h = r.column[0], m = r.column[1], p = u; p <= d; p++)for (var f = h; f <= m; f++)delete c[p + "_" + f]; if (s.index == ga.currentSheetIndex) { var g = $.extend(!0, {}, s.dataVerification); $c.ref(g, c, ga.currentSheetIndex) } else s.dataVerification = c; i && "function" == typeof i && i() }, insertImage: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = $a({}, t), r = a.order, n = void 0 === r ? _l(ga.currentSheetIndex) : r, l = a.rowIndex, i = a.colIndex, o = a.success, s = ga.luckysheetfile[n]; if (null == s) return fd.info("The order parameter is invalid.", ""); if (s.index == ga.currentSheetIndex) { var c = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; null == l && (l = c.row_focus || 0), l < 0 && (l = 0), l > ga.visibledatarow.length && (l = ga.visibledatarow.length), null == i && (i = c.column_focus || 0), i < 0 && (i = 0), i > ga.visibledatacolumn.length && (i = ga.visibledatacolumn.length); var u = 0 == i ? 0 : ga.visibledatacolumn[i - 1], d = 0 == l ? 0 : ga.visibledatarow[l - 1], h = new Image; h.onload = function () { var t = h.width, a = h.height, r = { src: e, left: u, top: d, originWidth: t, originHeight: a }; Rc.addImgItem(r), o && "function" == typeof o && o() }, h.src = e } else { var m = s.images || {}, p = s.config, f = s.zoomRatio || 1, g = s.row, v = s.visibledatarow || []; if (0 === v.length) for (var y = 0, b = 0; b < g; b++) { var k = ga.defaultrowlen; null != p.rowlen && null != p.rowlen[b] && (k = p.rowlen[b]), null == p.rowhidden || null == p.rowhidden[b] ? (y += Math.round((k + 1) * f), v.push(y)) : v.push(y) } var x = s.column, w = s.visibledatacolumn || []; if (0 === w.length) for (var _ = 0, C = 0; C < x; C++) { var T = ga.defaultcollen; null != p.columnlen && null != p.columnlen[C] && (T = p.columnlen[C]), null == p.colhidden || null == p.colhidden[C] ? (_ += Math.round((T + 1) * f), w.push(_)) : w.push(_) } null == l && (l = 0), l < 0 && (l = 0), l > v.length && (l = v.length), null == i && (i = 0), i < 0 && (i = 0), i > w.length && (i = w.length); var A = 0 == i ? 0 : w[i - 1], S = 0 == l ? 0 : v[l - 1], I = new Image; I.onload = function () { var t, a, r = { src: e, left: A, top: S, originWidth: I.width, originHeight: I.height }; r.originHeight < r.originWidth ? (a = Math.round(r.originHeight * (400 / r.originWidth)), t = 400) : (t = Math.round(r.originWidth * (400 / r.originHeight)), a = 400); var n = $.extend(!0, {}, Rc.imgItem); n.src = r.src, n.originWidth = r.originWidth, n.originHeight = r.originHeight, n.default.width = t, n.default.height = a, n.default.left = r.left, n.default.top = r.top, n.crop.width = t, n.crop.height = a; var l = Rc.generateRandomId(); m[l] = n, s.images = m, o && "function" == typeof o && o() }, I.src = e } }, deleteImage: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.idList, l = void 0 === n ? "all" : n, i = t.success, o = ga.luckysheetfile[r]; if (null == o) return fd.info("The order parameter is invalid.", ""); var s = o.images; return null == s ? fd.info("The worksheet has no pictures to delete.", "") : "all" != l && "array" != Cm(l) ? fd.info("The idList parameter is invalid.", "") : ("array" == Cm(l) ? l.forEach((function (e) { delete s[e] })) : s = null, o.images = s, o.index == ga.currentSheetIndex && (null == Rc.currentImgId || "all" != l && !l.includes(Rc.currentImgId) || ($("#luckysheet-modal-dialog-activeImage").hide(), $("#luckysheet-modal-dialog-cropping").hide(), $("#luckysheet-modal-dialog-slider-imageCtrl").hide()), Rc.images = s, Rc.allImagesShow(), Rc.init()), void (i && "function" == typeof i && i())) }, getImageOption: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = $a({}, e), a = t.order, r = void 0 === a ? _l(ga.currentSheetIndex) : a, n = t.success, l = ga.luckysheetfile[r]; return null == l ? fd.info("The order parameter is invalid.", "") : (setTimeout((function () { n && "function" == typeof n && n() }), 1), l.images) }, transToCellData: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = $a({}, t), r = a.success; return setTimeout((function () { r && "function" == typeof r && r() }), 0), Sh.getGridData(e) }, transToData: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, a = $a({}, t), r = a.success; return setTimeout((function () { r && "function" == typeof r && r() }), 0), Sh.buildGridData({ celldata: e }) }, toJson: hm, changLang: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "zh"; if (!["zh", "en", "es"].includes(e)) return fd.info("The lang parameter is invalid.", ""); var t = hm(); t.lang = e, luckysheet.create(t) }, closeWebsocket: function () { null != pd.websocket && pd.websocket.close(1e3) }, getRangeByTxt: function (e) { if (null == e) return { column: ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1].column, row: ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1].row }; var t = gd.getRangeByTxt(e); return { column: t[0].column, row: t[0].row } }, getTxtByRange: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ga.luckysheet_select_save; return "object" === Cm(e) && (e = [e]), gd.getTxtByRange(e) }, pagerInit: mm, refreshFormula: function (e) { Ih.execFunctionGroupForce(!0), md(), setTimeout((function () { e && "function" == typeof e && e() })) }, refreshMenuButtonFocus: pm }), gm = function (e, t, a) { var r = ga.visibledatarow[e], n = 0 == e ? 0 : ga.visibledatarow[e - 1], l = ga.visibledatacolumn[t], i = 0 == t ? 0 : ga.visibledatacolumn[t - 1], o = xm.mergeborer(ga.flowdata, e, t), s = a.ct.fa || "YYYY-MM-DD", c = ws("yyyy-MM-dd hh:mm:ss", a.v), u = function (e) { var t = e.replace(/y/g, "Y"); return (t = (t = (t = (t = (t = (t = (t = (t = (t = t.replace(/d/g, "D")).replace(/h/g, "H")).replace(/上午\/下午/g, "A")).replace(/上午/g, "A")).replace(/下午/g, "A")).replace(/AM\/PM/g, "A")).replace(/AM/g, "A")).replace(/PM/g, "A")).replace(/\"/g, "")).includes("A") && (t = t.replace(/H/g, "h")), t }(s), d = !1, h = !1, m = !1, p = !0, f = !1; o && (r = o.row[1], n = o.row[0], l = o.column[1], i = o.column[0]), $(".cell-date-picker").show().css({ width: l - i + 1, height: r - n + 1, left: i, top: n }), /[上午下午]/.test(s) && (f = !0), /[Hhms]/.test(u) && (d = !0), /[YMD]/.test(u) || (h = !0), /s/.test(u) && (m = !0), /A/.test(u) && (p = !1); var g = Vh("#luckysheet-input-box", { allowInput: !1, noCalendar: h, enableSeconds: m, enableTime: d, dateFormat: u, time_24hr: p, defaultDate: c, onClose: function () { setTimeout((function () { g.destroy() }), 0) }, parseDate: function (e, t) { return us(e).toDate() }, formatDate: function (e, t, a) { return f ? us(e).format(t).replace("AM", "上午").replace("PM", "下午") : us(e).format(t) }, onChange: function (r, n) { var l = ys(new Date(r)); $("#luckysheet-rich-text-editor").html(n), Xh(e, t, l, { isRefresh: !1 }), Kh(e, t, "ct", a.ct), d || Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]) } }); $("#luckysheet-input-box").click() }; function vm(e, t, a, r, n) { if (mu(e, t, ga.currentSheetIndex)) { if (!wa() && !1 !== ga.allowEdit) { if (Nc.createHookFunction("cellEditBefore", ga.luckysheet_select_save), pd.saveParam("mv", ga.currentSheetIndex, { op: "enterEdit", range: ga.luckysheet_select_save }), null != $c.dataVerification && null != $c.dataVerification[e + "_" + t]) { var l = $c.dataVerification[e + "_" + t]; if ("dropdown" == l.type) $c.dropdownListShow(); else if ("checkbox" == l.type) return } var i = ym(e, t, a), o = i.row, s = i.row_pre, c = i.col, u = i.col_pre, d = i.row_index, h = i.col_index; $("#luckysheet-dropCell-icon").is(":visible") && $("#luckysheet-dropCell-icon").remove(); var m = $(window).height(), p = $(window).width(), f = $("#" + ga.container).offset(), g = $("#luckysheet-cell-main").scrollLeft(), v = $("#luckysheet-cell-main").scrollTop(); if (!Ru.isPivotRange(d, h)) { var y = u + f.left + ga.rowHeaderWidth - g - 2; null != Bc.freezenverticaldata && t <= Bc.freezenverticaldata[1] && (y = u + f.left + ga.rowHeaderWidth - 2); var b = s + f.top + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight - v - 2; null != Bc.freezenhorizontaldata && e <= Bc.freezenhorizontaldata[1] && (b = s + f.top + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight - 2); var k = { "min-width": c - u + 1 - 8, "min-height": o - s + 1 - 4, "max-width": p + g - u - 20 - ga.rowHeaderWidth, "max-height": m + v - s - 20 - 15 - ga.toolbarHeight - ga.infobarHeight - ga.calculatebarHeight - ga.sheetBarHeight - ga.statisticBarHeight, left: y, top: b }, x = { transform: "scale(" + ga.zoomRatio + ")", "transform-origin": "left top", width: 100 / ga.zoomRatio + "%", height: 100 / ga.zoomRatio + "%" }; ga.luckysheetCellUpdate = [d, h], n || $("#luckysheet-rich-text-editor").focus().select(), $("#luckysheet-input-box").removeAttr("style").css({ "background-color": "rgb(255, 255, 255)", padding: "0px 2px", "font-size": "13px", right: "auto", "overflow-y": "auto", "box-sizing": "initial", display: "flex" }), null == Bc.freezenverticaldata && null == Bc.freezenhorizontaldata || $("#luckysheet-input-box").css("z-index", 10002), $("#luckysheet-input-box-index").html(Im(h) + (d + 1)).hide(), $("#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm").addClass("luckysheet-wa-calculate-active"); var w = "", _ = !1; if (null != a[d] && null != a[d][h]) { var C = a[d][h], T = C.ht, A = "left", S = "top"; "0" == T ? (k = { "min-width": c - u + 1 - 8, "min-height": o - s + 1 - 4, "max-width": 2 * p / 3, "max-height": m + v - s - 20 - 15 - ga.toolbarHeight - ga.infobarHeight - ga.calculatebarHeight - ga.sheetBarHeight - ga.statisticBarHeight, left: u + f.left + ga.rowHeaderWidth - g - 2, top: s + f.top + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight - v - 2 }, ga.zoomRatio < 1 && (A = "center"), _ = !0) : "2" == T && (k = { "min-width": c - u + 1 - 8, "min-height": o - s + 1 - 4, "max-width": c + f.left - g - 8, "max-height": m + v - s - 20 - 15 - ga.toolbarHeight - ga.infobarHeight - ga.calculatebarHeight - ga.sheetBarHeight - ga.statisticBarHeight, right: p - (f.left + (ga.rowHeaderWidth - 1) - g) - c, top: s + f.top + ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight - v - 2 }, ga.zoomRatio < 1 && (A = "right")), "0" == C.vt ? S = "center" : "2" == C.vt && (S = "bottom"), x["transform-origin"] = A + " " + S, r || (No(C) ? w = function (e, t, a) { var r = Ko(e, t, a, "ct"); if (null == a && (a = ga.flowdata), a[e][t], Po(r)) { for (var n = r.s, l = "", i = 0; i < n.length; i++) { var o = n[i]; if (null != o.v) l += "" + o.v + "" } return l } return "" }(d, h, a) : null != C.f ? w = Ko(d, h, a, "f") : (w = _s(d, h, a), "1" == C.qp && (w = "'" + w))); var I = xm.getStyleByCell(a, d, h); I = $("#luckysheet-input-box").get(0).style.cssText + I, $("#luckysheet-input-box").get(0).style.cssText = I, "rgba(0, 0, 0, 0)" == $("#luckysheet-input-box").get(0).style.backgroundColor && ($("#luckysheet-input-box").get(0).style.background = "rgb(255,255,255)") } else { var R = wc.getComputeMap(), q = wc.checksAF(d, h, R), D = gd.getComputeMap(), F = gd.checksCF(d, h, D); null != F && null != F.cellColor ? $("#luckysheet-input-box").get(0).style.background = F.cellColor : null != q && ($("#luckysheet-input-box").get(0).style.background = q[1]) } if (k["min-height"] > k["max-height"] && (k["min-height"] = k["max-height"]), k["min-width"] > k["max-width"] && (k["min-width"] = k["max-width"]), null != w && "" != w.toString() || r || (w = "
      "), !pu(d, h, ga.currentSheetIndex) && w.length > 0 && '=' == w.substr(0, 63) ? $("#luckysheet-rich-text-editor").html("") : ($("#luckysheet-rich-text-editor").html(w), n || qo($("#luckysheet-rich-text-editor")[0])), _) { var E = $("#luckysheet-input-box").width(); E > k["max-width"] && (E = k["max-width"]), E < k["min-width"] && (E = k["min-width"]); var M = k.left - E / 2 + (c - u) / 2; M < 2 && (M = 2), k.left = M - 2 } $("#luckysheet-input-box").css(k), $("#luckysheet-rich-text-editor").css(x), a[e][t] && a[e][t].ct && "d" == a[e][t].ct.t && gm(e, t, a[e][t]), Ih.rangetosheet = ga.currentSheetIndex, Ih.createRangeHightlight(), Ih.rangeResizeTo = $("#luckysheet-rich-text-editor"), yd() } } } else $("#luckysheet-functionbox-cell").blur() } function ym(e, t, a) { var r = ga.visibledatarow[e], n = e - 1 == -1 ? 0 : ga.visibledatarow[e - 1], l = ga.visibledatacolumn[t], i = t - 1 == -1 ? 0 : ga.visibledatacolumn[t - 1]; null == a && (a = ga.flowdata); var o = xm.mergeborer(a, e, t); return o && (r = o.row[1], n = o.row[0], e = o.row[2], l = o.column[1], i = o.column[0], t = o.column[2]), { row: r, row_pre: n, row_index: e, col: l, col_pre: i, col_index: t } } var bm = { singleRangeFocus: !1, init: function () { var e = this, t = gn(), a = t.formula; t.button; $(document).off("focus.IFcompareValue").on("focus.IFcompareValue", "#luckysheet-ifFormulaGenerator-dialog #compareValue", (function () { $("#luckysheet-modal-dialog-mask").hide(), e.singleRangeFocus = !0 })), $(document).off("click.IFsingRange").on("click.IFsingRange", "#luckysheet-ifFormulaGenerator-dialog .singRange", (function () { var t = $("#luckysheet-ifFormulaGenerator-dialog #compareValue").val().trim(); Ih.iscelldata(t) ? e.singleRangeDialog(t) : e.singleRangeDialog() })), $(document).off("click.IFsingRangeConfirm").on("click.IFsingRangeConfirm", "#luckysheet-ifFormulaGenerator-singleRange-confirm", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-ifFormulaGenerator-singleRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show(); var t = $(this).parents("#luckysheet-ifFormulaGenerator-singleRange-dialog").find("input").val().trim(); $("#luckysheet-ifFormulaGenerator-dialog #compareValue").val(t), e.singleRangeFocus = !1 })), $(document).off("click.IFsingRangeCancel").on("click.IFsingRangeCancel", "#luckysheet-ifFormulaGenerator-singleRange-cancel", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-ifFormulaGenerator-singleRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show(), e.singleRangeFocus = !1 })), $(document).off("click.IFsingRangeClose").on("click.IFsingRangeClose", "#luckysheet-ifFormulaGenerator-singleRange-dialog .luckysheet-modal-dialog-title-close", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show(), e.singleRangeFocus = !1 })), $(document).off("click.IFmultiRange").on("click.IFmultiRange", "#luckysheet-ifFormulaGenerator-dialog .multiRange", (function () { e.multiRangeDialog(), e.singleRangeFocus = !1 })), $(document).off("click.IFmultiRangeConfirm").on("click.IFmultiRangeConfirm", "#luckysheet-ifFormulaGenerator-multiRange-confirm", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(), $("#luckysheet-ifFormulaGenerator-multiRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show(); for (var e = $(this).parents("#luckysheet-ifFormulaGenerator-multiRange-dialog").find("input").val().trim(), t = Ih.getcellrange(e), a = t.row[0], r = t.row[1], n = t.column[0], l = t.column[1], i = rs.deepCopyFlowData(ga.flowdata), o = [], s = a; s <= r; s++)for (var c = n; c <= l; c++)null != i[s] && null != i[s][c] && null != i[s][c].ct && "n" == i[s][c].ct.t && o.push(i[s][c].v); for (var u = 0; u < o.length; u++)for (var d = 0; d < o.length - 1 - u; d++)if (o[d] < o[d + 1]) { var h = o[d]; o[d] = o[d + 1], o[d + 1] = h } var m = o[0], p = o[o.length - 1]; $("#luckysheet-ifFormulaGenerator-dialog #smallRange").val(p), $("#luckysheet-ifFormulaGenerator-dialog #largeRange").val(m) })), $(document).off("click.IFmultiRangeCancel").on("click.IFmultiRangeCancel", "#luckysheet-ifFormulaGenerator-multiRange-cancel", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(), $("#luckysheet-ifFormulaGenerator-multiRange-dialog").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show() })), $(document).off("click.IFmultiRangeClose").on("click.IFmultiRangeClose", "#luckysheet-ifFormulaGenerator-multiRange-dialog .luckysheet-modal-dialog-title-close", (function () { $("#luckysheet-formula-functionrange-select").hide(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(), $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").show() })), $(document).on("change", "#DivisionMethod", (function () { "2" == $(this).find("option:selected").val() ? $("#DivisionMethodVal").hide() : $("#DivisionMethodVal").show(), $("#luckysheet-ifFormulaGenerator-dialog .ifList").empty() })), $(document).off("click.IFcreateBtn").on("click.IFcreateBtn", "#luckysheet-ifFormulaGenerator-dialog #createBtn", (function () { var t = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find("#compareValue").val().trim(); if ("" != t) { var r = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find("#DivisionMethod option:selected").val(); if ("2" == r) { var n = '
      ' + t + '' + a.ifGenTipLableTitile + ':
      '; $("#luckysheet-ifFormulaGenerator-dialog .ifList").append(n) } else { var l = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find("#smallRange").val().trim(), i = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find("#largeRange").val().trim(), o = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find("#DivisionMethodVal").val().trim(); if ("" == l || "" == i) return void e.info(a.ifGenTipRangeNotforNull); if ("" == o) return void e.info(a.ifGenTipCutValueNotforNull); e.getIfList(t, l, i, r, o) } } else e.info(a.ifGenTipNotNullValue) })), $(document).on("click", "#luckysheet-ifFormulaGenerator-dialog .item .fa-remove", (function () { $(this).parents(".item").remove() })), $(document).off("click.IFconfirmBtn").on("click.IFconfirmBtn", "#luckysheet-ifFormulaGenerator-dialog-confirm", (function () { var t = $(this).parents("#luckysheet-ifFormulaGenerator-dialog").find(".ifList .item"), r = ""; if ($(t.toArray().reverse()).each((function (e, n) { var l, i, o, s = $(n).find(".smallNum").val().trim(), c = $(n).find(".largeNum").val().trim(), u = $(n).find(".operator option:selected").val(), d = $(n).find(".operator2 option:selected").val(), h = $(n).find(".compareValue").text(), m = $(n).find(".markText").val().trim(); if ("" == m && (m = a.ifGenTipLableTitile + (e + 1)), "" == s && "" == c) return !0; l = "0" == u ? h + ">=" + s : h + ">" + s, i = "0" == d ? h + "<=" + c : h + "<" + c, o = 0 == e && "" == c ? l : e == t.length - 1 && "" == s ? i : "and(" + l + "," + i + ")", r = 0 == e ? "if(" + o + ',"' + m + '")' : "if(" + o + ',"' + m + '",' + r + ")" })), 0 != r.length) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-ifFormulaGenerator-dialog").hide(); var n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(n.row_focus, n.column_focus, ga.flowdata), $("#luckysheet-rich-text-editor").html("=" + r), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), $("#luckysheet-wa-functionbox-confirm").click() } else e.info(a.ifGenTipNotGenCondition) })), $(document).on("click", "#luckysheet-ifFormulaGenerator-info .luckysheet-model-close-btn", (function () { $("#luckysheet-modal-dialog-mask").show() })), $(document).on("click", "#luckysheet-ifFormulaGenerator-info .luckysheet-modal-dialog-title-close", (function () { $("#luckysheet-modal-dialog-mask").show() })) }, ifFormulaDialog: function (e) { var t = gn(), a = t.formula, r = t.button; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-dialog").remove(); var n = "", l = ""; if (e) for (var i = e.split("if("), o = 1; o < i.length; o++) { var s = i[o].replace("and(", "").replace(/\)/g, "").replace(/\"/g, "").split(","); s = this.clearArr(s), n = this.splitTxt(s[0])[0]; var c = void 0, u = void 0, d = void 0; 3 == s.length ? (c = this.splitTxt(s[0])[1], u = this.splitTxt(s[1])[2], d = s[2]) : (c = this.splitTxt(s[0])[1], u = this.splitTxt(s[0])[2], d = s[1]), l += '
      ' + n + '' + a.ifGenTipLableTitile + ':
      ' } var h = '
      ' + a.ifGenRangeTo + '
      ' + a.ifGenRangeEvaluate + '
      ' + a.ifGenCutSame + '
      ' + l + "
      "; $("body").append(_m(bn, { id: "luckysheet-ifFormulaGenerator-dialog", addclass: "luckysheet-ifFormulaGenerator-dialog", title: a.ifGenerate, content: h, botton: '", style: "z-index:100003" })); var m = $("#luckysheet-ifFormulaGenerator-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 590).end(), p = m.outerHeight(), f = m.outerWidth(), g = $(window).width(), v = $(window).height(), y = $(document).scrollLeft(), b = $(document).scrollTop(); $("#luckysheet-ifFormulaGenerator-dialog").css({ left: (g + y - f) / 2, top: (v + b - p) / 3 }).show() }, clearArr: function (e) { for (var t = 0; t < e.length; t++)"" != e[t] && null != e[t] && null != e[t] || e.splice(t, 1); return e }, splitTxt: function (e) { var t, a; return -1 != e.indexOf(">=") ? [e.split(">=")[0], t = e.split(">=")[1], a] : -1 != e.indexOf(">") ? [e.split(">")[0], t = e.split(">")[1], a] : -1 != e.indexOf("<=") ? [e.split("<=")[0], t, a = e.split("<=")[1]] : -1 != e.indexOf("<") ? [e.split("<")[0], t, a = e.split("<")[1]] : void 0 }, singleRangeDialog: function (e) { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-ifFormulaGenerator-dialog").hide(), $("#luckysheet-ifFormulaGenerator-singleRange-dialog").remove(); var t = gn(), a = t.formula, r = t.button; null == e && (e = ""), $("body").append(_m(bn, { id: "luckysheet-ifFormulaGenerator-singleRange-dialog", addclass: "luckysheet-ifFormulaGenerator-singleRange-dialog", title: a.ifGenTipSelectCell, content: '', botton: '", style: "z-index:100003" })); var n = $("#luckysheet-ifFormulaGenerator-singleRange-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), l = n.outerHeight(), i = n.outerWidth(), o = $(window).width(), s = $(window).height(), c = $(document).scrollLeft(), u = $(document).scrollTop(); $("#luckysheet-ifFormulaGenerator-singleRange-dialog").css({ left: (o + c - i) / 2, top: (s + u - l) / 3 }).show() }, multiRangeDialog: function () { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-ifFormulaGenerator-dialog").hide(), $("#luckysheet-ifFormulaGenerator-multiRange-dialog").remove(); var e = gn(), t = e.formula, a = e.button; $("body").append(_m(bn, { id: "luckysheet-ifFormulaGenerator-multiRange-dialog", addclass: "luckysheet-ifFormulaGenerator-multiRange-dialog", title: t.ifGenTipSelectRange, content: '', botton: '", style: "z-index:100003" })); var r = $("#luckysheet-ifFormulaGenerator-multiRange-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), n = r.outerHeight(), l = r.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-ifFormulaGenerator-multiRange-dialog").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show() }, getIfList: function (e, t, a, r, n) { var l = gn().formula; $("#luckysheet-ifFormulaGenerator-dialog .ifList").empty(), t = parseInt(t), a = parseInt(a), n = parseInt(n); var i = []; if ("0" == r) for (var o = Math.ceil((a - t) / n), s = 0; s <= o; s++) { var c = t + n * s; 0 == s || c >= a ? i.push("") : i.push(c) } else if ("1" == r) for (var u = Math.ceil((a - t) / n), d = 0; d <= n; d++) { var h = t + u * d; 0 == d || h >= a ? i.push("") : i.push(h) } for (var m = 0; m < i.length - 1; m++) { var p = void 0; p = 0 == m ? "小于" + i[m + 1] : m == i.length - 2 ? "大于等于" + i[m] : i[m] + "到" + i[m + 1]; var f = '
      ' + e + '' + l.ifGenTipLableTitile + ':
      '; $("#luckysheet-ifFormulaGenerator-dialog .ifList").append(f) } }, info: function (e) { $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-ifFormulaGenerator-info").remove(); var t = gn().button; $("body").append(_m(bn, { id: "luckysheet-ifFormulaGenerator-info", addclass: "", title: e, content: "", botton: '", style: "z-index:100003" })); var a = $("#luckysheet-ifFormulaGenerator-info").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), r = a.outerHeight(), n = a.outerWidth(), l = $(window).width(), i = $(window).height(), o = $(document).scrollLeft(), s = $(document).scrollTop(); $("#luckysheet-ifFormulaGenerator-info").css({ left: (l + o - n) / 2, top: (i + s - r) / 3 }).show() } }, km = { init: function () { var e = this, t = gn(), a = t.formulaMore, r = t.button; $(document).off("keyup.fxSFLI").on("keyup.fxSFLI", "#searchFormulaListInput", (function () { $("#formulaTypeList").empty(); var t = $(this).val().toUpperCase(), a = ga.functionlist; if ("" == t) e.formulaListByType($("#formulaTypeSelect option:selected").val()); else for (var r = 0; r < a.length; r++)/^[a-zA-Z]+$/.test(t) ? "-1" != a[r].n.indexOf(t) && $('
      ' + a[r].n + "" + a[r].a + "
      ").appendTo($("#formulaTypeList")) : "-1" != a[r].a.indexOf(t) && $('
      ' + a[r].n + "" + a[r].a + "
      ").appendTo($("#formulaTypeList")); $("#formulaTypeList .listBox:first-child").addClass("on") })), $(document).off("change.fxFormulaTS").on("change.fxFormulaTS", "#formulaTypeSelect", (function () { var t = $("#formulaTypeSelect option:selected").val(); e.formulaListByType(t) })), $(document).off("click.fxListbox").on("click.fxListbox", "#formulaTypeList .listBox", (function () { $(this).addClass("on").siblings().removeClass("on") })), $(document).off("click.fxFormulaCf").on("click.fxFormulaCf", "#luckysheet-search-formula-confirm", (function () { var t = $("#luckysheet-search-formula .listBox.on").attr("name"), a = '=' + t.toUpperCase() + '()'; $("#luckysheet-rich-text-editor").html(a), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), e.formulaParmDialog(t) })), $(document).off("focus.fxParamInput").on("focus.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", (function () { var t = $(this).parents(".parmBox").index(); Ih.data_parm_index = t; var r, n, l = $(this).parents("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-title-text").text(), i = ga.luckysheet_function[l].p.length; t >= i ? (r = ga.luckysheet_function[l].p[i - 1].detail, n = ga.luckysheet_function[l].p[i - 1].repeat) : (r = ga.luckysheet_function[l].p[t].detail, n = ga.luckysheet_function[l].p[t].repeat), e.parmTxtShow($(this).val()), e.functionStrCompute(), $("#luckysheet-search-formula-parm .parmDetailsBox").empty(); var o = $(this).parents(".parmBox").find(".name").text(); if ($("" + o + ":" + r + "").appendTo($("#luckysheet-search-formula-parm .parmDetailsBox")), "y" == n) { var s = $("#luckysheet-search-formula-parm .parmBox").length; s < 5 && t == s - 1 && $('
      ' + a.valueTitle + (s + 1) + '
      =
      ').appendTo($("#luckysheet-search-formula-parm .parmListBox")) } })), $(document).off("blur.fxParamInput").on("blur.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", (function () { var t = $(this).val(); null != Ih.getfunctionParam(t).fn || Ih.iscelldata(t) || !ba(t) && "" != t && t.length <= 2 && 0 != t.indexOf('"') && 0 != t.lastIndexOf('"') && (t = '"' + t + '"', $(this).val(t), e.parmTxtShow(t), e.functionStrCompute()) })), $(document).off("keyup.fxParamInput").on("keyup.fxParamInput", "#luckysheet-search-formula-parm .parmBox input", (function () { e.parmTxtShow($(this).val()), e.functionStrCompute() })), $(document).off("click.fxParamI").on("click.fxParamI", "#luckysheet-search-formula-parm .parmBox i", (function () { Ih.data_parm_index = $(this).parents(".parmBox").index(), $("#luckysheet-search-formula-parm").hide(), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-search-formula-parm-select").remove(), "" == $(this).parents(".parmBox").find(".txt input").val() ? $("body").append(_m(bn, { id: "luckysheet-search-formula-parm-select", addclass: "luckysheet-search-formula-parm-select", title: a.tipSelectDataRange, content: "", botton: '", style: "z-index:100003" })) : $("body").append(_m(bn, { id: "luckysheet-search-formula-parm-select", addclass: "luckysheet-search-formula-parm-select", title: a.tipSelectDataRange, content: "", botton: '", style: "z-index:100003" })); var t = $("#luckysheet-search-formula-parm-select").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), n = t.outerHeight(), l = t.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-search-formula-parm-select").css({ left: (i + s - l) / 2, top: (o + c - n) / 3 }).show(), e.parmTxtShow($(this).parents(".parmBox").find(".txt input").val()) })), $(document).off("click.fxParamCf").on("click.fxParamCf", "#luckysheet-search-formula-parm-confirm", (function () { $("#luckysheet-wa-functionbox-confirm").click() })), $(document).off("click.fxParamSelectCf").on("click.fxParamSelectCf", "#luckysheet-search-formula-parm-select-confirm", (function () { var e = $("#luckysheet-search-formula-parm-select-input").attr("data_parm_index"); $("#luckysheet-search-formula-parm-select").hide(), $("#luckysheet-search-formula-parm").show(), $("#luckysheet-search-formula-parm .parmBox").eq(e).find(".txt input").focus() })) }, formulaListDialog: function () { var e = gn(), t = e.formulaMore, a = e.button; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-search-formula").remove(), $("body").append(_m(bn, { id: "luckysheet-search-formula", addclass: "luckysheet-search-formula", title: "", content: "
      ", botton: '", style: "z-index:100003" })); var r = $("#luckysheet-search-formula").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), n = r.outerHeight(), l = r.outerWidth(), i = $(window).width(), o = $(window).height(), s = $(document).scrollLeft(), c = $(document).scrollTop(); $("#luckysheet-search-formula").css({ left: (i + s - l) / 2, top: (o + c - n) / 3, "user-select": "none" }).show(), this.formulaListByType("0"), $("#searchFormulaListInput").focus() }, formulaListByType: function (e) { $("#formulaTypeList").empty(); for (var t = ga.functionlist, a = 0; a < t.length; a++)("-1" == e && t[a].t > 14 || t[a].t == e) && $('
      ' + t[a].n + "" + t[a].a + "
      ").appendTo($("#formulaTypeList")); $("#formulaTypeList .listBox:first-child").addClass("on") }, formulaParmDialog: function (e, t) { for (var a = "", r = "", n = "", l = gn(), i = l.formulaMore, o = l.button, s = ga.functionlist, c = 0; c < s.length; c++)if (s[c].n == e.toUpperCase()) { a = s[c].n; for (var u = 0; u < s[c].p.length; u++)null == t ? n += '
      ' + s[c].p[u].name + '
      =
      ' : (null == t[u] && (t[u] = ""), n += '
      ' + s[c].p[u].name + '
      =
      '); r = '
      ' + n + '
      ' + s[c].d + '
      ' + i.calculationResult + " =
      " } $("#luckysheet-search-formula").hide(), $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-search-formula-parm").remove(), $("body").append(_m(bn, { id: "luckysheet-search-formula-parm", addclass: "luckysheet-search-formula-parm", title: a, content: r, botton: '", style: "z-index:100003" })); var d = $("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), h = d.outerHeight(), m = d.outerWidth(), p = $(window).width(), f = $(window).height(), g = $(document).scrollLeft(), v = $(document).scrollTop(); $("#luckysheet-search-formula-parm").css({ left: (p + g - m) / 2, top: (f + v - h) / 3 }).show(), $("#luckysheet-search-formula-parm .parmBox:eq(0) input").focus(), $("#luckysheet-search-formula-parm .parmBox").each((function (e, t) { var a = $(t).find(".txt input").val(); if (null == Ih.getfunctionParam(a).fn) if (Ih.iscelldata(a)) { var r = eh(a).data; if ("array" == Cm(r)) { for (var n = [], l = 0; l < r.length; l++)for (var i = 0; i < r[l].length; i++) { var o = r[l][i]; null == o || ya(o.v) ? n.push(null) : n.push(o.v) } $("#luckysheet-search-formula-parm .parmBox").eq(e).find(".val").text(" = {" + n.join(",") + "}") } else $("#luckysheet-search-formula-parm .parmBox").eq(e).find(".val").text(" = {" + r.v + "}") } else $("#luckysheet-search-formula-parm .parmBox").eq(e).find(".val").text(" = {" + a + "}"); else $("#luckysheet-search-formula-parm .parmBox").eq(e).find(".val").text(" = {" + new Function("return " + $.trim(Ih.functionParserExe("=" + a)))() + "}") })), $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").remove(), Ih.data_parm_index = 0, Ih.rangestart = !0 }, parmTxtShow: function (e) { if (null == Ih.getfunctionParam(e).fn) if (Ih.iscelldata(e)) { var t = Ih.getcellrange(e), a = t.row[0], r = t.row[1], n = t.column[0], l = t.column[1], i = ga.visibledatarow[r], o = a - 1 == -1 ? 0 : ga.visibledatarow[a - 1], s = ga.visibledatacolumn[l], c = n - 1 == -1 ? 0 : ga.visibledatacolumn[n - 1]; $("#luckysheet-formula-functionrange-select").css({ left: c, width: s - c - 1, top: o, height: i - o - 1 }).show(), $("#luckysheet-formula-help-c").hide(), Mh(c, o, s - c - 1, i - o - 1, t.row, t.column); var u = eh(e).data; if ("array" == Cm(u)) { for (var d = [], h = 0; h < u.length; h++)for (var m = 0; m < u[h].length; m++) { var p = u[h][m]; null == p || ya(p.v) ? d.push(null) : d.push(p.v) } $("#luckysheet-search-formula-parm .parmBox").eq(Ih.data_parm_index).find(".val").text(" = {" + d.join(",") + "}") } else $("#luckysheet-search-formula-parm .parmBox").eq(Ih.data_parm_index).find(".val").text(" = {" + u.v + "}") } else $("#luckysheet-search-formula-parm .parmBox").eq(Ih.data_parm_index).find(".val").text(" = {" + e + "}"), $("#luckysheet-formula-functionrange-select").hide(); else { for (var f, g = 0; g < Ih.getfunctionParam(e).param.length; g++)if (Ih.iscelldata(Ih.getfunctionParam(e).param[g])) { f = Ih.getfunctionParam(e).param[g]; break } var v = Ih.getcellrange(f), y = v.row[0], b = v.row[1], k = v.column[0], x = v.column[1], w = ga.visibledatarow[b], _ = y - 1 == -1 ? 0 : ga.visibledatarow[y - 1], C = ga.visibledatacolumn[x], T = k - 1 == -1 ? 0 : ga.visibledatacolumn[k - 1]; $("#luckysheet-formula-functionrange-select").css({ left: T, width: C - T - 1, top: _, height: w - _ - 1 }).show(), $("#luckysheet-formula-help-c").hide(), Mh(T, _, C - T - 1, w - _ - 1, v.row, v.column), $("#luckysheet-search-formula-parm .parmBox").eq(Ih.data_parm_index).find(".val").text(" = {" + new Function("return " + $.trim(Ih.functionParserExe("=" + e)))() + "}") } }, functionStrCompute: function () { var e, t = !0, a = [], r = -1, n = $("#luckysheet-search-formula-parm").find(".luckysheet-modal-dialog-title-text").text(), l = ga.luckysheet_function[n].p; if ($("#luckysheet-search-formula-parm .parmBox").each((function (e, a) { var n, i = $(a).find(".txt input").val(); n = e < l.length ? l[e].require : l[l.length - 1].require, "" == i && "m" == n && (t = !1), "" != i && (r = e) })), -1 == r) e = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "()"; else if (0 == r) e = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + $("#luckysheet-search-formula-parm .parmBox").eq(0).find(".txt input").val() + ")"; else { for (var i = 0; i <= r; i++)a.push($("#luckysheet-search-formula-parm .parmBox").eq(i).find(".txt input").val()); e = "=" + $("#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text").text() + "(" + a.join(",") + ")" } var o = Ih.functionHTMLGenerate(e); if ($("#luckysheet-rich-text-editor").html(o), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), t) { var s = $.trim(Ih.functionParserExe($("#luckysheet-rich-text-editor").text())), c = null; try { c = new Function("return " + s)() } catch (e) { c = Ih.error.n } $("#luckysheet-search-formula-parm .result span").text(c) } } }, xm = { menu: '
      ${item}
      ', item: '
      ${name} ${example}
      ', split: '', color: '
      ${resetColor}
      ${coloritem}
      ', coloritem: '
      ${name}
      ', subcolor: '
      ', rightclickmenu: null, submenuhide: {}, focus: function (e, t) { "luckysheet-icon-font-family-menuButton" == e.attr("id") && (ms(t).num && null == (t = gn().fontarray[parseInt(t)]) && (t = this.defualtFont[itemvalue])); e.find(".luckysheet-cols-menuitem").find("span.icon").html(""), null == t ? e.find(".luckysheet-cols-menuitem").eq(0).find("span.icon").html('') : e.find(".luckysheet-cols-menuitem[itemvalue='" + t + "']").find("span.icon").html('') }, createButtonMenu: function (e) { for (var t = "", a = 0; a < e.length; a++) { var r = e[a]; "split" == r.value ? t += this.split : "more" == r.example ? t += _m(this.item, { value: r.value, name: r.text, example: "", sub: "luckysheet-cols-submenu", iconClass: "iconfont luckysheet-iconfont-youjiantou" }) : t += _m(this.item, { value: r.value, name: r.text, example: r.example, sub: "", iconClass: "" }) } return t }, cancelPaintModel: function () { $("#luckysheet-sheettable_0").removeClass("luckysheetPaintCursor"), ga.luckysheet_copy_save.dataSheetIndex == ga.currentSheetIndex ? (ga.luckysheet_selection_range = [], Eh()) : ga.luckysheetfile[_l(ga.luckysheet_copy_save.dataSheetIndex)].luckysheet_selection_range = [], ga.luckysheet_copy_save = {}, this.luckysheetPaintModelOn = !1, $("#luckysheetpopover").fadeOut(200, (function () { $("#luckysheetpopover").remove() })) }, luckysheetPaintModelOn: !1, luckysheetPaintSingle: !1, initialMenuButton: function () { var e = this; $("#luckysheet-icon-paintformat").click((function () { var t = gn().paint; if (null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length) if (ga.luckysheet_select_save.length > 1) wa() ? alert(t.tipNotMulti) : fd.info("", t.tipNotMulti); else { fd.popover(" " + t.start, "topCenter", !0, null, t.end, (function () { e.cancelPaintModel() })), $("#luckysheet-sheettable_0").addClass("luckysheetPaintCursor"), ga.luckysheet_selection_range = [{ row: ga.luckysheet_select_save[0].row, column: ga.luckysheet_select_save[0].column }], Eh(); for (var a = !1, r = !1, n = ga.luckysheet_select_save[0].row[0]; n <= ga.luckysheet_select_save[0].row[1]; n++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[n]) { null != ga.config.rowlen && n in ga.config.rowlen && (a = !0); for (var l = ga.luckysheet_select_save[0].column[0]; l <= ga.luckysheet_select_save[0].column[1]; l++) { var i = ga.flowdata[n][l]; "object" == Cm(i) && "mc" in i && null != i.mc.rs && (r = !0) } } ga.luckysheet_copy_save = { dataSheetIndex: ga.currentSheetIndex, copyRange: [{ row: ga.luckysheet_select_save[0].row, column: ga.luckysheet_select_save[0].column }], RowlChange: a, HasMC: r }, e.luckysheetPaintModelOn = !0, e.luckysheetPaintSingle = !0 } else wa() ? alert(t.tipSelectRange) : fd.info("", t.tipSelectRange) })), $("#luckysheet-icon-paintformat").dblclick((function () { var t = gn().paint; if (null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length) if (ga.luckysheet_select_save.length > 1) wa() ? alert(t.tipNotMulti) : fd.info("", t.tipNotMulti); else { fd.popover(" " + t.start, "topCenter", !0, null, t.end, (function () { e.cancelPaintModel() })), $("#luckysheet-sheettable_0").addClass("luckysheetPaintCursor"), ga.luckysheet_selection_range = [{ row: ga.luckysheet_select_save[0].row, column: ga.luckysheet_select_save[0].column }], Eh(); for (var a = !1, r = !1, n = ga.luckysheet_select_save[0].row[0]; n <= ga.luckysheet_select_save[0].row[1]; n++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[n]) { null != ga.config.rowlen && n in ga.config.rowlen && (a = !0); for (var l = ga.luckysheet_select_save[0].column[0]; l <= ga.luckysheet_select_save[0].column[1]; l++) { var i = ga.flowdata[n][l]; "object" == Cm(i) && "mc" in i && null != i.mc.rs && (r = !0) } } ga.luckysheet_copy_save = { dataSheetIndex: ga.currentSheetIndex, copyRange: [{ row: ga.luckysheet_select_save[0].row, column: ga.luckysheet_select_save[0].column }], RowlChange: a, HasMC: r }, e.luckysheetPaintModelOn = !0, e.luckysheetPaintSingle = !1 } else wa() ? alert(t.tipSelectRange) : fd.info("", t.tipSelectRange) })), $("#luckysheet-icon-currency").click((function () { var t = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(t, "ct", "¥ #.00") })), $("#luckysheet-icon-percent").click((function () { var t = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(t, "ct", "0.00%") })), $("#luckysheet-icon-fmt-decimal-decrease").click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[0].row_focus, r = ga.luckysheet_select_save[0].column_focus, n = e.checkstatus(t, a, r, "ct"), l = t[a][r]; if (null != n && "n" == n.t) { if ("General" == n.fa) n = xs(l.v)[1]; if (/^(w|W)((0?)|(0\.0+))$/.test(n.fa)) n.fa.indexOf(".") > -1 ? ".0" == n.fa.substr(-2) ? e.updateFormat(t, "ct", n.fa.split(".")[0]) : e.updateFormat(t, "ct", n.fa.substr(0, n.fa.length - 1)) : e.updateFormat(t, "ct", n.fa); else { var i = "", o = ""; if (n.fa.indexOf(".") > -1) { i = (s = n.fa.split("."))[0]; for (var s = (o = s[1]).split(""), c = "", u = s.length - 1; u >= 0; u--) { var d = s[u]; if ("#" == d || "0" == d || "," == d || !isNaN(parseInt(d))) break; c = d + c } var h = ""; if (n.fa.indexOf(".") > -1) { var m = o; c.length > 0 && (m = o.replace(c, "")); var p = m.replace(/#/g, "0"); h = "" == (p = p.substr(0, p.length - 1)) ? i + c : i + "." + p + c } e.updateFormat(t, "ct", h) } } } })), $("#luckysheet-icon-fmt-decimal-increase").click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[0].row_focus, r = ga.luckysheet_select_save[0].column_focus, n = e.checkstatus(t, a, r, "ct"), l = t[a][r]; if (null != n && "n" == n.t) { if ("General" == n.fa) n = xs(l.v)[1]; if ("General" != n.fa) { if (/^(w|W)((0?)|(0\.0+))$/.test(n.fa)) n.fa.indexOf(".") > -1 ? e.updateFormat(t, "ct", n.fa + "0") : "0" == n.fa.substr(-1) ? e.updateFormat(t, "ct", n.fa + ".0") : e.updateFormat(t, "ct", n.fa + "0.0"); else { var i = "", o = ""; n.fa.indexOf(".") > -1 ? (i = (s = n.fa.split("."))[0], o = s[1]) : o = n.fa; for (var s = o.split(""), c = "", u = s.length - 1; u >= 0; u--) { var d = s[u]; if ("#" == d || "0" == d || "," == d || !isNaN(parseInt(d))) break; c = d + c } var h = ""; if (n.fa.indexOf(".") > -1) { var m = o; c.length > 0 && (m = o.replace(c, "")); var p = m.replace(/#/g, "0"); h = i + "." + (p += "0") + c } else h = c.length > 0 ? o.replace(c, "") + ".0" + c : o + ".0" + c; e.updateFormat(t, "ct", h) } } else e.updateFormat(t, "ct", "#.0") } })), $("#luckysheet-icon-fmt-other").click((function () { var t = gn(), a = t.format, r = t.defaultFmt, n = $(this).attr("id") + "-menuButton", l = $("#" + n); if (0 == l.length) { var i = r, o = e.createButtonMenu(i), s = _m(e.menu, { id: "fmt-other", item: o, subclass: "", sub: "" }), c = [{ text: a.moreCurrency + "...", value: "morecurrency", example: "" }, { text: a.moreDateTime + "...", value: "moredatetime", example: "" }, { text: a.moreNumber + "...", value: "moredigit", example: "" }], u = e.createButtonMenu(c), d = _m(e.menu, { id: "fmtOtherSelf", item: u, subclass: "luckysheet-menuButton-sub" }); $("body").append(s + d), l = $("#" + n).width(250), e.focus(l), l.find(".luckysheet-cols-menuitem").click((function () { l.hide(), Em(); var t = $(this), a = t.attr("itemvalue"), r = t.attr("itemname"); if ($("#luckysheet-icon-fmt-other").find(".luckysheet-toolbar-menu-button-caption").html(" " + r + " "), "fmtOtherSelf" != a) { var n = rs.deepCopyFlowData(ga.flowdata); e.focus(l, a), e.updateFormat(n, "ct", a) } })), $("#luckysheet-icon-fmtOtherSelf-menuButton").find(".luckysheet-cols-menuitem").click((function () { l.hide(), $("#luckysheet-icon-fmtOtherSelf-menuButton").hide(), Em(); var e = $(this).attr("itemvalue"); Ph.createDialog(e), Ph.init() })) } else { var h = $(this).find(".luckysheet-toolbar-menu-button-caption").text().trim(), m = r.find((function (e) { return e.text === h })); m && e.focus(l, m.value) } var p = $(this).outerWidth(), f = l.outerWidth(), g = $(this).offset().left; f > p && f + g > $("#" + ga.container).width() && (g = g - f + p), Pm(l, g, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-font-family").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = e.createButtonMenu(e.fontSelectList), n = _m(e.menu, { id: "font-family", item: r, subclass: "", sub: "" }); $("body").append(n), a = $("#" + t).width(200), e.focus(a), a.on("click", ".luckysheet-cols-menuitem", (function () { a.hide(), Em(); var t = $(this), r = t.attr("itemvalue"), n = t.attr("itemname"); e.focus(a, r), $("#luckysheet-icon-font-family").find(".luckysheet-toolbar-menu-button-caption").html(" " + n + " "); var l = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(l, "ff", r) })) } var l = $(this).outerWidth(), i = a.outerWidth(), o = $(this).offset().left; i > l && i + o > $("#" + ga.container).width() && (o = o - i + l), Pm(a, o, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-text-color").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = $(this).attr("color"); null == a && (a = "#000000"), e.updateFormat(t, "fc", a) })), $("#luckysheet-icon-text-color-menu").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn(), n = r.toolbar, l = r.button, i = r.alternatingColors, o = [{ name: n.alternatingColors + "...", id: "luckysheet-color-alternate", example: "" }], s = (e.createButtonMenu(o), _m(e.coloritem, { class: "luckysheet-icon-alternateformat", name: n.alternatingColors + "..." })), c = _m(e.color, { id: t, coloritem: s, colorself: "text-color-self", sub: "", resetColor: n.resetColor }); $("body").append(c), a = $("#" + t), $("#" + t).find(".luckysheet-color-selected").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, maxPaletteSize: 8, maxSelectionSize: 8, cancelText: l.cancel, chooseText: l.confirm, togglePaletteMoreText: n.customColor, togglePaletteLessText: n.collapse, togglePaletteOnly: !0, clearText: n.clearText, color: fa.defaultTextColor, noColorSelectedText: n.noColorSelectedText, localStorageKey: "spectrum.textcolor" + pd.gridKey, palette: [["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"], ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"], ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"], ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"], ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"], ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"], ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"], ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]], change: function (t) { t = null != t ? t.toHexString() : "#000", $("#luckysheet-icon-text-color .text-color-bar").css("background-color", t), $("#luckysheet-icon-text-color").attr("color", t); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "fc", t), a.hide(), Em(), $("#luckysheet-input-box").css("color", t) } }), a.find(".luckysheet-color-reset").click((function () { a.hide(), Em(); var r = $("#" + t).find(".luckysheet-color-selected"); r.val("#000000"), $("#luckysheet-icon-text-color").attr("color", null), r.spectrum("set", "#000000"), $("#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator").css("border-bottom-color", "#000000"); var n = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(n, "fc", null) })), a.find(".luckysheet-icon-alternateformat").click((function () { if (a.hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(i.errorInfo) : fd.info(i.errorInfo, ""); else { var e = $.extend(!0, {}, ga.luckysheet_select_save[0]); wc.rangeIsExists(e)[0] || (wc.modelfocusIndex = 0, wc.new(e)), wc.init(), wc.perfect() } })) } var u = $(this).outerWidth(), d = a.outerWidth(), h = $(this).offset().left; d > u && d + h > $("#" + ga.container).width() && (h = h - d + u); var m = $(this).offset().top + 26; setTimeout((function () { var e = $("#" + t).find(".luckysheet-color-selected"); e.spectrum("set", e.val()), Pm(a, h - 28, m, "lefttop") }), 1) })), $("#luckysheet-icon-cell-color").click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = $(this).attr("color"); null == a && (a = "#ffffff"), e.updateFormat(t, "bg", a) })), $("#luckysheet-icon-cell-color-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn(), n = r.toolbar, l = r.button, i = r.alternatingColors, o = _m(e.coloritem, { class: "luckysheet-icon-alternateformat", name: n.alternatingColors + "..." }), s = _m(e.color, { id: t, coloritem: o, colorself: "cell-color-self", sub: "", resetColor: n.resetColor }); $("body").append(s), a = $("#" + t), $("#" + t).find(".luckysheet-color-selected").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, maxPaletteSize: 8, maxSelectionSize: 8, color: fa.defaultCellColor, cancelText: l.cancel, chooseText: l.confirm, togglePaletteMoreText: n.customColor, togglePaletteLessText: n.collapse, togglePaletteOnly: !0, clearText: n.clearText, noColorSelectedText: n.noColorSelectedText, localStorageKey: "spectrum.bgcolor" + pd.gridKey, palette: [["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"], ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"], ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"], ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"], ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"], ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"], ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"], ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]], change: function (t) { t = null != t ? t.toHexString() : "#fff", $("#luckysheet-icon-cell-color .text-color-bar").css("background-color", t), $("#luckysheet-icon-cell-color").attr("color", t); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "bg", t), a.hide(), Em() } }), a.find(".luckysheet-color-reset").click((function () { a.hide(), Em(); var r = $("#" + t).find(".luckysheet-color-selected"); r.val("#ffffff"), $("#luckysheet-icon-cell-color").attr("color", null), r.spectrum("set", "#ffffff"), $("#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator").css("border-bottom-color", "#ffffff"); var n = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(n, "bg", null) })), a.find(".luckysheet-icon-alternateformat").click((function () { if (a.hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(i.errorInfo) : fd.info(i.errorInfo, ""); else { var e = $.extend(!0, {}, ga.luckysheet_select_save[0]); wc.rangeIsExists(e)[0] || (wc.modelfocusIndex = 0, wc.new(e)), wc.init(), wc.perfect() } })), $("#" + t).find(".luckysheet-color-selected").val("#fff") } var c = $(this).outerWidth(), u = a.outerWidth(), d = $(this).offset().left; u > c && u + d > $("#" + ga.container).width() && (d = d - u + c); var h = $(this).offset().top + 26; setTimeout((function () { var e = $("#" + t).find(".luckysheet-color-selected"); e.spectrum("set", e.val()), Pm(a, d - 28, h, "lefttop") }), 1) })); var t = null; $("#luckysheet-icon-font-size").mousedown((function (e) { if (parseInt($("#luckysheet-input-box").css("top")) > 0) { var t = window.getSelection(); if ("None" != t.type) { var a = t.getRangeAt(0); a.collapsed || (ga.inlineStringEditRange = a.cloneRange()) } } Do(e), e.stopPropagation() })).click((function () { var a = $(this).attr("id") + "-menuButton", r = $("#" + a); if (0 == r.length) { var n = e.createButtonMenu([{ text: "9", value: "9", example: "" }, { text: "10", value: "10", example: "" }, { text: "11", value: "11", example: "" }, { text: "12", value: "12", example: "" }, { text: "14", value: "14", example: "" }, { text: "16", value: "16", example: "" }, { text: "18", value: "18", example: "" }, { text: "20", value: "20", example: "" }, { text: "22", value: "22", example: "" }, { text: "24", value: "24", example: "" }, { text: "26", value: "26", example: "" }, { text: "28", value: "28", example: "" }, { text: "36", value: "36", example: "" }, { text: "48", value: "48", example: "" }, { text: "72", value: "72", example: "" }]), l = _m(e.menu, { id: "font-size", item: n, subclass: "", sub: "" }); $("body").append(l), r = $("#" + a).width(150), e.focus(r, 10), r.find(".luckysheet-cols-menuitem").click((function () { r.hide(), Em(); var a = $(this).attr("itemvalue"), n = $("#luckysheet-icon-font-size input"); $("#luckysheet-icon-font-size").attr("itemvalue", a), e.focus(r, a), n.val(a); var l = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(l, "fs", a), clearTimeout(t) })) } var i = $(this).outerWidth(), o = r.outerWidth(), s = $("#luckysheet-icon-font-size").attr("itemvalue"); null == s && (s = 10), e.focus(r, s); var c = $(this).offset().left; o > i && o + c > $("#" + ga.container).width() && (c = c - o + i), Pm(r, c, $(this).offset().top + 25, "lefttop") })).find("input.luckysheet-toolbar-textinput").keydown((function (e) { Do(e), e.stopPropagation() })).keyup((function (a) { if (13 == a.keyCode) { var r = $(this), n = parseInt(r.val()), l = $("#luckysheet-icon-font-size-menuButton"); e.focus(l, n); var i = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(i, "fs", n), t = setTimeout((function () { l.hide(), r.blur() }), 200) } })), $("#luckysheet-icon-border-all").click((function () { if (yu(ga.currentSheetIndex)) { rs.deepCopyFlowData(ga.flowdata); var e = $(this).attr("type"); null == e && (e = "border-all"); var t = $("#luckysheet-icon-borderColor-menuButton").find(".luckysheet-color-selected").val(), a = $("#luckysheetborderSizepreview").attr("itemvalue"); null != t && "" != t || (t = "#000"), null != a && "" != a || (a = "1"); var r = $.extend(!0, {}, ga.config); null == r.borderInfo && (r.borderInfo = []); var n = { rangeType: "range", borderType: e, color: t, style: a, range: $.extend(!0, [], ga.luckysheet_select_save) }; if (r.borderInfo.push(n), ga.clearjfundo) { ga.jfundo.length = 0; var l = []; l.type = "borderChange", l.config = $.extend(!0, {}, ga.config), l.curconfig = $.extend(!0, {}, r), l.sheetIndex = ga.currentSheetIndex, ga.jfredo.push(l) } pd.saveParam("cg", ga.currentSheetIndex, r.borderInfo, { k: "borderInfo" }), ga.config = r, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, setTimeout((function () { md() }), 1) } })), $("#luckysheet-icon-border-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn(), n = r.border, l = r.toolbar, i = r.button, o = [{ text: n.borderTop, value: "border-top", example: '
      ' }, { text: n.borderBottom, value: "border-bottom", example: '
      ' }, { text: n.borderLeft, value: "border-left", example: '
      ' }, { text: n.borderRight, value: "border-right", example: '
      ' }, { text: "", value: "split", example: "" }, { text: n.borderNone, value: "border-none", example: '
      ' }, { text: n.borderAll, value: "border-all", example: '
      ' }, { text: n.borderOutside, value: "border-outside", example: '
      ' }, { text: "", value: "split", example: "" }, { text: n.borderInside, value: "border-inside", example: '
      ' }, { text: n.borderHorizontal, value: "border-horizontal", example: '
      ' }, { text: n.borderVertical, value: "border-vertical", example: '
      ' }, { text: "", value: "split", example: "" }, { text: "" + n.borderColor + "", value: "borderColor", example: "more" }, { text: n.borderSize + "", value: "borderSize", example: "more" }], s = jn, c = e.createButtonMenu(o), u = _m(e.menu, { id: "border-menu", item: c, subclass: "", sub: "" }), d = [{ text: n.borderNone, value: "0", example: "" }, { text: "", value: "1", example: "" }, { text: "", value: "2", example: "" }, { text: "", value: "3", example: "" }, { text: "", value: "4", example: "" }, { text: "", value: "5", example: "" }, { text: "", value: "6", example: "" }, { text: "", value: "8", example: "" }, { text: "", value: "9", example: "" }, { text: "", value: "10", example: "" }, { text: "", value: "11", example: "" }, { text: "", value: "13", example: "" }], h = e.createButtonMenu(d), m = _m(e.menu, { id: "borderSize", item: h, subclass: "luckysheet-menuButton-sub" }), p = "luckysheet-icon-borderSize-menuButton", f = "luckysheet-icon-borderColor-menuButton", g = _m(e.color, { id: f, coloritem: "", colorself: "", sub: "luckysheet-menuButton-sub", resetColor: l.resetColor }); $("body").append(u + g + m), a = $("#" + t).width(170), e.focus(a, "border-all"), $("#" + p + " canvas").each((function (t) { $(this).attr("type"); var a = $(this).closest(".luckysheet-cols-menuitem").attr("itemvalue"), r = $(this).addClass("luckysheet-mousedown-cancel").get(0).getContext("2d"); r.translate(.5, .5), e.setLineDash(r, a, "h", 0, 5, 100, 5), r.strokeStyle = "#000000", r.stroke(), r.closePath() })), $("#" + p + " .luckysheet-cols-menuitem").click((function () { $("#" + p).hide(); var t = $(this), a = t.attr("itemvalue"); if (0 == a) $("#luckysheetborderSizepreview").attr("src", "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==").attr("itemvalue", null); else { var r = t.find("canvas").get(0).toDataURL("image/png"); $("#luckysheetborderSizepreview").attr("src", r).attr("itemvalue", a) } e.focus($("#" + p), a) })), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); if ("borderColor" != t && "borderSize" != t && yu(ga.currentSheetIndex)) { rs.deepCopyFlowData(ga.flowdata); var r = $("#" + f).find(".luckysheet-color-selected").val(), n = $("#luckysheetborderSizepreview").attr("itemvalue"); null != r && "" != r || (r = "#000"), null != n && "" != n || (n = "1"); var l = $.extend(!0, {}, ga.config); null == l.borderInfo && (l.borderInfo = []); var i = { rangeType: "range", borderType: t, color: r, style: n, range: $.extend(!0, [], ga.luckysheet_select_save) }; if (l.borderInfo.push(i), ga.clearjfundo) { ga.jfundo.length = 0; var o = []; o.type = "borderChange", o.config = $.extend(!0, {}, ga.config), o.curconfig = $.extend(!0, {}, l), o.sheetIndex = ga.currentSheetIndex, ga.jfredo.push(o) } pd.saveParam("cg", ga.currentSheetIndex, l.borderInfo, { k: "borderInfo" }), ga.config = l, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, setTimeout((function () { md() }), 1), $("#luckysheet-icon-border-all").attr("type", t), $("#luckysheet-icon-border-all").find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-" + t + s[t]), e.focus(a, t) } })), $("#" + f).find(".luckysheet-color-selected").spectrum({ showPalette: !0, showPaletteOnly: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !0, showSelectionPalette: !0, maxPaletteSize: 8, maxSelectionSize: 8, color: "#000", cancelText: i.cancel, chooseText: i.confirm, togglePaletteMoreText: l.customColor, togglePaletteLessText: l.collapse, togglePaletteOnly: !0, clearText: l.clearText, noColorSelectedText: l.noColorSelectedText, localStorageKey: "spectrum.bordercolor" + pd.gridKey, palette: [["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"], ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"], ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"], ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"], ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"], ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"], ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"], ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]], change: function (e) { $(this); e = null != e ? e.toHexString() : "#000", $("#luckysheet-icon-borderColor-linecolor").css("border-bottom-color", e), $("#" + f).find(".luckysheet-color-selected").val(e) } }), $("#" + f).find(".luckysheet-color-reset").click((function () { var e = $("#" + f).find(".luckysheet-color-selected"); e.val("#000"), $("#luckysheet-icon-cell-color").attr("color", null), e.spectrum("set", "#000"), $("#luckysheet-icon-borderColor-linecolor").css("border-bottom-color", "#000") })) } var v = $(this).outerWidth(), y = a.outerWidth(), b = $(this).offset().left; y > v && y + b > $("#" + ga.container).width() && (b = b - y + v), Pm(a, b - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-merge-button").click((function () { if (hu(ga.currentSheetIndex)) if (Dh()) wa() ? alert("不能合并重叠区域") : fd.info("不能合并重叠区域", ""); else { if (null != ga.config.merge) { for (var t = !1, a = 0; a < ga.luckysheet_select_save.length; a++) { var r = ga.luckysheet_select_save[a].row[0], n = ga.luckysheet_select_save[a].row[1], l = ga.luckysheet_select_save[a].column[0], i = ga.luckysheet_select_save[a].column[1]; if (t = _a(ga.config, r, n, l, i)) break } if (t) return void (wa() ? alert("无法对部分合并单元格执行此操作") : fd.info("无法对部分合并单元格执行此操作", "")) } var o = rs.deepCopyFlowData(ga.flowdata); e.updateFormat_mc(o, "mergeAll") } })), $("#luckysheet-icon-merge-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn().merge, n = [{ text: r.mergeAll, value: "mergeAll", example: "" }, { text: r.mergeV, value: "mergeV", example: "" }, { text: r.mergeH, value: "mergeH", example: "" }, { text: r.mergeCancel, value: "mergeCancel", example: "" }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "merge-menu", item: l, subclass: "", sub: "" }); $("body").append(i), a = $("#" + t).width(110), e.focus(a), a.find(".luckysheet-cols-menuitem").click((function () { if (a.hide(), Em(), Dh()) wa() ? alert(r.overlappingError) : fd.info(r.overlappingError, ""); else { if (null != ga.config.merge) { for (var t = !1, n = 0; n < ga.luckysheet_select_save.length; n++) { var l = ga.luckysheet_select_save[n].row[0], i = ga.luckysheet_select_save[n].row[1], o = ga.luckysheet_select_save[n].column[0], s = ga.luckysheet_select_save[n].column[1]; if (t = _a(ga.config, l, i, o, s)) break } if (t) return void (wa() ? alert(r.partiallyError) : fd.info(r.partiallyError, "")) } var c = $(this).attr("itemvalue"); e.focus(a, c); var u = rs.deepCopyFlowData(ga.flowdata); e.updateFormat_mc(u, c) } })) } var o = $(this).outerWidth(), s = a.outerWidth(), c = $(this).offset().left; s > o && s + c > $("#" + ga.container).width() && (c = c - s + o), Pm(a, c - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-align").click((function () { var t = $("#luckysheet-icon-align").attr("type"); null == t && (t = "left"); var a = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(a, "ht", t) })), $("#luckysheet-icon-align-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn().align, n = [{ text: r.left, value: "left", example: '
      ' }, { text: r.center, value: "center", example: '
      ' }, { text: r.right, value: "right", example: '
      ' }], l = Gn, i = e.createButtonMenu(n), o = _m(e.menu, { id: "align-menu", item: i, subclass: "", sub: "" }); $("body").append(o), a = $("#" + t).width(120), e.focus(a), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); e.focus(a, t), $("#luckysheet-icon-align").attr("type", t).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-" + t + l[t]); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "ht", t) })) } var s = $(this).outerWidth(), c = a.outerWidth(), u = $(this).offset().left; c > s && c + u > $("#" + ga.container).width() && (u = u - c + s), Pm(a, u - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-valign").click((function () { var t = $("#luckysheet-icon-valign").attr("type"); null == t && (t = "bottom"); var a = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(a, "vt", t) })), $("#luckysheet-icon-valign-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().align; if (0 == a.length) { var n = [{ text: r.top, value: "top", example: '
      ' }, { text: r.middle, value: "middle", example: '
      ' }, { text: r.bottom, value: "bottom", example: '
      ' }], l = Gn, i = e.createButtonMenu(n), o = _m(e.menu, { id: "valign-menu", item: i, subclass: "", sub: "" }); $("body").append(o), a = $("#" + t).width(120), e.focus(a, "bottom"), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); e.focus(a, t), $("#luckysheet-icon-valign").attr("type", t).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-" + t + l[t]); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "vt", t) })) } var s = $(this).outerWidth(), c = a.outerWidth(), u = $(this).offset().left; c > s && c + u > $("#" + ga.container).width() && (u = u - c + s), Pm(a, u - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-textwrap-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn().textWrap, n = [{ text: r.overflow, value: "overflow", example: '
      ' }, { text: r.wrap, value: "wrap", example: '
      ' }, { text: r.clip, value: "clip", example: '
      ' }], l = Wn, i = e.createButtonMenu(n), o = _m(e.menu, { id: "textwrap-menu", item: i, subclass: "", sub: "" }); $("body").append(o), a = $("#" + t).width(120), e.focus(a, "clip"), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); e.focus(a, t), $("#luckysheet-icon-textwrap").attr("type", t).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-" + t + l[t]); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "tb", t) })) } var s = $(this).outerWidth(), c = a.outerWidth(), u = $(this).offset().left; c > s && c + u > $("#" + ga.container).width() && (u = u - c + s), Pm(a, u - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-rotation-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn().rotation, n = [{ text: r.none, value: "none", example: '
      ' }, { text: r.angleup, value: "angleup", example: '
      ' }, { text: r.angledown, value: "angledown", example: '
      ' }, { text: r.vertical, value: "vertical", example: '
      ' }, { text: r.rotationUp, value: "rotation-up", example: '
      ' }, { text: r.rotationDown, value: "rotation-down", example: '
      ' }], l = Yn, i = e.createButtonMenu(n), o = _m(e.menu, { id: "rotation-menu", item: i, subclass: "", sub: "" }); $("body").append(o), a = $("#" + t).width(160), e.focus(a), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); e.focus(a, t), $("#luckysheet-icon-rotation").attr("type", t).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-" + t + l[t]); var r = rs.deepCopyFlowData(ga.flowdata); e.updateFormat(r, "tr", t) })) } var s = $(this).outerWidth(), c = a.outerWidth(), u = $(this).offset().left; c > s && c + u > $("#" + ga.container).width() && (u = u - c + s), Pm(a, u - 28, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-freezen-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn().freezen, n = [{ text: r.freezenRow, value: "freezenRow", example: "" }, { text: r.freezenColumn, value: "freezenColumn", example: "" }, { text: r.freezenRC, value: "freezenRC", example: "" }, { text: "", value: "split", example: "" }, { text: r.freezenRowRange, value: "freezenRowRange", example: "" }, { text: r.freezenColumnRange, value: "freezenColumnRange", example: "" }, { text: r.freezenRCRange, value: "freezenRCRange", example: "" }, { text: "", value: "split", example: "" }, { text: r.freezenCancel, value: "freezenCancel", example: "" }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "freezen-menu", item: l, subclass: "", sub: "" }); $("body").append(i), (a = $("#" + t).width(170)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); if (e.focus(a, t), Bc.saveFrozen(t), "freezenRow" == t) { var n = $("#luckysheet-cell-main").scrollTop(), l = Ts(ga.visibledatarow, n); -1 == l && (l = 0); var i = ga.visibledatarow[l] - 2 - n + ga.columnHeaderHeight, o = [ga.visibledatarow[l], l + 1, n, Bc.cutVolumn(ga.visibledatarow, l + 1), i]; Bc.saveFreezen(o, i, null, null), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), Bc.createFreezenHorizontal(o, i), Bc.createAssistCanvas(), md() } else if ("freezenColumn" == t) { var s = $("#luckysheet-cell-main").scrollLeft(), c = Ts(ga.visibledatacolumn, s); -1 == c && (c = 0); var u = ga.visibledatacolumn[c] - 2 - s + ga.rowHeaderWidth, d = [ga.visibledatacolumn[c], c + 1, s, Bc.cutVolumn(ga.visibledatacolumn, c + 1), u]; Bc.saveFreezen(null, null, d, u), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.createFreezenVertical(d, u), Bc.createAssistCanvas(), md() } else if ("freezenRC" == t) { var h = $("#luckysheet-cell-main").scrollTop(), m = Ts(ga.visibledatarow, h); -1 == m && (m = 0); var p = ga.visibledatarow[m] - 2 - h + ga.columnHeaderHeight, f = [ga.visibledatarow[m], m + 1, h, Bc.cutVolumn(ga.visibledatarow, m + 1), p]; Bc.saveFreezen(f, p, null, null), Bc.createFreezenHorizontal(f, p); var g = $("#luckysheet-cell-main").scrollLeft(), v = Ts(ga.visibledatacolumn, g); -1 == v && (v = 0); var y = ga.visibledatacolumn[v] - 2 - g + ga.rowHeaderWidth, b = [ga.visibledatacolumn[v], v + 1, g, Bc.cutVolumn(ga.visibledatacolumn, v + 1), y]; Bc.saveFreezen(null, null, b, y), Bc.createFreezenVertical(b, y), Bc.createAssistCanvas(), md() } else if ("freezenRowRange" == t) { if (null == ga.luckysheet_select_save || 0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.noSeletionError) : fd.info(r.noSeletionError, "")); var k = $("#luckysheet-cell-main").scrollTop(), x = Ts(ga.visibledatarow, k), w = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], _ = null == w.row_focus ? w.row[0] : w.row_focus; _ > x && (x = _), -1 == x && (x = 0); var C = ga.visibledatarow[x] - 2 - k + ga.columnHeaderHeight, T = [ga.visibledatarow[x], x + 1, k, Bc.cutVolumn(ga.visibledatarow, x + 1), C]; Bc.saveFreezen(T, C, null, null), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), Bc.createFreezenHorizontal(T, C), Bc.createAssistCanvas(), md() } else if ("freezenColumnRange" == t) { if (null == ga.luckysheet_select_save || 0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.noSeletionError) : fd.info(r.noSeletionError, "")); var A = $("#luckysheet-cell-main").scrollLeft(), S = Ts(ga.visibledatacolumn, A), I = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], R = null == I.column_focus ? I.column[0] : I.column_focus; R > S && (S = R), -1 == S && (S = 0); var q = ga.visibledatacolumn[S] - 2 - A + ga.rowHeaderWidth, D = [ga.visibledatacolumn[S], S + 1, A, Bc.cutVolumn(ga.visibledatacolumn, S + 1), q]; Bc.saveFreezen(null, null, D, q), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.createFreezenVertical(D, q), Bc.createAssistCanvas(), md() } else if ("freezenRCRange" == t) { if (null == ga.luckysheet_select_save || 0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.noSeletionError) : fd.info(r.noSeletionError, "")); var F = $("#luckysheet-cell-main").scrollTop(), E = Ts(ga.visibledatarow, F), M = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], N = null == M.row_focus ? M.row[0] : M.row_focus; N > E && (E = N), -1 == E && (E = 0); var P = ga.visibledatarow[E] - 2 - F + ga.columnHeaderHeight, z = [ga.visibledatarow[E], E + 1, F, Bc.cutVolumn(ga.visibledatarow, E + 1), P]; Bc.saveFreezen(z, P, null, null), Bc.createFreezenHorizontal(z, P); var L = $("#luckysheet-cell-main").scrollLeft(), O = Ts(ga.visibledatacolumn, L), B = null == M.column_focus ? M.column[0] : M.column_focus; B > O && (O = B), -1 == O && (O = 0); var V = ga.visibledatacolumn[O] - 2 - L + ga.rowHeaderWidth, H = [ga.visibledatacolumn[O], O + 1, L, Bc.cutVolumn(ga.visibledatacolumn, O + 1), V]; Bc.saveFreezen(null, null, H, V), Bc.createFreezenVertical(H, V), Bc.createAssistCanvas(), md() } else "freezenCancel" == t && (null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.scrollAdapt()); setTimeout((function () { Uc() }), 0) })) } var o = $(this).outerWidth(), s = a.outerWidth(), c = $(this).offset().left; s > o && s + c > $("#" + ga.container).width() && (c = c - s + o), Pm(a, c - 68, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-autofilter").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t); if (0 == a.length) { var r = gn(), n = r.sort, l = r.filter, i = [{ text: n.asc, value: "asc", example: '' }, { text: n.desc, value: "desc", example: '' }, { text: n.custom + "...", value: "diysort", example: '' }, { text: "", value: "split", example: "" }, { text: l.filter, value: "filter", example: '' }, { text: l.clearFilter, value: "clearfilter", example: '' }], o = e.createButtonMenu(i), s = _m(e.menu, { id: "autofilter", item: o, subclass: "", sub: "" }); $("body").append(s), (a = $("#" + t).width(150)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var e = $(this).attr("itemvalue"); "diysort" == e ? $("#luckysheetorderby").click() : "asc" == e ? wu(!0) : "desc" == e ? wu(!1) : "filter" == e ? $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex).length > 0 ? $("#luckysheet-filter-initial").click() : Ac() : "clearfilter" == e && $("#luckysheet-filter-initial").click() })) } var c = $(this).outerWidth(), u = a.outerWidth(), d = $(this).offset().left; u > c && u + d > $("#" + ga.container).width() && (d = d - u + c), Pm(a, d, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-seachmore").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().findAndReplace; if (0 == a.length) { var n = [{ text: r.find + " ...", value: "search", example: '' }, { text: r.replace + " ...", value: "replace", example: '' }, { text: "", value: "split", example: "" }, { text: r.location + " ...", value: "location", example: '' }, { text: r.formula, value: "locationFormula", example: r.locationExample }, { text: r.date, value: "locationConstantDate", example: r.locationExample }, { text: r.number, value: "locationConstantNumber", example: r.locationExample }, { text: r.string, value: "locationConstantString", example: r.locationExample }, { text: r.error, value: "locationConstantError", example: r.locationExample }, { text: r.condition, value: "locationCF", example: r.locationExample }, { text: r.rowSpan, value: "locationStepRow", example: r.locationExample }, { text: r.columnSpan, value: "locationStepColumn", example: r.locationExample }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "seachmore", item: l, subclass: "", sub: "" }); $("body").append(i), (a = $("#" + t).width(180)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var e = $(this).attr("itemvalue"); if ("search" == e || "replace" == e) "search" == e ? zh.createDialog(0) : "replace" == e && zh.createDialog(1), zh.init(), $("#luckysheet-search-replace #searchInput input").focus(); else if ("location" == e) Lh.createDialog(), Lh.init(); else if ("locationFormula" == e || "locationConstantDate" == e || "locationConstantNumber" == e || "locationConstantString" == e || "locationConstantError" == e || "locationCF" == e) { var t, n = ga.luckysheet_select_save[0]; t = 0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && n.row[0] == n.row[1] && n.column[0] == n.column[1] ? [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1] }] : $.extend(!0, [], ga.luckysheet_select_save), "locationFormula" == e ? Lh.apply(t, "locationFormula", "all") : "locationConstantDate" == e ? Lh.apply(t, "locationConstant", "d") : "locationConstantNumber" == e ? Lh.apply(t, "locationConstant", "n") : "locationConstantString" == e ? Lh.apply(t, "locationConstant", "s,g") : "locationConstantError" == e ? Lh.apply(t, "locationConstant", "e") : "locationCF" == e && Lh.apply(t, "locationCF") } else if ("locationStepRow" == e) { if (0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].row[0] == ga.luckysheet_select_save[0].row[1]) return void (wa() ? alert(r.lessTwoRowTip) : fd.info("", r.lessTwoRowTip)); var l = $.extend(!0, [], ga.luckysheet_select_save); Lh.apply(l, "locationStepRow") } else if ("locationStepColumn" == e) { if (0 == ga.luckysheet_select_save.length || 1 == ga.luckysheet_select_save.length && ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1]) return void (wa() ? alert(r.lessTwoColumnTip) : fd.info("", r.lessTwoColumnTip)); var i = $.extend(!0, [], ga.luckysheet_select_save); Lh.apply(i, "locationStepColumn") } })) } var o = $(this).outerWidth(), s = a.outerWidth(), c = $(this).offset().left; s > o && s + c > $("#" + ga.container).width() && (c = c - s + o), Pm(a, c, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-function").click((function () { e.autoSelectionFormula("SUM") })), $("#luckysheet-icon-function-menu").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().formula; if (0 == a.length) { var n = [{ text: r.sum, value: "SUM", example: "SUM" }, { text: r.average, value: "AVERAGE", example: "AVERAGE" }, { text: r.count, value: "COUNT", example: "COUNT" }, { text: r.max, value: "MAX", example: "MAX" }, { text: r.min, value: "MIN", example: "MIN" }, { text: "", value: "split", example: "" }, { text: r.ifGenerate, value: "if", example: "IF" }, { text: r.find + " ...", value: "formula", example: "" }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "function-menu", item: l, subclass: "", sub: "" }); $("body").append(i), (a = $("#" + t).width(180)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var t = $(this).attr("itemvalue"); if ("if" == t) { var n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], l = null == n.row_focus ? n.row[0] : n.row_focus, i = null == n.column_focus ? n.column[0] : n.column_focus; if (ga.flowdata[l] && ga.flowdata[l][i] && ga.flowdata[l][i].f) { var o = ga.flowdata[l][i].f.toString(); if (-1 == o.indexOf("=if(")) return void (wa() ? alert(r.tipNotBelongToIf) : fd.info(r.tipNotBelongToIf, "")); bm.ifFormulaDialog(o) } else bm.ifFormulaDialog(); bm.init() } else if ("formula" == t) { if (0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.tipSelectCell) : fd.info(r.tipSelectCell, "")); var s = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], c = s.row_focus, u = s.column_focus; vm(c, u, ga.flowdata); var d = ga.flowdata[c][u]; if (null != d && null != d.f) { var h = Ih.getfunctionParam(d.f); null != h.fn ? km.formulaParmDialog(h.fn, h.param) : km.formulaListDialog() } else $("#luckysheet-rich-text-editor").html('='), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), km.formulaListDialog(); km.init() } else e.autoSelectionFormula(t) })) } var o = $(this).outerWidth(), s = a.outerWidth(), c = $(this).offset().left; s > o && s + c > $("#" + ga.container).width() && (c = c - s + o), Pm(a, c - 48, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-bold").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function (t) { var a = rs.deepCopyFlowData(ga.flowdata), r = ga.luckysheet_select_save[0].row_focus, n = ga.luckysheet_select_save[0].column_focus, l = e.checkstatus(a, r, n, "bl"); l = 1 == l ? 0 : 1, e.updateFormat(a, "bl", l), e.menuButtonFocus(a, r, n) })), $("#luckysheet-icon-italic").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[0].row_focus, r = ga.luckysheet_select_save[0].column_focus, n = e.checkstatus(t, a, r, "it"); n = 1 == n ? 0 : 1, e.updateFormat(t, "it", n), e.menuButtonFocus(t, a, r) })), $("#luckysheet-icon-strikethrough").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[0].row_focus, r = ga.luckysheet_select_save[0].column_focus, n = e.checkstatus(t, a, r, "cl"); n = 1 == n ? 0 : 1, e.updateFormat(t, "cl", n), e.menuButtonFocus(t, a, r) })), $("#luckysheet-icon-underline").mousedown((function (e) { Do(e), e.stopPropagation() })).click((function () { var t = rs.deepCopyFlowData(ga.flowdata), a = ga.luckysheet_select_save[0].row_focus, r = ga.luckysheet_select_save[0].column_focus, n = e.checkstatus(t, a, r, "un"); n = 1 == n ? 0 : 1, e.updateFormat(t, "un", n), e.menuButtonFocus(t, a, r) })), $("#luckysheet-icon-conditionformat").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().conditionformat; if (0 == a.length) { var n = [{ text: r.highlightCellRules, value: "highlightCellRule", example: "more" }, { text: r.itemSelectionRules, value: "projectSelectRule", example: "more" }, { text: r.dataBar, value: "dataBar", example: "more" }, { text: r.colorGradation, value: "colorGradation", example: "more" }, { text: r.icons, value: "icons", example: "" }, { text: "", value: "split", example: "" }, { text: r.newRule, value: "newRule", example: "" }, { text: r.deleteRule, value: "deleteRule", example: "more" }, { text: r.manageRules, value: "administerRule", example: "" }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "conditionformat", item: l, subclass: "", sub: "" }), o = [{ text: r.greaterThan, value: "greaterThan", example: ">" }, { text: r.lessThan, value: "lessThan", example: "<" }, { text: r.between, value: "betweenness", example: "[]" }, { text: r.equal, value: "equal", example: "=" }, { text: r.textContains, value: "textContains", example: "()" }, { text: r.occurrence, value: "occurrenceDate", example: r.yesterday }, { text: r.duplicateValue, value: "duplicateValue", example: "##" }], s = e.createButtonMenu(o), c = _m(e.menu, { id: "highlightCellRule", item: s, subclass: "luckysheet-menuButton-sub" }), u = [{ text: r.top10, value: "top10", example: r.top10 }, { text: r.top10_percent, value: "top10%", example: r.top10_percent }, { text: r.last10, value: "last10", example: r.last10 }, { text: r.last10_percent, value: "last10%", example: r.last10_percent }, { text: r.aboveAverage, value: "AboveAverage", example: r.above }, { text: r.belowAverage, value: "SubAverage", example: r.below }], d = e.createButtonMenu(u), h = _m(e.menu, { id: "projectSelectRule", item: d, subclass: "luckysheet-menuButton-sub" }), m = ''), p = ''), f = [{ text: r.deleteSheetRule, value: "delSheet", example: "" }], g = e.createButtonMenu(f), v = _m(e.menu, { id: "deleteRule", item: g, subclass: "luckysheet-menuButton-sub" }); $("body").append(i + c + h + m + p + v), a = $("#" + t).width(190), $("#luckysheet-icon-highlightCellRule-menuButton").width(160), $("#luckysheet-icon-projectSelectRule-menuButton").width(180), a.find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var e = $(this).attr("itemvalue"); if ("icons" == e) { if (0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.pleaseSelectRange) : fd.info(r.pleaseSelectRange, "")); gd.CFiconsDialog(), gd.init() } else if ("newRule" == e) { if (0 == ga.luckysheet_select_save.length) return void (wa() ? alert(r.pleaseSelectRange) : fd.info(r.pleaseSelectRange, "")); gd.newConditionRuleDialog(0), gd.init() } else if ("administerRule" == e) { var t = pd.loadSheetUrl, n = Tl(); if ("" != t && null != t) { for (var l = [], i = 0; i < n.length; i++)l.push(n[i].index); $.post(t, { gridKey: pd.gridKey, index: l.join(",") }, (function (e) { var t = new Function("return " + e)(); for (var a in setTimeout((function () { $("#luckysheetloadingdata").fadeOut().remove() }), 500), t) if (a != ga.currentSheetIndex) { var r = n[_l(a)]; r.celldata = t[a.toString()], r.data = Sh.buildGridData(r) } Rl(n), gd.fileClone = $.extend(!0, [], n), gd.administerRuleDialog(), gd.init() })) } else gd.fileClone = $.extend(!0, [], n), gd.administerRuleDialog(), gd.init() } })), $(document).off("click.CFhighlightCellRule").on("click.CFhighlightCellRule", "#luckysheet-icon-highlightCellRule-menuButton .luckysheet-cols-menuitem", (function () { a.hide(), $("#luckysheet-icon-highlightCellRule-menuButton").hide(), Em(); var e = $(this).attr("itemvalue"); if (0 != ga.luckysheet_select_save.length) { var t, n, l = gd.textCellColorHtml(); switch (e) { case "greaterThan": t = r.conditionformat_greaterThan, n = '
      \n
      '.concat(r.conditionformat_greaterThan_title, ':
      \n
      \n \n \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, " \n
      "); break; case "lessThan": t = r.conditionformat_lessThan, n = '
      \n
      '.concat(r.conditionformat_lessThan_title, ':
      \n
      \n \n \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "betweenness": t = r.conditionformat_betweenness, n = '
      \n
      '.concat(r.conditionformat_betweenness_title, ':
      \n
      \n
      \n \n \n
      \n
      ').concat(r.to, '
      \n
      \n \n \n
      \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "equal": t = r.conditionformat_equal, n = '
      \n
      '.concat(r.conditionformat_equal_title, ':
      \n
      \n \n \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "textContains": t = r.conditionformat_textContains, n = '
      \n
      '.concat(r.conditionformat_textContains_title, ':
      \n
      \n \n \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "occurrenceDate": t = r.conditionformat_occurrenceDate, n = '
      \n
      '.concat(r.conditionformat_occurrenceDate_title, ':
      \n
      \n \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "duplicateValue": t = r.conditionformat_duplicateValue, n = '
      \n
      '.concat(r.conditionformat_duplicateValue_title, ':
      \n \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      ") }gd.conditionformatDialog(t, n) } else wa() ? alert(r.pleaseSelectRange) : fd.info(r.pleaseSelectRange, "") })), $(document).off("click.CFprojectSelectRule").on("click.CFprojectSelectRule", "#luckysheet-icon-projectSelectRule-menuButton .luckysheet-cols-menuitem", (function () { a.hide(), $("#luckysheet-icon-projectSelectRule-menuButton").hide(), Em(); var e = $(this).attr("itemvalue"); if (0 != ga.luckysheet_select_save.length) { var t, n, l = gd.textCellColorHtml(); switch (e) { case "top10": t = r.conditionformat_top10, n = '
      \n
      '.concat(r.conditionformat_top10_title, ':
      \n
      \n
      ').concat(r.top, '
      \n
      \n \n
      \n
      ').concat(r.oneself, '
      \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "top10%": t = r.conditionformat_top10_percent, n = '
      \n
      '.concat(r.conditionformat_top10_title, ':
      \n
      \n
      ').concat(r.top, '
      \n
      \n \n
      \n
      %
      \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "last10": t = r.conditionformat_last10, n = '
      \n
      '.concat(r.conditionformat_last10_title, ':
      \n
      \n
      ').concat(r.last, '
      \n
      \n \n
      \n
      ').concat(r.oneself, '
      \n
      \n
      ').concat(r.setAs, ":
      \n ").concat(l, "\n
      "); break; case "last10%": t = r.conditionformat_last10_percent, n = '
      \n
      '.concat(r.conditionformat_last10_title, ':
      \n
      \n
      ').concat(r.last, '
      \n
      \n \n
      \n
      %
      \n
      \n
      设置为:
      \n ').concat(l, "\n
      "); break; case "AboveAverage": t = r.conditionformat_AboveAverage, n = '
      \n
      '.concat(r.conditionformat_AboveAverage_title, ':
      \n
      ').concat(r.setAsByArea, ":
      \n ").concat(l, "\n
      "); break; case "SubAverage": t = r.conditionformat_SubAverage, n = '
      \n
      '.concat(r.conditionformat_SubAverage_title, ':
      \n
      ').concat(r.setAsByArea, ":
      \n ").concat(l, "\n
      ") }gd.conditionformatDialog(t, n) } else wa() ? alert(r.pleaseSelectRange) : fd.info(r.pleaseSelectRange, "") })), $(document).off("click.CFdataBar").on("click.CFdataBar", "#luckysheet-icon-dataBar-menuButton .luckysheet-cols-menuitem", (function () { a.hide(), $("#luckysheet-icon-dataBar-menuButton").hide(), Em(); var e = $(this).attr("itemvalue"); if (ga.luckysheet_select_save.length > 0) { var t = $.extend(!0, [], ga.luckysheet_select_save), r = gd.dataBarList[e].format; gd.updateItem("dataBar", t, r) } })), $(document).off("click.CFcolorGradation").on("click.CFcolorGradation", "#luckysheet-icon-colorGradation-menuButton .luckysheet-cols-menuitem", (function () { a.hide(), $("#luckysheet-icon-colorGradation-menuButton").hide(), Em(); var e = $(this).attr("itemvalue"); if (ga.luckysheet_select_save.length > 0) { var t = $.extend(!0, [], ga.luckysheet_select_save), r = gd.colorGradationList[e].format; gd.updateItem("colorGradation", t, r) } })), $(document).off("click.CFdeleteRule").on("click.CFdeleteRule", "#luckysheet-icon-deleteRule-menuButton .luckysheet-cols-menuitem", (function () { a.hide(), $("#luckysheet-icon-deleteRule-menuButton").hide(), Em(), "delSheet" == $(this).attr("itemvalue") && gd.updateItem("delSheet") })) } var y = $(this).outerWidth(), b = a.outerWidth(), k = $(this).offset().left; b > y && b + k > $("#" + ga.container).width() && (k = k - b + y), Pm(a, k, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-postil").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().comment; a.remove(), Pc.removeActivePs(); var n = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], l = n.row_focus; null == l && (l = n.row[0]); var i, o = n.column_focus; null == o && (o = n.column[0]), i = null != ga.flowdata[l][o] && null != ga.flowdata[l][o].ps ? [{ text: r.edit, value: "editPs", example: "" }, { text: r.delete, value: "delPs", example: "" }, { text: "", value: "split", example: "" }, { text: r.showOne, value: "showHidePs", example: "" }, { text: r.showAll, value: "showHideAllPs", example: "" }] : [{ text: r.insert, value: "newPs", example: "" }, { text: "", value: "split", example: "" }, { text: r.showAll, value: "showHideAllPs", example: "" }]; var s = e.createButtonMenu(i), c = _m(e.menu, { id: "postil", item: s, subclass: "", sub: "" }); $("body").append(c), (a = $("#" + t).width(150)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var e = $(this).attr("itemvalue"); "newPs" == e ? Pc.newPs(l, o) : "editPs" == e ? Pc.editPs(l, o) : "delPs" == e ? Pc.delPs(l, o) : "showHidePs" == e ? Pc.showHidePs(l, o) : "showHideAllPs" == e && Pc.showHideAllPs() })); var u = $(this).outerWidth(), d = a.outerWidth(), h = $(this).offset().left; d > u && d + h > $("#" + ga.container).width() && (h = h - d + u), Pm(a, h, $(this).offset().top + 25, "lefttop") })), $("#luckysheet-icon-protection").click((function () { su(Sh.getSheetByIndex()) })), $("#luckysheet-icon-print").click((function () { var t = $(this).attr("id") + "-menuButton", a = $("#" + t), r = gn().print; if (0 == a.length) { var n = [{ text: r.menuItemPrint, value: "print", example: '' }, { text: "", value: "split", example: "" }, { text: r.menuItemAreas, value: "areas", example: '' }, { text: r.menuItemRows, value: "rows", example: '' }, { text: r.menuItemColumns, value: "columns", example: '' }], l = e.createButtonMenu(n), i = _m(e.menu, { id: "print", item: l, subclass: "", sub: "" }); $("body").append(i), (a = $("#" + t).width(180)).find(".luckysheet-cols-menuitem").click((function () { a.hide(), Em(); var e = $(this).attr("itemvalue"); "print" == e ? alert("print") : "areas" != e && "rows" != e && "columns" != e || alert("areas") })) } var o = $(this).outerWidth(), s = a.outerWidth(), c = $(this).offset().left; s > o && s + c > $("#" + ga.container).width() && (c = c - s + o), Pm(a, c, $(this).offset().top + 25, "lefttop") })), $("body").on("mouseover mouseleave", ".luckysheet-menuButton .luckysheet-cols-submenu", (function (t) { var a = $(this), r = a.attr("itemvalue"), n = $("#luckysheet-icon-" + r + "-menuButton"); if ("mouseover" === t.type) { var l = a.parent(), i = $(window).width(), o = $(window).height(), s = l.width(), c = n.height() + 25, u = n.width() + 5, d = a.offset(), h = d.top, m = d.left + s; m + u > i && (m = d.left - u), h + c > o && (h = o - c), n.css({ top: h, left: m }).show(), e.rightclickmenu = a } else clearTimeout(e.submenuhide[n.attr("id")]), e.submenuhide[n.attr("id")] = setTimeout((function () { n.hide() }), 200) })).on("mouseover mouseleave", ".luckysheet-menuButton-sub", (function (t) { "mouseover" === t.type ? (e.rightclickmenu.addClass("luckysheet-cols-menuitem-hover"), clearTimeout(e.submenuhide[$(this).attr("id")])) : (e.rightclickmenu.removeClass("luckysheet-cols-menuitem-hover"), $(this).hide()) })) }, getQKBorder: function (e, t, a) { var r = ""; e.indexOf("pt") > -1 ? (e = parseFloat(e)) < 1 || (r = e < 1.5 ? "Medium" : "Thick") : (e = parseFloat(e)) < 2 || (r = e < 3 ? "Medium" : "Thick"); var n = 0; return "double" == (t = t.toLowerCase()) ? n = 2 : "dotted" == t ? n = "Medium" == r || "Thick" == r ? 3 : 10 : "dashed" == t ? n = "Medium" == r || "Thick" == r ? 4 : 9 : "solid" == t && (n = "Medium" == r ? 8 : "Thick" == r ? 13 : 1), [n, a] }, updateFormatCell: function (e, t, a, r, n, l, i) { var o, s; if (null != e && null != t) if ("ct" == t) { for (var c = r; c <= n; c++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[c]) for (var u = l; u <= i; u++) { var d = e[c][u], h = null; h = "object" == Cm(d) ? e[c][u].v : e[c][u], "@" != a && ba(h) && (h = parseFloat(h)); var m = ws(a, h), p = "n"; o = a, s = void 0, gs.is_date(o, s) || 14 === a || 15 === a || 16 === a || 17 === a || 18 === a || 19 === a || 20 === a || 21 === a || 22 === a || 45 === a || 46 === a || 47 === a ? p = "d" : "@" == a || 49 === a ? p = "s" : "General" != a && 0 !== a || (p = "g"), "object" == Cm(d) ? (e[c][u].m = m, null == e[c][u].ct && (e[c][u].ct = {}), e[c][u].ct.fa = a, e[c][u].ct.t = p) : e[c][u] = { ct: { fa: a, t: p }, v: h, m: m } } } else { "ht" == t ? "left" == a ? a = "1" : "center" == a ? a = "0" : "right" == a && (a = "2") : "vt" == t ? "top" == a ? a = "1" : "middle" == a ? a = "0" : "bottom" == a && (a = "2") : "tb" == t ? "overflow" == a ? a = "1" : "clip" == a ? a = "0" : "wrap" == a && (a = "2") : "tr" == t && ("none" == a ? a = "0" : "angleup" == a ? a = "1" : "angledown" == a ? a = "2" : "vertical" == a ? a = "3" : "rotation-up" == a ? a = "4" : "rotation-down" == a && (a = "5")); for (var f = r; f <= n; f++)if (null == ga.config.rowhidden || null == ga.config.rowhidden[f]) for (var g = l; g <= i; g++) { var v = e[f][g]; "object" == Cm(v) ? (Oo(v, t, a), e[f][g][t] = a) : (e[f][g] = { v: v }, e[f][g][t] = a) } } }, updateFormat: function (e, t, a) { if (yu(ga.currentSheetIndex) && !1 !== ga.allowEdit) { document.createElement("canvas").getContext("2d"); if (t in Eo) if (parseInt($("#luckysheet-input-box").css("top")) > 0) if ("=" != $("#luckysheet-input-box").text().substr(0, 1)) { e[ga.luckysheetCellUpdate[0]][ga.luckysheetCellUpdate[1]]; zo(0, t, a) } var r = $.extend(!0, {}, ga.config); null == r.rowlen && (r.rowlen = {}); for (var n = 0; n < ga.luckysheet_select_save.length; n++) { var l = ga.luckysheet_select_save[n].row[0], i = ga.luckysheet_select_save[n].row[1], o = ga.luckysheet_select_save[n].column[0], s = ga.luckysheet_select_save[n].column[1]; this.updateFormatCell(e, t, a, l, i, o, s), "tb" != t && "tr" != t && "fs" != t || (r = qs(e, l, i, r)) } var c = {}; "tb" != t && "tr" != t && "fs" != t || (c = { cfg: r, RowlChange: !0 }), id(e, ga.luckysheet_select_save, c, !1) } }, updateFormat_mc: function (e, t) { var a = $.extend(!0, {}, ga.config); if (null == a.merge && (a.merge = {}), hu(ga.currentSheetIndex)) { if ("mergeCancel" == t) for (var r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r], l = n.row[0], i = n.row[1], o = n.column[0], s = n.column[1]; if (l != i || o != s) for (var c = {}, u = l; u <= i; u++)for (var d = o; d <= s; d++) { var h = e[u][d]; if (null != h && null != h.mc) { var m = h.mc.r, p = h.mc.c; if ("rs" in h.mc) delete h.mc, delete a.merge[m + "_" + p], c[m + "_" + p] = $.extend(!0, {}, h); else { var f = JSON.parse(JSON.stringify(c[m + "_" + p])); delete f.v, delete f.m, delete f.ct, delete f.f, delete f.spl, e[u][d] = f } } } } else { for (var g = !1, v = 0; v < ga.luckysheet_select_save.length; v++)for (var y = ga.luckysheet_select_save[v], b = y.row[0], k = y.row[1], x = y.column[0], w = y.column[1], _ = b; _ <= k; _++)for (var C = x; C <= w; C++) { var T = e[_][C]; if ("object" == Cm(T) && "mc" in T) { g = !0; break } } if (g) for (var A = 0; A < ga.luckysheet_select_save.length; A++) { var S = ga.luckysheet_select_save[A], I = S.row[0], R = S.row[1], q = S.column[0], D = S.column[1]; if (I != R || q != D) for (var F = {}, E = I; E <= R; E++)for (var M = q; M <= D; M++) { var N = e[E][M]; if (null != N && null != N.mc) { var P = N.mc.r, z = N.mc.c; if ("rs" in N.mc) delete N.mc, delete a.merge[P + "_" + z], F[P + "_" + z] = $.extend(!0, {}, N); else { var L = JSON.parse(JSON.stringify(F[P + "_" + z])); delete L.v, delete L.m, delete L.ct, delete L.f, delete L.spl, e[E][M] = L } } } } else for (var O = 0; O < ga.luckysheet_select_save.length; O++) { var B = ga.luckysheet_select_save[O], V = B.row[0], H = B.row[1], U = B.column[0], j = B.column[1]; if (V != H || U != j) if ("mergeAll" == t) { for (var G = {}, W = !1, Y = V; Y <= H; Y++)for (var X = U; X <= j; X++) { var K = e[Y][X]; null == K || ya(K.v) && null == K.f || W || (G = $.extend(!0, {}, K), W = !0), e[Y][X] = { mc: { r: V, c: U } } } e[V][U] = G, e[V][U].mc = { r: V, c: U, rs: H - V + 1, cs: j - U + 1 }, a.merge[V + "_" + U] = { r: V, c: U, rs: H - V + 1, cs: j - U + 1 } } else if ("mergeV" == t) for (var Z = U; Z <= j; Z++) { for (var Q = {}, J = !1, ee = V; ee <= H; ee++) { var te = e[ee][Z]; null == te || ya(te.v) && null == te.f || J || (Q = $.extend(!0, {}, te), J = !0), e[ee][Z] = { mc: { r: V, c: Z } } } e[V][Z] = Q, e[V][Z].mc = { r: V, c: Z, rs: H - V + 1, cs: 1 }, a.merge[V + "_" + Z] = { r: V, c: Z, rs: H - V + 1, cs: 1 } } else if ("mergeH" == t) for (var ae = V; ae <= H; ae++) { for (var re = {}, ne = !1, le = U; le <= j; le++) { var ie = e[ae][le]; null == ie || ya(ie.v) && null == ie.f || ne || (re = $.extend(!0, {}, ie), ne = !0), e[ae][le] = { mc: { r: ae, c: U } } } e[ae][U] = re, e[ae][U].mc = { r: ae, c: U, rs: 1, cs: j - U + 1 }, a.merge[ae + "_" + U] = { r: ae, c: U, rs: 1, cs: j - U + 1 } } } } ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "mergeChange", sheetIndex: ga.currentSheetIndex, data: ga.flowdata, curData: e, range: $.extend(!0, [], ga.luckysheet_select_save), config: $.extend(!0, {}, ga.config), curConfig: a })), ga.clearjfundo = !1, id(e, ga.luckysheet_select_save, { cfg: a }), ga.clearjfundo = !0 } }, borderfix: function (e, t, a) { return null == e[t][a] || null == e[t][a].bg || "" == e[t][a].bg ? [-1, 0, 0, -1] : [-2, -1, 1, 0] }, changeMenuButtonDom: function (e, t, a) { null == a && (a = gn()); var r = a.fontarray; a.fontjson; if ("bl" == e) "0" != t ? $("#luckysheet-icon-bold").addClass("luckysheet-toolbar-button-hover") : $("#luckysheet-icon-bold").removeClass("luckysheet-toolbar-button-hover"); else if ("it" == e) "0" != t ? $("#luckysheet-icon-italic").addClass("luckysheet-toolbar-button-hover") : $("#luckysheet-icon-italic").removeClass("luckysheet-toolbar-button-hover"); else if ("cl" == e) "0" != t ? $("#luckysheet-icon-strikethrough").addClass("luckysheet-toolbar-button-hover") : $("#luckysheet-icon-strikethrough").removeClass("luckysheet-toolbar-button-hover"); else if ("un" == e) "0" != t ? $("#luckysheet-icon-underline").addClass("luckysheet-toolbar-button-hover") : $("#luckysheet-icon-underline").removeClass("luckysheet-toolbar-button-hover"); else if ("ff" == e) { var n = $("#luckysheet-icon-font-family-menuButton"), l = r[0], i = 0; null != t && (ms(t).num ? null == (l = r[i = parseInt(t)]) && (l = i = this.defualtFont[i], null != i && this.addFontTolist(i)) : (i = t = t.replace(/"/g, "").replace(/'/g, ""), l = t, this.addFontTolist(i))), this.focus(n, i), $("#luckysheet-icon-font-family").find(".luckysheet-toolbar-menu-button-caption").html(" " + l + " ") } else if ("fs" == e) { var o = $("#luckysheet-icon-font-size-menuButton"), s = t, c = $("#luckysheet-icon-font-size input"); this.focus(o, s), $("#luckysheet-icon-font-size").attr("itemvalue", s), c.val(s) } else if ("ht" == e) { var u = $("#luckysheet-icon-align-menu-menuButton"), d = ($("luckysheet-icon-align"), "left"); "0" == t ? d = "center" : "2" == t && (d = "right"), this.focus(u, d); var h = Gn; $("#luckysheet-icon-align").attr("type", d).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-" + d + h[d]), u.hide() } else if ("vt" == e) { var m = $("#luckysheet-icon-valign-menu-menuButton"), p = ($("luckysheet-icon-valign"), "bottom"); "1" == t ? p = "top" : "0" == t && (p = "middle"), this.focus(m, p); var f = Gn; $("#luckysheet-icon-valign").attr("type", p).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-" + p + f[p]), m.hide() } else if ("tb" == e) { var g = $("#luckysheet-icon-textwrap-menu-menuButton"), v = ($("luckysheet-icon-textwrap"), "clip"); "1" == t ? v = "overflow" : "2" == t && (v = "wrap"), this.focus(g, v); var y = Wn; $("#luckysheet-icon-textwrap").attr("type", v).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-" + v + y[v]), g.hide() } else if ("tr" == e) { var b = $("#luckysheet-icon-rotation-menu-menuButton"), k = ($("luckysheet-icon-rotation"), "none"); "1" == t ? k = "angleup" : "2" == t ? k = "angledown" : "3" == t ? k = "vertical" : "4" == t ? k = "rotation-up" : "5" == t && (k = "rotation-down"), this.focus(b, k); var x = Yn; $("#luckysheet-icon-rotation").attr("type", k).find(".luckysheet-icon-img-container").removeAttr("class").addClass("luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-" + k + x[k]), b.hide() } else if ("ct" == e) { var w = $("#luckysheet-icon-fmt-other"), _ = gn().defaultFmt; if (!t) return void w.find(".luckysheet-toolbar-menu-button-caption").html(" " + _[0].text + " "); var C = t.fa, T = _.find((function (e) { return e.value === C })); if (T) w.find(".luckysheet-toolbar-menu-button-caption").html(" " + T.text + " "); else { var A = _.find((function (e) { return "fmtOtherSelf" === e.value })); w.find(".luckysheet-toolbar-menu-button-caption").html(" " + A.text + " ") } } }, inputMenuButtonFocus: function (e) { var t = window.getSelection().getRangeAt(0).startContainer; ga.inlineStringEditRange = null; var a = gn(); if ("SPAN" == t.parentNode.tagName) { var r = Vo(t.parentNode.style.cssText); for (var n in r) this.changeMenuButtonDom(n, r[n], a) } }, menuButtonFocus: function (e, t, a) { for (var r = ["bl", "it", "cl", "ff", "ht", "vt", "fs", "tb", "tr", "ct", "un"], n = gn(), l = 0; l < r.length; l++) { var i = r[l], o = this.checkstatus(e, t, a, i); this.changeMenuButtonDom(i, o, n) } }, checkstatus: function (e, t, a, r) { return null == e || null == e[t] ? (console.warn("It's incorrect data", t, a), null) : ts(e[t][a], r) }, setLineDash: function (e, t, a, r, n, l, i) { t = { 0: "none", 1: "Thin", 2: "Hair", 3: "Dotted", 4: "Dashed", 5: "DashDot", 6: "DashDotDot", 7: "Double", 8: "Medium", 9: "MediumDashed", 10: "MediumDashDot", 11: "MediumDashDotDot", 12: "SlantedDashDot", 13: "Thick" }[t.toString()]; try { "Hair" == t ? e.setLineDash([1, 2]) : t.indexOf("DashDotDot") > -1 ? e.setLineDash([2, 2, 5, 2, 2]) : t.indexOf("DashDot") > -1 ? e.setLineDash([2, 5, 2]) : t.indexOf("Dotted") > -1 ? e.setLineDash([2]) : t.indexOf("Dashed") > -1 ? e.setLineDash([3]) : e.setLineDash([0]) } catch (e) { console.log(e) } e.beginPath(), t.indexOf("Medium") > -1 ? ("h" == a ? (e.moveTo(r, n - .5), e.lineTo(l, i - .5)) : (e.moveTo(r - .5, n), e.lineTo(l - .5, i)), e.lineWidth = 2) : "Thick" == t ? (e.moveTo(r, n), e.lineTo(l, i), e.lineWidth = 3) : (e.moveTo(r, n), e.lineTo(l, i), e.lineWidth = 1) }, moveMergeData: function (e, t, a) { if (ya(e)) return e; for (var r = [], n = [], l = !1, i = 0; i < e.length; i++)for (var o = 0; o < e[0].length; o++) { var s = e[i][o]; "object" == Cm(s) && "mc" in s && (null != s.mc.rs && (r.push({ rs: s.mc.rs, cs: s.mc.cs, r: s.mc.r, c: s.mc.c }), n.push({ rs: s.mc.rs, cs: s.mc.cs, r: s.mc.r + t, c: s.mc.c + a }), l = !0), e[i][o].mc.r += t, e[i][o].mc.c += a) } return { deleMC: r, insertMC: n, hasMC: l } }, getRangeInMerge: function (e, t, a, r, n) { var l = [], i = null; if (null != (i = null != n ? $.extend(!0, {}, this.getSheetConfig()) : $.extend(!0, {}, ga.config)) && null != i.merge) for (var o in i.merge) { var s = i.merge[o]; e + t - 1 < s.r || e > s.r + s.rs - 1 || a + r - 1 < s.c || a > s.c + s.cs - 1 || l.push(s) } return l }, mergeborer: function (e, t, a) { if (null == e || null == e[t]) return console.warn("Merge info is null", t, a), null; var r = e[t][a]; if ("object" == Cm(r) && "mc" in r) { var n = r.mc; if (null == n) return console.warn("Merge info is null", t, a), null; if (a = n.c, null == e[t = n.r][a]) return console.warn("Main merge Cell info is null", t, a), null; for (var l, i, o, s, c, u, d, h, m = e[t][a].mc.cs, p = e[t][a].mc.rs, f = e[t][a].mc, g = t; g < f.rs + t; g++)l = 0 == g ? -1 : ga.visibledatarow[g - 1] - 1, i = ga.visibledatarow[g], null == s ? (s = l, o = i) : o += i - l - 1; for (var v = a; v < f.cs + a; v++)c = 0 == v ? 0 : ga.visibledatacolumn[v - 1], u = ga.visibledatacolumn[v], null == h ? (h = c, d = u) : d += u - c; return { row: [s, o, t, t + p - 1], column: [h, d, a, a + m - 1] } } return null }, mergeMoveData: {}, mergeMoveMain: function (e, t, a, r, n, l, i) { var o = Sh.getSheetMerge(); if (null != o) { var s = []; for (var c in o) s.push(c); t[0] > t[1] && (t[1] = t[0]), e[0] > e[1] && (e[1] = e[0]); var u = !0; for (this.mergeMoveData = {}; u;) { u = !1; for (var d = 0; d < s.length; d++) { var h = s[d], m = o[h]; if (!(h in this.mergeMoveData)) { var p = this.mergeMove(m, e, t, a, r, n, l, i); null != p ? (this.mergeMoveData[h] = m, e = p[0], t = p[1], r = p[2], n = p[3], l = p[4], i = p[5], u = !0) : delete this.mergeMoveData[h] } } } return [e, t, r, n, l, i] } }, mergeMove: function (e, t, a, r, n, l, i, o) { var s = e.r, c = e.r + e.rs - 1, u = e.c, d = e.c + e.cs - 1, h = !1; if (t[1] < t[0] && (t[0] = t[1]), a[1] < a[0] && (a[0] = a[1]), t[0] <= u && t[1] >= d && a[0] <= s && a[1] >= c || !(t[1] < u || t[0] > d) && !(a[1] < s || a[0] > c)) { var m = this.mergeborer(ga.flowdata, e.r, e.c); if (m) { var p = m.row[1], f = m.row[0], g = (m.row[2], m.column[1]), v = m.column[0]; m.column[2]; t[1] < u || t[0] > d || (a[0] <= c && a[0] >= s && (l += n - f, n = f, a[0] = s), a[1] >= s && a[1] <= c && (l = (r.row_focus >= s && r.row_focus, p - n), a[1] = c)), a[1] < s || a[0] > c || (t[0] <= d && t[0] >= u && (o += i - v, i = v, t[0] = u), t[1] >= u && t[1] <= d && (o = (r.column_focus >= u && r.column_focus, g - i), t[1] = d)), h = !0 } } return h ? [t, a, n, l, i, o] : null }, getCellRealSize: function (e, t, a) { var r = ga.defaultcollen, n = ga.defaultrowlen, l = e[t][a]; if (l && null != l.mc) { var i = l.mc, o = this.mergeborer(e, i.r, i.c); if (o) { var s = o.row[1], c = o.row[0], u = (o.row[2], o.row[3], o.column[1]), d = o.column[0]; o.column[2], o.column[3]; r = u - d - 1, n = s - c - 1 } } else { var h = Tl()[_l(ga.currentSheetIndex)].config; null != h.columnlen && null != h.columnlen[a] && (r = h.columnlen[a]), null != h.rowlen && null != h.rowlen[t] && (n = h.rowlen[t]) } return [r, n] }, getTextHeightCache: {}, getTextSize: function (e, t) { var a = gn().fontarray, r = t || "10pt " + a[0]; if (r in this.getTextHeightCache) return this.getTextHeightCache[r]; 0 == $("#luckysheetTextSizeTest").length && $('").appendTo($("body")); var n = $("#luckysheetTextSizeTest").text(e).css({ font: r }), l = n.innerWidth(), i = n.innerHeight(); return this.getTextHeightCache[r] = [l, i], [l, i] }, activeFormulaInput: function (e, t, a, r, n, l) { if (null == l && (l = !1), vm(e, t, ga.flowdata, !0), l) { var i = '=' + n.toUpperCase() + '()'; $("#luckysheet-rich-text-editor").html(i); window.getSelection(); var o = $("#luckysheet-rich-text-editor").find("span"); Ih.setCaretPosition(o.get(o.length - 2), 0, 1) } else { var s = As(a[0])[0], c = As(a[1])[1], u = Is(r[0])[0], d = Is(r[1])[1], h = '=' + n.toUpperCase() + '(' + Cl(ga.currentSheetIndex, { row: a, column: r }, ga.currentSheetIndex) + ')'; $("#luckysheet-rich-text-editor").html(h), Ih.israngeseleciton(), Ih.rangestart = !0, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, Ih.rangechangeindex = 0, Ih.rangeSetValue({ row: a, column: r }), Ih.func_selectedrange = { left: u, width: d - u - 1, top: s, height: c - s - 1, left_move: u, width_move: d - u - 1, top_move: s, height_move: c - s - 1, row: [e, e], column: [t, t] }, $("#luckysheet-formula-functionrange-select").css({ left: u, width: d - u - 1, top: s, height: c - s - 1 }).show(), $("#luckysheet-formula-help-c").hide() } }, backFormulaInput: function (e, t, a, r, n, l) { var i = "=" + l.toUpperCase() + "(" + Cl(ga.currentSheetIndex, { row: r, column: n }, ga.currentSheetIndex) + ")", o = Ih.execfunction(i, t, a); Cs(t, a, e, { v: o[1], f: o[2] }), Ih.execFunctionExist.push({ r: t, c: a, i: ga.currentSheetIndex }), pd.historyParam(e, ga.currentSheetIndex, { row: [t, t], column: [a, a] }) }, checkNoNullValue: function (e) { var t = e; return "object" == Cm(t) && (t = t.v), !(ya(t) || !ms(t).num || null != e.ct && null != e.ct.t && "n" != e.ct.t && "g" != e.ct.t) }, checkNoNullValueAll: function (e) { var t = e; return "object" == Cm(t) && (t = t.v), !ya(t) }, getNoNullValue: function (e, t, a, r) { for (var n = null, l = 0, i = 0, o = a - 1; o >= 0; o--) { var s = void 0; if (s = "c" == r ? e[t][o] : e[o][t], this.checkNoNullValue(s)) n = o; else { if (null != s && null != s.v && "" != s.v) break; if (++l >= 40) { if (!(i <= 0)) break; i = 1 } } } return n }, singleFormulaInput: function (e, t, a, r, n, l, i, o, s) { null == i && (i = "r"), null == o && (o = !0), null == s && (s = !0); for (var c = !0, u = !1, d = r; d <= n; d++) { var h = null; h = "c" == i ? e[d][a] : e[a][d], this.checkNoNullValue(h) ? (c = !1, u = !0) : this.checkNoNullValueAll(h) && (c = !1) } if (c && s) { if (null == this.getNoNullValue(e, t, a, i)) "c" == i ? this.activeFormulaInput(t, a, null, null, l, !0) : this.activeFormulaInput(a, t, null, null, l, !0); else if (t == r) for (var m = r; m <= n; m++) { var p = this.getNoNullValue(e, m, a, i); if (null == p) break; "c" == i ? this.backFormulaInput(e, m, a, [m, m], [p, a - 1], l) : this.backFormulaInput(e, a, m, [p, a - 1], [m, m], l) } else for (var f = n; f >= r; f--) { var g = this.getNoNullValue(e, f, a, i); if (null == g) break; "c" == i ? this.backFormulaInput(e, f, a, [f, f], [g, a - 1], l) : this.backFormulaInput(e, a, f, [g, a - 1], [f, f], l) } } else { if (!u || !o) return !0; var v = null; if (null != (v = "c" == i ? e[n][a] : e[a][n]) && null != v.v && v.v.toString().length > 0) { var y = n; for (v = "c" == i ? e[n][a] : e[a][n]; null != v && null != v.v && v.v.toString().length > 0;) { if (++y >= ("c" == i ? e.length : e[0].length)) return; v = "c" == i ? e[y][a] : e[a][y] } "c" == i ? this.backFormulaInput(e, y, a, [r, n], [a, a], l) : this.backFormulaInput(e, a, y, [a, a], [r, n], l) } else "c" == i ? this.backFormulaInput(e, n, a, [r, n], [a, a], l) : this.backFormulaInput(e, a, n, [a, a], [r, n], l) } }, autoSelectionFormula: function (e) { var t = this, a = rs.deepCopyFlowData(ga.flowdata), r = !0; Ih.execFunctionExist = []; for (var n = function (e, a, r, n, l, i) { var o = t.getNoNullValue(e, a, l, "c"); null == o ? t.activeFormulaInput(a, n, null, null, i, !0) : t.activeFormulaInput(a, n, [a, r], [o, l - 1], i) }, l = function (e, a, r, l, i, o) { var s = t.getNoNullValue(e, l, r, "r"); null == s ? n(e, a, r, l, i, o) : t.activeFormulaInput(a, l, [s, r - 1], [l, i], o) }, i = 0; i < ga.luckysheet_select_save.length; i++) { var o = ga.luckysheet_select_save[i].row[0], s = ga.luckysheet_select_save[i].row[1], c = ga.luckysheet_select_save[i].column[0], u = ga.luckysheet_select_save[i].column[1], d = ga.luckysheet_select_save[i].row_focus, h = ga.luckysheet_select_save[i].column_focus; if (o == s && c == u) { if (s - 1 < 0 && u - 1 < 0) return void t.activeFormulaInput(o, c, null, null, e, !0); s - 1 >= 0 && t.checkNoNullValue(a[s - 1][c]) ? l(a, o, s, c, u, e) : u - 1 >= 0 && t.checkNoNullValue(a[o][u - 1]) ? n(a, o, s, c, u, e) : l(a, o, s, c, u, e) } else if (o == s) r = t.singleFormulaInput(a, h, o, c, u, e, "r"); else if (c == u) r = t.singleFormulaInput(a, d, c, o, s, e, "c"); else { for (var m = !0, p = o; p <= s; p++)m = t.singleFormulaInput(a, h, p, c, u, e, "r", !0, !1) && m; for (var f = !0, g = c; g <= u; g++)f = t.singleFormulaInput(a, d, g, o, s, e, "c", !0, !1) && f; r = !!m && !!f } r = r && r } r || (Ih.execFunctionExist.reverse(), Ih.execFunctionGroup(null, null, null, null, a), id(a, ga.luckysheet_select_save), clearTimeout(ga.jfcountfuncTimeout), ga.jfcountfuncTimeout = setTimeout((function () { dc() }), 500)) }, getStyleByCell: function (e, t, a) { var r = "", n = wc.getComputeMap(), l = wc.checksAF(t, a, n), i = gd.getComputeMap(), o = gd.checksCF(t, a, i), s = (gn().fontarray, e[t][a]), c = (s.ct, !1); for (var u in No(s) && (c = !0), s) { var d = this.checkstatus(e, t, a, u); (null != l || null != o && null != o.cellColor) && (null != o && null != o.cellColor ? r += "background: " + o.cellColor + ";" : null != l && (r += "background: " + l[1] + ";")), "object" != Cm(d) && (("bg" == u || null != l || null != o && null != o.cellColor) && (null != o && null != o.cellColor ? r += "background: " + o.cellColor + ";" : r += null != l ? "background: " + l[1] + ";" : "background: " + d + ";"), "ht" == u && "1" != d && ("0" == d ? r += "text-align: center;" : "2" == d && (r += "text-align: right;")), "vt" == u && "1" != d && ("0" == d ? r += "align-items: center;" : "2" == d && (r += "align-items: flex-end;"))) } return c || (r += es(s, l, o)), r }, fontSelectList: [], defualtFont: ["Times New Roman", "Arial", "Tahoma", "Verdana", "微软雅黑", "宋体", "黑体", "楷体", "仿宋", "新宋体", "华文新魏", "华文行楷", "华文隶书"], addFontTolist: function (e) { e = e.replace(/"/g, "").replace(/'/g, ""); for (var t = !0, a = 0; a < this.fontSelectList.length; a++) { if (this.fontSelectList[a].value == e) { t = !1; break } } if (e in gn().fontjson && (t = !1), t) { var r = {}; r.value = e, r.index = this.fontSelectList.length, r.type = "userDefined", r.text = "" + e + "", r.example = "", this.fontSelectList.push(r); var n = $("#luckysheet-icon-font-family-menuButton"), l = this.createButtonMenu(this.fontSelectList); n.html(l) } }, fontInitial: function (e) { for (var t = [], a = gn().fontarray, r = 0; r < a.length; r++) { var n = a[r], l = {}; l.value = n, l.index = r, l.type = "inner", l.text = "" + n + "", l.example = "", t.push(l) } if (null != e) { for (var i = 0; i < e.length; i++) { var o = e[i], s = {}; if (s.value = o.fontName, s.index = i, s.type = "userDefined", s.text = "" + o.fontName + "", s.example = "", t.push(s), document.fonts && !document.fonts.check("12px " + o.fontName) && o.url) { var c = new FontFace(o.fontName, "url(".concat(o.url, ")")); document.fonts.add(c), c.load() } } document.fonts && document.fonts.ready.then((function () { })) } this.fontSelectList = t } }; function wm(e, t) { var a = {}; for (var r in e) a[r] = e[r]; for (var n in t) null != t[n] && (a[n] = t[n]); return a } function _m(e, t) { return e.replace(/\$\{([\w]+)\}/g, (function (e, a) { var r = t[a]; return void 0 !== r ? r : e })) } function Cm(e) { return { "[object Boolean]": "boolean", "[object Number]": "number", "[object String]": "string", "[object Function]": "function", "[object Array]": "array", "[object Date]": "date", "[object RegExp]": "regExp", "[object Undefined]": "undefined", "[object Null]": "null", "[object Object]": "object" }[Object.prototype.toString.call(e)] } function Tm(e) { var t = new Date, a = t.getFullYear(), r = t.getMonth(), n = t.getDate(), l = (t.getDay(), t.getHours()), i = t.getMinutes(), o = t.getSeconds(); (r += 1) < 10 && (r = "0" + r), n < 10 && (n = "0" + n), l < 10 && (l = "0" + l), i < 10 && (i = "0" + i), o < 10 && (o = "0" + o); var s = ""; return 1 == e ? s = a + "-" + r + "-" + n : 2 == e && (s = a + "-" + r + "-" + n + " " + l + ":" + i + ":" + o), s } function Am(e) { var t; return t = e.indexOf("rgba") > -1 ? e.replace("rgba(", "").replace(")", "").split(",") : e.replace("rgb(", "").replace(")", "").split(","), "#" + ((1 << 24) + (parseInt(t[0]) << 16) + (parseInt(t[1]) << 8) + parseInt(t[2])).toString(16).slice(1) } function Sm(e) { if (null == e || 0 == e.length) return NaN; for (var t = e.toLowerCase().split(""), a = t.length, r = 0, n = 0; n < a; n++)r += (t[n].charCodeAt() - 96) * Math.pow(26, a - n - 1); return 0 == r ? NaN : r - 1 } function Im(e) { for (var t = "a".charCodeAt(0), a = "z".charCodeAt(0) - t + 1, r = ""; e >= 0;)r = String.fromCharCode(e % a + t) + r, e = Math.floor(e / a) - 1; return r.toUpperCase() } function Rm(e, t) { if (0 === t) return ""; if (null == e) return 0; for (var a = 0, r = 0; r < e.length; r++) { if (null != e.charAt(r).match(/[^\x00-\xff]/gi) ? a += 2 : a += 1, ba(t) && a === ~~t) return e.substring(0, r) } return a } function $m(e) { var t = [], a = {}; if (e.length > 0) for (var r = 0; r < e.length; r++) { var n = e[r]; a[n] || (t.push(n), a[n] = 1) } return t } function qm(e) { var t = gn().fontarray; if ("object" == Cm(e)) { var a = ""; if ("0" == e.it || null == e.it ? a += "normal " : a += "italic ", a += "normal ", "0" == e.bl || null == e.bl ? a += "normal " : a += "bold ", e.fs ? a += Math.ceil(e.fs) + "pt " : a += ga.defaultFontSize + "pt ", e.ff) { var r = null; gn().fontjson; ms(e.ff).num ? r = t[parseInt(e.ff)] : ((r = (r = e.ff).replace(/"/g, "").replace(/'/g, "")).indexOf(" ") > -1 && (r = '"' + r + '"'), null != r && document.fonts && !document.fonts.check("12px " + r) && xm.addFontTolist(r)), null == r && (r = t[0]), a += r + ', "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif' } else a += t[0] + ', "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif'; return a } return Hn() } function Dm(e, t, a) { var r = $(window).height(), n = $(window).width(), l = e.width(), i = e.height(), o = a, s = t; t + l > n && (s = t - l), a + i > r && (o = a - i), o < 0 && (o = 0), e.css({ top: o, left: s }).show() } function Fm() { ga.fullscreenmode && setTimeout((function () { $("#luckysheet-rich-text-editor").focus().select() }), 50) } function Em() { $("#" + ga.container).attr("tabindex", 0).focus() } function Mm(e, t) { if (null == e || isNaN(parseFloat(e)) || xa(e) || e == -1 / 0 || e == 1 / 0) return null; var a = 6, r = !1; null == t || "auto" == t ? a = e < 1 ? 6 : 1 : "num" == ps(t) ? (a = parseInt(t), r = !0) : a = 6; for (var n = "", l = 0; l < a; l++)n += "0"; return r || (n = "[" + n + "]"), e >= 1e21 ? parseFloat(fs(e).value()) : parseFloat(fs(e).format("0." + n)) } function Nm(e) { if (null == e || isNaN(parseFloat(e)) || xa(e)) return null; var t = fs(e).value().toString().split("."); return t = 1 == t.length ? 0 : t[1].length } function Pm(e, t, a, r) { var n = $(window).height(), l = ($(window).width(), e.width()); e.height(); null == r && (r = "lefttop"), "lefttop" == r ? e.css({ top: a, left: t }).show() : "righttop" == r ? e.css({ top: a, left: t - l }).show() : "leftbottom" == r ? e.css({ bottom: n - a - 12, left: t }).show() : "rightbottom" == r && e.css({ bottom: n - a - 12, left: t - l }).show() } function zm(e, t) { var a = (t = t || document).querySelectorAll(e); return 1 == a.length ? Array.prototype.slice.call(a)[0] : Array.prototype.slice.call(a) } function Lm(e, t, a) { if ("object" !== Sa(e)) e = [e]; var r = document.getElementsByTagName("head")[0] || document.documentElement, n = [], l = e.length - 1; !function i(o) { if (n[o] = document.createElement("script"), n[o].setAttribute("type", "text/javascript"), n[o].onload = n[o].onreadystatechange = function () { this.onload = this.onreadystatechange = null, this.parentNode.removeChild(this), o !== l ? i(o + 1) : "function" == typeof a && a() }, n[o].setAttribute("src", e[o]), "object" === Sa(t)) for (var s in t) n[o].setAttribute(s, t[s]); r.appendChild(n[o]) }(0) } function Om(e) { "object" !== Sa(e) && (e = [e]), e.length && e.forEach((function (e) { !function (e) { var t = document, a = t.createElement("link"); a.setAttribute("rel", "stylesheet"), a.setAttribute("type", "text/css"), a.setAttribute("href", e); var r = t.getElementsByTagName("head"); r.length ? r[0].appendChild(a) : t.documentElement.appendChild(a) }(e) })) } function Bm(e) { var t = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], a = $("#" + e).find(".luckysheet-modal-dialog-content").css("min-width", 300).end(), r = a.outerHeight(), n = a.outerWidth(), l = $(window).width(), i = $(window).height(), o = $(document).scrollLeft(), s = $(document).scrollTop(); a.css({ left: (l + o - n) / 2, top: (i + s - r) / 3 }).show(), t && $("#luckysheet-modal-dialog-mask").show() } var Vm = function (e, t, a) { e.hasOwnProperty(t) ? "object" === Cm(e) && ("object" === Cm(e[t]) || "array" === Cm(e[t]) ? function (e, t, a, r) { e[t] = new Proxy(a, { set: function (e, t, a, n) { return setTimeout((function () { r(e, t, a, n) }), 0), Reflect.set(e, t, a, n) } }) }(e, t, e[t], a) : function (e, t, a, r) { Object.defineProperty(e, t, { enumerable: !0, configurable: !1, get: function () { return a }, set: function (e) { a !== e && (console.log("发现 ".concat(t, " 属性 ").concat(a, " -> ").concat(e)), setTimeout((function () { r(a, e) }), 0), a = e) } }) }(e, t, e[t], a)) : console.info("No %s in data", t) }; function Hm(e, t) { e.some((function (e, a, r) { if (e === t) return r.splice(a, 1), e === t })) } var Um, jm = "undefined" != typeof ArrayBuffer && "undefined" != typeof DataView, Gm = F.f, Wm = l.Int8Array, Ym = Wm && Wm.prototype, Xm = l.Uint8ClampedArray, Km = Xm && Xm.prototype, Zm = Wm && Fr(Wm), Qm = Ym && Fr(Ym), Jm = Object.prototype, ep = Jm.isPrototypeOf, tp = $t("toStringTag"), ap = W("TYPED_ARRAY_TAG"), rp = jm && !!Ge && "Opera" !== Mt(l.opera), np = !1, lp = { Int8Array: 1, Uint8Array: 1, Uint8ClampedArray: 1, Int16Array: 2, Uint16Array: 2, Int32Array: 4, Uint32Array: 4, Float32Array: 4, Float64Array: 8 }, ip = function (e) { return k(e) && _(lp, Mt(e)) }; for (Um in lp) l[Um] || (rp = !1); if ((!rp || "function" != typeof Zm || Zm === Function.prototype) && (Zm = function () { throw TypeError("Incorrect invocation") }, rp)) for (Um in lp) l[Um] && Ge(l[Um], Zm); if ((!rp || !Qm || Qm === Jm) && (Qm = Zm.prototype, rp)) for (Um in lp) l[Um] && Ge(l[Um].prototype, Qm); if (rp && Fr(Km) !== Qm && Ge(Km, Qm), s && !_(Qm, tp)) for (Um in np = !0, Gm(Qm, tp, { get: function () { return k(this) ? this[ap] : void 0 } }), lp) l[Um] && E(l[Um], ap, Um); var op = { NATIVE_ARRAY_BUFFER_VIEWS: rp, TYPED_ARRAY_TAG: np && ap, aTypedArray: function (e) { if (ip(e)) return e; throw TypeError("Target is not a typed array") }, aTypedArrayConstructor: function (e) { if (Ge) { if (ep.call(Zm, e)) return e } else for (var t in lp) if (_(lp, Um)) { var a = l[t]; if (a && (e === a || ep.call(a, e))) return e } throw TypeError("Target is not a typed array constructor") }, exportTypedArrayMethod: function (e, t, a) { if (s) { if (a) for (var r in lp) { var n = l[r]; n && _(n.prototype, e) && delete n.prototype[e] } Qm[e] && !a || ne(Qm, e, a ? t : rp && Ym[e] || t) } }, exportTypedArrayStaticMethod: function (e, t, a) { var r, n; if (s) { if (Ge) { if (a) for (r in lp) (n = l[r]) && _(n, e) && delete n[e]; if (Zm[e] && !a) return; try { return ne(Zm, e, a ? t : rp && Wm[e] || t) } catch (e) { } } for (r in lp) !(n = l[r]) || n[e] && !a || ne(n, e, t) } }, isView: function (e) { var t = Mt(e); return "DataView" === t || _(lp, t) }, isTypedArray: ip, TypedArray: Zm, TypedArrayPrototype: Qm }, sp = op.NATIVE_ARRAY_BUFFER_VIEWS, cp = l.ArrayBuffer, up = l.Int8Array, dp = !sp || !o((function () { up(1) })) || !o((function () { new up(-1) })) || !Pd((function (e) { new up, new up(null), new up(1.5), new up(e) }), !0) || o((function () { return 1 !== new up(new cp(2), 1, void 0).length })), hp = function (e) { if (void 0 === e) return 0; var t = ue(e), a = he(t); if (t !== a) throw RangeError("Wrong length or index"); return a }, mp = Math.abs, pp = Math.pow, fp = Math.floor, gp = Math.log, vp = Math.LN2, yp = function (e, t, a) { var r, n, l, i = new Array(a), o = 8 * a - t - 1, s = (1 << o) - 1, c = s >> 1, u = 23 === t ? pp(2, -24) - pp(2, -77) : 0, d = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0, h = 0; for ((e = mp(e)) != e || e === 1 / 0 ? (n = e != e ? 1 : 0, r = s) : (r = fp(gp(e) / vp), e * (l = pp(2, -r)) < 1 && (r--, l *= 2), (e += r + c >= 1 ? u / l : u * pp(2, 1 - c)) * l >= 2 && (r++, l /= 2), r + c >= s ? (n = 0, r = s) : r + c >= 1 ? (n = (e * l - 1) * pp(2, t), r += c) : (n = e * pp(2, c - 1) * pp(2, t), r = 0)); t >= 8; i[h++] = 255 & n, n /= 256, t -= 8); for (r = r << t | n, o += t; o > 0; i[h++] = 255 & r, r /= 256, o -= 8); return i[--h] |= 128 * d, i }, bp = function (e, t) { var a, r = e.length, n = 8 * r - t - 1, l = (1 << n) - 1, i = l >> 1, o = n - 7, s = r - 1, c = e[s--], u = 127 & c; for (c >>= 7; o > 0; u = 256 * u + e[s], s--, o -= 8); for (a = u & (1 << -o) - 1, u >>= -o, o += t; o > 0; a = 256 * a + e[s], s--, o -= 8); if (0 === u) u = 1 - i; else { if (u === l) return a ? NaN : c ? -1 / 0 : 1 / 0; a += pp(2, t), u -= i } return (c ? -1 : 1) * a * pp(2, u - t) }, kp = we.f, xp = F.f, wp = re.get, _p = re.set, Cp = l.ArrayBuffer, Tp = Cp, Ap = l.DataView, Sp = Ap && Ap.prototype, Ip = Object.prototype, Rp = l.RangeError, $p = yp, qp = bp, Dp = function (e) { return [255 & e] }, Fp = function (e) { return [255 & e, e >> 8 & 255] }, Ep = function (e) { return [255 & e, e >> 8 & 255, e >> 16 & 255, e >> 24 & 255] }, Mp = function (e) { return e[3] << 24 | e[2] << 16 | e[1] << 8 | e[0] }, Np = function (e) { return $p(e, 23, 4) }, Pp = function (e) { return $p(e, 52, 8) }, zp = function (e, t) { xp(e.prototype, t, { get: function () { return wp(this)[t] } }) }, Lp = function (e, t, a, r) { var n = hp(a), l = wp(e); if (n + t > l.byteLength) throw Rp("Wrong index"); var i = wp(l.buffer).bytes, o = n + l.byteOffset, s = i.slice(o, o + t); return r ? s : s.reverse() }, Op = function (e, t, a, r, n, l) { var i = hp(a), o = wp(e); if (i + t > o.byteLength) throw Rp("Wrong index"); for (var s = wp(o.buffer).bytes, c = i + o.byteOffset, u = r(+n), d = 0; d < t; d++)s[c + d] = u[l ? d : t - d - 1] }; if (jm) { if (!o((function () { Cp(1) })) || !o((function () { new Cp(-1) })) || o((function () { return new Cp, new Cp(1.5), new Cp(NaN), "ArrayBuffer" != Cp.name }))) { for (var Bp, Vp = (Tp = function (e) { return Dd(this, Tp), new Cp(hp(e)) }).prototype = Cp.prototype, Hp = kp(Cp), Up = 0; Hp.length > Up;)(Bp = Hp[Up++]) in Tp || E(Tp, Bp, Cp[Bp]); Vp.constructor = Tp } Ge && Fr(Sp) !== Ip && Ge(Sp, Ip); var jp = new Ap(new Tp(2)), Gp = Sp.setInt8; jp.setInt8(0, 2147483648), jp.setInt8(1, 2147483649), !jp.getInt8(0) && jp.getInt8(1) || zd(Sp, { setInt8: function (e, t) { Gp.call(this, e, t << 24 >> 24) }, setUint8: function (e, t) { Gp.call(this, e, t << 24 >> 24) } }, { unsafe: !0 }) } else Tp = function (e) { Dd(this, Tp, "ArrayBuffer"); var t = hp(e); _p(this, { bytes: Ns.call(new Array(t), 0), byteLength: t }), s || (this.byteLength = t) }, Ap = function (e, t, a) { Dd(this, Ap, "DataView"), Dd(e, Tp, "DataView"); var r = wp(e).byteLength, n = ue(t); if (n < 0 || n > r) throw Rp("Wrong offset"); if (n + (a = void 0 === a ? r - n : he(a)) > r) throw Rp("Wrong length"); _p(this, { buffer: e, byteLength: a, byteOffset: n }), s || (this.buffer = e, this.byteLength = a, this.byteOffset = n) }, s && (zp(Tp, "byteLength"), zp(Ap, "buffer"), zp(Ap, "byteLength"), zp(Ap, "byteOffset")), zd(Ap.prototype, { getInt8: function (e) { return Lp(this, 1, e)[0] << 24 >> 24 }, getUint8: function (e) { return Lp(this, 1, e)[0] }, getInt16: function (e) { var t = Lp(this, 2, e, arguments.length > 1 ? arguments[1] : void 0); return (t[1] << 8 | t[0]) << 16 >> 16 }, getUint16: function (e) { var t = Lp(this, 2, e, arguments.length > 1 ? arguments[1] : void 0); return t[1] << 8 | t[0] }, getInt32: function (e) { return Mp(Lp(this, 4, e, arguments.length > 1 ? arguments[1] : void 0)) }, getUint32: function (e) { return Mp(Lp(this, 4, e, arguments.length > 1 ? arguments[1] : void 0)) >>> 0 }, getFloat32: function (e) { return qp(Lp(this, 4, e, arguments.length > 1 ? arguments[1] : void 0), 23) }, getFloat64: function (e) { return qp(Lp(this, 8, e, arguments.length > 1 ? arguments[1] : void 0), 52) }, setInt8: function (e, t) { Op(this, 1, e, Dp, t) }, setUint8: function (e, t) { Op(this, 1, e, Dp, t) }, setInt16: function (e, t) { Op(this, 2, e, Fp, t, arguments.length > 2 ? arguments[2] : void 0) }, setUint16: function (e, t) { Op(this, 2, e, Fp, t, arguments.length > 2 ? arguments[2] : void 0) }, setInt32: function (e, t) { Op(this, 4, e, Ep, t, arguments.length > 2 ? arguments[2] : void 0) }, setUint32: function (e, t) { Op(this, 4, e, Ep, t, arguments.length > 2 ? arguments[2] : void 0) }, setFloat32: function (e, t) { Op(this, 4, e, Np, t, arguments.length > 2 ? arguments[2] : void 0) }, setFloat64: function (e, t) { Op(this, 8, e, Pp, t, arguments.length > 2 ? arguments[2] : void 0) } }); Gs(Tp, "ArrayBuffer"), Gs(Ap, "DataView"); var Wp = { ArrayBuffer: Tp, DataView: Ap }, Yp = function (e, t) { var a = function (e) { var t = ue(e); if (t < 0) throw RangeError("The argument can't be less than 0"); return t }(e); if (a % t) throw RangeError("Wrong offset"); return a }, Xp = op.aTypedArrayConstructor, Kp = function (e) { var t, a, r, n, l, i, o = na(e), s = arguments.length, c = s > 1 ? arguments[1] : void 0, u = void 0 !== c, d = Rd(o); if (null != d && !Sd(d)) for (i = (l = d.call(o)).next, o = []; !(n = i.call(l)).done;)o.push(n.value); for (u && s > 2 && (c = tr(c, arguments[2], 2)), a = he(o.length), r = new (Xp(this))(a), t = 0; a > t; t++)r[t] = u ? c(o[t], t) : o[t]; return r }; a((function (e) { var t = we.f, a = nr.forEach, r = re.get, n = re.set, i = F.f, o = R.f, c = Math.round, u = l.RangeError, d = Wp.ArrayBuffer, h = Wp.DataView, p = op.NATIVE_ARRAY_BUFFER_VIEWS, f = op.TYPED_ARRAY_TAG, g = op.TypedArray, v = op.TypedArrayPrototype, y = op.aTypedArrayConstructor, b = op.isTypedArray, w = function (e, t) { for (var a = 0, r = t.length, n = new (y(e))(r); r > a;)n[a] = t[a++]; return n }, C = function (e, t) { i(e, t, { get: function () { return r(this)[t] } }) }, T = function (e) { var t; return e instanceof d || "ArrayBuffer" == (t = Mt(e)) || "SharedArrayBuffer" == t }, A = function (e, t) { return b(e) && "symbol" != typeof t && t in e && String(+t) == String(t) }, S = function (e, t) { return A(e, t = x(t, !0)) ? m(2, e[t]) : o(e, t) }, I = function (e, t, a) { return !(A(e, t = x(t, !0)) && k(a) && _(a, "value")) || _(a, "get") || _(a, "set") || a.configurable || _(a, "writable") && !a.writable || _(a, "enumerable") && !a.enumerable ? i(e, t, a) : (e[t] = a.value, e) }; s ? (p || (R.f = S, F.f = I, C(v, "buffer"), C(v, "byteOffset"), C(v, "byteLength"), C(v, "length")), Ee({ target: "Object", stat: !0, forced: !p }, { getOwnPropertyDescriptor: S, defineProperty: I }), e.exports = function (e, o, s) { var m = e.match(/\d+$/)[0] / 8, y = e + (s ? "Clamped" : "") + "Array", x = "get" + e, _ = "set" + e, C = l[y], A = C, S = A && A.prototype, I = {}, R = function (e, t) { i(e, t, { get: function () { return function (e, t) { var a = r(e); return a.view[x](t * m + a.byteOffset, !0) }(this, t) }, set: function (e) { return function (e, t, a) { var n = r(e); s && (a = (a = c(a)) < 0 ? 0 : a > 255 ? 255 : 255 & a), n.view[_](t * m + n.byteOffset, a, !0) }(this, t, e) }, enumerable: !0 }) }; p ? dp && (A = o((function (e, t, a, r) { return Dd(e, A, y), We(k(t) ? T(t) ? void 0 !== r ? new C(t, Yp(a, m), r) : void 0 !== a ? new C(t, Yp(a, m)) : new C(t) : b(t) ? w(A, t) : Kp.call(A, t) : new C(hp(t)), e, A) })), Ge && Ge(A, g), a(t(C), (function (e) { e in A || E(A, e, C[e]) })), A.prototype = S) : (A = o((function (e, t, a, r) { Dd(e, A, y); var l, i, o, s = 0, c = 0; if (k(t)) { if (!T(t)) return b(t) ? w(A, t) : Kp.call(A, t); l = t, c = Yp(a, m); var p = t.byteLength; if (void 0 === r) { if (p % m) throw u("Wrong length"); if ((i = p - c) < 0) throw u("Wrong length") } else if ((i = he(r) * m) + c > p) throw u("Wrong length"); o = i / m } else o = hp(t), l = new d(i = o * m); for (n(e, { buffer: l, byteOffset: c, byteLength: i, length: o, view: new h(l) }); s < o;)R(e, s++) })), Ge && Ge(A, g), S = A.prototype = tt(v)), S.constructor !== A && E(S, "constructor", A), f && E(S, f, y), I[y] = A, Ee({ global: !0, forced: A != C, sham: !p }, I), "BYTES_PER_ELEMENT" in A || E(A, "BYTES_PER_ELEMENT", m), "BYTES_PER_ELEMENT" in S || E(S, "BYTES_PER_ELEMENT", m), ol(y) }) : e.exports = function () { } }))("Uint8", (function (e) { return function (t, a, r) { return e(this, t, a, r) } })); var Zp = Math.min, Qp = [].copyWithin || function (e, t) { var a = na(this), r = he(a.length), n = fe(e, r), l = fe(t, r), i = arguments.length > 2 ? arguments[2] : void 0, o = Zp((void 0 === i ? r : fe(i, r)) - l, r - n), s = 1; for (l < n && n < l + o && (s = -1, l += o - 1, n += o - 1); o-- > 0;)l in a ? a[n] = a[l] : delete a[n], n += s, l += s; return a }, Jp = op.aTypedArray; (0, op.exportTypedArrayMethod)("copyWithin", (function (e, t) { return Qp.call(Jp(this), e, t, arguments.length > 2 ? arguments[2] : void 0) })); var ef = nr.every, tf = op.aTypedArray; (0, op.exportTypedArrayMethod)("every", (function (e) { return ef(tf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var af = op.aTypedArray; (0, op.exportTypedArrayMethod)("fill", (function (e) { return Ns.apply(af(this), arguments) })); var rf = nr.filter, nf = op.aTypedArray, lf = op.aTypedArrayConstructor; (0, op.exportTypedArrayMethod)("filter", (function (e) { for (var t = rf(nf(this), e, arguments.length > 1 ? arguments[1] : void 0), a = zr(this, this.constructor), r = 0, n = t.length, l = new (lf(a))(n); n > r;)l[r] = t[r++]; return l })); var of = nr.find, sf = op.aTypedArray; (0, op.exportTypedArrayMethod)("find", (function (e) { return of(sf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var cf = nr.findIndex, uf = op.aTypedArray; (0, op.exportTypedArrayMethod)("findIndex", (function (e) { return cf(uf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var df = nr.forEach, hf = op.aTypedArray; (0, op.exportTypedArrayMethod)("forEach", (function (e) { df(hf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var mf = ve.includes, pf = op.aTypedArray; (0, op.exportTypedArrayMethod)("includes", (function (e) { return mf(pf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var ff = ve.indexOf, gf = op.aTypedArray; (0, op.exportTypedArrayMethod)("indexOf", (function (e) { return ff(gf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var vf = $t("iterator"), yf = l.Uint8Array, bf = rc.values, kf = rc.keys, xf = rc.entries, wf = op.aTypedArray, _f = op.exportTypedArrayMethod, Cf = yf && yf.prototype[vf], Tf = !!Cf && ("values" == Cf.name || null == Cf.name), Af = function () { return bf.call(wf(this)) }; _f("entries", (function () { return xf.call(wf(this)) })), _f("keys", (function () { return kf.call(wf(this)) })), _f("values", Af, !Tf), _f(vf, Af, !Tf); var Sf = op.aTypedArray, If = [].join; (0, op.exportTypedArrayMethod)("join", (function (e) { return If.apply(Sf(this), arguments) })); var Rf = op.aTypedArray; (0, op.exportTypedArrayMethod)("lastIndexOf", (function (e) { return cs.apply(Rf(this), arguments) })); var $f = nr.map, qf = op.aTypedArray, Df = op.aTypedArrayConstructor; (0, op.exportTypedArrayMethod)("map", (function (e) { return $f(qf(this), e, arguments.length > 1 ? arguments[1] : void 0, (function (e, t) { return new (Df(zr(e, e.constructor)))(t) })) })); var Ff = function (e) { return function (t, a, r, n) { er(a); var l = na(t), i = v(l), o = he(l.length), s = e ? o - 1 : 0, c = e ? -1 : 1; if (r < 2) for (; ;) { if (s in i) { n = i[s], s += c; break } if (s += c, e ? s < 0 : o <= s) throw TypeError("Reduce of empty array with no initial value") } for (; e ? s >= 0 : o > s; s += c)s in i && (n = a(n, i[s], s, l)); return n } }, Ef = { left: Ff(!1), right: Ff(!0) }, Mf = Ef.left, Nf = op.aTypedArray; (0, op.exportTypedArrayMethod)("reduce", (function (e) { return Mf(Nf(this), e, arguments.length, arguments.length > 1 ? arguments[1] : void 0) })); var Pf = Ef.right, zf = op.aTypedArray; (0, op.exportTypedArrayMethod)("reduceRight", (function (e) { return Pf(zf(this), e, arguments.length, arguments.length > 1 ? arguments[1] : void 0) })); var Lf = op.aTypedArray, Of = op.exportTypedArrayMethod, Bf = Math.floor; Of("reverse", (function () { for (var e, t = Lf(this).length, a = Bf(t / 2), r = 0; r < a;)e = this[r], this[r++] = this[--t], this[t] = e; return this })); var Vf = op.aTypedArray; (0, op.exportTypedArrayMethod)("set", (function (e) { Vf(this); var t = Yp(arguments.length > 1 ? arguments[1] : void 0, 1), a = this.length, r = na(e), n = he(r.length), l = 0; if (n + t > a) throw RangeError("Wrong length"); for (; l < n;)this[t + l] = r[l++] }), o((function () { new Int8Array(1).set({}) }))); var Hf = op.aTypedArray, Uf = op.aTypedArrayConstructor, jf = [].slice; (0, op.exportTypedArrayMethod)("slice", (function (e, t) { for (var a = jf.call(Hf(this), e, t), r = zr(this, this.constructor), n = 0, l = a.length, i = new (Uf(r))(l); l > n;)i[n] = a[n++]; return i }), o((function () { new Int8Array(1).slice() }))); var Gf = nr.some, Wf = op.aTypedArray; (0, op.exportTypedArrayMethod)("some", (function (e) { return Gf(Wf(this), e, arguments.length > 1 ? arguments[1] : void 0) })); var Yf = op.aTypedArray, Xf = [].sort; (0, op.exportTypedArrayMethod)("sort", (function (e) { return Xf.call(Yf(this), e) })); var Kf = op.aTypedArray; (0, op.exportTypedArrayMethod)("subarray", (function (e, t) { var a = Kf(this), r = a.length, n = fe(e, r); return new (zr(a, a.constructor))(a.buffer, a.byteOffset + n * a.BYTES_PER_ELEMENT, he((void 0 === t ? r : fe(t, r)) - n)) })); var Zf = l.Int8Array, Qf = op.aTypedArray, Jf = op.exportTypedArrayMethod, eg = [].toLocaleString, tg = [].slice, ag = !!Zf && o((function () { eg.call(new Zf(1)) })); Jf("toLocaleString", (function () { return eg.apply(ag ? tg.call(Qf(this)) : Qf(this), arguments) }), o((function () { return [1, 2].toLocaleString() != new Zf([1, 2]).toLocaleString() })) || !o((function () { Zf.prototype.toLocaleString.call([1, 2]) }))); var rg = op.exportTypedArrayMethod, ng = l.Uint8Array, lg = ng && ng.prototype || {}, ig = [].toString, og = [].join; o((function () { ig.call({}) })) && (ig = function () { return og.call(this) }); var sg = lg.toString != ig; rg("toString", ig, sg); var cg = $t("iterator"), ug = !o((function () { var e = new URL("b?a=1&b=2&c=3", "http://a"), t = e.searchParams, a = ""; return e.pathname = "c%20d", t.forEach((function (e, r) { t.delete("b"), a += r + e })), !t.sort || "http://a/c%20d?a=1&c=3" !== e.href || "3" !== t.get("c") || "a=1" !== String(new URLSearchParams("?a=1")) || !t[cg] || "a" !== new URL("https://a@b").username || "b" !== new URLSearchParams(new URLSearchParams("a=b")).get("a") || "xn--e1aybc" !== new URL("http://тест").host || "#%D0%B1" !== new URL("http://a#б").hash || "a1c3" !== a || "x" !== new URL("http://x", void 0).host })), dg = function (e) { var t, a, r, n, l, i, o = na(e), s = "function" == typeof this ? this : Array, c = arguments.length, u = c > 1 ? arguments[1] : void 0, d = void 0 !== u, h = Rd(o), m = 0; if (d && (u = tr(u, c > 2 ? arguments[2] : void 0, 2)), null == h || s == Array && Sd(h)) for (a = new s(t = he(o.length)); t > m; m++)i = d ? u(o[m], m) : o[m], Oa(a, m, i); else for (l = (n = h.call(o)).next, a = new s; !(r = l.call(n)).done; m++)i = d ? $d(n, u, [r.value, m], !0) : r.value, Oa(a, m, i); return a.length = m, a }, hg = /[^\0-\u007E]/, mg = /[.\u3002\uFF0E\uFF61]/g, pg = "Overflow: input needs wider integers to process", fg = Math.floor, gg = String.fromCharCode, vg = function (e) { return e + 22 + 75 * (e < 26) }, yg = function (e, t, a) { var r = 0; for (e = a ? fg(e / 700) : e >> 1, e += fg(e / t); e > 455; r += 36)e = fg(e / 35); return fg(r + 36 * e / (e + 38)) }, bg = function (e) { var t, a, r = [], n = (e = function (e) { for (var t = [], a = 0, r = e.length; a < r;) { var n = e.charCodeAt(a++); if (n >= 55296 && n <= 56319 && a < r) { var l = e.charCodeAt(a++); 56320 == (64512 & l) ? t.push(((1023 & n) << 10) + (1023 & l) + 65536) : (t.push(n), a--) } else t.push(n) } return t }(e)).length, l = 128, i = 0, o = 72; for (t = 0; t < e.length; t++)(a = e[t]) < 128 && r.push(gg(a)); var s = r.length, c = s; for (s && r.push("-"); c < n;) { var u = 2147483647; for (t = 0; t < e.length; t++)(a = e[t]) >= l && a < u && (u = a); var d = c + 1; if (u - l > fg((2147483647 - i) / d)) throw RangeError(pg); for (i += (u - l) * d, l = u, t = 0; t < e.length; t++) { if ((a = e[t]) < l && ++i > 2147483647) throw RangeError(pg); if (a == l) { for (var h = i, m = 36; ; m += 36) { var p = m <= o ? 1 : m >= o + 26 ? 26 : m - o; if (h < p) break; var f = h - p, g = 36 - p; r.push(gg(vg(p + f % g))), h = fg(f / g) } r.push(gg(vg(h))), o = yg(i, d, c == s), i = 0, ++c } } ++i, ++l } return r.join("") }, kg = function (e) { var t = Rd(e); if ("function" != typeof t) throw TypeError(String(e) + " is not iterable"); return q(t.call(e)) }, xg = oe("fetch"), wg = oe("Headers"), _g = $t("iterator"), Cg = re.set, Tg = re.getterFor("URLSearchParams"), Ag = re.getterFor("URLSearchParamsIterator"), Sg = /\+/g, Ig = Array(4), Rg = function (e) { return Ig[e - 1] || (Ig[e - 1] = RegExp("((?:%[\\da-f]{2}){" + e + "})", "gi")) }, $g = function (e) { try { return decodeURIComponent(e) } catch (t) { return e } }, qg = function (e) { var t = e.replace(Sg, " "), a = 4; try { return decodeURIComponent(t) } catch (e) { for (; a;)t = t.replace(Rg(a--), $g); return t } }, Dg = /[!'()~]|%20/g, Fg = { "!": "%21", "'": "%27", "(": "%28", ")": "%29", "~": "%7E", "%20": "+" }, Eg = function (e) { return Fg[e] }, Mg = function (e) { return encodeURIComponent(e).replace(Dg, Eg) }, Ng = function (e, t) { if (t) for (var a, r, n = t.split("&"), l = 0; l < n.length;)(a = n[l++]).length && (r = a.split("="), e.push({ key: qg(r.shift()), value: qg(r.join("=")) })) }, Pg = function (e) { this.entries.length = 0, Ng(this.entries, e) }, zg = function (e, t) { if (e < t) throw TypeError("Not enough arguments") }, Lg = Xs((function (e, t) { Cg(this, { type: "URLSearchParamsIterator", iterator: kg(Tg(e).entries), kind: t }) }), "Iterator", (function () { var e = Ag(this), t = e.kind, a = e.iterator.next(), r = a.value; return a.done || (a.value = "keys" === t ? r.key : "values" === t ? r.value : [r.key, r.value]), a })), Og = function () { Dd(this, Og, "URLSearchParams"); var e, t, a, r, n, l, i, o, s, c = arguments.length > 0 ? arguments[0] : void 0, u = this, d = []; if (Cg(u, { type: "URLSearchParams", entries: d, updateURL: function () { }, updateSearchParams: Pg }), void 0 !== c) if (k(c)) if ("function" == typeof (e = Rd(c))) for (a = (t = e.call(c)).next; !(r = a.call(t)).done;) { if ((i = (l = (n = kg(q(r.value))).next).call(n)).done || (o = l.call(n)).done || !l.call(n).done) throw TypeError("Expected sequence with length 2"); d.push({ key: i.value + "", value: o.value + "" }) } else for (s in c) _(c, s) && d.push({ key: s, value: c[s] + "" }); else Ng(d, "string" == typeof c ? "?" === c.charAt(0) ? c.slice(1) : c : c + "") }, Bg = Og.prototype; zd(Bg, { append: function (e, t) { zg(arguments.length, 2); var a = Tg(this); a.entries.push({ key: e + "", value: t + "" }), a.updateURL() }, delete: function (e) { zg(arguments.length, 1); for (var t = Tg(this), a = t.entries, r = e + "", n = 0; n < a.length;)a[n].key === r ? a.splice(n, 1) : n++; t.updateURL() }, get: function (e) { zg(arguments.length, 1); for (var t = Tg(this).entries, a = e + "", r = 0; r < t.length; r++)if (t[r].key === a) return t[r].value; return null }, getAll: function (e) { zg(arguments.length, 1); for (var t = Tg(this).entries, a = e + "", r = [], n = 0; n < t.length; n++)t[n].key === a && r.push(t[n].value); return r }, has: function (e) { zg(arguments.length, 1); for (var t = Tg(this).entries, a = e + "", r = 0; r < t.length;)if (t[r++].key === a) return !0; return !1 }, set: function (e, t) { zg(arguments.length, 1); for (var a, r = Tg(this), n = r.entries, l = !1, i = e + "", o = t + "", s = 0; s < n.length; s++)(a = n[s]).key === i && (l ? n.splice(s--, 1) : (l = !0, a.value = o)); l || n.push({ key: i, value: o }), r.updateURL() }, sort: function () { var e, t, a, r = Tg(this), n = r.entries, l = n.slice(); for (n.length = 0, a = 0; a < l.length; a++) { for (e = l[a], t = 0; t < a; t++)if (n[t].key > e.key) { n.splice(t, 0, e); break } t === a && n.push(e) } r.updateURL() }, forEach: function (e) { for (var t, a = Tg(this).entries, r = tr(e, arguments.length > 1 ? arguments[1] : void 0, 3), n = 0; n < a.length;)r((t = a[n++]).value, t.key, this) }, keys: function () { return new Lg(this, "keys") }, values: function () { return new Lg(this, "values") }, entries: function () { return new Lg(this, "entries") } }, { enumerable: !0 }), ne(Bg, _g, Bg.entries), ne(Bg, "toString", (function () { for (var e, t = Tg(this).entries, a = [], r = 0; r < t.length;)e = t[r++], a.push(Mg(e.key) + "=" + Mg(e.value)); return a.join("&") }), { enumerable: !0 }), Gs(Og, "URLSearchParams"), Ee({ global: !0, forced: !ug }, { URLSearchParams: Og }), ug || "function" != typeof xg || "function" != typeof wg || Ee({ global: !0, enumerable: !0, forced: !0 }, { fetch: function (e) { var t, a, r, n = [e]; return arguments.length > 1 && (k(t = arguments[1]) && (a = t.body, "URLSearchParams" === Mt(a) && ((r = t.headers ? new wg(t.headers) : new wg).has("content-type") || r.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"), t = tt(t, { body: m(0, String(a)), headers: m(0, r) }))), n.push(t)), xg.apply(this, n) } }); var Vg, Hg = { URLSearchParams: Og, getState: Tg }, Ug = ia.codeAt, jg = l.URL, Gg = Hg.URLSearchParams, Wg = Hg.getState, Yg = re.set, Xg = re.getterFor("URL"), Kg = Math.floor, Zg = Math.pow, Qg = /[A-Za-z]/, Jg = /[\d+-.A-Za-z]/, ev = /\d/, tv = /^(0x|0X)/, av = /^[0-7]+$/, rv = /^\d+$/, nv = /^[\dA-Fa-f]+$/, lv = /[\u0000\u0009\u000A\u000D #%/:?@[\\]]/, iv = /[\u0000\u0009\u000A\u000D #/:?@[\\]]/, ov = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g, sv = /[\u0009\u000A\u000D]/g, cv = function (e, t) { var a, r, n; if ("[" == t.charAt(0)) { if ("]" != t.charAt(t.length - 1)) return "Invalid host"; if (!(a = dv(t.slice(1, -1)))) return "Invalid host"; e.host = a } else if (bv(e)) { if (t = function (e) { var t, a, r = [], n = e.toLowerCase().replace(mg, ".").split("."); for (t = 0; t < n.length; t++)a = n[t], r.push(hg.test(a) ? "xn--" + bg(a) : a); return r.join(".") }(t), lv.test(t)) return "Invalid host"; if (null === (a = uv(t))) return "Invalid host"; e.host = a } else { if (iv.test(t)) return "Invalid host"; for (a = "", r = dg(t), n = 0; n < r.length; n++)a += vv(r[n], mv); e.host = a } }, uv = function (e) { var t, a, r, n, l, i, o, s = e.split("."); if (s.length && "" == s[s.length - 1] && s.pop(), (t = s.length) > 4) return e; for (a = [], r = 0; r < t; r++) { if ("" == (n = s[r])) return e; if (l = 10, n.length > 1 && "0" == n.charAt(0) && (l = tv.test(n) ? 16 : 8, n = n.slice(8 == l ? 1 : 2)), "" === n) i = 0; else { if (!(10 == l ? rv : 8 == l ? av : nv).test(n)) return e; i = parseInt(n, l) } a.push(i) } for (r = 0; r < t; r++)if (i = a[r], r == t - 1) { if (i >= Zg(256, 5 - t)) return null } else if (i > 255) return null; for (o = a.pop(), r = 0; r < a.length; r++)o += a[r] * Zg(256, 3 - r); return o }, dv = function (e) { var t, a, r, n, l, i, o, s = [0, 0, 0, 0, 0, 0, 0, 0], c = 0, u = null, d = 0, h = function () { return e.charAt(d) }; if (":" == h()) { if (":" != e.charAt(1)) return; d += 2, u = ++c } for (; h();) { if (8 == c) return; if (":" != h()) { for (t = a = 0; a < 4 && nv.test(h());)t = 16 * t + parseInt(h(), 16), d++, a++; if ("." == h()) { if (0 == a) return; if (d -= a, c > 6) return; for (r = 0; h();) { if (n = null, r > 0) { if (!("." == h() && r < 4)) return; d++ } if (!ev.test(h())) return; for (; ev.test(h());) { if (l = parseInt(h(), 10), null === n) n = l; else { if (0 == n) return; n = 10 * n + l } if (n > 255) return; d++ } s[c] = 256 * s[c] + n, 2 != ++r && 4 != r || c++ } if (4 != r) return; break } if (":" == h()) { if (d++, !h()) return } else if (h()) return; s[c++] = t } else { if (null !== u) return; d++, u = ++c } } if (null !== u) for (i = c - u, c = 7; 0 != c && i > 0;)o = s[c], s[c--] = s[u + i - 1], s[u + --i] = o; else if (8 != c) return; return s }, hv = function (e) { var t, a, r, n; if ("number" == typeof e) { for (t = [], a = 0; a < 4; a++)t.unshift(e % 256), e = Kg(e / 256); return t.join(".") } if ("object" == typeof e) { for (t = "", r = function (e) { for (var t = null, a = 1, r = null, n = 0, l = 0; l < 8; l++)0 !== e[l] ? (n > a && (t = r, a = n), r = null, n = 0) : (null === r && (r = l), ++n); return n > a && (t = r, a = n), t }(e), a = 0; a < 8; a++)n && 0 === e[a] || (n && (n = !1), r === a ? (t += a ? ":" : "::", n = !0) : (t += e[a].toString(16), a < 7 && (t += ":"))); return "[" + t + "]" } return e }, mv = {}, pv = ln({}, mv, { " ": 1, '"': 1, "<": 1, ">": 1, "`": 1 }), fv = ln({}, pv, { "#": 1, "?": 1, "{": 1, "}": 1 }), gv = ln({}, fv, { "/": 1, ":": 1, ";": 1, "=": 1, "@": 1, "[": 1, "\\": 1, "]": 1, "^": 1, "|": 1 }), vv = function (e, t) { var a = Ug(e, 0); return a > 32 && a < 127 && !_(t, e) ? e : encodeURIComponent(e) }, yv = { ftp: 21, file: null, http: 80, https: 443, ws: 80, wss: 443 }, bv = function (e) { return _(yv, e.scheme) }, kv = function (e) { return "" != e.username || "" != e.password }, xv = function (e) { return !e.host || e.cannotBeABaseURL || "file" == e.scheme }, wv = function (e, t) { var a; return 2 == e.length && Qg.test(e.charAt(0)) && (":" == (a = e.charAt(1)) || !t && "|" == a) }, _v = function (e) { var t; return e.length > 1 && wv(e.slice(0, 2)) && (2 == e.length || "/" === (t = e.charAt(2)) || "\\" === t || "?" === t || "#" === t) }, Cv = function (e) { var t = e.path, a = t.length; !a || "file" == e.scheme && 1 == a && wv(t[0], !0) || t.pop() }, Tv = function (e) { return "." === e || "%2e" === e.toLowerCase() }, Av = {}, Sv = {}, Iv = {}, Rv = {}, $v = {}, qv = {}, Dv = {}, Fv = {}, Ev = {}, Mv = {}, Nv = {}, Pv = {}, zv = {}, Lv = {}, Ov = {}, Bv = {}, Vv = {}, Hv = {}, Uv = {}, jv = {}, Gv = {}, Wv = function (e, t, a, r) { var n, l, i, o, s, c = a || Av, u = 0, d = "", h = !1, m = !1, p = !1; for (a || (e.scheme = "", e.username = "", e.password = "", e.host = null, e.port = null, e.path = [], e.query = null, e.fragment = null, e.cannotBeABaseURL = !1, t = t.replace(ov, "")), t = t.replace(sv, ""), n = dg(t); u <= n.length;) { switch (l = n[u], c) { case Av: if (!l || !Qg.test(l)) { if (a) return "Invalid scheme"; c = Iv; continue } d += l.toLowerCase(), c = Sv; break; case Sv: if (l && (Jg.test(l) || "+" == l || "-" == l || "." == l)) d += l.toLowerCase(); else { if (":" != l) { if (a) return "Invalid scheme"; d = "", c = Iv, u = 0; continue } if (a && (bv(e) != _(yv, d) || "file" == d && (kv(e) || null !== e.port) || "file" == e.scheme && !e.host)) return; if (e.scheme = d, a) return void (bv(e) && yv[e.scheme] == e.port && (e.port = null)); d = "", "file" == e.scheme ? c = Lv : bv(e) && r && r.scheme == e.scheme ? c = Rv : bv(e) ? c = Fv : "/" == n[u + 1] ? (c = $v, u++) : (e.cannotBeABaseURL = !0, e.path.push(""), c = Uv) } break; case Iv: if (!r || r.cannotBeABaseURL && "#" != l) return "Invalid scheme"; if (r.cannotBeABaseURL && "#" == l) { e.scheme = r.scheme, e.path = r.path.slice(), e.query = r.query, e.fragment = "", e.cannotBeABaseURL = !0, c = Gv; break } c = "file" == r.scheme ? Lv : qv; continue; case Rv: if ("/" != l || "/" != n[u + 1]) { c = qv; continue } c = Ev, u++; break; case $v: if ("/" == l) { c = Mv; break } c = Hv; continue; case qv: if (e.scheme = r.scheme, l == Vg) e.username = r.username, e.password = r.password, e.host = r.host, e.port = r.port, e.path = r.path.slice(), e.query = r.query; else if ("/" == l || "\\" == l && bv(e)) c = Dv; else if ("?" == l) e.username = r.username, e.password = r.password, e.host = r.host, e.port = r.port, e.path = r.path.slice(), e.query = "", c = jv; else { if ("#" != l) { e.username = r.username, e.password = r.password, e.host = r.host, e.port = r.port, e.path = r.path.slice(), e.path.pop(), c = Hv; continue } e.username = r.username, e.password = r.password, e.host = r.host, e.port = r.port, e.path = r.path.slice(), e.query = r.query, e.fragment = "", c = Gv } break; case Dv: if (!bv(e) || "/" != l && "\\" != l) { if ("/" != l) { e.username = r.username, e.password = r.password, e.host = r.host, e.port = r.port, c = Hv; continue } c = Mv } else c = Ev; break; case Fv: if (c = Ev, "/" != l || "/" != d.charAt(u + 1)) continue; u++; break; case Ev: if ("/" != l && "\\" != l) { c = Mv; continue } break; case Mv: if ("@" == l) { h && (d = "%40" + d), h = !0, i = dg(d); for (var f = 0; f < i.length; f++) { var g = i[f]; if (":" != g || p) { var v = vv(g, gv); p ? e.password += v : e.username += v } else p = !0 } d = "" } else if (l == Vg || "/" == l || "?" == l || "#" == l || "\\" == l && bv(e)) { if (h && "" == d) return "Invalid authority"; u -= dg(d).length + 1, d = "", c = Nv } else d += l; break; case Nv: case Pv: if (a && "file" == e.scheme) { c = Bv; continue } if (":" != l || m) { if (l == Vg || "/" == l || "?" == l || "#" == l || "\\" == l && bv(e)) { if (bv(e) && "" == d) return "Invalid host"; if (a && "" == d && (kv(e) || null !== e.port)) return; if (o = cv(e, d)) return o; if (d = "", c = Vv, a) return; continue } "[" == l ? m = !0 : "]" == l && (m = !1), d += l } else { if ("" == d) return "Invalid host"; if (o = cv(e, d)) return o; if (d = "", c = zv, a == Pv) return } break; case zv: if (!ev.test(l)) { if (l == Vg || "/" == l || "?" == l || "#" == l || "\\" == l && bv(e) || a) { if ("" != d) { var y = parseInt(d, 10); if (y > 65535) return "Invalid port"; e.port = bv(e) && y === yv[e.scheme] ? null : y, d = "" } if (a) return; c = Vv; continue } return "Invalid port" } d += l; break; case Lv: if (e.scheme = "file", "/" == l || "\\" == l) c = Ov; else { if (!r || "file" != r.scheme) { c = Hv; continue } if (l == Vg) e.host = r.host, e.path = r.path.slice(), e.query = r.query; else if ("?" == l) e.host = r.host, e.path = r.path.slice(), e.query = "", c = jv; else { if ("#" != l) { _v(n.slice(u).join("")) || (e.host = r.host, e.path = r.path.slice(), Cv(e)), c = Hv; continue } e.host = r.host, e.path = r.path.slice(), e.query = r.query, e.fragment = "", c = Gv } } break; case Ov: if ("/" == l || "\\" == l) { c = Bv; break } r && "file" == r.scheme && !_v(n.slice(u).join("")) && (wv(r.path[0], !0) ? e.path.push(r.path[0]) : e.host = r.host), c = Hv; continue; case Bv: if (l == Vg || "/" == l || "\\" == l || "?" == l || "#" == l) { if (!a && wv(d)) c = Hv; else if ("" == d) { if (e.host = "", a) return; c = Vv } else { if (o = cv(e, d)) return o; if ("localhost" == e.host && (e.host = ""), a) return; d = "", c = Vv } continue } d += l; break; case Vv: if (bv(e)) { if (c = Hv, "/" != l && "\\" != l) continue } else if (a || "?" != l) if (a || "#" != l) { if (l != Vg && (c = Hv, "/" != l)) continue } else e.fragment = "", c = Gv; else e.query = "", c = jv; break; case Hv: if (l == Vg || "/" == l || "\\" == l && bv(e) || !a && ("?" == l || "#" == l)) { if (".." === (s = (s = d).toLowerCase()) || "%2e." === s || ".%2e" === s || "%2e%2e" === s ? (Cv(e), "/" == l || "\\" == l && bv(e) || e.path.push("")) : Tv(d) ? "/" == l || "\\" == l && bv(e) || e.path.push("") : ("file" == e.scheme && !e.path.length && wv(d) && (e.host && (e.host = ""), d = d.charAt(0) + ":"), e.path.push(d)), d = "", "file" == e.scheme && (l == Vg || "?" == l || "#" == l)) for (; e.path.length > 1 && "" === e.path[0];)e.path.shift(); "?" == l ? (e.query = "", c = jv) : "#" == l && (e.fragment = "", c = Gv) } else d += vv(l, fv); break; case Uv: "?" == l ? (e.query = "", c = jv) : "#" == l ? (e.fragment = "", c = Gv) : l != Vg && (e.path[0] += vv(l, mv)); break; case jv: a || "#" != l ? l != Vg && ("'" == l && bv(e) ? e.query += "%27" : e.query += "#" == l ? "%23" : vv(l, mv)) : (e.fragment = "", c = Gv); break; case Gv: l != Vg && (e.fragment += vv(l, pv)) }u++ } }, Yv = function (e) { var t, a, r = Dd(this, Yv, "URL"), n = arguments.length > 1 ? arguments[1] : void 0, l = String(e), i = Yg(r, { type: "URL" }); if (void 0 !== n) if (n instanceof Yv) t = Xg(n); else if (a = Wv(t = {}, String(n))) throw TypeError(a); if (a = Wv(i, l, null, t)) throw TypeError(a); var o = i.searchParams = new Gg, c = Wg(o); c.updateSearchParams(i.query), c.updateURL = function () { i.query = String(o) || null }, s || (r.href = Kv.call(r), r.origin = Zv.call(r), r.protocol = Qv.call(r), r.username = Jv.call(r), r.password = ey.call(r), r.host = ty.call(r), r.hostname = ay.call(r), r.port = ry.call(r), r.pathname = ny.call(r), r.search = ly.call(r), r.searchParams = iy.call(r), r.hash = oy.call(r)) }, Xv = Yv.prototype, Kv = function () { var e = Xg(this), t = e.scheme, a = e.username, r = e.password, n = e.host, l = e.port, i = e.path, o = e.query, s = e.fragment, c = t + ":"; return null !== n ? (c += "//", kv(e) && (c += a + (r ? ":" + r : "") + "@"), c += hv(n), null !== l && (c += ":" + l)) : "file" == t && (c += "//"), c += e.cannotBeABaseURL ? i[0] : i.length ? "/" + i.join("/") : "", null !== o && (c += "?" + o), null !== s && (c += "#" + s), c }, Zv = function () { var e = Xg(this), t = e.scheme, a = e.port; if ("blob" == t) try { return new URL(t.path[0]).origin } catch (e) { return "null" } return "file" != t && bv(e) ? t + "://" + hv(e.host) + (null !== a ? ":" + a : "") : "null" }, Qv = function () { return Xg(this).scheme + ":" }, Jv = function () { return Xg(this).username }, ey = function () { return Xg(this).password }, ty = function () { var e = Xg(this), t = e.host, a = e.port; return null === t ? "" : null === a ? hv(t) : hv(t) + ":" + a }, ay = function () { var e = Xg(this).host; return null === e ? "" : hv(e) }, ry = function () { var e = Xg(this).port; return null === e ? "" : String(e) }, ny = function () { var e = Xg(this), t = e.path; return e.cannotBeABaseURL ? t[0] : t.length ? "/" + t.join("/") : "" }, ly = function () { var e = Xg(this).query; return e ? "?" + e : "" }, iy = function () { return Xg(this).searchParams }, oy = function () { var e = Xg(this).fragment; return e ? "#" + e : "" }, sy = function (e, t) { return { get: e, set: t, configurable: !0, enumerable: !0 } }; if (s && Xe(Xv, { href: sy(Kv, (function (e) { var t = Xg(this), a = String(e), r = Wv(t, a); if (r) throw TypeError(r); Wg(t.searchParams).updateSearchParams(t.query) })), origin: sy(Zv), protocol: sy(Qv, (function (e) { var t = Xg(this); Wv(t, String(e) + ":", Av) })), username: sy(Jv, (function (e) { var t = Xg(this), a = dg(String(e)); if (!xv(t)) { t.username = ""; for (var r = 0; r < a.length; r++)t.username += vv(a[r], gv) } })), password: sy(ey, (function (e) { var t = Xg(this), a = dg(String(e)); if (!xv(t)) { t.password = ""; for (var r = 0; r < a.length; r++)t.password += vv(a[r], gv) } })), host: sy(ty, (function (e) { var t = Xg(this); t.cannotBeABaseURL || Wv(t, String(e), Nv) })), hostname: sy(ay, (function (e) { var t = Xg(this); t.cannotBeABaseURL || Wv(t, String(e), Pv) })), port: sy(ry, (function (e) { var t = Xg(this); xv(t) || ("" == (e = String(e)) ? t.port = null : Wv(t, e, zv)) })), pathname: sy(ny, (function (e) { var t = Xg(this); t.cannotBeABaseURL || (t.path = [], Wv(t, e + "", Vv)) })), search: sy(ly, (function (e) { var t = Xg(this); "" == (e = String(e)) ? t.query = null : ("?" == e.charAt(0) && (e = e.slice(1)), t.query = "", Wv(t, e, jv)), Wg(t.searchParams).updateSearchParams(t.query) })), searchParams: sy(iy), hash: sy(oy, (function (e) { var t = Xg(this); "" != (e = String(e)) ? ("#" == e.charAt(0) && (e = e.slice(1)), t.fragment = "", Wv(t, e, Gv)) : t.fragment = null })) }), ne(Xv, "toJSON", (function () { return Kv.call(this) }), { enumerable: !0 }), ne(Xv, "toString", (function () { return Kv.call(this) }), { enumerable: !0 }), jg) { var cy = jg.createObjectURL, uy = jg.revokeObjectURL; cy && ne(Yv, "createObjectURL", (function (e) { return cy.apply(jg, arguments) })), uy && ne(Yv, "revokeObjectURL", (function (e) { return uy.apply(jg, arguments) })) } Gs(Yv, "URL"), Ee({ global: !0, forced: !ug, sham: !s }, { URL: Yv }); var dy = { createDialog: function () { var e = gn(), t = e.splitText, a = e.punctuation, r = e.button; $("#luckysheet-modal-dialog-mask").show(), $("#luckysheet-splitColumn-dialog").remove(); var n = '
      ' + t.splitDelimiters + '
      ' + t.splitDataPreview + '
      '; $("body").append(_m(bn, { id: "luckysheet-splitColumn-dialog", addclass: "luckysheet-splitColumn-dialog", title: t.splitTextTitle, content: n, botton: '", style: "z-index:100003" })); var l = $("#luckysheet-splitColumn-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 400).end(), i = l.outerHeight(), o = l.outerWidth(), s = $(window).width(), c = $(window).height(), u = $(document).scrollLeft(), d = $(document).scrollTop(); $("#luckysheet-splitColumn-dialog").css({ left: (s + u - o) / 2, top: (c + d - i) / 3 }).show(); var h = this.getDataArr(); this.dataPreview(h) }, init: function () { var e = this, t = gn().splitText; $(document).off("change.SPCinpcheckbox").on("change.SPCcheckbox", "#luckysheet-splitColumn-dialog .box input[type='checkbox']", (function () { var t = e.getRegStr(), a = e.getDataArr(t); e.dataPreview(a) })), $(document).off("keyup.SPCinptext").on("keyup.SPCinptext", "#luckysheet-splitColumn-dialog .box input[type='text']", (function () { if ($(this).siblings("input[type='checkbox']").is(":checked")) { var t = e.getRegStr(), a = e.getDataArr(t); e.dataPreview(a) } })), $(document).off("click.SPCconfirm").on("click.SPCconfirm", "#luckysheet-splitColumn-dialog #luckysheet-splitColumn-dialog-confirm", (function () { $("#luckysheet-modal-dialog-mask").hide(), $("#luckysheet-splitColumn-dialog").hide(); var a = e.getRegStr(), r = e.getDataArr(a), n = ga.luckysheet_select_save[0].row[0], l = ga.luckysheet_select_save[0].column[0]; if (1 != r[0].length) { for (var i = !1, o = 0; o < r.length; o++)for (var s = 1; s < r[0].length; s++) { var c = ga.flowdata[n + o][l + s]; if (null != c && null != c.v) { i = !0; break } } if (i) { fd.confirm("", t.splitConfirmToExe, (function () { e.update(n, l, r) })) } else e.update(n, l, r) } })) }, update: function (e, t, a) { for (var r = rs.deepCopyFlowData(ga.flowdata), n = 0; n < a.length; n++)for (var l = 0; l < a[0].length; l++) { Cs(e + n, t + l, r, a[n][l]) } var i = ga.luckysheet_select_save[0].row[0], o = ga.luckysheet_select_save[0].column[0]; id(r, [{ row: [i, i + a.length - 1], column: [o, o + a[0].length - 1] }]), Rh() }, dataPreview: function (e) { $("#luckysheet-splitColumn-dialog #splitColumnData").empty(); for (var t = "", a = 0; a < e.length; a++) { for (var r = "", n = 0; n < e[0].length; n++)r += "" + e[a][n] + ""; t += "" + r + "" } var l = "" + t + "
      "; $("#luckysheet-splitColumn-dialog #splitColumnData").append(l) }, getRegStr: function () { var e = "", t = 0; return $("#luckysheet-splitColumn-dialog .box input[type='checkbox']:checked").each((function (a, r) { var n = $(r).attr("id"); if ("splitColumn_type_01" == n) e += "\\t", t++; else if ("splitColumn_type_02" == n) t > 0 && (e += "|"), e += ";", t++; else if ("splitColumn_type_03" == n) t > 0 && (e += "|"), e += ",", t++; else if ("splitColumn_type_04" == n) t > 0 && (e += "|"), e += "\\s", t++; else if ("splitColumn_type_05" == n) { var l = $(r).siblings("input[type='text']").val().trim(); "" != l && (t > 0 && (e += "|"), e += l) } else "splitColumn_type_06" == n && (e = "[" + e + "]+") })), e }, getDataArr: function (e) { var t = [], a = ga.luckysheet_select_save[0].row[0], r = ga.luckysheet_select_save[0].row[1], n = ga.luckysheet_select_save[0].column[0]; if (null != e && "" != e) { for (var l = new RegExp(e, "g"), i = [], o = a; o <= r; o++) { var s, c = ga.flowdata[o][n], u = void 0; null == (u = null != c && null != c.m ? c.m : Ko(o, n, ga.flowdata)) && (u = ""), s = u.toString().split(l), i.push(s) } for (var d = i.length, h = 0, m = 0; m < d; m++)i[m].length > h && (h = i[m].length); t = this.getNullData(d, h); for (var p = 0; p < t.length; p++)for (var f = 0; f < t[0].length; f++)null != i[p][f] && (t[p][f] = i[p][f]) } else for (var g = a; g <= r; g++) { var v = [], y = ga.flowdata[g][n], b = void 0; null == (b = null != y && null != y.m ? y.m : Ko(g, n, ga.flowdata)) && (b = ""), v.push(b), t.push(v) } return t }, getNullData: function (e, t) { for (var a = [], r = 0; r < e; r++) { for (var n = [], l = 0; l < t; l++)n.push(""); a.push(n) } return a } }, hy = !1; function my(e, t) { if (null != ga.luckysheet_select_save && ga.luckysheet_select_save.length > 0) { var a = Sh.getSheetByIndex().data; if (null != a) for (var r = 0; r < ga.luckysheet_select_save.length; r++)for (var n = ga.luckysheet_select_save[r], l = n.row, i = n.column, o = l[0]; o <= l[1]; o++)for (var s = i[0]; s <= i[1]; s++) { var c = void 0, u = xm.mergeborer(a, o, s); if (u) { var d = u.row[2], h = u.column[2]; c = a[d][h] } else c = a[o][s]; e(c, o, s, a) } else t(); return a } } function py() { if (!hy) { hy = !0; var e = gn(), t = e.cellFormat, a = e.button; $("body").append(_m(bn, { id: "luckysheet-cellFormat-config", addclass: "luckysheet-cellFormat-config", title: t.cellFormatTitle, content: '\n
      \n
      \n '.concat(t.protection, '\n
      \n
      \n
      \n
      \n

      \n ').concat(t.protectionTips, '\n

      \n 部分选中\n
      \n 全部选中\n
      \n
      \n "), botton: '\n "), style: "z-index:100003" })), function () { var e = gn().cellFormat; $("#luckysheet-cellFormat-confirm").click((function () { var t = $("#luckysheet-protection-check-locked").is(":checked"), a = $("#luckysheet-protection-check-hidden").is(":checked"); t = 1 == t ? 1 : 0, a = 1 == a ? 1 : 0, id(my((function (e, r, n, l) { null == e ? Cs(r, n, l, { lo: t, hi: a }) : (e.lo = t, e.hi = a) }), (function () { alert(e.sheetDataIsNullAlert) })), void 0, void 0, !1), $("#luckysheet-cellFormat-config").hide(), $("#luckysheet-modal-dialog-mask").hide() })) }() } } function fy(e) { var t = $("#luckysheet-cell-main"), a = $("#luckysheet-scrollbar-x").scrollLeft(), r = $("#luckysheet-scrollbar-y").scrollTop(), n = $("#luckysheetTableContent").height(); return null != Bc.freezenhorizontaldata && r < Bc.freezenhorizontaldata[2] ? (r = Bc.freezenhorizontaldata[2], void $("#luckysheet-scrollbar-y").scrollTop(r)) : null != Bc.freezenverticaldata && a < Bc.freezenverticaldata[2] ? (a = Bc.freezenverticaldata[2], void $("#luckysheet-scrollbar-x").scrollLeft(a)) : ($("#luckysheet-cols-h-c").scrollLeft(a), $("#luckysheet-rows-h").scrollTop(r), t.scrollLeft(a).scrollTop(r), $("#luckysheet-input-box-index").css({ left: $("#luckysheet-input-box").css("left"), top: parseInt($("#luckysheet-input-box").css("top")) - 20 + "px", "z-index": $("#luckysheet-input-box").css("z-index") }).show(), md(a, r), $("#luckysheet-bottom-controll-row").css("left", a), null == Bc.freezenhorizontaldata && null == Bc.freezenverticaldata || Bc.scrollAdapt(), void Nc.createHookFunction("scroll", { scrollLeft: a, scrollTop: r, canvasHeight: n })) } function gy() { Ml.detectOS(); Ml.mobilecheck() && function () { ga.cellMainSrollBarSize = 0; var e = !1, t = {}, a = !1, r = null; $(document).on("touchstart", "#luckysheet-grid-window-1", (function (a) { clearInterval(r), e = !0; var n = a.originalEvent.targetTouches[0]; t = { x: n.pageX, y: n.pageY, vy: 0, moveType: "y" } })), $(document).on("touchmove", "#luckysheet-grid-window-1", (function (r) { if (!(r.originalEvent.targetTouches.length > 1 || r.scale && 1 !== r.scale)) { var n = r.originalEvent.targetTouches[0]; if (e) { var l = n.pageX - t.x, i = n.pageY - t.y; t.x = n.pageX, t.y = n.pageY; var o = $("#luckysheet-scrollbar-x").scrollLeft(), s = $("#luckysheet-scrollbar-y").scrollTop(); (o -= l) < 0 && (o = 0), (s -= i) < 0 && (s = 0), $("#luckysheet-scrollbar-y").scrollTop(s), t.vy_y = i, t.scrollTop = s, $("#luckysheet-scrollbar-x").scrollLeft(o), t.vy_x = l, t.scrollLeft = o } else if (a) { var c = $s(n.pageX, n.pageY), u = c[0] + $("#luckysheet-cell-main").scrollLeft(), d = Ss(c[1] + $("#luckysheet-cell-main").scrollTop()), h = d[1], m = d[0], p = d[2], f = Rs(u), g = f[1], v = f[0], y = f[2], b = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), k = 0, x = 0, w = []; b.top > m ? (k = m, x = b.top + b.height - m, b.row[1] > b.row_focus && (b.row[1] = b.row_focus), w = [p, b.row[1]]) : b.top == m ? (k = m, x = b.top + b.height - m, w = [p, b.row[0]]) : (k = b.top, x = h - b.top - 1, b.row[0] < b.row_focus && (b.row[0] = b.row_focus), w = [b.row[0], p]); var _ = 0, C = 0, T = []; b.left > v ? (_ = v, C = b.left + b.width - v, b.column[1] > b.column_focus && (b.column[1] = b.column_focus), T = [y, b.column[1]]) : b.left == v ? (_ = v, C = b.left + b.width - v, T = [y, b.column[0]]) : (_ = b.left, C = g - b.left - 1, b.column[0] < b.column_focus && (b.column[0] = b.column_focus), T = [b.column[0], y]); var A = xm.mergeMoveMain(T, w, b, k, x, _, C); null != A && (T = A[0], w = A[1], k = A[2], x = A[3], _ = A[4], C = A[5]), b.row = w, b.column = T, b.left_move = _, b.width_move = C, b.top_move = k, b.height_move = x, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = b, Rh(), Bc.scrollFreezen() } r.stopPropagation() } })), $(document).on("touchend", (function (n) { if (e) { var l = Math.abs(t.vy_x), i = .25 * (2 * (l >> 31) + 1), o = Math.abs(t.vy_y), s = .25 * (2 * (o >> 31) + 1); (l > 0 || o > 0) && (r = setInterval((function () { (l -= i) <= 0 && (l = 0), (o -= s) <= 0 && (o = 0), t.vy_y > 0 ? t.scrollTop -= o : t.scrollTop += o, $("#luckysheet-scrollbar-y").scrollTop(t.scrollTop), t.vy_x > 0 ? t.scrollLeft -= l : t.scrollLeft += l, $("#luckysheet-scrollbar-x").scrollLeft(t.scrollLeft), l <= 0 && o <= 0 && clearInterval(r) }), 20)) } e = !1, a = !1 })), $(document).on("touchstart", ".luckysheet-cs-touchhandle", (function (t) { a = !0, e = !1, t.stopPropagation() })), document.addEventListener("touchmove", (function (e) { e.preventDefault() }), { passive: !1 }) }(), Date.now || (Date.now = function () { return (new Date).getTime() }), function () { for (var e = ["webkit", "moz"], t = 0; t < e.length && !window.requestAnimationFrame; ++t) { var a = e[t]; window.requestAnimationFrame = window[a + "RequestAnimationFrame"], window.cancelAnimationFrame = window[a + "CancelAnimationFrame"] || window[a + "CancelRequestAnimationFrame"] } if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) { var r = 0; window.requestAnimationFrame = function (e) { var t = Date.now(), a = Math.max(r + 16, t); return setTimeout((function () { e(r = a) }), a - t) }, window.cancelAnimationFrame = clearTimeout } }(), $("#luckysheet-sheet-container-c").mousewheel((function (e, t) { var a = e.deltaFactor < 40 ? 1 : e.deltaFactor < 80 ? 2 : 3, r = $(this).scrollLeft(); 0 != e.deltaY ? e.deltaY < 0 ? r += 10 * a : r -= 10 * a : 0 != e.deltaX && (e.deltaX > 0 ? r += 10 * a : r -= 10 * a), $(this).scrollLeft(r), e.preventDefault() })), $("#luckysheet-cell-main").scroll((function () { })).mousewheel((function (e, t) { e.preventDefault() })); var e, t = gn(), a = t.drag, r = t.info; $("#luckysheet-grid-window-1").mousewheel((function (t, a) { var r = $("#luckysheet-scrollbar-x").scrollLeft(), n = $("#luckysheet-scrollbar-y").scrollTop(), l = ga.visibledatacolumn, i = ga.visibledatarow; null != Bc.freezenhorizontaldata && (i = Bc.freezenhorizontaldata[3]), null != Bc.freezenverticaldata && (l = Bc.freezenverticaldata[3]), clearTimeout(e), null != ga.visibledatacolumn_unique ? l = ga.visibledatacolumn_unique : (l = $m(l), ga.visibledatacolumn_unique = l), null != ga.visibledatarow_unique ? i = ga.visibledatarow_unique : (i = $m(i), ga.visibledatarow_unique = i); Ts(l, r); var o = Ts(i, n); null != Bc.freezenhorizontaldata && (o = Ts(i, n + Bc.freezenhorizontaldata[0])); var s = 0, c = t.deltaFactor < 40 ? 1 : t.deltaFactor < 80 ? 2 : 3; if (0 != t.deltaY) { var u, d = Math.round(c / ga.zoomRatio); d = d < 1 ? 1 : d, t.deltaY < 0 ? (u = o + d) >= i.length && (u = i.length - 1) : (u = o - d) < 0 && (u = 0), s = 0 == u ? 0 : i[u - 1], null != Bc.freezenhorizontaldata && (s -= Bc.freezenhorizontaldata[0]), $("#luckysheet-scrollbar-y").scrollTop(s) } else 0 != t.deltaX && (t.deltaX > 0 ? r += 20 * ga.zoomRatio : r -= 20 * ga.zoomRatio, $("#luckysheet-scrollbar-x").scrollLeft(r)); e = setTimeout((function () { ga.visibledatacolumn_unique = null, ga.visibledatarow_unique = null }), 500) })), $("#luckysheet-scrollbar-x").scroll((function () { fy() })).mousewheel((function (e, t) { e.preventDefault() })), $("#luckysheet-scrollbar-y").scroll((function () { fy() })).mousewheel((function (e, t) { e.preventDefault() })), $(window).resize((function () { document.getElementById(ga.container) && Uc() })), $("#luckysheet-rich-text-editor").mouseup((function (e) { xm.inputMenuButtonFocus(e.target) })), $("#luckysheet-cell-main, #luckysheetTableContent").mousedown((function (e) { if (!$(e.target).hasClass("luckysheet-mousedown-cancel")) { !function () { var e = zm(".luckysheet-multipleRange-show"); void 0 === e.length && (e = [e]); e.forEach((function (e) { var t = e.id.replace("luckysheet-multipleRange-show-", ""); null === ga.cooperativeEdit.usernameTimeout["user" + t] && (zm(".username", e).style.display = "none") })) }(), $("#luckysheet-cell-selected").find(".luckysheet-cs-fillhandle").css("cursor", "default").end().find(".luckysheet-cs-draghandle").css("cursor", "default"), $("#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0").css("cursor", "default"), Pc.removeActivePs(), ($("#luckysheet-modal-dialog-activeImage").is(":visible") || $("#luckysheet-modal-dialog-cropping").is(":visible")) && Rc.cancelActiveImgItem(); var t = $s(e.pageX, e.pageY); if (!(t[0] >= ga.cellmainWidth - ga.cellMainSrollBarSize || t[1] >= ga.cellmainHeight - ga.cellMainSrollBarSize)) { var a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = t[1] + $("#luckysheet-cell-main").scrollTop(); null != Bc.freezenverticaldata && t[0] < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] && (a = t[0] + Bc.freezenverticaldata[2]), null != Bc.freezenhorizontaldata && t[1] < Bc.freezenhorizontaldata[0] - Bc.freezenhorizontaldata[2] && (r = t[1] + Bc.freezenhorizontaldata[2]); var n = Sh.getSheetByIndex(), l = $("#luckysheetTableContent").get(0).getContext("2d"), i = Ss(r), o = i[1], s = i[0], c = i[2], u = Rs(a), d = u[1], h = u[0], m = u[2], p = c, f = m, g = xm.mergeborer(ga.flowdata, c, m); if (g && (o = g.row[1], s = g.row[0], c = g.row[2], p = g.row[3], d = g.column[1], h = g.column[0], m = g.column[2], f = g.column[3]), Nc.createHookFunction("cellMousedownBefore", ga.flowdata[c][m], { r: c, c: m, start_r: s, start_c: h, end_r: o, end_c: d }, n, l)) { if ($c.cellFocus(c, m, !0), h < $("#luckysheet-cell-main").scrollLeft() && $("#luckysheet-scrollbar-x").scrollLeft(h), s < $("#luckysheet-cell-main").scrollTop() && $("#luckysheet-scrollbar-y").scrollTop(s), "3" == e.which) { $("#luckysheet-dataVerification-showHintBox").hide(); for (var v = !1, y = 0; y < ga.luckysheet_select_save.length; y++)if (null != ga.luckysheet_select_save[y].row && c >= ga.luckysheet_select_save[y].row[0] && c <= ga.luckysheet_select_save[y].row[1] && m >= ga.luckysheet_select_save[y].column[0] && m <= ga.luckysheet_select_save[y].column[1]) { v = !0; break } if (v) return } if (null == ga.flowdata[c] || null == ga.flowdata[c][m] || null == ga.flowdata[c][m].dd || null == fa.fireMousedown || "function" != Cm(fa.fireMousedown)) if (rd.hyperlink && rd.hyperlink[c + "_" + m] && "3" != e.which) rd.cellFocus(c, m); else { ga.luckysheet_scroll_status = !0; var b = $("#luckysheet-input-box"); if (parseInt(b.css("top")) > 0) { if (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton()) { var k = [c, p], x = [m, f], w = h, _ = d - h - 1, C = s, T = o - s - 1; if (e.shiftKey) { var A = Ih.func_selectedrange, S = 0, I = 0, R = []; A.top > s ? (S = s, I = A.top + A.height - s, A.row[1] > A.row_focus && (A.row[1] = A.row_focus), R = [c, A.row[1]]) : A.top == s ? (S = s, I = A.top + A.height - s, R = [c, A.row[0]]) : (S = A.top, I = o - A.top - 1, A.row[0] < A.row_focus && (A.row[0] = A.row_focus), R = [A.row[0], c]); var q = 0, D = 0, F = []; A.left > h ? (q = h, D = A.left + A.width - h, A.column[1] > A.column_focus && (A.column[1] = A.column_focus), F = [m, A.column[1]]) : A.left == h ? (q = h, D = A.left + A.width - h, F = [m, A.column[0]]) : (q = A.left, D = d - A.left - 1, A.column[0] < A.column_focus && (A.column[0] = A.column_focus), F = [A.column[0], m]); var E = xm.mergeMoveMain(F, R, A, S, I, q, D); null != E && (F = E[0], R = E[1], S = E[2], I = E[3], q = E[4], D = E[5]), Mh(q, S, D, I, R, F), A.row = R, A.column = F, A.left_move = q, A.width_move = D, A.top_move = S, A.height_move = I, Ih.func_selectedrange = A } else if (e.ctrlKey && "," != $("#luckysheet-rich-text-editor").find("span").last().text()) { var M = $("#luckysheet-rich-text-editor").text(); if (M.length > 0) { var N = M.substr(M.length - 1, 1); "," != N && "=" != N && "(" != N && (M += ",") } if (M.length > 0 && "=" == M.substr(0, 1)) { if (M = Ih.functionHTMLGenerate(M), window.getSelection) { var P = window.getSelection(); Ih.functionRangeIndex = [$(P.anchorNode).parent().index(), P.anchorOffset] } else { var z = document.selection.createRange(); Ih.functionRangeIndex = z } $("#luckysheet-rich-text-editor").html(M), Ih.canceFunctionrangeSelected(), Ih.createRangeHightlight() } Ih.rangestart = !1, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, $("#luckysheet-functionbox-cell").html(M), Ih.rangeHightlightselected($("#luckysheet-rich-text-editor")), Ih.israngeseleciton(), Ih.func_selectedrange = { left: w, width: _, top: C, height: T, left_move: w, width_move: _, top_move: C, height_move: T, row: k, column: x, row_focus: c, column_focus: m } } else Ih.func_selectedrange = { left: w, width: _, top: C, height: T, left_move: w, width_move: _, top_move: C, height_move: T, row: k, column: x, row_focus: c, column_focus: m }; return Ih.rangeSetValue({ row: k, column: x }), Ih.rangestart = !0, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, $("#luckysheet-formula-functionrange-select").css({ left: w, width: _, top: C, height: T }).show(), $("#luckysheet-formula-help-c").hide(), Mh(w, C, _, T, k, x), void setTimeout((function () { var e, t = window.getSelection().anchorNode; $("#luckysheet-search-formula-parm").is(":visible") || $("#luckysheet-search-formula-parm-select").is(":visible") ? (e = $("#luckysheet-rich-text-editor"), Ih.rangechangeindex = Ih.data_parm_index) : e = $(t).closest("div"); var a = e.find("span[rangeindex='" + Ih.rangechangeindex + "']"); Ih.setCaretPosition(a.get(0), 0, a.html().length) }), 1) } Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_select_status = !0, $("#luckysheet-info").is(":visible") && (ga.luckysheet_select_status = !1) } else gu(c, m, ga.currentSheetIndex) && (ga.luckysheet_select_status = !0); if ($("#luckysheet-multiRange-dialog").is(":visible")) { if (gd.selectStatus = !0, ga.luckysheet_select_status = !1, e.shiftKey) { var L = gd.selectRange[gd.selectRange.length - 1], O = 0, B = 0, V = []; L.top > s ? (O = s, B = L.top + L.height - s, L.row[1] > L.row_focus && (L.row[1] = L.row_focus), V = [c, L.row[1]]) : L.top == s ? (O = s, B = L.top + L.height - s, V = [c, L.row[0]]) : (O = L.top, B = o - L.top - 1, L.row[0] < L.row_focus && (L.row[0] = L.row_focus), V = [L.row[0], c]); var H = 0, U = 0, j = []; L.left > h ? (H = h, U = L.left + L.width - h, L.column[1] > L.column_focus && (L.column[1] = L.column_focus), j = [m, L.column[1]]) : L.left == h ? (H = h, U = L.left + L.width - h, j = [m, L.column[0]]) : (H = L.left, U = d - L.left - 1, L.column[0] < L.column_focus && (L.column[0] = L.column_focus), j = [L.column[0], m]); var G = xm.mergeMoveMain(j, V, L, O, B, H, U); null != G && (j = G[0], V = G[1], O = G[2], B = G[3], H = G[4], U = G[5]), L.row = V, L.column = j, L.left_move = H, L.width_move = U, L.top_move = O, L.height_move = B, gd.selectRange[gd.selectRange.length - 1] = L } else e.ctrlKey || (gd.selectRange = []), gd.selectRange.push({ left: h, width: d - h - 1, top: s, height: o - s - 1, left_move: h, width_move: d - h - 1, top_move: s, height_move: o - s - 1, row: [c, p], column: [m, f], row_focus: c, column_focus: m }); Eh(gd.selectRange); var W = gd.getTxtByRange(gd.selectRange); $("#luckysheet-multiRange-dialog input").val(W) } else if (gd.selectStatus = !1, gd.selectRange = [], $("#luckysheet-singleRange-dialog").is(":visible")) { ga.luckysheet_select_status = !1, Eh([{ row: [c, c], column: [m, m] }]); var Y = Cl(ga.currentSheetIndex, { row: [c, c], column: [m, m] }, ga.currentSheetIndex); $("#luckysheet-singleRange-dialog input").val(Y) } else { if ($("#luckysheet-dataVerificationRange-dialog").is(":visible")) { if ($c.selectStatus = !0, ga.luckysheet_select_status = !1, e.shiftKey) { var X = $c.selectRange[$c.selectRange.length - 1], K = 0, Z = 0, Q = []; X.top > s ? (K = s, Z = X.top + X.height - s, X.row[1] > X.row_focus && (X.row[1] = X.row_focus), Q = [c, X.row[1]]) : X.top == s ? (K = s, Z = X.top + X.height - s, Q = [c, X.row[0]]) : (K = X.top, Z = o - X.top - 1, X.row[0] < X.row_focus && (X.row[0] = X.row_focus), Q = [X.row[0], c]); var J = 0, ee = 0, te = []; X.left > h ? (J = h, ee = X.left + X.width - h, X.column[1] > X.column_focus && (X.column[1] = X.column_focus), te = [m, X.column[1]]) : X.left == h ? (J = h, ee = X.left + X.width - h, te = [m, X.column[0]]) : (J = X.left, ee = d - X.left - 1, X.column[0] < X.column_focus && (X.column[0] = X.column_focus), te = [X.column[0], m]); var ae = xm.mergeMoveMain(te, Q, X, K, Z, J, ee); null != ae && (te = ae[0], Q = ae[1], K = ae[2], Z = ae[3], J = ae[4], ee = ae[5]), X.row = Q, X.column = te, X.left_move = J, X.width_move = ee, X.top_move = K, X.height_move = Z, $c.selectRange[$c.selectRange.length - 1] = X } else $c.selectRange = [], $c.selectRange.push({ left: h, width: d - h - 1, top: s, height: o - s - 1, left_move: h, width_move: d - h - 1, top_move: s, height_move: o - s - 1, row: [c, p], column: [m, f], row_focus: c, column_focus: m }); Eh($c.selectRange); var re = $c.getTxtByRange($c.selectRange); return Ih.rangetosheet != ga.currentSheetIndex && (re = ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "!" + re), void $("#luckysheet-dataVerificationRange-dialog input").val(re) } if ($c.selectStatus = !1, $c.selectRange = [], bm.singleRangeFocus && $("#luckysheet-ifFormulaGenerator-dialog .singRange").click(), $("#luckysheet-ifFormulaGenerator-singleRange-dialog").is(":visible")) { ga.luckysheet_select_status = !1, Ih.rangestart = !1, $("#luckysheet-formula-functionrange-select").css({ left: h, width: d - h - 1, top: s, height: o - s - 1 }).show(), $("#luckysheet-formula-help-c").hide(); var ne = Cl(ga.currentSheetIndex, { row: [c, c], column: [m, m] }, ga.currentSheetIndex); $("#luckysheet-ifFormulaGenerator-singleRange-dialog input").val(ne) } else { if ($("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { ga.luckysheet_select_status = !1, Ih.func_selectedrange = { left: h, width: d - h - 1, top: s, height: o - s - 1, left_move: h, width_move: d - h - 1, top_move: s, height_move: o - s - 1, row: [c, c], column: [m, m], row_focus: c, column_focus: m }, Ih.rangestart = !0, $("#luckysheet-formula-functionrange-select").css({ left: h, width: d - h - 1, top: s, height: o - s - 1 }).show(), $("#luckysheet-formula-help-c").hide(); var le = Cl(ga.currentSheetIndex, { row: [c, c], column: [m, m] }, ga.currentSheetIndex); return $("#luckysheet-ifFormulaGenerator-multiRange-dialog input").val(le), $("#luckysheet-row-count-show").hide(), void $("#luckysheet-column-count-show").hide() } if (ga.luckysheet_select_status) { if (e.shiftKey) { var ie = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), oe = 0, se = 0, ce = []; ie.top > s ? (oe = s, se = ie.top + ie.height - s, ie.row[1] > ie.row_focus && (ie.row[1] = ie.row_focus), ce = [c, ie.row[1]]) : ie.top == s ? (oe = s, se = ie.top + ie.height - s, ce = [c, ie.row[0]]) : (oe = ie.top, se = o - ie.top - 1, ie.row[0] < ie.row_focus && (ie.row[0] = ie.row_focus), ce = [ie.row[0], c]); var ue = 0, de = 0, he = []; ie.left > h ? (ue = h, de = ie.left + ie.width - h, ie.column[1] > ie.column_focus && (ie.column[1] = ie.column_focus), he = [m, ie.column[1]]) : ie.left == h ? (ue = h, de = ie.left + ie.width - h, he = [m, ie.column[0]]) : (ue = ie.left, de = d - ie.left - 1, ie.column[0] < ie.column_focus && (ie.column[0] = ie.column_focus), he = [ie.column[0], m]); var me = xm.mergeMoveMain(he, ce, ie, oe, se, ue, de); null != me && (he = me[0], ce = me[1], oe = me[2], se = me[3], ue = me[4], de = me[5]), ie.row = ce, ie.column = he, ie.left_move = ue, ie.width_move = de, ie.top_move = oe, ie.height_move = se, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = ie, $("#luckysheet-alternateformat-rangeDialog").is(":visible") && $("#luckysheet-alternateformat-rangeDialog input").val(Cl(ga.currentSheetIndex, ga.luckysheet_select_save)), Ru.luckysheet_pivotTable_select_state && $("#luckysheet-pivotTable-range-selection-input").val(ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "!" + Im(ga.luckysheet_select_save[0].column[0]) + (ga.luckysheet_select_save[0].row[0] + 1) + ":" + Im(ga.luckysheet_select_save[0].column[1]) + (ga.luckysheet_select_save[0].row[1] + 1)) } else e.ctrlKey ? ga.luckysheet_select_save.push({ left: h, width: d - h - 1, top: s, height: o - s - 1, left_move: h, width_move: d - h - 1, top_move: s, height_move: o - s - 1, row: [c, p], column: [m, f], row_focus: c, column_focus: m }) : (ga.luckysheet_select_save.length = 0, ga.luckysheet_select_save.push({ left: h, width: d - h - 1, top: s, height: o - s - 1, left_move: h, width_move: d - h - 1, top_move: s, height_move: o - s - 1, row: [c, p], column: [m, f], row_focus: c, column_focus: m }), xm.menuButtonFocus(ga.flowdata, c, m), Ih.fucntionboxshow(c, m)); Rh(), null == Bc.freezenhorizontaldata && null == Bc.freezenverticaldata || Bc.scrollAdaptOfselect(), Ml.mobilecheck() || Fm(), pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save) } wc.rangefocus && (wc.rangefocus = !1, $("#luckysheet-alternateformat-range .fa-table").click()), $("#luckysheet-row-count-show, #luckysheet-column-count-show").hide(), wa() || vh(), Ru.pivotclick(c, m, ga.currentSheetIndex), Em(), Nc.createHookFunction("cellMousedown", ga.flowdata[c][m], { r: c, c: m, start_r: s, start_c: h, end_r: o, end_c: d }, n, l) } } } else fa.fireMousedown(ga.flowdata[c][m].dd) } } } })).mouseup((function (e) { if ("3" == e.which) { if (!ga.allowEdit) return; if (wa()) return; var t = e.pageX, a = e.pageY, r = ga.luckysheet_select_save[0], n = fa.cellRightClickConfig; if ($("#luckysheet-cols-rows-data").show(), $("#luckysheet-cols-rows-handleincell").show(), $("#luckysheet-cols-rows-add, #luckysheet-cols-rows-shift").hide(), zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-cols-rows-handleincell .luckysheet-menuseparator").style.display = "block", null != r.row && 0 == r.row[0] && r.row[1] == ga.flowdata.length - 1) { if (!(n.copy || n.copyAs || n.paste || n.insertColumn || n.deleteColumn || n.hideColumn || n.columnWidth || n.clear || n.matrix || n.sort || n.filter || n.chart || n.image || n.link || n.data || n.cellFormat)) return; ga.luckysheetRightHeadClickIs = "column", $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word").text(gn().rightclick.column), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size").text(gn().rightclick.width), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left").text(gn().rightclick.left), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right").text(gn().rightclick.right), $("#luckysheet-cols-rows-add").show(), $("#luckysheet-cols-rows-shift").hide(), $("#luckysheet-cols-rows-handleincell").hide(), ga.luckysheet_cols_menu_status = !0, zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-top-left-add-selected").style.display = n.insertColumn ? "block" : "none", zm("#luckysheet-bottom-right-add-selected").style.display = n.insertColumn ? "block" : "none", zm("#luckysheet-del-selected").style.display = n.deleteColumn ? "block" : "none", zm("#luckysheet-hide-selected").style.display = n.hideColumn ? "block" : "none", zm("#luckysheet-show-selected").style.display = n.hideColumn ? "block" : "none", zm("#luckysheet-column-row-width-selected").style.display = n.columnWidth ? "block" : "none", n.copy || n.copyAs || n.paste || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none", n.insertColumn || n.deleteColumn || n.hideColumn || n.columnWidth || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none")), n.insertColumn || n.deleteColumn || n.hideColumn || n.columnWidth || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none"); var l = $.extend(!0, {}, ga.config); null == l.columnlen && (l.columnlen = {}); for (var i = null == l.columnlen[ga.luckysheet_select_save[0].column[0]] ? ga.defaultcollen : l.columnlen[ga.luckysheet_select_save[0].column[0]], o = !0, s = 0; s < ga.luckysheet_select_save.length; s++)for (var c = ga.luckysheet_select_save[s], u = c.column[0], d = c.column[1], h = u; h <= d; h++) { if ((null == l.columnlen[h] ? ga.defaultcollen : l.columnlen[h]) != i) { o = !1; break } } o ? $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val(i) : $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val("") } else if (null != r.column && 0 == r.column[0] && r.column[1] == ga.flowdata[0].length - 1) { if (!(n.copy || n.copyAs || n.paste || n.insertRow || n.deleteRow || n.hideRow || n.rowHeight || n.clear || n.matrix || n.sort || n.filter || n.chart || n.image || n.link || n.data || n.cellFormat)) return; ga.luckysheetRightHeadClickIs = "row", $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word").text(gn().rightclick.row), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size").text(gn().rightclick.height), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left").text(gn().rightclick.top), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right").text(gn().rightclick.bottom), $("#luckysheet-cols-rows-add").show(), $("#luckysheet-cols-rows-shift").hide(), $("#luckysheet-cols-rows-handleincell").hide(), ga.luckysheet_cols_menu_status = !0, zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-top-left-add-selected").style.display = n.insertRow ? "block" : "none", zm("#luckysheet-bottom-right-add-selected").style.display = n.insertRow ? "block" : "none", zm("#luckysheet-del-selected").style.display = n.deleteRow ? "block" : "none", zm("#luckysheet-hide-selected").style.display = n.hideRow ? "block" : "none", zm("#luckysheet-show-selected").style.display = n.hideRow ? "block" : "none", zm("#luckysheet-column-row-width-selected").style.display = n.rowHeight ? "block" : "none", n.copy || n.copyAs || n.paste || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none", n.insertRow || n.deleteRow || n.hideRow || n.rowHeight || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none")), n.insertRow || n.deleteRow || n.hideRow || n.rowHeight || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none"); var m = $.extend(!0, {}, ga.config); null == m.rowlen && (m.rowlen = {}); for (var p = null == m.rowlen[ga.luckysheet_select_save[0].row[0]] ? ga.defaultrowlen : m.rowlen[ga.luckysheet_select_save[0].row[0]], f = !0, g = 0; g < ga.luckysheet_select_save.length; g++)for (var v = ga.luckysheet_select_save[g], y = v.row[0], b = v.row[1], k = y; k <= b; k++) { if ((null == m.rowlen[k] ? ga.defaultrowlen : m.rowlen[k]) != p) { f = !1; break } } f ? $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val(p) : $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val("") } else { if (!(n.copy || n.copyAs || n.paste || n.insertRow || n.insertColumn || n.deleteRow || n.deleteColumn || n.deleteCell || n.clear || n.matrix || n.sort || n.filter || n.chart || n.image || n.link || n.data || n.cellFormat)) return; n.copy || n.copyAs || n.paste || (zm("#luckysheet-cols-rows-handleincell .luckysheet-menuseparator").style.display = "none", n.insertRow || n.insertColumn || n.deleteRow || n.deleteColumn || n.deleteCell || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none")), n.insertRow || n.insertColumn || n.deleteRow || n.deleteColumn || n.deleteCell || (zm("#luckysheet-cols-rows-handleincell .luckysheet-menuseparator").style.display = "none") } n.clear || n.matrix || n.sort || n.filter || n.chart || n.image || n.link || n.data || n.cellFormat || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none"), Dm($("#luckysheet-rightclick-menu"), t, a) } pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save) })).dblclick((function (e) { if (!$(e.target).hasClass("luckysheet-mousedown-cancel") && ga.allowEdit && !(parseInt($("#luckysheet-input-box").css("top")) > 0)) { var t = $s(e.pageX, e.pageY); if (!(t[0] >= ga.cellmainWidth - ga.cellMainSrollBarSize || t[1] >= ga.cellmainHeight - ga.cellMainSrollBarSize)) { var a = $("#luckysheet-cell-main").scrollLeft(), r = $("#luckysheet-cell-main").scrollTop(), n = t[0] + a, l = t[1] + r; null != Bc.freezenverticaldata && t[0] < Bc.freezenverticaldata[0] - Bc.freezenverticaldata[2] && (n = t[0] + Bc.freezenverticaldata[2]), null != Bc.freezenhorizontaldata && t[1] < Bc.freezenhorizontaldata[0] - Bc.freezenhorizontaldata[2] && (l = t[1] + Bc.freezenhorizontaldata[2]); var i = Ss(l)[2], o = Rs(n)[2], s = xm.mergeborer(ga.flowdata, i, o); if (s && (i = s.row[2], o = s.column[2]), Ru.isPivotRange(i, o)) { if (!(null != Ru.filter && 0 != Ru.filter.length || null != Ru.row && 0 != Ru.row.length || null != Ru.column && 0 != Ru.column.length || null != Ru.values && 0 != Ru.values.length)) return; if (null == Ru.values || 0 == Ru.values.length) return; if (0 == i || 0 == o) return; if (null != Ru.column && Ru.column.length > 0) if (Ru.values.length >= 2 && "column" == Ru.showType) { if (i <= Ru.column.length || o >= Ru.pivotDatas[0].length - Ru.values.length) return } else if (i <= Ru.column.length - 1 || o >= Ru.pivotDatas[0].length - 1) return; if (null != Ru.row && Ru.row.length > 0) if (Ru.values.length >= 2 && "row" == Ru.showType) { if (o <= Ru.row.length || i >= Ru.pivotDatas.length - Ru.values.length) return } else if (o <= Ru.row.length - 1 || i >= Ru.pivotDatas.length - 1) return; return Sh.addNewSheet(e), void Ru.drillDown(i, o) } if ($("#luckysheet-search-formula-parm").is(":visible") || $("#luckysheet-search-formula-parm-select").is(":visible")) $("#luckysheet-cell-selected").hide(); else { if ($("#luckysheet-conditionformat-dialog").is(":visible") || $("#luckysheet-administerRule-dialog").is(":visible") || $("#luckysheet-newConditionRule-dialog").is(":visible") || $("#luckysheet-editorConditionRule-dialog").is(":visible") || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; if ($("#luckysheet-modal-dialog-slider-alternateformat").is(":visible") || $("#luckysheet-alternateformat-rangeDialog").is(":visible")) return; xm.luckysheetPaintModelOn && xm.cancelPaintModel(); var c = ga.luckysheet_select_save[0].column_focus, u = ga.luckysheet_select_save[0].row_focus; c === o && u === i || (i = u, o = c), vm(i, o, ga.flowdata), Rh() } } } })), document.getElementById("luckysheet-cell-main").addEventListener("drop", (function (e) { e.preventDefault(), e.stopPropagation(); var t = e.dataTransfer.files; if (1 == t.length && t[0].type.indexOf("image") > -1) { if (!bu(ga.currentSheetIndex, "editObjects")) return; var a = new FileReader; a.readAsDataURL(t[0]), a.onload = function (e) { var t = e.target.result; Rc.inserImg(t) } } !function (e) { if (fa && fa.hook && fa.hook.cellDragStop) { var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = Ss(t[1] + $("#luckysheet-cell-main").scrollTop()), n = r[1], l = r[0], i = r[2], o = Rs(a), s = o[1], c = o[0], u = o[2], d = xm.mergeborer(ga.flowdata, i, u); d && (n = d.row[1], l = d.row[0], i = d.row[2], s = d.column[1], c = d.column[0], u = d.column[2]); var h = Sh.getSheetByIndex(), m = $("#luckysheetTableContent").get(0).getContext("2d"); Nc.createHookFunction("cellDragStop", ga.flowdata[i][u], { r: i, c: u, start_r: l, start_c: c, end_r: n, end_c: s }, h, m, e) } }(e) }), !1), document.getElementById("luckysheet-cell-main").addEventListener("dragover", (function (e) { e.preventDefault(), e.stopPropagation() }), !1), $(document).on("mousemove.luckysheetEvent", (function (e) { if (Pc.overshow(e), rd.overshow(e), window.cancelAnimationFrame(ga.jfautoscrollTimeout), fa && fa.hook && fa.hook.sheetMousemove) { var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = Ss(t[1] + $("#luckysheet-cell-main").scrollTop()), n = r[1], l = r[0], i = r[2], o = Rs(a), s = o[1], c = o[0], u = o[2], d = xm.mergeborer(ga.flowdata, i, u); d && (n = d.row[1], l = d.row[0], i = d.row[2], s = d.column[1], c = d.column[0], u = d.column[2]); var h = Sh.getSheetByIndex(), m = { functionResizeStatus: Ih.functionResizeStatus, horizontalmoveState: !!Bc.horizontalmovestate, verticalmoveState: !!Bc.verticalmovestate, pivotTableMoveState: !!Ru && Ru.movestate, sheetMoveStatus: ga.luckysheet_sheet_move_status, scrollStatus: !!ga.luckysheet_scroll_status, selectStatus: !!ga.luckysheet_select_status, rowsSelectedStatus: !!ga.luckysheet_rows_selected_status, colsSelectedStatus: !!ga.luckysheet_cols_selected_status, cellSelectedMove: !!ga.luckysheet_cell_selected_move, cellSelectedExtend: !!ga.luckysheet_cell_selected_extend, colsChangeSize: !!ga.luckysheet_cols_change_size, rowsChangeSize: !!ga.luckysheet_rows_change_size, chartMove: !!ga.chartparam.luckysheetCurrentChartMove, chartResize: !!ga.chartparam.luckysheetCurrentChartResize, rangeResize: !!Ih.rangeResize, rangeMove: !!Ih.rangeMove }, p = $("#luckysheetTableContent").get(0).getContext("2d"); ga.flowdata && ga.flowdata[i] && Nc.createHookFunction("sheetMousemove", ga.flowdata[i][u], { r: i, c: u, start_r: l, start_c: c, end_r: n, end_c: s }, h, m, p) } if (Ih.functionResizeStatus) { var f = e.pageY - Ih.functionResizeData.y, g = Ih.functionResizeData.calculatebarHeight + f, v = Math.round($(window).height() / 2); if (g <= 28) { if (g <= 20) return; g = 28 } else if (g >= v) { if (g >= v + 8) return; g = v } ga.calculatebarHeight = g, $("#luckysheet-wa-calculate").css("height", ga.calculatebarHeight - 2), $("#luckysheet-wa-calculate-size").css({ background: "#5e5e5e", cursor: "ns-resize" }), clearTimeout(Ih.functionResizeTimeout), Ih.functionResizeTimeout = setTimeout((function () { Uc() }), 15) } else if (Bc.horizontalmovestate) { var y = $s(e.pageX, e.pageY), b = $("#luckysheet-cell-main").scrollLeft(), k = $("#luckysheet-cell-main").scrollTop(), x = (y[0], Ss(y[1] + k)), w = x[1], _ = x[0], C = x[2], T = y[1] + ga.columnHeaderHeight; T < ga.columnHeaderHeight && (T = ga.columnHeaderHeight), T > Bc.windowHeight - 4 && (T = Bc.windowHeight - 4), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle").css({ top: T }), T + k - ga.columnHeaderHeight >= _ + (w - _) / 2 ? (T = w - 2 - k + ga.columnHeaderHeight, Bc.freezenhorizontaldata = [w, C + 1, k, Bc.cutVolumn(ga.visibledatarow, C + 1), T]) : (T = _ - 2 - k + ga.columnHeaderHeight, Bc.freezenhorizontaldata = [_, C, k, Bc.cutVolumn(ga.visibledatarow, C), T]), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-drop").css({ top: T }), Bc.saveFreezen(Bc.freezenhorizontaldata, T, null, null) } else if (Bc.verticalmovestate) { var A = $s(e.pageX, e.pageY), S = $("#luckysheet-cell-main").scrollLeft(), I = $("#luckysheet-cell-main").scrollTop(), R = A[0] + S, q = (A[1], Rs(R)), D = q[1], F = q[0], E = q[2], M = A[0] + ga.rowHeaderWidth; M < ga.rowHeaderWidth && (M = ga.rowHeaderWidth), M > Bc.windowWidth - 4 && (M = Bc.windowWidth - 4), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-handle").css({ left: M }), M + S - ga.rowHeaderWidth >= F + (D - F) / 2 ? (M = D - 2 - S + ga.rowHeaderWidth, Bc.freezenverticaldata = [D, E + 1, S, Bc.cutVolumn(ga.visibledatacolumn, E + 1), M]) : (M = F - 2 - S + ga.rowHeaderWidth, Bc.freezenverticaldata = [F, E, S, Bc.cutVolumn(ga.visibledatacolumn, E), M]), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-drop").css({ left: M }), Bc.saveFreezen(null, null, Bc.freezenverticaldata, M), Uc() } else if (Ru && Ru.movestate) { var N = e.pageX, P = e.pageY; $("#luckysheet-modal-dialog-slider-pivot-move").css({ left: N - Ru.movesave.width / 2, top: P - Ru.movesave.height }) } else if (ga.luckysheet_sheet_move_status) { var z = $("#luckysheet-sheet-container-c").scrollLeft(), L = e.pageX + z; if (Math.abs(e.pageX - ga.luckysheet_sheet_move_data.pageX) < 3) return; var O = $("#luckysheet-sheet-container").width(), B = L - ga.luckysheet_sheet_move_data.curleft - $("#luckysheet-sheet-container").offset().left; ga.luckysheet_sheet_move_data.activeobject.css({ left: B }); var V = Ts(ga.luckysheet_sheet_move_data.widthlist, B + ga.luckysheet_sheet_move_data.curleft); ga.luckysheet_sheet_move_data.cursorobject.css({ cursor: "move" }), B - z <= 6 && $("#luckysheet-sheets-leftscroll").click(), B - z >= O - 40 && $("#luckysheet-sheets-rightscroll").click(), V != ga.luckysheet_sheet_move_data.curindex && (-1 == V && B > 0 ? (V = ga.luckysheet_sheet_move_data.widthlist.length - 1, $("#luckysheet-sheets-item-clone").insertAfter($("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").eq(V))) : -1 == V && B <= 0 ? $("#luckysheet-sheets-item-clone").insertBefore($("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").eq(0)) : $("#luckysheet-sheets-item-clone").insertAfter($("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").eq(V)), ga.luckysheet_sheet_move_data.widthlist = [], $("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").each((function (e) { 0 == e ? ga.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth())) : ga.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()) + ga.luckysheet_sheet_move_data.widthlist[e - 1]) })), ga.luckysheet_sheet_move_data.curindex = $("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").index($("#luckysheet-sheets-item-clone"))) } else if (ga.luckysheet_model_move_state) { var H = $(document).scrollTop(), U = $(document).scrollLeft(), j = e.pageY + H, G = e.pageX + U, W = $(window).height(), Y = $(window).width(), X = ga.luckysheet_model_move_obj.height(), K = ga.luckysheet_model_move_obj.width(), Z = j - ga.luckysheet_model_xy[1], Q = G - ga.luckysheet_model_xy[0]; Z < 0 && (Z = 0), Z + X + 62 > W && (Z = W - X - 62), Q < 0 && (Q = 0), Q + K + 86 > Y && (Q = Y - K - 86), ga.luckysheet_model_move_obj.css({ top: Z, left: Q }), e.preventDefault() } else if (ga.luckysheet_scroll_status || ga.luckysheet_select_status || ga.luckysheet_rows_selected_status || ga.luckysheet_cols_selected_status || ga.luckysheet_cell_selected_move || ga.luckysheet_cell_selected_extend || ga.luckysheet_cols_change_size || ga.luckysheet_rows_change_size || ga.chartparam.luckysheetCurrentChartMove || ga.chartparam.luckysheetCurrentChartResize || Ih.rangeResize || Ih.rangeMove) { ga.luckysheet_select_status && (clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500)), ga.jfautoscrollTimeout = window.requestAnimationFrame((function t() { if (ga.luckysheet_scroll_status && !ga.luckysheet_cols_change_size && !ga.luckysheet_rows_change_size) { var a, r, n = $s(e.pageX, e.pageY), l = $("#luckysheet-scrollbar-x").scrollLeft(), i = $("#luckysheet-scrollbar-y").scrollTop(), o = n[0], s = n[1], c = $("#luckysheet-cell-main").height() - 20 * ga.zoomRatio, u = $("#luckysheet-cell-main").width() - 60 * ga.zoomRatio; if (s < 0 || s > c) a = s < 0 ? i + s / 2 : i + (s - c) / 2, $("#luckysheet-scrollbar-y").scrollTop(a); if (o < 0 || o > u) r = o < 0 ? l + o / 2 : l + (o - u) / 2, $("#luckysheet-scrollbar-x").scrollLeft(r) } if (ga.luckysheet_select_status) { var d = $s(e.pageX, e.pageY), h = d[0] + $("#luckysheet-cell-main").scrollLeft(), m = Ss(d[1] + $("#luckysheet-cell-main").scrollTop()), p = m[1], f = m[0], g = m[2], v = Rs(h), y = v[1], b = v[0], k = v[2]; if (!gu(g, k, ga.currentSheetIndex)) return; var x = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), w = 0, _ = 0, C = []; x.top > f ? (w = f, _ = x.top + x.height - f, x.row[1] > x.row_focus && (x.row[1] = x.row_focus), C = [g, x.row[1]]) : x.top == f ? (w = f, _ = x.top + x.height - f, C = [g, x.row[0]]) : (w = x.top, _ = p - x.top - 1, x.row[0] < x.row_focus && (x.row[0] = x.row_focus), C = [x.row[0], g]); var T = 0, A = 0, S = []; x.left > b ? (T = b, A = x.left + x.width - b, x.column[1] > x.column_focus && (x.column[1] = x.column_focus), S = [k, x.column[1]]) : x.left == b ? (T = b, A = x.left + x.width - b, S = [k, x.column[0]]) : (T = x.left, A = y - x.left - 1, x.column[0] < x.column_focus && (x.column[0] = x.column_focus), S = [x.column[0], k]); var I = xm.mergeMoveMain(S, C, x, w, _, T, A); null != I && (S = I[0], C = I[1], w = I[2], _ = I[3], T = I[4], A = I[5]), x.row = C, x.column = S, x.left_move = T, x.width_move = A, x.top_move = w, x.height_move = _, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = x, Rh(), Bc.scrollFreezen(), $("#luckysheet-alternateformat-rangeDialog").is(":visible") && $("#luckysheet-alternateformat-rangeDialog input").val(Cl(ga.currentSheetIndex, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1])), Ru.luckysheet_pivotTable_select_state && $("#luckysheet-pivotTable-range-selection-input").val(ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "!" + Im(ga.luckysheet_select_save[0].column[0]) + (ga.luckysheet_select_save[0].row[0] + 1) + ":" + Im(ga.luckysheet_select_save[0].column[1]) + (ga.luckysheet_select_save[0].row[1] + 1)) } else if (gd.selectStatus) { var R = $s(e.pageX, e.pageY), q = R[0] + $("#luckysheet-cell-main").scrollLeft(), D = Ss(R[1] + $("#luckysheet-cell-main").scrollTop()), F = D[1], E = D[0], M = D[2], N = Rs(q), P = N[1], z = N[0], L = N[2], O = gd.selectRange[gd.selectRange.length - 1], B = 0, V = 0, H = []; O.top > E ? (B = E, V = O.top + O.height - E, O.row[1] > O.row_focus && (O.row[1] = O.row_focus), H = [M, O.row[1]]) : O.top == E ? (B = E, V = O.top + O.height - E, H = [M, O.row[0]]) : (B = O.top, V = F - O.top - 1, O.row[0] < O.row_focus && (O.row[0] = O.row_focus), H = [O.row[0], M]); var U = 0, j = 0, G = []; O.left > z ? (U = z, j = O.left + O.width - z, O.column[1] > O.column_focus && (O.column[1] = O.column_focus), G = [L, O.column[1]]) : O.left == z ? (U = z, j = O.left + O.width - z, G = [L, O.column[0]]) : (U = O.left, j = P - O.left - 1, O.column[0] < O.column_focus && (O.column[0] = O.column_focus), G = [O.column[0], L]); var W = xm.mergeMoveMain(G, H, O, B, V, U, j); null != W && (G = W[0], H = W[1], B = W[2], V = W[3], U = W[4], j = W[5]), O.row = H, O.column = G, O.left_move = U, O.width_move = j, O.top_move = B, O.height_move = V, gd.selectRange[gd.selectRange.length - 1] = O, Eh(gd.selectRange); var Y = gd.getTxtByRange(gd.selectRange); $("#luckysheet-multiRange-dialog input").val(Y) } else if ($c.selectStatus) { var X = $s(e.pageX, e.pageY), K = X[0] + $("#luckysheet-cell-main").scrollLeft(), Z = Ss(X[1] + $("#luckysheet-cell-main").scrollTop()), Q = Z[1], J = Z[0], ee = Z[2], te = Rs(K), ae = te[1], re = te[0], ne = te[2], le = $c.selectRange[$c.selectRange.length - 1], ie = 0, oe = 0, se = []; le.top > J ? (ie = J, oe = le.top + le.height - J, le.row[1] > le.row_focus && (le.row[1] = le.row_focus), se = [ee, le.row[1]]) : le.top == J ? (ie = J, oe = le.top + le.height - J, se = [ee, le.row[0]]) : (ie = le.top, oe = Q - le.top - 1, le.row[0] < le.row_focus && (le.row[0] = le.row_focus), se = [le.row[0], ee]); var ce = 0, ue = 0, de = []; le.left > re ? (ce = re, ue = le.left + le.width - re, le.column[1] > le.column_focus && (le.column[1] = le.column_focus), de = [ne, le.column[1]]) : le.left == re ? (ce = re, ue = le.left + le.width - re, de = [ne, le.column[0]]) : (ce = le.left, ue = ae - le.left - 1, le.column[0] < le.column_focus && (le.column[0] = le.column_focus), de = [le.column[0], ne]); var he = xm.mergeMoveMain(de, se, le, ie, oe, ce, ue); null != he && (de = he[0], se = he[1], ie = he[2], oe = he[3], ce = he[4], ue = he[5]), le.row = se, le.column = de, le.left_move = ce, le.width_move = ue, le.top_move = ie, le.height_move = oe, $c.selectRange[$c.selectRange.length - 1] = le, Eh($c.selectRange); var me = $c.getTxtByRange($c.selectRange); Ih.rangetosheet != ga.currentSheetIndex && (me = ga.luckysheetfile[_l(ga.currentSheetIndex)].name + "!" + me), $("#luckysheet-dataVerificationRange-dialog input").val(me) } else if (Ih.rangestart) Ih.rangedrag(e); else if (Ih.rangedrag_row_start) Ih.rangedrag_row(e); else if (Ih.rangedrag_column_start) Ih.rangedrag_column(e); else if (ga.luckysheet_rows_selected_status) { var pe = $s(e.pageX, e.pageY)[1] + $("#luckysheet-rows-h").scrollTop(); if (pe < 0) return !1; var fe = Ss(pe), ge = fe[1], ve = fe[0], ye = fe[2], be = ga.visibledatacolumn.length - 1, ke = (ga.visibledatacolumn[be], $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1])), xe = 0, we = 0, _e = []; ke.top > ve ? (xe = ve, we = ke.top + ke.height - ve, ke.row[1] > ke.row_focus && (ke.row[1] = ke.row_focus), _e = [ye, ke.row[1]]) : ke.top == ve ? (xe = ve, we = ke.top + ke.height - ve, _e = [ye, ke.row[0]]) : (xe = ke.top, we = ge - ke.top - 1, ke.row[0] < ke.row_focus && (ke.row[0] = ke.row_focus), _e = [ke.row[0], ye]), ke.row = _e, ke.top_move = xe, ke.height_move = we, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = ke, Rh(), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500) } else if (ga.luckysheet_cols_selected_status) { var Ce = $s(e.pageX, e.pageY)[0] + $("#luckysheet-cols-h-c").scrollLeft(); if (Ce < 0) return !1; var Te = ga.visibledatarow.length - 1, Ae = (ga.visibledatarow[Te], Rs(Ce)), Se = Ae[1], Ie = Ae[0], Re = Ae[2], $e = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), qe = 0, De = 0, Fe = []; $e.left > Ie ? (qe = Ie, De = $e.left + $e.width - Ie, $e.column[1] > $e.column_focus && ($e.column[1] = $e.column_focus), Fe = [Re, $e.column[1]]) : $e.left == Ie ? (qe = Ie, De = $e.left + $e.width - Ie, Fe = [Re, $e.column[0]]) : (qe = $e.left, De = Se - $e.left - 1, $e.column[0] < $e.column_focus && ($e.column[0] = $e.column_focus), Fe = [$e.column[0], Re]), $e.column = Fe, $e.left_move = qe, $e.width_move = De, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = $e, Rh(), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500) } else if (ga.luckysheet_cell_selected_move) { var Ee = $s(e.pageX, e.pageY), Me = $("#luckysheet-cell-main").scrollLeft(), Ne = $("#luckysheet-cell-main").scrollTop(), Pe = Ee[0] + Me, ze = Ee[1] + Ne, Le = $(window).height() + Ne - ga.sheetBarHeight - ga.statisticBarHeight, Oe = $(window).width() + Me, Be = Ss(ze), Ve = Be[1], He = Be[0], Ue = Be[2], je = Rs(Pe), Ge = je[1], We = je[0], Ye = je[2], Xe = ga.luckysheet_cell_selected_move_index[0], Ke = ga.luckysheet_cell_selected_move_index[1], Ze = ga.luckysheet_select_save[0].row[0] - Xe + Ue, Qe = ga.luckysheet_select_save[0].row[1] - Xe + Ue, Je = ga.luckysheet_select_save[0].column[0] - Ke + Ye, et = ga.luckysheet_select_save[0].column[1] - Ke + Ye; (Ze < 0 || ze < 0) && (Ze = 0, Qe = ga.luckysheet_select_save[0].row[1] - ga.luckysheet_select_save[0].row[0]), (Je < 0 || Pe < 0) && (Je = 0, et = ga.luckysheet_select_save[0].column[1] - ga.luckysheet_select_save[0].column[0]), (Qe >= ga.visibledatarow[ga.visibledatarow.length - 1] || ze > Le) && (Ze = ga.visibledatarow.length - 1 - ga.luckysheet_select_save[0].row[1] + ga.luckysheet_select_save[0].row[0], Qe = ga.visibledatarow.length - 1), (et >= ga.visibledatacolumn[ga.visibledatacolumn.length - 1] || Pe > Oe) && (Je = ga.visibledatacolumn.length - 1 - ga.luckysheet_select_save[0].column[1] + ga.luckysheet_select_save[0].column[0], et = ga.visibledatacolumn.length - 1), We = Je - 1 == -1 ? 0 : ga.visibledatacolumn[Je - 1], Ge = ga.visibledatacolumn[et], He = Ze - 1 == -1 ? 0 : ga.visibledatarow[Ze - 1], Ve = ga.visibledatarow[Qe], $("#luckysheet-cell-selected-move").css({ left: We, width: Ge - We - 2, top: He, height: Ve - He - 2, display: "block" }) } else if (ga.luckysheet_cell_selected_extend) { var tt = $s(e.pageX, e.pageY), at = $("#luckysheet-cell-main").scrollLeft() - 5, rt = $("#luckysheet-cell-main").scrollTop() - 5, nt = tt[0] + at, lt = tt[1] + rt, it = $(window).height() + rt - ga.sheetBarHeight - ga.statisticBarHeight, ot = $(window).width() + at, st = Ss(lt), ct = st[1], ut = st[0], dt = st[2], ht = Rs(nt), mt = ht[1], pt = ht[0], ft = ht[2], gt = ga.luckysheet_cell_selected_extend_index[0], vt = ga.luckysheet_cell_selected_extend_index[1], yt = ga.luckysheet_select_save[0].row[0], bt = ga.luckysheet_select_save[0].row[1], kt = ga.luckysheet_select_save[0].column[0], xt = ga.luckysheet_select_save[0].column[1]; (yt < 0 || lt < 0) && (yt = 0, bt = ga.luckysheet_select_save[0].row[1] - ga.luckysheet_select_save[0].row[0]), (kt < 0 || nt < 0) && (kt = 0, xt = ga.luckysheet_select_save[0].column[1] - ga.luckysheet_select_save[0].column[0]), (bt >= ga.visibledatarow[ga.visibledatarow.length - 1] || lt > it) && (yt = ga.visibledatarow.length - 1 - ga.luckysheet_select_save[0].row[1] + ga.luckysheet_select_save[0].row[0], bt = ga.visibledatarow.length - 1), (xt >= ga.visibledatacolumn[ga.visibledatacolumn.length - 1] || nt > ot) && (kt = ga.visibledatacolumn.length - 1 - ga.luckysheet_select_save[0].column[1] + ga.luckysheet_select_save[0].column[0], xt = ga.visibledatacolumn.length - 1); var wt = ga.luckysheet_select_save[0].top_move, _t = ga.luckysheet_select_save[0].height_move, Ct = ga.luckysheet_select_save[0].left_move, Tt = ga.luckysheet_select_save[0].width_move; Math.abs(gt - dt) > Math.abs(vt - ft) ? dt >= yt && dt <= bt || (ga.luckysheet_select_save[0].top_move >= ut ? (wt = ut, _t = ga.luckysheet_select_save[0].top_move + ga.luckysheet_select_save[0].height_move - ut) : (wt = ga.luckysheet_select_save[0].top_move, _t = ct - ga.luckysheet_select_save[0].top_move - 1)) : ft >= kt && ft <= xt || (ga.luckysheet_select_save[0].left_move >= pt ? (Ct = pt, Tt = ga.luckysheet_select_save[0].left_move + ga.luckysheet_select_save[0].width_move - pt) : (Ct = ga.luckysheet_select_save[0].left_move, Tt = mt - ga.luckysheet_select_save[0].left_move - 1)), $("#luckysheet-cell-selected-extend").css({ left: Ct, width: Tt, top: wt, height: _t, display: "block" }) } else if (ga.luckysheet_cols_change_size) { var At = $s(e.pageX, e.pageY), St = $("#luckysheet-cols-h-c").scrollLeft(), It = At[0] + St, Rt = $(window).width(), $t = ga.visibledatarow.length - 1, qt = (ga.visibledatarow[$t], Rs(It)); qt[1], qt[0], qt[2]; It + 3 - ga.luckysheet_cols_change_size_start[0] > 30 && It < Rt + St - 100 && ($("#luckysheet-change-size-line").css({ left: It }), $("#luckysheet-cols-change-size").css({ left: It - 2 })) } else if (ga.luckysheet_rows_change_size) { var Dt = $s(e.pageX, e.pageY), Ft = $("#luckysheet-rows-h").scrollTop(), Et = Dt[1] + Ft, Mt = $(window).height(), Nt = Ss(Et); Nt[1], Nt[0], Nt[2]; Et + 3 - ga.luckysheet_rows_change_size_start[0] > 19 && Et < Mt + Ft - 200 && ($("#luckysheet-change-size-line").css({ top: Et }), $("#luckysheet-rows-change-size").css({ top: Et })) } else if (ga.chartparam.luckysheetCurrentChartMove) { var Pt = $s(e.pageX, e.pageY), zt = Pt[0] + $("#luckysheet-cell-main").scrollLeft(), Lt = Pt[1] + $("#luckysheet-cell-main").scrollTop(), Ot = ga.chartparam.luckysheetCurrentChartMoveObj.height(), Bt = ga.chartparam.luckysheetCurrentChartMoveObj.width(), Vt = Lt - ga.chartparam.luckysheetCurrentChartMoveXy[1], Ht = zt - ga.chartparam.luckysheetCurrentChartMoveXy[0]; if (Vt < 0 && (Vt = 0), Vt + Ot + 42 + 6 > ga.chartparam.luckysheetCurrentChartMoveWinH && (Vt = ga.chartparam.luckysheetCurrentChartMoveWinH - Ot - 42 - 6), Ht < 0 && (Ht = 0), Ht + Bt + 22 + 36 > ga.chartparam.luckysheetCurrentChartMoveWinW && (Ht = ga.chartparam.luckysheetCurrentChartMoveWinW - Bt - 22 - 36), ga.chartparam.luckysheetCurrentChartMoveObj.css({ top: Vt, left: Ht }), null != Bc.freezenhorizontaldata || null != Bc.freezenverticaldata) { Bc.scrollAdapt(); var Ut = ga.chartparam.luckysheetCurrentChartMoveObj.offset(), jt = ga.chartparam.luckysheetCurrentChartMoveObj.position(); ga.chartparam.luckysheetCurrentChartMoveXy = [e.pageX - Ut.left, e.pageY - Ut.top, jt.left, jt.top, $("#luckysheet-scrollbar-x").scrollLeft(), $("#luckysheet-scrollbar-y").scrollTop()] } } else if (ga.chartparam.luckysheetCurrentChartResize) { var Gt = $("#luckysheet-cell-main").scrollTop(), Wt = $("#luckysheet-cell-main").scrollLeft(), Yt = $s(e.pageX, e.pageY), Xt = Yt[0] + Wt, Kt = Yt[1] + Gt; if (Xt < 0 || Kt < 0) return !1; ga.chartparam.luckysheetCurrentChartResizeObj.height(), ga.chartparam.luckysheetCurrentChartResizeObj.width(); var Zt = Kt - ga.chartparam.luckysheetCurrentChartResizeXy[1], Qt = Xt - ga.chartparam.luckysheetCurrentChartResizeXy[0], Jt = ga.chartparam.luckysheetCurrentChartResizeXy[5], ea = ga.chartparam.luckysheetCurrentChartResizeXy[3], ta = ga.chartparam.luckysheetCurrentChartResizeXy[4], aa = ga.chartparam.luckysheetCurrentChartResizeXy[2]; "lm" != ga.chartparam.luckysheetCurrentChartResize && "lt" != ga.chartparam.luckysheetCurrentChartResize && "lb" != ga.chartparam.luckysheetCurrentChartResize || (ta = Xt, aa = ga.chartparam.luckysheetCurrentChartResizeXy[2] - Qt, ta > ga.chartparam.luckysheetCurrentChartResizeXy[2] + ga.chartparam.luckysheetCurrentChartResizeXy[4] - 60 ? (ta = ga.chartparam.luckysheetCurrentChartResizeXy[2] + ga.chartparam.luckysheetCurrentChartResizeXy[4] - 60, aa = ga.chartparam.luckysheetCurrentChartResizeXy[2] - (ga.chartparam.luckysheetCurrentChartResizeXy[2] + ga.chartparam.luckysheetCurrentChartResizeXy[4] - 60 - ga.chartparam.luckysheetCurrentChartResizeXy[0])) : ta <= 0 && (ta = 0, aa = ga.chartparam.luckysheetCurrentChartResizeXy[2] + ga.chartparam.luckysheetCurrentChartResizeXy[0])), "rm" != ga.chartparam.luckysheetCurrentChartResize && "rt" != ga.chartparam.luckysheetCurrentChartResize && "rb" != ga.chartparam.luckysheetCurrentChartResize || ((aa = ga.chartparam.luckysheetCurrentChartResizeXy[2] + Qt) < 60 ? aa = 60 : aa >= ga.chartparam.luckysheetCurrentChartResizeWinW - ga.chartparam.luckysheetCurrentChartResizeXy[4] - 22 - 36 && (aa = ga.chartparam.luckysheetCurrentChartResizeWinW - ga.chartparam.luckysheetCurrentChartResizeXy[4] - 22 - 36)), "mt" != ga.chartparam.luckysheetCurrentChartResize && "lt" != ga.chartparam.luckysheetCurrentChartResize && "rt" != ga.chartparam.luckysheetCurrentChartResize || (Jt = Kt, ea = ga.chartparam.luckysheetCurrentChartResizeXy[3] - Zt, Jt > ga.chartparam.luckysheetCurrentChartResizeXy[3] + ga.chartparam.luckysheetCurrentChartResizeXy[5] - 60 ? (Jt = ga.chartparam.luckysheetCurrentChartResizeXy[3] + ga.chartparam.luckysheetCurrentChartResizeXy[5] - 60, ea = ga.chartparam.luckysheetCurrentChartResizeXy[3] - (ga.chartparam.luckysheetCurrentChartResizeXy[3] + ga.chartparam.luckysheetCurrentChartResizeXy[5] - 60 - ga.chartparam.luckysheetCurrentChartResizeXy[1])) : Jt <= 0 && (Jt = 0, ea = ga.chartparam.luckysheetCurrentChartResizeXy[3] + ga.chartparam.luckysheetCurrentChartResizeXy[1])), "mb" != ga.chartparam.luckysheetCurrentChartResize && "lb" != ga.chartparam.luckysheetCurrentChartResize && "rb" != ga.chartparam.luckysheetCurrentChartResize || ((ea = ga.chartparam.luckysheetCurrentChartResizeXy[3] + Zt) < 60 ? ea = 60 : ea >= ga.chartparam.luckysheetCurrentChartResizeWinH - ga.chartparam.luckysheetCurrentChartResizeXy[5] - 42 - 6 && (ea = ga.chartparam.luckysheetCurrentChartResizeWinH - ga.chartparam.luckysheetCurrentChartResizeXy[5] - 42 - 6)); var ra = { top: Jt, left: ta, height: ea, width: aa }; ga.chartparam.luckysheetCurrentChartResizeObj.css(ra), ga.resizeChart(ga.chartparam.luckysheetCurrentChart) } else if (Rc.move) { var na = $s(e.pageX, e.pageY), la = na[0] + $("#luckysheet-cell-main").scrollLeft(), ia = na[1] + $("#luckysheet-cell-main").scrollTop(), oa = Rc.images[Rc.currentImgId]; oa.isFixedPos && (la = e.pageX, ia = e.pageY); var sa = $("#luckysheet-modal-dialog-activeImage").height(), ca = $("#luckysheet-modal-dialog-activeImage").width(), ua = ia - Rc.moveXY[1], da = la - Rc.moveXY[0], ha = 0, ma = Rc.currentWinH - sa - 42 - 6, pa = 0, fa = Rc.currentWinW - ca - 22 - 36; oa.isFixedPos && (ma = (ha = ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight) + ga.cellmainHeight - ga.cellMainSrollBarSize - sa, fa = (pa = ga.rowHeaderWidth) + ga.cellmainWidth - ga.cellMainSrollBarSize - ca), ua < ha && (ua = ha), ua > ma && (ua = ma), da < pa && (da = pa), da > fa && (da = fa), $("#luckysheet-modal-dialog-activeImage").css({ left: da, top: ua }) } else if (Rc.resize) { var va = $s(e.pageX, e.pageY), ya = $("#luckysheet-cell-main").scrollLeft(), ba = $("#luckysheet-cell-main").scrollTop(), ka = va[0] + ya, xa = va[1] + ba; if (ka < 0 || xa < 0) return !1; var wa = Rc.resizeXY, _a = xa - wa[1], Ca = ka - wa[0], Ta = wa[5], Aa = wa[3], Sa = wa[4], Ia = wa[2], Ra = Rc.resize, $a = Rc.images[Rc.currentImgId]; if ($a.isFixedPos) { var qa = ga.infobarHeight + ga.toolbarHeight + ga.calculatebarHeight + ga.columnHeaderHeight, Da = ga.rowHeaderWidth; "lt" == Ra ? ((Sa = wa[4] - wa[6] + Ca) < Da && (Sa = Da), Sa > wa[4] - wa[6] + wa[2] - 1 && (Sa = wa[4] - wa[6] + wa[2] - 1), Ia = wa[4] - wa[6] + wa[2] - Sa, Aa = Math.round(Ia * (wa[3] / wa[2])), (Ta = wa[5] - wa[7] + wa[3] - Aa) < qa && (Ta = qa, Aa = wa[5] - wa[7] + wa[3] - Ta, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[4] - wa[6] + wa[2] - Ia), Ta > wa[5] - wa[7] + wa[3] - 1 && (Ta = wa[5] - wa[7] + wa[3] - 1, Aa = wa[5] - wa[7] + wa[3] - Ta, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[4] - wa[6] + wa[2] - Ia)) : "lm" == Ra ? ((Sa = wa[4] - wa[6] + Ca) < Da && (Sa = Da), Sa > wa[4] - wa[6] + wa[2] - 1 && (Sa = wa[4] - wa[6] + wa[2] - 1), Ia = wa[4] - wa[6] + wa[2] - Sa, Ta = wa[5] - wa[7], Aa = wa[3]) : "lb" == Ra ? ((Sa = wa[4] - wa[6] + Ca) < Da && (Sa = Da), Sa > wa[4] - wa[6] + wa[2] - 1 && (Sa = wa[4] - wa[6] + wa[2] - 1), Ia = wa[4] - wa[6] + wa[2] - Sa, Aa = Math.round(Ia * (wa[3] / wa[2])), Ta = wa[5] - wa[7], Aa < 1 && (Aa = 1, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[4] - wa[6] + wa[2] - Ia), Aa > qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta && (Aa = qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[4] - wa[6] + wa[2] - Ia)) : "rt" == Ra ? (Sa = wa[4] - wa[6], (Ia = wa[2] + Ca) < 1 && (Ia = 1), Ia > Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa && (Ia = Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa), Aa = Math.round(Ia * (wa[3] / wa[2])), (Ta = wa[5] - wa[7] + wa[3] - Aa) < qa && (Ta = qa, Aa = wa[5] - wa[7] + wa[3] - Ta, Ia = Math.round(Aa * (wa[2] / wa[3]))), Ta > wa[5] - wa[7] + wa[3] - 1 && (Ta = wa[5] - wa[7] + wa[3] - 1, Aa = wa[5] - wa[7] + wa[3] - Ta, Ia = Math.round(Aa * (wa[2] / wa[3])))) : "rm" == Ra ? (Sa = wa[4] - wa[6], (Ia = wa[2] + Ca) < 1 && (Ia = 1), Ia > Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa && (Ia = Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa), Ta = wa[5] - wa[7], Aa = wa[3]) : "rb" == Ra ? (Sa = wa[4] - wa[6], (Ia = wa[2] + Ca) < 1 && (Ia = 1), Ia > Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa && (Ia = Da + ga.cellmainWidth - ga.cellMainSrollBarSize - Sa), Aa = Math.round(Ia * (wa[3] / wa[2])), Ta = wa[5] - wa[7], Aa < 1 && (Aa = 1, Ia = Math.round(Aa * (wa[2] / wa[3]))), Aa > qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta && (Aa = qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta, Ia = Math.round(Aa * (wa[2] / wa[3])))) : "mt" == Ra ? (Sa = wa[4] - wa[6], Ia = wa[2], (Ta = wa[5] - wa[7] + _a) < qa && (Ta = qa), Ta > wa[5] - wa[7] + wa[3] - 1 && (Ta = wa[5] - wa[7] + wa[3] - 1), Aa = wa[5] - wa[7] + wa[3] - Ta) : "mb" == Ra && (Sa = wa[4] - wa[6], Ia = wa[2], Ta = wa[5] - wa[7], (Aa = wa[3] + _a) < 1 && (Aa = 1), Aa > qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta && (Aa = qa + ga.cellmainHeight - ga.cellMainSrollBarSize - Ta)) } else "lt" == Ra ? (Sa = ka, Ia = wa[2] - Ca, Sa > wa[2] + wa[4] - 1 ? (Sa = wa[2] + wa[4] - 1, Ia = wa[2] + wa[0] - (wa[2] + wa[4] - 1)) : Sa <= 0 && (Sa = 0, Ia = wa[2] + wa[0]), Aa = Math.round(Ia * (wa[3] / wa[2])), (Ta = wa[3] + wa[1] - Aa) > wa[3] + wa[5] - 1 ? (Ta = wa[3] + wa[5] - 1, Aa = wa[3] + wa[1] - (wa[3] + wa[5] - 1), Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[2] + wa[0] - Ia) : Ta <= 0 && (Ta = 0, Aa = wa[3] + wa[1], Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[2] + wa[0] - Ia)) : "lm" == Ra ? (Sa = ka, Ia = wa[2] - Ca, Sa > wa[2] + wa[4] - 1 ? (Sa = wa[2] + wa[4] - 1, Ia = wa[2] + wa[0] - (wa[2] + wa[4] - 1)) : Sa <= 0 && (Sa = 0, Ia = wa[2] + wa[0])) : "lb" == Ra ? (Sa = ka, Ia = wa[2] - Ca, Sa > wa[2] + wa[4] - 1 ? (Sa = wa[2] + wa[4] - 1, Ia = wa[2] + wa[0] - (wa[2] + wa[4] - 1)) : Sa <= 0 && (Sa = 0, Ia = wa[2] + wa[0]), (Aa = Math.round(Ia * (wa[3] / wa[2]))) < 1 ? (Aa = 1, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[2] + wa[0] - Ia) : Aa >= Rc.currentWinH - wa[5] - 42 - 6 && (Aa = Rc.currentWinH - wa[5] - 42 - 6, Ia = Math.round(Aa * (wa[2] / wa[3])), Sa = wa[2] + wa[0] - Ia)) : "rt" == Ra ? ((Ia = wa[2] + Ca) < 1 ? Ia = 1 : Ia >= Rc.currentWinW - wa[4] - 22 - 36 && (Ia = Rc.currentWinW - wa[4] - 22 - 36), Aa = Math.round(Ia * (wa[3] / wa[2])), (Ta = wa[3] + wa[1] - Aa) > wa[3] + wa[5] - 1 ? (Ta = wa[3] + wa[5] - 1, Aa = wa[3] + wa[1] - (wa[3] + wa[5] - 1), Ia = Math.round(Aa * (wa[2] / wa[3]))) : Ta <= 0 && (Ta = 0, Aa = wa[3] + wa[1], Ia = Math.round(Aa * (wa[2] / wa[3])))) : "rm" == Ra ? (Ia = wa[2] + Ca) < 1 ? Ia = 1 : Ia >= Rc.currentWinW - wa[4] - 22 - 36 && (Ia = Rc.currentWinW - wa[4] - 22 - 36) : "rb" == Ra ? ((Ia = wa[2] + Ca) < 1 ? Ia = 1 : Ia >= Rc.currentWinW - wa[4] - 22 - 36 && (Ia = Rc.currentWinW - wa[4] - 22 - 36), (Aa = Math.round(Ia * (wa[3] / wa[2]))) < 1 ? (Aa = 1, Ia = Math.round(Aa * (wa[2] / wa[3]))) : Aa >= Rc.currentWinH - wa[5] - 42 - 6 && (Aa = Rc.currentWinH - wa[5] - 42 - 6, Ia = Math.round(Aa * (wa[2] / wa[3])))) : "mt" == Ra ? (Ta = xa, Aa = wa[3] - _a, Ta > wa[3] + wa[5] - 1 ? (Ta = wa[3] + wa[5] - 1, Aa = wa[3] + wa[1] - (wa[3] + wa[5] - 1)) : Ta <= 0 && (Ta = 0, Aa = wa[3] + wa[1])) : "mb" == Ra && ((Aa = wa[3] + _a) < 1 ? Aa = 1 : Aa >= Rc.currentWinH - wa[5] - 42 - 6 && (Aa = Rc.currentWinH - wa[5] - 42 - 6)); $("#luckysheet-modal-dialog-activeImage").css({ width: Ia, height: Aa, left: Sa, top: Ta }); var Fa = Ia / $a.crop.width, Ea = Aa / $a.crop.height, Ma = Math.round($a.default.width * Fa), Na = Math.round($a.default.height * Ea), Pa = Math.round($a.crop.offsetLeft * Fa), za = Math.round($a.crop.offsetTop * Ea); $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({ "background-size": Ma + "px " + Na + "px", "background-position": -Pa + "px " + -za + "px" }) } else if (Rc.cropChange) { var La = $s(e.pageX, e.pageY), Oa = La[0] + $("#luckysheet-cell-main").scrollLeft(), Ba = La[1] + $("#luckysheet-cell-main").scrollTop(); if (Oa < 0 || Ba < 0) return !1; var Va, Ha, Ua, ja, Ga = Rc.cropChangeXY, Wa = Ba - Ga[1], Ya = Oa - Ga[0], Xa = Rc.images[Rc.currentImgId], Ka = Rc.cropChange; "lt" == Ka ? ((Ua = Xa.crop.offsetLeft + Ya) < 0 && (Ua = 0), Ua > Xa.crop.width + Xa.crop.offsetLeft - 1 && (Ua = Xa.crop.width + Xa.crop.offsetLeft - 1), Va = Xa.crop.width + Xa.crop.offsetLeft - Ua, (ja = Xa.crop.offsetTop + Wa) < 0 && (ja = 0), ja > Xa.crop.height + Xa.crop.offsetTop - 1 && (ja = Xa.crop.height + Xa.crop.offsetTop - 1), Ha = Xa.crop.height + Xa.crop.offsetTop - ja) : "lm" == Ka ? ((Ua = Xa.crop.offsetLeft + Ya) < 0 && (Ua = 0), Ua > Xa.crop.width + Xa.crop.offsetLeft - 1 && (Ua = Xa.crop.width + Xa.crop.offsetLeft - 1), Va = Xa.crop.width + Xa.crop.offsetLeft - Ua, ja = Xa.crop.offsetTop, Ha = Xa.crop.height) : "lb" == Ka ? ((Ua = Xa.crop.offsetLeft + Ya) < 0 && (Ua = 0), Ua > Xa.crop.width + Xa.crop.offsetLeft - 1 && (Ua = Xa.crop.width + Xa.crop.offsetLeft - 1), Va = Xa.crop.width + Xa.crop.offsetLeft - Ua, ja = Xa.crop.offsetTop, (Ha = Xa.crop.height + Wa) < 1 && (Ha = 1), Ha > Xa.default.height - ja && (Ha = Xa.default.height - ja)) : "rt" == Ka ? (Ua = Xa.crop.offsetLeft, (Va = Xa.crop.width + Ya) < 1 && (Va = 1), Va > Xa.default.width - Ua && (Va = Xa.default.width - Ua), (ja = Xa.crop.offsetTop + Wa) < 0 && (ja = 0), ja > Xa.crop.height + Xa.crop.offsetTop - 1 && (ja = Xa.crop.height + Xa.crop.offsetTop - 1), Ha = Xa.crop.height + Xa.crop.offsetTop - ja) : "rm" == Ka ? (Ua = Xa.crop.offsetLeft, (Va = Xa.crop.width + Ya) < 1 && (Va = 1), Va > Xa.default.width - Ua && (Va = Xa.default.width - Ua), ja = Xa.crop.offsetTop, Ha = Xa.crop.height) : "rb" == Ka ? (Ua = Xa.crop.offsetLeft, (Va = Xa.crop.width + Ya) < 1 && (Va = 1), Va > Xa.default.width - Ua && (Va = Xa.default.width - Ua), ja = Xa.crop.offsetTop, (Ha = Xa.crop.height + Wa) < 1 && (Ha = 1), Ha > Xa.default.height - ja && (Ha = Xa.default.height - ja)) : "mt" == Ka ? (Ua = Xa.crop.offsetLeft, Va = Xa.crop.width, (ja = Xa.crop.offsetTop + Wa) < 0 && (ja = 0), ja > Xa.crop.height + Xa.crop.offsetTop - 1 && (ja = Xa.crop.height + Xa.crop.offsetTop - 1), Ha = Xa.crop.height + Xa.crop.offsetTop - ja) : "mb" == Ka && (Ua = Xa.crop.offsetLeft, Va = Xa.crop.width, ja = Xa.crop.offsetTop, (Ha = Xa.crop.height + Wa) < 1 && (Ha = 1), Ha > Xa.default.height - ja && (Ha = Xa.default.height - ja)); var Za = Xa.default.left + Ua, Qa = Xa.default.top + ja; Xa.isFixedPos && (Za = Xa.fixedLeft + Ua, Qa = Xa.fixedTop + ja), $("#luckysheet-modal-dialog-cropping").show().css({ width: Va, height: Ha, left: Za, top: Qa }), $("#luckysheet-modal-dialog-cropping .cropping-mask").css({ width: Xa.default.width, height: Xa.default.height, "background-image": "url(" + Xa.src + ")", left: -Ua, top: -ja }), $("#luckysheet-modal-dialog-cropping .cropping-content").css({ "background-image": "url(" + Xa.src + ")", "background-size": Xa.default.width + "px " + Xa.default.height + "px", "background-position": -Ua + "px " + -ja + "px" }), Rc.cropChangeObj = { width: Va, height: Ha, offsetLeft: Ua, offsetTop: ja } } else if (Pc.move) { var Ja = $s(e.pageX, e.pageY), er = Ja[0] + $("#luckysheet-cell-main").scrollLeft(), tr = Ja[1] + $("#luckysheet-cell-main").scrollTop(), ar = Pc.currentObj.outerHeight(), rr = Pc.currentObj.outerWidth(), nr = tr - Pc.moveXY[1], lr = er - Pc.moveXY[0]; nr < 0 && (nr = 0), nr + ar + 42 + 6 > Pc.currentWinH && (nr = Pc.currentWinH - ar - 42 - 6), lr < 0 && (lr = 0), lr + rr + 22 + 36 > Pc.currentWinW && (lr = Pc.currentWinW - rr - 22 - 36), Pc.currentObj.css({ left: lr, top: nr }) } else if (Pc.resize) { var ir = $s(e.pageX, e.pageY), or = ir[0] + $("#luckysheet-cell-main").scrollLeft(), sr = ir[1] + $("#luckysheet-cell-main").scrollTop(); if (or < 0 || sr < 0) return !1; var cr = Pc.resizeXY, ur = sr - cr[1], dr = or - cr[0], hr = cr[5], mr = cr[3], pr = cr[4], fr = cr[2], gr = Pc.resize; "lm" != gr && "lt" != gr && "lb" != gr || (pr = or, fr = cr[2] - dr, pr > cr[2] + cr[4] - 60 ? (pr = cr[2] + cr[4] - 60, fr = cr[2] - (cr[2] + cr[4] - 60 - cr[0])) : pr <= 0 && (pr = 0, fr = cr[2] + cr[0])), "rm" != gr && "rt" != gr && "rb" != gr || ((fr = cr[2] + dr) < 60 ? fr = 60 : fr >= Pc.currentWinW - cr[4] - 22 - 36 && (fr = Pc.currentWinW - cr[4] - 22 - 36)), "mt" != gr && "lt" != gr && "rt" != gr || (hr = sr, mr = cr[3] - ur, hr > cr[3] + cr[5] - 60 ? (hr = cr[3] + cr[5] - 60, mr = cr[3] - (cr[3] + cr[5] - 60 - cr[1])) : hr <= 0 && (hr = 0, mr = cr[3] + cr[1])), "mb" != gr && "lb" != gr && "rb" != gr || ((mr = cr[3] + ur) < 60 ? mr = 60 : mr >= Pc.currentWinH - cr[5] - 42 - 6 && (mr = Pc.currentWinH - cr[5] - 42 - 6)), Pc.currentObj.css({ width: fr, height: mr, left: pr, top: hr }) } else Ih.rangeResize ? Ih.rangeResizeDraging(e, Ih.rangeResizeObj, Ih.rangeResizexy, Ih.rangeResize, Ih.rangeResizeWinW, Ih.rangeResizeWinH, ga.ch_width, ga.rh_height) : Ih.rangeMove ? Ih.rangeMoveDraging(e, Ih.rangeMovexy, Ih.rangeMoveObj.data("range"), Ih.rangeMoveObj, ga.sheetBarHeight, ga.statisticBarHeight) : ga.chart_selection.rangeResize ? ga.chart_selection.rangeResizeDraging(e, ga.sheetBarHeight, ga.statisticBarHeight) : ga.chart_selection.rangeMove && ga.chart_selection.rangeMoveDraging(e, ga.sheetBarHeight, ga.statisticBarHeight); ga.jfautoscrollTimeout = window.requestAnimationFrame(t) })) } })), $(document).on("mouseup.luckysheetEvent", (function (e) { if (fa && fa.hook && fa.hook.sheetMouseup) { var t = $s(e.pageX, e.pageY), r = t[0] + $("#luckysheet-cell-main").scrollLeft(), n = Ss(t[1] + $("#luckysheet-cell-main").scrollTop()), l = n[1], i = n[0], o = n[2], s = Rs(r), c = s[1], u = s[0], d = s[2], h = xm.mergeborer(ga.flowdata, o, d); h && (l = h.row[1], i = h.row[0], o = h.row[2], c = h.column[1], u = h.column[0], d = h.column[2]); var m = Sh.getSheetByIndex(), p = { functionResizeStatus: Ih.functionResizeStatus, horizontalmoveState: !!Bc.horizontalmovestate, verticalmoveState: !!Bc.verticalmovestate, pivotTableMoveState: !!Ru && Ru.movestate, sheetMoveStatus: ga.luckysheet_sheet_move_status, scrollStatus: !!ga.luckysheet_scroll_status, selectStatus: !!ga.luckysheet_select_status, rowsSelectedStatus: !!ga.luckysheet_rows_selected_status, colsSelectedStatus: !!ga.luckysheet_cols_selected_status, cellSelectedMove: !!ga.luckysheet_cell_selected_move, cellSelectedExtend: !!ga.luckysheet_cell_selected_extend, colsChangeSize: !!ga.luckysheet_cols_change_size, rowsChangeSize: !!ga.luckysheet_rows_change_size, chartMove: !!ga.chartparam.luckysheetCurrentChartMove, chartResize: !!ga.chartparam.luckysheetCurrentChartResize, rangeResize: !!Ih.rangeResize, rangeMove: !!Ih.rangeMove }, f = $("#luckysheetTableContent").get(0).getContext("2d"); Nc.createHookFunction("sheetMouseup", ga.flowdata[o][d], { r: o, c: d, start_r: i, start_c: u, end_r: l, end_c: c }, m, p, f) } (ga.luckysheet_select_status && (clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 0), xm.luckysheetPaintModelOn && (vd.pasteHandlerOfPaintModel(ga.luckysheet_copy_save), xm.luckysheetPaintSingle && xm.cancelPaintModel())), ga.luckysheet_select_status = !1, window.cancelAnimationFrame(ga.jfautoscrollTimeout), ga.luckysheet_scroll_status = !1, $("#luckysheet-cell-selected").find(".luckysheet-cs-fillhandle").css("cursor", "crosshair").end().find(".luckysheet-cs-draghandle").css("cursor", "move"), $("#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0").css("cursor", "default"), ga.luckysheet_rows_selected_status = !1, ga.luckysheet_cols_selected_status = !1, ga.luckysheet_model_move_state = !1, Ih.functionResizeStatus && (Ih.functionResizeStatus = !1, $("#luckysheet-wa-calculate-size").removeAttr("style")), Bc.horizontalmovestate && (Bc.horizontalmovestate = !1, $("#luckysheet-freezebar-horizontal").removeClass("luckysheet-freezebar-active"), $("#luckysheet-freezebar-horizontal").find(".luckysheet-freezebar-horizontal-handle").css("cursor", "-webkit-grab"), Bc.freezenhorizontaldata[4] <= ga.columnHeaderHeight && Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.verticalmovestate && (Bc.verticalmovestate = !1, $("#luckysheet-freezebar-vertical").removeClass("luckysheet-freezebar-active"), $("#luckysheet-freezebar-vertical").find(".luckysheet-freezebar-vertical-handle").css("cursor", "-webkit-grab"), Bc.freezenverticaldata[4] <= ga.rowHeaderWidth && Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), Ru && Ru.movestate) && ($("#luckysheet-modal-dialog-slider-pivot-move").remove(), Ru.movestate = !1, $("#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value").css("cursor", "default"), "luckysheet-modal-dialog-pivotTable-list" != Ru.movesave.containerid && 0 == $(e.target).closest(".luckysheet-modal-dialog-slider-config-list").length && ("luckysheet-modal-dialog-config-value" == Ru.movesave.containerid && Ru.resetOrderby(Ru.movesave.obj), Ru.movesave.obj.remove(), Ru.showvaluecolrow(), $("#luckysheet-modal-dialog-pivotTable-list").find(".luckysheet-modal-dialog-slider-list-item").each((function () { $(this).find(".luckysheet-slider-list-item-selected").find("i").remove() })), $("#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value").find(".luckysheet-modal-dialog-slider-config-item").each((function () { var e = $(this).data("index"); $("#luckysheet-modal-dialog-pivotTable-list").find(".luckysheet-modal-dialog-slider-list-item").each((function () { var t = $(this).find(".luckysheet-slider-list-item-selected"); $(this).data("index") == e && 0 == t.find("i").length && t.append('') })) })), Ru.refreshPivotTable())); if (ga.luckysheet_sheet_move_status && (ga.luckysheet_sheet_move_status = !1, ga.luckysheet_sheet_move_data.activeobject.insertBefore($("#luckysheet-sheets-item-clone")), ga.luckysheet_sheet_move_data.activeobject.removeAttr("style"), $("#luckysheet-sheets-item-clone").remove(), ga.luckysheet_sheet_move_data.cursorobject.css({ cursor: "pointer" }), ga.luckysheet_sheet_move_data = {}, Sh.reOrderAllSheet()), clearTimeout(ga.chartparam.luckysheetCurrentChartMoveTimeout), ga.chartparam.luckysheetCurrentChartMove && (ga.chartparam.luckysheetCurrentChartMove = !1, ga.chartparam.luckysheetInsertChartTosheetChange)) { var g = ga.chartparam.luckysheetCurrentChartMoveObj.css("top"), v = ga.chartparam.luckysheetCurrentChartMoveObj.css("left"), y = $("#luckysheet-cell-main").scrollLeft(), b = $("#luckysheet-cell-main").scrollTop(), k = ga.chartparam.luckysheetCurrentChartMoveXy[2], x = ga.chartparam.luckysheetCurrentChartMoveXy[3], w = ga.chartparam.luckysheetCurrentChartMoveXy[4], _ = ga.chartparam.luckysheetCurrentChartMoveXy[5], C = ga.chartparam.luckysheetCurrentChartMoveObj.find(".luckysheet-modal-dialog-content").attr("id"); ga.jfredo.push({ type: "moveChart", chart_id: C, sheetIndex: ga.currentSheetIndex, myTop: g, myLeft: v, scrollTop: b, scrollLeft: y, x: k, y: x, scrollTop1: _, scrollLeft1: w }) } if (ga.chartparam.luckysheetCurrentChartResize && (ga.chartparam.luckysheetCurrentChartResize = null, ga.chartparam.luckysheetInsertChartTosheetChange)) { var T = ga.chartparam.luckysheetCurrentChartResizeObj.height(), A = ga.chartparam.luckysheetCurrentChartResizeObj.width(), S = (y = $("#luckysheet-cell-main").scrollLeft(), b = $("#luckysheet-cell-main").scrollTop(), g = ga.chartparam.luckysheetCurrentChartMoveObj.css("top"), v = ga.chartparam.luckysheetCurrentChartMoveObj.css("left"), C = ga.chartparam.luckysheetCurrentChartResizeObj.find(".luckysheet-modal-dialog-content").attr("id"), ga.chartparam.luckysheetCurrentChartResizeXy[2]), I = ga.chartparam.luckysheetCurrentChartResizeXy[3]; k = ga.chartparam.luckysheetCurrentChartResizeXy[4], x = ga.chartparam.luckysheetCurrentChartResizeXy[5], w = ga.chartparam.luckysheetCurrentChartResizeXy[6], _ = ga.chartparam.luckysheetCurrentChartResizeXy[7]; ga.jfredo.push({ type: "resizeChart", chart_id: C, sheetIndex: ga.currentSheetIndex, myTop: g, myLeft: v, myHeight: T, myWidth: A, scrollTop: b, scrollLeft: y, x: k, y: x, myWidth1: S, myHeight1: I, scrollTop1: _, scrollLeft1: w }) } if (Ih.rangeResize && Ih.rangeResizeDragged(e, Ih.rangeResizeObj, Ih.rangeResize, Ih.rangeResizexy, Ih.rangeResizeWinW, Ih.rangeResizeWinH), Rc.move && Rc.moveImgItem(), Rc.resize && Rc.resizeImgItem(), Rc.cropChange && Rc.cropChangeImgItem(), Pc.move) { Pc.move = !1; var R = Pc.currentObj.closest(".luckysheet-postil-show").attr("id"), q = R.split("luckysheet-postil-show_")[1].split("_")[0], D = R.split("luckysheet-postil-show_")[1].split("_")[1], F = rs.deepCopyFlowData(ga.flowdata), E = []; F[q][D].ps.left = Pc.currentObj.position().left, F[q][D].ps.top = Pc.currentObj.position().top, F[q][D].ps.value = Pc.currentObj.find(".formulaInputFocus").text(), E.push(q + "_" + D), Pc.ref(F, E), $("#" + R).remove(), F[q][D].ps.isshow ? (Pc.buildPs(q, D, F[q][D].ps), $("#" + R).addClass("luckysheet-postil-show-active"), $("#" + R).find(".luckysheet-postil-dialog-resize").show()) : Pc.editPs(q, D) } if (Pc.resize) { Pc.resize = null; var M = Pc.currentObj.closest(".luckysheet-postil-show").attr("id"), N = M.split("luckysheet-postil-show_")[1].split("_")[0], P = M.split("luckysheet-postil-show_")[1].split("_")[1], z = rs.deepCopyFlowData(ga.flowdata), L = []; z[N][P].ps.left = Pc.currentObj.position().left, z[N][P].ps.top = Pc.currentObj.position().top, z[N][P].ps.width = Pc.currentObj.outerWidth(), z[N][P].ps.height = Pc.currentObj.outerHeight(), z[N][P].ps.value = Pc.currentObj.find(".formulaInputFocus").text(), L.push(N + "_" + P), Pc.ref(z, L), $("#" + M).remove(), z[N][P].ps.isshow ? (Pc.buildPs(N, P, z[N][P].ps), $("#" + M).addClass("luckysheet-postil-show-active"), $("#" + M).find(".luckysheet-postil-dialog-resize").show()) : Pc.editPs(N, P) } if (ga.luckysheet_rows_change_size) { ga.luckysheet_rows_change_size = !1, $("#luckysheet-change-size-line").hide(), $("#luckysheet-rows-change-size").css("opacity", 0), $("#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas").css("cursor", "default"); var O = $s(e.pageX, e.pageY), B = $("#luckysheet-rows-h").scrollTop(), V = O[1] + B, H = $(window).height(), U = Ss(V), j = (U[1], U[0], U[2], V + 3 - ga.luckysheet_rows_change_size_start[0]); V + 3 - ga.luckysheet_rows_change_size_start[0] < 19 && (j = 19), V >= H - 200 + B && (j = H - 200 - ga.luckysheet_rows_change_size_start[0] + B); var G = $.extend(!0, {}, ga.config); null == G.rowlen && (G.rowlen = {}), null == G.customHeight && (G.customHeight = {}), G.customHeight[ga.luckysheet_rows_change_size_start[1]] = 1; var W = ga.luckysheet_rows_change_size_start[1], Y = !1; ga.luckysheet_select_save.length > 0 && ga.luckysheet_select_save.filter((function (e) { return e.row_select })).some((function (e) { return W >= e.row[0] && W <= e.row[1] && (Y = !0), Y })), Y ? ga.luckysheet_select_save.filter((function (e) { return e.row_select })).forEach((function (e) { for (var t = e.row[0]; t <= e.row[1]; t++)G.rowlen[t] = Math.ceil(j / ga.zoomRatio) })) : G.rowlen[ga.luckysheet_rows_change_size_start[1]] = Math.ceil(j / ga.zoomRatio); var X = Rc.moveChangeSize("row", ga.luckysheet_rows_change_size_start[1], j); ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "resize", ctrlType: "resizeR", sheetIndex: ga.currentSheetIndex, config: $.extend(!0, {}, ga.config), curconfig: $.extend(!0, {}, G), images: $.extend(!0, {}, Rc.images), curImages: $.extend(!0, {}, X) })), ga.config = G, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, G.rowlen, { k: "rowlen" }), ga.luckysheetfile[_l(ga.currentSheetIndex)].images = X, pd.saveParam("all", ga.currentSheetIndex, X, { k: "images" }), Rc.images = X, Rc.allImagesShow(), hd(ga.flowdata.length, null) } if (ga.luckysheet_cols_change_size) { ga.luckysheet_cols_change_size = !1, $("#luckysheet-change-size-line").hide(), $("#luckysheet-cols-change-size").css("opacity", 0), $("#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas").css("cursor", "default"); var K = $s(e.pageX, e.pageY), Z = $("#luckysheet-cols-h-c").scrollLeft(), Q = K[0] + Z, J = $(window).width(), ee = ga.visibledatarow.length - 1, te = (ga.visibledatarow[ee], Rs(Q)), ae = (te[1], te[0], te[2], Q + 3 - ga.luckysheet_cols_change_size_start[0]), re = ga.defaultcollen; if (null != ga.config.columnlen && null != ga.config.columnlen[ga.luckysheet_cols_change_size_start[1]] && (re = ga.config.columnlen[ga.luckysheet_cols_change_size_start[1]]), Math.abs(ae - re) < 3) return; Q + 3 - ga.luckysheet_cols_change_size_start[0] < 30 && (ae = 30), Q >= J - 100 + Z && (ae = J - 100 - ga.luckysheet_cols_change_size_start[0] + Z); var ne = $.extend(!0, {}, ga.config); null == ne.columnlen && (ne.columnlen = {}), null == ne.customWidth && (ne.customWidth = {}), ne.customWidth[ga.luckysheet_cols_change_size_start[1]] = 1; var le = ga.luckysheet_cols_change_size_start[1], ie = !1; ga.luckysheet_select_save.length > 0 && ga.luckysheet_select_save.filter((function (e) { return e.column_select })).some((function (e) { return le >= e.column[0] && le <= e.column[1] && (ie = !0), ie })), ie ? ga.luckysheet_select_save.filter((function (e) { return e.column_select })).forEach((function (e) { for (var t = e.column[0]; t <= e.column[1]; t++)ne.columnlen[t] = Math.ceil(ae / ga.zoomRatio) })) : ne.columnlen[ga.luckysheet_cols_change_size_start[1]] = Math.ceil(ae / ga.zoomRatio); var oe = Rc.moveChangeSize("column", ga.luckysheet_cols_change_size_start[1], ae); ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "resize", ctrlType: "resizeC", sheetIndex: ga.currentSheetIndex, config: $.extend(!0, {}, ga.config), curconfig: $.extend(!0, {}, ne), images: $.extend(!0, {}, Rc.images), curImages: $.extend(!0, {}, oe) })), ga.config = ne, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, ne.columnlen, { k: "columnlen" }), ga.luckysheetfile[_l(ga.currentSheetIndex)].images = oe, pd.saveParam("all", ga.currentSheetIndex, oe, { k: "images" }), Rc.images = oe, Rc.allImagesShow(), hd(null, ga.flowdata[0].length), setTimeout((function () { md() }), 1) } if (Ih.rangeMove && Ih.rangeMoveDragged(Ih.rangeMoveObj), ga.luckysheet_cell_selected_move) { $("#luckysheet-cell-selected-move").hide(), ga.luckysheet_cell_selected_move = !1; var se = $s(e.pageX, e.pageY); if (!fu(ga.luckysheet_select_save, ga.currentSheetIndex)) return; var ce = $("#luckysheet-cell-main").scrollLeft(), ue = $("#luckysheet-cell-main").scrollTop(), de = se[0] + ce, he = se[1] + ue, me = $(window).height() + ue - ga.sheetBarHeight - ga.statisticBarHeight, pe = $(window).width() + ce, fe = Ss(he)[2], ge = Rs(de)[2], ve = ga.luckysheet_cell_selected_move_index[0], ye = ga.luckysheet_cell_selected_move_index[1]; if (fe == ve && ge == ye) return; var be = rs.deepCopyFlowData(ga.flowdata), ke = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], xe = Wo(ke), we = $.extend(!0, {}, ga.config); if (null == we.merge && (we.merge = {}), null == we.rowlen && (we.rowlen = {}), _a(we, ke.row[0], ke.row[1], ke.column[0], ke.column[1])) return void (wa() ? alert(a.noMerge) : fd.info('', a.noMerge)); var _e = ke.row[0] - ve + fe, Ce = ke.row[1] - ve + fe, Te = ke.column[0] - ye + ge, Ae = ke.column[1] - ye + ge; if (!fu([{ row: [_e, Ce], column: [Te, Ae] }], ga.currentSheetIndex)) return; if ((_e < 0 || he < 0) && (_e = 0, Ce = ke.row[1] - ke.row[0]), (Te < 0 || de < 0) && (Te = 0, Ae = ke.column[1] - ke.column[0]), (Ce >= ga.visibledatarow[ga.visibledatarow.length - 1] || he > me) && (_e = ga.visibledatarow.length - 1 - ke.row[1] + ke.row[0], Ce = ga.visibledatarow.length - 1), (Ae >= ga.visibledatacolumn[ga.visibledatacolumn.length - 1] || de > pe) && (Te = ga.visibledatacolumn.length - 1 - ke.column[1] + ke.column[0], Ae = ga.visibledatacolumn.length - 1), _a(we, _e, Ce, Te, Ae)) return void (wa() ? alert(a.noMerge) : fd.info('', a.noMerge)); for (var Se = Lc(ga.currentSheetIndex), Ie = null, Re = ke.row[0]; Re <= ke.row[1]; Re++) { Re in we.rowlen && (Ie = !0); for (var $e = ke.column[0]; $e <= ke.column[1]; $e++) { var qe = be[Re][$e]; "object" == Cm(qe) && "mc" in qe && qe.mc.r + "_" + qe.mc.c in we.merge && delete we.merge[qe.mc.r + "_" + qe.mc.c], be[Re][$e] = null } } if (we.borderInfo && we.borderInfo.length > 0) { for (var De = [], Fe = 0; Fe < we.borderInfo.length; Fe++) { var Ee = we.borderInfo[Fe].rangeType; if ("range" == Ee) { for (var Me = we.borderInfo[Fe].range, Ne = [], Pe = 0; Pe < Me.length; Pe++)Ne = Ne.concat(gd.CFSplitRange(Me[Pe], { row: ke.row, column: ke.column }, { row: [_e, Ce], column: [Te, Ae] }, "restPart")); we.borderInfo[Fe].range = Ne, De.push(we.borderInfo[Fe]) } else if ("cell" == Ee) { var ze = we.borderInfo[Fe].value.row_index, Le = we.borderInfo[Fe].value.col_index; ze >= ke.row[0] && ze <= ke.row[1] && Le >= ke.column[0] && Le <= ke.column[1] || De.push(we.borderInfo[Fe]) } } we.borderInfo = De } for (var Oe = {}, Be = 0; Be < xe.length; Be++)for (var Ve = 0; Ve < xe[0].length; Ve++) { if (Se[Be + ke.row[0] + "_" + (Ve + ke.column[0])]) { var He = { rangeType: "cell", value: { row_index: Be + _e, col_index: Ve + Te, l: Se[Be + ke.row[0] + "_" + (Ve + ke.column[0])].l, r: Se[Be + ke.row[0] + "_" + (Ve + ke.column[0])].r, t: Se[Be + ke.row[0] + "_" + (Ve + ke.column[0])].t, b: Se[Be + ke.row[0] + "_" + (Ve + ke.column[0])].b } }; null == we.borderInfo && (we.borderInfo = []), we.borderInfo.push(He) } var Ue = ""; if (null != xe[Be] && null != xe[Be][Ve] && (Ue = xe[Be][Ve]), "object" == Cm(Ue) && "mc" in Ue) { var je = $.extend(!0, {}, Ue.mc); "rs" in Ue.mc ? (Oe[je.r + "_" + je.c] = [Be + _e, Ve + Te], Ue.mc.r = Be + _e, Ue.mc.c = Ve + Te, we.merge[Be + _e + "_" + (Ve + Te)] = Ue.mc) : (Ue.mc.r = Oe[je.r + "_" + je.c][0], Ue.mc.c = Oe[je.r + "_" + je.c][1]) } be[Be + _e][Ve + Te] = Ue } Ie && (we = qs(be, ke.row[0], ke.row[1], we), we = qs(be, _e, Ce, we)); var Ge, We, Ye = $.extend(!0, [], ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save); if (null != Ye && Ye.length > 0) for (var Xe = 0; Xe < Ye.length; Xe++) { for (var Ke = Ye[Xe].cellrange, Ze = [], Qe = 0; Qe < Ke.length; Qe++) { var Je = gd.CFSplitRange(Ke[Qe], { row: ke.row, column: ke.column }, { row: [_e, Ce], column: [Te, Ae] }, "allPart"); Ze = Ze.concat(Je) } Ye[Xe].cellrange = Ze } Ge = ga.luckysheet_select_save[0].row_focus == ga.luckysheet_select_save[0].row[0] ? _e : Ce, We = ga.luckysheet_select_save[0].column_focus == ga.luckysheet_select_save[0].column[0] ? Te : Ae; var et = []; et.push({ row: ke.row, column: ke.column }), et.push({ row: [_e, Ce], column: [Te, Ae] }), ke.row = [_e, Ce], ke.column = [Te, Ae], ke.row_focus = Ge, ke.column_focus = We, id(be, et, { cfg: we, RowlChange: Ie, cdformat: Ye }), Rh(), $("#luckysheet-sheettable").css("cursor", "default"), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500) } if (ga.chart_selection.rangeMove && ga.chart_selection.rangeMoveDragged(), ga.chart_selection.rangeResize && ga.chart_selection.rangeResizeDragged(), ga.luckysheet_cell_selected_extend) { if (ga.luckysheet_cell_selected_extend = !1, $("#luckysheet-cell-selected-extend").hide(), !fu(ga.luckysheet_select_save, ga.currentSheetIndex)) return; var tt = $s(e.pageX, e.pageY), at = $("#luckysheet-cell-main").scrollLeft(), rt = $("#luckysheet-cell-main").scrollTop(), nt = tt[0] + at - 5, lt = tt[1] + rt - 5, it = $(window).height() + rt - ga.sheetBarHeight - ga.statisticBarHeight, ot = $(window).width() + at, st = Ss(lt), ct = (st[1], st[0]), ut = st[2], dt = Rs(nt), ht = (dt[1], dt[0]), mt = dt[2], pt = ga.luckysheet_cell_selected_extend_index[0], ft = ga.luckysheet_cell_selected_extend_index[1], gt = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], vt = gt.row[0], yt = gt.row[1], bt = gt.column[0], kt = gt.column[1]; (vt < 0 || lt < 0) && (vt = 0, yt = gt.row[1] - gt.row[0]), (bt < 0 || nt < 0) && (bt = 0, kt = gt.column[1] - gt.column[0]), (yt >= ga.visibledatarow[ga.visibledatarow.length - 1] || lt > it) && (vt = ga.visibledatarow.length - 1 - gt.row[1] + gt.row[0], yt = ga.visibledatarow.length - 1), (kt >= ga.visibledatacolumn[ga.visibledatacolumn.length - 1] || nt > ot) && (bt = ga.visibledatacolumn.length - 1 - gt.column[1] + gt.column[0], kt = ga.visibledatacolumn.length - 1), Oc.copyRange = { row: $.extend(!0, [], gt.row), column: $.extend(!0, [], gt.column) }; var xt = Oc.typeItemHide(); if (xt[0] || xt[1] || xt[2] || xt[3] || xt[4] || xt[5] || xt[6] ? Oc.applyType = "1" : Oc.applyType = "0", Math.abs(pt - ut) > Math.abs(ft - mt)) { if (ut >= vt && ut <= yt) return; if (ga.luckysheet_select_save[0].top_move >= ct) { if (Oc.applyRange = { row: [ut, gt.row[0] - 1], column: gt.column }, Oc.direction = "up", vt -= gt.row[0] - ut, Ru.isPivotRange(vt, kt)) return void fd.info(a.affectPivot, "") } else if (Oc.applyRange = { row: [gt.row[1] + 1, ut], column: gt.column }, Oc.direction = "down", yt += ut - gt.row[1], Ru.isPivotRange(yt, kt)) return void fd.info(a.affectPivot, "") } else { if (mt >= bt && mt <= kt) return; if (ga.luckysheet_select_save[0].left_move >= ht) { if (Oc.applyRange = { row: gt.row, column: [mt, gt.column[0] - 1] }, Oc.direction = "left", bt -= gt.column[0] - mt, Ru.isPivotRange(yt, bt)) return void fd.info(a.affectPivot, "") } else if (Oc.applyRange = { row: gt.row, column: [gt.column[1] + 1, mt] }, Oc.direction = "right", kt += mt - gt.column[1], Ru.isPivotRange(yt, kt)) return void fd.info(a.affectPivot, "") } if (null != ga.config.merge) { for (var wt = !1, _t = gt.row[0]; _t <= gt.row[1]; _t++)for (var Ct = gt.column[0]; Ct <= gt.column[1]; Ct++) { var Tt = ga.flowdata[_t][Ct]; if (null != Tt && null != Tt.mc) { wt = !0; break } } if (wt) return void (wa() ? alert(a.noMerge) : fd.info(a.noMerge, "")); for (var At = vt; At <= yt; At++)for (var St = bt; St <= kt; St++) { var It = ga.flowdata[At][St]; if (null != It && null != It.mc) { wt = !0; break } } if (wt) return void (wa() ? alert(a.noMerge) : fd.info(a.noMerge, "")) } gt.row = [vt, yt], gt.column = [bt, kt], Oc.update(), Oc.createIcon(), $("#luckysheet-cell-selected-move").hide(), $("#luckysheet-sheettable").css("cursor", "default"), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500) } })), $(".luckysheet-grid-container, #luckysheet-rightclick-menu").on("contextmenu", (function (e) { e.preventDefault() })), $("#luckysheet-cell-main div.luckysheet-cs-draghandle").mousedown((function (e) { if (!wa() && !1 !== ga.allowEdit) { $("#luckysheet-cell-selected").find(".luckysheet-cs-fillhandle").css("cursor", "move").end().find(".luckysheet-cs-draghandle").css("cursor", "move"), $("#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0").css("cursor", "move"), ga.luckysheet_cell_selected_move = !0, ga.luckysheet_scroll_status = !0; var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = Ss(t[1] + $("#luckysheet-cell-main").scrollTop()), n = r[0], l = r[1], i = r[2], o = Rs(a), s = o[0], c = o[1], u = o[2]; ga.luckysheet_cell_selected_move_index = [i, u], $("#luckysheet-cell-selected-move").css({ left: s, width: c - s - 1, top: n, height: l - n - 1, display: "block" }), e.stopPropagation() } })), $("#luckysheet-cell-main div.luckysheet-cs-fillhandle").mousedown((function (e) { wa() || !1 === ga.allowEdit || ($("#luckysheet-cell-selected").find(".luckysheet-cs-fillhandle").css("cursor", "crosshair").end().find(".luckysheet-cs-draghandle").css("cursor", "crosshair"), $("#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0").css("cursor", "crosshair"), ga.luckysheet_cell_selected_extend_time = setTimeout((function () { ga.luckysheet_cell_selected_extend = !0, ga.luckysheet_scroll_status = !0; var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft() - 5, r = Ss(t[1] + $("#luckysheet-cell-main").scrollTop() - 5), n = r[0], l = r[1], i = r[2], o = Rs(a), s = o[0], c = o[1], u = o[2]; ga.luckysheet_cell_selected_extend_index = [i, u], $("#luckysheet-cell-selected-extend").css({ left: s, width: c - s - 1, top: n, height: l - n - 1, display: "block" }) }), 100), e.stopPropagation()) })).click((function () { clearTimeout(ga.luckysheet_cell_selected_extend_time), event.stopPropagation() })).dblclick((function () { var e = ga.luckysheet_select_save[0], t = e.row[0], a = e.row[1], r = e.column[0], n = e.column[1]; if (!Ru.isPivotRange(t, r)) { for (var l = !1, i = 0, o = a + 1; o < ga.flowdata.length; o++)if (r - 1 >= 0 && n + 1 < ga.flowdata[0].length) { var s = ga.flowdata[o][r - 1], c = ga.flowdata[o][n + 1]; if (o == a + 1) { if ((null == s || ya(s.v)) && (null == c || ya(c.v))) { l = !1; break } l = !0, i++ } else { if ((null == s || ya(s.v)) && (null == c || ya(c.v))) break; i++ } } else if (r - 1 >= 0) { var u = ga.flowdata[o][r - 1]; if (o == a + 1) { if (null == u || ya(u.v)) { l = !1; break } l = !0, i++ } else { if (null == u || ya(u.v)) break; i++ } } else if (n + 1 < ga.flowdata[0].length) { var d = ga.flowdata[o][n + 1]; if (o == a + 1) { if (null == d || ya(d.v)) { l = !1; break } l = !0, i++ } else { if (null == d || ya(d.v)) break; i++ } } if (l && 0 != i) { Oc.copyRange = { row: [t, a], column: [r, n] }; var h = Oc.typeItemHide(); h[0] || h[1] || h[2] || h[3] || h[4] || h[5] || h[6] ? Oc.applyType = "1" : Oc.applyType = "0", Oc.applyRange = { row: [a + 1, a + i], column: [r, n] }, Oc.direction = "down", ga.luckysheet_select_save = [{ row: [t, a + i], column: [r, n] }], Oc.update(), Oc.createIcon(), $("#luckysheet-cell-selected-move").hide(), $("#luckysheet-sheettable").css("cursor", "default"), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500), event.stopPropagation() } else event.stopPropagation() } })), $("#luckysheet-bottom-add-row, #luckysheet-bottom-add-row-input, #luckysheet-bottom-return-top").on("mousedown dblclick mouseup", (function (e) { e.stopPropagation() })), $("#luckysheet-bottom-add-row").on("click", (function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); $(this); var t = $("#luckysheet-bottom-add-row-input").val(); "" == t && (t = 100), isNaN(parseInt(t)) ? wa() ? alert(r.tipInputNumber) : fd.info("error", r.tipInputNumber) : (t = parseInt(t)) < 1 || t > 100 ? wa() ? alert(r.tipInputNumberLimit) : fd.info("error", r.tipInputNumberLimit) : qc("row", ga.flowdata.length - 1, t) })), $("#luckysheet-bottom-return-top").on("click", (function (e) { $("#luckysheet-scrollbar-y").scrollTop(0) })), $("#luckysheet-copy-btn, #luckysheet-cols-copy-btn, #luckysheet-paste-btn-title").click((function (e) { if ($(this).parent().hide(), null != ga.config.merge) { for (var t = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (t = _a(ga.config, n, l, i, o)) break } if (t) return void (wa() ? alert(a.noPartMerge) : fd.info(a.noPartMerge, "")) } var s = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save; if (ga.luckysheet_select_save.length > 1 && null != s && s.length > 0) { var c = !1, u = gd.getComputeMap(); e: for (var d = 0; d < ga.luckysheet_select_save.length && !c; d++)for (var h = ga.luckysheet_select_save[d].row[0], m = ga.luckysheet_select_save[d].row[1], p = ga.luckysheet_select_save[d].column[0], f = ga.luckysheet_select_save[d].column[1], g = h; g <= m; g++)for (var v = p; v <= f; v++)if (null != gd.checksCF(g, v, u)) { c = !0; continue e } if (c) return void (wa() ? alert(a.noMulti) : fd.info(a.noMulti, "")) } if (ga.luckysheet_select_save.length > 1) { for (var y = !0, b = ga.luckysheet_select_save[0].row[0], k = ga.luckysheet_select_save[0].row[1], x = !0, w = ga.luckysheet_select_save[0].column[0], _ = ga.luckysheet_select_save[0].column[1], C = 1; C < ga.luckysheet_select_save.length; C++)ga.luckysheet_select_save[C].row[0] == b && ga.luckysheet_select_save[C].row[1] == k || (y = !1), ga.luckysheet_select_save[C].column[0] == w && ga.luckysheet_select_save[C].column[1] == _ || (x = !1); if (!y && !x || Dh()) return void (wa() ? alert(a.noMulti) : fd.info(a.noMulti, "")) } vd.copy(e) })), $("#luckysheet-copy-paste, #luckysheet-cols-paste-btn, #luckysheet-paste-btn-title").click((function (e) { vd.paste(e, "btn"), $(this).parent().hide() })), $("#luckysheet-chart-btn-title").click((function () { mh() })), $("#luckysheetdatavisual").click((function () { mh(), $("#luckysheet-rightclick-menu").hide() })), $("#luckysheet-pivot-btn-title").click((function (e) { bu(ga.currentSheetIndex, "usePivotTablereports") && Ru.createPivotTable(e) })), $("#luckysheet-chart-btn-screenshot").click((function () { var e = t.screenshot; if (0 != ga.luckysheet_select_save.length) if (ga.luckysheet_select_save.length > 1) wa() ? alert(e.screenshotTipHasMulti) : fd.info(e.screenshotTipTitle, e.screenshotTipHasMulti); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.screenshotTipHasMerge) : fd.info(e.screenshotTipTitle, e.screenshotTipHasMerge)) } var s, c, u, d, h = ga.luckysheet_select_save[0].row[0], m = ga.luckysheet_select_save[0].row[1], p = ga.luckysheet_select_save[0].column[0], f = ga.luckysheet_select_save[0].column[1]; h - 1 < 0 ? (s = 0, c = ga.visibledatarow[m]) : (s = ga.visibledatarow[h - 1], c = ga.visibledatarow[m] - ga.visibledatarow[h - 1]), p - 1 < 0 ? (u = 0, d = ga.visibledatacolumn[f]) : (u = ga.visibledatacolumn[p - 1], d = ga.visibledatacolumn[f] - ga.visibledatacolumn[p - 1]); var g = $("").attr({ width: Math.ceil(d * devicePixelRatio), height: Math.ceil(c * devicePixelRatio) }).css({ width: d, height: c }); Xu(u, s, d, c, 1, 1, null, null, g); var v = g.get(0).getContext("2d"); v.beginPath(), v.moveTo(0, 0), v.lineTo(0, ga.devicePixelRatio * c), v.lineWidth = 2 * ga.devicePixelRatio, v.strokeStyle = Vn, v.stroke(), v.closePath(), v.beginPath(), v.moveTo(0, 0), v.lineTo(ga.devicePixelRatio * d, 0), v.lineWidth = 2 * ga.devicePixelRatio, v.strokeStyle = Vn, v.stroke(), v.closePath(); var y = new Image, b = g.get(0).toDataURL("image/png"); y.src = b, d > c ? y.style.width = "100%" : y.style.height = "100%"; var k = $(window).height() - 200; fd.screenshot(e.screenshotTipSuccess, '
      ', b), $("#luckysheet-confirm-screenshot-save").append(y), g.remove() } else wa() ? alert(e.screenshotTipNoSelection) : fd.info(e.screenshotTipTitle, e.screenshotTipNoSelection) })), $(document).on("click.luckysheetEvent", "a.download", (function () { for (var e = $("#luckysheet-confirm-screenshot-save img").attr("src"), a = t.screenshot, r = atob(e.split(",")[1]), n = r.length, l = new Uint8Array(n), i = 0; i < n; i++)l[i] = r.charCodeAt(i); var o, s = new Blob([l]), c = document.createElement("a"); c.setAttribute("href", URL.createObjectURL(s)), c.setAttribute("download", a.screenshotImageName + ".png"), c.style.display = "none", document.body.appendChild(c), c.click(), c.addEventListener("click", o = function () { requestAnimationFrame((function () { URL.revokeObjectURL(c.href) })), c.removeAttribute("href"), c.removeEventListener("click", o) }), document.body.removeChild(c) })), $("#luckysheet-splitColumn-btn-title").click((function () { if (hu(ga.currentSheetIndex) && null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length) { var e = t.splitText; ga.luckysheet_select_save.length > 1 ? fd.info(e.tipNoMulti, "") : ga.luckysheet_select_save[0].column[0] == ga.luckysheet_select_save[0].column[1] ? (dy.createDialog(), dy.init()) : fd.info(e.tipNoMultiColumn, "") } })), $("#luckysheet-insertImg-btn-title").click((function () { bu(ga.currentSheetIndex, "editObjects") && $("#luckysheet-imgUpload").click() })), $("#luckysheetInsertImage").click((function () { bu(ga.currentSheetIndex, "editObjects") && ($("#luckysheet-imgUpload").click(), $("#luckysheet-rightclick-menu").hide()) })), $("#luckysheet-imgUpload").click((function (e) { e.stopPropagation() })), $("#luckysheet-imgUpload").on("change", (function (e) { if (bu(ga.currentSheetIndex, "editObjects", !1)) { var t = e.currentTarget.files[0], a = new FileReader; a.readAsDataURL(t), a.onload = function (e) { var t = e.target.result; Rc.inserImg(t), $("#luckysheet-imgUpload").val("") } } })), $("#luckysheet-insertLink-btn-title").click((function () { hu(ga.currentSheetIndex) && null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length && (rd.createDialog(), rd.init()) })), $("#luckysheetInsertLink").click((function () { $("#luckysheet-insertLink-btn-title").click(), $("#luckysheet-rightclick-menu").hide() })), $("#luckysheet-dataVerification-btn-title").click((function () { hu(ga.currentSheetIndex) && null != ga.luckysheet_select_save && 0 != ga.luckysheet_select_save.length && ($c.createDialog(), $c.init()) })), $("#luckysheetDataVerification").click((function () { $("#luckysheet-dataVerification-btn-title").click(), $("#luckysheet-rightclick-menu").hide() })), $("#luckysheetCellFormatRightClickMenu").click((function () { !function () { py(); var e = gn(), t = e.cellFormat; if (e.button, $("#luckysheet-rightclick-menu").hide(), hu(ga.currentSheetIndex)) { var a = !1, r = !1, n = 0, l = 0, i = 0; if (null != ga.luckysheet_select_save && ga.luckysheet_select_save.length > 0) { my((function (e) { null != e && null != e.lo && 1 != e.lo || (a = !0, n++), null != e && 1 == e.hi && (r = !0, l++), i++ }), (function () { a = !0 })); var o = "", s = ""; a && (o = n == i ? t.tipsAll : t.tipsPart), r && (s = l == i ? t.tipsAll : t.tipsPart), $("#luckysheet-protection-check-locked").prop("checked", a).parent().next().html(o), $("#luckysheet-protection-check-hidden").prop("checked", r).parent().next().html(s), Bm("luckysheet-cellFormat-config") } else alert(t.selectionIsNullAlert) } }() })), $("#luckysheet-freezen-btn-horizontal").click((function () { $.trim($(this).text()) == gn().freezen.freezenCancel ? (Bc.saveFrozen("freezenCancel"), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), null != Bc.freezenhorizontaldata && (Bc.cancelFreezenHorizontal(), Bc.createAssistCanvas(), md()), Bc.scrollAdapt()) : (Bc.saveFrozen("freezenRow"), null != Bc.freezenverticaldata && (Bc.cancelFreezenVertical(), Bc.createAssistCanvas(), md()), null == Bc.freezenhorizontaldata && (Bc.createFreezenHorizontal(), Bc.createAssistCanvas())) })), $("#luckysheet-freezen-btn-vertical").click((function () { null != Bc.freezenverticaldata ? (Bc.saveFrozen("freezenCancel"), Bc.cancelFreezenVertical(), md()) : (Bc.saveFrozen("freezenColumn"), Bc.createFreezenVertical()), Bc.createAssistCanvas() })), $("#luckysheet-rightclick-menu input").on("keydown", (function (e) { e.stopPropagation() })), $("#luckysheet-modal-dialog-mask").on("click dbclick mousedown mousemove mouseup", (function (e) { e.stopPropagation(), e.preventDefault() })); $(document).on("visibilitychange.luckysheetEvent webkitvisibilitychange.luckysheetEvent msvisibilitychange.luckysheetEvent", (function () { (document.hidden || document.webkitHidden || document.msHidden) && (ga.iscopyself = !1) })).on("mouseleave.luckysheetEvent", (function () { ga.iscopyself = !1 })).on("mousedown.luckysheetEvent", (function (e) { Pc.removeActivePs(), Do(e), $(e.target).closest("#luckysheet-wa-editor").length > 0 && parseInt($("#luckysheet-input-box").css("top")) > 0 && (console.log(e), Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("down", 0, "rangeOfSelect")) })), $("#luckysheet-left-top").click((function (e) { vu(ga.currentSheetIndex) && ($("#luckysheet-wa-functionbox-confirm").click(), ga.luckysheet_select_status = !1, ga.luckysheet_select_save = [{ row: [0, ga.flowdata.length - 1], column: [0, ga.flowdata[0].length - 1], row_focus: 0, column_focus: 0, row_select: !0, column_select: !0 }], Rh(), clearTimeout(ga.countfuncTimeout), ga.countfuncTimeout = setTimeout((function () { dc() }), 500), pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save), e.stopPropagation()) })), $("#luckysheet-icon-undo").click((function (e) { Wh(e) })), $("#luckysheet-icon-redo").click((function (e) { Yh(e) })), $(document).on("mousedown.luckysheetEvent", "div.luckysheet-modal-dialog", (function (e) { if ($(e.target).is(".luckysheet-modal-dialog")) { ga.luckysheet_model_move_state = !0, ga.luckysheet_model_move_obj = $(e.currentTarget); var t = ga.luckysheet_model_move_obj.offset(); ga.luckysheet_model_xy = [e.pageX - t.left, e.pageY - t.top] } })), $(document).on("click.luckysheetEvent", ".luckysheet-modal-dialog-title-close, .luckysheet-model-close-btn", (function (e) { ($("#textcolorselect").is(":visible") || $("#cellcolorselect").is(":visible")) && $("#luckysheet-conditionformat-dialog").show(), $(e.currentTarget).parents(".luckysheet-modal-dialog").hide(), $("#luckysheet-modal-dialog-mask").hide(), $(this).parents(".luckysheet-modal-dialog").hasClass("luckysheet-search-formula") && (Ih.dontupdate(), mc("down", 0, "rangeOfSelect")), $(this).parents(".luckysheet-modal-dialog").hasClass("luckysheet-search-formula-parm") && (Ih.dontupdate(), mc("down", 0, "rangeOfSelect")), $(this).parents(".luckysheet-modal-dialog").hasClass("luckysheet-search-formula-parm-select") && (Ih.dontupdate(), mc("down", 0, "rangeOfSelect")), Em() })), $("#luckysheet_info_detail_title").click((function () { window.open(fa.myFolderUrl, "_self") })), $("#luckysheet-chart-rangeShow").on("mousedown.chartRangeShowMove", ".luckysheet-chart-rangeShow-move", (function (e) { ga.chart_selection.rangeMove = !0, ga.luckysheet_scroll_status = !0, ga.chart_selection.rangeMoveObj = $(this).parent(); var t = ga.currentChart, a = $(this).parent().attr("id"); if ("luckysheet-chart-rangeShow-content" == a) { var r = t.rangeArray[0].row[0] + t.rangeSplitArray.content.row[0], n = t.rangeArray[0].column[0] + t.rangeSplitArray.content.column[0]; ga.chart_selection.rangeMoveIndex = [r, n] } else if ("luckysheet-chart-rangeShow-rowtitle" == a) { var l = t.rangeArray[0].row[0] + t.rangeSplitArray.rowtitle.row[0], i = t.rangeArray[0].column[0] + t.rangeSplitArray.rowtitle.column[0]; ga.chart_selection.rangeMoveIndex = [l, i] } else if ("luckysheet-chart-rangeShow-coltitle" == a) { var o = t.rangeArray[0].row[0] + t.rangeSplitArray.coltitle.row[0], s = t.rangeArray[0].column[0] + t.rangeSplitArray.coltitle.column[0]; ga.chart_selection.rangeMoveIndex = [o, s] } var c = $s(e.pageX, e.pageY), u = c[0] + $("#luckysheet-cell-main").scrollLeft(), d = c[1] + $("#luckysheet-cell-main").scrollTop(), h = $(this).data("type"); "top" == h ? d += 3 : "right" == h ? u -= 3 : "bottom" == h ? d -= 3 : "left" == h && (u += 3); var m = Ss(d)[2], p = Rs(u)[2]; ga.chart_selection.rangeMovexy = [m, p], e.stopPropagation() })), $("#luckysheet-chart-rangeShow").on("mousedown.chartRangeShowResize", ".luckysheet-chart-rangeShow-resize", (function (e) { ga.chart_selection.rangeResize = $(this).data("type"), ga.luckysheet_scroll_status = !0, ga.chart_selection.rangeResizeObj = $(this).parent(); var t, a, r, n, l = ga.currentChart, i = $(this).parent().attr("id"); if ("luckysheet-chart-rangeShow-content" == i) l.rangeRowCheck.exits ? (t = l.rangeArray[0].row[0] + l.rangeSplitArray.content.row[0], a = l.rangeArray[0].row[0] + l.rangeSplitArray.content.row[1]) : (t = l.rangeSplitArray.content.row[0], a = l.rangeSplitArray.content.row[0]), l.rangeColCheck.exits ? (r = l.rangeArray[0].column[0] + l.rangeSplitArray.content.column[0], n = l.rangeArray[0].column[0] + l.rangeSplitArray.content.column[1]) : (r = l.rangeSplitArray.content.column[0], n = l.rangeSplitArray.content.column[1]), ga.chart_selection.rangeResizeIndex = { row: [t, a], column: [r, n] }; else if ("luckysheet-chart-rangeShow-rowtitle" == i) { var o = l.rangeArray[0].row[0] + l.rangeSplitArray.rowtitle.row[0], s = l.rangeArray[0].row[0] + l.rangeSplitArray.rowtitle.row[1], c = l.rangeArray[0].column[0] + l.rangeSplitArray.rowtitle.column[0], u = l.rangeArray[0].column[0] + l.rangeSplitArray.rowtitle.column[1]; ga.chart_selection.rangeResizeIndex = { row: [o, s], column: [c, u] } } else if ("luckysheet-chart-rangeShow-coltitle" == i) { var d = l.rangeArray[0].row[0] + l.rangeSplitArray.coltitle.row[0], h = l.rangeArray[0].row[0] + l.rangeSplitArray.coltitle.row[1], m = l.rangeArray[0].column[0] + l.rangeSplitArray.coltitle.column[0], p = l.rangeArray[0].column[0] + l.rangeSplitArray.coltitle.column[1]; ga.chart_selection.rangeResizeIndex = { row: [d, h], column: [m, p] } } var f = $s(e.pageX, e.pageY), g = f[0] + $("#luckysheet-cell-main").scrollLeft(), v = f[1] + $("#luckysheet-cell-main").scrollTop(); "lt" == ga.chart_selection.rangeResize ? (g += 3, v += 3) : "lb" == ga.chart_selection.rangeResize ? (g += 3, v -= 3) : "rt" == ga.chart_selection.rangeResize ? (g -= 3, v += 3) : "rb" == ga.chart_selection.rangeResize && (g -= 3, v -= 3); var y = Ss(v)[2], b = Rs(g)[2]; ga.chart_selection.rangeResizexy = [y, b], e.stopPropagation() })), $("#luckysheet-wa-calculate-size").mousedown((function (e) { var t = e.pageY; Ih.functionResizeData.y = t, Ih.functionResizeStatus = !0, Ih.functionResizeData.calculatebarHeight = ga.calculatebarHeight, null != Ih.rangetosheet && Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]) })), xm.initialMenuButton(); document.getElementById("testdpidiv").offsetWidth, ga.devicePixelRatio, document.getElementById("testdpidiv").offsetHeight, ga.devicePixelRatio; $(document).on("paste.luckysheetEvent", (function (e) { if (!wa()) if (vd.isPasteAction) { $("#luckysheet-rich-text-editor").blur(), vd.isPasteAction = !1; var t = window.clipboardData; t || (t = e.originalEvent.clipboardData); var a = t.getData("text/html") || t.getData("text/plain"), r = !0; if (a.indexOf("luckysheet_copy_action_table") > -1 && null != ga.luckysheet_copy_save.copyRange && ga.luckysheet_copy_save.copyRange.length > 0) { for (var n = [], l = new RegExp("(.*?)", "g"), i = new RegExp("(.*?)", "g"), o = a.match(l), s = 0; s < o.length; s++) { var c = [], u = o[s].match(i); if (null != u) for (var d = 0; d < u.length; d++) { var h = u[d].replace(//g, "").replace(/<\/td>/g, ""); c.push(h) } n.push(c) } var m, p = ga.luckysheet_copy_save.copyRange[0].row[0], f = ga.luckysheet_copy_save.copyRange[0].row[1], g = ga.luckysheet_copy_save.copyRange[0].column[0], v = ga.luckysheet_copy_save.copyRange[0].column[1], y = ga.luckysheet_copy_save.dataSheetIndex; m = y == ga.currentSheetIndex ? rs.deepCopyFlowData(ga.flowdata) : ga.luckysheetfile[_l(y)].data; for (var b = p; b <= f && !(b - p > n.length - 1); b++)for (var k = g; k <= v; k++) { var x = m[b][k]; if (null == x || null == x.mc || null != x.mc.rs) { var w = void 0; if (null == (w = null != x ? null != x.ct && x.ct.fa.indexOf("w") > -1 ? m[b][k].v : m[b][k].m : "") && (w = ""), n[b - p][k - g] != w) { r = !1; break } } } } var _ = gn().fontjson; if (!Nc.createHookFunction("rangePasteBefore", ga.luckysheet_select_save, a)) return; if (a.indexOf("luckysheet_copy_action_table") > -1 && null != ga.luckysheet_copy_save.copyRange && ga.luckysheet_copy_save.copyRange.length > 0 && r) ga.luckysheet_paste_iscut ? (ga.luckysheet_paste_iscut = !1, vd.pasteHandlerOfCutPaste(ga.luckysheet_copy_save), vd.clearcopy(e)) : vd.pasteHandlerOfCopyPaste(ga.luckysheet_copy_save); else if (a.indexOf("luckysheet_copy_action_image") > -1) Rc.pasteImgItem(); else if (a.indexOf("table") > -1) { $("#luckysheet-copy-content").html(a); var C = new Array($("#luckysheet-copy-content").find("table tr").length), T = 0; $("#luckysheet-copy-content").find("table tr").eq(0).find("td").each((function () { var e = parseInt($(this).attr("colspan")); isNaN(e) && (e = 1), T += e })); for (var A = 0; A < C.length; A++)C[A] = new Array(T); var S = 0, I = {}; $("#luckysheet-copy-content").find("table tr").each((function () { var e = $(this), t = 0; e.find("td").each((function () { var e = $(this), a = {}, r = e.text(); if (0 == $.trim(r).length) a.v = null, a.m = ""; else { var n = xs(e.text()); a.v = n[2], a.ct = n[1], a.m = n[0] } var l = e.css("background-color"); "rgba(0, 0, 0, 0)" == l && (l = null), a.bg = l; var i = e.css("font-weight"); a.bl = 400 == i || "normal" == i ? 0 : 1; var o = e.css("font-style"); a.it = "normal" == o ? 0 : 1; for (var s = e.css("font-family").split(","), c = 0; c < s.length; c++) { var u = $.trim(s[c].toLowerCase()); if (null != (u = _[u])) { a.ff = u; break } a.ff = 0 } var d = Math.floor(72 * parseInt(e.css("font-size")) / 96) + 1; a.fs = d; var h = e.css("color"); a.fc = h; var m = e.css("text-align"); a.ht = "center" == m ? 0 : "right" == m ? 2 : 1; var p = e.css("vertical-align"); for (a.vt = "middle" == p ? 0 : "top" == p || "text-top" == p ? 1 : 2; t < T && null != C[S][t];)t++; if (t == T) return !0; if (null == C[S][t]) { C[S][t] = a; var f = parseInt(e.attr("rowspan")), g = parseInt(e.attr("colspan")); isNaN(f) && (f = 1), isNaN(g) && (g = 1); for (var v = ga.luckysheet_select_save[0].row[0] + S, y = ga.luckysheet_select_save[0].column[0] + t, b = 0; b < f; b++)for (var k = 0; k < g; k++) { if (0 == b) { var x = e.css("border-top"); if (null != x && x.length > 0 && "0px" != x.substr(0, 3).toLowerCase()) { var w = e.css("border-top-width"), A = e.css("border-top-style"), R = e.css("border-top-color"), q = xm.getQKBorder(w, A, R); null == I[S + b + "_" + (t + k)] && (I[S + b + "_" + (t + k)] = {}), I[S + b + "_" + (t + k)].t = { style: q[0], color: q[1] } } } if (b == f - 1) { var D = e.css("border-bottom"); if (null != D && D.length > 0 && "0px" != D.substr(0, 3).toLowerCase()) { var F = e.css("border-bottom-width"), E = e.css("border-bottom-style"), M = e.css("border-bottom-color"), N = xm.getQKBorder(F, E, M); null == I[S + b + "_" + (t + k)] && (I[S + b + "_" + (t + k)] = {}), I[S + b + "_" + (t + k)].b = { style: N[0], color: N[1] } } } if (0 == k) { var P = e.css("border-left"); if (null != P && P.length > 0 && "0px" != P.substr(0, 3).toLowerCase()) { var z = e.css("border-left-width"), L = e.css("border-left-style"), O = e.css("border-left-color"), B = xm.getQKBorder(z, L, O); null == I[S + b + "_" + (t + k)] && (I[S + b + "_" + (t + k)] = {}), I[S + b + "_" + (t + k)].l = { style: B[0], color: B[1] } } } if (k == g - 1) { var V = e.css("border-right"); if (null != V && V.length > 0 && "0px" != V.substr(0, 3).toLowerCase()) { var H = e.css("border-right-width"), U = e.css("border-right-style"), j = e.css("border-right-color"), G = xm.getQKBorder(H, U, j); null == I[S + b + "_" + (t + k)] && (I[S + b + "_" + (t + k)] = {}), I[S + b + "_" + (t + k)].r = { style: G[0], color: G[1] } } } 0 == b && 0 == k || (C[S + b][t + k] = { mc: { r: v, c: y } }) } if (f > 1 || g > 1) { var W = { rs: f, cs: g, r: v, c: y }; C[S][t].mc = W } } return ++t == T || void 0 })), S++ })), ga.luckysheet_selection_range = [], vd.pasteHandler(C, I), $("#luckysheet-copy-content").empty() } else { if (1 == t.files.length && t.files[0].type.indexOf("image") > -1) { var R = new FileReader; return R.readAsDataURL(t.files[0]), void (R.onload = function (e) { var t = e.target.result; Rc.inserImg(t) }) } a = t.getData("text/plain"), vd.pasteHandler(a) } } else if ($(e.target).closest("#luckysheet-rich-text-editor").length > 0) { e.preventDefault(); var q = window.clipboardData; q || (q = e.originalEvent.clipboardData); var D = q.getData("text/plain"); document.execCommand("insertText", !1, D) } })), fa.enablePage && $("#luckysheet-bottom-page-next").click((function () { var e = fa.pageInfo.queryExps, t = fa.pageInfo.reportId, a = fa.pageInfo.fields, n = fa.pageInfo.mobile, l = fa.pageInfo.frezon, i = fa.pageInfo.currentPage, o = (fa.pageInfo.totalPage, fa.pageInfo.pageUrl); Nc.addDataAjax({ queryExps: e, reportId: t, fields: a, mobile: n, frezon: l, pageIndex: i, currentPage: i }, ga.currentSheetIndex, o, (function () { if (fa.pageInfo.currentPage++, fa.pageInfo.totalPage == fa.pageInfo.currentPage) { $("#luckysheet-bottom-page-next").hide(); var e = _m(r.pageInfoFull, { total: fa.total, totalPage: fa.pageInfo.totalPage }); $("#luckysheet-bottom-page-info").html(e) } else { var t = _m(r.pageInfo, { total: fa.total, totalPage: fa.pageInfo.totalPage, currentPage: fa.pageInfo.currentPage }); $("#luckysheet-bottom-page-info").html(t) } })) })).mousedown((function (e) { e.stopPropagation() })), $("#luckysheet-bottom-bottom-top").click((function () { $("#luckysheet-scrollbar-y").scrollTop(0) })).mousedown((function (e) { e.stopPropagation() })) } var vy = !1, yy = null, by = null, ky = ""; function xy() { if (!vy) { vy = !0; var e = gn(), t = e.toolbar; $("#luckysheetsheetconfigcolorur").spectrum({ showPalette: !0, preferredFormat: "hex", clickoutFiresChange: !1, showInitial: !0, showInput: !0, flat: !0, hideAfterPaletteSelect: !1, showSelectionPalette: !0, maxPaletteSize: 10, cancelText: e.sheetconfig.cancelText, chooseText: e.sheetconfig.chooseText, togglePaletteMoreText: t.toolMore, togglePaletteLessText: t.toolLess, clearText: t.clearText, noColorSelectedText: t.noColorSelectedText, palette: [["rgb(0, 0, 0)", "rgb(67, 67, 67)", "rgb(102, 102, 102)", "rgb(204, 204, 204)", "rgb(217, 217, 217)", "rgb(255, 255, 255)"], ["rgb(152, 0, 0)", "rgb(255, 0, 0)", "rgb(255, 153, 0)", "rgb(255, 255, 0)", "rgb(0, 255, 0)", "rgb(0, 255, 255)", "rgb(74, 134, 232)", "rgb(0, 0, 255)", "rgb(153, 0, 255)", "rgb(255, 0, 255)"], ["rgb(230, 184, 175)", "rgb(244, 204, 204)", "rgb(252, 229, 205)", "rgb(255, 242, 204)", "rgb(217, 234, 211)", "rgb(208, 224, 227)", "rgb(201, 218, 248)", "rgb(207, 226, 243)", "rgb(217, 210, 233)", "rgb(234, 209, 220)"], ["rgb(221, 126, 107)", "rgb(234, 153, 153)", "rgb(249, 203, 156)", "rgb(255, 229, 153)", "rgb(182, 215, 168)", "rgb(162, 196, 201)", "rgb(164, 194, 244)", "rgb(159, 197, 232)", "rgb(180, 167, 214)", "rgb(213, 166, 189)"], ["rgb(204, 65, 37)", "rgb(224, 102, 102)", "rgb(246, 178, 107)", "rgb(255, 217, 102)", "rgb(147, 196, 125)", "rgb(118, 165, 175)", "rgb(109, 158, 235)", "rgb(111, 168, 220)", "rgb(142, 124, 195)", "rgb(194, 123, 160)"], ["rgb(166, 28, 0)", "rgb(204, 0, 0)", "rgb(230, 145, 56)", "rgb(241, 194, 50)", "rgb(106, 168, 79)", "rgb(69, 129, 142)", "rgb(60, 120, 216)", "rgb(61, 133, 198)", "rgb(103, 78, 167)", "rgb(166, 77, 121)"], ["rgb(91, 15, 0)", "rgb(102, 0, 0)", "rgb(120, 63, 4)", "rgb(127, 96, 0)", "rgb(39, 78, 19)", "rgb(12, 52, 61)", "rgb(28, 69, 135)", "rgb(7, 55, 99)", "rgb(32, 18, 77)", "rgb(76, 17, 48)"], ["#c1232b", "#27727b", "#fcce10", "#e87c25", "#b5c334", "#fe8463", "#9bca63", "#fad860", "#f3a43b", "#60c0dd", "#d7504b", "#c6e579", "#f4e001", "#f0805a", "#26c0c0", "#c12e34", "#e6b600", "#0098d9", "#2b821d", "#005eaa", "#339ca8", "#cda819", "#32a487", "#3fb1e3", "#6be6c1", "#626c91", "#a0a7e6", "#c4ebad", "#96dee8"]], change: function (e) { $(this); e = null != e ? e.toHexString() : "rgb(0, 0, 0)"; var t = null; yy.find(".luckysheet-sheets-item-color").length > 0 && (t = yy.find(".luckysheet-sheets-item-color").css("background-color")), yy.find(".luckysheet-sheets-item-color").remove(), yy.append('
      '); var a = _l(ga.currentSheetIndex); if (ga.luckysheetfile[a].color = e, pd.saveParam("all", ga.currentSheetIndex, e, { k: "color" }), ga.clearjfundo) { var r = { type: "sheetColor" }; r.sheetIndex = ga.currentSheetIndex, r.oldcolor = t, r.color = e, ga.jfundo.length = 0, ga.jfredo.push(r) } } }), $("#luckysheetsheetconfigcolorreset").click((function () { var e = null; yy.find(".luckysheet-sheets-item-color").length > 0 && (e = yy.find(".luckysheet-sheets-item-color").css("background-color")), yy.find(".luckysheet-sheets-item-color").remove(); var t = _l(ga.currentSheetIndex); if (ga.luckysheetfile[t].color = null, pd.saveParam("all", ga.currentSheetIndex, null, { k: "color" }), ga.clearjfundo) { var a = { type: "sheetColor" }; a.sheetIndex = ga.currentSheetIndex, a.oldcolor = e, a.color = null, ga.jfundo.length = 0, ga.jfredo.push(a) } })) } var a = _l(ga.currentSheetIndex); null != ga.luckysheetfile[a].color && ga.luckysheetfile[a].color.length > 0 && $("#luckysheetsheetconfigcolorur").spectrum("set", ga.luckysheetfile[a].color), $("#luckysheetsheetconfigcolorur").parent().find("span, div, button, input, a").addClass("luckysheet-mousedown-cancel"); var r = fa.sheetRightClickConfig; Object.values(r).every((function (e) { return !e })) || setTimeout((function () { Pm($("#luckysheet-rightclick-sheet-menu"), yy.offset().left + yy.width(), yy.offset().top - 18, "leftbottom") }), 1) } var wy = function (e, t, a) { clearTimeout(by), t.hasClass("luckysheet-sheets-item-name") && "true" == t.attr("contenteditable") || (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton() ? setTimeout((function () { Ih.setCaretPosition(Ih.rangeSetValueTo.get(0), 0, Ih.rangeSetValueTo.text().length), Ih.createRangeHightlight(), $("#luckysheet-input-box-index").find(".luckysheet-input-box-index-sheettxt").remove().end().prepend("" + Sh.getSheetName(Ih.rangetosheet) + "!").show(), $("#luckysheet-input-box-index").css({ left: $("#luckysheet-input-box").css("left"), top: parseInt($("#luckysheet-input-box").css("top")) - 20 + "px", "z-index": $("#luckysheet-input-box").css("z-index") }) }), 1) : (parseInt($("#luckysheet-input-box").css("top")) > 0 && Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight").remove()), $("#luckysheet-sheet-area div.luckysheet-sheets-item").removeClass("luckysheet-sheets-item-active"), e.addClass("luckysheet-sheets-item-active"), yd(a), Sh.changeSheet(e.data("index")), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(), (t.hasClass("luckysheet-sheets-item-menu") || t.hasClass("fa-sort-desc") || "3" == a.which) && (yy = t.closest(".luckysheet-sheets-item"), xy())) }; function _y() { var e = gn().sheetconfig; $("#luckysheet-sheet-area").on("mousedown", "div.luckysheet-sheets-item", (function (e) { if (!wa()) { var t = $(this), a = $(e.target), r = a.closest(".luckysheet-sheets-item"); if ("3" == e.which) return wy(t, a, e), yy = r, void xy(); r.hasClass("luckysheet-sheets-item-active") && "false" == r.find(".luckysheet-sheets-item-name").attr("contenteditable") && (by = setTimeout((function () { ga.luckysheet_sheet_move_status = !0, ga.luckysheet_sheet_move_data = {}, ga.luckysheet_sheet_move_data.widthlist = [], $("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").each((function (e) { 0 == e ? ga.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth())) : ga.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()) + ga.luckysheet_sheet_move_data.widthlist[e - 1]) })), ga.luckysheet_sheet_move_data.curindex = $("#luckysheet-sheet-area div.luckysheet-sheets-item").index(r); var t = e.pageX; ga.luckysheet_sheet_move_data.curleft = t - r.offset().left, ga.luckysheet_sheet_move_data.pageX = t, ga.luckysheet_sheet_move_data.activeobject = r, ga.luckysheet_sheet_move_data.cursorobject = a; var n = r.clone().css("visibility", "hidden").attr("id", "luckysheet-sheets-item-clone"); r.after(n), r.css({ position: "absolute", opacity: .8, cursor: "move", transition: "initial", "z-index": 10 }) }), 200)) } })).on("click", "div.luckysheet-sheets-item", (function (e) { if (!wa()) { var t = $(this), a = $(e.target); wy(t, a, e), pd.keepHighLightBox() } })); var t = function (e) { !1 !== ga.allowEdit && (e.attr("contenteditable", "true").addClass("luckysheet-mousedown-cancel").data("oldtxt", e.text()), setTimeout((function () { !function (e) { if (window.getSelection) { var t = document.createRange(); t.selectNodeContents(e), t.startContainer && Fo(t.startContainer) && (window.getSelection().removeAllRanges(), window.getSelection().addRange(t)) } else if (document.selection) { var a = document.body.createTextRange(); a.moveToElementText(e), a.select() } }(e.get(0)) }), 1)) }; $("#luckysheet-sheet-area").on("dblclick", "span.luckysheet-sheets-item-name", (function (e) { t($(this)) })); var a = !0; $("#luckysheet-sheet-area").on("compositionstart", "span.luckysheet-sheets-item-name", (function () { return a = !1 })), $("#luckysheet-sheet-area").on("compositionend", "span.luckysheet-sheets-item-name", (function () { return a = !0 })), $("#luckysheet-sheet-area").on("input", "span.luckysheet-sheets-item-name", (function () { var e = this; if (!1 !== ga.allowEdit && !1 !== ga.limitSheetNameLength) { var t = ga.defaultSheetNameMaxLength; 0 !== t && setTimeout((function () { a && $(e).text().length >= t && setTimeout((function () { $(e).text($(e).text().substring(0, t)); var a = window.getSelection(); a.selectAllChildren(e), a.collapseToEnd() }), 0) }), 0) } })), $("#luckysheet-sheet-area").on("blur", "span.luckysheet-sheets-item-name", (function (a) { var r = this; if (!1 !== ga.allowEdit) { if (0 === $(this).text().length) return alert(e.sheetNamecannotIsEmptyError), void setTimeout((function () { $(r).text(ky), t($(r)), $(r).focus() }), 1); var n = $(this), l = n.text(), i = n.data("oldtxt"); if (l.length > 31 || "'" == l.charAt(0) || "'" == l.charAt(l.length - 1) || /[:\:\\\/?\?\*\[\]]+/.test(l)) return alert(e.sheetNameSpecCharError), void setTimeout((function () { t($(r)), $(r).focus() }), 1); for (var o = _l(ga.currentSheetIndex), s = 0; s < ga.luckysheetfile.length; s++)if (o != s && ga.luckysheetfile[s].name == l) return wa() ? alert(e.tipNameRepeat) : fd.info("", e.tipNameRepeat), void n.text(i).attr("contenteditable", "false"); if (Sh.sheetArrowShowAndHide(), ga.luckysheetfile[o].name = l, pd.saveParam("all", ga.currentSheetIndex, l, { k: "name" }), n.attr("contenteditable", "false").removeClass("luckysheet-mousedown-cancel"), ga.clearjfundo) { var c = { type: "sheetName" }; c.sheetIndex = ga.currentSheetIndex, c.oldtxt = i, c.txt = l, ga.jfundo.length = 0, ga.jfredo.push(c) } } })), $("#luckysheet-sheet-area").on("keydown", "span.luckysheet-sheets-item-name", (function (e) { if (!1 !== ga.allowEdit) { var t = e.keyCode, a = $(this); if (t == Sn) { var r = _l(ga.currentSheetIndex); ky = ga.luckysheetfile[r].name || ky, ga.luckysheetfile[r].name = a.text(), a.attr("contenteditable", "false") } } })), $("#luckysheetsheetconfigrename").click((function () { t(yy.find("span.luckysheet-sheets-item-name")), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide() })), $("#luckysheetsheetconfigshow").click((function () { $("#luckysheet-sheets-m").click(), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-rightclick-sheet-menu").hide() })), $("#luckysheetsheetconfigmoveleft").click((function () { yy.prevAll(":visible").length > 0 && (yy.insertBefore(yy.prevAll(":visible").eq(0)), Sh.reOrderAllSheet()), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide() })), $("#luckysheetsheetconfigmoveright").click((function () { yy.nextAll(":visible").length > 0 && (yy.insertAfter(yy.nextAll(":visible").eq(0)), Sh.reOrderAllSheet()), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide() })), $("#luckysheetsheetconfigdelete").click((function (t) { if ($("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(), $("#luckysheet-sheet-container-c .luckysheet-sheets-item:visible").length <= 1) wa() ? alert(e.noMoreSheet) : fd.info(e.noMoreSheet, ""); else { var a = _l(ga.currentSheetIndex); fd.confirm(e.confirmDelete + "【" + ga.luckysheetfile[a].name + "】?", "" + e.redoDelete + "", (function () { Sh.deleteSheet(yy.data("index")) }), null), $("#luckysheet-input-box").removeAttr("style") } })), $("#luckysheetsheetconfigcopy").click((function (e) { Sh.copySheet(yy.data("index"), e), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide() })), $("#luckysheetsheetconfighide").click((function () { 1 != $("#luckysheet-sheet-area div.luckysheet-sheets-item:visible").length ? (Sh.setSheetHide(yy.data("index")), $("#luckysheet-input-box").removeAttr("style"), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide()) : wa() ? alert(e.noHide) : fd.info("", e.noHide) })), $("#luckysheet-sheets-add").click((function (e) { parseInt($("#luckysheet-input-box").css("top")) > 0 && Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), Sh.addNewSheet(e), Sh.locationSheet(), $("#luckysheet-input-box").removeAttr("style") })); var r = null, n = 0, l = 0; $("#luckysheet-sheets-leftscroll").click((function () { var e = $("#luckysheet-sheet-container-c"); n = e.scrollLeft(), (l = e.scrollLeft() - 150) <= 0 && $("#luckysheet-sheet-container .docs-sheet-fade-left").hide(), $("#luckysheet-sheet-container .docs-sheet-fade-right").show(), clearInterval(r), r = setInterval((function () { n -= 4, e.scrollLeft(n), n <= l && clearInterval(r) }), 1) })), $("#luckysheet-sheets-rightscroll").click((function () { var e = $("#luckysheet-sheet-container-c"); n = e.scrollLeft(), l = e.scrollLeft() + 150, n > 0 && $("#luckysheet-sheet-container .docs-sheet-fade-right").hide(), $("#luckysheet-sheet-container .docs-sheet-fade-left").show(), clearInterval(r), r = setInterval((function () { n += 4, e.scrollLeft(n), n >= l && clearInterval(r) }), 1) })); var i = !0; $("#luckysheet-sheets-m").click((function (t) { parseInt($("#luckysheet-input-box").css("top")) > 0 && Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), $("#luckysheet-sheet-list").html(""); for (var a = "", r = 0; r < ga.luckysheetfile.length; r++) { var n = ga.luckysheetfile[r], l = "", o = ""; 1 == n.status && (l = ''), 1 == n.hide && (l = '', o += "color:#BBBBBB;"), null != n.color && n.color.length > 0 && (o += "border-right:4px solid " + n.color + ";"), a += _m('
      ${icon}${name}
      ', { index: n.index, name: n.name, icon: l, style: o }) } i ? ($("#" + ga.container).append(_m('
      ${item}
      ', { item: a })), $("#luckysheet-sheet-list").on("click", ".luckysheet-cols-menuitem", (function (t) { if (wa()) alert(e.chartEditNoOpt); else { var a = $(this), r = a.data("index"); a.data("index") != ga.currentSheetIndex && (Sh.setSheetShow(r), Sh.locationSheet()), pd.keepHighLightBox() } })), i = !1) : $("#luckysheet-sheet-list").html(a); var s = $("#luckysheet-sheet-list"), c = $(this).offset().left - $("#" + ga.container).offset().left, u = $(this).height() + $("#luckysheet-sta-content").height() + 12; s.css({ left: c + "px", bottom: u + "px" }).show(), $("#luckysheet-input-box").removeAttr("style") })), fa.pager && mm(fa.pager) } function Cy() { $("#luckysheet-rows-h").mousedown((function (e) { if (vu(ga.currentSheetIndex)) { Pc.removeActivePs(), ($("#luckysheet-modal-dialog-activeImage").is(":visible") || $("#luckysheet-modal-dialog-cropping").is(":visible")) && Rc.cancelActiveImgItem(); var t = Ss($s(e.pageX, e.pageY)[1] + $("#luckysheet-rows-h").scrollTop()), a = t[1], r = t[0], n = t[2], l = ga.visibledatacolumn.length - 1, i = ga.visibledatacolumn[l]; if ($("#luckysheet-rightclick-menu").hide(), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(), "3" == e.which) { for (var o = !1, s = 0; s < ga.luckysheet_select_save.length; s++) { var c = ga.luckysheet_select_save[s]; if (null != c.row && n >= c.row[0] && n <= c.row[1] && 0 == c.column[0] && c.column[1] == ga.flowdata[0].length - 1) { o = !0; break } } if (o) return } var u = r, d = a - r - 1, h = [n, n]; ga.luckysheet_scroll_status = !0; var m = $("#luckysheet-input-box"); if (parseInt(m.css("top")) > 0) { if (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton() || $("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { var p = xm.mergeMoveMain([0, l], h, { row_focus: n, column_focus: 0 }, u, d, 0, i); if (null != p && (h = p[1], u = p[2], d = p[3]), e.shiftKey) { var f = Ih.func_selectedrange, g = 0, v = 0, y = []; f.top > r ? (g = r, v = f.top + f.height - r, f.row[1] > f.row_focus && (f.row[1] = f.row_focus), y = [n, f.row[1]]) : f.top == r ? (g = r, v = f.top + f.height - r, y = [n, f.row[0]]) : (g = f.top, v = a - f.top - 1, f.row[0] < f.row_focus && (f.row[0] = f.row_focus), y = [f.row[0], n]); var b = xm.mergeMoveMain([0, l], y, { row_focus: n, column_focus: 0 }, g, v, 0, i); null != b && (y = b[1], g = b[2], v = b[3]), f.row = y, f.top_move = g, f.height_move = v, Ih.func_selectedrange = f } else if (e.ctrlKey && "," != $("#luckysheet-rich-text-editor").find("span").last().text()) { var k = $("#luckysheet-rich-text-editor").text() + ","; if (k.length > 0 && "=" == k.substr(0, 1)) { if (k = Ih.functionHTMLGenerate(k), window.getSelection) { var x = window.getSelection(); Ih.functionRangeIndex = [$(x.anchorNode).parent().index(), x.anchorOffset] } else { var w = document.selection.createRange(); Ih.functionRangeIndex = w } $("#luckysheet-rich-text-editor").html(k), Ih.canceFunctionrangeSelected(), Ih.createRangeHightlight() } Ih.rangestart = !1, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, $("#luckysheet-functionbox-cell").html(k), Ih.rangeHightlightselected($("#luckysheet-rich-text-editor")), Ih.israngeseleciton(), Ih.func_selectedrange = { left: Is(0)[0], width: Is(0)[1] - Is(0)[0] - 1, top: u, height: d, left_move: 0, width_move: i - 0 - 1, top_move: u, height_move: d, row: h, column: [0, l], row_focus: n, column_focus: 0 } } else Ih.func_selectedrange = { left: Is(0)[0], width: Is(0)[1] - Is(0)[0] - 1, top: u, height: d, left_move: 0, width_move: i - 0 - 1, top_move: u, height_move: d, row: h, column: [0, l], row_focus: n, column_focus: 0 }; if (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton()) Ih.rangeSetValue({ row: h, column: [null, null] }); else if ($("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { var _ = Cl(ga.currentSheetIndex, { row: h, column: [0, l] }, ga.currentSheetIndex); $("#luckysheet-ifFormulaGenerator-multiRange-dialog input").val(_) } return Ih.rangedrag_row_start = !0, Ih.rangestart = !1, Ih.rangedrag_column_start = !1, $("#luckysheet-formula-functionrange-select").css({ left: 0, width: i - 0 - 1, top: u, height: d }).show(), $("#luckysheet-formula-help-c").hide(), Mh(0, u, i - 0 - 1, d, h, [0, l]), void setTimeout((function () { var e, t = window.getSelection().anchorNode; $("#luckysheet-search-formula-parm").is(":visible") || $("#luckysheet-search-formula-parm-select").is(":visible") ? (e = $("#luckysheet-rich-text-editor"), Ih.rangechangeindex = Ih.data_parm_index) : e = $(t).closest("div"); var a = e.find("span[rangeindex='" + Ih.rangechangeindex + "']"); Ih.setCaretPosition(a.get(0), 0, a.html().length) }), 1) } Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_rows_selected_status = !0 } else ga.luckysheet_rows_selected_status = !0; if (ga.luckysheet_rows_selected_status) { if (e.shiftKey) { var C = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), T = 0, A = 0, S = []; C.top > r ? (T = r, A = C.top + C.height - r, C.row[1] > C.row_focus && (C.row[1] = C.row_focus), S = [n, C.row[1]]) : C.top == r ? (T = r, A = C.top + C.height - r, S = [n, C.row[0]]) : (T = C.top, A = a - C.top - 1, C.row[0] < C.row_focus && (C.row[0] = C.row_focus), S = [C.row[0], n]), C.row = S, C.top_move = T, C.height_move = A, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = C } else e.ctrlKey || (ga.luckysheet_select_save.length = 0), ga.luckysheet_select_save.push({ left: Is(0)[0], width: Is(0)[1] - Is(0)[0] - 1, top: u, height: d, left_move: 0, width_move: i - 0 - 1, top_move: u, height_move: d, row: h, column: [0, l], row_focus: n, column_focus: 0, row_select: !0 }); Rh(), pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save) } Nh(), setTimeout((function () { clearTimeout(ga.countfuncTimeout), dc() }), 101) } })).mousemove((function (e) { if (ga.luckysheet_rows_selected_status || ga.luckysheet_rows_change_size || ga.luckysheet_select_status) $("#luckysheet-rows-h-hover").hide(); else { var t = $s(e.pageX, e.pageY)[1] + $("#luckysheet-rows-h").scrollTop(), a = Ss(t), r = a[1], n = a[0]; $("#luckysheet-rows-h-hover").css({ top: n, height: r - n - 1, display: "block" }), t < r - 1 && t >= r - 5 ? $("#luckysheet-rows-change-size").css({ top: r - 3, opacity: 0 }) : $("#luckysheet-rows-change-size").css("opacity", 0) } })).mouseleave((function (e) { $("#luckysheet-rows-h-hover").hide(), $("#luckysheet-rows-change-size").css("opacity", 0) })).mouseup((function (e) { if (3 == e.which) { if (wa()) return; $("#luckysheet-cols-rows-shift").hide(), ga.luckysheetRightHeadClickIs = "row", $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word").text(gn().rightclick.row), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size").text(gn().rightclick.height), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left").text(gn().rightclick.top), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right").text(gn().rightclick.bottom), $("#luckysheet-cols-rows-add").show(), $("#luckysheet-cols-rows-data").show(), $("#luckysheet-cols-rows-shift").hide(), $("#luckysheet-cols-rows-handleincell").hide(), zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "block"; var t = fa.cellRightClickConfig; if (!(t.copy || t.copyAs || t.paste || t.insertRow || t.deleteRow || t.hideRow || t.rowHeight || t.clear || t.matrix || t.sort || t.filter || t.chart || t.image || t.link || t.data || t.cellFormat)) return; zm("#luckysheet-top-left-add-selected").style.display = t.insertRow ? "block" : "none", zm("#luckysheet-bottom-right-add-selected").style.display = t.insertRow ? "block" : "none", zm("#luckysheet-del-selected").style.display = t.deleteRow ? "block" : "none", zm("#luckysheet-hide-selected").style.display = t.hideRow ? "block" : "none", zm("#luckysheet-show-selected").style.display = t.hideRow ? "block" : "none", zm("#luckysheet-column-row-width-selected").style.display = t.rowHeight ? "block" : "none", t.copy || t.copyAs || t.paste || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none", t.insertRow || t.deleteRow || t.hideRow || t.rowHeight || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none")), t.insertRow || t.deleteRow || t.hideRow || t.rowHeight || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none"), t.clear || t.matrix || t.sort || t.filter || t.chart || t.image || t.link || t.data || t.cellFormat || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none"), Dm($("#luckysheet-rightclick-menu"), $(this).offset().left + 46, e.pageY), ga.luckysheet_cols_menu_status = !0; var a = $.extend(!0, {}, ga.config); null == a.rowlen && (a.rowlen = {}); for (var r = null == a.rowlen[ga.luckysheet_select_save[0].row[0]] ? ga.defaultrowlen : a.rowlen[ga.luckysheet_select_save[0].row[0]], n = !0, l = 0; l < ga.luckysheet_select_save.length; l++)for (var i = ga.luckysheet_select_save[l], o = i.row[0], s = i.row[1], c = o; c <= s; c++) { if ((null == a.rowlen[c] ? ga.defaultrowlen : a.rowlen[c]) != r) { n = !1; break } } n ? $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val(r) : $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val("") } })), $("#luckysheet-cols-h-c").mousedown((function (e) { if (vu(ga.currentSheetIndex)) { Pc.removeActivePs(), ($("#luckysheet-modal-dialog-activeImage").is(":visible") || $("#luckysheet-modal-dialog-cropping").is(":visible")) && Rc.cancelActiveImgItem(); var t = $s(e.pageX, e.pageY)[0] + $(this).scrollLeft(), a = ga.visibledatarow.length - 1, r = ga.visibledatarow[a], n = Rs(t), l = n[1], i = n[0], o = n[2]; if (ga.orderbyindex = o, $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu").hide(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), "3" == e.which) { for (var s = !1, c = 0; c < ga.luckysheet_select_save.length; c++) { var u = ga.luckysheet_select_save[c]; if (null != u.column && o >= u.column[0] && o <= u.column[1] && 0 == u.row[0] && u.row[1] == ga.flowdata.length - 1) { s = !0; break } } if (s) return } var d = i, h = l - i - 1, m = [o, o]; ga.luckysheet_scroll_status = !0; var p = $("#luckysheet-input-box"); if (parseInt(p.css("top")) > 0) { if (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton() || $("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { var f = xm.mergeMoveMain(m, [0, a], { row_focus: 0, column_focus: o }, 0, r, d, h); if (null != f && (m = f[0], d = f[4], h = f[5]), e.shiftKey) { var g = Ih.func_selectedrange, v = 0, y = 0, b = []; g.left > i ? (v = i, y = g.left + g.width - i, g.column[1] > g.column_focus && (g.column[1] = g.column_focus), b = [o, g.column[1]]) : g.left == i ? (v = i, y = g.left + g.width - i, b = [o, g.column[0]]) : (v = g.left, y = l - g.left - 1, g.column[0] < g.column_focus && (g.column[0] = g.column_focus), b = [g.column[0], o]); var k = xm.mergeMoveMain(b, [0, a], { row_focus: 0, column_focus: o }, 0, r, v, y); null != k && (b = k[0], v = k[4], y = k[5]), g.column = b, g.left_move = v, g.width_move = y, Ih.func_selectedrange = g } else if (e.ctrlKey && "," != $("#luckysheet-rich-text-editor").find("span").last().text()) { var x = $("#luckysheet-rich-text-editor").text() + ","; if (x.length > 0 && "=" == x.substr(0, 1)) { if (x = Ih.functionHTMLGenerate(x), window.getSelection) { var w = window.getSelection(); Ih.functionRangeIndex = [$(w.anchorNode).parent().index(), w.anchorOffset] } else { var _ = document.selection.createRange(); Ih.functionRangeIndex = _ } $("#luckysheet-rich-text-editor").html(x), Ih.canceFunctionrangeSelected(), Ih.createRangeHightlight() } Ih.rangestart = !1, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, $("#luckysheet-functionbox-cell").html(x), Ih.rangeHightlightselected($("#luckysheet-rich-text-editor")), Ih.israngeseleciton(), Ih.func_selectedrange = { left: d, width: h, top: As(0)[0], height: As(0)[1] - As(0)[0] - 1, left_move: d, width_move: h, top_move: 0, height_move: r - 0 - 1, row: [0, a], column: m, row_focus: 0, column_focus: o } } else Ih.func_selectedrange = { left: d, width: h, top: As(0)[0], height: As(0)[1] - As(0)[0] - 1, left_move: d, width_move: h, top_move: 0, height_move: r - 0 - 1, row: [0, a], column: m, row_focus: 0, column_focus: o }; if (Ih.rangestart || Ih.rangedrag_column_start || Ih.rangedrag_row_start || Ih.israngeseleciton()) Ih.rangeSetValue({ row: [null, null], column: m }); else if ($("#luckysheet-ifFormulaGenerator-multiRange-dialog").is(":visible")) { var C = Cl(ga.currentSheetIndex, { row: [0, a], column: m }, ga.currentSheetIndex); $("#luckysheet-ifFormulaGenerator-multiRange-dialog input").val(C) } return Ih.rangedrag_column_start = !0, Ih.rangestart = !1, Ih.rangedrag_row_start = !1, $("#luckysheet-formula-functionrange-select").css({ left: d, width: h, top: 0, height: r - 0 - 1 }).show(), $("#luckysheet-formula-help-c").hide(), void Mh(d, 0, h, r - 0 - 1, [0, a], m) } Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_cols_selected_status = !0 } else ga.luckysheet_cols_selected_status = !0; if (ga.luckysheet_cols_selected_status) { if (e.shiftKey) { var T = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), A = 0, S = 0, I = []; T.left > i ? (A = i, S = T.left + T.width - i, T.column[1] > T.column_focus && (T.column[1] = T.column_focus), I = [o, T.column[1]]) : T.left == i ? (A = i, S = T.left + T.width - i, I = [o, T.column[0]]) : (A = T.left, S = l - T.left - 1, T.column[0] < T.column_focus && (T.column[0] = T.column_focus), I = [T.column[0], o]), T.column = I, T.left_move = A, T.width_move = S, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1] = T } else e.ctrlKey || (ga.luckysheet_select_save.length = 0), ga.luckysheet_select_save.push({ left: d, width: h, top: As(0)[0], height: As(0)[1] - As(0)[0] - 1, left_move: d, width_move: h, top_move: 0, height_move: r - 0 - 1, row: [0, a], column: m, row_focus: 0, column_focus: o, column_select: !0 }); Rh(), pd.saveParam("mv", ga.currentSheetIndex, ga.luckysheet_select_save) } Nh(), setTimeout((function () { clearTimeout(ga.countfuncTimeout), dc() }), 101), ga.luckysheet_cols_menu_status && ($("#luckysheet-rightclick-menu").hide(), $("#luckysheet-cols-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), ga.luckysheet_cols_menu_status = !1), e.stopPropagation() } })).mousemove((function (e) { if (ga.luckysheet_cols_selected_status || ga.luckysheet_select_status) return $("#luckysheet-cols-h-hover").hide(), void $("#luckysheet-cols-menu-btn").hide(); if (!ga.luckysheet_cols_menu_status && !ga.luckysheet_cols_change_size) { var t = $s(e.pageX, e.pageY)[0] + $("#luckysheet-cols-h-c").scrollLeft(), a = Rs(t), r = a[1], n = a[0]; $("#luckysheet-cols-h-hover").css({ left: n, width: r - n - 1, display: "block" }), $("#luckysheet-cols-menu-btn").css({ left: r - 19, display: "block" }), $("#luckysheet-cols-change-size").css({ left: r - 5 }), t < r && t >= r - 5 ? ($("#luckysheet-cols-change-size").css({ opacity: 0 }), $("#luckysheet-cols-menu-btn").hide()) : ($("#luckysheet-change-size-line").hide(), $("#luckysheet-cols-change-size").css("opacity", 0)) } })).mouseleave((function (e) { ga.luckysheet_cols_menu_status || ga.luckysheet_cols_change_size || ($("#luckysheet-cols-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), $("#luckysheet-cols-change-size").css("opacity", 0)) })).mouseup((function (e) { if (3 == e.which) { if (wa()) return; ga.luckysheetRightHeadClickIs = "column", $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word").text(gn().rightclick.column), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size").text(gn().rightclick.width), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left").text(gn().rightclick.left), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right").text(gn().rightclick.right), $("#luckysheet-cols-rows-add").show(), $("#luckysheet-cols-rows-data").show(), $("#luckysheet-cols-rows-shift").hide(), $("#luckysheet-cols-rows-handleincell").hide(), zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "block"; var t = fa.cellRightClickConfig; if (!(t.copy || t.copyAs || t.paste || t.insertColumn || t.deleteColumn || t.hideColumn || t.columnWidth || t.clear || t.matrix || t.sort || t.filter || t.chart || t.image || t.link || t.data || t.cellFormat)) return; zm("#luckysheet-top-left-add-selected").style.display = t.insertColumn ? "block" : "none", zm("#luckysheet-bottom-right-add-selected").style.display = t.insertColumn ? "block" : "none", zm("#luckysheet-del-selected").style.display = t.deleteColumn ? "block" : "none", zm("#luckysheet-hide-selected").style.display = t.hideColumn ? "block" : "none", zm("#luckysheet-show-selected").style.display = t.hideColumn ? "block" : "none", zm("#luckysheet-column-row-width-selected").style.display = t.columnWidth ? "block" : "none", t.copy || t.copyAs || t.paste || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none", t.insertColumn || t.deleteColumn || t.hideColumn || t.columnWidth || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none")), t.insertColumn || t.deleteColumn || t.hideColumn || t.columnWidth || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none"), t.clear || t.matrix || t.sort || t.filter || t.chart || t.image || t.link || t.data || t.cellFormat || (zm("#luckysheet-cols-rows-data .luckysheet-menuseparator").style.display = "none"), Dm($("#luckysheet-rightclick-menu"), e.pageX, $(this).offset().top + 18), ga.luckysheet_cols_menu_status = !0; var a = $.extend(!0, {}, ga.config); null == a.columnlen && (a.columnlen = {}); for (var r = null == a.columnlen[ga.luckysheet_select_save[0].column[0]] ? ga.defaultcollen : a.columnlen[ga.luckysheet_select_save[0].column[0]], n = !0, l = 0; l < ga.luckysheet_select_save.length; l++)for (var i = ga.luckysheet_select_save[l], o = i.column[0], s = i.column[1], c = o; c <= s; c++) { if ((null == a.columnlen[c] ? ga.defaultcollen : a.columnlen[c]) != r) { n = !1; break } } n ? $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val(r) : $("#luckysheet-cols-rows-add").find("input[type='number'].rcsize").val("") } })), $("#luckysheet-rows-change-size").mousedown((function (e) { Pc.removeActivePs(), ($("#luckysheet-modal-dialog-activeImage").is(":visible") || $("#luckysheet-modal-dialog-cropping").is(":visible")) && Rc.cancelActiveImgItem(), $("#luckysheet-input-box").hide(), $("#luckysheet-rows-change-size").css({ opacity: 1 }); var t = $s(e.pageX, e.pageY)[1] + $("#luckysheet-rows-h").scrollTop(), a = $("#luckysheet-cell-main").scrollLeft(), r = $("#luckysheet-cell-main").width(), n = Ss(t), l = n[1], i = n[0], o = n[2]; ga.luckysheet_rows_change_size = !0, ga.luckysheet_scroll_status = !0, $("#luckysheet-change-size-line").css({ height: "1px", "border-width": "0 0px 1px 0", top: l - 3, left: 0, width: a + r, display: "block", cursor: "ns-resize" }), $("#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas").css("cursor", "ns-resize"), ga.luckysheet_rows_change_size_start = [i, o], $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-rows-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), e.stopPropagation() })), $("#luckysheet-cols-change-size").mousedown((function (e) { Pc.removeActivePs(), ($("#luckysheet-modal-dialog-activeImage").is(":visible") || $("#luckysheet-modal-dialog-cropping").is(":visible")) && Rc.cancelActiveImgItem(), $("#luckysheet-input-box").hide(), $("#luckysheet-cols-change-size").css({ opacity: 1 }); var t = $s(e.pageX, e.pageY), a = $("#luckysheet-cols-h-c").scrollLeft(), r = $("#luckysheet-cell-main").scrollTop(), n = $("#luckysheet-cell-main").height(), l = t[0] + a, i = ga.visibledatarow.length - 1, o = (ga.visibledatarow[i], Rs(l)), s = o[1], c = o[0], u = o[2]; ga.luckysheet_cols_change_size = !0, ga.luckysheet_scroll_status = !0, $("#luckysheet-change-size-line").css({ height: n + r, "border-width": "0 1px 0 0", top: 0, left: s - 3, width: "1px", display: "block", cursor: "ew-resize" }), $("#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas").css("cursor", "ew-resize"), ga.luckysheet_cols_change_size_start = [c, u], $("#luckysheet-rightclick-menu").hide(), $("#luckysheet-cols-h-hover").hide(), $("#luckysheet-cols-menu-btn").hide(), ga.luckysheet_cols_dbclick_times = 0, e.stopPropagation() })).dblclick((function () { !function () { ga.luckysheet_cols_change_size = !1, $("#luckysheet-change-size-line").hide(), $("#luckysheet-cols-change-size").css("opacity", 0), $("#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas").css("cursor", "default"); var e = $s(event.pageX, event.pageY), t = $("#luckysheet-cols-h-c").scrollLeft(), a = Rs(e[0] + t)[2], r = rs.deepCopyFlowData(ga.flowdata), n = $("#luckysheetTableContent").get(0).getContext("2d"), l = $.extend(!0, {}, ga.config); null == l.columnlen && (l.columnlen = {}); var i = {}, o = $("#luckysheet-cell-main").scrollTop(), s = ga.luckysheetTableContentHW[1], c = Ts(ga.visibledatarow, o), u = Ts(ga.visibledatarow, o + s); (u += u - c) >= r.length && (u = r.length - 1); for (var d = 0; d < ga.luckysheet_select_save.length; d++) { var h = ga.luckysheet_select_save[d].column[0], m = ga.luckysheet_select_save[d].column[1]; if (a < h || a > m) { if (a in i) continue; for (var p = ga.defaultcollen, f = c; f <= u; f++) { var g = r[f][a]; if (null != g && (!ya(g.v) || No(g))) { var v = Is(a)[1] - Is(a)[0] - 2, y = Es(g, n, { r: f, c: a, cellWidth: v }), b = 0; null != y && (b = y.textWidthAll), b + 6 > p && (p = b + 6) } } p != ga.defaultcollen && (l.columnlen[a] = p, l.customWidth && delete l.customWidth[a]), i[a] = 1 } else for (var k = h; k <= m; k++)if (!(k in i)) { for (var x = ga.defaultcollen, w = c; w <= u; w++) { var _ = r[w][k]; if (null != _ && (!ya(_.v) || No(_))) { var C = Is(k)[1] - Is(k)[0] - 2, T = Es(_, n, { r: w, c: k, cellWidth: C }), A = 0; null != T && (A = T.textWidthAll), A + 6 > x && (x = A + 6) } } x != ga.defaultcollen && (l.columnlen[k] = x, l.customWidth && delete l.customWidth[k]), i[k] = 1 } } od(ga.flowdata[0].length, ga.flowdata.length, ga.flowdata, l, ga.luckysheet_select_save, "resizeC", "columnlen") }() })), $("#luckysheet-cols-menu-btn").click((function (e) { var t = $("#luckysheet-rightclick-menu"), a = $(this).offset(); $("#luckysheet-cols-rows-shift").show(), ga.luckysheetRightHeadClickIs = "column", $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word").text(gn().rightclick.column), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left").text(gn().rightclick.left), $("#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right").text(gn().rightclick.right), $("#luckysheet-cols-rows-add").show(), $("#luckysheet-cols-rows-data").hide(), $("#luckysheet-cols-rows-shift").show(), $("#luckysheet-cols-rows-handleincell").hide(), zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "block", zm("#luckysheet-cols-rows-shift .luckysheet-menuseparator").style.display = "block"; var r = fa.cellRightClickConfig; (r.copy || r.copyAs || r.paste || r.insertColumn || r.deleteColumn || r.hideColumn || r.columnWidth || r.sort) && (zm("#luckysheet-top-left-add-selected").style.display = r.insertColumn ? "block" : "none", zm("#luckysheet-bottom-right-add-selected").style.display = r.insertColumn ? "block" : "none", zm("#luckysheet-del-selected").style.display = r.deleteColumn ? "block" : "none", zm("#luckysheet-hide-selected").style.display = r.hideColumn ? "block" : "none", zm("#luckysheet-show-selected").style.display = r.hideColumn ? "block" : "none", zm("#luckysheet-column-row-width-selected").style.display = r.columnWidth ? "block" : "none", r.copy || r.copyAs || r.paste || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none", r.insertColumn || r.deleteColumn || r.hideColumn || r.columnWidth || (zm("#luckysheet-cols-rows-shift .luckysheet-menuseparator").style.display = "none")), r.insertColumn || r.deleteColumn || r.hideColumn || r.columnWidth || (zm("#luckysheet-cols-rows-add .luckysheet-menuseparator").style.display = "none"), r.sort || (zm("#luckysheet-cols-rows-shift .luckysheet-menuseparator").style.display = "none"), Dm(t, a.left, a.top + 18), ga.luckysheet_cols_menu_status = !0) })), $("#luckysheet-top-left-add-selected").click((function (e) { if ("INPUT" !== e.target.nodeName) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn(), a = t.drag, r = t.info; if (ga.luckysheet_select_save.length > 1) wa() ? alert(a.noMulti) : fd.info(a.noMulti, ""); else { var n = $(this).find("input").val(); if (ba(n)) if ((n = parseInt(n)) < 1 || n > 100) wa() ? alert(r.tipInputNumberLimit) : fd.info(r.tipInputNumberLimit, ""); else { var l = ga.luckysheet_select_save[0][ga.luckysheetRightHeadClickIs][0]; qc(ga.luckysheetRightHeadClickIs, l, n, "lefttop") } else wa() ? alert(r.tipInputNumber) : fd.info(r.tipInputNumber, "") } } })), $("#luckysheetColsRowsHandleAdd_row").click((function (e) { ($("#luckysheet-rightclick-menu").hide(), Em(), !1 !== ga.allowEdit) && qc("row", ga.luckysheet_select_save[0].row[0], 1, "lefttop") })), $("#luckysheetColsRowsHandleAdd_column").click((function (e) { ($("#luckysheet-rightclick-menu").hide(), Em(), !1 !== ga.allowEdit) && qc("column", ga.luckysheet_select_save[0].column[0], 1, "lefttop") })), $("#luckysheet-bottom-right-add-selected").click((function (e) { if ("INPUT" !== e.target.nodeName) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn(), a = t.drag, r = t.info; if (ga.luckysheet_select_save.length > 1) wa() ? alert(a.noMulti) : fd.info(a.noMulti, ""); else { var n = $(this).find("input").val(); if (ba(n)) if ((n = parseInt(n)) < 1 || n > 100) wa() ? alert(r.tipInputNumberLimit) : fd.info(r.tipInputNumberLimit, ""); else { var l = ga.luckysheet_select_save[0][ga.luckysheetRightHeadClickIs][1]; qc(ga.luckysheetRightHeadClickIs, l, n, "rightbottom") } else wa() ? alert(r.tipInputNumber) : fd.info(r.tipInputNumber, "") } } })), $("#luckysheet-del-selected, #luckysheet-del-selected_t").click((function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn().drag; if (ga.luckysheet_select_save.length > 1) ("row" == ga.luckysheetRightHeadClickIs || "column" == ga.luckysheetRightHeadClickIs) && (wa() ? alert(t.noMulti) : fd.info(t.noMulti, "")); else { var a = ga.luckysheet_select_save[0][ga.luckysheetRightHeadClickIs][0], r = ga.luckysheet_select_save[0][ga.luckysheetRightHeadClickIs][1]; Dc(ga.luckysheetRightHeadClickIs, a, r) } })), $("#luckysheet-delRows").click((function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn().drag; ga.luckysheet_select_save.length > 1 ? ("row" == ga.luckysheetRightHeadClickIs || "column" == ga.luckysheetRightHeadClickIs) && (wa() ? alert(t.noMulti) : fd.info(t.noMulti, "")) : Dc("row", ga.luckysheet_select_save[0].row[0], ga.luckysheet_select_save[0].row[1]) })), $("#luckysheet-delCols").click((function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn().drag; ga.luckysheet_select_save.length > 1 ? ("row" == ga.luckysheetRightHeadClickIs || "column" == ga.luckysheetRightHeadClickIs) && (wa() ? alert(t.noMulti) : fd.info(t.noMulti, "")) : Dc("column", ga.luckysheet_select_save[0].column[0], ga.luckysheet_select_save[0].column[1]) })), $("#luckysheet-hide-selected").click((function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn().drag; if (ga.luckysheet_select_save.length > 1) ("row" == ga.luckysheetRightHeadClickIs || "column" == ga.luckysheetRightHeadClickIs) && (wa() ? alert(t.noMulti) : fd.info(t.noMulti, "")); else if ("row" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatRows")) return; var a = $.extend(!0, {}, ga.config); null == a.rowhidden && (a.rowhidden = {}); for (var r = 0; r < ga.luckysheet_select_save.length; r++)for (var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = n; i <= l; i++)a.rowhidden[i] = 0; if (ga.clearjfundo) { var o = { type: "showHidRows" }; o.sheetIndex = ga.currentSheetIndex, o.config = $.extend(!0, {}, ga.config), o.curconfig = a, ga.jfundo.length = 0, ga.jfredo.push(o) } ga.config = a, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, a.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length) } else if ("column" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatColumns")) return; var s = $.extend(!0, {}, ga.config); null == s.colhidden && (s.colhidden = {}); for (var c = 0; c < ga.luckysheet_select_save.length; c++)for (var u = ga.luckysheet_select_save[c].column[0], d = ga.luckysheet_select_save[c].column[1], h = u; h <= d; h++)s.colhidden[h] = 0; if (ga.clearjfundo) { var m = { type: "showHidCols" }; m.sheetIndex = ga.currentSheetIndex, m.config = $.extend(!0, {}, ga.config), m.curconfig = s, ga.jfundo.length = 0, ga.jfredo.push(m) } ga.config = s, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, s.colhidden, { k: "colhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length) } })), $("#luckysheet-show-selected").click((function (e) { $("#luckysheet-rightclick-menu").hide(), Em(); var t = gn().drag; if (ga.luckysheet_select_save.length > 1) ("row" == ga.luckysheetRightHeadClickIs || "column" == ga.luckysheetRightHeadClickIs) && (wa() ? alert(t.noMulti) : fd.info(t.noMulti, "")); else if ("row" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatRows")) return; var a = $.extend(!0, {}, ga.config); if (null == a.rowhidden) return; for (var r = 0; r < ga.luckysheet_select_save.length; r++)for (var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = n; i <= l; i++)delete a.rowhidden[i]; if (ga.clearjfundo) { var o = { type: "showHidRows" }; o.sheetIndex = ga.currentSheetIndex, o.config = $.extend(!0, {}, ga.config), o.curconfig = a, ga.jfundo.length = 0, ga.jfredo.push(o) } ga.config = a, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, a.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length) } else if ("column" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatColumns")) return; var s = $.extend(!0, {}, ga.config); if (null == s.colhidden) return; for (var c = 0; c < ga.luckysheet_select_save.length; c++)for (var u = ga.luckysheet_select_save[c].column[0], d = ga.luckysheet_select_save[c].column[1], h = u; h <= d; h++)delete s.colhidden[h]; if (ga.clearjfundo) { var m = { type: "showHidCols" }; m.sheetIndex = ga.currentSheetIndex, m.config = $.extend(!0, {}, ga.config), m.curconfig = s, ga.jfundo.length = 0, ga.jfredo.push(m) } ga.config = s, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, s.colhidden, { k: "colhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length) } })), $("#luckysheet-delCellsMoveLeft").click((function (e) { $("body .luckysheet-cols-menu").hide(), Em(); var t = gn().drag; ga.luckysheet_select_save.length > 1 ? wa() ? alert(t.noMulti) : fd.info(t.noMulti, "") : Fc("moveLeft", ga.luckysheet_select_save[0].row[0], ga.luckysheet_select_save[0].row[1], ga.luckysheet_select_save[0].column[0], ga.luckysheet_select_save[0].column[1]) })), $("#luckysheet-delCellsMoveUp").click((function (e) { $("body .luckysheet-cols-menu").hide(), Em(); var t = gn().drag; ga.luckysheet_select_save.length > 1 ? wa() ? alert(t.noMulti) : fd.info(t.noMulti, "") : Fc("moveUp", ga.luckysheet_select_save[0].row[0], ga.luckysheet_select_save[0].row[1], ga.luckysheet_select_save[0].column[0], ga.luckysheet_select_save[0].column[1]) })), $("#luckysheet-delete-text").click((function () { if (fu(ga.luckysheet_select_save, ga.currentSheetIndex) && ($("#luckysheet-rightclick-menu").hide(), Em(), !1 !== ga.allowEdit && ga.luckysheet_select_save.length > 0)) { for (var e = rs.deepCopyFlowData(ga.flowdata), t = !1, a = 0; a < ga.luckysheet_select_save.length; a++) { var r = ga.luckysheet_select_save[a].row[0], n = ga.luckysheet_select_save[a].row[1], l = ga.luckysheet_select_save[a].column[0], i = ga.luckysheet_select_save[a].column[1]; if (_a(ga.config, r, n, l, i)) { t = !0; break } } if (t) { var o = gn().drag; return void (wa() ? alert(o.noPartMerge) : fd.info(o.noPartMerge, "")) } for (var s = 0; s < ga.luckysheet_select_save.length; s++)for (var c = ga.luckysheet_select_save[s].row[0], u = ga.luckysheet_select_save[s].row[1], d = ga.luckysheet_select_save[s].column[0], h = ga.luckysheet_select_save[s].column[1], m = c; m <= u; m++)for (var p = d; p <= h; p++)Ru.isPivotRange(m, p) || ("object" == Cm(e[m][p]) ? (delete e[m][p].m, delete e[m][p].v, null != e[m][p].f && (delete e[m][p].f, Ih.delFunctionGroup(m, p, ga.currentSheetIndex), delete e[m][p].spl), null != e[m][p].ct && "inlineStr" == e[m][p].ct.t && delete e[m][p].ct) : e[m][p] = null); id(e, ga.luckysheet_select_save) } })), $("#luckysheet-column-row-width-selected").click((function (e) { if ("INPUT" !== e.target.nodeName) { $("#luckysheet-rightclick-menu").hide(), Em(); var t, a = parseInt($(this).closest(".luckysheet-cols-menuitem").find("input[type='number']").val().trim()), r = gn().info, n = $.extend(!0, {}, ga.config), l = null; if ("row" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatRows")) return; if (a < 0 || a > 545) return void (wa() ? alert(r.tipRowHeightLimit) : fd.info(r.tipRowHeightLimit, "")); t = "resizeR", null == n.rowlen && (n.rowlen = {}); for (var i = 0; i < ga.luckysheet_select_save.length; i++)for (var o = ga.luckysheet_select_save[i].row[0], s = ga.luckysheet_select_save[i].row[1], c = o; c <= s; c++)n.rowlen[c] = a, l = Rc.moveChangeSize("row", c, a) } else if ("column" == ga.luckysheetRightHeadClickIs) { if (!bu(ga.currentSheetIndex, "formatColumns")) return; if (a < 0 || a > 2038) return void (wa() ? alert(r.tipColumnWidthLimit) : fd.info(r.tipColumnWidthLimit, "")); t = "resizeC", null == n.columnlen && (n.columnlen = {}); for (var u = 0; u < ga.luckysheet_select_save.length; u++)for (var d = ga.luckysheet_select_save[u].column[0], h = ga.luckysheet_select_save[u].column[1], m = d; m <= h; m++)n.columnlen[m] = a, l = Rc.moveChangeSize("column", m, a) } ga.clearjfundo && (ga.jfundo.length = 0, ga.jfredo.push({ type: "resize", ctrlType: t, sheetIndex: ga.currentSheetIndex, config: $.extend(!0, {}, ga.config), curconfig: $.extend(!0, {}, n), images: $.extend(!0, {}, Rc.images), curImages: $.extend(!0, {}, l) })), ga.config = n, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, ga.luckysheetfile[_l(ga.currentSheetIndex)].images = l, pd.saveParam("all", ga.currentSheetIndex, l, { k: "images" }), Rc.images = l, Rc.allImagesShow(), "row" == ga.luckysheetRightHeadClickIs ? (pd.saveParam("cg", ga.currentSheetIndex, n.rowlen, { k: "rowlen" }), hd(ga.flowdata.length, null)) : "column" == ga.luckysheetRightHeadClickIs && (pd.saveParam("cg", ga.currentSheetIndex, n.columnlen, { k: "columnlen" }), hd(null, ga.flowdata[0].length)) } })) } function Ty(e, t, a, r) { var n; if (!$("#luckysheet-formula-search-c").is(":visible") || "up" != e && "down" != e) { if ($("#luckysheet-formula-functionrange-select").is(":visible")) { if (t && a) gc(e, "rangeOfFormula"); else if (t) pc(e, "rangeOfFormula"); else if (a) { var l = e, i = 1; "up" == e && (l = "down", i = -1), "left" == e && (l = "right", i = -1), fc(l, i, "rangeOfFormula") } else { var o = e, s = 1; "up" == e && (o = "down", s = -1), "left" == e && (o = "right", s = -1), mc(o, s, "rangeOfFormula") } r.preventDefault() } else if (Ih.israngeseleciton()) { var c = $(window.getSelection().anchorNode); if (null == c.parent().next().text() || "" == c.parent().next().text()) { var u = $("#luckysheet-input-box #luckysheet-input-box-index").text(), d = Ih.getcellrange(u); null == d && (d = Ih.getcellrange($("#luckysheet-input-box-index").text())); var h = d.row[0], m = d.row[1], p = d.column[0], f = d.column[1], g = ga.visibledatarow[m], v = h - 1 == -1 ? 0 : ga.visibledatarow[h - 1], y = ga.visibledatacolumn[f], b = p - 1 == -1 ? 0 : ga.visibledatacolumn[p - 1]; if (Ih.func_selectedrange = { left: b, width: y - b - 1, top: v, height: g - v - 1, left_move: b, width_move: y - b - 1, top_move: v, height_move: g - v - 1, row: [h, m], column: [p, f], row_focus: h, column_focus: p }, Ih.rangeSetValue({ row: [h, m], column: [p, f] }), Ih.rangestart = !0, Ih.rangedrag_column_start = !1, Ih.rangedrag_row_start = !1, t && a) gc(e, "rangeOfFormula"); else if (t) pc(e, "rangeOfFormula"); else if (a) { var k = e, x = 1; "up" == e && (k = "down", x = -1), "left" == e && (k = "right", x = -1), fc(k, x, "rangeOfFormula") } else { var w = e, _ = 1; "up" == e && (w = "down", _ = -1), "left" == e && (w = "right", _ = -1), mc(w, _, "rangeOfFormula") } r.preventDefault() } } else if (!t && !a) { var C = $(window.getSelection().anchorNode), T = window.getSelection().anchorOffset; "up" == e ? (C.parent().is("span") && 0 == C.parent().next().length && T > 0 || C.is("#luckysheet-rich-text-editor") && C.context.childElementCount == T || C.parent().is("#luckysheet-rich-text-editor") && C.context.length == T) && (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("down", -1, "rangeOfSelect"), r.preventDefault()) : "down" == e ? (C.parent().is("span") && 0 == C.parent().next().length && T > 0 || C.is("#luckysheet-rich-text-editor") && C.context.childElementCount == T || C.parent().is("#luckysheet-rich-text-editor") && C.context.length == T) && (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("down", 1, "rangeOfSelect"), r.preventDefault()) : "left" == e ? C.parent().is("span") && 0 == C.parent().prev().length && 0 == T || C.is("#luckysheet-rich-text-editor") && 1 == T || C.parent().is("#luckysheet-rich-text-editor") && 0 == T ? (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("right", -1, "rangeOfSelect"), r.preventDefault()) : Ih.rangeHightlightselected($("#luckysheet-rich-text-editor")) : "right" == e && (C.parent().is("span") && 0 == C.parent().next().length && T > 0 || C.is("#luckysheet-rich-text-editor") && C.context.childElementCount == T || C.parent().is("#luckysheet-rich-text-editor") && C.context.length == T ? (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("right", 1, "rangeOfSelect"), r.preventDefault()) : Ih.rangeHightlightselected($("#luckysheet-rich-text-editor"))) } } else "down" == e ? 0 == (n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active").next()).length && (n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").first()) : "up" == e && 0 == (n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active").prev()).length && (n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").last()), $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").removeClass("luckysheet-formula-search-item-active"), n.addClass("luckysheet-formula-search-item-active"), r.preventDefault() } function Ay() { var e = gn().drag; $("#luckysheet-input-box").click((function () { Ih.rangeHightlightselected($("#luckysheet-rich-text-editor")) })).add("#" + ga.container).on("keydown", (function (t) { var a = t.ctrlKey, r = t.altKey, n = t.shiftKey, l = t.keyCode; if ($("#luckysheet-modal-dialog-mask").is(":visible") || $(t.target).hasClass("luckysheet-mousedown-cancel") || $(t.target).hasClass("sp-input") || parseInt($("#luckysheet-input-box").css("top")) > 0 && $(t.target).closest(".luckysheet-input-box").length > 0 && l != Sn && l != An && l != qn && l != Fn && l != $n && l != Dn) { var i = $(window.getSelection().anchorNode); if ((i.parent().is("#luckysheet-helpbox-cell") || i.is("#luckysheet-helpbox-cell")) && l == Sn) { var o = $("#luckysheet-helpbox-cell").text(); if (Ih.iscelldata(o)) { var s = Ih.getcellrange(o); ga.luckysheet_select_save = [{ row: s.row, column: s.column, row_focus: s.row[0], column_focus: s.column[0] }], Rh(), $("#luckysheet-helpbox-cell").blur(); var c = $("#luckysheet-cell-main").scrollLeft(), u = $("#luckysheet-cell-main").scrollTop(), d = $("#luckysheet-cell-main").height(), h = $("#luckysheet-cell-main").width(), m = ga.visibledatarow[s.row[1]], p = s.row[0] - 1 == -1 ? 0 : ga.visibledatarow[s.row[0] - 1], f = ga.visibledatacolumn[s.column[1]], g = s.column[0] - 1 == -1 ? 0 : ga.visibledatacolumn[s.column[0] - 1]; f - c - h + 20 > 0 ? $("#luckysheet-scrollbar-x").scrollLeft(f - h + 20) : g - c - 20 < 0 && $("#luckysheet-scrollbar-x").scrollLeft(g - 20), m - u - d + 20 > 0 ? $("#luckysheet-scrollbar-y").scrollTop(m - d + 20) : p - u - 20 < 0 && $("#luckysheet-scrollbar-y").scrollTop(p - 20) } } } else if (!($("#luckysheet-modal-dialog-mask").is(":visible") || $(t.target).hasClass("luckysheet-mousedown-cancel") || $(t.target).hasClass("formulaInputFocus"))) { var v = $("#luckysheet-input-box"); if ((r || t.metaKey) && l == Sn && parseInt(v.css("top")) > 0) { var y = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], b = y.row_focus, k = y.column_focus; Lo(ga.flowdata[b][k]), t.preventDefault() } else if (l == Sn && parseInt(v.css("top")) > 0) $("#luckysheet-formula-search-c").is(":visible") && null != Ih.searchFunctionCell ? Ih.searchFunctionEnter($("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active")) : (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_select_save = [{ row: [ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[0]], column: [ga.luckysheetCellUpdate[1], ga.luckysheetCellUpdate[1]], row_focus: ga.luckysheetCellUpdate[0], column_focus: ga.luckysheetCellUpdate[1] }], mc("down", 1, "rangeOfSelect")), $("#luckysheet-search-formula-parm").is(":visible") && $("#luckysheet-search-formula-parm").hide(), $("#luckysheet-search-formula-parm-select").is(":visible") && $("#luckysheet-search-formula-parm-select").hide(), t.preventDefault(); else if (l == An) { if (parseInt(v.css("top")) > 0) return; mc("right", 1, "rangeOfSelect"), t.preventDefault() } else if (l == zn) { if (parseInt(v.css("top")) > 0) return; var x = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(x.row_focus, x.column_focus, ga.flowdata), t.preventDefault() } else if (l == Ln && parseInt(v.css("top")) > 0) Ih.setfreezonFuc(t), t.preventDefault(); else if (l == Rn && parseInt(v.css("top")) > 0) Ih.dontupdate(), mc("down", 0, "rangeOfSelect"), t.preventDefault(); else if (l == Sn) { if ($(t.target).hasClass("formulaInputFocus") || $("#luckysheet-conditionformat-dialog").is(":visible")) return; if (null != String.fromCharCode(l) && $("#luckysheet-cell-selected").is(":visible")) { var w = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(w.row_focus, w.column_focus, ga.flowdata), t.preventDefault() } } else { if (a || t.metaKey) { if (n) { if (ga.luckysheet_shiftpositon = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), ga.luckysheet_shiftkeydown = !0, l == qn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; gc("up", "rangeOfSelect") } else if (l == Fn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; gc("down", "rangeOfSelect") } else if (l == $n) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; gc("left", "rangeOfSelect") } else if (l == Dn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; gc("right", "rangeOfSelect") } else if (186 == l || 222 == l) { var _ = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(_.row_focus, _.column_focus, ga.flowdata, !0); var C = Tm(2); $("#luckysheet-rich-text-editor").html(C), qo($("#luckysheet-rich-text-editor")[0]), Ih.functionInputHanddler($("#luckysheet-functionbox-cell"), $("#luckysheet-rich-text-editor"), l) } } else if (66 == l) $("#luckysheet-icon-bold").click(); else { if (67 == l) { if (null != Rc.currentImgId) return void Rc.copyImgItem(t); if (xm.luckysheetPaintModelOn && xm.cancelPaintModel(), 0 == ga.luckysheet_select_save.length) return; if (null != ga.config.merge) { for (var T = !1, A = 0; A < ga.luckysheet_select_save.length; A++) { var S = ga.luckysheet_select_save[A].row[0], I = ga.luckysheet_select_save[A].row[1], R = ga.luckysheet_select_save[A].column[0], q = ga.luckysheet_select_save[A].column[1]; if (T = _a(ga.config, S, I, R, q)) break } if (T) return void (wa() ? alert(e.noMerge) : fd.info(e.noMerge, "")) } var D = ga.luckysheetfile[_l(ga.currentSheetIndex)].luckysheet_conditionformat_save; if (ga.luckysheet_select_save.length > 1 && null != D && D.length > 0) { var F = !1, E = gd.getComputeMap(); e: for (var M = 0; M < ga.luckysheet_select_save.length && !F; M++)for (var N = ga.luckysheet_select_save[M].row[0], P = ga.luckysheet_select_save[M].row[1], z = ga.luckysheet_select_save[M].column[0], L = ga.luckysheet_select_save[M].column[1], O = N; O <= P; O++)for (var B = z; B <= L; B++)if (null != gd.checksCF(O, B, E)) { F = !0; continue e } if (F) return void (wa() ? alert(e.noMulti) : fd.info(e.noMulti, "")) } if (ga.luckysheet_select_save.length > 1) { for (var V = !0, H = ga.luckysheet_select_save[0].row[0], U = ga.luckysheet_select_save[0].row[1], j = !0, G = ga.luckysheet_select_save[0].column[0], W = ga.luckysheet_select_save[0].column[1], Y = 1; Y < ga.luckysheet_select_save.length; Y++)ga.luckysheet_select_save[Y].row[0] == H && ga.luckysheet_select_save[Y].row[1] == U || (V = !1), ga.luckysheet_select_save[Y].column[0] == G && ga.luckysheet_select_save[Y].column[1] == W || (j = !1); if (!V && !j || Dh()) return void (wa() ? alert(e.noMulti) : fd.info(e.noMulti, "")) } return vd.copy(t), ga.luckysheet_paste_iscut = !1, Fm(), void t.stopPropagation() } if (70 == l) zh.createDialog(0), zh.init(), $("#luckysheet-search-replace #searchInput input").focus(); else if (72 == l) zh.createDialog(1), zh.init(), $("#luckysheet-search-replace #searchInput input").focus(); else if (73 == l) $("#luckysheet-icon-italic").click(); else { if (86 == l) { if (wa()) return; if ($(t.target).hasClass("formulaInputFocus")) return; return ga.luckysheet_select_save.length > 1 ? void (wa() ? alert(e.noPaste) : fd.info(e.noPaste, "")) : (vd.isPasteAction = !0, Fm(), void t.stopPropagation()) } if (88 == l) { if (xm.luckysheetPaintModelOn && xm.cancelPaintModel(), 0 == ga.luckysheet_select_save.length) return; if (null != ga.config.merge) { for (var X = !1, K = 0; K < ga.luckysheet_select_save.length; K++) { var Z = ga.luckysheet_select_save[K].row[0], Q = ga.luckysheet_select_save[K].row[1], J = ga.luckysheet_select_save[K].column[0], ee = ga.luckysheet_select_save[K].column[1]; if (X = _a(ga.config, Z, Q, J, ee)) break } if (X) return void (fa.editMode ? alert(_locale_drag.noMerge) : fd.info(_locale_drag.noMerge, "")) } return ga.luckysheet_select_save.length > 1 ? void (wa() ? alert(e.noMulti) : fd.info(e.noMulti, "")) : (vd.copy(t), ga.luckysheet_paste_iscut = !0, Fm(), void t.stopPropagation()) } if (90 == l) return Wh(t), Fm(), void t.stopPropagation(); if (89 == l) return Yh(t), Fm(), void t.stopPropagation(); if (l == qn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; pc("up", "rangeOfSelect") } else if (l == Fn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; pc("down", "rangeOfSelect") } else if (l == $n) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; pc("left", "rangeOfSelect") } else if (l == Dn) { if (parseInt(v.css("top")) > 0 || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; pc("right", "rangeOfSelect") } else if (186 == l) { var te = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(te.row_focus, te.column_focus, ga.flowdata, !0); var ae = Tm(1); $("#luckysheet-rich-text-editor").html(ae), qo($("#luckysheet-rich-text-editor")[0]), Ih.functionInputHanddler($("#luckysheet-functionbox-cell"), $("#luckysheet-rich-text-editor"), l) } else if (222 == l) { var re = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(re.row_focus, re.column_focus, ga.flowdata, !0); var ne = Tm(2); $("#luckysheet-rich-text-editor").html(ne), qo($("#luckysheet-rich-text-editor")[0]), Ih.functionInputHanddler($("#luckysheet-functionbox-cell"), $("#luckysheet-rich-text-editor"), l) } else "A" == String.fromCharCode(l).toLocaleUpperCase() && $("#luckysheet-left-top").click() } } return void t.preventDefault() } if (n && (l == qn || l == Fn || l == $n || l == Dn || r && (53 == l || 101 == l))) { if (parseInt(v.css("top")) > 0 || $(t.target).hasClass("formulaInputFocus")) return; if (ga.luckysheet_shiftpositon = $.extend(!0, {}, ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]), ga.luckysheet_shiftkeydown = !0, l == qn) { if ($("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; fc("down", -1, "rangeOfSelect") } else if (l == Fn) { if ($("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; fc("down", 1, "rangeOfSelect") } else if (l == $n) { if ($("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; fc("right", -1, "rangeOfSelect") } else if (l == Dn) { if ($("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; fc("right", 1, "rangeOfSelect") } else !r || 53 != l && 101 != l || $("#luckysheet-icon-strikethrough").click(); t.preventDefault() } else if (l == Rn) xm.luckysheetPaintModelOn ? xm.cancelPaintModel() : (yd(t), t.preventDefault()), Rh(); else if (l == En || l == Tn) null != Rc.currentImgId ? Rc.removeImgItem() : $("#luckysheet-delete-text").click(), t.preventDefault(); else if (8 == l && null != Rc.currentImgId) Rc.removeImgItem(), t.preventDefault(); else if (l == qn) { if (parseInt(v.css("top")) > 0 || ga.luckysheet_cell_selected_move || ga.luckysheet_cell_selected_extend || $(t.target).hasClass("formulaInputFocus") || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; mc("down", -1, "rangeOfSelect"), t.preventDefault() } else if (l == Fn) { if (parseInt(v.css("top")) > 0 || ga.luckysheet_cell_selected_move || ga.luckysheet_cell_selected_extend || $(t.target).hasClass("formulaInputFocus") || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; mc("down", 1, "rangeOfSelect"), t.preventDefault() } else if (l == $n) { if (parseInt(v.css("top")) > 0 || ga.luckysheet_cell_selected_move || ga.luckysheet_cell_selected_extend || $(t.target).hasClass("formulaInputFocus") || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; mc("right", -1, "rangeOfSelect"), t.preventDefault() } else if (l == Dn) { if (parseInt(v.css("top")) > 0 || ga.luckysheet_cell_selected_move || ga.luckysheet_cell_selected_extend || $(t.target).hasClass("formulaInputFocus") || $("#luckysheet-singleRange-dialog").is(":visible") || $("#luckysheet-multiRange-dialog").is(":visible")) return; mc("right", 1, "rangeOfSelect"), t.preventDefault() } else if ((!(l >= 112 && l <= 123 || l <= 46 || 144 == l || 108 == l || t.ctrlKey || t.altKey || t.shiftKey && (37 == l || 38 == l || 39 == l || 40 == l)) || 8 == l || 32 == l || 46 == l || 0 == l || t.ctrlKey && 86 == l) && null != String.fromCharCode(l) && $("#luckysheet-cell-selected").is(":visible") && l != In && l != Mn && 18 != l) { var le = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(le.row_focus, le.column_focus, ga.flowdata, !0), 8 == l && $("#luckysheet-rich-text-editor").html("
      "), Ih.functionInputHanddler($("#luckysheet-functionbox-cell"), $("#luckysheet-rich-text-editor"), l) } } Fm(), t.stopPropagation() } })), $("#" + ga.container).add("#luckysheet-input-box").keydown((function (e) { if (!($("#luckysheet-modal-dialog-mask").is(":visible") || $(e.target).hasClass("luckysheet-mousedown-cancel") || $(e.target).hasClass("formulaInputFocus"))) { var t = e.ctrlKey, a = (e.altKey, e.shiftKey), r = e.keyCode, n = $("#luckysheet-input-box"); r == Rn && parseInt($("#luckysheet-input-box").css("top")) > 0 ? (Ih.dontupdate(), mc("down", 0, "rangeOfSelect"), e.preventDefault()) : r == Sn && parseInt(n.css("top")) > 0 ? $("#luckysheet-formula-search-c").is(":visible") && null != Ih.searchFunctionCell && (Ih.searchFunctionEnter($("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active")), e.preventDefault()) : r == An && parseInt(n.css("top")) > 0 ? ($("#luckysheet-formula-search-c").is(":visible") && null != Ih.searchFunctionCell ? Ih.searchFunctionEnter($("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active")) : (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("right", 1, "rangeOfSelect")), e.preventDefault()) : r == Ln && parseInt(n.css("top")) > 0 ? (Ih.setfreezonFuc(e), e.preventDefault()) : r == qn && parseInt(n.css("top")) > 0 ? Ty("up", t, a, e) : r == Fn && parseInt(n.css("top")) > 0 ? Ty("down", t, a, e) : r == $n && parseInt(n.css("top")) > 0 ? Ty("left", t, a, e) : r == Dn && parseInt(n.css("top")) > 0 ? Ty("right", t, a, e) : (!(r >= 112 && r <= 123 || r <= 46 || 144 == r || 108 == r || e.ctrlKey || e.altKey || e.shiftKey && (37 == r || 38 == r || 39 == r || 40 == r || r == Mn || r == Nn || r == Pn)) || 8 == r || 32 == r || 46 == r || e.ctrlKey && 86 == r) && (Ih.functionInputHanddler($("#luckysheet-functionbox-cell"), $("#luckysheet-rich-text-editor"), r), function (e, t, a) { if (null != e && null != t) { var r = a[e][t]; if (null != r) { var n = r.ht; if (null == r || "0" == n) { var l = ym(e, t, a), i = l.col, o = l.col_pre, s = ($(window).height(), $(window).width()), c = $("#" + ga.container).offset(), u = $("#luckysheet-cell-main").scrollLeft(), d = ($("#luckysheet-cell-main").scrollTop(), { "min-width": i - o + 1 - 8, "max-width": 2 * s / 3, left: o + c.left + ga.rowHeaderWidth - u - 2 }), h = $("#luckysheet-input-box").width(); h > d["max-width"] && (h = d["max-width"]), h < d["min-width"] && (h = d["min-width"]); var m = d.left - h / 2 + (i - o) / 2; m < 2 && (m = 2), d.left = m - 2, $("#luckysheet-input-box").css(d) } } } }(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1], ga.flowdata)) } })).keyup((function (e) { var t = e.keyCode; e.shiftKey || 16 != t || (ga.luckysheet_shiftkeydown = !1, ga.luckysheet_shiftpositon = null), parseInt($("#luckysheet-input-box").css("top")), e.preventDefault() })), $("#luckysheet_info_detail_input").val(pd.title).css("width", 10 * Rm(pd.title)).keydown((function () { event.ctrlKey, event.altKey, event.shiftKey; var e = event.keyCode, t = $(this); e == Sn && t.blur().change() })).bind("input propertychange", (function () { var e = 10 * Rm($(this).val()), t = $("#luckysheet_info_detail_update").outerWidth(), a = $("#luckysheet_info_detail_save").outerWidth(), r = $("#luckysheet_info_detail_user").parent().outerWidth() + 60, n = $("#" + ga.container).outerWidth() - a - t - r - 100; e > n ? $("#luckysheet_info_detail_input").css("width", n) : $("#luckysheet_info_detail_input").css("width", e) })).change((function () { pd.saveParam("na", null, $(this).val()) })), $("#" + ga.container).add("input.luckysheet-mousedown-cancel").keydown((function (e) { var t = e.target.closest(".luckysheet-cols-menuitem"); void 0 !== t && null != t && 13 === e.keyCode && $(t).trigger("click") })) } var Sy = ["http://localhost:8080/luckysheetPluginPrint.umd.js"], Iy = ["http://localhost:8080/luckysheetPluginPrint.css"]; var Ry = { chart: function (e, t) { Om(uh), Lm(ch, null, (function () { var a = new Vuex.Store; console.info("chartmix::", chartmix.default), Vue.use(chartmix.default, { store: a }); var r = document.getElementsByTagName("body")[0]; chartmix.default.initChart(r, ga.lang), $(".chartSetting").css({ top: "1px", bottom: "1px", position: "absolute", right: "0px", width: "350px", background: "#fff", border: "1px solid #E5E5E5", "z-index": 1004, "box-shadow": "0px 2px 4px rgba(0,0,0,0.2)", "-webkit-box-shadow": "0px 2px 4px rgba(0,0,0,0.2)", "-moz-box-shadow": "0px 2px 4px rgba(0,0,0,0.2)", "-moz-user-select": "none", "-khtml-user-select": "none", "-webkit-user-select": "none", "-ms-user-select": "none", "user-select": "none", "padding-left": "30px", display: "none" }), ga.createChart = chartmix.default.createChart, ga.highlightChart = chartmix.default.highlightChart, ga.deleteChart = chartmix.default.deleteChart, ga.resizeChart = chartmix.default.resizeChart, ga.changeChartRange = chartmix.default.changeChartRange, ga.changeChartCellData = chartmix.default.changeChartCellData, ga.getChartJson = chartmix.default.getChartJson, ga.chart_selection = { create: function () { var e = ga.currentChart; if (!(e.rangeArray.length > 1)) { $("#luckysheet-chart-rangeShow").empty(), $("#luckysheet-cell-selected-boxs").hide(), $("#luckysheet-cell-selected-focus").hide(), $("#luckysheet-rows-h-selected").empty(), $("#luckysheet-cols-h-selected").empty(), $("#luckysheet-row-count-show").hide(), $("#luckysheet-column-count-show").hide(); var t = e.rangeArray[0].row[0], a = e.rangeArray[0].column[0], r = e.rangeSplitArray; if (e.rangeRowCheck.exits) var n = o("rowtitle", r.rowtitle.row[0] + t, r.rowtitle.row[1] + t, r.rowtitle.column[0] + a, r.rowtitle.column[1] + a); else n = ""; if (e.rangeColCheck.exits) var l = o("coltitle", r.coltitle.row[0] + t, r.coltitle.row[1] + t, r.coltitle.column[0] + a, r.coltitle.column[1] + a); else l = ""; var i = o("content", r.content.row[0] + t, r.content.row[1] + t, r.content.column[0] + a, r.content.column[1] + a); $("#luckysheet-chart-rangeShow").append(n + l + i) } function o(e, t, a, r, n) { var l = Al(), i = Sl(), o = l[a], s = t - 1 == -1 ? 0 : l[t - 1], c = i[n], u = r - 1 == -1 ? 0 : i[r - 1]; if ("rowtitle" == e) var d = "#C65151"; return "coltitle" == e && (d = "#9667C0"), "content" == e && (d = "#4970D1"), '
      ' } }, rangeMove: !1, rangeMovexy: null, rangeMoveIndex: null, rangeMoveObj: null, rangeMoveDraging: function (e, t, a) { var r = ga.currentChart, n = r.rangeArray[0].row[0], l = r.rangeArray[0].column[0], i = r.rangeRowCheck, o = r.rangeColCheck, s = r.rangeSplitArray, c = $s(e.pageX, e.pageY), u = $("#luckysheet-cell-main").scrollLeft(), d = $("#luckysheet-cell-main").scrollTop(), h = c[0] + u, m = c[1] + d, p = $(window).height() + d - t - a, f = $(window).width() + u, g = oh(m)[2], v = sh(h)[2], y = Al(), b = Sl(), k = ga.chart_selection.rangeMoveObj.attr("id"); if ("luckysheet-chart-rangeShow-content" == k) { var x = ga.chart_selection.rangeMoveIndex[0] - ga.chart_selection.rangeMovexy[0] + g; i.exits ? (x < n + i.range[1] + 1 || m < 0) && (x = n + i.range[1] + 1) : (x < 0 || m < 0) && (x = 0), ((C = s.content.row[1] - s.content.row[0] + x) >= y.length - 1 || m > p) && (x = y.length - 1 - s.content.row[1] + s.content.row[0], C = y.length - 1); var w = ga.chart_selection.rangeMoveIndex[1] - ga.chart_selection.rangeMovexy[1] + v; o.exits ? (w < l + o.range[1] + 1 || h < 0) && (w = l + o.range[1] + 1) : (w < 0 || h < 0) && (w = 0), ((_ = s.content.column[1] - s.content.column[0] + w) >= b.length - 1 || h > f) && (w = b.length - 1 - s.content.column[1] + s.content.column[0], _ = b.length - 1), i.exits && o.exits ? (r.rangeArray = [{ row: [n, C], column: [l, _] }], r.rangeSplitArray.range = { row: [n, C], column: [l, _] }, r.rangeSplitArray.content = { row: [x - n, C - n], column: [w - l, _ - l] }, r.rangeSplitArray.rowtitle = { row: r.rangeSplitArray.rowtitle.row, column: [w - l, _ - l] }, r.rangeSplitArray.coltitle = { row: [x - n, C - n], column: r.rangeSplitArray.coltitle.column }) : i.exits ? (r.rangeArray = [{ row: [n, C], column: [w, _] }], r.rangeSplitArray.range = { row: [n, C], column: [w, _] }, r.rangeSplitArray.content = { row: [x - n, C - n], column: r.rangeSplitArray.content.column }) : o.exits ? (r.rangeArray = [{ row: [x, C], column: [l, _] }], r.rangeSplitArray.range = { row: [x, C], column: [l, _] }, r.rangeSplitArray.content = { row: r.rangeSplitArray.content.row, column: [w - l, _ - l] }) : (r.rangeArray = [{ row: [x, C], column: [w, _] }], r.rangeSplitArray.range = { row: [x, C], column: [w, _] }) } else if ("luckysheet-chart-rangeShow-rowtitle" == k) { var _; w = ga.chart_selection.rangeMoveIndex[1] - ga.chart_selection.rangeMovexy[1] + v, o.exits ? (w < l + o.range[1] + 1 || h < 0) && (w = l + o.range[1] + 1) : (w < 0 || h < 0) && (w = 0), ((_ = s.rowtitle.column[1] - s.rowtitle.column[0] + w) >= b.length - 1 || h > f) && (w = b.length - 1 - s.rowtitle.column[1] + s.rowtitle.column[0], _ = b.length - 1), o.exits ? (r.rangeArray = [{ row: r.rangeArray[0].row, column: [l, _] }], r.rangeSplitArray.range = { row: r.rangeArray[0].row, column: [l, _] }, r.rangeSplitArray.rowtitle = { row: r.rangeSplitArray.rowtitle.row, column: [w - l, _ - l] }, r.rangeSplitArray.content = { row: r.rangeSplitArray.content.row, column: [w - l, _ - l] }) : (r.rangeArray = [{ row: r.rangeArray[0].row, column: [w, _] }], r.rangeSplitArray.range = { row: r.rangeArray[0].row, column: [w, _] }) } else if ("luckysheet-chart-rangeShow-coltitle" == k) { var C; x = ga.chart_selection.rangeMoveIndex[0] - ga.chart_selection.rangeMovexy[0] + g, i.exits ? (x < n + i.range[1] + 1 || m < 0) && (x = n + i.range[1] + 1) : (x < 0 || m < 0) && (x = 0), ((C = s.coltitle.row[1] - s.coltitle.row[0] + x) >= y.length - 1 || m > p) && (x = y.length - 1 - s.coltitle.row[1] + s.coltitle.row[0], C = y.length - 1), i.exits ? (r.rangeArray = [{ row: [n, C], column: r.rangeArray[0].column }], r.rangeSplitArray.range = { row: [n, C], column: r.rangeArray[0].column }, r.rangeSplitArray.coltitle = { row: [x - n, C - n], column: r.rangeSplitArray.coltitle.column }, r.rangeSplitArray.content = { row: [x - n, C - n], column: r.rangeSplitArray.content.column }) : (r.rangeArray = [{ row: [x, C], column: r.rangeArray[0].column }], r.rangeSplitArray.range = { row: [x, C], column: r.rangeArray[0].column }) } ga.chart_selection.create() }, rangeMoveDragged: function () { ga.chart_selection.rangeMove = !1; var e = ga.currentChart; e.rangeTxt = Cl(ga.currentSheetIndex, e.rangeArray[0], ga.currentSheetIndex), e.chartData = Wo(e.rangeArray[0], ga.currentSheetIndex), ga.changeChartRange(e.chart_id, e.chartData, e.rangeArray, e.rangeTxt) }, rangeResize: !1, rangeResizexy: null, rangeResizeIndex: null, rangeResizeObj: null, rangeResizeDraging: function (e, t, a) { var r = ga.currentChart, n = r.rangeArray[0].row[0], l = r.rangeArray[0].column[0], i = r.rangeRowCheck, o = r.rangeColCheck, s = (r.rangeSplitArray, $s(e.pageX, e.pageY)), c = $("#luckysheet-cell-main").scrollLeft(), u = $("#luckysheet-cell-main").scrollTop(), d = s[0] + c, h = s[1] + u, m = $(window).height() + u - t - a, p = $(window).width() + c, f = oh(h)[2], g = sh(d)[2], v = Al(), y = Sl(), b = ga.chart_selection.rangeResizeObj.attr("id"); if ("luckysheet-chart-rangeShow-content" == b) "lt" == ga.chart_selection.rangeResize ? (T = ga.chart_selection.rangeResizeIndex.row[0], k = ga.chart_selection.rangeResizeIndex.column[0], A = ga.chart_selection.rangeResizeIndex.row[1], x = ga.chart_selection.rangeResizeIndex.column[1]) : "lb" == ga.chart_selection.rangeResize ? (T = ga.chart_selection.rangeResizeIndex.row[1], k = ga.chart_selection.rangeResizeIndex.column[0], A = ga.chart_selection.rangeResizeIndex.row[0], x = ga.chart_selection.rangeResizeIndex.column[1]) : "rt" == ga.chart_selection.rangeResize ? (T = ga.chart_selection.rangeResizeIndex.row[0], k = ga.chart_selection.rangeResizeIndex.column[1], A = ga.chart_selection.rangeResizeIndex.row[1], x = ga.chart_selection.rangeResizeIndex.column[0]) : "rb" == ga.chart_selection.rangeResize && (T = ga.chart_selection.rangeResizeIndex.row[1], k = ga.chart_selection.rangeResizeIndex.column[1], A = ga.chart_selection.rangeResizeIndex.row[0], x = ga.chart_selection.rangeResizeIndex.column[0]), i.exits ? (S = T - ga.chart_selection.rangeResizexy[0] + f) < n + i.range[1] + 1 || h < 0 ? S = n + i.range[1] + 1 : (S >= v.length - 1 || h > m) && (S = v.length - 1) : (S = n - ga.chart_selection.rangeResizexy[0] + f) < 0 || h < 0 ? S = 0 : (S >= v.length - 1 || h > m) && (S = v.length - 1), o.exits ? (w = k - ga.chart_selection.rangeResizexy[1] + g) < l + o.range[1] + 1 || d < 0 ? w = l + o.range[1] + 1 : (w >= y.length - 1 || d > p) && (w = y.length - 1) : (w = l - ga.chart_selection.rangeResizexy[1] + g) < 0 || d < 0 ? w = 0 : (w >= y.length - 1 || d > p) && (w = y.length - 1), S > A ? (I = A, R = S) : (I = S, R = A), w > x ? (_ = x, C = w) : (_ = w, C = x), i.exits || o.exits ? (r.rangeArray = [{ row: [n, R], column: [l, C] }], r.rangeSplitArray.range = { row: [n, R], column: [l, C] }, r.rangeSplitArray.content = { row: [I - n, R - n], column: [_ - l, C - l] }, i.exits && (r.rangeSplitArray.rowtitle = { row: r.rangeSplitArray.rowtitle.row, column: [_ - l, C - l] }), o.exits && (r.rangeSplitArray.coltitle = { row: [I - n, R - n], column: r.rangeSplitArray.coltitle.column })) : (r.rangeArray = [{ row: [I, R], column: [_, C] }], r.rangeSplitArray.range = { row: [I, R], column: [_, C] }); else if ("luckysheet-chart-rangeShow-rowtitle" == b) { var k, x, w, _, C; "lt" == ga.chart_selection.rangeResize || "lb" == ga.chart_selection.rangeResize ? (k = ga.chart_selection.rangeResizeIndex.column[0], x = ga.chart_selection.rangeResizeIndex.column[1]) : "rt" != ga.chart_selection.rangeResize && "rb" != ga.chart_selection.rangeResize || (k = ga.chart_selection.rangeResizeIndex.column[1], x = ga.chart_selection.rangeResizeIndex.column[0]), o.exits ? (w = k - ga.chart_selection.rangeResizexy[1] + g) < l + o.range[1] + 1 || d < 0 ? w = l + o.range[1] + 1 : (w >= y.length - 1 || d > p) && (w = y.length - 1) : (w = l - ga.chart_selection.rangeResizexy[1] + g) < 0 || d < 0 ? w = 0 : (w >= y.length - 1 || d > p) && (w = y.length - 1), w > x ? (_ = x, C = w) : (_ = w, C = x), o.exits ? (r.rangeArray = [{ row: r.rangeArray[0].row, column: [l, C] }], r.rangeSplitArray.range = { row: r.rangeArray[0].row, column: [l, C] }, r.rangeSplitArray.rowtitle = { row: r.rangeSplitArray.rowtitle.row, column: [_ - l, C - l] }, r.rangeSplitArray.content = { row: r.rangeSplitArray.content.row, column: [_ - l, C - l] }) : (r.rangeArray = [{ row: r.rangeArray[0].row, column: [_, C] }], r.rangeSplitArray.range = { row: r.rangeArray[0].row, column: [_, C] }) } else if ("luckysheet-chart-rangeShow-coltitle" == b) { var T, A, S, I, R; "lt" == ga.chart_selection.rangeResize || "rt" == ga.chart_selection.rangeResize ? (T = ga.chart_selection.rangeResizeIndex.row[0], A = ga.chart_selection.rangeResizeIndex.row[1]) : "lb" != ga.chart_selection.rangeResize && "rb" != ga.chart_selection.rangeResize || (T = ga.chart_selection.rangeResizeIndex.row[1], A = ga.chart_selection.rangeResizeIndex.row[0]), i.exits ? (S = T - ga.chart_selection.rangeResizexy[0] + f) < n + i.range[1] + 1 || h < 0 ? S = n + i.range[1] + 1 : (S >= v.length - 1 || h > m) && (S = v.length - 1) : (S = n - ga.chart_selection.rangeResizexy[0] + f) < 0 || h < 0 ? S = 0 : (S >= v.length - 1 || h > m) && (S = v.length - 1), S > A ? (I = A, R = S) : (I = S, R = A), i.exits ? (r.rangeArray = [{ row: [n, R], column: r.rangeArray[0].column }], r.rangeSplitArray.range = { row: [n, R], column: r.rangeArray[0].column }, r.rangeSplitArray.coltitle = { row: [I - n, R - n], column: r.rangeSplitArray.coltitle.column }, r.rangeSplitArray.content = { row: [I - n, R - n], column: r.rangeSplitArray.content.column }) : (r.rangeArray = [{ row: [I, R], column: r.rangeArray[0].column }], r.rangeSplitArray.range = { row: [I, R], column: r.rangeArray[0].column }) } ga.chart_selection.create() }, rangeResizeDragged: function () { ga.chart_selection.rangeResize = null; var e = ga.currentChart; e.rangeTxt = Cl(ga.currentSheetIndex, e.rangeArray[0], ga.currentSheetIndex), e.chartData = Wo(e.rangeArray[0], ga.currentSheetIndex), ga.changeChartRange(e.chart_id, e.chartData, e.rangeArray, e.rangeTxt) } }, ga.chartparam.jfrefreshchartall = hh, ga.chartparam.changeChartCellData = chartmix.default.changeChartCellData, ga.chartparam.renderChart = chartmix.default.renderChart, ga.chartparam.getChartJson = chartmix.default.getChartJson, ga.chartparam.insertToStore = chartmix.default.insertToStore; for (var n = 0; n < e.length; n++)dh(e[n].chart, t); for (var l = 0; l < e.length; l++)"1" == e[l].status && xh(e[l].index); Hm(ga.asyncLoad, "chart") })) }, print: function (e, t) { Om(Iy), Lm(Sy, null, (function () { })) } }; var $y = { SUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if (ba(r)) a.push(r); else { if ("boolean" != Cm(r)) return Ih.error.v; "true" == r.toString().toLowerCase() ? a.push(1) : "false" == r.toString().toLowerCase() && a.push(0) } } var n = 0; if (a.length > 0) for (e = 0; e < a.length; e++) { if (ka(a[e])) return a[e]; ba(a[e]) && (n = luckysheet_calcADPMM(n, "+", a[e])) } return n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, AVERAGE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : a.push(r) } var n = 0, l = 0; for (e = 0; e < a.length; e++) { if (ka(a[e])) return a[e]; if (!ba(a[e])) return Ih.error.v; n = luckysheet_calcADPMM(n, "+", a[e]), l++ } return 0 == l ? Ih.error.d : luckysheet_calcADPMM(n, "/", l) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, COUNT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : "boolean" == Cm(r) ? "true" == r.toString().toLowerCase() ? a.push(1) : "false" == r.toString().toLowerCase() && a.push(0) : a.push(r) } var n = 0; for (e = 0; e < a.length; e++)ba(a[e]) && n++; return n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, COUNTA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : a.push(r) } return a.length } catch (e) { return e = Ih.errorInfo(e), [Ih.error.v, e] } }, MAX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = null; for (e = 0; e < a.length; e++) { if (ka(a[e])) return a[e]; ba(a[e]) && ((null == n || parseFloat(a[e]) > n) && (n = parseFloat(a[e]))) } return null == n ? 0 : n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, MIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = null; for (e = 0; e < a.length; e++) { if (ka(a[e])) return a[e]; ba(a[e]) && ((null == n || parseFloat(a[e]) < n) && (n = parseFloat(a[e]))) } return null == n ? 0 : n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, AGE_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(a); if (ka(r)) return r; r = us(r); var n = us(); if (2 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[1]))) return n; n = us(n) } var l = n.diff(r, "years"); return l < 0 || "NaN" == l.toString() ? Ih.error.v : l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, SEX_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]).toString(); return ka(a) ? a : window.luckysheet_function.ISIDCARD.f(a) ? parseInt(a.substr(16, 1)) % 2 == 1 ? "男" : "女" : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, BIRTHDAY_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]).toString(); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = ""; if (15 == a.length) r = "19" + a.substring(6, 8) + "/" + a.substring(8, 10) + "/" + a.substring(10, 12); else if (18 == a.length) { r = a.substring(6, 10) + "/" + a.substring(10, 12) + "/" + a.substring(12, 14) } var n = 0; if (null != arguments[1] && ka(n = Yd.getFirstValue(arguments[1]))) return n; if (!ba(n)) return Ih.error.v; if ((n = parseInt(n)) < 0 || n > 2) return Ih.error.v; if (0 == parseInt(n)) return r; if (1 == parseInt(n)) return us(r).format("YYYY-MM-DD"); if (2 == parseInt(n)) return us(r).format("YYYY年M月D日") } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, PROVINCE_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]).toString(); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = "未知", n = Ih.classlist.province; return a.substring(0, 2) in n && (r = n[a.substring(0, 2)]), r } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, CITY_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]).toString(); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = cityData.length, n = "未知"; for (e = 0; e < r; e++)if (a.substring(0, 6) == cityData[e].code) { n = cityData[e].title; break } return n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, STAR_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(a); if (ka(r)) return r; var n = (r = new Date(r)).getMonth(), l = r.getDate(), i = new Date(1999, n, l, 0, 0, 0), o = []; o.push(["魔羯座", new Date(1999, 0, 1, 0, 0, 0)]), o.push(["水瓶座", new Date(1999, 0, 20, 0, 0, 0)]), o.push(["双鱼座", new Date(1999, 1, 19, 0, 0, 0)]), o.push(["白羊座", new Date(1999, 2, 21, 0, 0, 0)]), o.push(["金牛座", new Date(1999, 3, 21, 0, 0, 0)]), o.push(["双子座", new Date(1999, 4, 21, 0, 0, 0)]), o.push(["巨蟹座", new Date(1999, 5, 22, 0, 0, 0)]), o.push(["狮子座", new Date(1999, 6, 23, 0, 0, 0)]), o.push(["处女座", new Date(1999, 7, 23, 0, 0, 0)]), o.push(["天秤座", new Date(1999, 8, 23, 0, 0, 0)]), o.push(["天蝎座", new Date(1999, 9, 23, 0, 0, 0)]), o.push(["射手座", new Date(1999, 10, 22, 0, 0, 0)]), o.push(["魔羯座", new Date(1999, 11, 22, 0, 0, 0)]); for (e = o.length - 1; e >= 0; e--)if (i >= o[e][1]) return o[e][0]; return "未找到匹配星座信息" } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, ANIMAL_BY_IDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!window.luckysheet_function.ISIDCARD.f(a)) return Ih.error.v; var r = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(a); if (ka(r)) return r; r = new Date(r); var n = new Array("猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗"), l = (parseInt(r.getFullYear()) + 9) % 12; return null == l || isNaN(l) ? "未找到匹配生肖信息" : n[l] } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, ISIDCARD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; return !!r.test(a) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DM_TEXT_CUTWORD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0], "text"); if (ka(l)) return l; var i = 0; return null != arguments[1] && ka(i = Yd.getFirstValue(arguments[1])) ? i : ba(i) ? 0 != (i = parseInt(i)) && 1 != i && 2 != i ? Ih.error.v : ($.post("/dataqk/tu/api/cutword", { text: l, type: i }, (function (e) { var t = [].concat(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, DM_TEXT_TFIDF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0], "text"); if (ka(l)) return l; var i = 20; if (null != arguments[1] && ka(i = Yd.getFirstValue(arguments[1]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = 0; return null != arguments[2] && ka(o = Yd.getFirstValue(arguments[2])) ? o : ba(o) ? (o = parseInt(o), i < 0 || 0 != o && 1 != o && 2 != o ? Ih.error.v : ($.post("/dataqk/tu/api/tfidf", { text: l, count: i, set: o }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...")) : Ih.error.v } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, DM_TEXT_TEXTRANK: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0], "text"); if (ka(l)) return l; var i = 20; if (null != arguments[1] && ka(i = Yd.getFirstValue(arguments[1]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = 0; return null != arguments[2] && ka(o = Yd.getFirstValue(arguments[2])) ? o : ba(o) ? (o = parseInt(o), i < 0 || 0 != o && 1 != o && 2 != o ? Ih.error.v : ($.post("/dataqk/tu/api/tfidf", { text: l, count: i, set: o }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...")) : Ih.error.v } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, DATA_CN_STOCK_CLOSE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "0" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata), l = Mm(e); null == l && (l = e), Ih.execFunctionGroup(a, r, l), t[a][r] = { v: l, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, DATA_CN_STOCK_OPEN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "1" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, DATA_CN_STOCK_MAX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "2" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, DATA_CN_STOCK_MIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "3" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, DATA_CN_STOCK_VOLUMN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "4" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, DATA_CN_STOCK_AMOUNT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentFunction, l = Yd.getFirstValue(arguments[0]); if (ka(l)) return l; var i = null; if (null != arguments[1]) { var o = arguments[1]; if ("array" == Cm(o)) return Ih.error.v; if ("object" == Cm(o) && null != o.startCell) { if (null == o.data || "array" == Cm(o.data) || null == o.data.ct || "d" != o.data.ct.t) return Ih.error.v; i = ws("yyyy-mm-dd", o.data.v) } else i = o; if (!ds(i)) return [Ih.error.v, "日期错误"]; i = us(i).format("YYYY-MM-DD") } var s = 0; return null != arguments[2] && ka(s = Yd.getFirstValue(arguments[2])) ? s : ba(s) ? 0 != (s = parseInt(s)) && 1 != s && 2 != s ? Ih.error.v : ($.post("/dataqk/tu/api/getstockinfo", { stockCode: l, date: i, price: s, type: "5" }, (function (e) { var t = rs.deepCopyFlowData(ga.flowdata); Ih.execFunctionGroup(a, r, e), t[a][r] = { v: e, f: n }, id(t, [{ row: [a, a], column: [r, r] }]) })), "loading...") : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, ISDATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : ds(a) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, SUMIF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 0, r = arguments[0].data, n = arguments[0].rowl, l = arguments[0].coll, i = th(arguments[1]); if (r = Ih.getRangeArray(r)[0], arguments[2]) { var o = [], s = arguments[2].startCell, c = arguments[2].rowl, u = arguments[2].coll, d = arguments[2].sheetName; if (n == c && l == u) o = arguments[2].data; else { var h = [], m = []; h[0] = parseInt(s.replace(/[^0-9]/g, "")) - 1, m[0] = Sm(s.replace(/[^A-Za-z]/g, "")), h[1] = h[0] + n - 1, m[1] = m[0] + l - 1; var p = Im(m[1]), f = h[1] + 1; o = eh(d + "!" + s + ":" + (p + f)).data } o = Ih.getRangeArray(o)[0]; for (e = 0; e < r.length; e++) { if ((g = r[e]) && Ih.acompareb(g, i)) { if (!ba(o[e])) continue; a = luckysheet_calcADPMM(a, "+", o[e]) } } } else for (e = 0; e < r.length; e++) { var g; if ((g = r[e]) && Ih.acompareb(g, i)) { if (!ba(g)) continue; a = luckysheet_calcADPMM(a, "", g) } } return a } catch (e) { var v = e; return v = Ih.errorInfo(v), [Ih.error.v, v] } }, TAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.tan(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TANH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Math.exp(2 * a); return (r - 1) / (r + 1) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, CEILING: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? 0 == (r = parseFloat(r)) ? 0 : a > 0 && r < 0 ? Ih.error.nm : Math.ceil(a / r) * r : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ATAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.atan(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ASINH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.log(a + Math.sqrt(a * a + 1))) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ABS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.abs(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ACOS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) < -1 || a > 1 ? Ih.error.nm : Math.acos(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ACOSH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) < 1 ? Ih.error.nm : Math.log(a + Math.sqrt(a * a - 1)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, MULTINOMIAL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = 0, l = 1; for (e = 0; e < a.length; e++) { var i = a[e]; if (!ba(i)) return Ih.error.v; if ((i = parseFloat(i)) < 0) return Ih.error.nm; n += i, l *= Yd.factorial(i) } return Yd.factorial(n) / l } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, ATANH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= -1 || a >= 1 ? Ih.error.nm : Math.log((1 + a) / (1 - a)) / 2 : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ATAN2: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseFloat(r), 0 == a && 0 == r ? Ih.error.d : Math.atan2(r, a)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, COUNTBLANK: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = 0; if ("object" == Cm(a) && null != a.startCell) { if (null == a.data) return 1; if ("array" == Cm(a.data)) for (var n = 0; n < a.data.length; n++)for (var l = 0; l < a.data[n].length; l++)(null == a.data[n][l] || ya(a.data[n][l].v)) && r++; else ya(a.data.v) && r++ } return r } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, COSH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), (Math.exp(a) + Math.exp(-a)) / 2) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, INT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0]; if ("array" == Cm(a)) return "array" == Cm(a[0]) ? Yd.isDyadicArr(a) && ba(a[0][0]) ? Math.floor(parseFloat(a[0][0])) : Ih.error.v : ba(a[0]) ? Math.floor(parseFloat(a[0])) : Ih.error.v; if ("object" == Cm(a) && null != a.startCell) { if (a.coll > 1) return Ih.error.v; if (a.rowl > 1) { var r = Ih.getcellrange(a.startCell), n = r.row[0]; if (window.luckysheetCurrentRow < n || window.luckysheetCurrentRow > n + a.rowl - 1) return Ih.error.v; var l = a.data[window.luckysheetCurrentRow - n][0] } else l = a.data; return null == l || ya(l.v) ? 0 : ba(l.v) ? Math.floor(parseFloat(l.v)) : Ih.error.v } if ("boolean" == Cm(a)) { if ("true" == a.toString().toLowerCase()) return 1; if ("false" == a.toString().toLowerCase()) return 0 } return ba(a) ? Math.floor(parseFloat(a)) : Ih.error.v } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, ISEVEN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseInt(a), !(1 & Math.abs(a))) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ISODD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseInt(a), !!(1 & Math.abs(a))) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, LCM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r)) } else a = a.concat(r); else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } for (var n = 0; n < a.length; n++) { var l = a[n]; if (!ba(l)) return Ih.error.v; if ((l = parseInt(l)) < 0) return Ih.error.nm; a[n] = l } for (var i, o, s, c = 1; void 0 !== (o = a.pop());)for (0 == o && (c = 0); o > 1;) { if (o % 2) { for (e = 3, i = Math.floor(Math.sqrt(o)); e <= i && o % e; e += 2); s = e <= i ? e : o } else s = 2; for (o /= s, c *= s, e = a.length; e; a[--e] % s == 0 && 1 == (a[e] /= s) && a.splice(e, 1)); } return c >= Math.pow(2, 53) ? Ih.error.nm : c } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, LN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= 0 ? Ih.error.nm : Math.log(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, LOG: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; if ((a = parseFloat(a)) <= 0) return Ih.error.nm; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; if ((r = parseFloat(r)) <= 0) return Ih.error.nm } else var r = 10; return Math.log(a) / Math.log(r) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, LOG10: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= 0 ? Ih.error.nm : Math.log(a) / Math.log(10) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, MOD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if (0 == (r = parseFloat(r))) return Ih.error.d; var n = Math.abs(a % r); return r > 0 ? n : -n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, MROUND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a * (r = parseFloat(r)) < 0 ? Ih.error.nm : Math.round(a / r) * r : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ODD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Math.ceil(Math.abs(a)); return r = 1 & r ? r : r + 1, a >= 0 ? r : -r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, SUMSQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = 0; if (a.length > 0) for (e = 0; e < a.length; e++) { var l = a[e]; if (!ba(l)) return Ih.error.v; n += (l = parseFloat(l)) * l } return n } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, COMBIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a < 0 || r < 0 || a < r ? Ih.error.nm : Yd.factorial(a) / (Yd.factorial(r) * Yd.factorial(a - r))) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, SUBTOTAL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = []; for (e = 0; e < r.length; e++) { for (var n = [], l = 0; l < r[e].length; l++)n.push(r[e][l]); a.push(n) } } else { a = []; for (e = 0; e < r.length; e++)a.push(r[e]) } else a = "object" == Cm(r) && null != r.startCell ? Yd.getFirstValue(r) : r; var i = Array.prototype.slice.apply(arguments); if (i.shift(), "array" == Cm(a)) { var o = []; if ("array" == Cm(a[0])) for (e = 0; e < a.length; e++) { for (n = [], l = 0; l < a[e].length; l++) { ka(s = a[e][l]) ? n.push(s) : ba(s) ? (s = parseInt(s)) < 1 || s > 111 || s > 11 && s < 101 ? n.push(Ih.error.v) : n.push(c(s)) : n.push(Ih.error.v) } o.push(n) } else for (e = 0; e < a.length; e++) { var s; ka(s = a[e]) ? o.push(s) : ba(s) ? (s = parseInt(s)) < 1 || s > 111 || s > 11 && s < 101 ? o.push(Ih.error.v) : o.push(c(s)) : o.push(Ih.error.v) } return o } return ka(a) ? a : ba(a) ? (a = parseInt(a)) < 1 || a > 111 || a > 11 && a < 101 ? Ih.error.v : c(a) : Ih.error.v; function c(e) { switch (e) { case 1: case 101: return window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, i); case 2: case 102: return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, i); case 3: case 103: return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, i); case 4: case 104: return window.luckysheet_function.MAX.f.apply(window.luckysheet_function.MAX, i); case 5: case 105: return window.luckysheet_function.MIN.f.apply(window.luckysheet_function.MIN, i); case 6: case 106: return window.luckysheet_function.PRODUCT.f.apply(window.luckysheet_function.PRODUCT, i); case 7: case 107: return window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, i); case 8: case 108: return window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, i); case 9: case 109: return window.luckysheet_function.SUM.f.apply(window.luckysheet_function.SUM, i); case 10: case 110: return window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, i); case 11: case 111: return window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, i) } } } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, ASIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) < -1 || a > 1 ? Ih.error.nm : Math.asin(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, COUNTIF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("object" != Cm(r) || null == r.startCell) return Ih.error.v; a = r.data; var n, l = arguments[1]; if ("array" == Cm(l)) if (n = [], "array" == Cm(l[0])) { if (!Yd.isDyadicArr(l)) return Ih.error.v; for (e = 0; e < l.length; e++) { for (var i = [], o = 0; o < l[e].length; o++)i.push(l[e][o]); n.push(i) } } else for (e = 0; e < l.length; e++)n.push(l[e]); else if ("object" == Cm(l) && null != l.startCell) { if (l.rowl > 1 || l.coll > 1) return 0; n = l.data.v } else n = l; if ("array" == Cm(n)) { var s = []; if ("array" == Cm(n[0])) for (e = 0; e < n.length; e++) { for (i = [], o = 0; o < n[e].length; o++)i.push(c(a, n[e][o])); s.push(i) } else for (e = 0; e < n.length; e++)s.push(c(a, n[e])); return s } return c(a, n); function c(e, t) { /[<>=!*?]/.test(t) || (t = '=="' + t + '"'), t = t.replace("<>", "!="); var a = 0; if ("array" == Cm(e)) { for (var r = 0; r < e.length; r++)for (var n = 0; n < e[r].length; n++)if (null != e[r][n] && !ya(e[r][n].v)) { var l = e[r][n].v; t.indexOf("*") > -1 || t.indexOf("?") > -1 ? Ih.isWildcard(l, t) && a++ : "string" != typeof l ? new Function("return " + l + t)() && a++ : new Function('return "' + l + '"' + t)() && a++ } } else if (null != e && !ya(e.v)) { l = e.v; t.indexOf("*") > -1 || t.indexOf("?") > -1 ? Ih.isWildcard(l, t) && a++ : "string" != typeof l ? new Function("return " + l + t)() && a++ : new Function('return "' + l + '"' + t)() && a++ } return a } } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, RADIANS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) * Math.PI / 180 : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, RAND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; try { return Math.floor(1e9 * Math.random()) / 1e9 } catch (t) { var e = t; return e = Ih.errorInfo(e), [Ih.error.v, e] } }, COUNTUNIQUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : a.push(r) } return window.luckysheet_function.UNIQUE.f(a) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DEGREES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? 180 * (a = parseFloat(a)) / Math.PI : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ERFC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), jStat.erfc(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, EVEN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Math.ceil(Math.abs(a)); return r = 1 & r ? r + 1 : r, a > 0 ? r : -r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, EXP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.exp(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, FACT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) { if ("boolean" != Cm(a)) return Ih.error.v; "true" == a.toString().toLowerCase() ? a = 1 : "false" == a.toString().toLowerCase() && (a = 0) } return (a = parseInt(a)) < 0 ? Ih.error.nm : Yd.factorial(a) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, FACTDOUBLE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) { if ("boolean" != Cm(a)) return Ih.error.v; "true" == a.toString().toLowerCase() ? a = 1 : "false" == a.toString().toLowerCase() && (a = 0) } return (a = parseInt(a)) < 0 ? Ih.error.nm : Yd.factorialDouble(a) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, PI: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; try { return Math.PI } catch (t) { var e = t; return e = Ih.errorInfo(e), [Ih.error.v, e] } }, FLOOR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if (0 == (r = parseFloat(r))) return Ih.error.d; if (a > 0 && r < 0) return Ih.error.nm; var n = -Math.floor(Math.log(Math.abs(r)) / Math.log(10)); return a >= 0 ? Math.floor(a / r) * r * Math.pow(10, n) / Math.pow(10, n) : -Math.ceil(Math.abs(a) / r) * r * Math.pow(10, n) / Math.pow(10, n) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, GCD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !1)) : a.push(r) } if (!ba(a[0])) return Ih.error.v; var n = parseInt(a[0]); if (n < 0 || n >= Math.pow(2, 53)) return Ih.error.nm; for (e = 1; e < a.length; e++) { var l = a[e]; if (!ba(l)) return Ih.error.v; if ((l = parseInt(l)) < 0 || l >= Math.pow(2, 53)) return Ih.error.nm; for (; n && l;)n > l ? n %= l : l %= n; n += l } return n } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, RANDBETWEEN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a > (r = parseInt(r)) ? Ih.error.nm : a + Math.ceil((r - a + 1) * Math.random()) - 1 : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ROUND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = a > 0 ? 1 : -1; return n * Math.round(Math.abs(a) * Math.pow(10, r)) / Math.pow(10, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, ROUNDDOWN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = a > 0 ? 1 : -1; return n * Math.floor(Math.abs(a) * Math.pow(10, r)) / Math.pow(10, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, ROUNDUP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = a > 0 ? 1 : -1; return n * Math.ceil(Math.abs(a) * Math.pow(10, r)) / Math.pow(10, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, SERIESSUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = arguments[3], i = []; if ("array" == Cm(l)) { if ("array" == Cm(l[0]) && !Yd.isDyadicArr(l)) return Ih.error.v; i = i.concat(Yd.getDataArr(l, !1)) } else "object" == Cm(l) && null != l.startCell ? i = i.concat(Yd.getCellDataArr(l, "number", !1)) : i.push(l); if (!ba(i[0])) return Ih.error.v; var o = parseFloat(i[0]) * Math.pow(a, r); for (e = 1; e < i.length; e++) { var s = i[e]; if (!ba(s)) return Ih.error.v; o += (s = parseFloat(s)) * Math.pow(a, r + e * n) } return o } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, SIGN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; if ((a = parseFloat(a)) > 0) return 1; if (0 == a) return 0; if (a < 0) return -1 } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, SIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.sin(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, SINH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), (Math.exp(a) - Math.exp(-a)) / 2) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, SQRT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) < 0 ? Ih.error.nm : Math.sqrt(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, SQRTPI: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) < 0 ? Ih.error.nm : Math.sqrt(a * Math.PI) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, GAMMALN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= 0 ? Ih.error.nm : jStat.gammaln(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, COS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a), Math.cos(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TRUNC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; if (a = parseFloat(a), 2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } else var r = 0; var n = a > 0 ? 1 : -1; return n * Math.floor(Math.abs(a) * Math.pow(10, r)) / Math.pow(10, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, QUOTIENT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? 0 == (r = parseFloat(r)) ? Ih.error.d : parseInt(a / r, 10) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, POWER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseFloat(r), 0 == a && 0 == r || a < 0 && r.toString().indexOf(".") > -1 ? Ih.error.nm : Math.pow(a, r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, SUMIFS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 0, r = arguments; ah(r); var n = Ih.getRangeArray(r[0])[0], l = new Array(n.length); for (e = 0; e < l.length; e++)l[e] = !0; for (e = 1; e < r.length; e += 2)for (var i = Ih.getRangeArray(r[e])[0], o = r[e + 1], s = 0; s < i.length; s++) { var c = i[s]; l[s] = l[s] && !!c && Ih.acompareb(c, o) } for (e = 0; e < n.length; e++)l[e] && (a = luckysheet_calcADPMM(a, "+", n[e])); return a } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, COUNTIFS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments; ah(a); var r = new Array(Ih.getRangeArray(a[0])[0].length); for (e = 0; e < r.length; e++)r[e] = !0; for (e = 0; e < a.length; e += 2)for (var n = Ih.getRangeArray(a[e])[0], l = a[e + 1], i = 0; i < n.length; i++) { var o = n[i]; r[i] = r[i] && !!o && Ih.acompareb(o, l) } var s = 0; for (e = 0; e < r.length; e++)r[e] && s++; return s } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, PRODUCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = 1; for (e = 0; e < a.length; e++) { var l = a[e]; if (!ba(l)) return Ih.error.v; n *= l = parseFloat(l) } return n } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, HARMEAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "number", !0)) : a.push(r) } var n = 0, l = 0; for (e = 0; e < a.length; e++) { var i = a[e]; if (!ba(i)) return Ih.error.v; if ((i = parseFloat(i)) <= 0) return Ih.error.nm; n += 1 / i, l++ } return l / n } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, HYPGEOMDIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = Yd.getCellBoolen(arguments[4]); if (ka(i)) return i; if (a < 0 || a > Math.min(r, n) || a < Math.max(0, r - l + n)) return Ih.error.nm; if (r <= 0 || r > l) return Ih.error.nm; if (n <= 0 || n > l) return Ih.error.nm; if (l <= 0) return Ih.error.nm; function o(e, t, a, r) { return Yd.factorial(a) / (Yd.factorial(e) * Yd.factorial(a - e)) * (Yd.factorial(r - a) / (Yd.factorial(t - e) * Yd.factorial(r - a - t + e))) / (Yd.factorial(r) / (Yd.factorial(t) * Yd.factorial(r - t))) } function s(e, t, a, r) { for (var n = 0, l = 0; l <= e; l++)n += o(l, t, a, r); return n } return i ? s(a, r, n, l) : o(a, r, n, l) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, INTERCEPT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 0, r = arguments[0], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "text", !1)) : n.push(r); var l = arguments[1], i = []; if ("array" == Cm(l)) { if ("array" == Cm(l[0]) && !Yd.isDyadicArr(l)) return Ih.error.v; i = i.concat(Yd.getDataArr(l, !1)) } else "object" == Cm(l) && null != l.startCell ? i = i.concat(Yd.getCellDataArr(l, "text", !1)) : i.push(l); if (n.length != i.length) return Ih.error.na; var o = [], s = []; for (e = 0; e < n.length; e++) { var c = n[e], u = i[e]; ba(c) && ba(u) && (o.push(parseFloat(c)), s.push(parseFloat(u))) } if (0 == Yd.variance_s(s)) return Ih.error.d; var d = jStat.mean(s), h = jStat.mean(o), m = s.length, p = 0, f = 0; for (e = 0; e < m; e++)p += (s[e] - d) * (o[e] - h), f += Math.pow(s[e] - d, 2); var g = p / f, v = h - g * d; return v + g * a } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, KURT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : a.push(r) } for (var n = [], l = 0; l < a.length; l++) { var i = a[l]; if (!ba(i)) return Ih.error.v; i = parseFloat(i), n.push(i) } if (n.length < 4 || 0 == Yd.standardDeviation_s(n)) return Ih.error.d; var o = jStat.mean(n), s = n.length, c = 0; for (e = 0; e < s; e++)c += Math.pow(n[e] - o, 4); return s * (s + 1) / ((s - 1) * (s - 2) * (s - 3)) * (c /= Math.pow(jStat.stdev(n, !0), 4)) - 3 * (s - 1) * (s - 1) / ((s - 2) * (s - 3)) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, LARGE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !0)) } else "object" == Cm(arguments[0]) && null != arguments[0].startCell ? a = a.concat(Yd.getCellDataArr(arguments[0], "text", !0)) : a.push(arguments[0]); for (var r = [], n = 0; n < a.length; n++) { var l = a[n]; if (!ba(l)) return Ih.error.v; l = parseFloat(l), r.push(l) } if ("array" == Cm(arguments[1])) { if ("array" == Cm(arguments[1][0]) && !Yd.isDyadicArr(arguments[1])) return Ih.error.v; o = Yd.getDataArr(arguments[1]) } else if ("object" == Cm(arguments[1]) && null != arguments[1].startCell) { if (arguments[1].rowl > 1 || arguments[1].coll > 1) return Ih.error.v; var i = arguments[1].data; if (null == i || ya(i.v)) var o = 0; else o = i.v } else o = arguments[1]; if ("array" == Cm(o)) { if (0 == r.length) return Ih.error.nm; var s = []; for (e = 0; e < o.length; e++)ba(o[e]) ? (o[e] = Math.ceil(parseFloat(o[e])), o[e] <= 0 || o[e] > r.length ? s.push(Ih.error.nm) : s.push(a.sort((function (e, t) { return t - e }))[o[e] - 1])) : s.push(Ih.error.v); return s } return ba(o) ? (o = Math.ceil(parseFloat(o)), 0 == r.length || o <= 0 || o > r.length ? Ih.error.nm : a.sort((function (e, t) { return t - e }))[o - 1]) : Ih.error.v } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, STDEVA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !1)) : a.push(r) } for (var n = [], l = 0; l < a.length; l++) { var i = a[l]; i = ba(i) ? parseFloat(i) : "true" == i.toString().toLowerCase() ? 1 : 0, n.push(i) } return 0 == n.length ? 0 : 1 == n.length ? Ih.error.d : Yd.standardDeviation_s(n) } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, STDEVP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? a = a.concat(Yd.getCellDataArr(r, "text", !0)) : a.push(r) } for (var n = [], l = 0; l < a.length; l++) { var i = a[l]; if (!ba(i)) return Ih.error.v; i = parseFloat(i), n.push(i) } return 0 == n.length ? 0 : 1 == n.length ? Ih.error.d : Yd.standardDeviation(n) } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, GEOMEAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "text", !0)); else if ("boolean" == Cm(r)) "true" == r.toString().toLowerCase() ? a.push(1) : "false" == r.toString().toLowerCase() && a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } for (var n = [], l = 0; l < a.length; l++) { var i = a[l]; if (ba(i)) { if ((i = parseFloat(i)) <= 0) return Ih.error.nm; n.push(i) } } return 0 == n.length ? Ih.error.nm : jStat.geomean(n) } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, RANK_EQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "number", !0)) : n.push(r); for (var l = [], i = 0; i < n.length; i++) { var o = n[i]; if (!ba(o)) return Ih.error.v; o = parseFloat(o), l.push(o) } if (3 == arguments.length) { if (ka(s = Yd.getCellBoolen(arguments[2]))) return s } else var s = !1; var c = s ? function (e, t) { return e - t } : function (e, t) { return t - e }, u = (l = l.sort(c)).indexOf(a); return -1 == u ? Ih.error.na : u + 1 } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, RANK_AVG: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !0)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "number", !0)) : n.push(r); for (var l = [], i = 0; i < n.length; i++) { var o = n[i]; if (!ba(o)) return Ih.error.v; o = parseFloat(o), l.push(o) } if (3 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[2]))) return s; if ("boolean" == Cm(s)); else if ("string" != Cm(s) || "true" != s.toLowerCase() && "false" != s.toLowerCase()) { if (!ba(s)) return Ih.error.v; s = 0 != (s = parseFloat(s)) } else "true" == s.toLowerCase() && (s = !0), "false" == s.toLowerCase() && (s = !1) } else var s = !1; var c = s ? function (e, t) { return e - t } : function (e, t) { return t - e }; l = l.sort(c); var u = 0; for (e = 0; e < l.length; e++)l[e] == a && u++; return u > 1 ? (2 * l.indexOf(a) + u + 1) / 2 : l.indexOf(a) + 1 } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, PERCENTRANK_EXC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !0)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !0)) : r.push(a); for (var n = [], l = 0; l < r.length; l++) { var i = r[l]; if (!ba(i)) return Ih.error.v; i = parseFloat(i), n.push(i) } var o = Yd.getFirstValue(arguments[1]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; if (o = parseFloat(o), 3 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[2]))) return s; if (!ba(s)) return Ih.error.v; s = parseInt(s) } else var s = 3; if (0 == n.length) return Ih.error.nm; if (s < 1) return Ih.error.nm; if (1 == n.length && n[0] == o) return 1; n = n.sort((function (e, t) { return e - t })); var c = window.luckysheet_function.UNIQUE.f(n)[0], u = n.length, d = c.length, h = Math.pow(10, s), m = 0, p = !1; for (e = 0; !p && e < d;)o === c[e] ? (m = (n.indexOf(c[e]) + 1) / (u + 1), p = !0) : o >= c[e] && (o < c[e + 1] || e === d - 1) && (m = (n.lastIndexOf(c[e]) + 1 + (o - c[e]) / (c[e + 1] - c[e])) / (u + 1), p = !0), e++; return isNaN(m) ? Ih.error.na : Math.floor(m * h) / h } catch (e) { var f = e; return f = Ih.errorInfo(f), [Ih.error.v, f] } }, PERCENTRANK_INC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !0)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !0)) : r.push(a); for (var n = [], l = 0; l < r.length; l++) { var i = r[l]; if (!ba(i)) return Ih.error.v; i = parseFloat(i), n.push(i) } var o = Yd.getFirstValue(arguments[1]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; if (o = parseFloat(o), 3 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[2]))) return s; if (!ba(s)) return Ih.error.v; s = parseInt(s) } else var s = 3; if (0 == n.length) return Ih.error.nm; if (s < 1) return Ih.error.nm; if (1 == n.length && n[0] == o) return 1; n = n.sort((function (e, t) { return e - t })); var c = window.luckysheet_function.UNIQUE.f(n)[0], u = n.length, d = c.length, h = Math.pow(10, s), m = 0, p = !1; for (e = 0; !p && e < d;)o === c[e] ? (m = n.indexOf(c[e]) / (u - 1), p = !0) : o >= c[e] && (o < c[e + 1] || e === d - 1) && (m = (n.lastIndexOf(c[e]) + (o - c[e]) / (c[e + 1] - c[e])) / (u - 1), p = !0), e++; return isNaN(m) ? Ih.error.na : Math.floor(m * h) / h } catch (e) { var f = e; return f = Ih.errorInfo(f), [Ih.error.v, f] } }, FORECAST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "text", !1)) : n.push(r); var l = arguments[2], i = []; if ("array" == Cm(l)) { if ("array" == Cm(l[0]) && !Yd.isDyadicArr(l)) return Ih.error.v; i = i.concat(Yd.getDataArr(l, !1)) } else "object" == Cm(l) && null != l.startCell ? i = i.concat(Yd.getCellDataArr(l, "text", !1)) : i.push(l); if (n.length != i.length) return Ih.error.na; var o = [], s = []; for (e = 0; e < n.length; e++) { var c = n[e], u = i[e]; ba(c) && ba(u) && (o.push(parseFloat(c)), s.push(parseFloat(u))) } if (0 == Yd.variance_s(s)) return Ih.error.d; var d = jStat.mean(s), h = jStat.mean(o), m = s.length, p = 0, f = 0; for (e = 0; e < m; e++)p += (s[e] - d) * (o[e] - h), f += Math.pow(s[e] - d, 2); var g = p / f, v = h - g * d; return v + g * a } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, FISHERINV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Math.exp(2 * a); return (r - 1) / (r + 1) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, FISHER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= -1 || a >= 1 ? Ih.error.nm : Math.log((1 + a) / (1 - a)) / 2 : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, MODE_SNGL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } var i, o = {}, s = [], c = 0; for (e = 0; e < n.length; e++)o[i = n[e]] = o[i] ? o[i] + 1 : 1, o[i] > c && (c = o[i], s = []), o[i] == c && (s[s.length] = i); if (c <= 1) return Ih.error.na; for (var u = n.indexOf(s[0]), d = 0; d < s.length; d++) { var h = n.indexOf(s[d]); h < u && (u = h) } return n[u] } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, WEIBULL_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : a < 0 || r <= 0 || n <= 0 ? Ih.error.nm : l ? 1 - Math.exp(-Math.pow(a / n, r)) : Math.pow(a, r - 1) * Math.exp(-Math.pow(a / n, r)) * r / Math.pow(n, r) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, AVEDEV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } return 0 == n.length ? Ih.error.nm : jStat.sum(jStat(n).subtract(jStat.mean(n)).abs()[0]) / n.length } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, AVERAGEA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if ("true" == i.toString.toLowerCase()) a.push(1); else if ("false" == i.toString.toLowerCase()) a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = 0, l = 0; for (e = 0; e < a.length; e++) { var i = a[e]; ba(i) ? n += parseFloat(i) : "true" == i.toString().toLowerCase() ? n += 1 : n += 0, l++ } return 0 == l ? Ih.error.d : n / l } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, BINOM_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : a < 0 || a > r || n < 0 || n > 1 ? Ih.error.nm : l ? jStat.binomial.cdf(a, r, n) : jStat.binomial.pdf(a, r, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, BINOM_INV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; if (n = parseFloat(n), a < 0) return Ih.error.nm; if (r < 0 || r > 1) return Ih.error.nm; if (n < 0 || n > 1) return Ih.error.nm; for (var l = 0; l <= a;) { if (jStat.binomial.cdf(l, a, r) >= n) return l; l++ } } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, CONFIDENCE_NORM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseInt(n), a <= 0 || a >= 1 || r <= 0 || n < 1 ? Ih.error.nm : jStat.normalci(1, a, r, n)[1] - 1) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, CORREL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } return 0 == i.length || 0 == o.length || 0 == Yd.standardDeviation(i) || 0 == Yd.standardDeviation(o) ? Ih.error.d : jStat.corrcoeff(i, o) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, COVARIANCE_P: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } if (0 == i.length || 0 == o.length) return Ih.error.d; var u = jStat.mean(i), d = jStat.mean(o), h = 0; for (e = 0; e < i.length; e++)h += (i[e] - u) * (o[e] - d); return h /= i.length } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, COVARIANCE_S: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } return 0 == i.length || 0 == o.length ? Ih.error.d : jStat.covariance(i, o) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, DEVSQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if (ba(r)) a.push(r); else { if ("boolean" != Cm(r)) return Ih.error.v; "true" == r.toString().toLowerCase() ? a.push(1) : "false" == r.toString().toLowerCase() && a.push(0) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } var i = jStat.mean(n), o = 0; for (e = 0; e < n.length; e++)o += Math.pow(n[e] - i, 2); return o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, EXPON_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getCellBoolen(arguments[2]); return ka(n) ? n : a < 0 || r < 0 ? Ih.error.nm : n ? jStat.exponential.cdf(a, r) : jStat.exponential.pdf(a, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, AVERAGEIF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 0, r = 0, n = arguments[0].data, l = arguments[0].rowl, i = arguments[0].coll, o = th(arguments[1]), s = []; if (arguments[2]) { var c = arguments[2].startCell, u = arguments[2].rowl, d = arguments[2].coll, h = arguments[2].sheetName; if (l == u && i == d) s = arguments[2].data; else { var m = [], p = []; m[0] = parseInt(c.replace(/[^0-9]/g, "")) - 1, p[0] = Sm(c.replace(/[^A-Za-z]/g, "")), m[1] = m[0] + l - 1, p[1] = p[0] + i - 1; var f = Im(p[1]), g = m[1] + 1; s = eh(h + "!" + c + ":" + (f + g)).data } s = Ih.getRangeArray(s)[0] } n = Ih.getRangeArray(n)[0]; for (e = 0; e < n.length; e++) { var v = n[e]; if (v && Ih.acompareb(v, o)) { var y = s[e] || v; if (!ba(y)) continue; a += parseFloat(y), r++ } } return 0 == a || 0 == r ? Ih.error.d : Mm(a / r) } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, AVERAGEIFS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 0, r = 0, n = arguments; ah(n); var l = Ih.getRangeArray(n[0])[0], i = new Array(l.length); for (e = 0; e < i.length; e++)i[e] = !0; for (e = 1; e < n.length; e += 2)for (var o = Ih.getRangeArray(n[e])[0], s = n[e + 1], c = 0; c < o.length; c++) { var u = o[c]; i[c] = i[c] && !!u && Ih.acompareb(u, s) } for (e = 0; e < l.length; e++)i[e] && ba(l[e]) && (a += parseFloat(l[e]), r++); return 0 == a || 0 == r ? Ih.error.d : Mm(a / r) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, PERMUT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a <= 0 || r < 0 || a < r ? Ih.error.nm : Yd.factorial(a) / Yd.factorial(a - r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, TRIMMEAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !1)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; ba(l) && n.push(parseFloat(l)) } var i = Yd.getFirstValue(arguments[1]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; if (i = parseFloat(i), 0 == n.length) return Ih.error.nm; if (i < 0 || i > 1) return Ih.error.nm; function o(e, t) { return t = t || 1, e && "function" == typeof e.slice ? e.slice(t) : e } function s(e, t) { return t = t || 1, e && "function" == typeof e.slice ? e.slice(0, e.length - t) : e } n.sort((function (e, t) { return e - t })); var c = window.luckysheet_function.FLOOR.f(n.length * i, 2) / 2, u = o(n, c); return u = s(u, c), u = jStat.mean(u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, PERCENTILE_EXC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !1)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; ba(l) && n.push(parseFloat(l)) } var i = Yd.getFirstValue(arguments[1]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; if (i = parseFloat(i), 0 == n.length) return Ih.error.nm; if (i <= 0 || i >= 1) return Ih.error.nm; var o = (n = n.sort((function (e, t) { return e - t }))).length; if (i < 1 / (o + 1) || i > 1 - 1 / (o + 1)) return Ih.error.nm; var s = i * (o + 1) - 1, c = Math.floor(s); return s === c ? n[s] : n[c] + (s - c) * (n[c + 1] - n[c]) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, PERCENTILE_INC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !1)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; ba(l) && n.push(parseFloat(l)) } var i = Yd.getFirstValue(arguments[1]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; if (i = parseFloat(i), 0 == n.length) return Ih.error.nm; if (i < 0 || i > 1) return Ih.error.nm; var o = (n = n.sort((function (e, t) { return e - t }))).length, s = i * (o - 1), c = Math.floor(s); return s === c ? n[s] : n[c] + (s - c) * (n[c + 1] - n[c]) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, PEARSON: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } if (0 == o.length || 0 == i.length) return Ih.error.d; var u = jStat.mean(i), d = jStat.mean(o), h = i.length, m = 0, p = 0, f = 0; for (e = 0; e < h; e++)m += (i[e] - u) * (o[e] - d), p += Math.pow(i[e] - u, 2), f += Math.pow(o[e] - d, 2); return m / Math.sqrt(p * f) } catch (e) { var g = e; return g = Ih.errorInfo(g), [Ih.error.v, g] } }, NORM_S_INV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseFloat(a)) <= 0 || a >= 1 ? Ih.error.nm : jStat.normal.inv(a, 0, 1) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, NORM_S_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getCellBoolen(arguments[1]); return ka(r) ? r : r ? jStat.normal.cdf(a, 0, 1) : jStat.normal.pdf(a, 0, 1) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, NORM_INV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) { if ("boolean" != Cm(a)) return Ih.error.v; "true" == a.toString().toLowerCase() ? a = 1 : "false" == a.toString().toLowerCase() && (a = 0) } a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) { if ("boolean" != Cm(r)) return Ih.error.v; "true" == r.toString().toLowerCase() ? r = 1 : "false" == r.toString().toLowerCase() && (r = 0) } r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) { if ("boolean" != Cm(n)) return Ih.error.v; "true" == n.toString().toLowerCase() ? n = 1 : "false" == n.toString().toLowerCase() && (n = 0) } return n = parseFloat(n), a <= 0 || a >= 1 || n <= 0 ? Ih.error.nm : jStat.normal.inv(a, r, n) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, NORM_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) { if ("boolean" != Cm(a)) return Ih.error.v; "true" == a.toString().toLowerCase() ? a = 1 : "false" == a.toString().toLowerCase() && (a = 0) } a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : n <= 0 ? Ih.error.nm : l ? jStat.normal.cdf(a, r, n) : jStat.normal.pdf(a, r, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, NEGBINOM_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : n < 0 || n > 1 || a < 0 || r < 1 ? Ih.error.nm : l ? jStat.negbin.cdf(a, r, n) : jStat.negbin.pdf(a, r, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, MINA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if ("true" == l.toString.toLowerCase()) a.push(1); else if ("false" == l.toString.toLowerCase()) a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) ? n.push(parseFloat(l)) : "true" == l.toString().toLowerCase() ? n.push(1) : n.push(0) } return 0 === n.length ? 0 : Math.min.apply(Math, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, MEDIAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } return jStat.median(n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, MAXA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if ("true" == l.toString.toLowerCase()) a.push(1); else if ("false" == l.toString.toLowerCase()) a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) ? n.push(parseFloat(l)) : "true" == l.toString().toLowerCase() ? n.push(1) : n.push(0) } return 0 === n.length ? 0 : Math.max.apply(Math, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, LOGNORM_INV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseFloat(n), a <= 0 || a >= 1 || n <= 0 ? Ih.error.nm : jStat.lognormal.inv(a, r, n)) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, LOGNORM_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : a <= 0 || n <= 0 ? Ih.error.nm : l ? jStat.lognormal.cdf(a, r, n) : jStat.lognormal.pdf(a, r, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, Z_TEST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !0)) } else "object" == Cm(arguments[0]) && null != arguments[0].startCell ? a = a.concat(Yd.getCellDataArr(arguments[0], "text", !0)) : a.push(arguments[0]); for (var r = [], n = 0; n < a.length; n++) { var l = a[n]; ba(l) && r.push(parseFloat(l)) } var i = Yd.getFirstValue(arguments[1]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; if (i = parseFloat(i), 0 == r.length) return Ih.error.na; var o = Yd.standardDeviation_s(r); if (3 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[2]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } var s = r.length, c = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, r); return 1 - window.luckysheet_function.NORM_S_DIST.f((c - i) / (o / Math.sqrt(s)), "true") } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, PROB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !1)) } else "object" == Cm(arguments[0]) && null != arguments[0].startCell ? a = a.concat(Yd.getCellDataArr(arguments[0], "text", !1)) : a.push(arguments[0]); var r = []; if ("array" == Cm(arguments[1])) { if ("array" == Cm(arguments[1][0]) && !Yd.isDyadicArr(arguments[1])) return Ih.error.v; r = r.concat(Yd.getDataArr(arguments[1], !1)) } else "object" == Cm(arguments[1]) && null != arguments[1].startCell ? r = r.concat(Yd.getCellDataArr(arguments[1], "text", !1)) : r.push(arguments[1]); if (a.length != r.length) return Ih.error.na; var n = [], l = [], i = 0; for (e = 0; e < a.length; e++) { var o = a[e], s = r[e]; if (ba(o) && ba(s) && (n.push(parseFloat(o)), l.push(parseFloat(s)), i += parseFloat(s), parseFloat(s) <= 0 || parseFloat(s) > 1)) return Ih.error.nm } if (1 != i) return Ih.error.nm; var c = Yd.getFirstValue(arguments[2]); if (ka(c)) return c; if (!ba(c)) return Ih.error.v; var u = c = parseFloat(c); if (4 == arguments.length) { if (ka(u = Yd.getFirstValue(arguments[3]))) return u; if (!ba(u)) return Ih.error.v; u = parseFloat(u) } var d = 0; for (e = 0; e < n.length; e++)n[e] >= c && n[e] <= u && (d += l[e]); return d } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, QUARTILE_EXC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !0)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "text", !0)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = []; for (e = 0; e < a.length; e++) { var n = a[e]; ba(n) && r.push(parseFloat(n)) } var l = Yd.getFirstValue(arguments[1]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; if (l = parseInt(l), 0 == r.length) return Ih.error.nm; if (l <= 0 || l >= 4) return Ih.error.nm; switch (l) { case 1: return window.luckysheet_function.PERCENTILE_EXC.f(r, .25); case 2: return window.luckysheet_function.PERCENTILE_EXC.f(r, .5); case 3: return window.luckysheet_function.PERCENTILE_EXC.f(r, .75) } } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, QUARTILE_INC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !0)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "text", !0)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = []; for (e = 0; e < a.length; e++) { var n = a[e]; ba(n) && r.push(parseFloat(n)) } var l = Yd.getFirstValue(arguments[1]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; if (l = parseInt(l), 0 == r.length) return Ih.error.nm; if (l < 0 || l > 4) return Ih.error.nm; switch (l) { case 0: return Math.min.apply(Math, r); case 1: return window.luckysheet_function.PERCENTILE_INC.f(r, .25); case 2: return window.luckysheet_function.PERCENTILE_INC.f(r, .5); case 3: return window.luckysheet_function.PERCENTILE_INC.f(r, .75); case 4: return Math.max.apply(Math, r) } } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, POISSON_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getCellBoolen(arguments[2]); return ka(n) ? n : a < 0 || r < 0 ? Ih.error.nm : n ? jStat.poisson.cdf(a, r) : jStat.poisson.pdf(a, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, RSQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else if ("object" == Cm(a) && null != a.startCell) r = r.concat(Yd.getCellDataArr(a, "text", !1)); else { if (!ba(a)) return Ih.error.v; r.push(a) } var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else if ("object" == Cm(n) && null != n.startCell) l = l.concat(Yd.getCellDataArr(n, "text", !1)); else { if (!ba(n)) return Ih.error.v; l.push(n) } if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } return 0 == i.length || 0 == o.length ? Ih.error.d : Math.pow(window.luckysheet_function.PEARSON.f(i, o), 2) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, T_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getCellBoolen(arguments[2]); return ka(n) ? n : r < 1 ? Ih.error.nm : n ? jStat.studentt.cdf(a, r) : jStat.studentt.pdf(a, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, T_DIST_2T: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a < 0 || r < 1 ? Ih.error.nm : 2 * (1 - jStat.studentt.cdf(a, r))) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, T_DIST_RT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r)) < 1 ? Ih.error.nm : 1 - jStat.studentt.cdf(a, r) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, T_INV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a <= 0 || a > 1 || r < 1 ? Ih.error.nm : jStat.studentt.inv(a, r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, T_INV_2T: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a <= 0 || a > 1 || r < 1 ? Ih.error.nm : Math.abs(jStat.studentt.inv(a / 2, r))) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, T_TEST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !1)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "text", !1)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = a, n = []; if ("array" == Cm(arguments[1])) { if ("array" == Cm(arguments[1][0]) && !Yd.isDyadicArr(arguments[1])) return Ih.error.v; n = n.concat(Yd.getDataArr(arguments[1], !1)) } else if ("object" == Cm(arguments[1]) && null != arguments[1].startCell) n = n.concat(Yd.getCellDataArr(arguments[1], "text", !1)); else { if (!ba(arguments[1])) return Ih.error.v; n.push(arguments[1]) } var l = n, i = Yd.getFirstValue(arguments[2]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = Yd.getFirstValue(arguments[3]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; if (o = parseInt(o), -1 == [1, 2].indexOf(i)) return Ih.error.nm; if (-1 == [1, 2, 3].indexOf(o)) return Ih.error.nm; var s = null, c = null; if (1 == o) { var u = []; for (e = 0; e < r.length; e++)u.push(r[e] - l[e]); var d = Math.abs(jStat.mean(u)), h = Yd.standardDeviation_s(u); s = d / (h / Math.sqrt(r.length)), c = r.length - 1 } else { var m = jStat.mean(r), p = jStat.mean(l), f = Yd.variance_s(r), g = Yd.variance_s(l); switch (s = Math.abs(m - p) / Math.sqrt(f / r.length + g / l.length), o) { case 2: c = r.length + l.length - 2; break; case 3: c = Math.pow(f / r.length + g / l.length, 2) / (Math.pow(f / r.length, 2) / (r.length - 1) + Math.pow(g / l.length, 2) / (l.length - 1)) } } if (1 == i) var v = window.luckysheet_function.T_DIST_RT.f(s, c); else if (2 == i) v = window.luckysheet_function.T_DIST_2T.f(s, c); return v } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, F_DIST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = Yd.getCellBoolen(arguments[3]); return ka(l) ? l : a < 0 || r < 1 || n < 1 ? Ih.error.nm : l ? jStat.centralF.cdf(a, r, n) : jStat.centralF.pdf(a, r, n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, F_DIST_RT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseInt(n), a < 0 || r < 1 || n < 1 ? Ih.error.nm : 1 - jStat.centralF.cdf(a, r, n)) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, VAR_P: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } if (0 == n.length) return Ih.error.d; var i = n.length, o = 0, s = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, n); for (e = 0; e < i; e++)o += Math.pow(n[e] - s, 2); return o / i } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, VAR_S: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } if (0 == n.length) return Ih.error.d; var i = n.length, o = 0, s = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, n); for (e = 0; e < i; e++)o += Math.pow(n[e] - s, 2); return o / (i - 1) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, VARA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if ("true" == l.toString.toLowerCase()) a.push(1); else if ("false" == l.toString.toLowerCase()) a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) ? n.push(parseFloat(l)) : "true" == l.toString().toLowerCase() ? n.push(1) : n.push(0) } var i = n.length, o = 0, s = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, n); for (e = 0; e < i; e++)o += Math.pow(n[e] - s, 2); return o / (i - 1) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, VARPA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !1)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else if ("true" == l.toString.toLowerCase()) a.push(1); else if ("false" == l.toString.toLowerCase()) a.push(0); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) ? n.push(parseFloat(l)) : "true" == l.toString().toLowerCase() ? n.push(1) : n.push(0) } var i = n.length, o = 0, s = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, n); for (e = 0; e < i; e++)o += Math.pow(n[e] - s, 2); return o / i } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, STEYX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !1)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "text", !1)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = []; if ("array" == Cm(arguments[1])) { if ("array" == Cm(arguments[1][0]) && !Yd.isDyadicArr(arguments[1])) return Ih.error.v; r = r.concat(Yd.getDataArr(arguments[1], !1)) } else if ("object" == Cm(arguments[1]) && null != arguments[1].startCell) r = r.concat(Yd.getCellDataArr(arguments[1], "text", !1)); else { if (!ba(arguments[1])) return Ih.error.v; r.push(arguments[1]) } if (a.length != r.length) return Ih.error.na; var n = [], l = []; for (e = 0; e < a.length; e++) { var i = a[e], o = r[e]; ba(i) && ba(o) && (n.push(parseFloat(i)), l.push(parseFloat(o))) } if (n.length < 3 || l.length < 3) return Ih.error.d; var s = jStat.mean(l), c = jStat.mean(n), u = l.length, d = 0, h = 0, m = 0; for (e = 0; e < u; e++)d += Math.pow(n[e] - c, 2), h += (l[e] - s) * (n[e] - c), m += Math.pow(l[e] - s, 2); return Math.sqrt((d - h * h / m) / (u - 2)) } catch (e) { var p = e; return p = Ih.errorInfo(p), [Ih.error.v, p] } }, STANDARDIZE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseFloat(n)) <= 0 ? Ih.error.nm : (a - r) / n : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, SMALL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !0)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "number", !0)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = []; for (e = 0; e < a.length; e++) { var n = a[e]; ba(n) && r.push(parseFloat(n)) } var l = Yd.getFirstValue(arguments[1]); return ka(l) ? l : ba(l) ? (l = parseInt(l), 0 == r.length || l <= 0 || l > r.length ? Ih.error.nm : r.sort((function (e, t) { return e - t }))[l - 1]) : Ih.error.v } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, SLOPE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; if ("array" == Cm(arguments[0])) { if ("array" == Cm(arguments[0][0]) && !Yd.isDyadicArr(arguments[0])) return Ih.error.v; a = a.concat(Yd.getDataArr(arguments[0], !1)) } else if ("object" == Cm(arguments[0]) && null != arguments[0].startCell) a = a.concat(Yd.getCellDataArr(arguments[0], "text", !1)); else { if (!ba(arguments[0])) return Ih.error.v; a.push(arguments[0]) } var r = []; if ("array" == Cm(arguments[1])) { if ("array" == Cm(arguments[1][0]) && !Yd.isDyadicArr(arguments[1])) return Ih.error.v; r = r.concat(Yd.getDataArr(arguments[1], !1)) } else if ("object" == Cm(arguments[1]) && null != arguments[1].startCell) r = r.concat(Yd.getCellDataArr(arguments[1], "text", !1)); else { if (!ba(arguments[1])) return Ih.error.v; r.push(arguments[1]) } if (a.length != r.length) return Ih.error.na; var n = [], l = []; for (e = 0; e < a.length; e++) { var i = a[e], o = r[e]; ba(i) && ba(o) && (n.push(parseFloat(i)), l.push(parseFloat(o))) } if (n.length < 3 || l.length < 3) return Ih.error.d; var s = jStat.mean(l), c = jStat.mean(n), u = l.length, d = 0, h = 0; for (e = 0; e < u; e++)d += (l[e] - s) * (n[e] - c), h += Math.pow(l[e] - s, 2); return d / h } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, SKEW: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } if (n.length < 3 || 0 == Yd.standardDeviation_s(n)) return Ih.error.d; var i = jStat.mean(n), o = n.length, s = 0; for (e = 0; e < o; e++)s += Math.pow(n[e] - i, 3); return o * s / ((o - 1) * (o - 2) * Math.pow(jStat.stdev(n, !0), 3)) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, SKEW_P: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = []; for (e = 0; e < arguments.length; e++) { var r = arguments[e]; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; a = a.concat(Yd.getDataArr(r, !0)) } else if ("object" == Cm(r) && null != r.startCell) a = a.concat(Yd.getCellDataArr(r, "number", !0)); else { if (!ba(r)) return Ih.error.v; a.push(r) } } var n = []; for (e = 0; e < a.length; e++) { var l = a[e]; ba(l) && n.push(parseFloat(l)) } if (n.length < 3 || 0 == Yd.standardDeviation_s(n)) return Ih.error.d; var i = jStat.mean(n), o = n.length, s = 0, c = 0; for (e = 0; e < o; e++)c += Math.pow(n[e] - i, 3), s += Math.pow(n[e] - i, 2); return s /= o, (c /= o) / Math.pow(s, 1.5) } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, ADDRESS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = 1; if (arguments.length >= 3) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } var l, i = !0; if (arguments.length >= 4 && ka(i = Yd.getCellBoolen(arguments[3]))) return i; if (a <= 0 || r <= 0) return Ih.error.v; if (-1 == [1, 2, 3, 4].indexOf(n)) return Ih.error.v; if (i) switch (r = Im(r - 1), n) { case 1: l = "$" + r + "$" + a; break; case 2: l = r + "$" + a; break; case 3: l = "$" + r + a; break; case 4: l = r + a } else switch (n) { case 1: l = "R" + a + "C" + r; break; case 2: l = "R" + a + "C[" + r + "]"; break; case 3: l = "R[" + a + "]C" + r; break; case 4: l = "R[" + a + "]C[" + r + "]" }if (5 == arguments.length) { var o = Yd.getFirstValue(arguments[4]); return ka(o) ? o : o + "!" + l } return l } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, INDIRECT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = !0; if (2 == arguments.length && ka(r = Yd.getCellBoolen(arguments[1]))) return r; var n = Tl(), l = _l(ga.calculateSheetIndex), i = n[l], o = i.data; if (Ih.iscelldata(a)) { var s = Ih.getcellrange(a), c = s.row[0], u = s.column[0]; if (c < 0 || c >= o.length || u < 0 || u >= o[0].length) return Ih.error.r; if (null == o[c][u] || ya(o[c][u].v)) return 0; var d = o[c][u].v; if (null != Ih.execFunctionGlobalData) { var h = Ih.execFunctionGlobalData[c + "_" + u + "_" + ga.calculateSheetIndex]; null != h && (d = h.v) } var m = { sheetName: i.name, startCell: a, rowl: c, coll: u, data: d }; return m } return Ih.error.r } catch (e) { var p = e; return p = Ih.errorInfo(p), [Ih.error.v, p] } }, ROW: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { if (1 == arguments.length) { var a; if ("array" == Cm(arguments[0])) return Ih.error.v; if (a = "object" == Cm(arguments[0]) && null != arguments[0].startCell ? arguments[0].startCell : arguments[0], Ih.iscelldata(a)) { var r = Ih.getcellrange(a); return r.row[0] + 1 } return Ih.error.v } return window.luckysheetCurrentRow + 1 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ROWS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return "array" == Cm(arguments[0]) ? "array" == Cm(arguments[0][0]) ? arguments[0].length : 1 : "object" == Cm(arguments[0]) && null != arguments[0].startCell ? arguments[0].rowl : 1 } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, COLUMN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { if (1 == arguments.length) { var a; if ("array" == Cm(arguments[0])) return Ih.error.v; if (a = "object" == Cm(arguments[0]) && null != arguments[0].startCell ? arguments[0].startCell : arguments[0], Ih.iscelldata(a)) { var r = Ih.getcellrange(a); return r.column[0] + 1 } return Ih.error.v } return window.luckysheetCurrentColumn + 1 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, COLUMNS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return "array" == Cm(arguments[0]) ? "array" == Cm(arguments[0][0]) ? arguments[0][0].length : arguments[0].length : "object" == Cm(arguments[0]) && null != arguments[0].startCell ? arguments[0].coll : 1 } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, OFFSET: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { if ("object" != Cm(arguments[0]) || null == arguments[0].startCell) return Ih.error.v; var a = arguments[0].startCell, r = arguments[0].sheetName, n = Yd.getFirstValue(arguments[1]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = Yd.getFirstValue(arguments[2]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = arguments[0].rowl; if (arguments.length >= 4) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } var o = arguments[0].coll; if (5 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[4]))) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o) } if (i < 1 || o < 1) return Ih.error.r; var s = Ih.getcellrange(a), c = s.row[0], u = s.column[0], d = (c += n) + i - 1, h = (u += l) + o - 1, m = Tl(), p = _l(ga.calculateSheetIndex), f = m[p].data; if (c < 0 || d >= f.length || u < 0 || h >= f[0].length) return Ih.error.r; for (var g = [], v = c; v <= d; v++) { for (var y = [], b = u; b <= h; b++)if (null != Ih.execFunctionGlobalData && null != Ih.execFunctionGlobalData[v + "_" + b + "_" + ga.calculateSheetIndex]) { var k = Ih.execFunctionGlobalData[v + "_" + b + "_" + ga.calculateSheetIndex]; null != k ? y.push(k.v) : y.push(0) } else null == f[v][b] || ya(f[v][b].v) ? y.push(0) : y.push(f[v][b].v); g.push(y) } var x = { sheetName: r, startCell: Cl(ga.calculateSheetIndex, { row: [c, d], column: [u, h] }), rowl: c, coll: u, data: g }; return x } catch (e) { var w = e; return w = Ih.errorInfo(w), [Ih.error.v, w] } }, MATCH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0])) return Yd.isDyadicArr(r) ? Ih.error.na : Ih.error.v; for (e = 0; e < r.length; e++)n.push(r[e]) } else if ("object" == Cm(r) && null != r.startCell) { if (r.rowl > 1 && r.coll > 1) return Ih.error.na; if (null != r.data) if ("array" == Cm(r.data)) for (e = 0; e < r.data.length; e++)for (var l = 0; l < r.data[e].length; l++)null == r.data[e][l] || ya(r.data[e][l].v) || n.push(r.data[e][l].v); else n.push(r.data.v) } var i, o, s = 1; if (3 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[2]))) return s; if (!ba(s)) return Ih.error.v; s = Math.ceil(parseFloat(s)) } if (-1 == [-1, 0, 1].indexOf(s)) return Ih.error.na; for (var c = 0; c < n.length; c++)if (1 === s) { if (n[c] === a) return c + 1; n[c] < a && (o ? n[c] > o && (i = c + 1, o = n[c]) : (i = c + 1, o = n[c])) } else if (0 === s) { if ("string" == typeof a) { if (a = a.replace(/\?/g, "."), n[c].toLowerCase().match(a.toLowerCase())) return c + 1 } else if (n[c] === a) return c + 1 } else if (-1 === s) { if (n[c] === a) return c + 1; n[c] > a && (o ? n[c] < o && (i = c + 1, o = n[c]) : (i = c + 1, o = n[c])) } return i || Ih.error.na } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, VLOOKUP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; if ("" == a.toString().replace(/\s/g, "")) return Ih.error.na; var r = arguments[1], n = []; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; for (e = 0; e < r.length; e++) { for (var l = [], i = 0; i < r[e].length; i++)l.push(r[e][i]); n.push(l) } } else { for (l = [], e = 0; e < r.length; e++)l.push(r[e]); n.push(l) } else { if ("object" != Cm(r) || null == r.startCell) return Ih.error.v; n = Yd.getCellDataDyadicArr(r, "text") } var o = Yd.getFirstValue(arguments[2]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o); var s = !0; if (4 == arguments.length && ka(s = Yd.getCellBoolen(arguments[3]))) return s; if (o < 1) return Ih.error.v; if (o > n[0].length) return Ih.error.r; if (!s) { var c = null; for (u = 0; u < n.length; u++)if (a.toString() == n[u][0].toString()) { c = u; break } return null == c ? Ih.error.na : n[c][o - 1] } n = ku(n, 0, !0); for (var u = 0; u < n.length; u++) { var d, h = n[u][0]; if (ds(a) && ds(h) ? d = hs(a, h) : ba(a) && ba(h) ? d = fs(a).value() - fs(h).value() : ba(a) || ba(h) ? ba(a) ? ba(h) || (d = -1) : d = 1 : d = a.localeCompare(h, "zh"), d < 0) return 0 == u ? Ih.error.na : n[u - 1][o - 1]; if (u == n.length - 1) return n[u][o - 1] } } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, HLOOKUP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { window.luckysheetCurrentRow, window.luckysheetCurrentColumn; var a = arguments[0]; "object" == Sa(a) && ("array" == Cm(a = arguments[0].data) ? "array" == Cm(a = a[r]) && (a = a[s]) : a = a.v); var n = arguments[1].data, l = arguments[2], i = !1; if (arguments.length > 3 && (i = !!arguments[3]), l > n.rowl) return [Ih.error.v, "索引超过了范围的长度," + n[0].length]; if (l < 1) return [Ih.error.v, "索引必须大于1"]; for (var o = Ih.error.na, s = 0; s < n[0].length; s++) { var c = Ko(0, s, n), u = Ko(l - 1, s, n); if (i) c.indexOf(a) > -1 && (o = u); else if (Ih.acompareb(c, a)) return o = u } return o } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, LOOKUP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { window.luckysheetCurrentRow, window.luckysheetCurrentColumn; var a = arguments[0]; "object" == Sa(a) && ("array" == Cm(a = arguments[0].data) ? "array" == Cm(a = a[r]) && (a = a[c]) : a = a.v); var n, l = arguments[1].data, i = Ih.error.na; function o(e, t) { return t - e } if (l = Ih.getRangeArray(l)[0], arguments[2] && (n = arguments[2].data, n = Ih.getRangeArray(n)[0]), "string" == typeof a) for (e = 0; e < l.length; e++) { var s = l[e]; arguments[2] ? (d = n[e], s == a && (i = d)) : Ih.acompareb(s, a) && (i = s) } else if ("num" == ps(a)) { var u = []; for (e = 0; e < l.length; e++) { var d; s = l[e]; if (arguments[2]) { if (d = n[e], s == a) return i = d; s != a && "num" == ps(s) && u.push(s) } else { if (s == a) return i = s; s != a && "num" == ps(s) && u.push(s) } } if (0 != u.length) { u.push(a), u.sort(o); var h = u.indexOf(a); if (h == u.length - 1) return [Ih.error.na, "找不到对应参数"]; var m = u[h + 1]; i = arguments[2] ? n[e = l.indexOf(m)] : m } } return i } catch (e) { var p = e; return p = Ih.errorInfo(p), [Ih.error.v, p] } }, INDEX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = [], n = !1; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else "object" == Cm(a) && null != a.startCell && (r = Yd.getCellDataDyadicArr(a, "number"), n = !0); var l = r.length, i = r[0].length, o = Yd.getFirstValue(arguments[1]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o); var s = Yd.getFirstValue(arguments[2]); if (ka(s)) return s; if (o < 0 || ba(s) && s < 0) return Ih.error.v; if (o > l || ba(s) && s > i) return Ih.error.r; if (n) { var c = Ih.getcellrange(a.startCell), u = c.row[0], d = c.column[0], h = r; 0 == o || 0 == s ? (0 == o ? (h = r[0], o = 1) : h = r[o - 1], ba(s) ? 0 == s ? (h = h[0], s = 1) : h = h[s - 1] : s = 1) : (ba(o) || (o = 1), ba(s) || (s = 1), h = r[o - 1][s - 1]); var m = u + o - 1, p = d + s - 1, f = { sheetName: a.sheetName, startCell: Cl(ga.calculateSheetIndex, { row: [m, m], column: [p, p] }), rowl: m, coll: p, data: h }; return f } return ba(s) ? (s = parseInt(s), o <= 0 || s <= 0 ? Ih.error.v : r[o - 1][s - 1]) : Ih.error.v } catch (e) { var g = e; return g = Ih.errorInfo(g), [Ih.error.v, g] } }, GETPIVOTDATA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return Ih.error.v } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, CHOOSE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; if ((a = parseInt(a)) < 1 || a > arguments.length - 1) return Ih.error.v; var r = arguments[a]; if ("array" == Cm(r)) return "array" != Cm(r[0]) || Yd.isDyadicArr(r) ? r : Ih.error.v; if ("object" == Cm(r) && null != r.startCell) { if (null == r.data) return 0; if ("array" == Cm(r.data)) { var n = Yd.getCellDataDyadicArr(r.data, "number"); return n } return ya(r.data.v) ? 0 : r.data.v } return r } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, HYPERLINK: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return Ih.error.v } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, TIME: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; if (n = parseInt(n), a < 0 || a > 32767) return Ih.error.nm; if (a > 24 && (a %= 24), r < 0 || r > 32767) return Ih.error.nm; if (n < 0 || n > 32767) return Ih.error.nm; var l = us().set({ hour: a, minute: r, second: n }); return us(l).format("h:mm:ss a") } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, TIMEVALUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); return ka(a) ? a : us(a).isValid() ? (3600 * us(a).get("hour") + 60 * us(a).get("minute") + us(a).get("second")) / 86400 : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, EOMONTH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if (r = parseInt(r), !us(a).isValid()) return Ih.error.v; var n = us(a).add(r + 1, "months").set("date", 1).subtract(1, "days"), l = xs(us(n).format("YYYY-MM-DD H:mm:ss")), i = l[2]; return i } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, EDATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if (r = parseInt(r), !us(a).isValid()) return Ih.error.v; var n = us(a).add(r, "months"), l = xs(us(n).format("YYYY-MM-DD h:mm:ss")), i = l[2]; return i } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, SECOND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = us(a).seconds(); return r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, MINUTE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = us(a).minutes(); return r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, HOUR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = us(a).hours(); return r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, NOW: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return us().format("YYYY-M-D HH:mm") } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, NETWORKDAYS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { if (3 == arguments.length) var a = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1, arguments[2]); else a = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1); return a } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, NETWORKDAYS_INTL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = [[], [6, 0], [0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], void 0, void 0, void 0, [0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]], r = Yd.getCellDate(arguments[0]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getCellDate(arguments[1]); if (ka(n)) return n; if (!us(n).isValid()) return Ih.error.v; var l = a[1]; if (arguments.length >= 3) if ("string" == typeof (l = arguments[2]) && "7" == l.length && /^[0-1]{7}$/g.test(l)); else { if (ka(l = Yd.getFirstValue(arguments[2]))) return l; if (!ba(l)) return Ih.error.v; if ((l = parseInt(l)) < 1 || l > 7 && l < 11 || l > 17) return Ih.error.nm; l = a[l] } var i = []; if (4 == arguments.length && ka(i = Yd.getCellrangeDate(arguments[3]))) return i; for (e = 0; e < i.length; e++)if (!us(i[e]).isValid()) return Ih.error.v; var o = us(n).diff(us(r), "days") + 1, s = o, c = us(r); for (e = 0; e < o; e++) { var u = us(c).weekday(), d = !1; "array" == Cm(l) ? u !== l[0] && u !== l[1] || (d = !0) : (0 == u && (u = 7), "0" == l.charAt(u - 1) && (d = !0)); for (var h = 0; h < i.length; h++)if (0 === us(c).diff(us(i[h]), "days")) { d = !0; break } d && s--, c = us(c).add(1, "days") } return s } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, ISOWEEKNUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); return ka(a) ? a : us(a).isValid() ? us(a).isoWeeks() : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, WEEKNUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = [void 0, 7, 1, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, 1, 2, 3, 4, 5, 6, 7], r = Yd.getCellDate(arguments[0]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = 1; if (2 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[1]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } if (21 == n) return window.luckysheet_function.ISOWEEKNUM.f(arguments[0]); if (-1 == [1, 2, 11, 12, 13, 14, 15, 16, 17].indexOf(n)) return Ih.error.nm; var l = a[n], i = us(r).isoWeekday() >= l ? 1 : 0, o = us(r).isoWeeks() + i; return o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, WEEKDAY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = [[], [1, 2, 3, 4, 5, 6, 7], [7, 1, 2, 3, 4, 5, 6], [6, 0, 1, 2, 3, 4, 5], [], [], [], [], [], [], [], [7, 1, 2, 3, 4, 5, 6], [6, 7, 1, 2, 3, 4, 5], [5, 6, 7, 1, 2, 3, 4], [4, 5, 6, 7, 1, 2, 3], [3, 4, 5, 6, 7, 1, 2], [2, 3, 4, 5, 6, 7, 1], [1, 2, 3, 4, 5, 6, 7]], r = Yd.getCellDate(arguments[0]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = 1; if (2 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[1]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } if (-1 == [1, 2, 3, 11, 12, 13, 14, 15, 16, 17].indexOf(n)) return Ih.error.nm; var l = a[n][us(r).day()]; return l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, DAY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); return ka(a) ? a : us(a).isValid() ? us(a).date() : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, DAYS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = us(a).diff(us(r), "days"); return n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DAYS360: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = !1; if (3 == arguments.length && ka(n = Yd.getCellBoolen(arguments[2]))) return n; var l, i, o = us(a).month(), s = us(r).month(); if (n) l = 31 === us(a).date() ? 30 : us(a).date(), i = 31 === us(r).date() ? 30 : us(r).date(); else { var c = us().set({ year: us(a).year(), month: o + 1, date: 0 }).date(), u = us().set({ year: us(r).year(), month: s + 1, date: 0 }).date(); l = us(a).date() === c ? 30 : us(a).date(), us(r).date() === u ? l < 30 ? (s++, i = 1) : i = 30 : i = us(r).date() } var d = 360 * us(r).diff(us(a), "years") + 30 * (s - o) + (i - l); return d } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, DATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; if (n = parseInt(n), a < 0 || a >= 1e4) return Ih.error.nm; a >= 0 && a <= 1899 && (a += 1900); var l = us().set({ year: a, month: r - 1, date: n }); return us(l).year() < 1900 ? Ih.error.nm : us(l).format("YYYY-MM-DD") } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, DATEVALUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = xs(a = us(a).format("YYYY-MM-DD"))[2]; return r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DATEDIF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { ah(arguments); for (e = 0; e < arguments.length - 1; e++)if (arguments[e] = moment.fromOADate(arguments[e]).format("l"), !ds(arguments[e])) return Ih.error.v; var a = us(arguments[0]), r = us(arguments[1]), n = arguments[2], l = Ih.error.v; if (window.luckysheet_function.DAYS.f(r, a) < 0) return Ih.error.v; switch (n) { case "Y": case "y": l = r.diff(a, "years", !1); break; case "M": case "m": l = r.diff(a, "months", !1); break; case "D": case "d": l = r.diff(a, "days", !1); break; case "MD": case "md": l = r.format("DD") - a.format("DD"); break; case "YM": case "ym": l = (i = parseInt(a.format("M"))) <= (o = parseInt(r.format("M"))) ? o - i : o + 12 - i; break; case "YD": case "yd": var i, o; l = (i = xs(a.format("MM-DD"))[2]) <= (o = xs(r.format("MM-DD"))[2]) ? o - i : o + 365 - i; break; default: l = Ih.error.v }return l } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, WORKDAY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { if (3 == arguments.length) var a = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1, arguments[2]); else a = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1); return a } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, WORKDAY_INTL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = [[], [6, 0], [0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], void 0, void 0, void 0, [0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]], r = Yd.getCellDate(arguments[0]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[1]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = a[1]; if (arguments.length >= 3) if ("string" == typeof (l = arguments[2]) && "7" == l.length && /^[0-1]{7}$/g.test(l)); else { if (ka(l = Yd.getFirstValue(arguments[2]))) return l; if (!ba(l)) return Ih.error.v; if ((l = parseInt(l)) < 1 || l > 7 && l < 11 || l > 17) return Ih.error.nm; l = a[l] } var i = []; if (4 == arguments.length && ka(i = Yd.getCellrangeDate(arguments[3]))) return i; for (e = 0; e < i.length; e++)if (!us(i[e]).isValid()) return Ih.error.v; for (var o = 0; o < n;) { r = us(r).add(1, "days"); var s = us(r).weekday(); if (Cm(l)) { if (s === l[0] || s === l[1]) continue } else if (0 == s && (s = 7), "0" == l.charAt(s - 1)) continue; for (var c = 0; c < i.length; c++)if (0 === us(r).diff(us(i[c]), "days")) { o--; break } o++ } return us(r).format("YYYY-MM-DD") } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, YEAR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); return ka(a) ? a : us(a).isValid() ? us(a).year() : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, YEARFRAC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = 0; if (3 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } if (n < 0 || n > 4) return Ih.error.nm; var l, i = us(a).date(), o = us(a).month() + 1, s = us(a).year(), c = us(r).date(), u = us(r).month() + 1, d = us(r).year(); switch (n) { case 0: 31 === i && 31 === c ? (i = 30, c = 30) : 31 === i ? i = 30 : 30 === i && 31 === c && (c = 30), l = (c + 30 * u + 360 * d - (i + 30 * o + 360 * s)) / 360; break; case 1: var h = 365; if (s === d || s + 1 === d && (o > u || o === u && i >= c)) return (s === d && Yd.isLeapYear(s) || Yd.feb29Between(a, r) || 1 === u && 29 === c) && (h = 366), us(r).diff(us(a), "days") / h; var m = d - s + 1, p = (us().set({ year: d + 1, month: 0, date: 1 }) - us().set({ year: s, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, f = p / m; l = us(r).diff(us(a), "days") / f; break; case 2: l = us(r).diff(us(a), "days") / 360; break; case 3: l = us(r).diff(us(a), "days") / 365; break; case 4: l = (c + 30 * u + 360 * d - (i + 30 * o + 360 * s)) / 360 }return l } catch (e) { var g = e; return g = Ih.errorInfo(g), [Ih.error.v, g] } }, TODAY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return us().format("YYYY-MM-DD") } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, MONTH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); return ka(a) ? a : us(a).isValid() ? us(a).month() + 1 : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, EFFECT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a <= 0 || r < 1 ? Ih.error.nm : Math.pow(1 + a / r, r) - 1) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DOLLAR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = 2; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } r > 9 && (r = 9); for (e = 1; e <= r; e++)"0"; var n = a > 0 ? 1 : -1; return n * Math.floor(Math.abs(a) * Math.pow(10, r)) / Math.pow(10, r) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DOLLARDE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if ((r = parseInt(r)) < 0) return Ih.error.nm; if (0 == r) return Ih.error.d; var n = parseInt(a, 10); n += a % 1 * Math.pow(10, Math.ceil(Math.log(r) / Math.LN10)) / r; var l = Math.pow(10, Math.ceil(Math.log(r) / Math.LN2) + 1); return n = Math.round(n * l) / l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, DOLLARFR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; if ((r = parseInt(r)) < 0) return Ih.error.nm; if (0 == r) return Ih.error.d; var n = parseInt(a, 10); return n += a % 1 * Math.pow(10, -Math.ceil(Math.log(r) / Math.LN10)) * r } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = 12; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (a < 0 || r < 0 || n < 0 || l < 0) return Ih.error.nm; if (i < 1 || i > 12) return Ih.error.nm; if (l > n) return Ih.error.nm; if (r >= a) return 0; var o = (1 - Math.pow(r / a, 1 / n)).toFixed(3), s = a * o * i / 12, c = s, u = 0, d = l === n ? n - 1 : l; for (e = 2; e <= d; e++)c += u = (a - c) * o; if (1 === l) var h = s; else if (l === n) h = (a - c) * o; else h = u; return h } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, DDB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = 2; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } if (a < 0 || r < 0 || n < 0 || l < 0 || i <= 0) return Ih.error.nm; if (l > n) return Ih.error.nm; if (r >= a) return 0; var o = 0, s = 0; for (e = 1; e <= l; e++)o += s = Math.min(i / n * (a - o), a - r - o); return s } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, RATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = 0; if (arguments.length >= 4) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } var i = 0; if (arguments.length >= 5) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } var o = .1; if (6 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } if (0 != i && 1 != i) return Ih.error.nm; for (var s = 1e-6, c = 100, u = 0, d = !1, h = o; u < c && !d;) { var m = Math.pow(h + 1, a), p = Math.pow(h + 1, a - 1), f = l + m * n + r * (m - 1) * (h * i + 1) / h, g = a * p * n - r * (m - 1) * (h * i + 1) / Math.pow(h, 2), v = a * r * p * (h * i + 1) / h + r * (m - 1) * i / h, y = h - f / (g + v); Math.abs(y - h) < s && (d = !0), u++, h = y } return d ? h : Ih.error.nm } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, CUMPRINC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = Yd.getFirstValue(arguments[5]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; if (o = parseFloat(o), a <= 0 || r <= 0 || n <= 0) return Ih.error.nm; if (l < 1 || i < 1 || l > i) return Ih.error.nm; if (0 != o && 1 != o) return Ih.error.nm; var s = window.luckysheet_function.PMT.f(a, r, n, 0, o), c = 0; 1 === l && (c = 0 === o ? s + n * a : s, l++); for (e = l; e <= i; e++)c += o > 0 ? s - (window.luckysheet_function.FV.f(a, e - 2, s, n, 1) - s) * a : s - window.luckysheet_function.FV.f(a, e - 1, s, n, 0) * a; return c } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, COUPNUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = 0; if (4 == arguments.length) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (l < 0 || l > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var i, o = us(a).date(), s = us(a).month() + 1, c = us(a).year(), u = us(r).date(), d = us(r).month() + 1, h = us(r).year(); switch (l) { case 0: 31 === o && 31 === u ? (o = 30, u = 30) : 31 === o ? o = 30 : 30 === o && 31 === u && (u = 30), i = (u + 30 * d + 360 * h - (o + 30 * s + 360 * c)) / (360 / n); break; case 1: var m = 365; if (c === h || c + 1 === h && (s > d || s === d && o >= u)) return (c === h && Yd.isLeapYear(c) || Yd.feb29Between(a, r) || 1 === d && 29 === u) && (m = 366), us(r).diff(us(a), "days") / (m / n); var p = h - c + 1, f = (us().set({ year: h + 1, month: 0, date: 1 }) - us().set({ year: c, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, g = f / p; i = us(r).diff(us(a), "days") / (g / n); break; case 2: i = us(r).diff(us(a), "days") / (360 / n); break; case 3: i = us(r).diff(us(a), "days") / (365 / n); break; case 4: i = (u + 30 * d + 360 * h - (o + 30 * s + 360 * c)) / (360 / n) }return Math.round(i) } catch (e) { var v = e; return v = Ih.errorInfo(v), [Ih.error.v, v] } }, SYD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); return ka(l) ? l : ba(l) ? (l = parseInt(l), 0 == n || l < 1 || l > n ? Ih.error.nm : (a - r) * (n - l + 1) * 2 / (n * (n + 1))) : Ih.error.v } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, TBILLEQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseFloat(n)) <= 0 || us(a) - us(r) > 0 || us(r) - us(a) > 31536e6 ? Ih.error.nm : 365 * n / (360 - n * us(r).diff(us(a), "days")) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, TBILLYIELD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseFloat(n)) <= 0 || us(a) - us(r) >= 0 || us(r) - us(a) > 31536e6 ? Ih.error.nm : (100 - n) / n * (360 / us(r).diff(us(a), "days")) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, TBILLPRICE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseFloat(n)) <= 0 || us(a) - us(r) > 0 || us(r) - us(a) > 31536e6 ? Ih.error.nm : 100 * (1 - n * us(r).diff(us(a), "days") / 360) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, PV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = 0; if (arguments.length >= 4) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } var i = 0; if (arguments.length >= 5) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } if (0 != i && 1 != i) return Ih.error.nm; if (0 === a) var o = -n * r - l; else o = ((1 - Math.pow(1 + a, r)) / a * n * (1 + a * i) - l) / Math.pow(1 + a, r); return o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, ACCRINT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getCellDate(arguments[2]); if (ka(n)) return n; if (!us(n).isValid()) return Ih.error.v; var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i); var o = Yd.getFirstValue(arguments[5]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o); var s = 0; if (arguments.length >= 7) { if (ka(s = Yd.getFirstValue(arguments[6]))) return s; if (!ba(s)) return Ih.error.v; s = parseInt(s) } var c, u = !0; if (8 == arguments.length && ka(u = Yd.getCellBoolen(arguments[7]))) return u; if (l <= 0 || i <= 0) return Ih.error.nm; if (1 != o && 2 != o && 4 != o) return Ih.error.nm; if (s < 0 || s > 4) return Ih.error.nm; if (us(a) - us(n) >= 0) return Ih.error.nm; if (us(n) - us(r) >= 0 && !u) { var d = us(r).date(), h = us(r).month() + 1, m = us(r).year(), p = us(n).date(), f = us(n).month() + 1, g = us(n).year(); switch (s) { case 0: 31 === d && 31 === p ? (d = 30, p = 30) : 31 === d ? d = 30 : 30 === d && 31 === p && (p = 30), c = (p + 30 * f + 360 * g - (d + 30 * h + 360 * m)) / 360; break; case 1: var v = 365; if (m === g || m + 1 === g && (h > f || h === f && d >= p)) return (m === g && Yd.isLeapYear(m) || Yd.feb29Between(r, n) || 1 === f && 29 === p) && (v = 366), us(n).diff(us(r), "days") / v; var y = g - m + 1, b = (us().set({ year: g + 1, month: 0, date: 1 }) - us().set({ year: m, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24 / y; c = us(n).diff(us(r), "days") / b; break; case 2: c = us(n).diff(us(r), "days") / 360; break; case 3: c = us(n).diff(us(r), "days") / 365; break; case 4: c = (p + 30 * f + 360 * g - (d + 30 * h + 360 * m)) / 360 } } else { d = us(a).date(), h = us(a).month() + 1, m = us(a).year(), p = us(n).date(), f = us(n).month() + 1, g = us(n).year(); switch (s) { case 0: 31 === d && 31 === p ? (d = 30, p = 30) : 31 === d ? d = 30 : 30 === d && 31 === p && (p = 30), c = (p + 30 * f + 360 * g - (d + 30 * h + 360 * m)) / 360; break; case 1: v = 365; if (m === g || m + 1 === g && (h > f || h === f && d >= p)) return (m === g && Yd.isLeapYear(m) || Yd.feb29Between(a, n) || 1 === f && 29 === p) && (v = 366), us(n).diff(us(a), "days") / v; y = g - m + 1, b = (us().set({ year: g + 1, month: 0, date: 1 }) - us().set({ year: m, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24 / y; c = us(n).diff(us(a), "days") / b; break; case 2: c = us(n).diff(us(a), "days") / 360; break; case 3: c = us(n).diff(us(a), "days") / 365; break; case 4: c = (p + 30 * f + 360 * g - (d + 30 * h + 360 * m)) / 360 } } return i * l * c } catch (e) { var k = e; return k = Ih.errorInfo(k), [Ih.error.v, k] } }, ACCRINTM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o, s = us(a).date(), c = us(a).month() + 1, u = us(a).year(), d = us(r).date(), h = us(r).month() + 1, m = us(r).year(); switch (i) { case 0: 31 === s && 31 === d ? (s = 30, d = 30) : 31 === s ? s = 30 : 30 === s && 31 === d && (d = 30), o = (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)) / 360; break; case 1: var p = 365; if (u === m || u + 1 === m && (c > h || c === h && s >= d)) return (u === m && Yd.isLeapYear(u) || Yd.feb29Between(a, r) || 1 === h && 29 === d) && (p = 366), us(r).diff(us(a), "days") / p; var f = m - u + 1, g = (us().set({ year: m + 1, month: 0, date: 1 }) - us().set({ year: u, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, v = g / f; o = us(r).diff(us(a), "days") / v; break; case 2: o = us(r).diff(us(a), "days") / 360; break; case 3: o = us(r).diff(us(a), "days") / 365; break; case 4: o = (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)) / 360 }return l * n * o } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, COUPDAYBS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l, i = 0; if (4 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o, s = Math.ceil(us(r).diff(us(a), "months") / (12 / n)) + 1; for (e = 1; e <= s; e++) { var c = us(r).subtract(12 / n * e, "months"); if (c <= us(a)) { l = c; break } } switch (i) { case 0: var u = us(l).date(), d = us(l).month() + 1, h = us(l).year(), m = us(a).date(), p = us(a).month() + 1, f = us(a).year(); 31 === u && 31 === m ? (u = 30, m = 30) : 31 === u ? u = 30 : 30 === u && 31 === m && (m = 30), o = m + 30 * p + 360 * f - (u + 30 * d + 360 * h); break; case 1: case 2: case 3: o = us(a).diff(us(l), "days"); break; case 4: u = us(l).date(), d = us(l).month() + 1, h = us(l).year(); o = (m = us(a).date()) + 30 * (p = us(a).month() + 1) + 360 * (f = us(a).year()) - (u + 30 * d + 360 * h) }return o } catch (e) { var g = e; return g = Ih.errorInfo(g), [Ih.error.v, g] } }, COUPDAYS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l, i = 0; if (4 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; switch (i) { case 0: l = 360 / n; break; case 1: var o = Math.ceil(us(r).diff(us(a), "months") / (12 / n)) + 1; for (e = 1; e <= o; e++) { var s = us(r).subtract(12 / n * e, "months"); if (s <= us(a)) { var c = us(r).subtract(12 / n * (e - 1), "months"); l = us(c).diff(us(s), "days"); break } } break; case 2: l = 360 / n; break; case 3: l = 365 / n; break; case 4: l = 360 / n }return l } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, COUPDAYSNC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l, i = 0; if (4 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o, s = Math.ceil(us(r).diff(us(a), "months") / (12 / n)) + 1; for (e = 1; e <= s; e++) { var c = us(r).subtract(12 / n * e, "months"); if (c <= us(a)) { l = us(r).subtract(12 / n * (e - 1), "months"); break } } switch (i) { case 0: var u = us(a).date(), d = us(a).month() + 1, h = us(a).year(), m = us(l).date(), p = us(l).month() + 1, f = us(l).year(); 31 === u && 31 === m ? (u = 30, m = 30) : 31 === u ? u = 30 : 30 === u && 31 === m && (m = 30), o = m + 30 * p + 360 * f - (u + 30 * d + 360 * h); break; case 1: case 2: case 3: o = us(l).diff(us(a), "days"); break; case 4: u = us(a).date(), d = us(a).month() + 1, h = us(a).year(); o = (m = us(l).date()) + 30 * (p = us(l).month() + 1) + 360 * (f = us(l).year()) - (u + 30 * d + 360 * h) }return o } catch (e) { var g = e; return g = Ih.errorInfo(g), [Ih.error.v, g] } }, COUPNCD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l, i = 0; if (4 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o = Math.ceil(us(r).diff(us(a), "months") / (12 / n)) + 1; for (e = 1; e <= o; e++) { var s = us(r).subtract(12 / n * e, "months"); if (s <= us(a)) { l = us(r).subtract(12 / n * (e - 1), "months"); break } } return us(l).format("YYYY-MM-DD") } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, COUPPCD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l, i = 0; if (4 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[3]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (1 != n && 2 != n && 4 != n) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o = Math.ceil(us(r).diff(us(a), "months") / (12 / n)) + 1; for (e = 1; e <= o; e++) { var s = us(r).subtract(12 / n * e, "months"); if (s <= us(a)) { l = s; break } } return us(l).format("YYYY-MM-DD") } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, FV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = 0; if (arguments.length >= 4) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } var i, o = 0; if (arguments.length >= 5) { if (ka(o = Yd.getFirstValue(arguments[4]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } if (0 != o && 1 != o) return Ih.error.nm; if (0 === a) i = l + n * r; else { var s = Math.pow(1 + a, r); i = 1 === o ? l * s + n * (1 + a) * (s - 1) / a : l * s + n * (s - 1) / a } return -i } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, FVSCHEDULE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "number", !1)) : n.push(r); var l = []; for (e = 0; e < n.length; e++) { var i = n[e]; if (!ba(i)) return Ih.error.v; l.push(parseFloat(i)) } var o = l.length, s = a; for (e = 0; e < o; e++)s *= 1 + l[e]; return s } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, YIELD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i); var o = Yd.getFirstValue(arguments[5]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o); var s = 0; if (7 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[6]))) return s; if (!ba(s)) return Ih.error.v; s = parseInt(s) } if (n < 0) return Ih.error.nm; if (l <= 0 || i <= 0) return Ih.error.nm; if (1 != o && 2 != o && 4 != o) return Ih.error.nm; if (s < 0 || s > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var c = window.luckysheet_function.COUPNUM.f(a, r, o, s); if (c > 1) { var u = 1, d = 0, h = u; for (e = 1; e <= 100; e++) { var m = window.luckysheet_function.PRICE.f(a, r, n, h, i, o, s); if (Math.abs(m - l) < 1e-6) break; m > l ? d = h : u = h, h = (u + d) / 2 } var p = h } else { var f = window.luckysheet_function.COUPDAYSNC.f(a, r, o, s), g = window.luckysheet_function.COUPDAYS.f(a, r, o, s), v = window.luckysheet_function.COUPDAYBS.f(a, r, o, s), y = i / 100 + n / o, b = l / 100 + v / g * (n / o), k = o * g / f; p = (y - b) / b * k } return p } catch (e) { var x = e; return x = Ih.errorInfo(x), [Ih.error.v, x] } }, YIELDDISC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o = window.luckysheet_function.YEARFRAC.f(a, r, i); return (l / n - 1) / o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, NOMINAL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r), a <= 0 || r < 1 ? Ih.error.nm : (Math.pow(a + 1, 1 / r) - 1) * r) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, XIRR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !1)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; if (!ba(l)) return Ih.error.v; n.push(parseFloat(l)) } var i = Yd.getCellrangeDate(arguments[1]); if (ka(i)) return i; for (e = 0; e < i.length; e++)if (!us(i[e]).isValid()) return Ih.error.v; var o = .1; if (3 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[2]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } var s = !1, c = !1; for (e = 0; e < n.length && (n[e] > 0 && (s = !0), n[e] < 0 && (c = !0), !s || !c); e++); if (!s || !c) return Ih.error.nm; if (n.length != i.length) return Ih.error.nm; var u, d, h, m = function (e, t, a) { for (var r = a + 1, n = e[0], l = 1; l < e.length; l++)n += e[l] / Math.pow(r, window.luckysheet_function.DAYS.f(t[l], t[0]) / 365); return n }, p = function (e, t, a) { for (var r = a + 1, n = 0, l = 1; l < e.length; l++) { var i = window.luckysheet_function.DAYS.f(t[l], t[0]) / 365; n -= i * e[l] / Math.pow(r, i + 1) } return n }, f = o, g = 1e-10, v = !0; do { u = f - (h = m(n, i, f)) / p(n, i, f), d = Math.abs(u - f), f = u, v = d > g && Math.abs(h) > g } while (v); return f } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, MIRR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !1)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; if (!ba(l)) return Ih.error.v; n.push(parseFloat(l)) } var i = Yd.getFirstValue(arguments[1]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i); var o = Yd.getFirstValue(arguments[2]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o); var s = n.length, c = [], u = []; for (e = 0; e < s; e++)n[e] < 0 ? c.push(n[e]) : u.push(n[e]); if (0 == c.length || 0 == u.length) return Ih.error.d; var d = -window.luckysheet_function.NPV.f(o, u) * Math.pow(1 + o, s - 1), h = window.luckysheet_function.NPV.f(i, c) * (1 + i); return Math.pow(d / h, 1 / (s - 1)) - 1 } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, IRR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "number", !0)) : r.push(a); var n = []; for (e = 0; e < r.length; e++) { var l = r[e]; if (!ba(l)) return Ih.error.v; n.push(parseFloat(l)) } var i = .1; if (2 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[1]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } var o = [], s = !1, c = !1; for (e = 0; e < r.length; e++)o[e] = 0 === e ? 0 : o[e - 1] + 365, r[e] > 0 && (s = !0), r[e] < 0 && (c = !0); if (!s || !c) return Ih.error.nm; var u, d, h, m = function (e, t, a) { for (var r = a + 1, n = e[0], l = 1; l < e.length; l++)n += e[l] / Math.pow(r, (t[l] - t[0]) / 365); return n }, p = function (e, t, a) { for (var r = a + 1, n = 0, l = 1; l < e.length; l++) { var i = (t[l] - t[0]) / 365; n -= i * e[l] / Math.pow(r, i + 1) } return n }, f = i, g = 1e-10, v = !0; do { u = f - (h = m(n, o, f)) / p(n, o, f), d = Math.abs(u - f), f = u, v = d > g && Math.abs(h) > g } while (v); return f } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, NPV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = []; for (e = 1; e < arguments.length; e++) { var n = arguments[e]; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; r = r.concat(Yd.getDataArr(n, !0)) } else "object" == Cm(n) && null != n.startCell ? r = r.concat(Yd.getCellDataArr(n, "number", !0)) : r.push(n) } var l = []; for (e = 0; e < r.length; e++) { var i = r[e]; ba(i) && l.push(parseFloat(i)) } var o = 0; if (l.length > 0) for (e = 0; e < l.length; e++)o += l[e] / Math.pow(1 + a, e + 1); return o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, XNPV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = arguments[1], n = []; if ("array" == Cm(r)) { if ("array" == Cm(r[0]) && !Yd.isDyadicArr(r)) return Ih.error.v; n = n.concat(Yd.getDataArr(r, !1)) } else "object" == Cm(r) && null != r.startCell ? n = n.concat(Yd.getCellDataArr(r, "number", !1)) : n.push(r); var l = []; for (e = 0; e < n.length; e++) { var i = n[e]; if (!ba(i)) return Ih.error.v; l.push(parseFloat(i)) } var o = Yd.getCellrangeDate(arguments[2]); if (ka(o)) return o; for (e = 0; e < o.length; e++)if (!us(o[e]).isValid()) return Ih.error.v; if (l.length != o.length) return Ih.error.nm; var s = 0; for (e = 0; e < l.length; e++)s += l[e] / Math.pow(1 + a, window.luckysheet_function.DAYS.f(o[e], o[0]) / 365); return s } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, CUMIPMT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = Yd.getFirstValue(arguments[5]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; if (o = parseFloat(o), a <= 0 || r <= 0 || n <= 0) return Ih.error.nm; if (l < 1 || i < 1 || l > i) return Ih.error.nm; if (0 != o && 1 != o) return Ih.error.nm; var s = window.luckysheet_function.PMT.f(a, r, n, 0, o), c = 0; 1 === l && 0 === o && (c = -n, l++); for (e = l; e <= i; e++)c += 1 === o ? window.luckysheet_function.FV.f(a, e - 2, s, n, 1) - s : window.luckysheet_function.FV.f(a, e - 1, s, n, 0); return c *= a } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, PMT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = 0; if (arguments.length >= 4) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } var i, o = 0; if (5 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[4]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } if (0 != o && 1 != o) return Ih.error.nm; if (0 === a) i = (n + l) / r; else { var s = Math.pow(1 + a, r); i = 1 === o ? (l * a / (s - 1) + n * a / (1 - 1 / s)) / (1 + a) : l * a / (s - 1) + n * a / (1 - 1 / s) } return -i } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, IPMT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (arguments.length >= 5) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } var o = 0; if (arguments.length >= 6) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } if (r < 1 || r > n) return Ih.error.nm; if (0 != o && 1 != o) return Ih.error.nm; var s = window.luckysheet_function.PMT.f(a, n, l, i, o), c = (1 === r ? 1 === o ? 0 : -l : 1 === o ? window.luckysheet_function.FV.f(a, r - 2, s, l, 1) - s : window.luckysheet_function.FV.f(a, r - 1, s, l, 0)) * a; return c } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, PPMT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (arguments.length >= 5) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } var o = 0; if (arguments.length >= 6) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseFloat(o) } if (r < 1 || r > n) return Ih.error.nm; if (0 != o && 1 != o) return Ih.error.nm; var s = window.luckysheet_function.PMT.f(a, n, l, i, o), c = window.luckysheet_function.IPMT.f(a, r, n, l, i, o); return s - c } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, INTRATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o, s = us(a).date(), c = us(a).month() + 1, u = us(a).year(), d = us(r).date(), h = us(r).month() + 1, m = us(r).year(); switch (i) { case 0: 31 === s && 31 === d ? (s = 30, d = 30) : 31 === s ? s = 30 : 30 === s && 31 === d && (d = 30), o = 360 / (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)); break; case 1: var p = 365; if (u === m || u + 1 === m && (c > h || c === h && s >= d)) return (u === m && Yd.isLeapYear(u) || Yd.feb29Between(a, r) || 1 === h && 29 === d) && (p = 366), o = p / us(r).diff(us(a), "days"), o *= (l - n) / n; var f = m - u + 1, g = (us().set({ year: m + 1, month: 0, date: 1 }) - us().set({ year: u, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, v = g / f; o = v / us(r).diff(us(a), "days"); break; case 2: o = 360 / us(r).diff(us(a), "days"); break; case 3: o = 365 / us(r).diff(us(a), "days"); break; case 4: o = 360 / (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)) }return o *= (l - n) / n } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, PRICE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i); var o = Yd.getFirstValue(arguments[5]); if (ka(o)) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o); var s = 0; if (7 == arguments.length) { if (ka(s = Yd.getFirstValue(arguments[6]))) return s; if (!ba(s)) return Ih.error.v; s = parseInt(s) } if (n < 0 || l < 0) return Ih.error.nm; if (i <= 0) return Ih.error.nm; if (1 != o && 2 != o && 4 != o) return Ih.error.nm; if (s < 0 || s > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var c = window.luckysheet_function.COUPDAYSNC.f(a, r, o, s), u = window.luckysheet_function.COUPDAYS.f(a, r, o, s), d = window.luckysheet_function.COUPDAYBS.f(a, r, o, s), h = window.luckysheet_function.COUPNUM.f(a, r, o, s); if (h > 1) { var m = i / Math.pow(1 + l / o, h - 1 + c / u), p = 0; for (e = 1; e <= h; e++)p += 100 * n / o / Math.pow(1 + l / o, e - 1 + c / u); var f = m + p - n / o * 100 * (d / u) } else { var g = u - d; f = (m = n / o * 100 + i) / (p = l / o * (g / u) + 1) - n / o * 100 * (d / u) } return f } catch (e) { var v = e; return v = Ih.errorInfo(v), [Ih.error.v, v] } }, PRICEDISC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o, s = us(a).date(), c = us(a).month() + 1, u = us(a).year(), d = us(r).date(), h = us(r).month() + 1, m = us(r).year(); switch (i) { case 0: 31 === s && 31 === d ? (s = 30, d = 30) : 31 === s ? s = 30 : 30 === s && 31 === d && (d = 30), o = (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)) / 360; break; case 1: var p = 365; if (u === m || u + 1 === m && (c > h || c === h && s >= d)) return (u === m && Yd.isLeapYear(u) || Yd.feb29Between(a, r) || 1 === h && 29 === d) && (p = 366), o = l - n * l * (o = us(r).diff(us(a), "days") / p); var f = m - u + 1, g = (us().set({ year: m + 1, month: 0, date: 1 }) - us().set({ year: u, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, v = g / f; o = us(r).diff(us(a), "days") / v; break; case 2: o = us(r).diff(us(a), "days") / 360; break; case 3: o = us(r).diff(us(a), "days") / 365; break; case 4: o = (d + 30 * h + 360 * m - (s + 30 * c + 360 * u)) / 360 }return o = l - n * l * o } catch (e) { var y = e; return y = Ih.errorInfo(y), [Ih.error.v, y] } }, PRICEMAT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getCellDate(arguments[2]); if (ka(n)) return n; if (!us(n).isValid()) return Ih.error.v; var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i); var o = 0; if (6 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o) } if (l < 0 || i < 0) return Ih.error.nm; if (o < 0 || o > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var s = us(a).date(), c = us(a).month() + 1, u = us(a).year(), d = us(r).date(), h = us(r).month() + 1, m = us(r).year(), p = us(n).date(), f = us(n).month() + 1, g = us(n).year(); switch (o) { case 0: 31 == s && (s = 30), 31 == d && (d = 30), 31 == p && (p = 30); var v = 360, y = d + 30 * h + 360 * m - (s + 30 * c + 360 * u), b = d + 30 * h + 360 * m - (p + 30 * f + 360 * g), k = s + 30 * c + 360 * u - (p + 30 * f + 360 * g); break; case 1: var x = 365; if (u === m || u + 1 === m && (c > h || c === h && s >= d)) { (u === m && Yd.isLeapYear(u) || Yd.feb29Between(a, r) || 1 === h && 29 === d) && (x = 366); v = x, y = us(r).diff(us(a), "days"); return (100 + (b = us(a).diff(us(n), "days")) / v * l * 100) / (1 + y / v * i) - (k = us(r).diff(us(n), "days")) / v * l * 100 } var w = m - u + 1, _ = (us().set({ year: m + 1, month: 0, date: 1 }) - us().set({ year: u, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, C = _ / w; v = C, y = us(r).diff(us(a), "days"), b = us(a).diff(us(n), "days"), k = us(r).diff(us(n), "days"); break; case 2: v = 360, y = us(r).diff(us(a), "days"), b = us(a).diff(us(n), "days"), k = us(r).diff(us(n), "days"); break; case 3: v = 365, y = us(r).diff(us(a), "days"), b = us(a).diff(us(n), "days"), k = us(r).diff(us(n), "days"); break; case 4: v = 360, y = d + 30 * h + 360 * m - (s + 30 * c + 360 * u), b = d + 30 * h + 360 * m - (p + 30 * f + 360 * g), k = s + 30 * c + 360 * u - (p + 30 * f + 360 * g) }return (100 + b / v * l * 100) / (1 + y / v * i) - k / v * l * 100 } catch (e) { var T = e; return T = Ih.errorInfo(T), [Ih.error.v, T] } }, RECEIVED: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o = us(a).date(), s = us(a).month() + 1, c = us(a).year(), u = us(r).date(), d = us(r).month() + 1, h = us(r).year(); switch (i) { case 0: 31 == o && (o = 30), 31 == u && (u = 30); var m = 360, p = u + 30 * d + 360 * h - (o + 30 * s + 360 * c); break; case 1: var f = 365; if (c === h || c + 1 === h && (s > d || s === d && o >= u)) { (c === h && Yd.isLeapYear(c) || Yd.feb29Between(a, r) || 1 === d && 29 === u) && (f = 366); m = f; return n / (1 - l * (p = us(r).diff(us(a), "days")) / m) } var g = h - c + 1, v = (us().set({ year: h + 1, month: 0, date: 1 }) - us().set({ year: c, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, y = v / g; m = y, p = us(r).diff(us(a), "days"); break; case 2: m = 360, p = us(r).diff(us(a), "days"); break; case 3: m = 365, p = us(r).diff(us(a), "days"); break; case 4: m = 360, p = u + 30 * d + 360 * h - (o + 30 * s + 360 * c) }return n / (1 - l * p / m) } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, DISC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = 0; if (5 == arguments.length) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } if (n <= 0 || l <= 0) return Ih.error.nm; if (i < 0 || i > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var o = us(a).date(), s = us(a).month() + 1, c = us(a).year(), u = us(r).date(), d = us(r).month() + 1, h = us(r).year(); switch (i) { case 0: 31 == o && (o = 30), 31 == u && (u = 30); var m = 360, p = u + 30 * d + 360 * h - (o + 30 * s + 360 * c); break; case 1: var f = 365; if (c === h || c + 1 === h && (s > d || s === d && o >= u)) return (c === h && Yd.isLeapYear(c) || Yd.feb29Between(a, r) || 1 === d && 29 === u) && (f = 366), (l - n) / l * ((m = f) / (p = us(r).diff(us(a), "days"))); var g = h - c + 1, v = (us().set({ year: h + 1, month: 0, date: 1 }) - us().set({ year: c, month: 0, date: 1 })) / 1e3 / 60 / 60 / 24, y = v / g; m = y, p = us(r).diff(us(a), "days"); break; case 2: m = 360, p = us(r).diff(us(a), "days"); break; case 3: m = 365, p = us(r).diff(us(a), "days"); break; case 4: m = 360, p = u + 30 * d + 360 * h - (o + 30 * s + 360 * c) }return (l - n) / l * (m / p) } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, NPER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = 0; if (arguments.length >= 4) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } var i = 0; if (arguments.length >= 5) { if (ka(i = Yd.getFirstValue(arguments[4]))) return i; if (!ba(i)) return Ih.error.v; i = parseFloat(i) } if (0 != i && 1 != i) return Ih.error.nm; var o = r * (1 + a * i) - l * a, s = n * a + r * (1 + a * i); return Math.log(o / s) / Math.log(1 + a) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, SLN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? 0 == (n = parseFloat(n)) ? Ih.error.d : (a - r) / n : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DURATION: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = 0; if (6 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o) } if (n < 0 || l < 0) return Ih.error.nm; if (1 != i && 2 != i && 4 != i) return Ih.error.nm; if (o < 0 || o > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var s = window.luckysheet_function.COUPNUM.f(a, r, i, o), c = 0, u = 0; for (e = 1; e <= s; e++)c += n / i * 100 * e / Math.pow(1 + l / i, e), u += n / i * 100 / Math.pow(1 + l / i, e); var d = (c + 100 * s / Math.pow(1 + l / i, s)) / (u + 100 / Math.pow(1 + l / i, s)); return d /= i } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, MDURATION: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellDate(arguments[0]); if (ka(a)) return a; if (!us(a).isValid()) return Ih.error.v; var r = Yd.getCellDate(arguments[1]); if (ka(r)) return r; if (!us(r).isValid()) return Ih.error.v; var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n); var l = Yd.getFirstValue(arguments[3]); if (ka(l)) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l); var i = Yd.getFirstValue(arguments[4]); if (ka(i)) return i; if (!ba(i)) return Ih.error.v; i = parseInt(i); var o = 0; if (6 == arguments.length) { if (ka(o = Yd.getFirstValue(arguments[5]))) return o; if (!ba(o)) return Ih.error.v; o = parseInt(o) } if (n < 0 || l < 0) return Ih.error.nm; if (1 != i && 2 != i && 4 != i) return Ih.error.nm; if (o < 0 || o > 4) return Ih.error.nm; if (us(a) - us(r) >= 0) return Ih.error.nm; var s = window.luckysheet_function.DURATION.f(a, r, n, l, i, o); return s / (1 + l / i) } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, BIN2DEC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!/^[01]{1,10}$/g.test(a)) return Ih.error.nm; var r = parseInt(a, 2), n = a.toString(); return 10 === n.length && "1" === n.substring(0, 1) ? parseInt(n.substring(1), 2) - 512 : r } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, BIN2HEX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[01]{1,10}$/g.test(a)) return Ih.error.nm; var n = parseInt(a, 2).toString(16).toUpperCase(); return null == r ? n : r < 0 || r < n.length ? Ih.error.nm : new Array(r - n.length + 1).join("0") + n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, BIN2OCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[01]{1,10}$/g.test(a)) return Ih.error.nm; var n = a.toString(); if (10 === n.length && "1" === n.substring(0, 1)) return (1073741312 + parseInt(n.substring(1), 2)).toString(8); var l = parseInt(a, 2).toString(8); return null == r ? l : r < 0 || r < l.length ? Ih.error.nm : new Array(r - l.length + 1).join("0") + l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, DEC2BIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^-?[0-9]{1,3}$/.test(a) || a < -512 || a > 511) return Ih.error.nm; if (a < 0) return "1" + new Array(9 - (512 + a).toString(2).length).join("0") + (512 + a).toString(2); var n = parseInt(a, 10).toString(2); return null == r ? n : r < 0 || r < n.length ? Ih.error.nm : new Array(r - n.length + 1).join("0") + n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DEC2HEX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^-?[0-9]{1,12}$/.test(a) || a < -549755813888 || a > 549755813887) return Ih.error.nm; if (a < 0) return (1099511627776 + a).toString(16).toUpperCase(); var n = parseInt(a, 10).toString(16).toUpperCase(); return null == r ? n : r < 0 || r < n.length ? Ih.error.nm : new Array(r - n.length + 1).join("0") + n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, DEC2OCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^-?[0-9]{1,9}$/.test(a) || a < -536870912 || a > 536870911) return Ih.error.nm; if (a < 0) return (1073741824 + a).toString(8); var n = parseInt(a, 10).toString(8); return null == r ? n : r < 0 || r < n.length ? Ih.error.nm : new Array(r - n.length + 1).join("0") + n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, HEX2BIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[0-9A-Fa-f]{1,10}$/.test(a)) return Ih.error.nm; var n = 10 === a.length && "f" === a.substring(0, 1).toLowerCase(), l = n ? parseInt(a, 16) - 1099511627776 : parseInt(a, 16); if (l < -512 || l > 511) return Ih.error.nm; if (n) return "1" + new Array(9 - (512 + l).toString(2).length).join("0") + (512 + l).toString(2); var i = l.toString(2); return null == r ? i : r < 0 || r < i.length ? Ih.error.nm : new Array(r - i.length + 1).join("0") + i } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, HEX2DEC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!/^[0-9A-Fa-f]{1,10}$/.test(a)) return Ih.error.nm; var r = parseInt(a, 16); return r >= 549755813888 ? r - 1099511627776 : r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, HEX2OCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[0-9A-Fa-f]{1,10}$/.test(a)) return Ih.error.nm; var n = parseInt(a, 16); if (n > 536870911 && n < 0xffe0000000) return Ih.error.nm; if (n >= 0xffe0000000) return (n - 0xffc0000000).toString(8); var l = n.toString(8); return null == r ? l : r < 0 || r < l.length ? Ih.error.nm : new Array(r - l.length + 1).join("0") + l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, OCT2BIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[0-7]{1,10}$/.test(a)) return Ih.error.nm; var n = 10 === (a = a.toString()).length && "7" === a.substring(0, 1), l = n ? parseInt(a, 8) - 1073741824 : parseInt(a, 8); if (l < -512 || l > 511) return va.num; if (n) return "1" + new Array(9 - (512 + l).toString(2).length).join("0") + (512 + l).toString(2); var i = l.toString(2); return null == r ? i : r < 0 || r < i.length ? Ih.error.nm : new Array(r - i.length + 1).join("0") + i } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, OCT2DEC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!/^[0-7]{1,10}$/.test(a)) return Ih.error.nm; var r = parseInt(a, 8); return r >= 536870912 ? r - 1073741824 : r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, OCT2HEX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = null; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (!/^[0-7]{1,10}$/.test(a)) return Ih.error.nm; var n = parseInt(a, 8); if (n >= 536870912) return "FF" + (n + 3221225472).toString(16).toUpperCase(); var l = n.toString(16).toUpperCase(); return null == r ? l : r < 0 || r < l.length ? Ih.error.nm : new Array(r - l.length + 1).join("0") + l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, COMPLEX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r); var n = "i"; if (3 == arguments.length && (n = arguments[2].toString()), "i" != n && "j" != n) return Ih.error.v; if (0 === a && 0 === r) return 0; if (0 === a) return 1 === r ? n : r.toString() + n; if (0 === r) return a.toString(); var l = r > 0 ? "+" : ""; return a.toString() + l + (1 === r ? n : r.toString() + n) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, IMREAL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if ("true" == (a = a.toString()).toLowerCase() || "false" == a.toLowerCase()) return Ih.error.v; if ("0" == a) return 0; if (["i", "+i", "1i", "+1i", "-i", "-1i", "j", "+j", "1j", "+1j", "-j", "-1j"].indexOf(a) >= 0) return 0; var r = a.indexOf("+"), n = a.indexOf("-"); 0 === r && (r = a.indexOf("+", 1)), 0 === n && (n = a.indexOf("-", 1)); var l = a.substring(a.length - 1, a.length), i = "i" === l || "j" === l; return r >= 0 || n >= 0 ? i ? r >= 0 ? isNaN(a.substring(0, r)) || isNaN(a.substring(r + 1, a.length - 1)) ? Ih.error.nm : Number(a.substring(0, r)) : isNaN(a.substring(0, n)) || isNaN(a.substring(n + 1, a.length - 1)) ? Ih.error.nm : Number(a.substring(0, n)) : Ih.error.nm : i ? isNaN(a.substring(0, a.length - 1)) ? Ih.error.nm : 0 : isNaN(a) ? Ih.error.nm : a } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, IMAGINARY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if ("true" == (a = a.toString()).toLowerCase() || "false" == a.toLowerCase()) return Ih.error.v; if ("0" == a) return 0; if (["i", "j"].indexOf(a) >= 0) return 1; var r = (a = a.replace("+i", "+1i").replace("-i", "-1i").replace("+j", "+1j").replace("-j", "-1j")).indexOf("+"), n = a.indexOf("-"); 0 === r && (r = a.indexOf("+", 1)), 0 === n && (n = a.indexOf("-", 1)); var l = a.substring(a.length - 1, a.length), i = "i" === l || "j" === l; return r >= 0 || n >= 0 ? i ? r >= 0 ? isNaN(a.substring(0, r)) || isNaN(a.substring(r + 1, a.length - 1)) ? Ih.error.nm : Number(a.substring(r + 1, a.length - 1)) : isNaN(a.substring(0, n)) || isNaN(a.substring(n + 1, a.length - 1)) ? Ih.error.nm : -Number(a.substring(n + 1, a.length - 1)) : Ih.error.nm : i ? isNaN(a.substring(0, a.length - 1)) ? Ih.error.nm : a.substring(0, a.length - 1) : isNaN(a) ? Ih.error.nm : 0 } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, IMCONJUGATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; a = a.toString(); var r = window.luckysheet_function.IMREAL.f(a); if (ka(r)) return r; var n = window.luckysheet_function.IMAGINARY.f(a); if (ka(n)) return n; var l = a.substring(a.length - 1); return l = "i" === l || "j" === l ? l : "i", 0 !== n ? window.luckysheet_function.COMPLEX.f(r, -n, l) : a } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, IMABS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheet_function.IMREAL.f(arguments[0]); if (ka(a)) return a; var r = window.luckysheet_function.IMAGINARY.f(arguments[0]); return ka(r) ? r : Math.sqrt(Math.pow(a, 2) + Math.pow(r, 2)) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DELTA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = 0; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseFloat(r) } return a === r ? 1 : 0 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, IMSUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheet_function.IMREAL.f(arguments[0]); if (ka(a)) return a; var r = window.luckysheet_function.IMAGINARY.f(arguments[0]); if (ka(r)) return r; var n = arguments[0]; for (e = 1; e < arguments.length; e++) { var l = window.luckysheet_function.IMREAL.f(n); if (ka(l)) return l; var i = window.luckysheet_function.IMAGINARY.f(n); if (ka(i)) return i; var o = window.luckysheet_function.IMREAL.f(arguments[e]); if (ka(o)) return o; var s = window.luckysheet_function.IMAGINARY.f(arguments[e]); if (ka(s)) return s; n = window.luckysheet_function.COMPLEX.f(l + o, i + s) } return n } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, IMSUB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if ("true" == (a = a.toString()).toLowerCase() || "false" == a.toLowerCase()) return Ih.error.v; var r = window.luckysheet_function.IMREAL.f(a); if (ka(r)) return r; var n = window.luckysheet_function.IMAGINARY.f(a); if (ka(n)) return n; var l = Yd.getFirstValue(arguments[1]); if (ka(l)) return l; if ("true" == (l = l.toString()).toLowerCase() || "false" == l.toLowerCase()) return Ih.error.v; var i = window.luckysheet_function.IMREAL.f(l); if (ka(i)) return i; var o = window.luckysheet_function.IMAGINARY.f(l); if (ka(o)) return o; var s = a.substring(a.length - 1), c = l.substring(l.length - 1), u = "i"; return ("j" === s || "j" === c) && (u = "j"), window.luckysheet_function.COMPLEX.f(r - i, n - o, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, IMPRODUCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheet_function.IMREAL.f(arguments[0]); if (ka(a)) return a; var r = window.luckysheet_function.IMAGINARY.f(arguments[0]); if (ka(r)) return r; var n = arguments[0]; for (e = 1; e < arguments.length; e++) { var l = window.luckysheet_function.IMREAL.f(n); if (ka(l)) return l; var i = window.luckysheet_function.IMAGINARY.f(n); if (ka(i)) return i; var o = window.luckysheet_function.IMREAL.f(arguments[e]); if (ka(o)) return o; var s = window.luckysheet_function.IMAGINARY.f(arguments[e]); if (ka(s)) return s; n = window.luckysheet_function.COMPLEX.f(l * o - i * s, l * s + i * o) } return n } catch (e) { var c = e; return c = Ih.errorInfo(c), [Ih.error.v, c] } }, IMDIV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if ("true" == (a = a.toString()).toLowerCase() || "false" == a.toLowerCase()) return Ih.error.v; var r = window.luckysheet_function.IMREAL.f(a); if (ka(r)) return r; var n = window.luckysheet_function.IMAGINARY.f(a); if (ka(n)) return n; var l = Yd.getFirstValue(arguments[1]); if (ka(l)) return l; if ("true" == (l = l.toString()).toLowerCase() || "false" == l.toLowerCase()) return Ih.error.v; var i = window.luckysheet_function.IMREAL.f(l); if (ka(i)) return i; var o = window.luckysheet_function.IMAGINARY.f(l); if (ka(o)) return o; var s = a.substring(a.length - 1), c = l.substring(l.length - 1), u = "i"; if (("j" === s || "j" === c) && (u = "j"), 0 === i && 0 === o) return Ih.error.nm; var d = i * i + o * o; return window.luckysheet_function.COMPLEX.f((r * i + n * o) / d, (n * i - r * o) / d, u) } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, NOT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellBoolen(arguments[0]); return ka(a) ? a : !a } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TRUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return !0 } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, FALSE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return !1 } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, AND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = !0; for (e = 0; e < arguments.length; e++) { var r = Yd.getCellBoolen(arguments[e]); if (ka(r)) return r; if (!r) { a = !1; break } } return a } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, IFERROR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[1], "text"), r = Yd.getFirstValue(arguments[0], "text"); return ka(r) || "string" === Cm(r) && "" === $.trim(r) ? a : r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, IF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getCellBoolen(arguments[0]); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r) && n != va.d) return r; var n = ""; return 3 == arguments.length && ka(n = Yd.getFirstValue(arguments[2], "text")) && n != va.d ? n : a ? r : n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, OR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = !1; for (e = 0; e < arguments.length; e++) { var r = Yd.getCellBoolen(arguments[e]); if (ka(r)) return r; if (r) { a = !0; break } } return a } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, NE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : a != r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, EQ: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : a == r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, GT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a > (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, GTE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a >= (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, LT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a < (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, LTE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a <= (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ADD: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a + (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, MINUS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a - (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, MULTIPLY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? a * (r = parseFloat(r)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, DIVIDE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? 0 == (r = parseFloat(r)) ? Ih.error.d : a / r : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, CONCAT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1], "text"); return ka(r) ? r : a + "" + r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, UNARY_PERCENT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; var r = (a = parseFloat(a)) / 100; return Math.round(100 * r) / 100 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, CONCATENATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = ""; for (e = 0; e < arguments.length; e++) { var r = Yd.getFirstValue(arguments[e], "text"); if (ka(r)) return r; a = a + "" + r } return a } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, CODE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : "" == a ? Ih.error.v : a.charCodeAt(0) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, CHAR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? (a = parseInt(a)) < 1 || a > 255 ? Ih.error.v : String.fromCharCode(a) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ARABIC: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; if (a = a.toString().toUpperCase(), !/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(a)) return Ih.error.v; var r = 0; return a.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, (function (e) { r += { M: 1e3, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 }[e] })), r } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ROMAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; if (0 == (a = parseInt(a))) return ""; if (a < 1 || a > 3999) return Ih.error.v; function r(e) { var t = [["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"], ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"], ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"], ["", "M", "MM", "MMM"]]; return t[3][Math.floor(e / 1e3)] + t[2][Math.floor(e % 1e3 / 100)] + t[1][Math.floor(e % 100 / 10)] + t[0][e % 10] } return r(a) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, REGEXEXTRACT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; var n = a.match(new RegExp(r)); return n ? n[n.length > 1 ? n.length - 1 : 0] : null } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, REGEXMATCH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; var n = a.match(new RegExp(r)); return !!n } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, REGEXREPLACE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; var n = Yd.getFirstValue(arguments[2], "text"); return ka(n) ? n : a.replace(new RegExp(r), n) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, T: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) || "string" == Cm(a) ? a : "" } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, FIXED: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = 2; if (arguments.length >= 2) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } var n = !1; if (3 == arguments.length && ka(n = Yd.getCellBoolen(arguments[2]))) return n; if (r > 127) return Ih.error.v; var l = n ? "0" : "#,##0"; return r <= 0 ? a = Math.round(a * Math.pow(10, r)) / Math.pow(10, r) : r > 0 && (l += "." + new Array(r + 1).join("0")), ws(l, a) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, FIND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; r = r.toString(); var n = 1; if (3 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n) } if (n < 0 || n > r.length) return Ih.error.v; if ("" == a) return n; if (-1 == r.indexOf(a)) return Ih.error.v; var l = r.indexOf(a, n - 1) + 1; return l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, FINDB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; r = r.toString(); var n = 1; if (3 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n) } if (n < 0 || n > r.length) return Ih.error.v; if ("" == a) return n; if (-1 == r.indexOf(a)) return Ih.error.v; var l = r.split(""), i = r.indexOf(a, n - 1), o = 0; for (e = 0; e < i; e++)/[^\x00-\xff]/g.test(l[e]) ? o += 2 : o += 1; return o } catch (e) { var s = e; return s = Ih.errorInfo(s), [Ih.error.v, s] } }, JOIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; var r = []; for (e = 1; e < arguments.length; e++) { var n = arguments[e]; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; r = r.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? r = r.concat(Yd.getCellDataArr(n, "text", !1)) : r.push(n) } return r.join(a) } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, LEFT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = 1; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } return r < 0 ? Ih.error.v : r >= a.length ? a : 0 == r ? "" : a.substr(0, r) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, RIGHT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = 1; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } return r < 0 ? Ih.error.v : r >= a.length ? a : 0 == r ? "" : a.substr(-r, r) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, MID: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); return ka(n) ? n : ba(n) ? (n = parseInt(n), r < 1 || n < 0 ? Ih.error.v : r > a.length ? "" : r + n > a.length ? a.substr(r - 1, a.length - r + 1) : a.substr(r - 1, n)) : Ih.error.v } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, LEN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString()).length } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, LENB: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString()).replace(/[^\x00-\xff]/g, "aa").length } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, LOWER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString()) ? a.toLowerCase() : a } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, UPPER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString()) ? a.toUpperCase() : a } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, EXACT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1], "text"); return ka(r) ? r : a === (r = r.toString()) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, REPLACE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1]); if (ka(r)) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r); var n = Yd.getFirstValue(arguments[2]); if (ka(n)) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n); var l = Yd.getFirstValue(arguments[3], "text"); return ka(l) ? l : (l = l.toString(), a.substr(0, r - 1) + l + a.substr(r - 1 + n)) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, REPT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1]); return ka(r) ? r : ba(r) ? (r = parseInt(r)) < 0 ? Ih.error.v : (r > 100 && (r = 100), new Array(r + 1).join(a)) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, SEARCH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; r = r.toString(); var n = 1; if (3 == arguments.length) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseInt(n) } if (n <= 0 || n > r.length) return Ih.error.v; var l = r.toLowerCase().indexOf(a.toLowerCase(), n - 1) + 1; return 0 === l ? Ih.error.v : l } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, SUBSTITUTE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; r = r.toString(); var n = Yd.getFirstValue(arguments[2], "text"); if (ka(n)) return n; n = n.toString(); var l = null; if (4 == arguments.length) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseInt(l) } var i, o = new RegExp(r, "g"); if (null == l) i = a.replace(o, n); else { if (l <= 0) return Ih.error.v; var s = a.match(o); if (null == s || l > s.length) return a; var c = r.length, u = 0; for (e = 1; e <= l; e++)u = a.indexOf(r, u) + 1; i = a.substring(0, u - 1) + n + a.substring(u - 1 + c) } return i } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, CLEAN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); if (ka(a)) return a; a = a.toString(); var r = []; for (e = 0; e < a.length; e++) { var n = a.charCodeAt(e); (/[\u4e00-\u9fa5]/g.test(a.charAt(e)) || n > 31 && n < 127) && r.push(a.charAt(e)) } return r.join("") } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, TEXT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1], "text"); return ka(r) ? r : ws(r = r.toString(), a) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, TRIM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString()).replace(/ +/g, " ").trim() } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, VALUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : xs(a = a.toString())[2] } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, PROPER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : (a = a.toString().toLowerCase()).replace(/[a-zA-Z]+/g, (function (e) { return e.substring(0, 1).toUpperCase() + e.substring(1) })) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, CONVERT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseFloat(a); var r = Yd.getFirstValue(arguments[1], "text"); if (ka(r)) return r; r = r.toString(); var n = Yd.getFirstValue(arguments[2], "text"); if (ka(n)) return n; n = n.toString(); var l, i = [["a.u. of action", "?", null, "action", !1, !1, 105457168181818e-48], ["a.u. of charge", "e", null, "electric_charge", !1, !1, 160217653141414e-33], ["a.u. of energy", "Eh", null, "energy", !1, !1, 435974417757576e-32], ["a.u. of length", "a?", null, "length", !1, !1, 529177210818182e-25], ["a.u. of mass", "m?", null, "mass", !1, !1, 910938261616162e-45], ["a.u. of time", "?/Eh", null, "time", !1, !1, 241888432650516e-31], ["admiralty knot", "admkn", null, "speed", !1, !0, .514773333], ["ampere", "A", null, "electric_current", !0, !1, 1], ["ampere per meter", "A/m", null, "magnetic_field_intensity", !0, !1, 1], ["ångström", "Å", ["ang"], "length", !1, !0, 1e-10], ["are", "ar", null, "area", !1, !0, 100], ["astronomical unit", "ua", null, "length", !1, !1, 149597870691667e-25], ["bar", "bar", null, "pressure", !1, !1, 1e5], ["barn", "b", null, "area", !1, !1, 1e-28], ["becquerel", "Bq", null, "radioactivity", !0, !1, 1], ["bit", "bit", ["b"], "information", !1, !0, 1], ["btu", "BTU", ["btu"], "energy", !1, !0, 1055.05585262], ["byte", "byte", null, "information", !1, !0, 8], ["candela", "cd", null, "luminous_intensity", !0, !1, 1], ["candela per square metre", "cd/m?", null, "luminance", !0, !1, 1], ["coulomb", "C", null, "electric_charge", !0, !1, 1], ["cubic ångström", "ang3", ["ang^3"], "volume", !1, !0, 1e-30], ["cubic foot", "ft3", ["ft^3"], "volume", !1, !0, .028316846592], ["cubic inch", "in3", ["in^3"], "volume", !1, !0, 16387064e-12], ["cubic light-year", "ly3", ["ly^3"], "volume", !1, !0, 846786664623715e-61], ["cubic metre", "m?", null, "volume", !0, !0, 1], ["cubic mile", "mi3", ["mi^3"], "volume", !1, !0, 4168181825.44058], ["cubic nautical mile", "Nmi3", ["Nmi^3"], "volume", !1, !0, 6352182208], ["cubic Pica", "Pica3", ["Picapt3", "Pica^3", "Picapt^3"], "volume", !1, !0, 7.58660370370369e-8], ["cubic yard", "yd3", ["yd^3"], "volume", !1, !0, .764554857984], ["cup", "cup", null, "volume", !1, !0, .0002365882365], ["dalton", "Da", ["u"], "mass", !1, !1, 166053886282828e-41], ["day", "d", ["day"], "time", !1, !0, 86400], ["degree", "°", null, "angle", !1, !1, .0174532925199433], ["degrees Rankine", "Rank", null, "temperature", !1, !0, .555555555555556], ["dyne", "dyn", ["dy"], "force", !1, !0, 1e-5], ["electronvolt", "eV", ["ev"], "energy", !1, !0, 1.60217656514141], ["ell", "ell", null, "length", !1, !0, 1.143], ["erg", "erg", ["e"], "energy", !1, !0, 1e-7], ["farad", "F", null, "electric_capacitance", !0, !1, 1], ["fluid ounce", "oz", null, "volume", !1, !0, 295735295625e-16], ["foot", "ft", null, "length", !1, !0, .3048], ["foot-pound", "flb", null, "energy", !1, !0, 1.3558179483314], ["gal", "Gal", null, "acceleration", !1, !1, .01], ["gallon", "gal", null, "volume", !1, !0, .003785411784], ["gauss", "G", ["ga"], "magnetic_flux_density", !1, !0, 1], ["grain", "grain", null, "mass", !1, !0, 647989e-10], ["gram", "g", null, "mass", !1, !0, .001], ["gray", "Gy", null, "absorbed_dose", !0, !1, 1], ["gross registered ton", "GRT", ["regton"], "volume", !1, !0, 2.8316846592], ["hectare", "ha", null, "area", !1, !0, 1e4], ["henry", "H", null, "inductance", !0, !1, 1], ["hertz", "Hz", null, "frequency", !0, !1, 1], ["horsepower", "HP", ["h"], "power", !1, !0, 745.69987158227], ["horsepower-hour", "HPh", ["hh", "hph"], "energy", !1, !0, 2684519.538], ["hour", "h", ["hr"], "time", !1, !0, 3600], ["imperial gallon (U.K.)", "uk_gal", null, "volume", !1, !0, .00454609], ["imperial hundredweight", "lcwt", ["uk_cwt", "hweight"], "mass", !1, !0, 50.802345], ["imperial quart (U.K)", "uk_qt", null, "volume", !1, !0, .0011365225], ["imperial ton", "brton", ["uk_ton", "LTON"], "mass", !1, !0, 1016.046909], ["inch", "in", null, "length", !1, !0, .0254], ["international acre", "uk_acre", null, "area", !1, !0, 4046.8564224], ["IT calorie", "cal", null, "energy", !1, !0, 4.1868], ["joule", "J", null, "energy", !0, !0, 1], ["katal", "kat", null, "catalytic_activity", !0, !1, 1], ["kelvin", "K", ["kel"], "temperature", !0, !0, 1], ["kilogram", "kg", null, "mass", !0, !0, 1], ["knot", "kn", null, "speed", !1, !0, .514444444444444], ["light-year", "ly", null, "length", !1, !0, 9460730472580800], ["litre", "L", ["l", "lt"], "volume", !1, !0, .001], ["lumen", "lm", null, "luminous_flux", !0, !1, 1], ["lux", "lx", null, "illuminance", !0, !1, 1], ["maxwell", "Mx", null, "magnetic_flux", !1, !1, 1e-18], ["measurement ton", "MTON", null, "volume", !1, !0, 1.13267386368], ["meter per hour", "m/h", ["m/hr"], "speed", !1, !0, .00027777777777778], ["meter per second", "m/s", ["m/sec"], "speed", !0, !0, 1], ["meter per second squared", "m?s??", null, "acceleration", !0, !1, 1], ["parsec", "pc", ["parsec"], "length", !1, !0, 0x6da012f958ee1c], ["meter squared per second", "m?/s", null, "kinematic_viscosity", !0, !1, 1], ["metre", "m", null, "length", !0, !0, 1], ["miles per hour", "mph", null, "speed", !1, !0, .44704], ["millimetre of mercury", "mmHg", null, "pressure", !1, !1, 133.322], ["minute", "?", null, "angle", !1, !1, .000290888208665722], ["minute", "min", ["mn"], "time", !1, !0, 60], ["modern teaspoon", "tspm", null, "volume", !1, !0, 5e-6], ["mole", "mol", null, "amount_of_substance", !0, !1, 1], ["morgen", "Morgen", null, "area", !1, !0, 2500], ["n.u. of action", "?", null, "action", !1, !1, 105457168181818e-48], ["n.u. of mass", "m?", null, "mass", !1, !1, 910938261616162e-45], ["n.u. of speed", "c?", null, "speed", !1, !1, 299792458], ["n.u. of time", "?/(me?c??)", null, "time", !1, !1, 128808866778687e-35], ["nautical mile", "M", ["Nmi"], "length", !1, !0, 1852], ["newton", "N", null, "force", !0, !0, 1], ["œrsted", "Oe ", null, "magnetic_field_intensity", !1, !1, 79.5774715459477], ["ohm", "Ω", null, "electric_resistance", !0, !1, 1], ["ounce mass", "ozm", null, "mass", !1, !0, .028349523125], ["pascal", "Pa", null, "pressure", !0, !1, 1], ["pascal second", "Pa?s", null, "dynamic_viscosity", !0, !1, 1], ["pferdestärke", "PS", null, "power", !1, !0, 735.49875], ["phot", "ph", null, "illuminance", !1, !1, 1e-4], ["pica (1/6 inch)", "pica", null, "length", !1, !0, .00035277777777778], ["pica (1/72 inch)", "Pica", ["Picapt"], "length", !1, !0, .00423333333333333], ["poise", "P", null, "dynamic_viscosity", !1, !1, .1], ["pond", "pond", null, "force", !1, !0, .00980665], ["pound force", "lbf", null, "force", !1, !0, 4.4482216152605], ["pound mass", "lbm", null, "mass", !1, !0, .45359237], ["quart", "qt", null, "volume", !1, !0, .000946352946], ["radian", "rad", null, "angle", !0, !1, 1], ["second", "?", null, "angle", !1, !1, 484813681109536e-20], ["second", "s", ["sec"], "time", !0, !0, 1], ["short hundredweight", "cwt", ["shweight"], "mass", !1, !0, 45.359237], ["siemens", "S", null, "electrical_conductance", !0, !1, 1], ["sievert", "Sv", null, "equivalent_dose", !0, !1, 1], ["slug", "sg", null, "mass", !1, !0, 14.59390294], ["square ångström", "ang2", ["ang^2"], "area", !1, !0, 1e-20], ["square foot", "ft2", ["ft^2"], "area", !1, !0, .09290304], ["square inch", "in2", ["in^2"], "area", !1, !0, 64516e-8], ["square light-year", "ly2", ["ly^2"], "area", !1, !0, 895054210748189e17], ["square meter", "m?", null, "area", !0, !0, 1], ["square mile", "mi2", ["mi^2"], "area", !1, !0, 2589988.110336], ["square nautical mile", "Nmi2", ["Nmi^2"], "area", !1, !0, 3429904], ["square Pica", "Pica2", ["Picapt2", "Pica^2", "Picapt^2"], "area", !1, !0, 1792111111111e-17], ["square yard", "yd2", ["yd^2"], "area", !1, !0, .83612736], ["statute mile", "mi", null, "length", !1, !0, 1609.344], ["steradian", "sr", null, "solid_angle", !0, !1, 1], ["stilb", "sb", null, "luminance", !1, !1, 1e-4], ["stokes", "St", null, "kinematic_viscosity", !1, !1, 1e-4], ["stone", "stone", null, "mass", !1, !0, 6.35029318], ["tablespoon", "tbs", null, "volume", !1, !0, 147868e-10], ["teaspoon", "tsp", null, "volume", !1, !0, 492892e-11], ["tesla", "T", null, "magnetic_flux_density", !0, !0, 1], ["thermodynamic calorie", "c", null, "energy", !1, !0, 4.184], ["ton", "ton", null, "mass", !1, !0, 907.18474], ["tonne", "t", null, "mass", !1, !1, 1e3], ["U.K. pint", "uk_pt", null, "volume", !1, !0, .00056826125], ["U.S. bushel", "bushel", null, "volume", !1, !0, .03523907], ["U.S. oil barrel", "barrel", null, "volume", !1, !0, .158987295], ["U.S. pint", "pt", ["us_pt"], "volume", !1, !0, .000473176473], ["U.S. survey mile", "survey_mi", null, "length", !1, !0, 1609.347219], ["U.S. survey/statute acre", "us_acre", null, "area", !1, !0, 4046.87261], ["volt", "V", null, "voltage", !0, !1, 1], ["watt", "W", null, "power", !0, !0, 1], ["watt-hour", "Wh", ["wh"], "energy", !1, !0, 3600], ["weber", "Wb", null, "magnetic_flux", !0, !1, 1], ["yard", "yd", null, "length", !1, !0, .9144], ["year", "yr", null, "time", !1, !0, 31557600]], o = { Yi: ["yobi", 80, 12089258196146292e8, "Yi", "yotta"], Zi: ["zebi", 70, 11805916207174113e5, "Zi", "zetta"], Ei: ["exbi", 60, 0x1000000000000000, "Ei", "exa"], Pi: ["pebi", 50, 0x4000000000000, "Pi", "peta"], Ti: ["tebi", 40, 1099511627776, "Ti", "tera"], Gi: ["gibi", 30, 1073741824, "Gi", "giga"], Mi: ["mebi", 20, 1048576, "Mi", "mega"], ki: ["kibi", 10, 1024, "ki", "kilo"] }, s = { Y: ["yotta", 1e24, "Y"], Z: ["zetta", 1e21, "Z"], E: ["exa", 1e18, "E"], P: ["peta", 1e15, "P"], T: ["tera", 1e12, "T"], G: ["giga", 1e9, "G"], M: ["mega", 1e6, "M"], k: ["kilo", 1e3, "k"], h: ["hecto", 100, "h"], e: ["dekao", 10, "e"], d: ["deci", .1, "d"], c: ["centi", .01, "c"], m: ["milli", .001, "m"], u: ["micro", 1e-6, "u"], n: ["nano", 1e-9, "n"], p: ["pico", 1e-12, "p"], f: ["femto", 1e-15, "f"], a: ["atto", 1e-18, "a"], z: ["zepto", 1e-21, "z"], y: ["yocto", 1e-24, "y"] }, c = null, u = null, d = r, h = n, m = 1, p = 1; for (e = 0; e < i.length; e++)l = null === i[e][2] ? [] : i[e][2], (i[e][1] === d || l.indexOf(d) >= 0) && (c = i[e]), (i[e][1] === h || l.indexOf(h) >= 0) && (u = i[e]); if (null === c) { var f = o[r.substring(0, 2)], g = s[r.substring(0, 1)]; "da" === r.substring(0, 2) && (g = ["dekao", 10, "da"]), f ? (m = f[2], d = r.substring(2)) : g && (m = g[1], d = r.substring(g[2].length)); for (var v = 0; v < i.length; v++)l = null === i[v][2] ? [] : i[v][2], (i[v][1] === d || l.indexOf(d) >= 0) && (c = i[v]) } if (null === u) { var y = o[n.substring(0, 2)], b = s[n.substring(0, 1)]; "da" === n.substring(0, 2) && (b = ["dekao", 10, "da"]), y ? (p = y[2], h = n.substring(2)) : b && (p = b[1], h = n.substring(b[2].length)); for (var k = 0; k < i.length; k++)l = null === i[k][2] ? [] : i[k][2], (i[k][1] === h || l.indexOf(h) >= 0) && (u = i[k]) } return null === c || null === u || c[3] !== u[3] ? Ih.error.na : a * c[6] * m / (u[6] * p) } catch (e) { var x = e; return x = Ih.errorInfo(x), [Ih.error.v, x] } }, SUMX2MY2: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } var u = 0; for (e = 0; e < i.length; e++)u += Math.pow(i[e], 2) - Math.pow(o[e], 2); return u } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, SUMX2PY2: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } var u = 0; for (e = 0; e < i.length; e++)u += Math.pow(i[e], 2) + Math.pow(o[e], 2); return u } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, SUMXMY2: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !1)) } else "object" == Cm(a) && null != a.startCell ? r = r.concat(Yd.getCellDataArr(a, "text", !1)) : r.push(a); var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = l.concat(Yd.getDataArr(n, !1)) } else "object" == Cm(n) && null != n.startCell ? l = l.concat(Yd.getCellDataArr(n, "text", !1)) : l.push(n); if (r.length != l.length) return Ih.error.na; var i = [], o = []; for (e = 0; e < r.length; e++) { var s = r[e], c = l[e]; ba(s) && ba(c) && (i.push(parseFloat(s)), o.push(parseFloat(c))) } var u = 0; for (e = 0; e < i.length; e++)u += Math.pow(i[e] - o[e], 2); return u } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, TRANSPOSE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else "object" == Cm(a) && null != a.startCell && (r = Yd.getCellDataDyadicArr(a, "number")); return r = r[0].map((function (e, t) { return r.map((function (e) { return e[t] })) })) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, TREND: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "text"); else { if (!ba(a)) return Ih.error.v; (p = []).push(parseFloat(a)), r.push(p) } var n = r.length, l = r[0].length; for (e = 0; e < n; e++)for (var i = 0; i < l; i++) { if (!ba(r[e][i])) return Ih.error.v; r[e][i] = parseFloat(r[e][i]) } var o = []; for (e = 1; e <= n; e++)for (i = 1; i <= l; i++) { var s = (e - 1) * l + i; o.push(s) } if (arguments.length >= 2) { var c = arguments[1]; if (o = [], "array" == Cm(c)) { if ("array" == Cm(c[0]) && !Yd.isDyadicArr(c)) return Ih.error.v; o = Yd.getDataDyadicArr(c) } else if ("object" == Cm(c) && null != c.startCell) o = Yd.getCellDataDyadicArr(c, "text"); else { if (!ba(c)) return Ih.error.v; (p = []).push(parseFloat(c)), o.push(p) } for (e = 0; e < o.length; e++)for (i = 0; i < o[0].length; i++) { if (!ba(o[e][i])) return Ih.error.v; o[e][i] = parseFloat(o[e][i]) } } var u = o.length, d = o[0].length, h = o; if (arguments.length >= 3) { var m = arguments[2]; if (h = [], "array" == Cm(m)) { if ("array" == Cm(m[0]) && !Yd.isDyadicArr(m)) return Ih.error.v; h = Yd.getDataDyadicArr(m) } else if ("object" == Cm(m) && null != m.startCell) h = Yd.getCellDataDyadicArr(m, "text"); else { if (!ba(m)) return Ih.error.v; var p; (p = []).push(parseFloat(m)), h.push(p) } for (e = 0; e < h.length; e++)for (i = 0; i < h[0].length; i++) { if (!ba(h[e][i])) return Ih.error.v; h[e][i] = parseFloat(h[e][i]) } } var f = !0; if (4 == arguments.length && ka(f = Yd.getCellBoolen(arguments[3]))) return f; if (n != u || l != d) return Ih.error.r; function g(e, t) { for (var a = 0, r = 0, n = 0, l = 0, i = 0; i < e.length; i++)for (var o = 0; o < e[i].length; o++)a += e[i][o], r += t[i][o], n += e[i][o] * t[i][o], l += e[i][o] * e[i][o]; var s = e.length * e[0].length, c = a / s, u = r / s, d = (n / s - c * u) / (l / s - c * c); return [d, u - d * c] } var v = g(o, r), y = v[0]; if (f) var b = v[1]; else b = 0; var k = []; for (e = 0; e < h.length; e++)for (i = 0; i < h[e].length; i++) { var x = h[e][i], w = y * x + b; k.push(Math.round(1e9 * w) / 1e9) } return k } catch (e) { var _ = e; return _ = Ih.errorInfo(_), [Ih.error.v, _] } }, FREQUENCY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = r.concat(Yd.getDataArr(a, !0)) } else if ("object" == Cm(a) && null != a.startCell) r = r.concat(Yd.getCellDataArr(a, "number", !0)); else { if (!ba(a)) return Ih.error.v; r.push(a) } var n = []; for (e = 0; e < r.length; e++)ba(r[e]) && n.push(parseFloat(r[e])); var l = arguments[1], i = []; if ("array" == Cm(l)) { if ("array" == Cm(l[0]) && !Yd.isDyadicArr(l)) return Ih.error.v; i = i.concat(Yd.getDataArr(l, !0)) } else if ("object" == Cm(l) && null != l.startCell) i = i.concat(Yd.getCellDataArr(l, "number", !0)); else { if (!ba(l)) return Ih.error.v; i.push(l) } var o = []; for (e = 0; e < i.length; e++)ba(i[e]) && o.push(parseFloat(i[e])); if (0 == n.length && 0 == o.length) return [[0], [0]]; if (0 == n.length) { var s = [[0]]; for (e = 0; e < o.length; e++)s.push([0]); return s } if (0 == o.length) return [[0], [n.length]]; o.sort((function (e, t) { return e - t })); for (s = [], e = 0; e < o.length; e++)if (0 == e) { for (var c = 0, u = 0; u < n.length; u++)n[u] <= o[0] && c++; s.push([c]) } else if (e == o.length - 1) { var d = 0, h = 0; for (u = 0; u < n.length; u++)n[u] <= o[e] && n[u] > o[e - 1] && d++, n[u] > o[e] && h++; s.push([d]), s.push([h]) } else { for (c = 0, u = 0; u < n.length; u++)n[u] <= o[e] && n[u] > o[e - 1] && c++; s.push([c]) } return s } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, GROWTH: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "text"); else { if (!ba(a)) return Ih.error.v; (p = []).push(parseFloat(a)), r.push(p) } var n = r.length, l = r[0].length; for (e = 0; e < n; e++)for (var i = 0; i < l; i++) { if (!ba(r[e][i])) return Ih.error.v; r[e][i] = parseFloat(r[e][i]) } var o = []; for (e = 1; e <= n; e++)for (i = 1; i <= l; i++) { var s = (e - 1) * l + i; o.push(s) } if (arguments.length >= 2) { var c = arguments[1]; if (o = [], "array" == Cm(c)) { if ("array" == Cm(c[0]) && !Yd.isDyadicArr(c)) return Ih.error.v; o = Yd.getDataDyadicArr(c) } else if ("object" == Cm(c) && null != c.startCell) o = Yd.getCellDataDyadicArr(c, "text"); else { if (!ba(c)) return Ih.error.v; (p = []).push(parseFloat(c)), o.push(p) } for (e = 0; e < o.length; e++)for (i = 0; i < o[0].length; i++) { if (!ba(o[e][i])) return Ih.error.v; o[e][i] = parseFloat(o[e][i]) } } var u = o.length, d = o[0].length, h = o; if (arguments.length >= 3) { var m = arguments[2]; if (h = [], "array" == Cm(m)) { if ("array" == Cm(m[0]) && !Yd.isDyadicArr(m)) return Ih.error.v; h = Yd.getDataDyadicArr(m) } else if ("object" == Cm(m) && null != m.startCell) h = Yd.getCellDataDyadicArr(m, "text"); else { if (!ba(m)) return Ih.error.v; var p; (p = []).push(parseFloat(m)), h.push(p) } for (e = 0; e < h.length; e++)for (i = 0; i < h[0].length; i++) { if (!ba(h[e][i])) return Ih.error.v; h[e][i] = parseFloat(h[e][i]) } } var f = !0; if (4 == arguments.length && ka(f = Yd.getCellBoolen(arguments[3]))) return f; if (n != u || l != d) return Ih.error.r; function g(e, t) { for (var a = 0, r = 0, n = 0, l = 0, i = 0; i < e.length; i++)for (var o = 0; o < e[i].length; o++)a += e[i][o], r += Math.log(t[i][o]), n += e[i][o] * Math.log(t[i][o]), l += e[i][o] * e[i][o]; var s = e.length * e[0].length, c = a / s, u = r / s, d = (n / s - c * u) / (l / s - c * c), h = u - d * c; return [Math.exp(d), Math.exp(h)] } var v = g(o, r), y = v[0]; if (f) var b = v[1]; else b = 1; var k = []; for (e = 0; e < h.length; e++)for (i = 0; i < h[e].length; i++) { var x = h[e][i], w = b * Math.pow(y, x); k.push(Math.round(1e9 * w) / 1e9) } return k } catch (e) { var _ = e; return _ = Ih.errorInfo(_), [Ih.error.v, _] } }, LINEST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return Ih.error.v } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, LOGEST: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return Ih.error.v } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, MDETERM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "text"); else { var n = []; n.push(a), r.push(n) } for (e = 0; e < r.length; e++)for (var l = 0; l < r[e].length; l++) { if (!ba(r[e][l])) return Ih.error.v; r[e][l] = parseFloat(r[e][l]) } if (r.length != r[0].length) return Ih.error.v; function i(e, t) { var a, r = new Array; if (1 == t) return a = e[0][0]; if (2 == t) return a = e[0][0] * e[1][1] - e[0][1] * e[1][0]; if (3 == t) return a = e[0][0] * e[1][1] * e[2][2] + e[1][0] * e[2][1] * e[0][2] + e[2][0] * e[0][1] * e[1][2] - e[2][0] * e[1][1] * e[0][2] - e[0][0] * e[2][1] * e[1][2] - e[1][0] * e[0][1] * e[2][2]; a = 0; for (var n = new Array, l = new Array, i = 0; i < t; i++)r[i] = e[i][0] * Math.pow(-1, i + 1 + 1); for (i = 0; i < t; i++) { l[i] = new Array; for (var o = 0; o < t - 1; o++)l[i][o] = e[i][o + 1] } for (i = 0; i < t; i++) { for (o = 0; o < t; o++) { n[o] = new Array; for (var s = 0; s < t - 1; s++)i > o ? n[o][s] = l[o][s] : i < o && (n[o - 1][s] = l[o][s]) } a += r[i] * arguments.callee(n, t - 1) } return a } return i(r, r.length) } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, MINVERSE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "text"); else { var n = []; n.push(a), r.push(n) } for (e = 0; e < r.length; e++)for (var l = 0; l < r[e].length; l++) { if (!ba(r[e][l])) return Ih.error.v; r[e][l] = parseFloat(r[e][l]) } return r.length != r[0].length ? Ih.error.v : Kd(r) } catch (e) { var i = e; return i = Ih.errorInfo(i), [Ih.error.v, i] } }, MMULT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { if (!(m = Ih.errorParamCheck(this.p, arguments[e], e))[0]) return Ih.error.v } try { var t = arguments[0], a = []; if ("array" == Cm(t)) { if ("array" == Cm(t[0]) && !Yd.isDyadicArr(t)) return Ih.error.v; a = Yd.getDataDyadicArr(t) } else if ("object" == Cm(t) && null != t.startCell) a = Yd.getCellDataDyadicArr(t, "text"); else { (u = []).push(t), a.push(u) } for (e = 0; e < a.length; e++)for (var r = 0; r < a[e].length; r++) { if (!ba(a[e][r])) return Ih.error.v; a[e][r] = parseFloat(a[e][r]) } var n = arguments[1], l = []; if ("array" == Cm(n)) { if ("array" == Cm(n[0]) && !Yd.isDyadicArr(n)) return Ih.error.v; l = Yd.getDataDyadicArr(n) } else if ("object" == Cm(n) && null != n.startCell) l = Yd.getCellDataDyadicArr(n, "text"); else { (u = []).push(n), l.push(u) } for (e = 0; e < l.length; e++)for (r = 0; r < l[e].length; r++) { if (!ba(l[e][r])) return Ih.error.v; l[e][r] = parseFloat(l[e][r]) } if (a[0].length != l.length) return Ih.error.v; for (var i = a.length, o = l[0].length, s = [], c = 0; c < i; c++) { for (var u = [], d = 0; d < o; d++) { for (var h = 0, m = 0; m < a[0].length; m++)h += a[c][m] * l[m][d]; u.push(h) } s.push(u) } return s } catch (e) { var p = e; return p = Ih.errorInfo(p), [Ih.error.v, p] } }, SUMPRODUCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "text"); else { (c = []).push(a), r.push(c) } for (e = 0; e < r.length; e++)for (var n = 0; n < r[e].length; n++)ba(r[e][n]) ? r[e][n] = parseFloat(r[e][n]) : r[e][n] = 0; var l = r.length, i = r[0].length; if (arguments.length >= 2) for (e = 1; e < arguments.length; e++) { var o = arguments[e], s = []; if ("array" == Cm(o)) { if ("array" == Cm(o[0]) && !Yd.isDyadicArr(o)) return Ih.error.v; s = Yd.getDataDyadicArr(o) } else if ("object" == Cm(o) && null != o.startCell) s = Yd.getCellDataDyadicArr(o, "text"); else { var c; (c = []).push(o), s.push(c) } if (s.length != l || s[0].length != i) return Ih.error.v; for (var u = 0; u < l; u++)for (var d = 0; d < i; d++)ba(s[u][d]) ? r[u][d] = r[u][d] * parseFloat(s[u][d]) : r[u][d] = 0 } var h = 0; for (u = 0; u < l; u++)for (d = 0; d < i; d++)h += r[u][d]; return h } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, ISFORMULA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; return "object" == Cm(r) && null != r.startCell ? null != r.data && (null != (a = "array" == Cm(r.data) ? r.data[0][0] : r.data) && null != a.f) : Ih.error.v } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, CELL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if (null == r.data) return Ih.error.v; if ("array" == Cm(r.data)) return Ih.error.v; if (ya(a = r.data.v)) return Ih.error.v } else a = r; var n, l = arguments[1]; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (n = l.startCell, -1 == ["address", "col", "color", "contents", "filename", "format", "parentheses", "prefix", "protect", "row", "type", "width"].indexOf(a)) return Ih.error.v; var i, o = Tl()[_l(ga.currentSheetIndex)], s = Ih.getcellrange(n), c = s.row[0], u = s.column[0], d = Tl(), h = _l(ga.calculateSheetIndex), m = d[h].data; switch (null != Ih.execFunctionGlobalData && null != Ih.execFunctionGlobalData[c + "_" + u + "_" + ga.calculateSheetIndex] ? i = Ih.execFunctionGlobalData[c + "_" + u + "_" + ga.calculateSheetIndex].v : null != m[c][u] && null != m[c][u].v && "" != m[c][u].v ? (i = m[c][u]) instanceof Object && (i = i.v) : i = 0, a) { case "address": return n; case "col": return u + 1; case "color": return 0; case "contents": return i; case "filename": return o.name; case "format": return null == m[c][u] || null == m[c][u].ct ? "G" : m[c][u].ct.fa; case "parentheses": return null == m[c][u] || null == m[c][u].v || "" == m[c][u].v ? 0 : m[c][u].v > 0 ? 1 : 0; case "prefix": return 0 == i ? "" : 0 == m[c][u].ht ? "^" : 1 == m[c][u].ht ? "'" : 2 == m[c][u].ht ? '"' : ""; case "protect": return 0; case "row": return c + 1; case "type": return 0 == i ? "b" : "l"; case "width": var p = o.config; return null != p.columnlen && u in p.columnlen ? p.columnlen[u] : ga.defaultcollen } } catch (e) { var f = e; return f = Ih.errorInfo(f), [Ih.error.v, f] } }, NA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return Ih.error.na } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, ERROR_TYPE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if (null == r.data) return Ih.error.na; if ("array" == Cm(r.data)) { if (null == (a = r.data[0][0]) || ya(a.v)) return Ih.error.na; a = a.v } else { if (ya(r.data.v)) return Ih.error.na; a = r.data.v } } else a = r; var n = { "#NULL!": 1, "#DIV/0!": 2, "#VALUE!": 3, "#REF!": 4, "#NAME?": 5, "#NUM!": 6, "#N/A": 7, "#GETTING_DATA": 8 }; return a in n ? n[a] : Ih.error.na } catch (e) { var l = e; return l = Ih.errorInfo(l), [Ih.error.v, l] } }, ISBLANK: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0]; return "object" == Cm(a) && null != a.startCell && null == a.data } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, ISERR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !0; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return ["#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISERROR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !0; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return ["#N/A", "#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISLOGICAL: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !1; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return "true" == a.toString().toLowerCase() || "false" == a.toString().toLowerCase() } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISNA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !1; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return "#N/A" == a.toString() } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISNONTEXT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !0; if (null == r.data || ya(r.data.v)) return !0; a = r.data.v } else a = r; return ["#N/A", "#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1 || ("true" == a.toString().toLowerCase() || "false" == a.toString().toLowerCase() || !!ba(a)) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISNUMBER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !1; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return !!ba(a) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, ISREF: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { return "object" == Cm(arguments[0]) && null != arguments[0].startCell } catch (e) { var a = e; return a = Ih.errorInfo(a), [Ih.error.v, a] } }, ISTEXT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return !1; if (null == r.data || ya(r.data.v)) return !1; a = r.data.v } else a = r; return !(["#N/A", "#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1) && ("true" != a.toString().toLowerCase() && "false" != a.toString().toLowerCase() && !ba(a)) } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, TYPE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) return 64; if ("object" == Cm(r) && null != r.startCell) { if ("array" == Cm(r.data)) return 16; if (null == r.data || ya(r.data.v)) return 1; a = r.data.v } else a = r; return ["#N/A", "#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1 ? 16 : "true" == a.toString().toLowerCase() || "false" == a.toString().toLowerCase() ? 4 : ba(a) ? 1 : 2 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, N: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a, r = arguments[0]; if ("array" == Cm(r)) if ("array" == Cm(r[0])) { if (!Yd.isDyadicArr(r)) return Ih.error.v; a = r[0][0] } else a = r[0]; else if ("object" == Cm(r) && null != r.startCell) if ("array" == Cm(r.data)) { if (null == (a = r.data[0][0]) || ya(a.v)) return 0; a = a.v } else { if (null == r.data || ya(r.data.v)) return 0; a = r.data.v } else a = r; return ["#N/A", "#VALUE!", "#REF!", "#DIV/0!", "#NUM!", "#NAME?", "#NULL!"].indexOf(a) > -1 ? a : "true" == a.toString().toLowerCase() || "false" == a.toString().toLowerCase() ? "true" == a.toString().toLowerCase() ? 1 : 0 : ba(a) ? parseFloat(a) : 0 } catch (e) { var n = e; return n = Ih.errorInfo(n), [Ih.error.v, n] } }, TO_DATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? ws("yyyy-mm-dd", a = parseFloat(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TO_PURE_NUMBER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : us(a).isValid() ? xs(a)[2] : null == fs(a).value() ? a : fs(a).value() } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TO_TEXT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0], "text"); return ka(a) ? a : ws("@", a) } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TO_DOLLARS: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? ws("$ 0.00", a = parseFloat(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, TO_PERCENT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); return ka(a) ? a : ba(a) ? ws("0%", a = parseFloat(a)) : Ih.error.v } catch (e) { var r = e; return r = Ih.errorInfo(r), [Ih.error.v, r] } }, DGET: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); return 0 === o.length ? Ih.error.v : o.length > 1 ? Ih.error.nm : s[o[0]] } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, DMAX: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = s[o[0]]; for (e = 1; e < o.length; e++)u < s[o[e]] && (u = s[o[e]]); return u } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DMIN: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = findField(r, n); s = rest(r[c]) } else s = rest(r[n]); var u = s[o[0]]; for (e = 1; e < o.length; e++)u > s[o[e]] && (u = s[o[e]]); return u } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DAVERAGE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = 0; for (e = 0; e < o.length; e++)u += s[o[e]]; return 0 === o.length ? Ih.error.d : u / o.length } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DCOUNT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DCOUNTA: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DPRODUCT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; u = Yd.compact(u); var d = 1; for (e = 0; e < u.length; e++)d *= u[e]; return d } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, DSTDEV: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return u = Yd.compact(u), window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DSTDEVP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return u = Yd.compact(u), window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DSUM: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; u = Yd.compact(u); var d = 0; for (e = 0; e < u.length; e++)d += u[e]; return d } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, DVAR: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return u = Yd.compact(u), window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, DVARP: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("object" != Cm(a) || null == a.startCell) return Ih.error.v; if (null == a.data) return Ih.error.v; r = Yd.getCellDataDyadicArr(a, "text"); var n = Yd.getFirstValue(arguments[1], "text"); if (ka(n)) return n; if (ya(n)) return Ih.error.v; var l = arguments[2], i = []; if ("object" != Cm(l) || null == l.startCell) return Ih.error.v; if (null == l.data) return Ih.error.v; if (i = Yd.getCellDataDyadicArr(l, "text"), !ba(n) && "string" !== Cm(n)) return Ih.error.v; var o = Yd.findResultIndex(r, i), s = []; if ("string" === Cm(n)) { var c = Yd.findField(r, n); s = Yd.rest(r[c]) } else s = Yd.rest(r[n]); var u = []; for (e = 0; e < o.length; e++)u[e] = s[o[e]]; return u = Yd.compact(u), window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, u) } catch (e) { var d = e; return d = Ih.errorInfo(d), [Ih.error.v, d] } }, LINESPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = arguments[1], o = arguments[2], s = arguments[3], c = arguments[4], u = arguments[5], d = arguments[6], h = arguments[7], m = Tl(), p = _l(ga.calculateSheetIndex), f = m[p].data, g = Ih.readCellDataToOneArray(l), v = xm.getCellRealSize(f, a, r), y = v[0], b = v[1], k = {}; null == o && (o = 1), k.lineWidth = o, k.offsetY = o + 1, k.height = b - (o + 1), k.width = y; var x = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), k[e] = t) }; if (null == i && (i = "#2ec7c9"), x("lineColor", i), k.fillColor = 0, s) if ("string" == typeof s) { s = s.toLowerCase(); var w = null; "min" == s ? w = window.luckysheet_function.MIN.f({ data: g }) : "max" == s ? w = window.luckysheet_function.MAX.f({ data: g }) : "avg" == s || "mean" == s ? w = window.luckysheet_function.AVERAGE.f({ data: g }) : "median" == s && (w = window.luckysheet_function.MEDIAN.f({ data: g })), w && (k.normalRangeMin = w, k.normalRangeMax = w) } else k.normalRangeMin = s, k.normalRangeMax = s; null == c && (c = "#000"), x("normalRangeColor", c), x("maxSpotColor", u), x("minSpotColor", d), null == h && (h = "1.5"), k.spotRadius = h; var _ = Bu.init(g, k); return _ } catch (e) { var C = e; return C = Ih.errorInfo(C), [Ih.error.v, C] } }, AREASPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = arguments[1], o = arguments[2], s = arguments[3], c = arguments[4], u = arguments[5], d = Ih.readCellDataToOneArray(l), h = Tl(), m = _l(ga.calculateSheetIndex), p = h[m].data, f = xm.getCellRealSize(p, a, r), g = f[0], v = f[1], y = {}; null == s && (s = 1), y.lineWidth = s, y.offsetY = s + 1, y.height = v - (s + 1), y.width = g; var b = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), y[e] = t) }; if (null == i && (i = "#2ec7c9"), b("lineColor", i), b("fillColor", o), null == s && (s = "1"), y.lineWidth = s, c) if ("string" == typeof c) { c = c.toLowerCase(); var k = null; "min" == c ? k = window.luckysheet_function.MIN.f({ data: d }) : "max" == c ? k = window.luckysheet_function.MAX.f({ data: d }) : "avg" == c || "mean" == c ? k = window.luckysheet_function.AVERAGE.f({ data: d }) : "median" == c && (k = window.luckysheet_function.MEDIAN.f({ data: d })), k && (y.normalRangeMin = k, y.normalRangeMax = k) } else y.normalRangeMin = c, y.normalRangeMax = c; null == u && (u = "#000"), b("normalRangeColor", u); var x = Bu.init(d, y); return x } catch (e) { var w = e; return w = Ih.errorInfo(w), [Ih.error.v, w] } }, COLUMNSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3], y = arguments[4]; m.type = "column", null == f && (f = "1"), m.barSpacing = f, null == g && (g = "#fc5c5c"), p("barColor", g), null == v && (v = "#97b552"), p("negBarColor", v), m.chartRangeMax = null == y || !1 === y || "number" != typeof y ? void 0 : y; var b = Ih.sparklinesColorMap(arguments); b && (m.colorMap = b); var k = Bu.init(i, m); return k } catch (e) { var x = e; return x = Ih.errorInfo(x), [Ih.error.v, x] } }, STACKCOLUMNSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList, arguments[0]), l = [], i = []; if (null != n && null != n.data && (i = n.data), "array" == Cm(i)) i = Ih.getPureValueByData(i); else { if ("object" == Cm(i)) return [i = i.v]; /\{.*?\}/.test(i) && (i = i.replace(/\{/g, "[").replace(/\}/g, "]")), i = new Function("return " + i)() } var o = arguments[1]; i.length; if (null == o || o) for (var s = 0; s < i[0].length; s++) { for (var c = "", u = 0; u < i.length; u++)c += i[u][s] + ":"; c = c.substr(0, c.length - 1), l.push(c) } else { for (u = 0; u < i.length; u++) { var d = ""; for (s = 0; s < i[0].length; s++)d += i[u][s] + ":"; d = d.substr(0, d.length - 1), l.push(d) } i[0].length } var h = Tl(), m = _l(ga.calculateSheetIndex), p = h[m].data, f = xm.getCellRealSize(p, a, r), g = f[0], v = f[1], y = {}; y.height = v, y.width = g; var b = arguments[2], k = arguments[3]; y.type = "column", null == b && (b = "1"), y.barSpacing = b, y.chartRangeMax = null == k || !1 === k || "number" != typeof k ? void 0 : k; var x = Ih.sparklinesColorMap(arguments, 4); x && (y.colorMap = x); var w = Bu.init(l, y); return w } catch (e) { var _ = e; return _ = Ih.errorInfo(_), [Ih.error.v, _] } }, BARSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3], y = arguments[4]; m.type = "bar", null == f && (f = "1"), m.barSpacing = f, null == g && (g = "#fc5c5c"), p("barColor", g), null == v && (v = "#97b552"), p("negBarColor", v), m.chartRangeMax = null == y || !1 === y || "number" != typeof y ? void 0 : y; var b = Ih.sparklinesColorMap(arguments); b && (m.colorMap = b); var k = Bu.init(i, m); return k } catch (e) { var x = e; return x = Ih.errorInfo(x), [Ih.error.v, x] } }, STACKBARSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList, arguments[0]), l = [], i = []; if (null != n && null != n.data && (i = n.data), "array" == Cm(i)) i = Ih.getPureValueByData(i); else { if ("object" == Cm(i)) return [i = i.v]; /\{.*?\}/.test(i) && (i = i.replace(/\{/g, "[").replace(/\}/g, "]")), i = new Function("return " + i)() } var o = arguments[1]; i.length; if (null == o || o) for (var s = 0; s < i[0].length; s++) { for (var c = "", u = 0; u < i.length; u++)c += i[u][s] + ":"; c = c.substr(0, c.length - 1), l.push(c) } else { for (u = 0; u < i.length; u++) { var d = ""; for (s = 0; s < i[0].length; s++)d += i[u][s] + ":"; d = d.substr(0, d.length - 1), l.push(d) } i[0].length } var h = Tl(), m = _l(ga.calculateSheetIndex), p = h[m].data, f = xm.getCellRealSize(p, a, r), g = f[0], v = f[1], y = {}; y.height = v, y.width = g; var b = arguments[2], k = arguments[3]; y.type = "bar", null == b && (b = "1"), y.barSpacing = b, y.chartRangeMax = null == k || !1 === k || "number" != typeof k ? void 0 : k; var x = Ih.sparklinesColorMap(arguments, 4); x && (y.colorMap = x); var w = Bu.init(l, y); return w } catch (e) { var _ = e; return _ = Ih.errorInfo(_), [Ih.error.v, _] } }, DISCRETESPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3]; m.type = "discrete", null == f && (f = 0), m.thresholdValue = f, null == g && (g = "#2ec7c9"), p("lineColor", g), null == v && (v = "#fc5c5c"), p("thresholdColor", v); var y = Bu.init(i, m); return y } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, TRISTATESPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3], y = arguments[4]; m.type = "tristate", null == f && (f = "1"), m.barSpacing = f, null == g && (g = "#fc5c5c"), p("barColor", g), null == v && (v = "#97b552"), p("negBarColor", v), null == y && (y = "#999"), p("zeroBarColor", y); var b = Ih.sparklinesColorMap(arguments); b && (m.colorMap = b); var k = Bu.init(i, m); return k } catch (e) { var x = e; return x = Ih.errorInfo(x), [Ih.error.v, x] } }, PIESPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3]; m.type = "pie", null == f && (f = 0), m.offset = f, null == g && (g = 0), p("borderWidth", g), null == v && (v = "#97b552"), p("borderColor", v); var y = Ih.sparklinesColorMap(arguments, 4); y && (m.colorMap = y); var b = Bu.init(i, m); return b } catch (e) { var k = e; return k = Ih.errorInfo(k), [Ih.error.v, k] } }, BOXSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList), l = arguments[0], i = Ih.readCellDataToOneArray(l), o = Tl(), s = _l(ga.calculateSheetIndex), c = o[s].data, u = xm.getCellRealSize(c, a, r), d = u[0], h = u[1], m = {}; m.height = h, m.width = d; var p = function (e, t) { t && ("number" == typeof t && (t > 19 && (t %= 20), t = n[t]), m[e] = t) }, f = arguments[1], g = arguments[2], v = arguments[3]; m.type = "box", null == f && (f = 1.5), m.outlierIQR = f, null == g ? g = 0 : p("target", g), null == v && (v = 1.5), p("spotRadius", v); var y = Bu.init(i, m); return y } catch (e) { var b = e; return b = Ih.errorInfo(b), [Ih.error.v, b] } }, BULLETSPLINES: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = (window.luckysheetCurrentFunction, Ih.colorList, Tl()), l = _l(ga.calculateSheetIndex), i = n[l].data, o = xm.getCellRealSize(i, a, r), s = o[0], c = o[1], u = {}; u.height = c, u.width = s; var d = []; ah(arguments); var h = Ih.getValueByFuncData(arguments[0]), m = Ih.getValueByFuncData(arguments[1]); d.push(h), d.push(m); for (e = 2; e < arguments.length; e++)d.push(Ih.getValueByFuncData(arguments[e])); u.type = "bullet"; var p = Bu.init(d, u); return p } catch (e) { var f = e; return f = Ih.errorInfo(f), [Ih.error.v, f] } }, SORT: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = [], n = 1, l = 1; if ("array" == Cm(a)) if ("array" == Cm(a[0])) { if (!Yd.isDyadicArr(a)) return Ih.error.v; for (e = 0; e < a.length; e++) { for (var i = [], o = 0; o < a[e].length; o++) { var s = a[e][o]; i.push(s) } r.push(i) } n = r.length, l = r[0].length } else { for (e = 0; e < a.length; e++) { s = a[e]; r.push(s) } n = r.length } else if ("object" == Cm(a) && null != a.startCell) if (null != a.data) if ("array" == Cm(a.data)) { for (e = 0; e < a.data.length; e++) { for (i = [], o = 0; o < a.data[e].length; o++) { if (null != a.data[e][o]) ya(s = a.data[e][o].v) && (s = 0), i.push(s); else i.push(0) } r.push(i) } n = r.length, l = r[0].length } else { ya(s = a.data.v) && (s = 0), r.push(s) } else r.push(0); else { s = a; r.push(s) } var c = 1; if (arguments.length >= 2) { if (ka(c = Yd.getFirstValue(arguments[1]))) return c; if (!ba(c)) return Ih.error.v; c = parseInt(c) } var u = 1; if (arguments.length >= 3) { if (ka(u = Yd.getFirstValue(arguments[2]))) return u; if (!ba(u)) return Ih.error.v; u = Math.floor(parseFloat(u)) } var d = !1; if (4 == arguments.length && ka(d = Yd.getCellBoolen(arguments[3]))) return d; if (d) { if (c < 1 || c > n) return Ih.error.v } else if (c < 1 || c > l) return Ih.error.v; if (1 != u && -1 != u) return Ih.error.v; var h = function (e, t) { return "array" == Cm(e) && (e = e[c - 1]), "array" == Cm(t) && (t = t[c - 1]), isNaN(e) || isNaN(t) ? isNaN(e) ? isNaN(t) ? e > t ? 1 : e < t ? -1 : void 0 : 1 : -1 : e - t }, m = function (e, t) { return "array" == Cm(e) && (e = e[c - 1]), "array" == Cm(t) && (t = t[c - 1]), isNaN(e) || isNaN(t) ? isNaN(e) ? isNaN(t) ? e > t ? -1 : e < t ? 1 : void 0 : -1 : 1 : t - e }; return d ? (r = r[0].map((function (e, t) { return r.map((function (e) { return e[t] })) })), 1 == u && r.sort(h), -1 == u && r.sort(m), r = r[0].map((function (e, t) { return r.map((function (e) { return e[t] })) }))) : (1 == u && r.sort(h), -1 == u && r.sort(m)), r } catch (e) { var p = e; return p = Ih.errorInfo(p), [Ih.error.v, p] } }, FILTER: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "number"); else { (u = []).push(parseFloat(a)), r.push(u) } r.length, r[0].length; var n = arguments[1], l = [], i = "row"; if ("array" == Cm(n)) if ("array" == Cm(n[0])) { if (!Yd.isDyadicArr(n)) return Ih.error.v; if (n.length > 1 && n[0].length > 1) return Ih.error.v; if (n.length > 1) { if (n.length != r.length) return Ih.error.v; i = "row"; for (e = 0; e < n.length; e++) { if ("boolean" == Cm(o = n[e][0])); else if ("string" != Cm(o) || "true" != o.toLowerCase() && "false" != o.toLowerCase()) { if (!ba(o)) return Ih.error.v; o = 0 != (o = parseFloat(o)) } else "true" == o.toLowerCase() ? o = !0 : "false" == o.toLowerCase() && (o = !1); l.push(o) } } if (n[0].length > 1) { if (n[0].length != r[0].length) return Ih.error.v; i = "col"; for (e = 0; e < n[0].length; e++) { if ("boolean" == Cm(o = n[0][e])); else if ("string" != Cm(o) || "true" != o.toLowerCase() && "false" != o.toLowerCase()) { if (!ba(o)) return Ih.error.v; o = 0 != (o = parseFloat(o)) } else "true" == o.toLowerCase() ? o = !0 : "false" == o.toLowerCase() && (o = !1); l.push(o) } } } else { if (n.length != r[0].length) return Ih.error.v; i = "col"; for (e = 0; e < n.length; e++) { if ("boolean" == Cm(o = n[e])); else if ("string" != Cm(o) || "true" != o.toLowerCase() && "false" != o.toLowerCase()) { if (!ba(o)) return Ih.error.v; o = 0 != (o = parseFloat(o)) } else "true" == o.toLowerCase() ? o = !0 : "false" == o.toLowerCase() && (o = !1); l.push(o) } } else { if ("object" != Cm(n) || null == n.data || "array" != Cm(n.data)) return Ih.error.v; if (n.data.length > 1 && n.data[0].length > 1) return Ih.error.v; if (n.data.length > 1) { if (n.data.length != r.length) return Ih.error.v; i = "row"; for (e = 0; e < n.data.length; e++) { if (ya(o = n.data[e][0].v) && (o = 0), "boolean" == Cm(o)); else if ("string" != Cm(o) || "true" != o.toLowerCase() && "false" != o.toLowerCase()) { if (!ba(o)) return Ih.error.v; o = 0 != (o = parseFloat(o)) } else "true" == o.toLowerCase() ? o = !0 : "false" == o.toLowerCase() && (o = !1); l.push(o) } } if (n.data[0].length > 1) { if (n.data[0].length != r[0].length) return Ih.error.v; i = "col"; for (e = 0; e < n.data[0].length; e++) { var o; if (ya(o = n.data[0][e].v) && (o = 0), "boolean" == Cm(o)); else if ("string" != Cm(o) || "true" != o.toLowerCase() && "false" != o.toLowerCase()) { if (!ba(o)) return Ih.error.v; o = 0 != (o = parseFloat(o)) } else "true" == o.toLowerCase() ? o = !0 : "false" == o.toLowerCase() && (o = !1); l.push(o) } } } var s = ""; if (3 == arguments.length && ka(s = Yd.getFirstValue(arguments[2], "text"))) return s; var c = []; if ("row" == i) for (e = 0; e < r.length; e++)l[e] && c.push(r[e]); else for (e = 0; e < r.length; e++) { for (var u = [], d = 0; d < r[0].length; d++)l[d] && u.push(r[e][d]); u.length > 0 && c.push(u) } return 0 == c.length ? s : c } catch (e) { var h = e; return h = Ih.errorInfo(h), [Ih.error.v, h] } }, UNIQUE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = arguments[0], r = []; if ("array" == Cm(a)) { if ("array" == Cm(a[0]) && !Yd.isDyadicArr(a)) return Ih.error.v; r = Yd.getDataDyadicArr(a) } else if ("object" == Cm(a) && null != a.startCell) r = Yd.getCellDataDyadicArr(a, "number"); else { var n = []; n.push(parseFloat(a)), r.push(n) } var l = !1; if (arguments.length >= 2 && ka(l = Yd.getCellBoolen(arguments[1]))) return l; var i = !1; if (3 == arguments.length && ka(i = Yd.getCellBoolen(arguments[2]))) return i; if (l) { r = r[0].map((function (e, t) { return r.map((function (e) { return e[t] })) })); var o = {}, s = [], c = []; for (e = 0; e < r.length; e++) { for (var u = "", d = 0; d < r[e].length; d++)u += r[e][d].toString() + "|||"; s.push(u), u in o || (o[u] = 0, c.push(r[e])) } if (i) { var h = []; for (e = 0; e < s.length; e++)s.indexOf(s[e]) == s.lastIndexOf(s[e]) && h.push(r[e]); return h = h[0].map((function (e, t) { return h.map((function (e) { return e[t] })) })) } return c = c[0].map((function (e, t) { return c.map((function (e) { return e[t] })) })) } for (o = {}, s = [], c = [], e = 0; e < r.length; e++) { for (u = "", d = 0; d < r[e].length; d++)u += r[e][d].toString() + "|||"; s.push(u), u in o || (o[u] = 0, c.push(r[e])) } if (i) { for (h = [], e = 0; e < s.length; e++)s.indexOf(s[e]) == s.lastIndexOf(s[e]) && h.push(r[e]); return h } return c } catch (e) { var m = e; return m = Ih.errorInfo(m), [Ih.error.v, m] } }, RANDARRAY: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = 1; if (arguments.length >= 1) { if (ka(a = Yd.getFirstValue(arguments[0]))) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a) } var r = 1; if (2 == arguments.length) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } if (a <= 0 || r <= 0) return Ih.error.v; var n = []; for (e = 0; e < a; e++) { for (var l = [], i = 0; i < r; i++)l.push(Math.random().toFixed(9)); n.push(l) } return n } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } }, SEQUENCE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = Yd.getFirstValue(arguments[0]); if (ka(a)) return a; if (!ba(a)) return Ih.error.v; a = parseInt(a); var r = 1; if (arguments.length >= 2) { if (ka(r = Yd.getFirstValue(arguments[1]))) return r; if (!ba(r)) return Ih.error.v; r = parseInt(r) } var n = 1; if (arguments.length >= 3) { if (ka(n = Yd.getFirstValue(arguments[2]))) return n; if (!ba(n)) return Ih.error.v; n = parseFloat(n) } var l = 1; if (4 == arguments.length) { if (ka(l = Yd.getFirstValue(arguments[3]))) return l; if (!ba(l)) return Ih.error.v; l = parseFloat(l) } if (a <= 0 || r <= 0) return Ih.error.v; var i = []; for (e = 0; e < a; e++) { for (var o = [], s = 0; s < r; s++) { var c = n + l * (s + r * e); o.push(c) } i.push(o) } return i } catch (e) { var u = e; return u = Ih.errorInfo(u), [Ih.error.v, u] } }, EVALUATE: function () { if (arguments.length < this.m[0] || arguments.length > this.m[1]) return Ih.error.na; for (var e = 0; e < arguments.length; e++) { var t = Ih.errorParamCheck(this.p, arguments[e], e); if (!t[0]) return Ih.error.v } try { var a = window.luckysheetCurrentRow, r = window.luckysheetCurrentColumn, n = window.luckysheetCurrentIndex, l = Yd.getFirstValue(arguments[0]).toString(); if (ka(l)) return l; 0 != l.trim().indexOf("=") && (l = "=" + l); var i = Ih.execstringformula(l, a, r, n); return i[1] } catch (e) { var o = e; return o = Ih.errorInfo(o), [Ih.error.v, o] } } }; function qy(e) { var t = e.parent().find("luckysheet-print-viewBtn-active").attr("type"); if (e.attr("type") != t) { var a = e.attr("type"); null != a && (!function (e, t) { var a = Sh.getSheetByIndex(); null == a.config && (a.config = {}), null == a.config.sheetViewZoom && (a.config.sheetViewZoom = {}); var r = 1, n = "zoomScaleNormal"; "viewNormal" == e ? n = "viewNormalZoomScale" : "viewLayout" == e ? n = "viewLayoutZoomScale" : "viewPage" == e && (n = "viewPageZoomScale", r = .6); var l = a.config.sheetViewZoom[n]; null == l && (l = r), a.config.curentsheetView = e, ga.clearjfundo && ga.jfredo.push({ type: "viewChange", curType: e, preType: t, sheetIndex: ga.currentSheetIndex }), pd.saveParam("cg", ga.currentSheetIndex, e, { k: "curentsheetView" }), ga.currentSheetView = e, _h(l) }(a, t), e.parent().find(".luckysheet-print-viewBtn").removeClass("luckysheet-print-viewBtn-active"), e.addClass("luckysheet-print-viewBtn-active")) } } var Dy = t(a((function (e, t) { !function (e) { var t = "undefined" != typeof window && void 0 !== window.flatpickr ? window.flatpickr : { l10ns: {} }, a = { weekdays: { shorthand: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"], longhand: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"] }, months: { shorthand: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], longhand: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"] }, rangeSeparator: " 至 ", weekAbbreviation: "周", scrollTitle: "滚动切换", toggleTitle: "点击切换 12/24 小时时制" }; t.l10ns.zh = a; var r = t.l10ns; e.Mandarin = a, e.default = r, Object.defineProperty(e, "__esModule", { value: !0 }) }(t) }))), Fy = {}; function Ey() { var e; gy(), function () { var e = null, t = gn(), a = t.filter, r = t.button; $("#luckysheetfilter").click(Ac); var n = null, l = null; $(".luckysheet-cols-menu .luckysheet-cols-submenu").hover((function () { var e = $(this), t = e.attr("id"), a = $("#" + t + "_sub"), r = e.parent(), n = $(window).width(), i = $(window).height(), o = r.width(), s = a.height() + 25, c = a.width() + 5, u = e.offset(), d = u.top, h = u.left + o; h + c > n && (h = u.left - c), d + s > i && (d = i - s), a.css({ top: d, left: h }).show(), l = e }), (function () { var e = $(this).attr("id"), t = $("#" + e + "_sub"); n = setTimeout((function () { t.hide() }), 200) })), $(".luckysheet-rightgclick-menu-sub").hover((function () { l.addClass("luckysheet-cols-menuitem-hover"), clearTimeout(n) }), (function () { l.removeClass("luckysheet-cols-menuitem-hover"), $(this).hide() })), $("#luckysheet-filter-menu").mouseover((function () { clearTimeout(e), e = setTimeout((function () { $("#luckysheet-filter-submenu").hide() }), 500) })), $("#luckysheet-filter-submenu").mouseover((function () { clearTimeout(e) })).find(".luckysheet-cols-menuitem").click((function (e) { $("#luckysheet-filter-selected span").html($(this).find(".luckysheet-cols-menuitem-content").text()).data("value", $(this).data("value")), $("#luckysheet-filter-menu .luckysheet-filter-selected-input").hide(); var t = $(this).data("type"), a = $(this).attr("data-value"); "2" == t ? ($("#luckysheet-filter-selected span").data("type", "2"), $("#luckysheet-filter-menu .luckysheet-filter-selected-input2").show(), $("#luckysheet-filter-menu .luckysheet-filter-selected-input input").prop("type", "number")) : "0" == t ? $("#luckysheet-filter-selected span").data("type", "0") : ($("#luckysheet-filter-selected span").data("type", "1"), $("#luckysheet-filter-menu .luckysheet-filter-selected-input").eq(0).show(), "dateequal" == a || "datelessthan" == a || "datemorethan" == a ? $("#luckysheet-filter-menu .luckysheet-filter-selected-input input").prop("type", "date") : "morethan" == a || "moreequalthan" == a || "lessthan" == a || "lessequalthan" == a || "equal" == a || "noequal" == a ? $("#luckysheet-filter-menu .luckysheet-filter-selected-input input").prop("type", "number") : $("#luckysheet-filter-menu .luckysheet-filter-selected-input input").prop("type", "text")), $("#luckysheet-filter-byvalue").next().slideUp(), $("#luckysheet-filter-submenu").hide() })), $("#luckysheet-filter-bycondition, #luckysheet-filter-byvalue").click((function () { var e = $(this); e.next().slideToggle(200), setTimeout((function () { "luckysheet-filter-bycondition" == e.attr("id") && $("#luckysheet-filter-bycondition").next().is(":visible") && $("#luckysheet-filter-selected span").text() != a.filiterInputNone && $("#luckysheet-filter-byvalue").next().slideUp(200), e.is($("#luckysheet-filter-bycondition")) && $("#luckysheet-filter-bycondition").next().is(":hidden") && $("#luckysheet-filter-byvalue").next().is(":hidden") && $("#luckysheet-filter-byvalue").next().slideDown(200) }), 300) })), $("#luckysheet-filter-selected").click((function () { var t = $(this).offset(), a = $("#luckysheet-filter-submenu"); a.hide(); var r = $(window).height(), n = $(window).width(), l = a.width(), i = (a.height(), t.top), o = t.left, s = r - t.top - 20; t.left + l > n && (o = t.left - l), t.top > r / 2 && ((i = r - t.top) < 0 && (i = 0), s = t.top - 20), a.css({ top: i, left: o, height: s }).show(), clearTimeout(e) })), $("#luckysheet-cell-main").on("click", ".luckysheet-filter-options", (function (e) { if (bu(ga.currentSheetIndex, "filter")) { var t = $(e.currentTarget), r = t.offset(), n = $("#luckysheet-filter-menu"), l = $(window).height(), i = ($(window).width(), t.data("str")), o = t.data("edr"), s = t.data("cindex"), c = t.data("stc"), u = t.data("edc"), d = "" == t.data("rowhidden") ? {} : JSON.parse(t.data("rowhidden").replace(/\'/g, '"')); $("body .luckysheet-cols-menu").hide(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), $("#luckysheet-filter-byvalue-input").val(""), $("#luckysheet-filter-bycondition").next().hide(), $("#luckysheet-filter-byvalue").next().show(), n.data("str", i), n.data("edr", o), n.data("cindex", s), n.data("stc", c), n.data("edc", u), $("#luckysheet-filter-menu .luckysheet-filter-selected-input").hide().find("input").val(), $("#luckysheet-filter-selected span").data("type", "0").data("type", null).text(a.filiterInputNone); var h = t.data("byconditiontype"); if ($("#luckysheet-filter-selected span").data("value", t.data("byconditionvalue")).data("type", h).text(t.data("byconditiontext")), "2" == h) { var m = $("#luckysheet-filter-menu .luckysheet-filter-selected-input2").show().find("input"); m.eq(0).val(t.data("byconditionvalue1")), m.eq(1).val(t.data("byconditionvalue2")) } else "1" == h && $("#luckysheet-filter-menu .luckysheet-filter-selected-input").eq(0).show().find("input").val(t.data("byconditionvalue1")); $("#luckysheet-filter-orderby-asc").off("click").on("click", (function () { Tc(i, c, o, u, s, !0) })), $("#luckysheet-filter-orderby-desc").off("click").on("click", (function () { Tc(i, c, o, u, s, !1) })), $("#luckysheet-filter-byvalue-select").empty().html('
      ' + a.filiterMoreDataTip + "
      "); var p = {}; return $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").not(this).each((function () { var e = $(this).data("rowhidden"); if ("" == e) return !0; for (var t in e = JSON.parse(e.replace(/\'/g, '"'))) p[t] = 0 })), setTimeout((function () { for (var e = {}, t = {}, n = {}, c = {}, u = i + 1; u <= o; u++)if (!(u in p) && null != ga.flowdata[u]) { var h = ga.flowdata[u][s]; if (null == h || ya(h.v) || null == h.ct || "d" != h.ct.t) { var m = void 0, f = void 0; null == h || ya(h.v) ? (m = null, f = null) : (m = h.v, f = h.m), m in n || (n[m] = {}), f in n[m] || (n[m][f] = 0), n[m][f]++, u in d && (c[m + "#$$$#" + f] = 0) } else { var g = ws("YYYY-MM-DD", h.v), v = g.split("-")[0], y = g.split("-")[1], b = g.split("-")[2]; v in e || (e[v] = {}), y in e[v] || (e[v][y] = {}), b in e[v][y] || (e[v][y][b] = 0), e[v][y][b]++, u in d && (t[v] = 0, t[y] = 0, t[b] = 0) } } var k = []; if (JSON.stringify(e).length > 2) for (var x in e) { var w = 0, _ = ""; for (var C in e[x]) { var T = 0, A = ""; for (var S in e[x][C]) { var I = e[x][C][S]; T += I; var R = void 0; R = Number(C) < 10 ? "0" + Number(C) : C; var q = void 0; q = Number(S) < 10 ? "0" + Number(S) : S, A += x in t && C in t && S in t ? '
      ( ' + I + " )
      " : '
      ( ' + I + " )
      " } w += T; var D = void 0; D = Number(C) < 10 ? "0" + Number(C) : C, _ += x in t && C in t ? '
      ( ' + T + ' )
      ' + A + "
      " : '
      ( ' + T + ' )
      ' + A + "
      " } var F = void 0; F = x in t ? '
      ( ' + w + ' )
      ' + _ + "
      " : '
      ( ' + w + ' )
      ' + _ + "
      ", k.unshift(F) } if (JSON.stringify(n).length > 2) { var E = Object.keys(n); E = xu(E, !0); for (var M = 0; M < E.length; M++) { var N = E[M]; for (var P in n[N]) { var z = void 0; z = N + "#$$$#" + P == "null#$$$#null" ? a.valueBlank : P; var L = void 0; L = N + "#$$$#" + P in c ? '
      ( ' + n[N][P] + " )
      " : '
      ( ' + n[N][P] + " )
      ", k.push(L) } } } $("#luckysheet-filter-byvalue-select").html("
      " + k.join("") + "
      ") }), 1), Dm(n, r.left, r.top + 20), e.stopPropagation(), !1 } })), $("#luckysheet-filter-orderby-color").hover((function () { for (var e = $("#luckysheet-filter-menu"), t = e.data("str"), n = e.data("edr"), l = e.data("cindex"), i = (e.data("stc"), e.data("edc"), {}), o = {}, s = wc.getComputeMap(), c = gd.getComputeMap(), u = t + 1; u <= n; u++) { var d = ga.flowdata[u][l], h = xm.checkstatus(ga.flowdata, u, l, "bg"); null == h && (h = "#ffffff"); var m = wc.checksAF(u, l, s); null != m && (h = m[1]); var p = gd.checksCF(u, l, c); null != p && null != p.cellColor && (h = p.cellColor), h.indexOf("rgb") > -1 && (h = Am(h)), 4 == h.length && (h = h.substr(0, 1) + h.substr(1, 1).repeat(2) + h.substr(2, 1).repeat(2) + h.substr(3, 1).repeat(2)); var f = xm.checkstatus(ga.flowdata, u, l, "fc"); null != m && (f = m[0]), null != p && null != p.textColor && (f = p.textColor), f.indexOf("rgb") > -1 && (f = Am(f)), 4 == f.length && (f = f.substr(0, 1) + f.substr(1, 1).repeat(2) + f.substr(2, 1).repeat(2) + f.substr(3, 1).repeat(2)), null != ga.config && null != ga.config.rowhidden && u in ga.config.rowhidden ? (i[h] = 1, null == d || ya(d.v) || (o[f] = 1)) : (i[h] = 0, null == d || ya(d.v) || (o[f] = 0)) } var g = ""; if (JSON.stringify(i).length > 2 && Object.keys(i).length > 1) { var v = ""; for (var y in i) 0 == i[y] ? v += '
      ' : v += '
      '; g = '
      ' + a.filiterByColorTip + '
      ' + v + "
      " } var b, k = ""; if (JSON.stringify(o).length > 2 && Object.keys(o).length > 1) { var x = ""; for (var w in o) 0 == o[w] ? x += '
      ' : x += '
      '; k = '
      ' + a.filiterByTextColorTip + '
      ' + x + "
      " } b = "" == g && "" == k ? '
      ' + a.filterContainerOneColorTip + "
      " : g + k + '
      ", $("#luckysheet-filter-orderby-color-submenu").remove(), $("body").append('
      ' + b + "
      "); var _ = $("#luckysheet-filter-orderby-color-submenu").end(), C = $(this).parent(), T = $(window).width(), A = $(window).height(), S = C.width(), I = _.height() + 25, R = _.width() + 5, q = $(this).offset(), D = q.top, F = q.left + S; F + R > T && (F = q.left - R), D + I > A && (D = A - I), $("#luckysheet-filter-orderby-color-submenu").css({ top: D, left: F }).show() }), (function () { n = setTimeout((function () { $("#luckysheet-filter-orderby-color-submenu").hide() }), 200) })), $(document).on("mouseover mouseleave", "#luckysheet-filter-orderby-color-submenu", (function (e) { "mouseover" === e.type ? clearTimeout(n) : $(this).hide() })), $(document).on("click", "#luckysheet-filter-orderby-color-submenu .item label", (function () { $(this).siblings("input[type='checkbox']").click() })), $(document).off("click.orderbyColorConfirm").on("click.orderbyColorConfirm", "#luckysheet-filter-orderby-color-submenu #luckysheet-filter-orderby-color-confirm", (function () { var e, t, a = {}, r = {}; $("#luckysheet-filter-orderby-color-submenu .item").each((function (e, t) { if ($(t).find("input[type='checkbox']").is(":checked")) { var n = $(this).find("label").attr("title"), l = $(this).closest(".box").attr("id"); "filterBgColor" == l ? a[n] = 0 : "filterFcColor" == l && (r[n] = 0) } })), e = $("#luckysheet-filter-orderby-color-submenu #filterBgColor").length > 0, t = $("#luckysheet-filter-orderby-color-submenu #filterFcColor").length > 0; var n = $("#luckysheet-filter-menu"), l = n.data("str"), i = n.data("edr"), o = n.data("cindex"), s = n.data("stc"), c = n.data("edc"), u = {}; $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").not($("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(o - s).get(0)).each((function () { var e = $(this).data("rowhidden"); if ("" == e) return !0; for (var t in e = JSON.parse(e)) u[t] = 0 })); for (var d = {}, h = {}, m = wc.getComputeMap(), p = gd.getComputeMap(), f = l + 1; f <= i; f++)if (!(f in u) && null != ga.flowdata[f]) { var g = ga.flowdata[f][o], v = xm.checkstatus(ga.flowdata, f, o, "bg"), y = wc.checksAF(f, o, m); null != y && (v = y[1]); var b = gd.checksCF(f, o, p); null != b && null != b.cellColor && (v = b.cellColor), (v = null == v ? "#ffffff" : v).indexOf("rgb") > -1 && (v = Am(v)), 4 == v.length && (v = v.substr(0, 1) + v.substr(1, 1).repeat(2) + v.substr(2, 1).repeat(2) + v.substr(3, 1).repeat(2)); var k = xm.checkstatus(ga.flowdata, f, o, "fc"); null != y && (k = y[0]), null != b && null != b.textColor && (k = b.textColor), k.indexOf("rgb") > -1 && (k = Am(k)), 4 == k.length && (k = k.substr(0, 1) + k.substr(1, 1).repeat(2) + k.substr(2, 1).repeat(2) + k.substr(3, 1).repeat(2)), e && t ? v in a || k in r && null != g && !ya(g.v) || (d[f] = 0) : e ? v in a || (d[f] = 0) : t && (k in r && null != g && !ya(g.v) || (d[f] = 0)) } var x = $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(o - s), w = Object.keys(d).length > 0, _ = $.extend(!0, u, d), C = _c.parseJsonParm(x.data("rowhidden")); Cc(x, w, d, h, !0, l, i, o, s, c); var T = $.extend(!0, {}, ga.config); if (T.rowhidden = _, ga.clearjfundo) { var A = { type: "datachangeAll_filter" }; A.sheetIndex = ga.currentSheetIndex, A.config = $.extend(!0, {}, ga.config), A.curconfig = T, A.optionstate = w, A.optionsindex = o - s, A.rowhidden = $.extend(!0, {}, d), A.rowhidenPre = $.extend(!0, {}, C), null != h && (A.caljs = h), ga.jfundo.length = 0, ga.jfredo.push(A) } ga.config = T, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, T.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu, #luckysheet-filter-submenu, #luckysheet-filter-orderby-color-submenu").hide(), yd() })), $(document).off("click.filterCheckbox1").on("click.filterCheckbox1", "#luckysheet-filter-byvalue-select .textBox", (function () { "true" == $(this).attr("data-check") ? ($(this).attr("data-check", "false"), $(this).find("input[type='checkbox']").removeAttr("checked")) : ($(this).attr("data-check", "true"), $(this).find("input[type='checkbox']").prop("checked", !0)) })), $(document).off("click.filterCheckbox2").on("click.filterCheckbox2", "#luckysheet-filter-byvalue-select .year", (function () { "true" == $(this).attr("data-check") ? ($(this).attr("data-check", "false"), $(this).parents(".yearBox").find(".month").attr("data-check", "false"), $(this).parents(".yearBox").find(".day").attr("data-check", "false"), $(this).parents(".yearBox").find("input[type='checkbox']").removeAttr("checked")) : ($(this).attr("data-check", "true"), $(this).parents(".yearBox").find(".month").attr("data-check", "true"), $(this).parents(".yearBox").find(".day").attr("data-check", "true"), $(this).parents(".yearBox").find("input[type='checkbox']").prop("checked", !0)) })), $(document).off("click.filterCheckbox3").on("click.filterCheckbox3", "#luckysheet-filter-byvalue-select .month", (function () { "true" == $(this).attr("data-check") ? ($(this).attr("data-check", "false"), $(this).parents(".monthBox").find(".day").attr("data-check", "false"), $(this).parents(".monthBox").find("input[type='checkbox']").removeAttr("checked")) : ($(this).attr("data-check", "true"), $(this).parents(".monthBox").find(".day").attr("data-check", "true"), $(this).parents(".monthBox").find("input[type='checkbox']").prop("checked", !0)); var e = !0; $(this).parents(".yearBox").find(".day").each((function (t, a) { "true" == $(a).attr("data-check") || (e = !1) })), e ? ($(this).parents(".yearBox").find(".year").attr("data-check", "true"), $(this).parents(".yearBox").find(".year input[type='checkbox']").prop("checked", !0)) : ($(this).parents(".yearBox").find(".year").attr("data-check", "false"), $(this).parents(".yearBox").find(".year input[type='checkbox']").removeAttr("checked")) })), $(document).off("click.filterCheckbox4").on("click.filterCheckbox4", "#luckysheet-filter-byvalue-select .day", (function () { "true" == $(this).attr("data-check") ? ($(this).attr("data-check", "false"), $(this).find("input[type='checkbox']").removeAttr("checked")) : ($(this).attr("data-check", "true"), $(this).find("input[type='checkbox']").prop("checked", !0)); var e = !0; $(this).parents(".monthBox").find(".day").each((function (t, a) { "true" == $(a).attr("data-check") || (e = !1) })), e ? ($(this).parents(".monthBox").find(".month").attr("data-check", "true"), $(this).parents(".monthBox").find(".month input[type='checkbox']").prop("checked", !0)) : ($(this).parents(".monthBox").find(".month").attr("data-check", "false"), $(this).parents(".monthBox").find(".month input[type='checkbox']").removeAttr("checked")); var t = !0; $(this).parents(".yearBox").find(".day").each((function (e, a) { "true" == $(a).attr("data-check") || (t = !1) })), t ? ($(this).parents(".yearBox").find(".year").attr("data-check", "true"), $(this).parents(".yearBox").find(".year input[type='checkbox']").prop("checked", !0)) : ($(this).parents(".yearBox").find(".year").attr("data-check", "false"), $(this).parents(".yearBox").find(".year input[type='checkbox']").removeAttr("checked")) })), $(document).off("click.filterYearDropdown").on("click.filterYearDropdown", "#luckysheet-filter-byvalue-select .yearBox .fa-caret-right", (function (e) { var t = $(this).parents(".luckysheet-mousedown-cancel"); t.hasClass("year") && $(this).parents(".yearBox").find(".monthList").slideToggle(), t.hasClass("month") && $(this).parents(".monthBox").find(".dayList").slideToggle(), e.stopPropagation() })), $("#luckysheet-filter-byvalue-btn-all").click((function () { $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").prop("checked", !0), $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").parents(".luckysheet-mousedown-cancel").attr("data-check", "true") })), $("#luckysheet-filter-byvalue-btn-clear").click((function () { $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").removeAttr("checked"), $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").parents(".luckysheet-mousedown-cancel").attr("data-check", "false") })), $("#luckysheet-filter-byvalue-btn-contra").click((function () { $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").each((function (e, t) { $(t).is(":checked") ? ($(t).removeAttr("checked"), $(t).parents(".luckysheet-mousedown-cancel").attr("data-check", "false")) : ($(t).prop("checked", !0), $(t).parents(".luckysheet-mousedown-cancel").attr("data-check", "true")) })), $("#luckysheet-filter-byvalue-select .ListBox .monthBox").each((function (e, t) { var a = !0; $(t).find(".day input[type='checkbox']").each((function (e, t) { $(t).is(":checked") || (a = !1) })), a ? ($(t).find(".month input[type='checkbox']").prop("checked", !0), $(t).attr("data-check", "true")) : ($(t).find(".month input[type='checkbox']").removeAttr("checked"), $(t).attr("data-check", "false")) })), $("#luckysheet-filter-byvalue-select .ListBox .yearBox").each((function (e, t) { var a = !0; $(t).find(".day input[type='checkbox']").each((function (e, t) { $(t).is(":checked") || (a = !1) })), a ? ($(t).find(".year input[type='checkbox']").prop("checked", !0), $(t).attr("data-check", "true")) : ($(t).find(".year input[type='checkbox']").removeAttr("checked"), $(t).attr("data-check", "false")) })) })), $("#luckysheet-filter-initial").click((function () { if (bu(ga.currentSheetIndex, "filter")) { $("#luckysheet-filter-menu .luckysheet-filter-selected-input").hide().find("input").val(), $("#luckysheet-filter-selected span").data("type", "0").data("type", null).text(a.conditionNone); var e = { type: "datachangeAll_filter_clear" }; e.sheetIndex = ga.currentSheetIndex, e.config = $.extend(!0, {}, ga.config), ga.config.rowhidden = {}, e.curconfig = $.extend(!0, {}, ga.config), e.filter_save = $.extend(!0, {}, ga.luckysheet_filter_save); var t = []; $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").each((function () { var e = $(this), a = e.hasClass("luckysheet-filter-options-active"), r = _c.parseJsonParm(e.data("rowhidden")), n = _c.parseJsonParm(e.data("caljs")); t.push({ optionstate: a, rowhidden: r, caljs: n, str: e.data("str"), edr: e.data("edr"), cindex: e.data("cindex"), stc: e.data("stc"), edc: e.data("edc") }) })), e.optiongroups = t, ga.jfundo.length = 0, ga.jfredo.push(e), $("#luckysheet-filter-selected-sheet" + ga.currentSheetIndex + ", #luckysheet-filter-options-sheet" + ga.currentSheetIndex).remove(), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), ga.luckysheetfile[_l(ga.currentSheetIndex)].filter = null, ga.luckysheetfile[_l(ga.currentSheetIndex)].filter_select = null, pd.saveParam("fsc", ga.currentSheetIndex, null), ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, {}, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length) } })), $("#luckysheet-filter-byvalue-input").on("input propertychange", (function () { var e = $(this).val().toString(); $("#luckysheet-filter-byvalue-select .ListBox .luckysheet-mousedown-cancel").show(), "" != e && $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").each((function (t, a) { if ($(a).closest(".day").length > 0) { var r = $(a).siblings("label").text().toString(), n = $(a).closest(".monthBox").find(".month label").text().toString(); if (-1 == ($(a).closest(".yearBox").find(".year label").text().toString() + "-" + n + "-" + r).indexOf(e)) $(a).closest(".day").hide(), 0 == $(a).closest(".dayList").find(".day:visible").length && $(a).closest(".monthBox").find(".month").hide(), 0 == $(a).closest(".monthList").find(".day:visible").length && $(a).closest(".yearBox").find(".year").hide() } $(a).closest(".textBox").length > 0 && (-1 == $(a).siblings("label").text().toString().indexOf(e) && $(a).parents(".textBox").hide()) })) })), $("#luckysheet-filter-cancel").click((function () { $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide() })), $("#luckysheet-filter-confirm").click((function () { var e = $("#luckysheet-filter-menu"), t = e.data("str"), r = e.data("edr"), n = e.data("cindex"), l = e.data("stc"), i = e.data("edc"), o = {}; $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").not($("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(n - l).get(0)).each((function () { var e = $(this).data("rowhidden"); if ("" == e) return !0; for (var t in e = JSON.parse(e.replace(/\'/g, '"'))) o[t] = 0 })); var s = {}, c = {}, u = {}; if ($("#luckysheet-filter-bycondition").next().is(":visible") && $("#luckysheet-filter-byvalue").next().is(":hidden") && "null" != $("#luckysheet-filter-selected span").data("value")) { var d = $("#luckysheet-filter-selected span"), h = d.data("type"), m = d.data("value"); if (u.value = m, u.text = d.text(), "0" == h) u.type = "0"; else if ("2" == h) { var p = $("#luckysheet-filter-menu .luckysheet-filter-selected-input2 input"); u.type = "2", u.value1 = p.eq(0).val(), u.value2 = p.eq(1).val() } else u.type = "1", u.value1 = $("#luckysheet-filter-menu .luckysheet-filter-selected-input").eq(0).find("input").val(); for (var f = t + 1; f <= r; f++)if (!(f in o) && null != ga.flowdata[f]) { var g = ga.flowdata[f][n]; if ("cellnull" == m) null == g || ya(g.v) || (c[f] = 0); else if ("cellnonull" == m) (null == g || ya(g.v)) && (c[f] = 0); else if ("textinclude" == m) { var v = u.value1; (null == g || ya(g.v) || -1 == g.m.indexOf(v)) && (c[f] = 0) } else if ("textnotinclude" == m) { var y = u.value1; null == g || ya(g.v) || g.m.indexOf(y) > -1 && (c[f] = 0) } else if ("textstart" == m) { var b = u.value1, k = b.length; (null == g || ya(g.v) || g.m.substr(0, k) != b) && (c[f] = 0) } else if ("textend" == m) { var x = u.value1, w = x.length; (null == g || ya(g.v) || w > g.m.length || g.m.substr(g.m.length - w, w) != x) && (c[f] = 0) } else if ("textequal" == m) { var _ = u.value1; (null == g || ya(g.v) || g.m != _) && (c[f] = 0) } else if ("dateequal" == m) { var C = xs(u.value1)[2]; null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "d" == g.ct.t ? parseInt(g.v) != C && (c[f] = 0) : c[f] = 0 } else if ("datelessthan" == m) { var T = xs(u.value1)[2]; null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "d" == g.ct.t ? parseInt(g.v) >= T && (c[f] = 0) : c[f] = 0 } else if ("datemorethan" == m) { var A = xs(u.value1)[2]; null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "d" == g.ct.t ? parseInt(g.v) <= A && (c[f] = 0) : c[f] = 0 } else if ("morethan" == m) { var S = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v <= S && (c[f] = 0) : c[f] = 0 } else if ("moreequalthan" == m) { var I = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v < I && (c[f] = 0) : c[f] = 0 } else if ("lessthan" == m) { var R = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v >= R && (c[f] = 0) : c[f] = 0 } else if ("lessequalthan" == m) { var q = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v > q && (c[f] = 0) : c[f] = 0 } else if ("equal" == m) { var D = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v != D && (c[f] = 0) : c[f] = 0 } else if ("noequal" == m) { var F = parseFloat(u.value1); null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v == F && (c[f] = 0) : c[f] = 0 } else if ("include" == m) { var E = parseFloat(u.value1), M = parseFloat(u.value2), N = void 0, P = void 0; E < M ? (N = E, P = M) : (P = E, N = M), null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? (g.v < N || g.v > P) && (c[f] = 0) : c[f] = 0 } else if ("noinclude" == m) { var z = parseFloat(u.value1), L = parseFloat(u.value2), O = void 0, B = void 0; z < L ? (O = z, B = L) : (B = z, O = L), null == g || ya(g.v) ? c[f] = 0 : null != g.ct && "n" == g.ct.t ? g.v >= O && g.v <= B && (c[f] = 0) : c[f] = 0 } } } else { $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']").each((function (e, t) { if ($(t).is(":visible") && $(t).is(":checked")) return !0; if ($(t).closest(".day").length > 0) { var r = $(t).siblings("label").text(); Number(r) < 10 && (r = "0" + Number(r)); var n = $(t).closest(".monthBox").find(".month label").text().replace(a.filiterMonthText, ""); Number(n) < 10 && (n = "0" + Number(n)); var l = $(t).closest(".yearBox").find(".year label").text().replace(a.filiterYearText, ""), i = a.filterDateFormatTip + "#$$$#" + l + "-" + n + "-" + r; s[i] = "1" } if ($(t).closest(".textBox").length > 0) { var o = $(t).closest(".textBox").data("filter"); s[o] = "1" } })); for (var V = t + 1; V <= r; V++)if (!(V in o) && null != ga.flowdata[V]) { var H = ga.flowdata[V][n], U = void 0; if (null == H || ya(H.v)) U = "null#$$$#null"; else if (null != H.ct && "d" == H.ct.t) { var j = ws("YYYY-MM-DD", H.v); U = a.filterDateFormatTip + "#$$$#" + j } else U = H.v + "#$$$#" + H.m; U in s && (c[V] = 0) } } var G = $("#luckysheet-filter-options-sheet" + ga.currentSheetIndex + " .luckysheet-filter-options").eq(n - l), W = $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible:checked").length < $("#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible").length || $("#luckysheet-filter-byvalue-input").val().length > 0 || $("#luckysheet-filter-bycondition").next().is(":visible") && $("#luckysheet-filter-byvalue").next().is(":hidden") && "null" != $("#luckysheet-filter-selected span").data("value"), Y = $.extend(!0, o, c), X = _c.parseJsonParm(G.data("rowhidden")); Cc(G, W, c, u, !0, t, r, n, l, i); var K = $.extend(!0, {}, ga.config); if (K.rowhidden = Y, ga.clearjfundo) { var Z = { type: "datachangeAll_filter" }; Z.sheetIndex = ga.currentSheetIndex, Z.config = $.extend(!0, {}, ga.config), Z.curconfig = K, Z.optionstate = W, Z.optionsindex = n - l, Z.rowhidden = $.extend(!0, {}, c), Z.rowhidenPre = $.extend(!0, {}, X), null != u && (Z.caljs = u), ga.jfundo.length = 0, ga.jfredo.push(Z) } ga.config = K, ga.luckysheetfile[_l(ga.currentSheetIndex)].config = ga.config, pd.saveParam("cg", ga.currentSheetIndex, K.rowhidden, { k: "rowhidden" }), hd(ga.flowdata.length, ga.flowdata[0].length), $("#luckysheet-filter-menu, #luckysheet-filter-submenu").hide(), yd() })) }(), function () { var e = gn().drag; $("#luckysheet-copy-json-head").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { if (1 == s.length) { for (var u = {}, d = 0; d < s[0].length; d++)u[Ko(0, d, s)] = ""; c.push(u) } else for (var h = 1; h < s.length; h++) { for (var m = {}, p = 0; p < s[0].length; p++)null == Ko(0, p, s) ? m[""] = Ko(h, p, s) : m[Ko(0, p, s)] = Ko(h, p, s); c.push(m) } vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-json-nohead").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = ga.luckysheet_select_save[0].column[0], d = 0; d < s.length; d++) { for (var h = {}, m = 0; m < s[0].length; m++)h[Im(m + u)] = Ko(d, m, s); c.push(h) } vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-array1").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = 0; u < s.length; u++)for (var d = 0; d < s[0].length; d++)c.push(Ko(u, d, s)); vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-array2").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = 0; u < s.length; u++) { for (var d = [], h = 0; h < s[0].length; h++)d.push(Ko(u, h, s)); c.push(d) } vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-arraymore-confirm").click((function (t) { if ("INPUT" !== t.target.nodeName) if ($("body .luckysheet-cols-menu").hide(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = 0; u < s.length; u++)for (var d = 0; d < s[0].length; d++)c.push(s[u][d]); var h = $("#luckysheet-copy-arraymore-row").val(), m = $("#luckysheet-copy-arraymore-col").val(); if ("" == h && "" == m) return vd.copybyformat(t, JSON.stringify(c)), void $("body .luckysheet-cols-menu").hide(); if (("" == h || null == (h = parseInt(h))) && (h = 1), ("" == m || null == (m = parseInt(m))) && (m = 1), "NaN" != h.toString() && "NaN" != m.toString()) if (h < 1 || m < 1) wa() ? alert(e.notLessOne) : fd.info(e.notLessOne, ""); else { for (var p = c.length, f = 0, g = [], v = 0; v < h; v++) { for (var y = [], b = 0; b < m; b++)if (y.push(c[f++]), f >= p) return vd.copybyformat(t, JSON.stringify(g)), void $("body .luckysheet-cols-menu").hide(); g.push(y) } vd.copybyformat(t, JSON.stringify(g)) } else wa() ? alert(e.inputCorrect) : fd.info(e.inputCorrect, "") } } })), $("#luckysheet-copy-diagonal").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = s[0].length, d = 0; d < s.length && !(d >= u); d++)c.push(s[d][d]); vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-antidiagonal").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = s[0].length, d = 0; d < s.length && !(d >= u); d++)c.push(s[d][u - d - 1]); vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-copy-diagonaloffset").click((function (t) { if ("INPUT" !== t.target.nodeName) if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { var u = s[0].length, d = parseInt($("#luckysheet-copy-diagonaloffset-value").val()); if ("NaN" != d.toString()) if (d < 0) wa() ? alert(e.offsetColumnLessZero) : fd.info(e.offsetColumnLessZero, ""); else { null == d && (d = 1); for (var h = 0; h < s.length && !(h + d >= u); h++)c.push(s[h][h + d]); vd.copybyformat(t, JSON.stringify(c)) } else wa() ? alert(e.inputCorrect) : fd.info(e.inputCorrect, "") } } })), $("#luckysheet-copy-boolvalue").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { if (null != ga.config.merge) { for (var a = !1, r = 0; r < ga.luckysheet_select_save.length; r++) { var n = ga.luckysheet_select_save[r].row[0], l = ga.luckysheet_select_save[r].row[1], i = ga.luckysheet_select_save[r].column[0], o = ga.luckysheet_select_save[r].column[1]; if (a = _a(ga.config, n, l, i, o)) break } if (a) return void (wa() ? alert(e.noPartMerge) : fd.info(e.noPartMerge, "")) } var s = Wo(ga.luckysheet_select_save[0]), c = []; if (0 != s.length) { for (var u = 0; u < s.length; u++) { for (var d = [], h = 0; h < s[0].length; h++) { var m = !1, p = void 0; m = null != (p = "object" == Cm(s[u][h]) ? s[u][h].v : s[u][h]) && "" != p && (null == (p = parseInt(p)) || p > 0), d.push(m) } c.push(d) } vd.copybyformat(t, JSON.stringify(c)) } } })), $("#luckysheet-matrix-turn-up").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a.length - 1; n >= 0; n--) { for (var l = [], i = 0; i < a[0].length; i++) { var o = ""; null != a[n] && null != a[n][i] && (o = a[n][i]), l.push(o) } r.push(l) } rs.controlHandler(r) } } })), $("#luckysheet-matrix-turn-left").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = 0; n < a.length; n++) { for (var l = [], i = a[0].length - 1; i >= 0; i--) { var o = ""; null != a[n] && null != a[n][i] && (o = a[n][i]), l.push(o) } r.push(l) } rs.controlHandler(r) } } })), $("#luckysheet-matrix-turn-cw").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = 0; n < a[0].length; n++) { for (var l = [], i = a.length - 1; i >= 0; i--) { var o = ""; null != a[i] && null != a[i][n] && (o = a[i][n]), l.push(o) } r.push(l) } rs.controlHandlerD(r) } } })), $("#luckysheet-matrix-turn-anticw").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a[0].length - 1; n >= 0; n--) { for (var l = [], i = 0; i < a.length; i++) { var o = ""; null != a[i] && null != a[i][n] && (o = a[i][n]), l.push(o) } r.push(l) } rs.controlHandlerD(r) } } })), $("#luckysheet-matrix-turn-trans").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = 0; n < a[0].length; n++) { for (var l = [], i = 0; i < a.length; i++) { var o = ""; null != a[i] && null != a[i][n] && (o = a[i][n]), l.push(o) } r.push(l) } rs.controlHandlerD(r) } } })); var t = function (e, t) { if (0 == e) return 0; var a, r; for (r = (t - 1) * (a = e) / t + e / (Math.pow(a, t - 1) * t); Math.abs(r - a) > 1e-6;)r = (t - 1) * (a = r) / t + e / (Math.pow(a, t - 1) * t); return r }; $("#luckysheet-matrix-cal-confirm").click((function (a) { if ("INPUT" !== a.target.nodeName && "SELECT" !== a.target.nodeName) if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var r = Wo(ga.luckysheet_select_save[0]); if (0 != r.length) { var n = $("#luckysheet-matrix-cal-type").val(), l = parseInt($("#luckysheet-matrix-cal-value").val()); if ("NaN" != l.toString()) { null == l && (l = 2); for (var i = [], o = 0; o < r.length; o++) { for (var s = [], c = 0; c < r[0].length; c++) { var u = ""; null != r[o] && null != r[o][c] && (u = r[o][c], null != parseInt(u) && null != r[o][c].ct && "n" == r[o][c].ct.t && ("minus" == n ? u.v = u.v - l : "multiply" == n ? u.v = u.v * l : "divided" == n ? u.v = Mm(u.v / l, 4) : "power" == n ? u.v = Math.pow(u.v, l) : "root" == n ? 2 == l ? u.v = Mm(Math.sqrt(u.v), 4) : 3 == l && Math.cbrt ? u.v = Mm(Math.cbrt(u.v), 4) : u.v = Mm(t(u.v, l), 4) : u.v = "log" == n ? Mm(1e4 * Math.log(u.v) / Math.log(Math.abs(l)), 4) : u.v + l, null == u.v ? u.m = "" : u.m = u.v.toString())), s.push(u) } i.push(s) } rs.controlHandler(i) } else wa() ? alert(e.inputCorrect) : fd.info(e.inputCorrect, "") } } })), $("#luckysheet-matrix-delezero-row").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a[0].length, l = 0; l < a.length; l++) { for (var i = [], o = !0, s = !0, c = 0; c < n; c++) { var u = ""; if (null != a[l] && null != a[l][c]) { if (("0" == (u = a[l][c]).v || 0 == u.v) && o) continue; o = !1 } i.push(u) } var d = []; if (i.length == n) d = i; else { for (var h = i.length - 1; h >= 0; h--) { var m = ""; if (null != i[h]) { if (("0" == (m = i[h]).v || 0 == m.v) && s) continue; s = !1 } d.unshift(m) } for (var p = n - d.length, f = 0; f < p; f++)d.push("") } r.push(d) } rs.controlHandler(r) } } })), $("#luckysheet-matrix-delezero-column").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a.length, l = a[0].length, i = 0; i < l; i++) { for (var o = [], s = !0, c = !0, u = 0; u < n; u++) { var d = ""; if (null != a[u] && null != a[u][i]) { if (("0" == (d = a[u][i]).v || 0 == d.v) && s) continue; s = !1 } o.push(d) } var h = []; if (o.length == n) h = o; else { for (var m = o.length - 1; m >= 0; m--) { var p = ""; if (null != o[m]) { if (("0" == (p = o[m]).v || 0 == p.v) && c) continue; c = !1 } h.unshift(p) } for (var f = n - h.length, g = 0; g < f; g++)h.push("") } r.push(h) } for (var v = [], y = 0; y < r[0].length; y++) { for (var b = [], k = 0; k < r.length; k++) { var x = ""; null != r[k] && null != r[k][y] && (x = r[k][y]), b.push(x) } v.push(b) } rs.controlHandler(v) } } })), $("#luckysheet-matrix-delerpt-row").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a[0].length, l = 0; l < a.length; l++) { for (var i = [], o = {}, s = 0; s < n; s++) { var c = null; null != a[l] && null != a[l][s] && ((c = a[l][s]).v in o || (o[c.v] = []), o[c.v].push(c)) } for (var u = 0; u < n; u++) { var d = null; null != a[l] && null != a[l][u] && 1 == o[(d = a[l][u]).v].length && i.push(d) } for (var h = n - i.length, m = 0; m < h; m++)i.push(null); r.push(i) } rs.controlHandler(r) } } })), $("#luckysheet-matrix-delerpt-column").click((function (t) { if ($("body .luckysheet-cols-menu").hide(), Em(), ga.luckysheet_select_save.length > 1) wa() ? alert(e.noMulti) : fd.info(e.noMulti, ""); else { var a = Wo(ga.luckysheet_select_save[0]); if (0 != a.length) { for (var r = [], n = a.length, l = a[0].length, i = 0; i < l; i++) { for (var o = [], s = {}, c = 0; c < n; c++) { var u = null; null != a[c] && null != a[c][i] && ((u = a[c][i]).v in s || (s[u.v] = []), s[u.v].push(u)) } for (var d = 0; d < n; d++) { var h = null; null != a[d] && null != a[d][i] && 1 == s[(h = a[d][i]).v].length && o.push(h) } a1 = o; for (var m = n - a1.length, p = 0; p < m; p++)a1.push(null); r.push(a1) } for (var f = [], g = 0; g < r[0].length; g++) { for (var v = [], y = 0; y < r.length; y++) { var b = null; null != r[y] && null != r[y][g] && (b = r[y][g]), v.push(b) } f.push(v) } rs.controlHandler(f) } } })) }(), _y(), e = gn().formula, $("#luckysheet-functionbox-cell").focus((function () { if (!wa() && ga.luckysheet_select_save.length > 0) { var e = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1]; vm(e.row_focus, e.column_focus, ga.flowdata, null, !0), Ih.rangeResizeTo = $("#luckysheet-functionbox-cell") } })).keydown((function (e) { if (!wa()) { e.ctrlKey, e.altKey, e.shiftKey; var t = e.keyCode, a = $("#luckysheet-input-box"); if (t == Sn && parseInt(a.css("top")) > 0) $("#luckysheet-formula-search-c").is(":visible") && null != Ih.searchFunctionCell ? Ih.searchFunctionEnter($("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active")) : (Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), ga.luckysheet_select_save = [{ row: [ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[0]], column: [ga.luckysheetCellUpdate[1], ga.luckysheetCellUpdate[1]], row_focus: ga.luckysheetCellUpdate[0], column_focus: ga.luckysheetCellUpdate[1] }], mc("down", 1, "rangeOfSelect"), $("#luckysheet-rich-text-editor").focus()), e.preventDefault(); else if (t == Rn && parseInt(a.css("top")) > 0) Ih.dontupdate(), mc("down", 0, "rangeOfSelect"), $("#luckysheet-rich-text-editor").focus(), e.preventDefault(); else if (t == Ln && parseInt(a.css("top")) > 0) Ih.setfreezonFuc(e), e.preventDefault(); else if (t == qn && parseInt(a.css("top")) > 0) { if ($("#luckysheet-formula-search-c").is(":visible")) { var r = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active").prev(); 0 == r.length && (r = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").last()), $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").removeClass("luckysheet-formula-search-item-active"), r.addClass("luckysheet-formula-search-item-active"), e.preventDefault() } } else if (t == Fn && parseInt(a.css("top")) > 0) { if ($("#luckysheet-formula-search-c").is(":visible")) { var n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item-active").next(); 0 == n.length && (n = $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").first()), $("#luckysheet-formula-search-c").find(".luckysheet-formula-search-item").removeClass("luckysheet-formula-search-item-active"), n.addClass("luckysheet-formula-search-item-active"), e.preventDefault() } } else t == $n && parseInt(a.css("top")) > 0 || t == Dn && parseInt(a.css("top")) > 0 ? Ih.rangeHightlightselected($("#luckysheet-functionbox-cell")) : (!(t >= 112 && t <= 123 || t <= 46 || 144 == t || 108 == t || e.ctrlKey || e.altKey || e.shiftKey && (37 == t || 38 == t || 39 == t || 40 == t)) || 8 == t || 32 == t || 46 == t || e.ctrlKey && 86 == t) && Ih.functionInputHanddler($("#luckysheet-rich-text-editor"), $("#luckysheet-functionbox-cell"), t) } })).click((function () { wa() || Ih.rangeHightlightselected($("#luckysheet-functionbox-cell")) })), $("#luckysheet-wa-functionbox-cancel").click((function () { $(this).hasClass("luckysheet-wa-calculate-active") && ($("#luckysheet-search-formula-parm").is(":visible") && $("#luckysheet-search-formula-parm").hide(), $("#luckysheet-search-formula-parm-select").is(":visible") && $("#luckysheet-search-formula-parm-select").hide(), Ih.dontupdate(), mc("down", 0, "rangeOfSelect")) })), $("#luckysheet-wa-functionbox-confirm").click((function () { $(this).hasClass("luckysheet-wa-calculate-active") && ($("#luckysheet-search-formula-parm").is(":visible") && $("#luckysheet-search-formula-parm").hide(), $("#luckysheet-search-formula-parm-select").is(":visible") && $("#luckysheet-search-formula-parm-select").hide(), Ih.updatecell(ga.luckysheetCellUpdate[0], ga.luckysheetCellUpdate[1]), mc("down", 0, "rangeOfSelect")) })), $("#luckysheet-wa-functionbox-fx").click((function () { if (0 != ga.luckysheet_select_save.length) { var t = ga.luckysheet_select_save[ga.luckysheet_select_save.length - 1], a = t.row_focus, r = t.column_focus; vm(a, r, ga.flowdata); var n = ga.flowdata[a][r]; if (null != n && null != n.f) { var l = Ih.getfunctionParam(n.f); null != l.fn ? km.formulaParmDialog(l.fn, l.param) : km.formulaListDialog() } else $("#luckysheet-rich-text-editor").html('='), $("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html()), km.formulaListDialog(); km.init() } else wa() ? alert(e.tipSelectCell) : fd.info(e.tipSelectCell, "") })), $("#luckysheet-formula-functionrange").on("mousedown", ".luckysheet-copy", (function (e) { Ih.rangeMove = !0, ga.luckysheet_scroll_status = !0, Ih.rangeMoveObj = $(this).parent(), Ih.rangeMoveIndex = $(this).parent().attr("rangeindex"); var t = $s(e.pageX, e.pageY), a = t[0] + $("#luckysheet-cell-main").scrollLeft(), r = t[1] + $("#luckysheet-cell-main").scrollTop(); $("#luckysheet-formula-functionrange-highlight-" + Ih.rangeMoveIndex).find(".luckysheet-selection-copy-hc").css("opacity", .13); var n = $(this).data("type"); "top" == n ? r += 3 : "right" == n ? a -= 3 : "bottom" == n ? r -= 3 : "left" == n && (a += 3); var l = Ss(r)[2], i = Rs(a)[2]; Ih.rangeMovexy = [l, i], $("#luckysheet-sheettable").css("cursor", "move"), e.stopPropagation() })), $("#luckysheet-formula-functionrange").on("mousedown", ".luckysheet-highlight", (function (e) { Ih.rangeResize = $(this).data("type"), Ih.rangeResizeIndex = $(this).parent().attr("rangeindex"); var t = $s(e.pageX, e.pageY), a = $("#luckysheet-cell-main").scrollLeft(), r = $("#luckysheet-cell-main").scrollTop(), n = t[0] + a, l = t[1] + r; Ih.rangeResizeObj = $(this).parent(), $("#luckysheet-formula-functionrange-highlight-" + Ih.rangeResizeIndex).find(".luckysheet-selection-copy-hc").css("opacity", .13), "lt" == Ih.rangeResize ? (n += 3, l += 3) : "lb" == Ih.rangeResize ? (n += 3, l -= 3) : "rt" == Ih.rangeResize ? (n -= 3, l += 3) : "rb" == Ih.rangeResize && (n -= 3, l -= 3); var i = Ss(l), o = i[1], s = i[0], c = Rs(n), u = c[1], d = c[0], h = Ih.rangeResizeObj.position(); Ih.rangeResizexy = [d, s, Ih.rangeResizeObj.width(), Ih.rangeResizeObj.height(), h.left + a, h.top + r, u, o], Ih.rangeResizeWinH = $("#luckysheet-cell-main")[0].scrollHeight, Ih.rangeResizeWinW = $("#luckysheet-cell-main")[0].scrollWidth, ga.luckysheet_scroll_status = !0, e.stopPropagation() })), Cy(), Ay(), function () { var e = gn(); $("#luckysheetorderbyasc, #luckysheetorderbyasc_t").mousedown((function (e) { yd(e), _u(ga.orderbyindex, !0), Rh() })), $("#luckysheetorderbydesc, #luckysheetorderbydesc_t").click((function (e) { yd(e), _u(ga.orderbyindex, !1), Rh() })); var t = !0; $("#luckysheetorderby").click((function () { if (bu(ga.currentSheetIndex, "sort")) { $("body .luckysheet-cols-menu").hide(); var a = e.sort; if (ga.luckysheet_select_save.length > 1) wa() ? alert(a.noRangeError) : fd.info(a.noRangeError, ""); else { var r = ga.luckysheet_select_save[0], n = r.row[0], l = r.row[1], i = r.column[0], o = r.column[1]; if (t) { t = !1; var s = '
      ').concat(a.hasTitle, '
      + ').concat(a.addOthers, "
      "); $("body").append(_m(bn, { id: "luckysheet-sort-dialog", addclass: "", title: e.sort.sortTitle, content: s, botton: '") })), $("#luckysheet-sort-dialog .luckysheet-sort-dialog-additem").click((function () { for (var e = ga.luckysheet_select_save[0], t = e.row[0], r = (e.row[1], e.column[0]), n = e.column[1], l = "", i = $("#luckysheet-sort-dialog table").data("itemcount") + 1, o = $("#luckysheet-sort-haveheader").is(":checked"), s = r; s <= n; s++)if (o) { var c = Ko(t, s, ga.flowdata, "m"); null == c && (c = a.columnOperation + (s - r + 1)), l += '" } else l += '"; $("#luckysheet-sort-dialog table").append('\n \n '.concat(a.secondaryTitle, ' ').concat(l, ' \n \n
      \n
      \n
      \n \n \n ")), $("#luckysheet-sort-dialog table").data("itemcount", i) })), $("#luckysheet-sort-haveheader").change((function () { for (var e = ga.luckysheet_select_save[0], t = e.row[0], r = (e.row[1], e.column[0]), n = e.column[1], l = $(this).is(":checked"), i = "", o = r; o <= n; o++)if (l) { var s = Ko(t, o, ga.flowdata, "m"); null == s && (s = a.columnOperation + (o - r + 1)), i += '" } else i += '"; $("#luckysheet-sort-dialog tr select").each((function () { $(this).html(i) })) })), $("#luckysheet-sort-modal-confirm").click((function () { if (ga.luckysheet_select_save.length > 1) wa() ? alert(a.noRangeError) : fd.info(a.noRangeError, ""); else { for (var e, t = rs.deepCopyFlowData(ga.flowdata), r = ga.luckysheet_select_save[0], n = r.row[0], l = r.row[1], i = r.column[0], o = r.column[1], s = $("#luckysheet-sort-haveheader").is(":checked"), c = !1, u = [], d = e = s ? n + 1 : n; d <= l; d++) { for (var h = [], m = i; m <= o; m++) { if (null != t[d][m] && null != t[d][m].mc) { c = !0; break } h.push(t[d][m]) } u.push(h) } if (c) wa() ? alert(a.mergeError) : fd.info(a.mergeError, ""); else { $($("#luckysheet-sort-dialog table tr").toArray().reverse()).each((function () { var e = $(this).find("select").val(), t = $(this).find("input:radio:checked").val(); e -= i, t = "asc" == t, u = ku([].concat(u), e, t) })); for (var p = e; p <= l; p++)for (var f = i; f <= o; f++)t[p][f] = u[p - e][f - i]; var g = {}; if (null != ga.config.rowlen) { var v = $.extend(!0, {}, ga.config); g = { cfg: v = qs(t, e, l, v), RowlChange: !0 } } id(t, [{ row: [e, l], column: [i, o] }], g), $("#luckysheet-sort-dialog").hide(), $("#luckysheet-modal-dialog-mask").hide() } } })) } for (var c = "", u = i; u <= o; u++)c += '"; $("#luckysheet-sort-dialog select").html(c), $("#luckysheet-sort-dialog .luckysheet-sort-dialog-tr").remove(), $("#luckysheet-sort-haveheader").prop("checked", !1), $("#luckysheet-sort-dialog input:radio:first").prop("checked", "checked"), $("#luckysheet-sort-dialog .luckysheet-modal-dialog-title-text").html(a.sortRangeTitle + "" + Im(i) + (n + 1) + "" + a.sortRangeTitleTo + "" + Im(o) + (l + 1) + ""); var d = $("#luckysheet-sort-dialog"), h = d.outerHeight(), m = d.outerWidth(), p = $(window).width(), f = $(window).height(), g = $(document).scrollLeft(), v = $(document).scrollTop(); $("#luckysheet-sort-dialog-tablec").css("max-height", (f - h) / 2), $("#luckysheet-sort-dialog").css({ left: (p + g - m) / 2, top: (f + v - h) / 2 }).show(), $("#luckysheet-modal-dialog-mask").show(), n < l && setTimeout((function () { for (var e = ga.flowdata[n], t = ga.flowdata[n + 1], a = !1, r = i; r <= o; r++) { ps(e[r]) != ps(t[r]) && (a = !0) } a && $("#luckysheet-sort-haveheader").prop("checked", !0).change() }), 10) } } })) }(), $("#luckysheet-zoom-minus").click((function () { var e; e = null == ga.zoomRatio ? ga.zoomRatio = 1 : Math.ceil(10 * ga.zoomRatio) / 10, (e -= .1) == ga.zoomRatio && (e -= .1), e <= .1 && (e = .1), _h(e), Ah(e) })), $("#luckysheet-zoom-plus").click((function () { var e; e = null == ga.zoomRatio ? ga.zoomRatio = 1 : Math.floor(10 * ga.zoomRatio) / 10, (e += .1) == ga.zoomRatio && (e += .1), e >= 4 && (e = 4), _h(e), Ah(e) })), $("#luckysheet-zoom-slider").mousedown((function (e) { var t = $(this).offset().left, a = Th(e.pageX - t); _h(a), Ah(a) })), $("#luckysheet-zoom-cursor").mousedown((function (e) { var t = e.pageX, a = parseFloat($("#luckysheet-zoom-cursor").css("left")); $("#luckysheet-zoom-cursor").css("transition", "none"), $(document).off("mousemove.zoomCursor").on("mousemove.zoomCursor", (function (e) { var r = e.pageX, n = a + (r - t), l = Th(n); l > 4 && (l = 4, n = 100), l < .1 && (l = .1, n = 0), _h(l); var i = Math.round(100 * l) + "%"; $("#luckysheet-zoom-ratioText").html(i), $("#luckysheet-zoom-cursor").css("left", n - 4) })), $(document).off("mouseup.zoomCursor").on("mouseup.zoomCursor", (function (e) { $(document).off(".zoomCursor"), $("#luckysheet-zoom-cursor").css("transition", "all 0.3s") })), e.stopPropagation() })).click((function (e) { e.stopPropagation() })), $("#luckysheet-zoom-ratioText").click((function () { _h(1), Ah(1) })), Ah(ga.zoomRatio), function () { var e = fa.container; $("#" + e).find(".luckysheet-print-viewBtn").click((function () { qy($(this)) })) }(), Vm(ga, "jfredo", (function (e, t, a, r) { "length" !== t && Nc.createHookFunction("updated", a) })), Vm(ga, "asyncLoad", (function (e, t, a, r) { "length" === t && 0 === a && Nc.createHookFunction("workbookCreateAfter", hm()) })) } (Fy = wm(fm, Fy)).create = function (e) { var t; for (var a in Nc.destroy(), ga.toJsonOptions = {}, e) "data" !== a && (ga.toJsonOptions[a] = e[a]); var r = wm(za, e), n = r.loadUrl, l = r.menu, i = r.title, o = r.container; ga.container = o, ga.luckysheetfile = r.data, ga.defaultcolumnNum = r.column, ga.defaultrowNum = r.row, ga.fullscreenmode = r.fullscreenmode, ga.lang = r.lang, ga.allowEdit = r.allowEdit, ga.limitSheetNameLength = r.limitSheetNameLength, ga.defaultSheetNameMaxLength = r.defaultSheetNameMaxLength, ga.fontList = r.fontList, pd.gridKey = r.gridKey, pd.loadUrl = r.loadUrl, pd.updateUrl = r.updateUrl, pd.updateImageUrl = r.updateImageUrl, pd.title = r.title, pd.loadSheetUrl = r.loadSheetUrl, pd.allowUpdate = r.allowUpdate, fa.autoFormatw = r.autoFormatw, fa.accuracy = r.accuracy, fa.total = r.data[0].total, fa.allowCopy = r.allowCopy, fa.showtoolbar = r.showtoolbar, fa.showtoolbarConfig = r.showtoolbarConfig, fa.showinfobar = r.showinfobar, fa.showsheetbar = r.showsheetbar, fa.showsheetbarConfig = r.showsheetbarConfig, fa.showstatisticBar = r.showstatisticBar, fa.showstatisticBarConfig = r.showstatisticBarConfig, fa.sheetFormulaBar = r.sheetFormulaBar, fa.cellRightClickConfig = r.cellRightClickConfig, fa.sheetRightClickConfig = r.sheetRightClickConfig, fa.pointEdit = r.pointEdit, fa.pointEditUpdate = r.pointEditUpdate, fa.pointEditZoom = r.pointEditZoom, fa.userInfo = r.userInfo, fa.userMenuItem = r.userMenuItem, fa.myFolderUrl = r.myFolderUrl, fa.functionButton = r.functionButton, fa.showConfigWindowResize = r.showConfigWindowResize, fa.enableAddRow = r.enableAddRow, fa.enableAddBackTop = r.enableAddBackTop, fa.enablePage = r.enablePage, fa.pageInfo = r.pageInfo, fa.editMode = r.editMode, fa.beforeCreateDom = r.beforeCreateDom, fa.workbookCreateBefore = r.workbookCreateBefore, fa.workbookCreateAfter = r.workbookCreateAfter, fa.fireMousedown = r.fireMousedown, fa.forceCalculation = r.forceCalculation, fa.plugins = r.plugins, fa.rowHeaderWidth = r.rowHeaderWidth, fa.columnHeaderHeight = r.columnHeaderHeight, fa.defaultColWidth = r.defaultColWidth, fa.defaultRowHeight = r.defaultRowHeight, fa.title = r.title, fa.container = r.container, fa.hook = r.hook, fa.pager = r.pager, fa.initShowsheetbarConfig = !1, "zh" === ga.lang && Vh.localize(Dy.zh), (t = ga.asyncLoad).push.apply(t, Da(fa.plugins)), function (e, t) { e.length && e.forEach((function (e) { Ry[e](t, !0) })) }(r.plugins, r.data), function () { for (var e = gn().functionlist, t = 0; t < e.length; t++) { var a = e[t]; a.f = $y[a.n] } ga.functionlist = e; for (var r = {}, n = 0; n < e.length; n++) { var l = e[n]; r[l.n] = l } window.luckysheet_function = r, ga.luckysheet_function = r }(); var s = r.devicePixelRatio; null == s && (s = 1), ga.devicePixelRatio = Math.ceil(s), $("#" + o).append(_n()), "" == n ? (Sh.initialjfFile(l, i), Ey()) : $.post(n, { gridKey: pd.gridKey }, (function (e) { var t = new Function("return " + e)(); ga.luckysheetfile = t, Sh.initialjfFile(l, i), Ey(), pd.allowUpdate && pd.openWebSocket() })) }, Fy.getluckysheetfile = Tl, Fy.getluckysheet_select_save = function () { return ga.luckysheet_select_save }, Fy.setluckysheet_select_save = function (e) { ga.luckysheet_select_save = e }, Fy.getconfig = function () { return ga.config }, Fy.getGridData = Sh.getGridData, Fy.buildGridData = Sh.buildGridData, Fy.luckysheetrefreshgrid = md, Fy.jfrefreshgrid = id, Fy.getcellvalue = Ko, Fy.setcellvalue = Cs, Fy.getdatabyselection = Wo, Fy.sheetmanage = Sh, Fy.flowdata = function () { return ga.flowdata }, Fy.selectHightlightShow = Rh, Fy.destroy = Nc.destroy; var My = !o((function () { var e = Math.random(); __defineSetter__.call(null, e, (function () { })), delete l[e] })); function Ny() { return this.style } function Py() { return Ly() } function zy() { return this.target } function Ly() { if (document.all) return window.event; for (var e = Ly.caller; null != e;) { var t = e.arguments[0]; if (t) if (-1 != t.constructor.toString().indexOf("Event")) return t; e = e.caller } return null } return s && Ee({ target: "Object", proto: !0, forced: My }, { __defineGetter__: function (e, t) { F.f(na(this), e, { get: er(t), enumerable: !0, configurable: !0 }) } }), window.addEventListener && navigator.userAgent.indexOf("Firefox") > 0 && (HTMLElement.prototype.__defineGetter__("runtimeStyle", Ny), window.constructor.prototype.__defineGetter__("event", Py), Event.prototype.__defineGetter__("srcElement", zy)), Fy })); //# sourceMappingURL=luckysheet.umd.js.map /** * mkd-image-upload.js code below */ !function (t) { var e = {}; function i(a) { if (e[a]) return e[a].exports; var n = e[a] = { i: a, l: !1, exports: {} }; return t[a].call(n.exports, n, n.exports, i), n.l = !0, n.exports } i.m = t, i.c = e, i.d = function (t, e, a) { i.o(t, e) || Object.defineProperty(t, e, { enumerable: !0, get: a }) }, i.r = function (t) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(t, "__esModule", { value: !0 }) }, i.t = function (t, e) { if (1 & e && (t = i(t)), 8 & e) return t; if (4 & e && "object" == typeof t && t && t.__esModule) return t; var a = Object.create(null); if (i.r(a), Object.defineProperty(a, "default", { enumerable: !0, value: t }), 2 & e && "string" != typeof t) for (var n in t) i.d(a, n, function (e) { return t[e] }.bind(null, n)); return a }, i.n = function (t) { var e = t && t.__esModule ? function () { return t.default } : function () { return t }; return i.d(e, "a", e), e }, i.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, i.p = "", i(i.s = 7) }([function (t, e, i) { /*! * Cropper.js v1.5.6 * https://fengyuanchen.github.io/cropperjs * * Copyright 2015-present Chen Fengyuan * Released under the MIT license * * Date: 2019-10-04T04:33:48.372Z */ t.exports = function () { "use strict"; function t(e) { return (t = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t })(e) } function e(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { for (var i = 0; i < e.length; i++) { var a = e[i]; a.enumerable = a.enumerable || !1, a.configurable = !0, "value" in a && (a.writable = !0), Object.defineProperty(t, a.key, a) } } function a(t, e, i) { return e in t ? Object.defineProperty(t, e, { value: i, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = i, t } function n(t, e) { var i = Object.keys(t); if (Object.getOwnPropertySymbols) { var a = Object.getOwnPropertySymbols(t); e && (a = a.filter((function (e) { return Object.getOwnPropertyDescriptor(t, e).enumerable }))), i.push.apply(i, a) } return i } function r(t) { for (var e = 1; e < arguments.length; e++) { var i = null != arguments[e] ? arguments[e] : {}; e % 2 ? n(i, !0).forEach((function (e) { a(t, e, i[e]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(i)) : n(i).forEach((function (e) { Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(i, e)) })) } return t } function o(t) { return function (t) { if (Array.isArray(t)) { for (var e = 0, i = new Array(t.length); e < t.length; e++)i[e] = t[e]; return i } }(t) || function (t) { if (Symbol.iterator in Object(t) || "[object Arguments]" === Object.prototype.toString.call(t)) return Array.from(t) }(t) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance") }() } var s = "undefined" != typeof window && void 0 !== window.document, l = s ? window : {}, c = !!s && "ontouchstart" in l.document.documentElement, h = !!s && "PointerEvent" in l, p = "".concat("cropper", "-crop"), d = "".concat("cropper", "-disabled"), u = "".concat("cropper", "-hidden"), f = "".concat("cropper", "-hide"), m = "".concat("cropper", "-invisible"), v = "".concat("cropper", "-modal"), g = "".concat("cropper", "-move"), w = "".concat("cropper", "Action"), y = "".concat("cropper", "Preview"), b = c ? "touchstart" : "mousedown", x = c ? "touchmove" : "mousemove", $ = c ? "touchend touchcancel" : "mouseup", k = h ? "pointerdown" : b, _ = h ? "pointermove" : x, S = h ? "pointerup pointercancel" : $, R = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/, z = /^data:/, E = /^data:image\/jpeg;base64,/, L = /^img|canvas$/i, C = { viewMode: 0, dragMode: "crop", initialAspectRatio: NaN, aspectRatio: NaN, data: null, preview: "", responsive: !0, restore: !0, checkCrossOrigin: !0, checkOrientation: !0, modal: !0, guides: !0, center: !0, highlight: !0, background: !0, autoCrop: !0, autoCropArea: .8, movable: !0, rotatable: !0, scalable: !0, zoomable: !0, zoomOnTouch: !0, zoomOnWheel: !0, wheelZoomRatio: .1, cropBoxMovable: !0, cropBoxResizable: !0, toggleDragModeOnDblclick: !0, minCanvasWidth: 0, minCanvasHeight: 0, minCropBoxWidth: 0, minCropBoxHeight: 0, minContainerWidth: 200, minContainerHeight: 100, ready: null, cropstart: null, cropmove: null, cropend: null, crop: null, zoom: null }, M = Number.isNaN || l.isNaN; function A(t) { return "number" == typeof t && !M(t) } var T = function (t) { return t > 0 && t < 1 / 0 }; function B(t) { return void 0 === t } function D(e) { return "object" === t(e) && null !== e } var U = Object.prototype.hasOwnProperty; function H(t) { if (!D(t)) return !1; try { var e = t.constructor, i = e.prototype; return e && i && U.call(i, "isPrototypeOf") } catch (t) { return !1 } } function O(t) { return "function" == typeof t } var P = Array.prototype.slice; function q(t) { return Array.from ? Array.from(t) : P.call(t) } function F(t, e) { return t && O(e) && (Array.isArray(t) || A(t.length) ? q(t).forEach((function (i, a) { e.call(t, i, a, t) })) : D(t) && Object.keys(t).forEach((function (i) { e.call(t, t[i], i, t) }))), t } var I = Object.assign || function (t) { for (var e = arguments.length, i = new Array(e > 1 ? e - 1 : 0), a = 1; a < e; a++)i[a - 1] = arguments[a]; return D(t) && i.length > 0 && i.forEach((function (e) { D(e) && Object.keys(e).forEach((function (i) { t[i] = e[i] })) })), t }, j = /\.\d*(?:0|9){12}\d*$/; function N(t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1e11; return j.test(t) ? Math.round(t * e) / e : t } var W = /^width|height|left|top|marginLeft|marginTop$/; function Y(t, e) { var i = t.style; F(e, (function (t, e) { W.test(e) && A(t) && (t = "".concat(t, "px")), i[e] = t })) } function V(t, e) { if (e) if (A(t.length)) F(t, (function (t) { V(t, e) })); else if (t.classList) t.classList.add(e); else { var i = t.className.trim(); i ? i.indexOf(e) < 0 && (t.className = "".concat(i, " ").concat(e)) : t.className = e } } function X(t, e) { e && (A(t.length) ? F(t, (function (t) { X(t, e) })) : t.classList ? t.classList.remove(e) : t.className.indexOf(e) >= 0 && (t.className = t.className.replace(e, ""))) } function G(t, e, i) { e && (A(t.length) ? F(t, (function (t) { G(t, e, i) })) : i ? V(t, e) : X(t, e)) } var K = /([a-z\d])([A-Z])/g; function Z(t) { return t.replace(K, "$1-$2").toLowerCase() } function Q(t, e) { return D(t[e]) ? t[e] : t.dataset ? t.dataset[e] : t.getAttribute("data-".concat(Z(e))) } function J(t, e, i) { D(i) ? t[e] = i : t.dataset ? t.dataset[e] = i : t.setAttribute("data-".concat(Z(e)), i) } var tt = /\s\s*/, et = function () { var t = !1; if (s) { var e = !1, i = function () { }, a = Object.defineProperty({}, "once", { get: function () { return t = !0, e }, set: function (t) { e = t } }); l.addEventListener("test", i, a), l.removeEventListener("test", i, a) } return t }(); function it(t, e, i) { var a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, n = i; e.trim().split(tt).forEach((function (e) { if (!et) { var r = t.listeners; r && r[e] && r[e][i] && (n = r[e][i], delete r[e][i], 0 === Object.keys(r[e]).length && delete r[e], 0 === Object.keys(r).length && delete t.listeners) } t.removeEventListener(e, n, a) })) } function at(t, e, i) { var a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, n = i; e.trim().split(tt).forEach((function (e) { if (a.once && !et) { var r = t.listeners, o = void 0 === r ? {} : r; n = function () { delete o[e][i], t.removeEventListener(e, n, a); for (var r = arguments.length, s = new Array(r), l = 0; l < r; l++)s[l] = arguments[l]; i.apply(t, s) }, o[e] || (o[e] = {}), o[e][i] && t.removeEventListener(e, o[e][i], a), o[e][i] = n, t.listeners = o } t.addEventListener(e, n, a) })) } function nt(t, e, i) { var a; return O(Event) && O(CustomEvent) ? a = new CustomEvent(e, { detail: i, bubbles: !0, cancelable: !0 }) : (a = document.createEvent("CustomEvent")).initCustomEvent(e, !0, !0, i), t.dispatchEvent(a) } function rt(t) { var e = t.getBoundingClientRect(); return { left: e.left + (window.pageXOffset - document.documentElement.clientLeft), top: e.top + (window.pageYOffset - document.documentElement.clientTop) } } var ot = l.location, st = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i; function lt(t) { var e = t.match(st); return null !== e && (e[1] !== ot.protocol || e[2] !== ot.hostname || e[3] !== ot.port) } function ct(t) { var e = "timestamp=".concat((new Date).getTime()); return t + (-1 === t.indexOf("?") ? "?" : "&") + e } function ht(t) { var e = t.rotate, i = t.scaleX, a = t.scaleY, n = t.translateX, r = t.translateY, o = []; A(n) && 0 !== n && o.push("translateX(".concat(n, "px)")), A(r) && 0 !== r && o.push("translateY(".concat(r, "px)")), A(e) && 0 !== e && o.push("rotate(".concat(e, "deg)")), A(i) && 1 !== i && o.push("scaleX(".concat(i, ")")), A(a) && 1 !== a && o.push("scaleY(".concat(a, ")")); var s = o.length ? o.join(" ") : "none"; return { WebkitTransform: s, msTransform: s, transform: s } } function pt(t, e) { var i = t.pageX, a = t.pageY, n = { endX: i, endY: a }; return e ? n : r({ startX: i, startY: a }, n) } function dt(t) { var e = t.aspectRatio, i = t.height, a = t.width, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "contain", r = T(a), o = T(i); if (r && o) { var s = i * e; "contain" === n && s > a || "cover" === n && s < a ? i = a / e : a = i * e } else r ? i = a / e : o && (a = i * e); return { width: a, height: i } } function ut(t, e, i, a) { var n = e.aspectRatio, r = e.naturalWidth, s = e.naturalHeight, l = e.rotate, c = void 0 === l ? 0 : l, h = e.scaleX, p = void 0 === h ? 1 : h, d = e.scaleY, u = void 0 === d ? 1 : d, f = i.aspectRatio, m = i.naturalWidth, v = i.naturalHeight, g = a.fillColor, w = void 0 === g ? "transparent" : g, y = a.imageSmoothingEnabled, b = void 0 === y || y, x = a.imageSmoothingQuality, $ = void 0 === x ? "low" : x, k = a.maxWidth, _ = void 0 === k ? 1 / 0 : k, S = a.maxHeight, R = void 0 === S ? 1 / 0 : S, z = a.minWidth, E = void 0 === z ? 0 : z, L = a.minHeight, C = void 0 === L ? 0 : L, M = document.createElement("canvas"), A = M.getContext("2d"), T = dt({ aspectRatio: f, width: _, height: R }), B = dt({ aspectRatio: f, width: E, height: C }, "cover"), D = Math.min(T.width, Math.max(B.width, m)), U = Math.min(T.height, Math.max(B.height, v)), H = dt({ aspectRatio: n, width: _, height: R }), O = dt({ aspectRatio: n, width: E, height: C }, "cover"), P = Math.min(H.width, Math.max(O.width, r)), q = Math.min(H.height, Math.max(O.height, s)), F = [-P / 2, -q / 2, P, q]; return M.width = N(D), M.height = N(U), A.fillStyle = w, A.fillRect(0, 0, D, U), A.save(), A.translate(D / 2, U / 2), A.rotate(c * Math.PI / 180), A.scale(p, u), A.imageSmoothingEnabled = b, A.imageSmoothingQuality = $, A.drawImage.apply(A, [t].concat(o(F.map((function (t) { return Math.floor(N(t)) }))))), A.restore(), M } var ft = String.fromCharCode, mt = /^data:.*,/; function vt(t) { var e, i = new DataView(t); try { var a, n, r; if (255 === i.getUint8(0) && 216 === i.getUint8(1)) for (var o = i.byteLength, s = 2; s + 1 < o;) { if (255 === i.getUint8(s) && 225 === i.getUint8(s + 1)) { n = s; break } s += 1 } if (n) { var l = n + 10; if ("Exif" === function (t, e, i) { var a = ""; i += e; for (var n = e; n < i; n += 1)a += ft(t.getUint8(n)); return a }(i, n + 4, 4)) { var c = i.getUint16(l); if (((a = 18761 === c) || 19789 === c) && 42 === i.getUint16(l + 2, a)) { var h = i.getUint32(l + 4, a); h >= 8 && (r = l + h) } } } if (r) { var p, d, u = i.getUint16(r, a); for (d = 0; d < u; d += 1)if (p = r + 12 * d + 2, 274 === i.getUint16(p, a)) { p += 8, e = i.getUint16(p, a), i.setUint16(p, 1, a); break } } } catch (t) { e = 1 } return e } var gt = { render: function () { this.initContainer(), this.initCanvas(), this.initCropBox(), this.renderCanvas(), this.cropped && this.renderCropBox() }, initContainer: function () { var t = this.element, e = this.options, i = this.container, a = this.cropper; V(a, u), X(t, u); var n = { width: Math.max(i.offsetWidth, Number(e.minContainerWidth) || 200), height: Math.max(i.offsetHeight, Number(e.minContainerHeight) || 100) }; this.containerData = n, Y(a, { width: n.width, height: n.height }), V(t, u), X(a, u) }, initCanvas: function () { var t = this.containerData, e = this.imageData, i = this.options.viewMode, a = Math.abs(e.rotate) % 180 == 90, n = a ? e.naturalHeight : e.naturalWidth, r = a ? e.naturalWidth : e.naturalHeight, o = n / r, s = t.width, l = t.height; t.height * o > t.width ? 3 === i ? s = t.height * o : l = t.width / o : 3 === i ? l = t.width / o : s = t.height * o; var c = { aspectRatio: o, naturalWidth: n, naturalHeight: r, width: s, height: l }; c.left = (t.width - s) / 2, c.top = (t.height - l) / 2, c.oldLeft = c.left, c.oldTop = c.top, this.canvasData = c, this.limited = 1 === i || 2 === i, this.limitCanvas(!0, !0), this.initialImageData = I({}, e), this.initialCanvasData = I({}, c) }, limitCanvas: function (t, e) { var i = this.options, a = this.containerData, n = this.canvasData, r = this.cropBoxData, o = i.viewMode, s = n.aspectRatio, l = this.cropped && r; if (t) { var c = Number(i.minCanvasWidth) || 0, h = Number(i.minCanvasHeight) || 0; o > 1 ? (c = Math.max(c, a.width), h = Math.max(h, a.height), 3 === o && (h * s > c ? c = h * s : h = c / s)) : o > 0 && (c ? c = Math.max(c, l ? r.width : 0) : h ? h = Math.max(h, l ? r.height : 0) : l && (c = r.width, (h = r.height) * s > c ? c = h * s : h = c / s)); var p = dt({ aspectRatio: s, width: c, height: h }); c = p.width, h = p.height, n.minWidth = c, n.minHeight = h, n.maxWidth = 1 / 0, n.maxHeight = 1 / 0 } if (e) if (o > (l ? 0 : 1)) { var d = a.width - n.width, u = a.height - n.height; n.minLeft = Math.min(0, d), n.minTop = Math.min(0, u), n.maxLeft = Math.max(0, d), n.maxTop = Math.max(0, u), l && this.limited && (n.minLeft = Math.min(r.left, r.left + (r.width - n.width)), n.minTop = Math.min(r.top, r.top + (r.height - n.height)), n.maxLeft = r.left, n.maxTop = r.top, 2 === o && (n.width >= a.width && (n.minLeft = Math.min(0, d), n.maxLeft = Math.max(0, d)), n.height >= a.height && (n.minTop = Math.min(0, u), n.maxTop = Math.max(0, u)))) } else n.minLeft = -n.width, n.minTop = -n.height, n.maxLeft = a.width, n.maxTop = a.height }, renderCanvas: function (t, e) { var i = this.canvasData, a = this.imageData; if (e) { var n = function (t) { var e = t.width, i = t.height, a = t.degree; if (90 == (a = Math.abs(a) % 180)) return { width: i, height: e }; var n = a % 90 * Math.PI / 180, r = Math.sin(n), o = Math.cos(n), s = e * o + i * r, l = e * r + i * o; return a > 90 ? { width: l, height: s } : { width: s, height: l } }({ width: a.naturalWidth * Math.abs(a.scaleX || 1), height: a.naturalHeight * Math.abs(a.scaleY || 1), degree: a.rotate || 0 }), r = n.width, o = n.height, s = i.width * (r / i.naturalWidth), l = i.height * (o / i.naturalHeight); i.left -= (s - i.width) / 2, i.top -= (l - i.height) / 2, i.width = s, i.height = l, i.aspectRatio = r / o, i.naturalWidth = r, i.naturalHeight = o, this.limitCanvas(!0, !1) } (i.width > i.maxWidth || i.width < i.minWidth) && (i.left = i.oldLeft), (i.height > i.maxHeight || i.height < i.minHeight) && (i.top = i.oldTop), i.width = Math.min(Math.max(i.width, i.minWidth), i.maxWidth), i.height = Math.min(Math.max(i.height, i.minHeight), i.maxHeight), this.limitCanvas(!1, !0), i.left = Math.min(Math.max(i.left, i.minLeft), i.maxLeft), i.top = Math.min(Math.max(i.top, i.minTop), i.maxTop), i.oldLeft = i.left, i.oldTop = i.top, Y(this.canvas, I({ width: i.width, height: i.height }, ht({ translateX: i.left, translateY: i.top }))), this.renderImage(t), this.cropped && this.limited && this.limitCropBox(!0, !0) }, renderImage: function (t) { var e = this.canvasData, i = this.imageData, a = i.naturalWidth * (e.width / e.naturalWidth), n = i.naturalHeight * (e.height / e.naturalHeight); I(i, { width: a, height: n, left: (e.width - a) / 2, top: (e.height - n) / 2 }), Y(this.image, I({ width: i.width, height: i.height }, ht(I({ translateX: i.left, translateY: i.top }, i)))), t && this.output() }, initCropBox: function () { var t = this.options, e = this.canvasData, i = t.aspectRatio || t.initialAspectRatio, a = Number(t.autoCropArea) || .8, n = { width: e.width, height: e.height }; i && (e.height * i > e.width ? n.height = n.width / i : n.width = n.height * i), this.cropBoxData = n, this.limitCropBox(!0, !0), n.width = Math.min(Math.max(n.width, n.minWidth), n.maxWidth), n.height = Math.min(Math.max(n.height, n.minHeight), n.maxHeight), n.width = Math.max(n.minWidth, n.width * a), n.height = Math.max(n.minHeight, n.height * a), n.left = e.left + (e.width - n.width) / 2, n.top = e.top + (e.height - n.height) / 2, n.oldLeft = n.left, n.oldTop = n.top, this.initialCropBoxData = I({}, n) }, limitCropBox: function (t, e) { var i = this.options, a = this.containerData, n = this.canvasData, r = this.cropBoxData, o = this.limited, s = i.aspectRatio; if (t) { var l = Number(i.minCropBoxWidth) || 0, c = Number(i.minCropBoxHeight) || 0, h = o ? Math.min(a.width, n.width, n.width + n.left, a.width - n.left) : a.width, p = o ? Math.min(a.height, n.height, n.height + n.top, a.height - n.top) : a.height; l = Math.min(l, a.width), c = Math.min(c, a.height), s && (l && c ? c * s > l ? c = l / s : l = c * s : l ? c = l / s : c && (l = c * s), p * s > h ? p = h / s : h = p * s), r.minWidth = Math.min(l, h), r.minHeight = Math.min(c, p), r.maxWidth = h, r.maxHeight = p } e && (o ? (r.minLeft = Math.max(0, n.left), r.minTop = Math.max(0, n.top), r.maxLeft = Math.min(a.width, n.left + n.width) - r.width, r.maxTop = Math.min(a.height, n.top + n.height) - r.height) : (r.minLeft = 0, r.minTop = 0, r.maxLeft = a.width - r.width, r.maxTop = a.height - r.height)) }, renderCropBox: function () { var t = this.options, e = this.containerData, i = this.cropBoxData; (i.width > i.maxWidth || i.width < i.minWidth) && (i.left = i.oldLeft), (i.height > i.maxHeight || i.height < i.minHeight) && (i.top = i.oldTop), i.width = Math.min(Math.max(i.width, i.minWidth), i.maxWidth), i.height = Math.min(Math.max(i.height, i.minHeight), i.maxHeight), this.limitCropBox(!1, !0), i.left = Math.min(Math.max(i.left, i.minLeft), i.maxLeft), i.top = Math.min(Math.max(i.top, i.minTop), i.maxTop), i.oldLeft = i.left, i.oldTop = i.top, t.movable && t.cropBoxMovable && J(this.face, w, i.width >= e.width && i.height >= e.height ? "move" : "all"), Y(this.cropBox, I({ width: i.width, height: i.height }, ht({ translateX: i.left, translateY: i.top }))), this.cropped && this.limited && this.limitCanvas(!0, !0), this.disabled || this.output() }, output: function () { this.preview(), nt(this.element, "crop", this.getData()) } }, wt = { initPreview: function () { var t = this.element, e = this.crossOrigin, i = this.options.preview, a = e ? this.crossOriginUrl : this.url, n = t.alt || "The image to preview", r = document.createElement("img"); if (e && (r.crossOrigin = e), r.src = a, r.alt = n, this.viewBox.appendChild(r), this.viewBoxImage = r, i) { var o = i; "string" == typeof i ? o = t.ownerDocument.querySelectorAll(i) : i.querySelector && (o = [i]), this.previews = o, F(o, (function (t) { var i = document.createElement("img"); J(t, y, { width: t.offsetWidth, height: t.offsetHeight, html: t.innerHTML }), e && (i.crossOrigin = e), i.src = a, i.alt = n, i.style.cssText = 'display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"', t.innerHTML = "", t.appendChild(i) })) } }, resetPreview: function () { F(this.previews, (function (t) { var e = Q(t, y); Y(t, { width: e.width, height: e.height }), t.innerHTML = e.html, function (t, e) { if (D(t[e])) try { delete t[e] } catch (i) { t[e] = void 0 } else if (t.dataset) try { delete t.dataset[e] } catch (i) { t.dataset[e] = void 0 } else t.removeAttribute("data-".concat(Z(e))) }(t, y) })) }, preview: function () { var t = this.imageData, e = this.canvasData, i = this.cropBoxData, a = i.width, n = i.height, r = t.width, o = t.height, s = i.left - e.left - t.left, l = i.top - e.top - t.top; this.cropped && !this.disabled && (Y(this.viewBoxImage, I({ width: r, height: o }, ht(I({ translateX: -s, translateY: -l }, t)))), F(this.previews, (function (e) { var i = Q(e, y), c = i.width, h = i.height, p = c, d = h, u = 1; a && (d = n * (u = c / a)), n && d > h && (p = a * (u = h / n), d = h), Y(e, { width: p, height: d }), Y(e.getElementsByTagName("img")[0], I({ width: r * u, height: o * u }, ht(I({ translateX: -s * u, translateY: -l * u }, t)))) }))) } }, yt = { bind: function () { var t = this.element, e = this.options, i = this.cropper; O(e.cropstart) && at(t, "cropstart", e.cropstart), O(e.cropmove) && at(t, "cropmove", e.cropmove), O(e.cropend) && at(t, "cropend", e.cropend), O(e.crop) && at(t, "crop", e.crop), O(e.zoom) && at(t, "zoom", e.zoom), at(i, k, this.onCropStart = this.cropStart.bind(this)), e.zoomable && e.zoomOnWheel && at(i, "wheel", this.onWheel = this.wheel.bind(this), { passive: !1, capture: !0 }), e.toggleDragModeOnDblclick && at(i, "dblclick", this.onDblclick = this.dblclick.bind(this)), at(t.ownerDocument, _, this.onCropMove = this.cropMove.bind(this)), at(t.ownerDocument, S, this.onCropEnd = this.cropEnd.bind(this)), e.responsive && at(window, "resize", this.onResize = this.resize.bind(this)) }, unbind: function () { var t = this.element, e = this.options, i = this.cropper; O(e.cropstart) && it(t, "cropstart", e.cropstart), O(e.cropmove) && it(t, "cropmove", e.cropmove), O(e.cropend) && it(t, "cropend", e.cropend), O(e.crop) && it(t, "crop", e.crop), O(e.zoom) && it(t, "zoom", e.zoom), it(i, k, this.onCropStart), e.zoomable && e.zoomOnWheel && it(i, "wheel", this.onWheel, { passive: !1, capture: !0 }), e.toggleDragModeOnDblclick && it(i, "dblclick", this.onDblclick), it(t.ownerDocument, _, this.onCropMove), it(t.ownerDocument, S, this.onCropEnd), e.responsive && it(window, "resize", this.onResize) } }, bt = { resize: function () { var t = this.options, e = this.container, i = this.containerData, a = Number(t.minContainerWidth) || 200, n = Number(t.minContainerHeight) || 100; if (!(this.disabled || i.width <= a || i.height <= n)) { var r, o, s = e.offsetWidth / i.width; 1 === s && e.offsetHeight === i.height || (t.restore && (r = this.getCanvasData(), o = this.getCropBoxData()), this.render(), t.restore && (this.setCanvasData(F(r, (function (t, e) { r[e] = t * s }))), this.setCropBoxData(F(o, (function (t, e) { o[e] = t * s }))))) } }, dblclick: function () { var t, e; this.disabled || "none" === this.options.dragMode || this.setDragMode((t = this.dragBox, e = p, (t.classList ? t.classList.contains(e) : t.className.indexOf(e) > -1) ? "move" : "crop")) }, wheel: function (t) { var e = this, i = Number(this.options.wheelZoomRatio) || .1, a = 1; this.disabled || (t.preventDefault(), this.wheeling || (this.wheeling = !0, setTimeout((function () { e.wheeling = !1 }), 50), t.deltaY ? a = t.deltaY > 0 ? 1 : -1 : t.wheelDelta ? a = -t.wheelDelta / 120 : t.detail && (a = t.detail > 0 ? 1 : -1), this.zoom(-a * i, t))) }, cropStart: function (t) { var e = t.buttons, i = t.button; if (!(this.disabled || ("mousedown" === t.type || "pointerdown" === t.type && "mouse" === t.pointerType) && (A(e) && 1 !== e || A(i) && 0 !== i || t.ctrlKey))) { var a, n = this.options, r = this.pointers; t.changedTouches ? F(t.changedTouches, (function (t) { r[t.identifier] = pt(t) })) : r[t.pointerId || 0] = pt(t), a = Object.keys(r).length > 1 && n.zoomable && n.zoomOnTouch ? "zoom" : Q(t.target, w), R.test(a) && !1 !== nt(this.element, "cropstart", { originalEvent: t, action: a }) && (t.preventDefault(), this.action = a, this.cropping = !1, "crop" === a && (this.cropping = !0, V(this.dragBox, v))) } }, cropMove: function (t) { var e = this.action; if (!this.disabled && e) { var i = this.pointers; t.preventDefault(), !1 !== nt(this.element, "cropmove", { originalEvent: t, action: e }) && (t.changedTouches ? F(t.changedTouches, (function (t) { I(i[t.identifier] || {}, pt(t, !0)) })) : I(i[t.pointerId || 0] || {}, pt(t, !0)), this.change(t)) } }, cropEnd: function (t) { if (!this.disabled) { var e = this.action, i = this.pointers; t.changedTouches ? F(t.changedTouches, (function (t) { delete i[t.identifier] })) : delete i[t.pointerId || 0], e && (t.preventDefault(), Object.keys(i).length || (this.action = ""), this.cropping && (this.cropping = !1, G(this.dragBox, v, this.cropped && this.options.modal)), nt(this.element, "cropend", { originalEvent: t, action: e })) } } }, xt = { change: function (t) { var e, i = this.options, a = this.canvasData, n = this.containerData, o = this.cropBoxData, s = this.pointers, l = this.action, c = i.aspectRatio, h = o.left, p = o.top, d = o.width, f = o.height, m = h + d, v = p + f, g = 0, w = 0, y = n.width, b = n.height, x = !0; !c && t.shiftKey && (c = d && f ? d / f : 1), this.limited && (g = o.minLeft, w = o.minTop, y = g + Math.min(n.width, a.width, a.left + a.width), b = w + Math.min(n.height, a.height, a.top + a.height)); var $ = s[Object.keys(s)[0]], k = { x: $.endX - $.startX, y: $.endY - $.startY }, _ = function (t) { switch (t) { case "e": m + k.x > y && (k.x = y - m); break; case "w": h + k.x < g && (k.x = g - h); break; case "n": p + k.y < w && (k.y = w - p); break; case "s": v + k.y > b && (k.y = b - v) } }; switch (l) { case "all": h += k.x, p += k.y; break; case "e": if (k.x >= 0 && (m >= y || c && (p <= w || v >= b))) { x = !1; break } _("e"), (d += k.x) < 0 && (l = "w", h -= d = -d), c && (f = d / c, p += (o.height - f) / 2); break; case "n": if (k.y <= 0 && (p <= w || c && (h <= g || m >= y))) { x = !1; break } _("n"), f -= k.y, p += k.y, f < 0 && (l = "s", p -= f = -f), c && (d = f * c, h += (o.width - d) / 2); break; case "w": if (k.x <= 0 && (h <= g || c && (p <= w || v >= b))) { x = !1; break } _("w"), d -= k.x, h += k.x, d < 0 && (l = "e", h -= d = -d), c && (f = d / c, p += (o.height - f) / 2); break; case "s": if (k.y >= 0 && (v >= b || c && (h <= g || m >= y))) { x = !1; break } _("s"), (f += k.y) < 0 && (l = "n", p -= f = -f), c && (d = f * c, h += (o.width - d) / 2); break; case "ne": if (c) { if (k.y <= 0 && (p <= w || m >= y)) { x = !1; break } _("n"), f -= k.y, p += k.y, d = f * c } else _("n"), _("e"), k.x >= 0 ? m < y ? d += k.x : k.y <= 0 && p <= w && (x = !1) : d += k.x, k.y <= 0 ? p > w && (f -= k.y, p += k.y) : (f -= k.y, p += k.y); d < 0 && f < 0 ? (l = "sw", p -= f = -f, h -= d = -d) : d < 0 ? (l = "nw", h -= d = -d) : f < 0 && (l = "se", p -= f = -f); break; case "nw": if (c) { if (k.y <= 0 && (p <= w || h <= g)) { x = !1; break } _("n"), f -= k.y, p += k.y, d = f * c, h += o.width - d } else _("n"), _("w"), k.x <= 0 ? h > g ? (d -= k.x, h += k.x) : k.y <= 0 && p <= w && (x = !1) : (d -= k.x, h += k.x), k.y <= 0 ? p > w && (f -= k.y, p += k.y) : (f -= k.y, p += k.y); d < 0 && f < 0 ? (l = "se", p -= f = -f, h -= d = -d) : d < 0 ? (l = "ne", h -= d = -d) : f < 0 && (l = "sw", p -= f = -f); break; case "sw": if (c) { if (k.x <= 0 && (h <= g || v >= b)) { x = !1; break } _("w"), d -= k.x, h += k.x, f = d / c } else _("s"), _("w"), k.x <= 0 ? h > g ? (d -= k.x, h += k.x) : k.y >= 0 && v >= b && (x = !1) : (d -= k.x, h += k.x), k.y >= 0 ? v < b && (f += k.y) : f += k.y; d < 0 && f < 0 ? (l = "ne", p -= f = -f, h -= d = -d) : d < 0 ? (l = "se", h -= d = -d) : f < 0 && (l = "nw", p -= f = -f); break; case "se": if (c) { if (k.x >= 0 && (m >= y || v >= b)) { x = !1; break } _("e"), f = (d += k.x) / c } else _("s"), _("e"), k.x >= 0 ? m < y ? d += k.x : k.y >= 0 && v >= b && (x = !1) : d += k.x, k.y >= 0 ? v < b && (f += k.y) : f += k.y; d < 0 && f < 0 ? (l = "nw", p -= f = -f, h -= d = -d) : d < 0 ? (l = "sw", h -= d = -d) : f < 0 && (l = "ne", p -= f = -f); break; case "move": this.move(k.x, k.y), x = !1; break; case "zoom": this.zoom(function (t) { var e = r({}, t), i = []; return F(t, (function (t, a) { delete e[a], F(e, (function (e) { var a = Math.abs(t.startX - e.startX), n = Math.abs(t.startY - e.startY), r = Math.abs(t.endX - e.endX), o = Math.abs(t.endY - e.endY), s = Math.sqrt(a * a + n * n), l = (Math.sqrt(r * r + o * o) - s) / s; i.push(l) })) })), i.sort((function (t, e) { return Math.abs(t) < Math.abs(e) })), i[0] }(s), t), x = !1; break; case "crop": if (!k.x || !k.y) { x = !1; break } e = rt(this.cropper), h = $.startX - e.left, p = $.startY - e.top, d = o.minWidth, f = o.minHeight, k.x > 0 ? l = k.y > 0 ? "se" : "ne" : k.x < 0 && (h -= d, l = k.y > 0 ? "sw" : "nw"), k.y < 0 && (p -= f), this.cropped || (X(this.cropBox, u), this.cropped = !0, this.limited && this.limitCropBox(!0, !0)) }x && (o.width = d, o.height = f, o.left = h, o.top = p, this.action = l, this.renderCropBox()), F(s, (function (t) { t.startX = t.endX, t.startY = t.endY })) } }, $t = { crop: function () { return !this.ready || this.cropped || this.disabled || (this.cropped = !0, this.limitCropBox(!0, !0), this.options.modal && V(this.dragBox, v), X(this.cropBox, u), this.setCropBoxData(this.initialCropBoxData)), this }, reset: function () { return this.ready && !this.disabled && (this.imageData = I({}, this.initialImageData), this.canvasData = I({}, this.initialCanvasData), this.cropBoxData = I({}, this.initialCropBoxData), this.renderCanvas(), this.cropped && this.renderCropBox()), this }, clear: function () { return this.cropped && !this.disabled && (I(this.cropBoxData, { left: 0, top: 0, width: 0, height: 0 }), this.cropped = !1, this.renderCropBox(), this.limitCanvas(!0, !0), this.renderCanvas(), X(this.dragBox, v), V(this.cropBox, u)), this }, replace: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; return !this.disabled && t && (this.isImg && (this.element.src = t), e ? (this.url = t, this.image.src = t, this.ready && (this.viewBoxImage.src = t, F(this.previews, (function (e) { e.getElementsByTagName("img")[0].src = t })))) : (this.isImg && (this.replaced = !0), this.options.data = null, this.uncreate(), this.load(t))), this }, enable: function () { return this.ready && this.disabled && (this.disabled = !1, X(this.cropper, d)), this }, disable: function () { return this.ready && !this.disabled && (this.disabled = !0, V(this.cropper, d)), this }, destroy: function () { var t = this.element; return t.cropper ? (t.cropper = void 0, this.isImg && this.replaced && (t.src = this.originalUrl), this.uncreate(), this) : this }, move: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : t, i = this.canvasData, a = i.left, n = i.top; return this.moveTo(B(t) ? t : a + Number(t), B(e) ? e : n + Number(e)) }, moveTo: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : t, i = this.canvasData, a = !1; return t = Number(t), e = Number(e), this.ready && !this.disabled && this.options.movable && (A(t) && (i.left = t, a = !0), A(e) && (i.top = e, a = !0), a && this.renderCanvas(!0)), this }, zoom: function (t, e) { var i = this.canvasData; return t = (t = Number(t)) < 0 ? 1 / (1 - t) : 1 + t, this.zoomTo(i.width * t / i.naturalWidth, null, e) }, zoomTo: function (t, e, i) { var a = this.options, n = this.canvasData, r = n.width, o = n.height, s = n.naturalWidth, l = n.naturalHeight; if ((t = Number(t)) >= 0 && this.ready && !this.disabled && a.zoomable) { var c = s * t, h = l * t; if (!1 === nt(this.element, "zoom", { ratio: t, oldRatio: r / s, originalEvent: i })) return this; if (i) { var p = this.pointers, d = rt(this.cropper), u = p && Object.keys(p).length ? function (t) { var e = 0, i = 0, a = 0; return F(t, (function (t) { var n = t.startX, r = t.startY; e += n, i += r, a += 1 })), { pageX: e /= a, pageY: i /= a } }(p) : { pageX: i.pageX, pageY: i.pageY }; n.left -= (c - r) * ((u.pageX - d.left - n.left) / r), n.top -= (h - o) * ((u.pageY - d.top - n.top) / o) } else H(e) && A(e.x) && A(e.y) ? (n.left -= (c - r) * ((e.x - n.left) / r), n.top -= (h - o) * ((e.y - n.top) / o)) : (n.left -= (c - r) / 2, n.top -= (h - o) / 2); n.width = c, n.height = h, this.renderCanvas(!0) } return this }, rotate: function (t) { return this.rotateTo((this.imageData.rotate || 0) + Number(t)) }, rotateTo: function (t) { return A(t = Number(t)) && this.ready && !this.disabled && this.options.rotatable && (this.imageData.rotate = t % 360, this.renderCanvas(!0, !0)), this }, scaleX: function (t) { var e = this.imageData.scaleY; return this.scale(t, A(e) ? e : 1) }, scaleY: function (t) { var e = this.imageData.scaleX; return this.scale(A(e) ? e : 1, t) }, scale: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : t, i = this.imageData, a = !1; return t = Number(t), e = Number(e), this.ready && !this.disabled && this.options.scalable && (A(t) && (i.scaleX = t, a = !0), A(e) && (i.scaleY = e, a = !0), a && this.renderCanvas(!0, !0)), this }, getData: function () { var t, e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], i = this.options, a = this.imageData, n = this.canvasData, r = this.cropBoxData; if (this.ready && this.cropped) { t = { x: r.left - n.left, y: r.top - n.top, width: r.width, height: r.height }; var o = a.width / a.naturalWidth; if (F(t, (function (e, i) { t[i] = e / o })), e) { var s = Math.round(t.y + t.height), l = Math.round(t.x + t.width); t.x = Math.round(t.x), t.y = Math.round(t.y), t.width = l - t.x, t.height = s - t.y } } else t = { x: 0, y: 0, width: 0, height: 0 }; return i.rotatable && (t.rotate = a.rotate || 0), i.scalable && (t.scaleX = a.scaleX || 1, t.scaleY = a.scaleY || 1), t }, setData: function (t) { var e = this.options, i = this.imageData, a = this.canvasData, n = {}; if (this.ready && !this.disabled && H(t)) { var r = !1; e.rotatable && A(t.rotate) && t.rotate !== i.rotate && (i.rotate = t.rotate, r = !0), e.scalable && (A(t.scaleX) && t.scaleX !== i.scaleX && (i.scaleX = t.scaleX, r = !0), A(t.scaleY) && t.scaleY !== i.scaleY && (i.scaleY = t.scaleY, r = !0)), r && this.renderCanvas(!0, !0); var o = i.width / i.naturalWidth; A(t.x) && (n.left = t.x * o + a.left), A(t.y) && (n.top = t.y * o + a.top), A(t.width) && (n.width = t.width * o), A(t.height) && (n.height = t.height * o), this.setCropBoxData(n) } return this }, getContainerData: function () { return this.ready ? I({}, this.containerData) : {} }, getImageData: function () { return this.sized ? I({}, this.imageData) : {} }, getCanvasData: function () { var t = this.canvasData, e = {}; return this.ready && F(["left", "top", "width", "height", "naturalWidth", "naturalHeight"], (function (i) { e[i] = t[i] })), e }, setCanvasData: function (t) { var e = this.canvasData, i = e.aspectRatio; return this.ready && !this.disabled && H(t) && (A(t.left) && (e.left = t.left), A(t.top) && (e.top = t.top), A(t.width) ? (e.width = t.width, e.height = t.width / i) : A(t.height) && (e.height = t.height, e.width = t.height * i), this.renderCanvas(!0)), this }, getCropBoxData: function () { var t, e = this.cropBoxData; return this.ready && this.cropped && (t = { left: e.left, top: e.top, width: e.width, height: e.height }), t || {} }, setCropBoxData: function (t) { var e, i, a = this.cropBoxData, n = this.options.aspectRatio; return this.ready && this.cropped && !this.disabled && H(t) && (A(t.left) && (a.left = t.left), A(t.top) && (a.top = t.top), A(t.width) && t.width !== a.width && (e = !0, a.width = t.width), A(t.height) && t.height !== a.height && (i = !0, a.height = t.height), n && (e ? a.height = a.width / n : i && (a.width = a.height * n)), this.renderCropBox()), this }, getCroppedCanvas: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; if (!this.ready || !window.HTMLCanvasElement) return null; var e = this.canvasData, i = ut(this.image, this.imageData, e, t); if (!this.cropped) return i; var a = this.getData(), n = a.x, r = a.y, s = a.width, l = a.height, c = i.width / Math.floor(e.naturalWidth); 1 !== c && (n *= c, r *= c, s *= c, l *= c); var h = s / l, p = dt({ aspectRatio: h, width: t.maxWidth || 1 / 0, height: t.maxHeight || 1 / 0 }), d = dt({ aspectRatio: h, width: t.minWidth || 0, height: t.minHeight || 0 }, "cover"), u = dt({ aspectRatio: h, width: t.width || (1 !== c ? i.width : s), height: t.height || (1 !== c ? i.height : l) }), f = u.width, m = u.height; f = Math.min(p.width, Math.max(d.width, f)), m = Math.min(p.height, Math.max(d.height, m)); var v = document.createElement("canvas"), g = v.getContext("2d"); v.width = N(f), v.height = N(m), g.fillStyle = t.fillColor || "transparent", g.fillRect(0, 0, f, m); var w = t.imageSmoothingEnabled, y = void 0 === w || w, b = t.imageSmoothingQuality; g.imageSmoothingEnabled = y, b && (g.imageSmoothingQuality = b); var x, $, k, _, S, R, z = i.width, E = i.height, L = n, C = r; L <= -s || L > z ? (L = 0, x = 0, k = 0, S = 0) : L <= 0 ? (k = -L, L = 0, S = x = Math.min(z, s + L)) : L <= z && (k = 0, S = x = Math.min(s, z - L)), x <= 0 || C <= -l || C > E ? (C = 0, $ = 0, _ = 0, R = 0) : C <= 0 ? (_ = -C, C = 0, R = $ = Math.min(E, l + C)) : C <= E && (_ = 0, R = $ = Math.min(l, E - C)); var M = [L, C, x, $]; if (S > 0 && R > 0) { var A = f / s; M.push(k * A, _ * A, S * A, R * A) } return g.drawImage.apply(g, [i].concat(o(M.map((function (t) { return Math.floor(N(t)) }))))), v }, setAspectRatio: function (t) { var e = this.options; return this.disabled || B(t) || (e.aspectRatio = Math.max(0, t) || NaN, this.ready && (this.initCropBox(), this.cropped && this.renderCropBox())), this }, setDragMode: function (t) { var e = this.options, i = this.dragBox, a = this.face; if (this.ready && !this.disabled) { var n = "crop" === t, r = e.movable && "move" === t; t = n || r ? t : "none", e.dragMode = t, J(i, w, t), G(i, p, n), G(i, g, r), e.cropBoxMovable || (J(a, w, t), G(a, p, n), G(a, g, r)) } return this } }, kt = l.Cropper, _t = function () { function t(i) { var a = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (e(this, t), !i || !L.test(i.tagName)) throw new Error("The first argument is required and must be an or element."); this.element = i, this.options = I({}, C, H(a) && a), this.cropped = !1, this.disabled = !1, this.pointers = {}, this.ready = !1, this.reloading = !1, this.replaced = !1, this.sized = !1, this.sizing = !1, this.init() } var a, n, r; return a = t, r = [{ key: "noConflict", value: function () { return window.Cropper = kt, t } }, { key: "setDefaults", value: function (t) { I(C, H(t) && t) } }], (n = [{ key: "init", value: function () { var t, e = this.element, i = e.tagName.toLowerCase(); if (!e.cropper) { if (e.cropper = this, "img" === i) { if (this.isImg = !0, t = e.getAttribute("src") || "", this.originalUrl = t, !t) return; t = e.src } else "canvas" === i && window.HTMLCanvasElement && (t = e.toDataURL()); this.load(t) } } }, { key: "load", value: function (t) { var e = this; if (t) { this.url = t, this.imageData = {}; var i = this.element, a = this.options; if (a.rotatable || a.scalable || (a.checkOrientation = !1), a.checkOrientation && window.ArrayBuffer) if (z.test(t)) E.test(t) ? this.read((n = t.replace(mt, ""), r = atob(n), o = new ArrayBuffer(r.length), F(s = new Uint8Array(o), (function (t, e) { s[e] = r.charCodeAt(e) })), o)) : this.clone(); else { var n, r, o, s, l = new XMLHttpRequest, c = this.clone.bind(this); this.reloading = !0, this.xhr = l, l.onabort = c, l.onerror = c, l.ontimeout = c, l.onprogress = function () { "image/png" !== l.getResponseHeader("content-type") && l.abort() }, l.onload = function () { e.read(l.response) }, l.onloadend = function () { e.reloading = !1, e.xhr = null }, a.checkCrossOrigin && lt(t) && i.crossOrigin && (t = ct(t)), l.open("GET", t), l.responseType = "arraybuffer", l.withCredentials = "use-credentials" === i.crossOrigin, l.send() } else this.clone() } } }, { key: "read", value: function (t) { var e = this.options, i = this.imageData, a = vt(t), n = 0, r = 1, o = 1; if (a > 1) { this.url = function (t, e) { for (var i = [], a = new Uint8Array(t); a.length > 0;)i.push(ft.apply(null, q(a.subarray(0, 8192)))), a = a.subarray(8192); return "data:".concat(e, ";base64,").concat(btoa(i.join(""))) }(t, "image/png"); var s = function (t) { var e = 0, i = 1, a = 1; switch (t) { case 2: i = -1; break; case 3: e = -180; break; case 4: a = -1; break; case 5: e = 90, a = -1; break; case 6: e = 90; break; case 7: e = 90, i = -1; break; case 8: e = -90 }return { rotate: e, scaleX: i, scaleY: a } }(a); n = s.rotate, r = s.scaleX, o = s.scaleY } e.rotatable && (i.rotate = n), e.scalable && (i.scaleX = r, i.scaleY = o), this.clone() } }, { key: "clone", value: function () { var t = this.element, e = this.url, i = t.crossOrigin, a = e; this.options.checkCrossOrigin && lt(e) && (i || (i = "anonymous"), a = ct(e)), this.crossOrigin = i, this.crossOriginUrl = a; var n = document.createElement("img"); i && (n.crossOrigin = i), n.src = a || e, n.alt = t.alt || "The image to crop", this.image = n, n.onload = this.start.bind(this), n.onerror = this.stop.bind(this), V(n, f), t.parentNode.insertBefore(n, t.nextSibling) } }, { key: "start", value: function () { var t = this, e = this.image; e.onload = null, e.onerror = null, this.sizing = !0; var i = l.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(l.navigator.userAgent), a = function (e, i) { I(t.imageData, { naturalWidth: e, naturalHeight: i, aspectRatio: e / i }), t.sizing = !1, t.sized = !0, t.build() }; if (!e.naturalWidth || i) { var n = document.createElement("img"), r = document.body || document.documentElement; this.sizingImage = n, n.onload = function () { a(n.width, n.height), i || r.removeChild(n) }, n.src = e.src, i || (n.style.cssText = "left:0;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;opacity:0;position:absolute;top:0;z-index:-1;", r.appendChild(n)) } else a(e.naturalWidth, e.naturalHeight) } }, { key: "stop", value: function () { var t = this.image; t.onload = null, t.onerror = null, t.parentNode.removeChild(t), this.image = null } }, { key: "build", value: function () { if (this.sized && !this.ready) { var t = this.element, e = this.options, i = this.image, a = t.parentNode, n = document.createElement("div"); n.innerHTML = '
      '; var r = n.querySelector(".".concat("cropper", "-container")), o = r.querySelector(".".concat("cropper", "-canvas")), s = r.querySelector(".".concat("cropper", "-drag-box")), l = r.querySelector(".".concat("cropper", "-crop-box")), c = l.querySelector(".".concat("cropper", "-face")); this.container = a, this.cropper = r, this.canvas = o, this.dragBox = s, this.cropBox = l, this.viewBox = r.querySelector(".".concat("cropper", "-view-box")), this.face = c, o.appendChild(i), V(t, u), a.insertBefore(r, t.nextSibling), this.isImg || X(i, f), this.initPreview(), this.bind(), e.initialAspectRatio = Math.max(0, e.initialAspectRatio) || NaN, e.aspectRatio = Math.max(0, e.aspectRatio) || NaN, e.viewMode = Math.max(0, Math.min(3, Math.round(e.viewMode))) || 0, V(l, u), e.guides || V(l.getElementsByClassName("".concat("cropper", "-dashed")), u), e.center || V(l.getElementsByClassName("".concat("cropper", "-center")), u), e.background && V(r, "".concat("cropper", "-bg")), e.highlight || V(c, m), e.cropBoxMovable && (V(c, g), J(c, w, "all")), e.cropBoxResizable || (V(l.getElementsByClassName("".concat("cropper", "-line")), u), V(l.getElementsByClassName("".concat("cropper", "-point")), u)), this.render(), this.ready = !0, this.setDragMode(e.dragMode), e.autoCrop && this.crop(), this.setData(e.data), O(e.ready) && at(t, "ready", e.ready, { once: !0 }), nt(t, "ready") } } }, { key: "unbuild", value: function () { this.ready && (this.ready = !1, this.unbind(), this.resetPreview(), this.cropper.parentNode.removeChild(this.cropper), X(this.element, u)) } }, { key: "uncreate", value: function () { this.ready ? (this.unbuild(), this.ready = !1, this.cropped = !1) : this.sizing ? (this.sizingImage.onload = null, this.sizing = !1, this.sized = !1) : this.reloading ? (this.xhr.onabort = null, this.xhr.abort()) : this.image && this.stop() } }]) && i(a.prototype, n), r && i(a, r), t }(); return I(_t.prototype, gt, wt, yt, bt, xt, $t), _t }() }, function (t, e, i) { var a, n, r = i(5), o = i(6), s = (n = [], { activateTrap: function (t) { if (n.length > 0) { var e = n[n.length - 1]; e !== t && e.pause() } var i = n.indexOf(t); -1 === i ? n.push(t) : (n.splice(i, 1), n.push(t)) }, deactivateTrap: function (t) { var e = n.indexOf(t); -1 !== e && n.splice(e, 1), n.length > 0 && n[n.length - 1].unpause() } }); function l(t) { return setTimeout(t, 0) } t.exports = function (t, e) { var i = document, n = "string" == typeof t ? i.querySelector(t) : t, c = o({ returnFocusOnDeactivate: !0, escapeDeactivates: !0 }, e), h = { firstTabbableNode: null, lastTabbableNode: null, nodeFocusedBeforeActivation: null, mostRecentlyFocusedNode: null, active: !1, paused: !1 }, p = { activate: function (t) { if (h.active) return; x(), h.active = !0, h.paused = !1, h.nodeFocusedBeforeActivation = i.activeElement; var e = t && t.onActivate ? t.onActivate : c.onActivate; e && e(); return u(), p }, deactivate: d, pause: function () { if (h.paused || !h.active) return; h.paused = !0, f() }, unpause: function () { if (!h.paused || !h.active) return; h.paused = !1, x(), u() } }; return p; function d(t) { if (h.active) { clearTimeout(a), f(), h.active = !1, h.paused = !1, s.deactivateTrap(p); var e = t && void 0 !== t.onDeactivate ? t.onDeactivate : c.onDeactivate; return e && e(), (t && void 0 !== t.returnFocus ? t.returnFocus : c.returnFocusOnDeactivate) && l((function () { var t; $((t = h.nodeFocusedBeforeActivation, m("setReturnFocus") || t)) })), p } } function u() { if (h.active) return s.activateTrap(p), a = l((function () { $(v()) })), i.addEventListener("focusin", w, !0), i.addEventListener("mousedown", g, { capture: !0, passive: !1 }), i.addEventListener("touchstart", g, { capture: !0, passive: !1 }), i.addEventListener("click", b, { capture: !0, passive: !1 }), i.addEventListener("keydown", y, { capture: !0, passive: !1 }), p } function f() { if (h.active) return i.removeEventListener("focusin", w, !0), i.removeEventListener("mousedown", g, !0), i.removeEventListener("touchstart", g, !0), i.removeEventListener("click", b, !0), i.removeEventListener("keydown", y, !0), p } function m(t) { var e = c[t], a = e; if (!e) return null; if ("string" == typeof e && !(a = i.querySelector(e))) throw new Error("`" + t + "` refers to no known node"); if ("function" == typeof e && !(a = e())) throw new Error("`" + t + "` did not return a node"); return a } function v() { var t; if (!(t = null !== m("initialFocus") ? m("initialFocus") : n.contains(i.activeElement) ? i.activeElement : h.firstTabbableNode || m("fallbackFocus"))) throw new Error("Your focus-trap needs to have at least one focusable element"); return t } function g(t) { n.contains(t.target) || (c.clickOutsideDeactivates ? d({ returnFocus: !r.isFocusable(t.target) }) : c.allowOutsideClick && c.allowOutsideClick(t) || t.preventDefault()) } function w(t) { n.contains(t.target) || t.target instanceof Document || (t.stopImmediatePropagation(), $(h.mostRecentlyFocusedNode || v())) } function y(t) { if (!1 !== c.escapeDeactivates && function (t) { return "Escape" === t.key || "Esc" === t.key || 27 === t.keyCode }(t)) return t.preventDefault(), void d(); (function (t) { return "Tab" === t.key || 9 === t.keyCode })(t) && function (t) { if (x(), t.shiftKey && t.target === h.firstTabbableNode) return t.preventDefault(), void $(h.lastTabbableNode); if (!t.shiftKey && t.target === h.lastTabbableNode) t.preventDefault(), $(h.firstTabbableNode) }(t) } function b(t) { c.clickOutsideDeactivates || n.contains(t.target) || c.allowOutsideClick && c.allowOutsideClick(t) || (t.preventDefault(), t.stopImmediatePropagation()) } function x() { var t = r(n); h.firstTabbableNode = t[0] || v(), h.lastTabbableNode = t[t.length - 1] || v() } function $(t) { t !== i.activeElement && (t && t.focus ? (t.focus(), h.mostRecentlyFocusedNode = t, function (t) { return t.tagName && "input" === t.tagName.toLowerCase() && "function" == typeof t.select }(t) && t.select()) : $(v())) } } }, function (t, e, i) { (function (e, i) { /*! * @overview es6-promise - a tiny implementation of Promises/A+. * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) * @license Licensed under MIT license * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE * @version v4.2.8+1e68dce6 */var a; a = function () { "use strict"; function t(t) { return "function" == typeof t } var a = Array.isArray ? Array.isArray : function (t) { return "[object Array]" === Object.prototype.toString.call(t) }, n = 0, r = void 0, o = void 0, s = function (t, e) { f[n] = t, f[n + 1] = e, 2 === (n += 2) && (o ? o(m) : b()) }, l = "undefined" != typeof window ? window : void 0, c = l || {}, h = c.MutationObserver || c.WebKitMutationObserver, p = "undefined" == typeof self && void 0 !== e && "[object process]" === {}.toString.call(e), d = "undefined" != typeof Uint8ClampedArray && "undefined" != typeof importScripts && "undefined" != typeof MessageChannel; function u() { var t = setTimeout; return function () { return t(m, 1) } } var f = new Array(1e3); function m() { for (var t = 0; t < n; t += 2)(0, f[t])(f[t + 1]), f[t] = void 0, f[t + 1] = void 0; n = 0 } var v, g, w, y, b = void 0; function x(t, e) { var i = this, a = new this.constructor(_); void 0 === a[k] && B(a); var n = i._state; if (n) { var r = arguments[n - 1]; s((function () { return A(n, a, r, i._result) })) } else C(i, a, t, e); return a } function $(t) { if (t && "object" == typeof t && t.constructor === this) return t; var e = new this(_); return R(e, t), e } p ? b = function () { return e.nextTick(m) } : h ? (g = 0, w = new h(m), y = document.createTextNode(""), w.observe(y, { characterData: !0 }), b = function () { y.data = g = ++g % 2 }) : d ? ((v = new MessageChannel).port1.onmessage = m, b = function () { return v.port2.postMessage(0) }) : b = void 0 === l ? function () { try { var t = Function("return this")().require("vertx"); return void 0 !== (r = t.runOnLoop || t.runOnContext) ? function () { r(m) } : u() } catch (t) { return u() } }() : u(); var k = Math.random().toString(36).substring(2); function _() { } function S(e, i, a) { i.constructor === e.constructor && a === x && i.constructor.resolve === $ ? function (t, e) { 1 === e._state ? E(t, e._result) : 2 === e._state ? L(t, e._result) : C(e, void 0, (function (e) { return R(t, e) }), (function (e) { return L(t, e) })) }(e, i) : void 0 === a ? E(e, i) : t(a) ? function (t, e, i) { s((function (t) { var a = !1, n = function (t, e, i, a) { try { t.call(e, i, a) } catch (t) { return t } }(i, e, (function (i) { a || (a = !0, e !== i ? R(t, i) : E(t, i)) }), (function (e) { a || (a = !0, L(t, e)) }), t._label); !a && n && (a = !0, L(t, n)) }), t) }(e, i, a) : E(e, i) } function R(t, e) { if (t === e) L(t, new TypeError("You cannot resolve a promise with itself")); else if (n = typeof (a = e), null === a || "object" !== n && "function" !== n) E(t, e); else { var i = void 0; try { i = e.then } catch (e) { return void L(t, e) } S(t, e, i) } var a, n } function z(t) { t._onerror && t._onerror(t._result), M(t) } function E(t, e) { void 0 === t._state && (t._result = e, t._state = 1, 0 !== t._subscribers.length && s(M, t)) } function L(t, e) { void 0 === t._state && (t._state = 2, t._result = e, s(z, t)) } function C(t, e, i, a) { var n = t._subscribers, r = n.length; t._onerror = null, n[r] = e, n[r + 1] = i, n[r + 2] = a, 0 === r && t._state && s(M, t) } function M(t) { var e = t._subscribers, i = t._state; if (0 !== e.length) { for (var a = void 0, n = void 0, r = t._result, o = 0; o < e.length; o += 3)a = e[o], n = e[o + i], a ? A(i, a, n, r) : n(r); t._subscribers.length = 0 } } function A(e, i, a, n) { var r = t(a), o = void 0, s = void 0, l = !0; if (r) { try { o = a(n) } catch (t) { l = !1, s = t } if (i === o) return void L(i, new TypeError("A promises callback cannot return that same promise.")) } else o = n; void 0 !== i._state || (r && l ? R(i, o) : !1 === l ? L(i, s) : 1 === e ? E(i, o) : 2 === e && L(i, o)) } var T = 0; function B(t) { t[k] = T++, t._state = void 0, t._result = void 0, t._subscribers = [] } var D = function () { function t(t, e) { this._instanceConstructor = t, this.promise = new t(_), this.promise[k] || B(this.promise), a(e) ? (this.length = e.length, this._remaining = e.length, this._result = new Array(this.length), 0 === this.length ? E(this.promise, this._result) : (this.length = this.length || 0, this._enumerate(e), 0 === this._remaining && E(this.promise, this._result))) : L(this.promise, new Error("Array Methods must be provided an Array")) } return t.prototype._enumerate = function (t) { for (var e = 0; void 0 === this._state && e < t.length; e++)this._eachEntry(t[e], e) }, t.prototype._eachEntry = function (t, e) { var i = this._instanceConstructor, a = i.resolve; if (a === $) { var n = void 0, r = void 0, o = !1; try { n = t.then } catch (t) { o = !0, r = t } if (n === x && void 0 !== t._state) this._settledAt(t._state, e, t._result); else if ("function" != typeof n) this._remaining--, this._result[e] = t; else if (i === U) { var s = new i(_); o ? L(s, r) : S(s, t, n), this._willSettleAt(s, e) } else this._willSettleAt(new i((function (e) { return e(t) })), e) } else this._willSettleAt(a(t), e) }, t.prototype._settledAt = function (t, e, i) { var a = this.promise; void 0 === a._state && (this._remaining--, 2 === t ? L(a, i) : this._result[e] = i), 0 === this._remaining && E(a, this._result) }, t.prototype._willSettleAt = function (t, e) { var i = this; C(t, void 0, (function (t) { return i._settledAt(1, e, t) }), (function (t) { return i._settledAt(2, e, t) })) }, t }(), U = function () { function e(t) { this[k] = T++, this._result = this._state = void 0, this._subscribers = [], _ !== t && ("function" != typeof t && function () { throw new TypeError("You must pass a resolver function as the first argument to the promise constructor") }(), this instanceof e ? function (t, e) { try { e((function (e) { R(t, e) }), (function (e) { L(t, e) })) } catch (e) { L(t, e) } }(this, t) : function () { throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.") }()) } return e.prototype.catch = function (t) { return this.then(null, t) }, e.prototype.finally = function (e) { var i = this.constructor; return t(e) ? this.then((function (t) { return i.resolve(e()).then((function () { return t })) }), (function (t) { return i.resolve(e()).then((function () { throw t })) })) : this.then(e, e) }, e }(); return U.prototype.then = x, U.all = function (t) { return new D(this, t).promise }, U.race = function (t) { var e = this; return a(t) ? new e((function (i, a) { for (var n = t.length, r = 0; r < n; r++)e.resolve(t[r]).then(i, a) })) : new e((function (t, e) { return e(new TypeError("You must pass an array to race.")) })) }, U.resolve = $, U.reject = function (t) { var e = new this(_); return L(e, t), e }, U._setScheduler = function (t) { o = t }, U._setAsap = function (t) { s = t }, U._asap = s, U.polyfill = function () { var t = void 0; if (void 0 !== i) t = i; else if ("undefined" != typeof self) t = self; else try { t = Function("return this")() } catch (t) { throw new Error("polyfill failed because global object is unavailable in this environment") } var e = t.Promise; if (e) { var a = null; try { a = Object.prototype.toString.call(e.resolve()) } catch (t) { } if ("[object Promise]" === a && !e.cast) return } t.Promise = U }, U.Promise = U, U }, t.exports = a() }).call(this, i(3), i(4)) }, function (t, e) { var i, a, n = t.exports = {}; function r() { throw new Error("setTimeout has not been defined") } function o() { throw new Error("clearTimeout has not been defined") } function s(t) { if (i === setTimeout) return setTimeout(t, 0); if ((i === r || !i) && setTimeout) return i = setTimeout, setTimeout(t, 0); try { return i(t, 0) } catch (e) { try { return i.call(null, t, 0) } catch (e) { return i.call(this, t, 0) } } } !function () { try { i = "function" == typeof setTimeout ? setTimeout : r } catch (t) { i = r } try { a = "function" == typeof clearTimeout ? clearTimeout : o } catch (t) { a = o } }(); var l, c = [], h = !1, p = -1; function d() { h && l && (h = !1, l.length ? c = l.concat(c) : p = -1, c.length && u()) } function u() { if (!h) { var t = s(d); h = !0; for (var e = c.length; e;) { for (l = c, c = []; ++p < e;)l && l[p].run(); p = -1, e = c.length } l = null, h = !1, function (t) { if (a === clearTimeout) return clearTimeout(t); if ((a === o || !a) && clearTimeout) return a = clearTimeout, clearTimeout(t); try { a(t) } catch (e) { try { return a.call(null, t) } catch (e) { return a.call(this, t) } } }(t) } } function f(t, e) { this.fun = t, this.array = e } function m() { } n.nextTick = function (t) { var e = new Array(arguments.length - 1); if (arguments.length > 1) for (var i = 1; i < arguments.length; i++)e[i - 1] = arguments[i]; c.push(new f(t, e)), 1 !== c.length || h || s(u) }, f.prototype.run = function () { this.fun.apply(null, this.array) }, n.title = "browser", n.browser = !0, n.env = {}, n.argv = [], n.version = "", n.versions = {}, n.on = m, n.addListener = m, n.once = m, n.off = m, n.removeListener = m, n.removeAllListeners = m, n.emit = m, n.prependListener = m, n.prependOnceListener = m, n.listeners = function (t) { return [] }, n.binding = function (t) { throw new Error("process.binding is not supported") }, n.cwd = function () { return "/" }, n.chdir = function (t) { throw new Error("process.chdir is not supported") }, n.umask = function () { return 0 } }, function (t, e) { var i; i = function () { return this }(); try { i = i || new Function("return this")() } catch (t) { "object" == typeof window && (i = window) } t.exports = i }, function (t, e) { var i = ["input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])'], a = i.join(","), n = "undefined" == typeof Element ? function () { } : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; function r(t, e) { e = e || {}; var i, r, s, l = [], p = [], d = t.querySelectorAll(a); for (e.includeContainer && n.call(t, a) && (d = Array.prototype.slice.apply(d)).unshift(t), i = 0; i < d.length; i++)o(r = d[i]) && (0 === (s = c(r)) ? l.push(r) : p.push({ documentOrder: i, tabIndex: s, node: r })); return p.sort(h).map((function (t) { return t.node })).concat(l) } function o(t) { return !(!s(t) || function (t) { return function (t) { return p(t) && "radio" === t.type }(t) && !function (t) { if (!t.name) return !0; var e = function (t) { for (var e = 0; e < t.length; e++)if (t[e].checked) return t[e] }(t.ownerDocument.querySelectorAll('input[type="radio"][name="' + t.name + '"]')); return !e || e === t }(t) }(t) || c(t) < 0) } function s(t) { return !(t.disabled || function (t) { return p(t) && "hidden" === t.type }(t) || function (t) { return null === t.offsetParent || "hidden" === getComputedStyle(t).visibility }(t)) } r.isTabbable = function (t) { if (!t) throw new Error("No node provided"); return !1 !== n.call(t, a) && o(t) }, r.isFocusable = function (t) { if (!t) throw new Error("No node provided"); return !1 !== n.call(t, l) && s(t) }; var l = i.concat("iframe").join(","); function c(t) { var e = parseInt(t.getAttribute("tabindex"), 10); return isNaN(e) ? function (t) { return "true" === t.contentEditable }(t) ? 0 : t.tabIndex : e } function h(t, e) { return t.tabIndex === e.tabIndex ? t.documentOrder - e.documentOrder : t.tabIndex - e.tabIndex } function p(t) { return "INPUT" === t.tagName } t.exports = r }, function (t, e) { t.exports = function () { for (var t = {}, e = 0; e < arguments.length; e++) { var a = arguments[e]; for (var n in a) i.call(a, n) && (t[n] = a[n]) } return t }; var i = Object.prototype.hasOwnProperty }, function (t, e, i) { "use strict"; i.r(e); var a = "URLSearchParams" in self, n = "Symbol" in self && "iterator" in Symbol, r = "FileReader" in self && "Blob" in self && function () { try { return new Blob, !0 } catch (t) { return !1 } }(), o = "FormData" in self, s = "ArrayBuffer" in self; if (s) var l = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"], c = ArrayBuffer.isView || function (t) { return t && l.indexOf(Object.prototype.toString.call(t)) > -1 }; function h(t) { if ("string" != typeof t && (t = String(t)), /[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t)) throw new TypeError("Invalid character in header field name"); return t.toLowerCase() } function p(t) { return "string" != typeof t && (t = String(t)), t } function d(t) { var e = { next: function () { var e = t.shift(); return { done: void 0 === e, value: e } } }; return n && (e[Symbol.iterator] = function () { return e }), e } function u(t) { this.map = {}, t instanceof u ? t.forEach((function (t, e) { this.append(e, t) }), this) : Array.isArray(t) ? t.forEach((function (t) { this.append(t[0], t[1]) }), this) : t && Object.getOwnPropertyNames(t).forEach((function (e) { this.append(e, t[e]) }), this) } function f(t) { if (t.bodyUsed) return Promise.reject(new TypeError("Already read")); t.bodyUsed = !0 } function m(t) { return new Promise((function (e, i) { t.onload = function () { e(t.result) }, t.onerror = function () { i(t.error) } })) } function v(t) { var e = new FileReader, i = m(e); return e.readAsArrayBuffer(t), i } function g(t) { if (t.slice) return t.slice(0); var e = new Uint8Array(t.byteLength); return e.set(new Uint8Array(t)), e.buffer } function w() { return this.bodyUsed = !1, this._initBody = function (t) { var e; this._bodyInit = t, t ? "string" == typeof t ? this._bodyText = t : r && Blob.prototype.isPrototypeOf(t) ? this._bodyBlob = t : o && FormData.prototype.isPrototypeOf(t) ? this._bodyFormData = t : a && URLSearchParams.prototype.isPrototypeOf(t) ? this._bodyText = t.toString() : s && r && ((e = t) && DataView.prototype.isPrototypeOf(e)) ? (this._bodyArrayBuffer = g(t.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer])) : s && (ArrayBuffer.prototype.isPrototypeOf(t) || c(t)) ? this._bodyArrayBuffer = g(t) : this._bodyText = t = Object.prototype.toString.call(t) : this._bodyText = "", this.headers.get("content-type") || ("string" == typeof t ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : a && URLSearchParams.prototype.isPrototypeOf(t) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8")) }, r && (this.blob = function () { var t = f(this); if (t) return t; if (this._bodyBlob) return Promise.resolve(this._bodyBlob); if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer])); if (this._bodyFormData) throw new Error("could not read FormData body as blob"); return Promise.resolve(new Blob([this._bodyText])) }, this.arrayBuffer = function () { return this._bodyArrayBuffer ? f(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(v) }), this.text = function () { var t, e, i, a = f(this); if (a) return a; if (this._bodyBlob) return t = this._bodyBlob, e = new FileReader, i = m(e), e.readAsText(t), i; if (this._bodyArrayBuffer) return Promise.resolve(function (t) { for (var e = new Uint8Array(t), i = new Array(e.length), a = 0; a < e.length; a++)i[a] = String.fromCharCode(e[a]); return i.join("") }(this._bodyArrayBuffer)); if (this._bodyFormData) throw new Error("could not read FormData body as text"); return Promise.resolve(this._bodyText) }, o && (this.formData = function () { return this.text().then(x) }), this.json = function () { return this.text().then(JSON.parse) }, this } u.prototype.append = function (t, e) { t = h(t), e = p(e); var i = this.map[t]; this.map[t] = i ? i + ", " + e : e }, u.prototype.delete = function (t) { delete this.map[h(t)] }, u.prototype.get = function (t) { return t = h(t), this.has(t) ? this.map[t] : null }, u.prototype.has = function (t) { return this.map.hasOwnProperty(h(t)) }, u.prototype.set = function (t, e) { this.map[h(t)] = p(e) }, u.prototype.forEach = function (t, e) { for (var i in this.map) this.map.hasOwnProperty(i) && t.call(e, this.map[i], i, this) }, u.prototype.keys = function () { var t = []; return this.forEach((function (e, i) { t.push(i) })), d(t) }, u.prototype.values = function () { var t = []; return this.forEach((function (e) { t.push(e) })), d(t) }, u.prototype.entries = function () { var t = []; return this.forEach((function (e, i) { t.push([i, e]) })), d(t) }, n && (u.prototype[Symbol.iterator] = u.prototype.entries); var y = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"]; function b(t, e) { var i, a, n = (e = e || {}).body; if (t instanceof b) { if (t.bodyUsed) throw new TypeError("Already read"); this.url = t.url, this.credentials = t.credentials, e.headers || (this.headers = new u(t.headers)), this.method = t.method, this.mode = t.mode, this.signal = t.signal, n || null == t._bodyInit || (n = t._bodyInit, t.bodyUsed = !0) } else this.url = String(t); if (this.credentials = e.credentials || this.credentials || "same-origin", !e.headers && this.headers || (this.headers = new u(e.headers)), this.method = (i = e.method || this.method || "GET", a = i.toUpperCase(), y.indexOf(a) > -1 ? a : i), this.mode = e.mode || this.mode || null, this.signal = e.signal || this.signal, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && n) throw new TypeError("Body not allowed for GET or HEAD requests"); this._initBody(n) } function x(t) { var e = new FormData; return t.trim().split("&").forEach((function (t) { if (t) { var i = t.split("="), a = i.shift().replace(/\+/g, " "), n = i.join("=").replace(/\+/g, " "); e.append(decodeURIComponent(a), decodeURIComponent(n)) } })), e } function $(t, e) { e || (e = {}), this.type = "default", this.status = void 0 === e.status ? 200 : e.status, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in e ? e.statusText : "OK", this.headers = new u(e.headers), this.url = e.url || "", this._initBody(t) } b.prototype.clone = function () { return new b(this, { body: this._bodyInit }) }, w.call(b.prototype), w.call($.prototype), $.prototype.clone = function () { return new $(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new u(this.headers), url: this.url }) }, $.error = function () { var t = new $(null, { status: 0, statusText: "" }); return t.type = "error", t }; var k = [301, 302, 303, 307, 308]; $.redirect = function (t, e) { if (-1 === k.indexOf(e)) throw new RangeError("Invalid status code"); return new $(null, { status: e, headers: { location: t } }) }; var _ = self.DOMException; try { new _ } catch (t) { (_ = function (t, e) { this.message = t, this.name = e; var i = Error(t); this.stack = i.stack }).prototype = Object.create(Error.prototype), _.prototype.constructor = _ } function S(t, e) { return new Promise((function (i, a) { var n = new b(t, e); if (n.signal && n.signal.aborted) return a(new _("Aborted", "AbortError")); var o = new XMLHttpRequest; function s() { o.abort() } o.onload = function () { var t, e, a = { status: o.status, statusText: o.statusText, headers: (t = o.getAllResponseHeaders() || "", e = new u, t.replace(/\r?\n[\t ]+/g, " ").split(/\r?\n/).forEach((function (t) { var i = t.split(":"), a = i.shift().trim(); if (a) { var n = i.join(":").trim(); e.append(a, n) } })), e) }; a.url = "responseURL" in o ? o.responseURL : a.headers.get("X-Request-URL"); var n = "response" in o ? o.response : o.responseText; i(new $(n, a)) }, o.onerror = function () { a(new TypeError("Network request failed")) }, o.ontimeout = function () { a(new TypeError("Network request failed")) }, o.onabort = function () { a(new _("Aborted", "AbortError")) }, o.open(n.method, n.url, !0), "include" === n.credentials ? o.withCredentials = !0 : "omit" === n.credentials && (o.withCredentials = !1), "responseType" in o && r && (o.responseType = "blob"), n.headers.forEach((function (t, e) { o.setRequestHeader(e, t) })), n.signal && (n.signal.addEventListener("abort", s), o.onreadystatechange = function () { 4 === o.readyState && n.signal.removeEventListener("abort", s) }), o.send(void 0 === n._bodyInit ? null : n._bodyInit) })) } S.polyfill = !0, self.fetch || (self.fetch = S, self.Headers = u, self.Request = b, self.Response = $), i(2).polyfill(), window.NodeList && !NodeList.prototype.forEach && (NodeList.prototype.forEach = Array.prototype.forEach), String.prototype.startsWith || Object.defineProperty(String.prototype, "startsWith", { value: function (t, e) { var i = e > 0 ? 0 | e : 0; return this.substring(i, i + t.length) === t } }), String.prototype.includes || Object.defineProperty(String.prototype, "includes", { value: function (t, e) { return void 0 === e && (e = 0), -1 !== this.indexOf(t, e) } }); class R { constructor() { this.type = "service", this.name = "", this.invisible = !1, this.noRecolor = !1, this.icon = "", this.color = "#333", this.template = () => "", this.handlers = () => { }, this.stop = () => { }, this.supports = () => !0 } } let z = {}; const E = t => { const e = {}; for (const i in t) if (t.hasOwnProperty(i)) if ("object" == typeof t[i]) { const a = E(t[i]); for (const t in a) a.hasOwnProperty(t) && (e[i + "." + t] = a[t]) } else e[i] = t[i]; return e }, L = t => { z = E(t) }, C = (t, e) => { try { let i = z[t]; return "string" == typeof e && (e = [e]), e && e.forEach((t, e) => { i = i.replace(`$${e + 1}$`, t) }), z.helper && "function" == typeof z.helper && (i = z.helper(i)), i } catch (t) { return "" } }, M = t => { if (!t) return []; const e = []; return "string" == typeof t ? e.push(...Array.prototype.slice.call(document.querySelectorAll(t))) : Array.isArray(t) ? t.forEach(t => { "string" == typeof t ? e.push(...Array.prototype.slice.call(document.querySelectorAll(t))) : e.push(t) }) : e.push(t), e }, A = [], T = (t, e, i) => { !!A.find(i => i.element === t && i.type === e) || (t.addEventListener(e, i), A.push({ element: t, type: e })) }, B = t => { if (window.requestAnimationFrame) return window.requestAnimationFrame(t); setTimeout(() => { t(0) }, 100) }, D = (t, e) => new Promise(i => { B(() => { const a = e.parentElement, n = e.getBoundingClientRect(); if (!a) return; const r = a.getBoundingClientRect(); n.height < n.width ? (e.style.height = `${r.height}px`, e.style.width = "auto") : (e.style.width = `${r.width}px`, e.style.height = "auto"), B(() => { const a = e.getBoundingClientRect(); a.height > r.height ? (e.style.height = `${r.height}px`, e.style.width = "auto") : a.width > r.width && (e.style.width = `${r.width}px`, e.style.height = "auto"), B(() => { const e = t.uppload.container.querySelector(".uppload-effect"); e && (e.style.opacity = "1"), i() }) }) }) }), U = (t, e) => new Promise(i => { const a = URL.createObjectURL(t), n = document.createElement("canvas"), r = document.createElement("img"), o = e.maxSize || [e.maxWidth || 1 / 0, e.maxHeight || 1 / 0]; r.src = a, r.onload = () => { const a = e.compressionMime || "image/png", s = e.compression || 1, l = r.width / r.height; r.width > o[0] && (r.width = o[0], r.height = r.width * (1 / l)), r.height > o[1] && (r.height = o[1], r.width = r.height * l), n.width = r.width, n.height = r.height; const c = n.getContext("2d"); if (!c) return i(t); c.clearRect(0, 0, n.width, n.height), c.drawImage(r, 0, 0, n.width, n.height), H(n, a, s).then(e => { if (e) return i(e); i(t) }) }, T(r, "error", () => i(t)) }), H = (t, e, i) => new Promise((a, n) => { if ("function" == typeof t.toBlob) t.toBlob(t => { t && a(t), n(new Error("errors.image_error")) }, e, i); else if ("function" == typeof t.toDataURL) { const n = t.toDataURL(e, i); a((t => { const e = atob(t.split(",")[1]), i = t.split(",")[0].split(":")[1].split(";")[0], a = new ArrayBuffer(e.length), n = new Uint8Array(a); for (let t = 0; t < e.length; t++)n[t] = e.charCodeAt(t); return new Blob([a], { type: i }) })(n)) } else n(new Error("errors.image_error")) }), O = (t, e) => e.noRecolor ? t : t.replace(/#000/g, e.color || "#000"); var P = i(1), q = i.n(P); var F = function (t) { return t = t || Object.create(null), { on: function (e, i) { (t[e] || (t[e] = [])).push(i) }, off: function (e, i) { t[e] && t[e].splice(t[e].indexOf(i) >>> 0, 1) }, emit: function (e, i) { (t[e] || []).slice().map((function (t) { t(i) })), (t["*"] || []).slice().map((function (t) { t(e, i) })) } } }; class I extends R { constructor() { super(...arguments), this.name = "default", this.invisible = !0, this.template = () => `

      ${C("services.default.heading")}

      ` } } class j extends R { constructor() { super(...arguments), this.name = "uploading", this.invisible = !0, this.template = () => `
      \n
      \n

      ${C("uploading")}

      \n
      ` } } class N { constructor() { this.type = "effect", this.name = "", this.invisible = !1, this.noRecolor = !1, this.color = "#000", this.icon = "", this.template = () => "", this.handlers = () => { }, this.supports = () => !0 } } function W(t, e) { const i = sessionStorage; return new Promise((a, n) => { const r = `uppload_cache_${JSON.stringify(t)}`, o = new Date; o.setDate(o.getDate() + 1); const s = i.getItem(r); if (s) { const t = JSON.parse(s); if (t.ttl && new Date(t.ttl).getTime() > (new Date).getTime()) return a(t.result) } window.fetch(t, e).then(t => { if (!t.ok) throw new Error("errors.response_not_ok"); return t.json() }).then(t => { i.setItem(r, JSON.stringify({ ttl: o, updatedAt: new Date, result: t })), a(t) }).catch(t => n(t)) }) } const Y = t => new Promise((e, i) => { window.fetch(`https://images.weserv.nl/?url=${encodeURIComponent(t)}`).then(t => { if (!t.ok) throw new Error("errors.response_not_ok"); return t.blob() }).then(t => e(t)).catch(t => i(t)) }); class V extends R { constructor() { super(...arguments), this.loading = !1, this.exampleURL = "", this.validator = () => !0, this.template = ({ translate: t }) => `\n \n `, this.handlers = t => { const e = t.uppload.container.querySelector(".microlink-search-form"); e && T(e, "submit", e => { e.preventDefault(); const i = t.uppload.container.querySelector(".microlink-search-input"); if (i) { const e = i.value; if (!this.validator(e)) return t.handle(new Error("errors.invalid_url")); this.loading = !0, this.update(t), "screenshot" === this.name ? Y(`https://api.microlink.io?url=${encodeURIComponent(e)}&screenshot=true&meta=false&embed=screenshot.url`).then(e => t.next(e)).catch(e => t.handle(e)).then(() => this.loading = !1) : "url" === this.name ? Y(e).then(e => t.next(e)).catch(e => t.handle(e)) : W(`https://api.microlink.io/?url=${encodeURIComponent(e)}`).then(t => { if (!t.data.image || !t.data.image.url) throw new Error("errors.response_not_ok"); return t.data.image.url }).then(t => Y(t)).then(e => t.next(e)).catch(e => t.handle(e)) } return !1 }); const i = t.uppload.container.querySelector(".need-help-link"); i && T(i, "click", () => t.showHelp(`/services/${["url", "screenshot"].includes(this.name) ? this.name : `import-from-web-service/${this.name}`}`)) } } update(t) { const e = t.uppload.container.querySelector(".microlink-loader"), i = t.uppload.container.querySelector(".microlink-container"); i && (i.style.display = this.loading ? "none" : ""), e && (e.style.display = this.loading ? "flex" : "none") } } class X extends R { constructor({ apiKey: t, name: e, icon: i, color: a, poweredByUrl: n, popularEndpoint: r, searchEndpoint: o, getButton: s, getPopularResults: l, getSearchResults: c, noRecolor: h, fetchSettings: p }) { super(), this.results = [], this.loading = !1, this.noRecolor = !1, this.template = ({ translate: t }) => `\n
      \n
      ${O(this.icon, this)}
      \n \n \n
      \n
      \n
      \n \n
      \n
      \n

      ${t("fetching", t(`services.${this.name}.title`))}

      \n
      \n `, this.handlers = t => { const e = t.uppload.container.querySelector(".search-search-form"); e && T(e, "submit", e => { const i = t.uppload.container.querySelector(".search-search-input"); if (i) { const e = i.value; W(this.searchEndpoint(this.apiKey, e), this.fetchSettings).then(e => { this.results = this.getSearchResults(e), this.update(t) }).catch(() => t.handle(new Error("errors.unable_to_search"))) } return e.preventDefault(), !1 }), this.updateImages(t), t.uppload.container.querySelectorAll(".search-images button").forEach(e => { T(e, "click", () => { const i = e.getAttribute("data-full-url"); this.loading = !0, this.update(t), i && Y(i).then(e => t.next(e)).catch(e => t.handle("errors.response_not_ok")).then(() => this.loading = !1) }) }); const i = t.uppload.container.querySelector(".need-help-link"); i && T(i, "click", () => t.showHelp(`/services/search/${this.name}`)) }, this.name = e, this.icon = i, this.color = a, this.apiKey = t, this.noRecolor = !!h, this.poweredByUrl = n, this.popularEndpoint = r(this.apiKey), this.searchEndpoint = o, this.getButton = s, this.getPopularResults = l, this.getSearchResults = c, p && (this.fetchSettings = p(this.apiKey)), this.popularEndpoint && W(this.popularEndpoint, this.fetchSettings).then(t => { this.results = this.getPopularResults(t) }).catch(() => { }) } updateImages(t) { const e = t.uppload.container.querySelector(".search-images"); e && (e.innerHTML = `\n ${this.results.map(t => this.getButton(t)).join("\n")}\n `) } update(t) { this.updateImages(t), t && this.handlers(t); const e = t.uppload.container.querySelector(".search-loader"), i = t.uppload.container.querySelector(".search-container"); i && (i.style.display = this.loading ? "none" : ""), e && (e.style.display = this.loading ? "flex" : "none") } } var G = i(0), K = i.n(G); class Z extends N { constructor() { super(...arguments), this.canvas = document.createElement("canvas"), this.originalfileURL = "", this.cssFilter = "", this.max = 10, this.unit = "px", this.value = 0, this.supports = () => { var t; return !(!this.canvas.getContext || !this.canvas.getContext("2d") || "string" != typeof (null === (t = this.canvas.getContext("2d")) || void 0 === t ? void 0 : t.filter)) }, this.template = ({ file: t, translate: e }) => { const i = URL.createObjectURL(t); return this.originalfileURL = i, `\n
      \n \n
      \n
      \n \n 0${e(`units.${this.unit}`) || this.unit}\n
      \n ` }, this.handlers = t => { const e = t.uppload.container.querySelector(".uppload-hue-image img"); e && D(t, e).then(() => { const e = t.uppload.container.querySelector(".settings input[type='range']"); e && T(e, "change", this.update.bind(this, t)) }) } } imageToCanvasBlob(t) { return new Promise(e => { this.canvas = document.createElement("canvas"); const i = document.createElement("img"); i.src = this.originalfileURL, i.onload = () => { this.canvas.width = i.width, this.canvas.height = i.height; const a = this.canvas.getContext("2d"); a && (a.clearRect(0, 0, this.canvas.width, this.canvas.height), a.filter = t, a.drawImage(i, 0, 0), H(this.canvas).then(t => e(t))) } }) } update(t) { let e = 0; const i = t.uppload.container.querySelector(".settings input[type='range']"); i && (e = parseInt(i.value)); const a = t.uppload.container.querySelector(".settings .value span"); a && (a.innerHTML = e.toString()); const n = t.uppload.container.querySelector(".uppload-hue-image img"); n && this.imageToCanvasBlob(`${this.cssFilter}(${i.value}${this.unit})`).then(e => { if (!e) return; t.next(e); const i = URL.createObjectURL(e); n.setAttribute("src", i) }) } } window.uppload_Uppload = class { constructor(t) { this.services = [new I, new j], this.effects = [], this.isOpen = !1, this.activeService = "default", this.activeEffect = "", this.file = void 0, this.lang = {}, this.emitter = F(), this.uploadProgress = 0, this.inline = !1, this.transitionDuration = 300, this.settings = t || {}, this.updateSettings(this.settings); const e = document.createElement("div"); this.renderContainer(), e.classList.add("uppload-container"); const i = document.body; i && i.appendChild(e), this.container = e, this.focusTrap = q()(this.container, { initialFocus: () => this.container.querySelector("button") }), requestAnimationFrame(() => this.update()) } updateSettings(t) { this.emitter.emit("settingsUpdated", t), t.lang && L(t.lang), t.defaultService && (this.activeService = t.defaultService), t.lang && (this.lang = t.lang), t.transitionDuration && (this.transitionDuration = t.transitionDuration), t.uploader && (this.uploader = t.uploader), this.inline = !!t.inline, this.update(), this.settings.customClass && this.container.classList.add(this.settings.customClass), this.inline && this.container.classList.add("uppload-inline") } ready() { this.settings.value && this.bind(this.settings.value), this.renderContainer(), this.emitter.emit("ready") } bind(t) { if (this.settings.bind) { M(this.settings.bind).forEach(e => { "IMG" === e.nodeName ? e.setAttribute("src", t) : e.setAttribute("value", t) }), this.emitter.emit("bind") } } use(t) { Array.isArray(t) ? t.forEach(t => this.install(t)) : this.install(t) } install(t) { t.supports() && ("service" === t.type ? (this.services.push(t), this.ready()) : "effect" === t.type && (this.effects.push(t), this.ready())) } modalOpen() { return this.isOpen } open() { if (this.isOpen) return; this.isOpen = !0, this.file = void 0, this.activeService = "default", this.activeEffect = ""; const t = this.container.querySelector(`input[type=radio][value='${this.activeService}']`); t && t.setAttribute("checked", "checked"), this.container.style.transition = `${this.transitionDuration}ms`, this.container.style.opacity = "0", this.update(); let e = this.settings.defaultService; 3 === this.services.length && this.navigate(this.services[2].name), e && this.navigate(e), T(document.body, "keyup", t => { "Escape" === t.key && this.open && this.close() }), setTimeout(() => { this.container.style.opacity = "1" }, 1), this.emitter.emit("open") } close() { this.isOpen && (this.stopCurrentService(), this.isOpen = !1, this.emitter.emit("close"), this.container.style.opacity = "0", setTimeout(() => this.update(), this.transitionDuration)) } toggle() { this.modalOpen() ? this.close() : this.open() } update() { if (!this.container) return; this.hideHelp(); const t = this.container.querySelector(".uppload-active-container"); t && (t.innerHTML = this.render()); const e = this.container.querySelector("aside"); e && "default" !== this.activeService && !this.activeEffect && (e.style.display = "block"); const i = this.container.querySelector(".effects-nav"); e && i && this.activeEffect ? (i.style.display = "", e.style.display = "none") : e && i && "default" === this.activeService ? (e.style.display = "none", i.style.display = "none") : e && i && (e.style.display = "", i.style.display = "none"); const a = this.container.querySelector(".uppload-effect"); a && (a.style.display = this.activeEffect ? "" : "none"), window.requestAnimationFrame(() => this.handlers()), this.isOpen ? (this.container.classList.add("visible"), this.focusTrap.activate()) : (this.container.classList.remove("visible"), this.focusTrap.deactivate()); const n = this.container.querySelector("footer.effects-nav .effects-tabs"); if (n) { const t = n.parentElement; if (t) { let e = 0; t.querySelectorAll(".effects-continue").forEach(t => { const i = t.getBoundingClientRect(); e += i.width }); const i = t.getBoundingClientRect(); n.style.width = `${i.width - e}px` } } const r = this.container.querySelector("aside"); r && 3 === this.services.length && r.classList.add("uppload-services--single"); const o = this.container.querySelector(".uppload-help"); o && (o.classList.remove("visible"), T(o, "click", () => this.hideHelp())) } getNavbar(t = !1) { return `<${t ? "nav" : "div"} class="uppload-services">\n ${this.services.filter(t => !t.invisible).map(e => `
      \n ${t ? `` : ""}\n <${t ? `label for="uppload-service-radio-${e.name}"` : "button"} data-uppload-service="${e.name}">\n ${e.icon.startsWith("http") ? `` : O(e.icon, e)}\n ${this.lang.services && this.lang.services[e.name] && this.lang.services[e.name].title ? this.lang.services[e.name].title : e.name}\n \n
      `).join("")}\n ` } getEffectsNavbar() { return `
      \n \n
      \n ${this.effects.map(t => `\n \n \n `).join("")}\n
      \n \n
      ` } renderContainer() { this.container && (this.container.innerHTML = `\n
      \n \n
      \n ${this.error ? `
      ${this.error}
      ` : ""}\n
      \n
      ${this.getEffectsNavbar()}
      \n
      \n
      \n
      \n
      \n

      ${C("help.loading")}

      \n
      \n
      \n
      \n
      \n \n
      \n
      \n
      \n \n
      \n `) } render() { return `\n ${this.error ? `
      ${this.error}
      ` : ""}\n ${this.activeEffect ? `
      \n ${this.activeEffect && this.file ? this.renderActiveEffect(this.file) : ""}\n
      ` : `
      \n ${this.activeEffect && this.file ? "" : this.renderActiveService()}\n ${"default" === this.activeService ? this.getNavbar() : ""}\n
      `}` } renderActiveService() { const t = this.services.filter(t => t.name === this.activeService); if (t.length) { const e = t[0]; return requestAnimationFrame(() => { "function" == typeof e.handlers && e.handlers({ next: this.next.bind(this), upload: this.upload.bind(this), uploadMultiple: this.uploadMultiple.bind(this), handle: this.handle.bind(this), showHelp: this.showHelp.bind(this), uppload: this, translate: C }) }), `${"function" == typeof e.template ? e.template({ translate: C, uppload: this }) : ""}` } } renderActiveEffect(t) { const e = this.effects.filter(t => t.name === this.activeEffect); if (e.length) { const i = e[0]; return requestAnimationFrame(() => { "function" == typeof i.handlers && i.handlers({ next: this.next.bind(this), upload: this.upload.bind(this), uploadMultiple: this.uploadMultiple.bind(this), handle: this.handle.bind(this), showHelp: this.showHelp.bind(this), uppload: this, translate: C }) }), `\n
      ${"function" == typeof i.template ? i.template({ file: t, translate: C }) : ""}
      \n ` } } uploadMultiple(t) { return this.emitter.emit("before-upload"), new Promise(e => { this.navigate("uploading"), this.uploader && "function" == typeof this.uploader ? this.uploader(t, this.updateProgress.bind(this)).then(t => { this.navigate("default"), e(t), this.emitter.emit("upload", t), this.close() }).catch(t => this.handle(t)) : this.handle(new Error("no-uploader")) }) } hideHelp() { const t = this.container.querySelector(".uppload-help"), e = this.container.querySelector(".uppload-help-loading"), i = this.container.querySelector("aside"), a = this.container.querySelector("section"); e && e.classList.remove("visible"), t && t.classList.remove("visible"), i && (i.style.display = ""), a && (a.style.display = ""), this.emitter.emit("hide-help") } showHelp(t) { this.emitter.emit("help", t); const e = this.container.querySelector("aside"); e && (e.style.display = "none"); const i = this.container.querySelector("section"); i && (i.style.display = "none"); const a = this.container.querySelector(".uppload-help-loading"); a && a.classList.add("visible"); const n = this.container.querySelector(".uppload-help"); if (n) { const e = n.querySelector("iframe"); if (e) { e.setAttribute("src", `https://uppload.js.org/help${t}`); let i = !1; T(e, "load", () => { i = !0, n.classList.add("visible"), a && a.classList.remove("visible") }), T(e, "error", () => { i = !0, this.hideHelp() }) } } } next(t) { if (this.file = t, this.activeEffect); else { if (!this.effects.length) return this.upload(t); this.activeEffect = this.effects[0].name, this.update() } const e = this.container.querySelector(`input[name='uppload-effect-radio'][value='${this.activeEffect}']`); e && e.setAttribute("checked", "checked") } compress(t) { return "function" == typeof this.settings.compressor ? this.settings.compressor(t) : U(t, this.settings) } upload(t) { return this.emitter.emit("before-upload"), new Promise((e, i) => { this.navigate("uploading"), this.uploader && "function" == typeof this.uploader ? this.compress(t).then(t => (this.settings.compression && this.emitter.emit("compress", t), t)).then(t => this.uploader(t, this.updateProgress.bind(this))).then(t => { this.bind(t), this.navigate("default"), e(t), this.emitter.emit("upload", t), this.close() }).catch(t => this.handle(t)) : i("no-uploader") }) } handle(t) { this.error = C(t.message) || t.message, this.emitter.emit("error", this.error), this.update(), "uploading" === this.activeService && this.navigate("default"), setTimeout(() => { this.error = void 0, this.update() }, 4e3) } handlers() { const t = () => this.open(), e = () => this.close(); this.container.querySelectorAll(".uppload-service--default .uppload-service-name button").forEach(t => { T(t, "click", e => { const i = t.getAttribute("data-uppload-service"); if (i) { this.navigate(i); const t = this.container.querySelector(`[data-uppload-service="${i}"]`); if (t && t.parentElement) { let e = 0, i = 0; const a = t.getBoundingClientRect(), n = t.parentElement.getBoundingClientRect(); e = a.top - n.top, i = a.left - n.left; const r = t.parentElement.parentElement; try { r && r.scrollTo(i, e) } catch (t) { } } } const a = this.container.querySelector(`input[type=radio][value='${i}']`); return a && a.setAttribute("checked", "checked"), e.preventDefault(), !1 }) }), this.container.querySelectorAll(".uppload-services input[type='radio']").forEach(t => { T(t, "change", t => { const e = this.container.querySelector("[name='uppload-radio']:checked"); if (!e) return; const i = e.value; this.navigate(i) }) }), this.container.querySelectorAll(".effects-nav input[type='radio']").forEach(t => { T(t, "change", t => { const e = this.container.querySelector("[name='uppload-effect-radio']:checked"); if (!e) return; const i = e.value; this.activeEffect = i, this.update() }) }); const i = this.container.querySelector(".uppload-modal-bg"); if (i && T(i, "click", e), this.settings.call) { M(this.settings.call).forEach(e => { T(e, "click", t) }) } const a = this.container.querySelector(".effects-continue--cancel"); a && T(a, "click", () => { this.file = void 0, this.activeService = "default", this.activeEffect = "", this.update() }); const n = this.container.querySelector(".effects-continue--upload"); n && T(n, "click", () => { this.file && (this.activeService = "", this.activeEffect = "", this.upload(this.file)) }) } stopCurrentService() { const t = this.services.filter(t => t.name === this.activeService); if (t.length) { t[0].stop() } } navigate(t) { if (!this.services.filter(e => e.name === t).length) throw new Error("invalid-service"); this.stopCurrentService(), this.activeService = t, this.update(); const e = this.container.querySelector(".uppload-active-container input, .uppload-active-container button"); e && e.focus() } on(t, e) { return this.emitter.on(t, e) } off(t, e) { return this.emitter.on(t, e) } updateProgress(t) { this.uploadProgress = t; const e = this.container.querySelector(".uppload-loader-text .progress"); e && (e.innerHTML = `${parseInt(t.toString())}%`), this.emitter.emit("progress", this.updateProgress) } }, window.uppload_UpploadService = R, window.uppload_UpploadEffect = N, window.uppload_getElements = M, window.uppload_safeListen = T, window.uppload_fitImageToContainer = D, window.uppload_compressImage = U, window.uppload_canvasToBlob = H, window.uppload_cachedFetch = W, window.uppload_imageUrlToBlob = Y, window.uppload_flattenObject = E, window.uppload_setI18N = L, window.uppload_translate = C, window.uppload_en = { uploading: "Uploading...", uploaded: "Uploaded", fetching: "Getting your image from $1$...", poweredBy: "Powered by $1$", needHelp: "Need help?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "We got an error in fetching this file", unable_to_search: "We got an error in searching", invalid_service_url: "This is not $A$ $1$ URL", invalid_url: "This URL seems to be invalid", upload_aborted: "Your upload was cancelled", upload_error: "We got an error in uploading this file", file_type_not_allowed: "This file type is not allowed", file_too_large: "Your file should be smaller than $1$" }, help: { loading: "Loading help...", close: "Close help" }, services: { default: { heading: "Select an image" }, local: { title: "Choose file", button: "Select a file", or: "or", drop: "Drop files here" }, camera: { title: "Camera", button: "Click photo", switch: "Switch camera", waiting: "Waiting for permission...", unableToRead: "We're not able to read your camera's video. This may be because you didn't grant the required permission, or because your device doesn't support camera access." }, microlink: { button: "Import from $1$", label: "$1$ $2$ URL", placeholder: "Enter $A$ $1$ $2$ URL", type: "post" }, url: { title: "Direct URL", label: "Image URL", placeholder: "Enter an image URL" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "photo" }, ninegag: { title: "9GAG", type: "photo" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "Twitter", type: "image tweet" }, pinterest: { title: "Pinterest", type: "pin" }, flipboard: { title: "Flipboard", type: "article" }, fotki: { title: "Fotki", type: "photo" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "We Heart It" }, screenshot: { title: "Screenshot", button: "Take screenshot", label: "Webpage URL", placeholder: "Enter a webpage URL", loading: "Taking a screenshot..." }, search: { button: "Search on $1$", label: "Find an image", placeholder: "Search for something", imagesPoweredBy: "Images powered by $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "Preview" }, filters: { title: "Filters" }, crop: { title: "Crop", aspectRatios: { free: "Free", square: "Square" } }, rotate: { title: "Rotate" }, flip: { title: "Flip", buttons: { horizontal: "Horizontal", vertical: "Vertical" } }, sharpen: { title: "Sharpen" }, blur: { title: "Blur" }, brightness: { title: "Brightness" }, contrast: { title: "Contrast" }, grayscale: { title: "Grayscale" }, "hue-rotate": { title: "Hue rotate" }, invert: { title: "Invert" }, saturate: { title: "Saturate" }, sepia: { title: "Sepia" } }, helper: t => { for (; t.includes("$A$");) { const e = t.indexOf("$A$"); t.length > e + 3 && (t = ["a", "e", "i", "o", "u"].includes(t[e + 4].toLowerCase()) ? t.replace("$A$", "an") : t.replace("$A$", "a")) } return t } }, window.uppload_nl = { uploading: "Uploaden...", uploaded: "Geupload", fetching: "Afbeelding ophalen van $1$...", poweredBy: "Mede mogelijk gemaakt door $1$", needHelp: "Hulp nodig?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "Er is een fout opgetreden bij het ophalen van dit bestand", unable_to_search: "Er is een fout opgetreden bij het zoeken", invalid_service_url: "Dit is geen $1$-URL", invalid_url: "Deze URL is ongeldig", upload_aborted: "Je upload is geannuleerd", upload_error: "Er is een fout opgetreden bij het uploaden van dit bestand", file_type_not_allowed: "Dit bestandstype wordt niet ondersteund", file_too_large: "Het bestand moet kleiner zijn dan $1$" }, help: { loading: "Hulp bij het laden...", close: "Hulp sluiten" }, services: { default: { heading: "Selecteer een afbeelding" }, local: { title: "Kies een bestand", button: "Selecteer een bestand", or: "of", drop: "Sleep hier een bestand om te uploaden" }, camera: { title: "Camera", button: "Webcam foto", switch: "Switch camera", waiting: "Wachten op camera permissie...", unableToRead: "We kunnen de video van uw camera niet lezen. Dit kan zijn omdat u niet de vereiste toestemming hebt verleend of omdat uw apparaat geen cameratoegang ondersteunt." }, microlink: { button: "Importeer van $1$", label: "$1$ $2$ URL", placeholder: "Voer een $1$-$2$-URL in", type: "post" }, url: { title: "Directe URL", label: "Afbeeldings-URL", placeholder: "Voer een afbeeldings-URL in" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "foto" }, ninegag: { title: "9GAG", type: "foto" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "Twitter", type: "foto tweet" }, pinterest: { title: "Pinterest", type: "pin" }, flipboard: { title: "Flipboard", type: "artikel" }, fotki: { title: "Fotki", type: "foto" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "We Heart It" }, screenshot: { title: "Screenshot", button: "Screenshot maken", label: "URL van webpagina", placeholder: "Voer een URL in", loading: "Een screenshot maken..." }, search: { button: "Zoeken op $1$", label: "Zoek een afbeelding", placeholder: "Zoek naar iets", imagesPoweredBy: "Afbeeldingen mogelijk gemaakt door $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "Voorbeeld" }, filters: { title: "Filters" }, crop: { title: "Bijsnijden", aspectRatios: { free: "Free", square: "Plein" } }, rotate: { title: "Draaien" }, flip: { title: "Omdraaien", buttons: { horizontal: "Horizontaal", vertical: "Verticaal" } }, sharpen: { title: "Verscherpen" }, blur: { title: "Vervagen" }, brightness: { title: "Helderheid" }, contrast: { title: "Contrast" }, grayscale: { title: "Grijstinten" }, "hue-rotate": { title: "Tint roteren" }, invert: { title: "Omkeren" }, saturate: { title: "Verzadigen" }, sepia: { title: "Sepia" } } }, window.uppload_hi = { uploading: "अपलोड हो रहा है...", uploaded: "अपलोड हो गया", fetching: "हम आपकी तस्वीर $1$ से ला रहे हैं...", poweredBy: "$1$ द्वारा संचालित", needHelp: "मदद चाहिए?", units: { px: "पिक्सेल", "%": "प्रतिशत", deg: "डिग्री" }, errors: { response_not_ok: "आपकी फ़ाइल लाने में एक त्रुटि हुई", unable_to_search: "ढूंढे में एक त्रुटि हुई", invalid_service_url: "यह एक $1$ यूआरएल नहीं है", invalid_url: "यह यूआरएल गलत है", upload_aborted: "आपका अपलोड रद्द हो गया है", upload_error: "आपका अपलोड कारसे टूट एक त्रुटि हुई", file_type_not_allowed: "यह फाइल टाइप अनुमति नहीं हैं", file_too_large: "आपकी फाइल $1$ से छोटी होनी चाहिए" }, help: { loading: "मदद लोड हो रही है...", close: "मदद बंद करें" }, services: { default: { heading: "एक तस्वीर चुनें" }, local: { title: "एक फाइल चुनें", button: "फाइल चुनें", or: "या", drop: "यहां फाइल छोड़ें" }, camera: { title: "कैमरा", button: "तस्वीर खीचें", switch: "कैमरा बदलें", waiting: "अनुमति की प्रतीक्षा की जा रही है...", unableToRead: "हम आपका वीडियो नहीं पढ़ पा रहे हैं I यह इसीलिए हो सकता है क्यूंकि आपने अनुमति नहीं दी, या क्योंकि आपके युक्ति में कैमरा नहीं है I" }, microlink: { button: "$1$ से आयात", label: "$1$ $2$ यूआरएल", placeholder: "एक $1$ $2$ यूआरएल दर्ज करें", type: "पद" }, url: { title: "यूआरएल", label: "छवि यूआरएल", placeholder: "एक छवि यूआरएल दर्ज करें" }, instagram: { title: "इंस्टाग्राम" }, facebook: { title: "फेसबुक" }, flickr: { title: "फ़्लिकर", type: "तस्वीर" }, ninegag: { title: "नाइन गैग", type: "तस्वीर" }, deviantart: { title: "देवीअनत-आर्ट" }, artstation: { title: "आर्ट-स्टेशन" }, twitter: { title: "ट्विटर", type: "तस्वीर ट्वीट" }, pinterest: { title: "पिनटेरेस्ट", type: "पिन" }, flipboard: { title: "फ्लिपबोर्ड", type: "लेख" }, fotki: { title: "फोटकी", type: "तस्वीर" }, linkedin: { title: "लिंक्ड-इन" }, reddit: { title: "रेड्डिट" }, tumblr: { title: "तुमब्लर" }, weheartit: { title: "वी हार्ट इट" }, screenshot: { title: "स्क्रीनशॉट", button: "स्क्रीनशॉट लें", label: "वेब पृष्ठयूआरएल", placeholder: "एक वेब पृष्ठयूआरएल दर्ज करें", loading: "स्क्रीनशॉट लिया जा रहा है..." }, search: { button: "$1$ पर ढूंढें", label: "तस्वीर ढूंढें", placeholder: "कुछ ढूंढें", imagesPoweredBy: "तस्वीरें $1$ द्वारा संचालित" }, giphy: { title: "गिफी" }, unsplash: { title: "उनस्प्लैश" }, pixabay: { title: "पिक्साबे" }, pexels: { title: "पिक्सेल्स" } }, effects: { preview: { title: "पूर्वावलोकन" }, filters: { title: "फ़िल्टर" }, crop: { title: "क्रॉप", aspectRatios: { free: "फ़्री", square: "वर्ग" } }, rotate: { title: "घुमाएँ" }, flip: { title: "फ्लिप", buttons: { horizontal: "क्षैतिज", vertical: "खड़ा" } }, sharpen: { title: "पैना" }, blur: { title: "कलंक" }, brightness: { title: "चमक" }, contrast: { title: "कंट्रास्ट" }, grayscale: { title: "ग्रेस्केल" }, "hue-rotate": { title: "रंग घुमाना" }, invert: { title: "रंग पलटना" }, saturate: { title: "सैच्युरेट" }, sepia: { title: "सीपिया" } } }, window.uppload_es = { uploading: "Subir ...", uploaded: "Subido", fetching: "Obtener imagen de $1$ ...", poweredBy: "Hecho posible por $1$", needHelp: "Necesita ayuda?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "Se produjo un error al recuperar este archivo", unable_to_search: "Se produjo un error al buscar", invalid_service_url: "Esta no es una URL de $1$", invalid_url: "Esta URL no es válida.", upload_aborted: "Tu carga ha sido cancelada", upload_error: "Se produjo un error al cargar este archivo", file_type_not_allowed: "Este tipo de archivo no es compatible", file_too_large: "El archivo debe ser inferior a $1$" }, help: { loading: "Cargando ayuda...", close: "Ayuda cercana" }, services: { default: { heading: "Selecciona una imagen" }, local: { title: "Elige un archivo", button: "Selecciona un archivo", or: "de", drop: "Arrastra un archivo aquí para subir" }, camera: { title: "Cámara", button: "Foto de la webcam", switch: "Cambiar de cámara", waiting: "Esperando el permiso de la cámara ...", unableToRead: "No podemos leer el video de su cámara. Esto puede deberse a que no ha otorgado el permiso requerido o porque su dispositivo no admite el acceso a la cámara." }, microlink: { button: "Importar desde $1$", label: "$1$ $2$ URL", placeholder: "Ingrese una URL de $1$ $2$", type: "enviar" }, url: { title: "URL directa", label: "URL de la imagen", placeholder: "Ingrese una URL de imagen" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "una foto" }, ninegag: { title: "9GAG", type: "una foto" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "Gorjeo", type: "tweet de fotos" }, pinterest: { title: "Pinterest", type: "alfiler" }, flipboard: { title: "Flipboard", type: "artículo" }, fotki: { title: "fotos", type: "una foto" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "We Heart It" }, screenshot: { title: "Captura de pantalla", button: "Tomar captura de pantalla", label: "URL de la página web", placeholder: "Ingrese una URL", loading: "Toma una captura de pantalla ..." }, search: { button: "Buscar por $1$", label: "Busca una imagen", placeholder: "Buscar algo", imagesPoweredBy: "Imágenes posibles por $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "Ejemplo" }, filters: { title: "Filtros" }, crop: { title: "Recortar", aspectRatios: { free: "Gratis", square: "completo" } }, rotate: { title: "Girar" }, flip: { title: "Dar la vuelta", buttons: { horizontal: "Horizontal", vertical: "Vertical" } }, sharpen: { title: "Afilar" }, blur: { title: "Desenfoque" }, brightness: { title: "Brillo" }, contrast: { title: "Contraste" }, grayscale: { title: "Escala de grises" }, "hue-rotate": { title: "Girar tono" }, invert: { title: "Dar vuelta" }, saturate: { title: "Saturar" }, sepia: { title: "Sepia" } } }, window.uppload_fr = { uploading: "Télécharger ...", uploaded: "Téléchargé", fetching: "Obtenir une image à partir de $1$ ...", poweredBy: "Rendu possible par $1$", needHelp: "Besoin d'aide?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "Une erreur s'est produite lors de la récupération de ce fichier.", unable_to_search: "Une erreur est survenue lors de la recherche", invalid_service_url: "Ce n'est pas une URL $1$", invalid_url: "Cette URL est invalide", upload_aborted: "Votre téléchargement a été annulé", upload_error: "Une erreur s'est produite lors du téléchargement de ce fichier.", file_type_not_allowed: "Ce type de fichier n'est pas supporté", file_too_large: "Le fichier doit être inférieur à $1$" }, help: { loading: "Aide au chargement...", close: "Fermer l'aide" }, services: { default: { heading: "Sélectionnez une image" }, local: { title: "Choisissez un fichier", button: "Sélectionnez un fichier", or: "de", drop: "Faites glisser un fichier ici pour le télécharger" }, camera: { title: "Caméra", button: "Photo webcam", switch: "Changer de caméra", waiting: "En attente de la permission de la caméra ...", unableToRead: "Nous ne pouvons pas lire la vidéo à partir de votre caméra. Cela peut être dû au fait que vous n'avez pas accordé l'autorisation requise ou que votre appareil ne prend pas en charge l'accès à la caméra." }, microlink: { button: "Importation à partir de $1$", label: "$1$ $2$ URL", placeholder: "Entrez une URL $1$ $2$", type: "poster" }, url: { title: "Directe URL", label: "URL de l'image", placeholder: "Entrez une URL d'image" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "une photo" }, ninegag: { title: "9GAG", type: "une photo" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "Gazouillement", type: "photo tweet" }, pinterest: { title: "Pinterest", type: "épingle" }, flipboard: { title: "Flipboard", type: "article" }, fotki: { title: "Photos", type: "une photo" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "Nous avons le coeur" }, screenshot: { title: "Capture d'écran", button: "Prendre une capture d'écran", label: "URL de la page Web", placeholder: "Entrez une URL", loading: "Prenez une capture d'écran ..." }, search: { button: "Recherche de $1$", label: "Rechercher une image", placeholder: "Rechercher quelque chose", imagesPoweredBy: "Images rendues possibles par $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "Exemple" }, filters: { title: "Les filtres" }, crop: { title: "Récolte", aspectRatios: { free: "Libre", square: "Plein" } }, rotate: { title: "Tournant" }, flip: { title: "Faire demi-tour", buttons: { horizontal: "Horizontal", vertical: "Vertical" } }, sharpen: { title: "Netteté" }, blur: { title: "Flou" }, brightness: { title: "La luminosité" }, contrast: { title: "Contraste" }, grayscale: { title: "Niveaux de gris" }, "hue-rotate": { title: "Faire pivoter la teinte" }, invert: { title: "Retourner" }, saturate: { title: "Saturer" }, sepia: { title: "Sépia" } } }, window.uppload_it = { uploading: "Carica ...", uploaded: "caricato", fetching: "Ottieni immagine da $1$ ...", poweredBy: "Reso possibile da $1$", needHelp: "Hai bisogno di aiuto?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "Si è verificato un errore durante il recupero di questo file", unable_to_search: "Si è verificato un errore durante la ricerca", invalid_service_url: "Questo non è un $1$ URL", invalid_url: "Questo URL non è valido", upload_aborted: "Il tuo caricamento è stato annullato", upload_error: "Si è verificato un errore durante il caricamento di questo file", file_type_not_allowed: "Questo tipo di file non è supportato", file_too_large: "Il file deve essere inferiore a $1$" }, help: { loading: "Caricamento della guida...", close: "Aiuto vicino" }, services: { default: { heading: "Seleziona un'immagine" }, local: { title: "Scegli un file", button: "Seleziona un file", or: "di", drop: "Trascina qui un file per caricarlo" }, camera: { title: "telecamera", button: "Foto della webcam", switch: "Cambia fotocamera", waiting: "In attesa di autorizzazione della fotocamera ...", unableToRead: "Non possiamo leggere il video dalla tua fotocamera. Ciò può essere dovuto al fatto che non hai concesso l'autorizzazione richiesta o perché il tuo dispositivo non supporta l'accesso alla videocamera." }, microlink: { button: "Importa da $1$", label: "$1$ $2$ URL", placeholder: "Inserisci un URL da $1$ $2$", type: "inviare" }, url: { title: "URL diretto", label: "URL immagine", placeholder: "Inserisci un URL immagine" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "una foto" }, ninegag: { title: "9GAG", type: "una foto" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "cinguettio", type: "tweet fotografico" }, pinterest: { title: "Pinterest", type: "perno" }, flipboard: { title: "Flipboard", type: "articolo" }, fotki: { title: "foto", type: "una foto" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "We Heart It" }, screenshot: { title: "Immagine dello schermo", button: "Fai uno screenshot", label: "URL della pagina web", placeholder: "Inserisci un URL", loading: "Fai uno screenshot ..." }, search: { button: "Cerca $1$", label: "Cerca un'immagine", placeholder: "Cerca qualcosa", imagesPoweredBy: "Immagini rese possibili da $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "esempio" }, filters: { title: "filtri" }, crop: { title: "raccolto", aspectRatios: { free: "Gratuito", square: "pieno" } }, rotate: { title: "torcere" }, flip: { title: "Voltati", buttons: { horizontal: "orizzontale", vertical: "verticale" } }, sharpen: { title: "affinare" }, blur: { title: "dissolvenza" }, brightness: { title: "luminosità " }, contrast: { title: "Contrasto" }, grayscale: { title: "Scala di grigi" }, "hue-rotate": { title: "Ruota tonalità " }, invert: { title: "Girare" }, saturate: { title: "satiate" }, sepia: { title: "nero di seppia" } } }, window.uppload_ru = { uploading: "Загрузить ...", uploaded: "загруженное", fetching: "Получить изображение от $1$ ...", poweredBy: "Стало возможным за $1$", needHelp: "Нужна помощь?", units: { px: "ПВ", "%": "%", deg: "°" }, errors: { response_not_ok: "Произошла ошибка при получении этого файла", unable_to_search: "Произошла ошибка при поиске", invalid_service_url: "Это не URL $1$", invalid_url: "Этот URL недействителен", upload_aborted: "Ваша загрузка была отменена", upload_error: "Произошла ошибка при загрузке этого файла", file_type_not_allowed: "Этот тип файла не поддерживается", file_too_large: "Файл должен быть менее $1$" }, help: { loading: "Закрыть помощь...", close: "Загрузка справки" }, services: { default: { heading: "Выберите изображение" }, local: { title: "Выберите файл", button: "Выберите файл", or: "из", drop: "Перетащите файл сюда, чтобы загрузить" }, camera: { title: "камера", button: "Веб-камера фото", switch: "Переключить камеру", waiting: "Жду разрешения камеры ...", unableToRead: "Мы не можем прочитать видео с вашей камеры. Это может быть связано с тем, что вам не предоставлено необходимое разрешение, или потому что ваше устройство не поддерживает доступ к камере." }, microlink: { button: "Импорт от $1$", label: "URL $1$ $2$", placeholder: "Введите URL $1$ $2$", type: "после" }, url: { title: "Прямой URL", label: "URL изображения", placeholder: "Введите URL изображения" }, instagram: { title: "Instagram" }, facebook: { title: "facebook" }, flickr: { title: "Flickr", type: "фото" }, ninegag: { title: "9GAG", type: "фото" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "щебет", type: "фото твит" }, pinterest: { title: "Pinterest", type: "штырь" }, flipboard: { title: "Flipboard", type: "статья" }, fotki: { title: "фотографии", type: "фото" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "Мы слышали это" }, screenshot: { title: "Скриншот", button: "Сделать скриншот", label: "URL веб-страницы", placeholder: "Введите URL", loading: "Сделай скриншот ..." }, search: { button: "Искать $1$", label: "Поиск изображения", placeholder: "Искать что-то", imagesPoweredBy: "Изображения стали возможными за $1$" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "пример" }, filters: { title: "фильтры" }, crop: { title: "культура", aspectRatios: { free: "Свободный", square: "полный" } }, rotate: { title: "скрутить" }, flip: { title: "Повернись", buttons: { horizontal: "горизонтальный", vertical: "вертикальный" } }, sharpen: { title: "Резкость" }, blur: { title: "увядать" }, brightness: { title: "яркость" }, contrast: { title: "Контраст" }, grayscale: { title: "Оттенки серого" }, "hue-rotate": { title: "Повернуть оттенок" }, invert: { title: "Перевернуть" }, saturate: { title: "насыщать" }, sepia: { title: "Сепия" } } }, window.uppload_tr = { uploading: "Yükle ...", uploaded: "yüklenen", fetching: "$1$ 'dan resim al ...", poweredBy: "$1$ ile mümkün oldu", needHelp: "Yardıma mı ihtiyacınız var?", units: { px: "px", "%": "%", deg: "°" }, errors: { response_not_ok: "Bu dosya alınırken bir hata oluştu", unable_to_search: "Aranırken bir hata oluştu", invalid_service_url: "Bu bir $1$ URL değil", invalid_url: "Bu URL geçersiz", upload_aborted: "Yüklemeniz iptal edildi", upload_error: "Bu dosya yüklenirken bir hata oluştu", file_type_not_allowed: "Bu dosya türü desteklenmiyor", file_too_large: "Dosya $1$ 'dan az olmalı" }, help: { loading: "Yardım yükleniyor...", close: "Yardımı kapat" }, services: { default: { heading: "Bir resim seç" }, local: { title: "Bir dosya seç", button: "Bir dosya seç", or: "arasında", drop: "Yüklemek için bir dosyayı buraya sürükleyin" }, camera: { title: "Kamera", button: "Webcam fotoğraf", switch: "Kamera değiştir", waiting: "Kamera izni bekleniyor ...", unableToRead: "Videoyu kameranızdan okuyamıyoruz. Bunun nedeni gerekli izni vermediğiniz veya cihazınızın kamera erişimini desteklememesi olabilir." }, microlink: { button: "1 $ 'dan içe aktar", label: "$1$ $2$ URL", placeholder: "Bir $1$ $2$ URL girin", type: "posta" }, url: { title: "Doğrudan URL", label: "Image URL", placeholder: "Bir resim URL’si girin" }, instagram: { title: "Instagram" }, facebook: { title: "Facebook" }, flickr: { title: "Flickr", type: "bir fotoğraf" }, ninegag: { title: "9gag", type: "bir fotoğraf" }, deviantart: { title: "DeviantArt" }, artstation: { title: "ArtStation" }, twitter: { title: "heyecan", type: "fotoğraf tweet" }, pinterest: { title: "pinterest", type: "toplu iğne" }, flipboard: { title: "Flipboard", type: "makale" }, fotki: { title: "Resimler", type: "bir fotoğraf" }, linkedin: { title: "LinkedIn" }, reddit: { title: "Reddit" }, tumblr: { title: "Tumblr" }, weheartit: { title: "Biz kalp" }, screenshot: { title: "Ekran görüntüsü", button: "Ekran görüntüsü al", label: "Web sayfasının URL'si", placeholder: "Bir URL girin", loading: "Ekran görüntüsü al ..." }, search: { button: "$1$ için ara", label: "Bir resim arayın", placeholder: "Bir şey arayın", imagesPoweredBy: "Görüntüler $1$ 'a kadar mümkün kılındı" }, giphy: { title: "GIPHY" }, unsplash: { title: "Unsplash" }, pixabay: { title: "Pixabay" }, pexels: { title: "Pexels" } }, effects: { preview: { title: "örnek" }, filters: { title: "Filtreler" }, crop: { title: "ekin", aspectRatios: { free: "Ücretsiz", square: "tam" } }, rotate: { title: "büküm" }, flip: { title: "Arkanı dön", buttons: { horizontal: "yatay", vertical: "dikey" } }, sharpen: { title: "keskinleştirme" }, blur: { title: "karartmak" }, brightness: { title: "parlaklık" }, contrast: { title: "Kontrast" }, grayscale: { title: "Gri tonlama" }, "hue-rotate": { title: "Tonu döndür" }, invert: { title: "Ters çevir" }, saturate: { title: "doyurmak" }, sepia: { title: "Sepya" } } }, window.uppload_xhrUploader = ({ endpoint: t, fileKeyName: e = "file", method: i = "POST", responseKey: a = "url", responseFunction: n, settingsFunction: r }) => (o, s) => new Promise((l, c) => { const h = new FormData; h.append(e, o); const p = new XMLHttpRequest; p.open(i, t, !0), "function" == typeof r && r(p), p.addEventListener("progress", t => { "function" == typeof s && s(t.loaded / t.total) }), p.addEventListener("load", () => { const t = p.responseText; if ("function" == typeof n) return l(n(t)); const e = JSON.parse(t); return l(e[a]) }), p.addEventListener("error", () => c("errors.response_not_ok")), p.addEventListener("abort", () => c("errors.upload_aborted")), p.send(h) }), window.uppload_fetchUploader = ({ endpoint: t, settingsFunction: e, method: i = "POST", fileKeyName: a = "file", responseKey: n = "url", responseFunction: r }) => o => new Promise((s, l) => { const c = new FormData; c.append(a, o), window.fetch(t, e ? e(o) : { method: i, body: c }).then(t => { if (!t.ok) throw new Error("errors.response_not_ok"); return t.json() }).then(t => s("function" == typeof r ? r(t) : t[n])).catch(() => l("errors.response_not_ok")) }), window.uppload_Camera = class extends R { constructor() { super(...arguments), this.name = "camera", this.icon = '', this.color = "#16a085", this.canvas = document.createElement("canvas"), this.gotError = !1, this.waiting = !1, this.frontCamera = !1, this.supports = () => !(!window.navigator.mediaDevices || !window.navigator.mediaDevices.enumerateDevices || /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)), this.template = ({ translate: t }) => `\n
      \n
      ${t("services.camera.waiting")}
      \n
      \n

      ${t("services.camera.unableToRead")}

      \n

      ${t("needHelp")}

      \n
      \n
      \n \n
      \n
      \n
      \n \x3c!--${t("services.camera.switch")}--\x3e\n ${t("services.camera.button")}\n
      \n \n `, this.stop = () => { this.stream && this.stream.getTracks().forEach(t => t.stop()) }, this.handlers = t => { this.waiting = !0, this.update(t); this.startStream(t, { audio: !1, video: { width: 1280, height: 1280 } }); const e = t.uppload.container.querySelector(".camera-click"); e && T(e, "click", this.clickPhoto.bind(this, t)); const i = t.uppload.container.querySelector(".camera-click"); i && T(i, "click", this.switchCamera.bind(this, t)); const a = t.uppload.container.querySelector(".need-help-link"); a && T(a, "click", () => t.showHelp("/services/camera")) } } update(t) { const e = t.uppload.container.querySelector(".camera-waiting"); e && (e.style.display = "none", e.style.opacity = "0"); const i = t.uppload.container.querySelector(".camera-error"); i && (i.style.display = "none", i.style.opacity = "0"); const a = t.uppload.container.querySelector(".camera-success"); a && (a.style.display = "none", a.style.opacity = "0"); const n = t.uppload.container.querySelector(".service-footer"); n && (n.style.display = "none", n.style.opacity = "0"), this.gotError ? i && (i.style.display = "", i.style.opacity = "1") : this.waiting ? e && (e.style.display = "", e.style.opacity = "1") : (a && (a.style.display = "", a.style.opacity = "1"), n && (n.style.display = "", n.style.opacity = "1")) } switchCamera(t) { this.frontCamera = !this.frontCamera; const e = { audio: !1, video: { width: 1280, height: 1280, facingMode: this.frontCamera ? "user" : "environment" } }; this.startStream(t, e) } clickPhoto(t) { this.canvas = document.createElement("canvas"); const e = t.uppload.container.querySelector("video.camera-stream"); if (!e) return; if (!this.stream) return; const i = e.getBoundingClientRect(); let a = i.width, n = i.height; this.stream.getTracks().forEach(t => { const e = t.getSettings(); e.width && (a = e.width), e.height && (n = e.height) }), this.canvas.width = a, this.canvas.height = n; const r = this.canvas.getContext("2d"); r && (r.clearRect(0, 0, this.canvas.width, this.canvas.height), r.drawImage(e, 0, 0, a, n), H(this.canvas).then(e => t.next(e))) } startStream(t, e) { this.stop(), window.navigator.mediaDevices.getUserMedia(e).then(e => { this.stream = e; const i = t.uppload.container.querySelector("video.camera-stream"); i && (i.srcObject = e, T(i, "loadedmetadata", () => i.play()), D(t, i)) }).catch(() => { this.gotError = !0 }).then(() => { this.waiting = !1, this.update(t) }) } }, window.uppload_Instagram = class extends V { constructor() { super(...arguments), this.name = "instagram", this.icon = '', this.color = "#cc3366", this.exampleURL = "https://www.instagram.com/p/Bu_T4RihQFB/", this.validator = t => /(https?:\/\/(.+?\.)?(instagram|instagr)\.(com|am)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Facebook = class extends V { constructor() { super(...arguments), this.name = "facebook", this.icon = '', this.color = "#1b69f6", this.exampleURL = "https://www.facebook.com/elninotech/photos/a.2066268863489861/2066268886823192/?type=3&theater", this.validator = t => /(https?:\/\/(.+?\.)?(facebook|fb)\.(com|me)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Pixabay = class extends X { constructor(t) { super({ apiKey: t, name: "pixabay", icon: '', color: "#2ec66d", poweredByUrl: "https://pixabay.com", popularEndpoint: t => `https://pixabay.com/api/?key=${t}&per_page=18&image_type=photo`, searchEndpoint: (t, e) => `https://pixabay.com/api/?key=${t}&per_page=18&q=${encodeURIComponent(e)}&image_type=photo`, getButton: t => `
      \n \n \n ${t.user}\n
      `, getSearchResults: t => t.hits, getPopularResults: t => t.hits }) } }, window.uppload_Local = class extends R { constructor({ mimeTypes: t, maxFileSize: e } = {}) { super(), this.name = "local", this.icon = '', this.color = "#34495e", this.mimeTypes = ["image/gif", "image/jpeg", "image/jpg", "image/png"], this.maxFileSize = 1 / 0, this.template = t => `
      \n
      ${t.translate("services.local.drop")}
      \n ${t.translate("services.local.or")}\n \n
      \n
      \n
      `, this.handlers = t => { const e = t.uppload.container.querySelector(".drop-area"); e && (T(e, "drop", e => this.dropHandler(t, e)), T(e, "dragover", e => this.dragHandler(t, e)), T(e, "dragend", e => this.dragStop(t, e)), T(e, "dragexit", e => this.dragStop(t, e)), T(e, "dragleave", e => this.dragStop(t, e)), T(e, "click", e => this.fileSelect(t, e))); const i = t.uppload.container.querySelector(".alternate-input input[type=file]"); i && T(i, "change", e => this.getFile(t, e)); const a = t.uppload.container.querySelector(".need-help-link"); a && T(a, "click", () => t.showHelp("/services/local")) }, t && (this.mimeTypes = t), e && (this.maxFileSize = e) } getFile(t, e) { e.preventDefault(); const i = e.target.files; let a = null; if (i) { if (t.uppload.settings.multiple && i.length > 1) return t.uploadMultiple(Array.from(i)); for (let e = 0; e < i.length; e++) { const n = i[e]; this.mimeTypes.includes(n.type) && (n.size < this.maxFileSize ? a = n : t.handle(new Error(t.translate("errors.file_too_large", `${this.maxFileSize} bytes`)))) } } a && a && t.next(a) } fileSelect(t, e) { const i = t.uppload.container.querySelector(".alternate-input input[type=file]"); i && i.click() } dragStop(t, e) { const i = t.uppload.container.querySelector(".drop-area"); i && i.classList.remove("drop-area-active") } dragHandler(t, e) { e.preventDefault(); const i = t.uppload.container.querySelector(".drop-area"); i && i.classList.add("drop-area-active") } dropHandler(t, e) { e.preventDefault(), this.dragStop(t, e); let i = null; if (e.dataTransfer && e.dataTransfer.items) for (let a = 0; a < e.dataTransfer.items.length; a++) { const n = e.dataTransfer.items[a]; "file" === n.kind && this.mimeTypes.includes(n.type) && (i = n.getAsFile(), (!i || i.size > this.maxFileSize) && (i = null, t.handle(new Error(t.translate("errors.file_too_large", `${this.maxFileSize} bytes`))))) } i && i && t.next(i) } }, window.uppload_URL = class extends V { constructor() { super(...arguments), this.name = "url", this.icon = '', this.color = "#8e44ad" } }, window.uppload_Screenshot = class extends V { constructor() { super(...arguments), this.name = "screenshot", this.icon = '', this.color = "#e67e22" } }, window.uppload_GIPHY = class extends X { constructor(t) { super({ apiKey: t, name: "giphy", icon: '', color: "#a800ff", noRecolor: !0, poweredByUrl: "https://giphy.com", popularEndpoint: t => `https://api.giphy.com/v1/gifs/trending?api_key=${t}&limit=18&rating=G`, searchEndpoint: (t, e) => `https://api.giphy.com/v1/gifs/search?api_key=${t}&q=${encodeURIComponent(e)}&limit=18&offset=0&rating=G&lang=en`, getButton: t => `
      \n
      `, getSearchResults: t => t.data, getPopularResults: t => t.data }) } }, window.uppload_Unsplash = class extends X { constructor(t) { super({ apiKey: t, name: "unsplash", icon: '', color: "#333", poweredByUrl: "https://unsplash.com", popularEndpoint: t => `https://api.unsplash.com/photos?client_id=${t}`, searchEndpoint: (t, e) => `https://api.unsplash.com/search/photos?client_id=${this.apiKey}&page=1&query=${encodeURIComponent(e)}`, getButton: t => `
      \n \n \n \n ${t.user.name}\n \n
      `, getSearchResults: t => t.results, getPopularResults: t => t }) } }, window.uppload_Pexels = class extends X { constructor(t) { super({ apiKey: t, name: "pexels", icon: '', color: "#05a081", poweredByUrl: "https://pexels.com", popularEndpoint: t => "https://api.pexels.com/v1/curated?per_page=9&page=1", searchEndpoint: (t, e) => `https://api.pexels.com/v1/search?query=${encodeURIComponent(e)}&per_page=12&page=1`, getButton: t => `
      \n \n ${t.photographer}\n
      `, getSearchResults: t => t.photos, getPopularResults: t => t.photos, fetchSettings: t => ({ headers: { Authorization: t } }) }) } }, window.uppload_Pinterest = class extends V { constructor() { super(...arguments), this.name = "pinterest", this.icon = '', this.color = "#e60023", this.exampleURL = "https://pinterest.com/pin/437201076327078006/", this.validator = t => /(https?:\/\/(.+?\.)?(pinterest|pin)\.(com|it)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Flickr = class extends V { constructor() { super(...arguments), this.name = "flickr", this.icon = '', this.noRecolor = !0, this.color = "#ff0084", this.exampleURL = "https://www.flickr.com/photos/renewolf/26111951000/", this.validator = t => /(https?:\/\/(.+?\.)?(flickr|flic)\.(com|kr)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_NineGag = class extends V { constructor() { super(...arguments), this.name = "ninegag", this.icon = '', this.color = "#000", this.exampleURL = "https://9gag.com/gag/awoBXb8", this.validator = t => /(https?:\/\/(.+?\.)?9gag\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_DeviantArt = class extends V { constructor() { super(...arguments), this.name = "deviantart", this.icon = '', this.color = "#00d159", this.exampleURL = "https://www.deviantart.com/artbycatherineradley/art/Despair-820869682", this.validator = t => /(https?:\/\/(.+?\.)?(deviantart|fav)\.(com|me)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_ArtStation = class extends V { constructor() { super(...arguments), this.name = "artstation", this.icon = '', this.color = "#3ea2cf", this.exampleURL = "https://www.artstation.com/artwork/VdGOkZ", this.validator = t => /(https?:\/\/(.+?\.)?artstation\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Twitter = class extends V { constructor() { super(...arguments), this.name = "twitter", this.icon = '', this.color = "#1da1f2", this.exampleURL = "https://twitter.com/elninoict/status/1106176415622418433", this.validator = t => /(https?:\/\/(.+?\.)?(twitter|t)\.(co|com)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Flipboard = class extends V { constructor() { super(...arguments), this.name = "flipboard", this.icon = '', this.color = "#e12828", this.exampleURL = "https://flipboard.com/@bbcfuture/how-climate-change-could-kill-the-red-apple/f-c8d499b4ca%2Fbbc.com", this.validator = t => /(https?:\/\/(.+?\.)?(flipboard|flip)\.(com|it)(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Fotki = class extends V { constructor() { super(...arguments), this.name = "fotki", this.icon = '', this.color = "#5471B9", this.exampleURL = "https://public.fotki.com/EricAnke/holland/molens/20170928-162510.html", this.validator = t => /(https?:\/\/(.+?\.)?fotki\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_LinkedIn = class extends V { constructor() { super(...arguments), this.name = "linkedin", this.icon = '', this.color = "#0e76a8", this.exampleURL = "https://www.linkedin.com/posts/explorius-vastgoedontwikkeling-b-v-_el-nino-huurt-kantoor-in-enschede-activity-6480386878641180672-7DC_", this.validator = t => /(https?:\/\/(.+?\.)?linkedin\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Reddit = class extends V { constructor() { super(...arguments), this.name = "reddit", this.icon = '', this.color = "#ff4301", this.exampleURL = "https://www.reddit.com/r/thenetherlands/comments/dz1myk/a_beautiful_morning_in_ermelo/", this.validator = t => /(https?:\/\/(.+?\.)?reddit\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Tumblr = class extends V { constructor() { super(...arguments), this.name = "tumblr", this.icon = '', this.color = "#34526f", this.exampleURL = "https://germanpostwarmodern.tumblr.com/post/186653088149/cubicus-building-of-twente-university-1969-73-in", this.validator = t => /(https?:\/\/(.+?\.)?tumblr\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_WeHeartIt = class extends V { constructor() { super(...arguments), this.name = "weheartit", this.icon = '', this.color = "#ff5464", this.exampleURL = "https://weheartit.com/entry/221671573", this.validator = t => /(https?:\/\/(.+?\.)?weheartit\.com(\/[A-Za-z0-9\-\._~:\/\?#\[\]@!$&'\(\)\*\+,;\=]*)?)/.test(t) } }, window.uppload_Brightness = class extends Z { constructor() { super(...arguments), this.name = "brightness", this.icon = '', this.cssFilter = "brightness", this.unit = "%", this.value = 100, this.max = 200 } }, window.uppload_Crop = class extends N { constructor({ aspectRatio: t, aspectRatioOptions: e, hideAspectRatioSettings: i, autoCropArea: a, viewMode: n } = {}) { super(), this.name = "crop", this.icon = '', this.aspectRatio = NaN, this.hideAspectRatioSettings = !1, this.aspectRatioOptions = { free: NaN, square: 1, "16:9": 16 / 9 }, this.autoCropArea = 1, this.viewMode = 1, this.template = ({ file: t, translate: e }) => `\n
      \n \n
      \n ${this.aspectRatio || this.hideAspectRatioSettings ? "" : `
      \n ${Object.keys(this.aspectRatioOptions).map((t, i) => `\n \n `).join("")}\n
      `}\n `, this.handlers = t => { const e = t.uppload.container.querySelector(".uppload-cropping-element img"); e && D(t, e).then(() => { const i = new K.a(e, { aspectRatio: this.aspectRatio, autoCropArea: this.autoCropArea, viewMode: this.viewMode, ready() { H(i.getCroppedCanvas()).then(e => t.next(e)) }, cropend() { H(i.getCroppedCanvas()).then(e => t.next(e)) } }); t.uppload.container.querySelectorAll("input[name='crop-aspect-ratio']").forEach(e => { T(e, "change", () => { const e = t.uppload.container.querySelector("input[name='crop-aspect-ratio']:checked"); e && (i.setAspectRatio(this.aspectRatioOptions[e.getAttribute("data-name") || "free"]), H(i.getCroppedCanvas()).then(e => t.next(e))) }) }) }) }, t && (this.aspectRatio = t), e && (this.aspectRatioOptions = e), a && (this.autoCropArea = a), n && (this.viewMode = n), i && (this.hideAspectRatioSettings = i) } }, window.uppload_Rotate = class extends N { constructor() { super(...arguments), this.name = "rotate", this.icon = '', this.value = 0, this.max = 360, this.unit = "deg", this.template = ({ file: t, translate: e }) => `\n
      \n \n
      \n
      \n \n 0${e(`units.${this.unit}`) || this.unit}\n
      \n `, this.handlers = t => { const e = t.uppload.container.querySelector(".uppload-rotating-element img"); e && D(t, e).then(() => { const i = new K.a(e, { autoCropArea: 1, viewMode: 1, dragMode: "none", cropBoxMovable: !1, cropBoxResizable: !1, toggleDragModeOnDblclick: !1, ready() { H(i.getCroppedCanvas()).then(e => t.next(e)) } }), a = t.uppload.container.querySelector(".settings input[type='range']"); a && T(a, "change", () => { let e = 0; const a = t.uppload.container.querySelector(".settings input[type='range']"); a && (e = parseInt(a.value)); const n = t.uppload.container.querySelector(".settings .value span"); n && (n.innerHTML = e.toString()), i.rotate(e - this.value), this.value = e, H(i.getCroppedCanvas()).then(e => t.next(e)) }) }) } } }, window.uppload_Flip = class extends N { constructor() { super(...arguments), this.name = "flip", this.originalfileURL = "", this.icon = '', this.canvas = document.createElement("canvas"), this.template = ({ file: t, translate: e }) => { const i = URL.createObjectURL(t); return this.originalfileURL = i, `\n
      \n \n
      \n
      \n \n \n
      \n ` }, this.handlers = t => { const e = t.uppload.container.querySelector(".uppload-flip img"); e && D(t, e).then(() => { const e = t.uppload.container.querySelector(".settings button.flip-btn-horizontal"); e && T(e, "click", this.update.bind(this, t, !0, !1)); const i = t.uppload.container.querySelector(".settings button.flip-btn-vertical"); i && T(i, "click", this.update.bind(this, t, !1, !0)) }) } } imageToCanvasBlob(t = !1, e = !1) { return new Promise(i => { const a = t ? -1 : 1, n = e ? -1 : 1; this.canvas = document.createElement("canvas"); const r = document.createElement("img"); r.src = this.originalfileURL, r.onload = () => { this.canvas.width = r.width, this.canvas.height = r.height; const o = t ? -1 * r.width : 0, s = e ? -1 * r.height : 0, l = this.canvas.getContext("2d"); l && (l.clearRect(0, 0, this.canvas.width, this.canvas.height), l.scale(a, n), l.drawImage(r, o, s), H(this.canvas).then(t => { const e = URL.createObjectURL(t); this.originalfileURL = e, i(t) })) } }) } update(t, e, i) { const a = t.uppload.container.querySelector(".uppload-flip img"); a && this.imageToCanvasBlob(e, i).then(e => { if (!e) return; t.next(e); const i = URL.createObjectURL(e); a.setAttribute("src", i) }) } }, window.uppload_Preview = class extends N { constructor() { super(...arguments), this.name = "preview", this.icon = '', this.template = ({ file: t }) => `\n
      \n \n
      \n `, this.handlers = t => { const e = t.uppload.container.querySelector(".uppload-preview-element img"); e && D(t, e) } } }, window.uppload_Blur = class extends Z { constructor() { super(...arguments), this.name = "blur", this.icon = '', this.cssFilter = "blur", this.unit = "px" } }, window.uppload_Contrast = class extends Z { constructor() { super(...arguments), this.name = "contrast", this.icon = '', this.cssFilter = "contrast", this.unit = "%", this.value = 100, this.max = 200 } }, window.uppload_Grayscale = class extends Z { constructor() { super(...arguments), this.name = "grayscale", this.icon = '', this.cssFilter = "grayscale", this.unit = "%", this.value = 0, this.max = 100 } }, window.uppload_HueRotate = class extends Z { constructor() { super(...arguments), this.name = "hue-rotate", this.icon = '', this.cssFilter = "hue-rotate", this.unit = "deg", this.value = 0, this.max = 360 } }, window.uppload_Invert = class extends Z { constructor() { super(...arguments), this.name = "invert", this.icon = '', this.cssFilter = "invert", this.unit = "%", this.value = 0, this.max = 100 } }, window.uppload_Sepia = class extends Z { constructor() { super(...arguments), this.name = "sepia", this.icon = '', this.cssFilter = "sepia", this.unit = "%", this.value = 0, this.max = 100 } }, window.uppload_Saturate = class extends Z { constructor() { super(...arguments), this.name = "saturate", this.icon = '', this.cssFilter = "saturate", this.unit = "%", this.value = 100, this.max = 200 } } }]); /************************* * Croppie * Copyright 2019 * Foliotek * Version: 2.6.5 *************************/ !function (e, t) { "function" == typeof define && define.amd ? define(t) : "object" == typeof exports && "string" != typeof exports.nodeName ? module.exports = t() : e.Croppie = t() }("undefined" != typeof self ? self : this, function () { "function" != typeof Promise && function (e) { function n(e, t) { return function () { e.apply(t, arguments) } } function r(e) { if ("object" != typeof this) throw new TypeError("Promises must be constructed via new"); if ("function" != typeof e) throw new TypeError("not a function"); this._state = null, this._value = null, this._deferreds = [], u(e, n(i, this), n(o, this)) } function a(n) { var i = this; return null === this._state ? void this._deferreds.push(n) : void c(function () { var e = i._state ? n.onFulfilled : n.onRejected; if (null !== e) { var t; try { t = e(i._value) } catch (e) { return void n.reject(e) } n.resolve(t) } else (i._state ? n.resolve : n.reject)(i._value) }) } function i(e) { try { if (e === this) throw new TypeError("A promise cannot be resolved with itself."); if (e && ("object" == typeof e || "function" == typeof e)) { var t = e.then; if ("function" == typeof t) return void u(n(t, e), n(i, this), n(o, this)) } this._state = !0, this._value = e, s.call(this) } catch (e) { o.call(this, e) } } function o(e) { this._state = !1, this._value = e, s.call(this) } function s() { for (var e = 0, t = this._deferreds.length; e < t; e++)a.call(this, this._deferreds[e]); this._deferreds = null } function l(e, t, n, i) { this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.resolve = n, this.reject = i } function u(e, t, n) { var i = !1; try { e(function (e) { i || (i = !0, t(e)) }, function (e) { i || (i = !0, n(e)) }) } catch (e) { if (i) return; i = !0, n(e) } } var t = setTimeout, c = "function" == typeof setImmediate && setImmediate || function (e) { t(e, 1) }, h = Array.isArray || function (e) { return "[object Array]" === Object.prototype.toString.call(e) }; r.prototype.catch = function (e) { return this.then(null, e) }, r.prototype.then = function (n, i) { var o = this; return new r(function (e, t) { a.call(o, new l(n, i, e, t)) }) }, r.all = function () { var s = Array.prototype.slice.call(1 === arguments.length && h(arguments[0]) ? arguments[0] : arguments); return new r(function (i, o) { function r(t, e) { try { if (e && ("object" == typeof e || "function" == typeof e)) { var n = e.then; if ("function" == typeof n) return void n.call(e, function (e) { r(t, e) }, o) } s[t] = e, 0 == --a && i(s) } catch (e) { o(e) } } if (0 === s.length) return i([]); for (var a = s.length, e = 0; e < s.length; e++)r(e, s[e]) }) }, r.resolve = function (t) { return t && "object" == typeof t && t.constructor === r ? t : new r(function (e) { e(t) }) }, r.reject = function (n) { return new r(function (e, t) { t(n) }) }, r.race = function (o) { return new r(function (e, t) { for (var n = 0, i = o.length; n < i; n++)o[n].then(e, t) }) }, r._setImmediateFn = function (e) { c = e }, "undefined" != typeof module && module.exports ? module.exports = r : e.Promise || (e.Promise = r) }(this), "function" != typeof window.CustomEvent && function () { function e(e, t) { t = t || { bubbles: !1, cancelable: !1, detail: void 0 }; var n = document.createEvent("CustomEvent"); return n.initCustomEvent(e, t.bubbles, t.cancelable, t.detail), n } e.prototype = window.Event.prototype, window.CustomEvent = e }(), HTMLCanvasElement.prototype.toBlob || Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", { value: function (e, t, n) { for (var i = atob(this.toDataURL(t, n).split(",")[1]), o = i.length, r = new Uint8Array(o), a = 0; a < o; a++)r[a] = i.charCodeAt(a); e(new Blob([r], { type: t || "image/png" })) } }); var v, g, w, i = ["Webkit", "Moz", "ms"], o = document.createElement("div").style, l = [1, 8, 3, 6], u = [2, 7, 4, 5]; function e(e) { if (e in o) return e; for (var t = e[0].toUpperCase() + e.slice(1), n = i.length; n--;)if ((e = i[n] + t) in o) return e } function p(e, t) { for (var n in e = e || {}, t) t[n] && t[n].constructor && t[n].constructor === Object ? (e[n] = e[n] || {}, p(e[n], t[n])) : e[n] = t[n]; return e } function d(e) { return p({}, e) } function y(e) { if ("createEvent" in document) { var t = document.createEvent("HTMLEvents"); t.initEvent("change", !1, !0), e.dispatchEvent(t) } else e.fireEvent("onchange") } function b(e, t, n) { if ("string" == typeof t) { var i = t; (t = {})[i] = n } for (var o in t) e.style[o] = t[o] } function x(e, t) { e.classList ? e.classList.add(t) : e.className += " " + t } function c(e, t) { for (var n in t) e.setAttribute(n, t[n]) } function C(e) { return parseInt(e, 10) } function m(e, t) { var n = e.naturalWidth, i = e.naturalHeight, o = t || f(e); if (o && 5 <= o) { var r = n; n = i, i = r } return { width: n, height: i } } g = e("transform"), v = e("transformOrigin"), w = e("userSelect"); var t = { translate3d: { suffix: ", 0px" }, translate: { suffix: "" } }, E = function (e, t, n) { this.x = parseFloat(e), this.y = parseFloat(t), this.scale = parseFloat(n) }; E.parse = function (e) { return e.style ? E.parse(e.style[g]) : -1 < e.indexOf("matrix") || -1 < e.indexOf("none") ? E.fromMatrix(e) : E.fromString(e) }, E.fromMatrix = function (e) { var t = e.substring(7).split(","); return t.length && "none" !== e || (t = [1, 0, 0, 1, 0, 0]), new E(C(t[4]), C(t[5]), parseFloat(t[0])) }, E.fromString = function (e) { var t = e.split(") "), n = t[0].substring(T.globals.translate.length + 1).split(","), i = 1 < t.length ? t[1].substring(6) : 1, o = 1 < n.length ? n[0] : 0, r = 1 < n.length ? n[1] : 0; return new E(o, r, i) }, E.prototype.toString = function () { var e = t[T.globals.translate].suffix || ""; return T.globals.translate + "(" + this.x + "px, " + this.y + "px" + e + ") scale(" + this.scale + ")" }; var L = function (e) { if (!e || !e.style[v]) return this.x = 0, void (this.y = 0); var t = e.style[v].split(" "); this.x = parseFloat(t[0]), this.y = parseFloat(t[1]) }; function f(e) { return e.exifdata && e.exifdata.Orientation ? C(e.exifdata.Orientation) : 1 } function _(e, t, n) { var i = t.width, o = t.height, r = e.getContext("2d"); switch (e.width = t.width, e.height = t.height, r.save(), n) { case 2: r.translate(i, 0), r.scale(-1, 1); break; case 3: r.translate(i, o), r.rotate(180 * Math.PI / 180); break; case 4: r.translate(0, o), r.scale(1, -1); break; case 5: e.width = o, e.height = i, r.rotate(90 * Math.PI / 180), r.scale(1, -1); break; case 6: e.width = o, e.height = i, r.rotate(90 * Math.PI / 180), r.translate(0, -o); break; case 7: e.width = o, e.height = i, r.rotate(-90 * Math.PI / 180), r.translate(-i, o), r.scale(1, -1); break; case 8: e.width = o, e.height = i, r.translate(0, i), r.rotate(-90 * Math.PI / 180) }r.drawImage(t, 0, 0, i, o), r.restore() } function r() { var e, t, n, i, o, r, a = this, s = a.options.viewport.type ? "cr-vp-" + a.options.viewport.type : null; a.options.useCanvas = a.options.enableOrientation || R.call(a), a.data = {}, a.elements = {}, e = a.elements.boundary = document.createElement("div"), n = a.elements.viewport = document.createElement("div"), t = a.elements.img = document.createElement("img"), i = a.elements.overlay = document.createElement("div"), a.options.useCanvas ? (a.elements.canvas = document.createElement("canvas"), a.elements.preview = a.elements.canvas) : a.elements.preview = t, x(e, "cr-boundary"), e.setAttribute("aria-dropeffect", "none"), o = a.options.boundary.width, r = a.options.boundary.height, b(e, { width: o + (isNaN(o) ? "" : "px"), height: r + (isNaN(r) ? "" : "px") }), x(n, "cr-viewport"), s && x(n, s), b(n, { width: a.options.viewport.width + "px", height: a.options.viewport.height + "px" }), n.setAttribute("tabindex", 0), x(a.elements.preview, "cr-image"), c(a.elements.preview, { alt: "preview", "aria-grabbed": "false" }), x(i, "cr-overlay"), a.element.appendChild(e), e.appendChild(a.elements.preview), e.appendChild(n), e.appendChild(i), x(a.element, "croppie-container"), a.options.customClass && x(a.element, a.options.customClass), function () { var h, p, d, l, m, f = this, n = !1; function v(e, t) { var n = f.elements.preview.getBoundingClientRect(), i = m.y + t, o = m.x + e; f.options.enforceBoundary ? (l.top > n.top + t && l.bottom < n.bottom + t && (m.y = i), l.left > n.left + e && l.right < n.right + e && (m.x = o)) : (m.y = i, m.x = o) } function i(e) { f.elements.preview.setAttribute("aria-grabbed", e), f.elements.boundary.setAttribute("aria-dropeffect", e ? "move" : "none") } function e(e) { if ((void 0 === e.button || 0 === e.button) && (e.preventDefault(), !n)) { if (n = !0, h = e.pageX, p = e.pageY, e.touches) { var t = e.touches[0]; h = t.pageX, p = t.pageY } i(n), m = E.parse(f.elements.preview), window.addEventListener("mousemove", o), window.addEventListener("touchmove", o), window.addEventListener("mouseup", r), window.addEventListener("touchend", r), document.body.style[w] = "none", l = f.elements.viewport.getBoundingClientRect() } } function o(e) { e.preventDefault(); var t = e.pageX, n = e.pageY; if (e.touches) { var i = e.touches[0]; t = i.pageX, n = i.pageY } var o = t - h, r = n - p, a = {}; if ("touchmove" === e.type && 1 < e.touches.length) { var s = e.touches[0], l = e.touches[1], u = Math.sqrt((s.pageX - l.pageX) * (s.pageX - l.pageX) + (s.pageY - l.pageY) * (s.pageY - l.pageY)); d || (d = u / f._currentZoom); var c = u / d; return B.call(f, c), void y(f.elements.zoomer) } v(o, r), a[g] = m.toString(), b(f.elements.preview, a), z.call(f), p = n, h = t } function r() { i(n = !1), window.removeEventListener("mousemove", o), window.removeEventListener("touchmove", o), window.removeEventListener("mouseup", r), window.removeEventListener("touchend", r), document.body.style[w] = "", Z.call(f), F.call(f), d = 0 } f.elements.overlay.addEventListener("mousedown", e), f.elements.viewport.addEventListener("keydown", function (e) { if (!e.shiftKey || 38 !== e.keyCode && 40 !== e.keyCode) { if (f.options.enableKeyMovement && 37 <= e.keyCode && e.keyCode <= 40) { e.preventDefault(); var t = s(e.keyCode); m = E.parse(f.elements.preview), document.body.style[w] = "none", l = f.elements.viewport.getBoundingClientRect(), o = (i = t)[0], r = i[1], a = {}, v(o, r), a[g] = m.toString(), b(f.elements.preview, a), z.call(f), document.body.style[w] = "", Z.call(f), F.call(f), d = 0 } } else { var n; n = 38 === e.keyCode ? parseFloat(f.elements.zoomer.value) + parseFloat(f.elements.zoomer.step) : parseFloat(f.elements.zoomer.value) - parseFloat(f.elements.zoomer.step), f.setZoom(n) } var i, o, r, a; function s(e) { switch (e) { case 37: return [1, 0]; case 38: return [0, 1]; case 39: return [-1, 0]; case 40: return [0, -1] } } }), f.elements.overlay.addEventListener("touchstart", e) }.call(this), a.options.enableZoom && function () { var i = this, e = i.elements.zoomerWrap = document.createElement("div"), t = i.elements.zoomer = document.createElement("input"); function o() { (function (e) { var t = this, n = e ? e.transform : E.parse(t.elements.preview), i = e ? e.viewportRect : t.elements.viewport.getBoundingClientRect(), o = e ? e.origin : new L(t.elements.preview); function r() { var e = {}; e[g] = n.toString(), e[v] = o.toString(), b(t.elements.preview, e) } if (t._currentZoom = e ? e.value : t._currentZoom, n.scale = t._currentZoom, t.elements.zoomer.setAttribute("aria-valuenow", t._currentZoom), r(), t.options.enforceBoundary) { var a = function (e) { var t = this._currentZoom, n = e.width, i = e.height, o = this.elements.boundary.clientWidth / 2, r = this.elements.boundary.clientHeight / 2, a = this.elements.preview.getBoundingClientRect(), s = a.width, l = a.height, u = n / 2, c = i / 2, h = -1 * (u / t - o), p = -1 * (c / t - r), d = 1 / t * u, m = 1 / t * c; return { translate: { maxX: h, minX: h - (s * (1 / t) - n * (1 / t)), maxY: p, minY: p - (l * (1 / t) - i * (1 / t)) }, origin: { maxX: s * (1 / t) - d, minX: d, maxY: l * (1 / t) - m, minY: m } } }.call(t, i), s = a.translate, l = a.origin; n.x >= s.maxX && (o.x = l.minX, n.x = s.maxX), n.x <= s.minX && (o.x = l.maxX, n.x = s.minX), n.y >= s.maxY && (o.y = l.minY, n.y = s.maxY), n.y <= s.minY && (o.y = l.maxY, n.y = s.minY) } r(), I.call(t), F.call(t) }).call(i, { value: parseFloat(t.value), origin: new L(i.elements.preview), viewportRect: i.elements.viewport.getBoundingClientRect(), transform: E.parse(i.elements.preview) }) } function n(e) { var t, n; if ("ctrl" === i.options.mouseWheelZoom && !0 !== e.ctrlKey) return 0; t = e.wheelDelta ? e.wheelDelta / 1200 : e.deltaY ? e.deltaY / 1060 : e.detail ? e.detail / -60 : 0, n = i._currentZoom + t * i._currentZoom, e.preventDefault(), B.call(i, n), o.call(i) } x(e, "cr-slider-wrap"), x(t, "cr-slider"), t.type = "range", t.step = "0.0001", t.value = "1", t.style.display = i.options.showZoomer ? "" : "none", t.setAttribute("aria-label", "zoom"), i.element.appendChild(e), e.appendChild(t), i._currentZoom = 1, i.elements.zoomer.addEventListener("input", o), i.elements.zoomer.addEventListener("change", o), i.options.mouseWheelZoom && (i.elements.boundary.addEventListener("mousewheel", n), i.elements.boundary.addEventListener("DOMMouseScroll", n)) }.call(a), a.options.enableResize && function () { var l, u, c, h, p, e, t, d = this, m = document.createElement("div"), i = !1, f = 50; x(m, "cr-resizer"), b(m, { width: this.options.viewport.width + "px", height: this.options.viewport.height + "px" }), this.options.resizeControls.height && (x(e = document.createElement("div"), "cr-resizer-vertical"), m.appendChild(e)); this.options.resizeControls.width && (x(t = document.createElement("div"), "cr-resizer-horisontal"), m.appendChild(t)); function n(e) { if ((void 0 === e.button || 0 === e.button) && (e.preventDefault(), !i)) { var t = d.elements.overlay.getBoundingClientRect(); if (i = !0, u = e.pageX, c = e.pageY, l = -1 !== e.currentTarget.className.indexOf("vertical") ? "v" : "h", h = t.width, p = t.height, e.touches) { var n = e.touches[0]; u = n.pageX, c = n.pageY } window.addEventListener("mousemove", o), window.addEventListener("touchmove", o), window.addEventListener("mouseup", r), window.addEventListener("touchend", r), document.body.style[w] = "none" } } function o(e) { var t = e.pageX, n = e.pageY; if (e.preventDefault(), e.touches) { var i = e.touches[0]; t = i.pageX, n = i.pageY } var o = t - u, r = n - c, a = d.options.viewport.height + r, s = d.options.viewport.width + o; "v" === l && f <= a && a <= p ? (b(m, { height: a + "px" }), d.options.boundary.height += r, b(d.elements.boundary, { height: d.options.boundary.height + "px" }), d.options.viewport.height += r, b(d.elements.viewport, { height: d.options.viewport.height + "px" })) : "h" === l && f <= s && s <= h && (b(m, { width: s + "px" }), d.options.boundary.width += o, b(d.elements.boundary, { width: d.options.boundary.width + "px" }), d.options.viewport.width += o, b(d.elements.viewport, { width: d.options.viewport.width + "px" })), z.call(d), W.call(d), Z.call(d), F.call(d), c = n, u = t } function r() { i = !1, window.removeEventListener("mousemove", o), window.removeEventListener("touchmove", o), window.removeEventListener("mouseup", r), window.removeEventListener("touchend", r), document.body.style[w] = "" } e && (e.addEventListener("mousedown", n), e.addEventListener("touchstart", n)); t && (t.addEventListener("mousedown", n), t.addEventListener("touchstart", n)); this.elements.boundary.appendChild(m) }.call(a) } function R() { return this.options.enableExif && window.EXIF } function B(e) { if (this.options.enableZoom) { var t = this.elements.zoomer, n = A(e, 4); t.value = Math.max(parseFloat(t.min), Math.min(parseFloat(t.max), n)).toString() } } function Z(e) { var t = this, n = t._currentZoom, i = t.elements.preview.getBoundingClientRect(), o = t.elements.viewport.getBoundingClientRect(), r = E.parse(t.elements.preview.style[g]), a = new L(t.elements.preview), s = o.top - i.top + o.height / 2, l = o.left - i.left + o.width / 2, u = {}, c = {}; if (e) { var h = a.x, p = a.y, d = r.x, m = r.y; u.y = h, u.x = p, r.y = d, r.x = m } else u.y = s / n, u.x = l / n, c.y = (u.y - a.y) * (1 - n), c.x = (u.x - a.x) * (1 - n), r.x -= c.x, r.y -= c.y; var f = {}; f[v] = u.x + "px " + u.y + "px", f[g] = r.toString(), b(t.elements.preview, f) } function z() { if (this.elements) { var e = this.elements.boundary.getBoundingClientRect(), t = this.elements.preview.getBoundingClientRect(); b(this.elements.overlay, { width: t.width + "px", height: t.height + "px", top: t.top - e.top + "px", left: t.left - e.left + "px" }) } } L.prototype.toString = function () { return this.x + "px " + this.y + "px" }; var a, s, h, M, I = (a = z, s = 500, function () { var e = this, t = arguments, n = h && !M; clearTimeout(M), M = setTimeout(function () { M = null, h || a.apply(e, t) }, s), n && a.apply(e, t) }); function F() { var e, t = this, n = t.get(); X.call(t) && (t.options.update.call(t, n), t.$ && "undefined" == typeof Prototype ? t.$(t.element).trigger("update.croppie", n) : (window.CustomEvent ? e = new CustomEvent("update", { detail: n }) : (e = document.createEvent("CustomEvent")).initCustomEvent("update", !0, !0, n), t.element.dispatchEvent(e))) } function X() { return 0 < this.elements.preview.offsetHeight && 0 < this.elements.preview.offsetWidth } function Y() { var e, t = this, n = {}, i = t.elements.preview, o = new E(0, 0, 1), r = new L; X.call(t) && !t.data.bound && (t.data.bound = !0, n[g] = o.toString(), n[v] = r.toString(), n.opacity = 1, b(i, n), e = t.elements.preview.getBoundingClientRect(), t._originalImageWidth = e.width, t._originalImageHeight = e.height, t.data.orientation = f(t.elements.img), t.options.enableZoom ? W.call(t, !0) : t._currentZoom = 1, o.scale = t._currentZoom, n[g] = o.toString(), b(i, n), t.data.points.length ? function (e) { if (4 !== e.length) throw "Croppie - Invalid number of points supplied: " + e; var t = this, n = e[2] - e[0], i = t.elements.viewport.getBoundingClientRect(), o = t.elements.boundary.getBoundingClientRect(), r = { left: i.left - o.left, top: i.top - o.top }, a = i.width / n, s = e[1], l = e[0], u = -1 * e[1] + r.top, c = -1 * e[0] + r.left, h = {}; h[v] = l + "px " + s + "px", h[g] = new E(c, u, a).toString(), b(t.elements.preview, h), B.call(t, a), t._currentZoom = a }.call(t, t.data.points) : function () { var e = this, t = e.elements.preview.getBoundingClientRect(), n = e.elements.viewport.getBoundingClientRect(), i = e.elements.boundary.getBoundingClientRect(), o = n.left - i.left, r = n.top - i.top, a = o - (t.width - n.width) / 2, s = r - (t.height - n.height) / 2, l = new E(a, s, e._currentZoom); b(e.elements.preview, g, l.toString()) }.call(t), Z.call(t), z.call(t)) } function W(e) { var t, n, i, o, r = this, a = Math.max(r.options.minZoom, 0) || 0, s = r.options.maxZoom || 1.5, l = r.elements.zoomer, u = parseFloat(l.value), c = r.elements.boundary.getBoundingClientRect(), h = m(r.elements.img, r.data.orientation), p = r.elements.viewport.getBoundingClientRect(); r.options.enforceBoundary && (i = p.width / h.width, o = p.height / h.height, a = Math.max(i, o)), s <= a && (s = a + 1), l.min = A(a, 4), l.max = A(s, 4), !e && (u < l.min || u > l.max) ? B.call(r, u < l.min ? l.min : l.max) : e && (n = Math.max(c.width / h.width, c.height / h.height), t = null !== r.data.boundZoom ? r.data.boundZoom : n, B.call(r, t)), y(l) } function O(e) { var t = e.points, n = C(t[0]), i = C(t[1]), o = C(t[2]) - n, r = C(t[3]) - i, a = e.circle, s = document.createElement("canvas"), l = s.getContext("2d"), u = e.outputWidth || o, c = e.outputHeight || r; s.width = u, s.height = c, e.backgroundColor && (l.fillStyle = e.backgroundColor, l.fillRect(0, 0, u, c)); var h = n, p = i, d = o, m = r, f = 0, v = 0, g = u, w = c; return n < 0 && (h = 0, f = Math.abs(n) / o * u), d + h > this._originalImageWidth && (g = (d = this._originalImageWidth - h) / o * u), i < 0 && (p = 0, v = Math.abs(i) / r * c), m + p > this._originalImageHeight && (w = (m = this._originalImageHeight - p) / r * c), l.drawImage(this.elements.preview, h, p, d, m, f, v, g, w), a && (l.fillStyle = "#fff", l.globalCompositeOperation = "destination-in", l.beginPath(), l.arc(s.width / 2, s.height / 2, s.width / 2, 0, 2 * Math.PI, !0), l.closePath(), l.fill()), s } function k(c, h) { var e, i, o, r, p = this, d = [], t = null, n = R.call(p); if ("string" == typeof c) e = c, c = {}; else if (Array.isArray(c)) d = c.slice(); else { if (void 0 === c && p.data.url) return Y.call(p), F.call(p), null; e = c.url, d = c.points || [], t = void 0 === c.zoom ? null : c.zoom } return p.data.bound = !1, p.data.url = e || p.data.url, p.data.boundZoom = t, (i = e, o = n, r = new Image, r.style.opacity = "0", new Promise(function (e, t) { function n() { r.style.opacity = "1", setTimeout(function () { e(r) }, 1) } r.removeAttribute("crossOrigin"), i.match(/^https?:\/\/|^\/\//) && r.setAttribute("crossOrigin", "anonymous"), r.onload = function () { o ? EXIF.getData(r, function () { n() }) : n() }, r.onerror = function (e) { r.style.opacity = 1, setTimeout(function () { t(e) }, 1) }, r.src = i })).then(function (e) { if (function (t) { this.elements.img.parentNode && (Array.prototype.forEach.call(this.elements.img.classList, function (e) { t.classList.add(e) }), this.elements.img.parentNode.replaceChild(t, this.elements.img), this.elements.preview = t), this.elements.img = t }.call(p, e), d.length) p.options.relative && (d = [d[0] * e.naturalWidth / 100, d[1] * e.naturalHeight / 100, d[2] * e.naturalWidth / 100, d[3] * e.naturalHeight / 100]); else { var t, n, i = m(e), o = p.elements.viewport.getBoundingClientRect(), r = o.width / o.height; r < i.width / i.height ? t = (n = i.height) * r : (t = i.width, n = i.height / r); var a = (i.width - t) / 2, s = (i.height - n) / 2, l = a + t, u = s + n; p.data.points = [a, s, l, u] } p.data.points = d.map(function (e) { return parseFloat(e) }), p.options.useCanvas && function (e) { var t = this.elements.canvas, n = this.elements.img; t.getContext("2d").clearRect(0, 0, t.width, t.height), t.width = n.width, t.height = n.height, _(t, n, this.options.enableOrientation && e || f(n)) }.call(p, c.orientation), Y.call(p), F.call(p), h && h() }) } function A(e, t) { return parseFloat(e).toFixed(t || 0) } function j() { var e = this, t = e.elements.preview.getBoundingClientRect(), n = e.elements.viewport.getBoundingClientRect(), i = n.left - t.left, o = n.top - t.top, r = (n.width - e.elements.viewport.offsetWidth) / 2, a = (n.height - e.elements.viewport.offsetHeight) / 2, s = i + e.elements.viewport.offsetWidth + r, l = o + e.elements.viewport.offsetHeight + a, u = e._currentZoom; (u === 1 / 0 || isNaN(u)) && (u = 1); var c = e.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY; return i = Math.max(c, i / u), o = Math.max(c, o / u), s = Math.max(c, s / u), l = Math.max(c, l / u), { points: [A(i), A(o), A(s), A(l)], zoom: u, orientation: e.data.orientation } } var H = { type: "canvas", format: "png", quality: 1 }, N = ["jpeg", "webp", "png"]; function n(e) { var t = this, n = j.call(t), i = p(d(H), d(e)), o = "string" == typeof e ? e : i.type || "base64", r = i.size || "viewport", a = i.format, s = i.quality, l = i.backgroundColor, u = "boolean" == typeof i.circle ? i.circle : "circle" === t.options.viewport.type, c = t.elements.viewport.getBoundingClientRect(), h = c.width / c.height; return "viewport" === r ? (n.outputWidth = c.width, n.outputHeight = c.height) : "object" == typeof r && (r.width && r.height ? (n.outputWidth = r.width, n.outputHeight = r.height) : r.width ? (n.outputWidth = r.width, n.outputHeight = r.width / h) : r.height && (n.outputWidth = r.height * h, n.outputHeight = r.height)), -1 < N.indexOf(a) && (n.format = "image/" + a, n.quality = s), n.circle = u, n.url = t.data.url, n.backgroundColor = l, new Promise(function (e) { switch (o.toLowerCase()) { case "rawcanvas": e(O.call(t, n)); break; case "canvas": case "base64": e(function (e) { return O.call(this, e).toDataURL(e.format, e.quality) }.call(t, n)); break; case "blob": (function (e) { var n = this; return new Promise(function (t) { O.call(n, e).toBlob(function (e) { t(e) }, e.format, e.quality) }) }).call(t, n).then(e); break; default: e(function (e) { var t = e.points, n = document.createElement("div"), i = document.createElement("img"), o = t[2] - t[0], r = t[3] - t[1]; return x(n, "croppie-result"), n.appendChild(i), b(i, { left: -1 * t[0] + "px", top: -1 * t[1] + "px" }), i.src = e.url, b(n, { width: o + "px", height: r + "px" }), n }.call(t, n)) } }) } function S(e) { if (!this.options.useCanvas || !this.options.enableOrientation) throw "Croppie: Cannot rotate without enableOrientation && EXIF.js included"; var t, n, i, o, r, a = this, s = a.elements.canvas; a.data.orientation = (t = a.data.orientation, n = e, i = -1 < l.indexOf(t) ? l : u, o = i.indexOf(t), r = n / 90 % i.length, i[(i.length + o + r % i.length) % i.length]), _(s, a.elements.img, a.data.orientation), Z.call(a, !0), W.call(a) } if (window.jQuery) { var P = window.jQuery; P.fn.croppie = function (n) { if ("string" !== typeof n) return this.each(function () { var e = new T(this, n); (e.$ = P)(this).data("croppie", e) }); var i = Array.prototype.slice.call(arguments, 1), e = P(this).data("croppie"); return "get" === n ? e.get() : "result" === n ? e.result.apply(e, i) : "bind" === n ? e.bind.apply(e, i) : this.each(function () { var e = P(this).data("croppie"); if (e) { var t = e[n]; if (!P.isFunction(t)) throw "Croppie " + n + " method not found"; t.apply(e, i), "destroy" === n && P(this).removeData("croppie") } }) } } function T(e, t) { if (-1 < e.className.indexOf("croppie-container")) throw new Error("Croppie: Can't initialize croppie more than once"); if (this.element = e, this.options = p(d(T.defaults), t), "img" === this.element.tagName.toLowerCase()) { var n = this.element; x(n, "cr-original-image"), c(n, { "aria-hidden": "true", alt: "" }); var i = document.createElement("div"); this.element.parentNode.appendChild(i), i.appendChild(n), this.element = i, this.options.url = this.options.url || n.src } if (r.call(this), this.options.url) { var o = { url: this.options.url, points: this.options.points }; delete this.options.url, delete this.options.points, k.call(this, o) } } return T.defaults = { viewport: { width: 100, height: 100, type: "square" }, boundary: {}, orientationControls: { enabled: !0, leftClass: "", rightClass: "" }, resizeControls: { width: !0, height: !0 }, customClass: "", showZoomer: !0, enableZoom: !0, enableResize: !1, mouseWheelZoom: !0, enableExif: !1, enforceBoundary: !0, enableOrientation: !1, enableKeyMovement: !0, update: function () { } }, T.globals = { translate: "translate3d" }, p(T.prototype, { bind: function (e, t) { return k.call(this, e, t) }, get: function () { var e = j.call(this), t = e.points; return this.options.relative && (t[0] /= this.elements.img.naturalWidth / 100, t[1] /= this.elements.img.naturalHeight / 100, t[2] /= this.elements.img.naturalWidth / 100, t[3] /= this.elements.img.naturalHeight / 100), e }, result: function (e) { return n.call(this, e) }, refresh: function () { return function () { Y.call(this) }.call(this) }, setZoom: function (e) { B.call(this, e), y(this.elements.zoomer) }, rotate: function (e) { S.call(this, e) }, destroy: function () { return function () { var e, t, n = this; n.element.removeChild(n.elements.boundary), e = n.element, t = "croppie-container", e.classList ? e.classList.remove(t) : e.className = e.className.replace(t, ""), n.options.enableZoom && n.element.removeChild(n.elements.zoomerWrap), delete n.elements }.call(this) } }), T }); /* Convert table to responsive cards by @kushalcodes */ /* Convert table to responsive cards by @kushalcodes */ let TABLE_KONVERTER = { referenceTableIdOrClassName: "", referenceTableParentEl: null, isReferenceIdOrClass: function () { return "#" === this.referenceTableIdOrClassName.substring(0, 1) ? "id" : "." === this.referenceTableIdOrClassName.substring(0, 1) && "class" }, konvert: function () { this.hideTable(); const e = this.isReferenceIdOrClass(); e ? ("id" === e && this.handleId(), "class" === e && this.handleClass()) : console.error("Invalid id or class name provided to run table konverter!"), TABLE_KONVERTER.handleWindowWidthChange(window.innerWidth), window.addEventListener("resize", function (e) { TABLE_KONVERTER.handleWindowWidthChange(e.target.innerWidth) }) }, tableHeadingTitles: [], tableBodyTRs: [], tableCard: [], handleId: function () { const e = this.referenceTableIdOrClassName.substring(1), t = document.getElementById(e); this.referenceTableParentEl = t.parentElement; const n = t.getElementsByTagName("thead")[0], s = t.getElementsByTagName("tbody")[0], a = n.getElementsByTagName("th"); for (let e = 0; e < a.length; e++) { const t = a[e]; this.tableHeadingTitles.push(t.innerText) } const l = s.getElementsByTagName("tr"); this.tableBodyTRs = l, this.generateTableCard(), this.generateCardElement() }, handleClass: function () { const e = this.referenceTableIdOrClassName.substring(1), t = document.getElementsByClassName(e); for (let e = 0; e < t.length; e++) { const n = t[e]; if (n.id && n.id.length > 0) { console.error(`Id already exists for table:
      \n \n You are using css initialization\n \n We basically convert table elements initialization with cssm to have generated ids and use that id to convert using the id.\n \n Hence its basically id initialization\n `); break } const s = "konverted-table-" + e; n.id = s, TABLE_KONVERTER.init("#" + s, TABLE_KONVERTER.options) } }, generateTableCard: function () { for (let e = 0; e < this.tableBodyTRs.length; e++) { const t = this.tableBodyTRs[e].getElementsByTagName("td"); let n = {}; for (let e = 0; e < t.length; e++) { const s = t[e]; n[this.tableHeadingTitles[e].toLowerCase().replace(" ", "_")] = s.innerHTML } this.tableCard.push(n) } }, insertAfter: function (e, t) { e.parentNode.insertBefore(t, e.nextSibling) }, generateCardElement: function () { for (let e = 0; e < this.tableCard.length; e++) { const t = this.tableCard[e], n = this.generateCardSingle(t); this.referenceTableParentEl && this.insertAfter(this.referenceTableParentEl, n) } }, generateCardSingle: function (e) { let t = document.createElement("div"); t.className = "card table-card", t.style.width = "100%", t.style.margin = "0 auto", t.style.marginBottom = "5px", t.style.marginTop = "5px"; for (const n in e) if (Object.hasOwnProperty.call(e, n)) { const s = e[n]; let a = "string" == typeof n ? this.capitalize(n).replace("_", " ") : n, l = document.createElement("div"); l.className = "card-body", this.options.stickyHeader && this.options.stickyHeader.tableHeadingName && a.toLowerCase() === this.options.stickyHeader.tableHeadingName.toLowerCase() && (l.className = "card-body card-sticky", l.style.position = "sticky", l.style.top = 0), l.innerHTML += "
      " + ("id" === a.toLowerCase() ? "ID" : a) + "
      ", l.innerHTML += "
      " + s + "
      ", t.appendChild(l) } return t }, capitalize: function (e) { return 0 === e.length ? "" : e[0].toUpperCase() + e.slice(1) }, hideTable: function () { const e = this.isReferenceIdOrClass(); if (e) { const t = this.referenceTableIdOrClassName.substring(1); if ("id" === e && (document.getElementById(t).style.display = "none"), "class" === e) { const e = document.getElementsByClassName(t); for (let t = 0; t < e.length; t++)e[t].style.display = "none" } const n = document.getElementsByClassName("table-card"); for (let e = 0; e < n.length; e++)n[e].style.display = "block" } }, showTable: function () { const e = this.isReferenceIdOrClass(); if (e) { const t = this.referenceTableIdOrClassName.substring(1); if ("id" === e && (document.getElementById(t).style.display = "table"), "class" === e) { const e = document.getElementsByClassName(t); for (let t = 0; t < e.length; t++)e[t].style.display = "table" } const n = document.getElementsByClassName("table-card"); for (let e = 0; e < n.length; e++)n[e].style.display = "none" } }, handleWindowWidthChange: function (e) { e <= 425 ? this.hideTable() : this.showTable() }, alreadyLoadedStyle: "", stylingMap: { buddha: "buddha.css", simple: "simple.css", casual: "casual.css" }, loadStyling: function (e) { if (this.alreadyLoadedStyle === e) return; let t = !1, n = ""; for (const s in this.stylingMap) if (Object.hasOwnProperty.call(this.stylingMap, s) && s === e) { n = this.stylingMap[s], t = !0; break } if (!t) return console.warn("Invalid styling name. Following are valid stylings : "), void console.table(this.stylingMap); document.head.innerHTML += ``, this.alreadyLoadedStyle = e }, typePrefix: "type.", typeMap: { autoAlign: "auto-align.css" }, alreadyLoadedStyleType: "", loadStylingType: function (e) { if (this.alreadyLoadedStyleType === e) return; let t = !1, n = ""; for (const s in this.typeMap) if (Object.hasOwnProperty.call(this.typeMap, s) && s === e) { n = this.typePrefix + this.typeMap[s], t = !0; break } if (!t) return console.warn("Invalid styling type. Following are valid stylings : "), void console.table(this.typeMap); document.head.innerHTML += ``, this.alreadyLoadedStyleType = e }, options: {}, init: function (e, t) { t && (this.options = t), t && t.type && this.loadStylingType(t.type), t && t.style && this.loadStyling(t.style), this.referenceTableIdOrClassName = e, this.konvert() } }; TABLE_KONVERTER.init(".mkd-table-container", { style: "simple" });